Try it yourself with our free Toml Formatter tool — runs entirely in your browser, no signup needed.

How to Parse TOML in Ruby

How to Parse TOML in Ruby

TOML (Tom's Obvious, Minimal Language) is a lightweight, human-readable configuration file format that has gained popularity in recent years. Parsing TOML files in Ruby is a common task, especially when working with configuration files or data storage. In this guide, we will explore how to parse TOML in Ruby, covering the basics, handling edge cases, common mistakes, and performance tips.

Quick Example

Here is a minimal example that parses a TOML file using the tomlrb gem:

require 'tomlrb'

toml_string = <<~TOML
  title = "My App"
  [database]
  host = "localhost"
  port = 5432
TOML

toml_hash = Tomlrb.parse(toml_string)

puts toml_hash # => {"title"=>"My App", "database"=>{"host"=>"localhost", "port"=>5432}}

This code requires the tomlrb gem, which can be installed using gem install tomlrb.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • require 'tomlrb': We require the tomlrb gem, which provides a simple and efficient way to parse TOML files in Ruby.
  • toml_string = <<~TOML ... TOML: We define a TOML string using the heredoc syntax. This is just a sample TOML string, but in a real-world scenario, you would typically read the TOML file from a file or a string.
  • toml_hash = Tomlrb.parse(toml_string): We parse the TOML string using the Tomlrb.parse method, which returns a Ruby hash representing the TOML data.
  • puts toml_hash: We print the resulting hash to the console.

Handling Edge Cases

Here are some common edge cases to consider when parsing TOML in Ruby:

Empty/Null Input

If the input TOML string is empty or null, the Tomlrb.parse method will raise a Tomlrb::ParseError. To handle this, you can add a simple check before parsing:

toml_string = ""
begin
  toml_hash = Tomlrb.parse(toml_string)
rescue Tomlrb::ParseError
  puts "Invalid TOML input"
end

Invalid Input

If the input TOML string is invalid (e.g., contains syntax errors), the Tomlrb.parse method will also raise a Tomlrb::ParseError. You can handle this similarly to the empty/null input case:

toml_string = " invalid toml "
begin
  toml_hash = Tomlrb.parse(toml_string)
rescue Tomlrb::ParseError
  puts "Invalid TOML input"
end

Large Input

When dealing with large TOML files, you may need to consider performance issues. One approach is to use the Tomlrb.parse_stream method, which parses the TOML input in chunks:

require 'stringio'

toml_string = "..." # large TOML string
stream = StringIO.new(toml_string)
toml_hash = Tomlrb.parse_stream(stream)

Unicode/Special Characters

TOML supports Unicode characters, but you may need to ensure that your Ruby environment is set up to handle them correctly. Make sure to set the Encoding to UTF-8 when reading the TOML file:

File.open('example.toml', 'r:UTF-8') do |file|
  toml_string = file.read
  # ...
end

Common Mistakes

Here are three common mistakes developers make when parsing TOML in Ruby, along with corrected code:

1. Forgetting to require the tomlrb gem

Incorrect code

toml_hash = Tomlrb.parse(toml_string)

Corrected code

require 'tomlrb'
toml_hash = Tomlrb.parse(toml_string)

2. Not handling parse errors

Incorrect code

toml_hash = Tomlrb.parse(toml_string)

Corrected code

begin
  toml_hash = Tomlrb.parse(toml_string)
rescue Tomlrb::ParseError
  puts "Invalid TOML input"
end

3. Not setting the correct encoding

Incorrect code

File.open('example.toml', 'r') do |file|
  toml_string = file.read
  # ...
end

Corrected code

File.open('example.toml', 'r:UTF-8') do |file|
  toml_string = file.read
  # ...
end

Performance Tips

Here are three practical performance tips for parsing TOML in Ruby:

  • Use the Tomlrb.parse_stream method for large TOML files to avoid loading the entire file into memory.
  • Use the Tomlrb.parse method with a StringIO object to parse TOML strings in chunks.
  • Avoid using the eval method to parse TOML strings, as it can introduce security vulnerabilities and performance issues.

FAQ

Q: What is the difference between Tomlrb and other TOML parsers?

A: Tomlrb is a lightweight, pure-Ruby TOML parser that is designed for performance and ease of use.

Q: Can I use Tomlrb to parse TOML files with custom extensions?

A: Yes, Tomlrb supports custom extensions through the Tomlrb::Parser class.

Q: How do I handle TOML files with nested arrays?

A: Tomlrb supports nested arrays through the Tomlrb::Array class.

Q: Can I use Tomlrb to parse TOML strings with Unicode characters?

A: Yes, Tomlrb supports Unicode characters through the Encoding class.

Q: What is the performance impact of using Tomlrb?

A: Tomlrb is designed for performance and has a minimal impact on your Ruby application.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp