Skip to content

danini-the-panini/kdl-rb

Repository files navigation

KDL

Gem Version Actions Status Coverage Status

This is a Ruby implementation of the KDL Document Language

Installation

Add this line to your application's Gemfile:

gem 'kdl'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install kdl

Usage

require 'kdl'

KDL.parse(a_string) #=> KDL::Document
KDL.load_file('path/to/file') #=> KDL::Document

You can optionally provide your own type annotation handlers:

class Foo < KDL::Value::Custom
end

KDL.parse(a_string, type_parsers: {
  'foo' => Foo
})

The foo custom type will be called with instances of Value or Node with the type annotation (foo).

Custom types are expected to have a call method that takes the Value or Node, and the type annotation itself, as arguments, and is expected to return either an instance of KDL::Value::Custom or KDL::Node::Custom (depending on the input type) or nil to return the original value as is. Take a look at the built in custom types as a reference.

You can also disable type annotation parsing entirely (including the built in ones):

KDL.parse(a_string, parse_types: false)

KDL v1

kdl-rb maintains backwards compatibility with the KDL v1 spec. By default, KDL will attempt to parse a file with the v1 parser if it fails to parse with v2. This behaviour can be changed by specifying the version option:

KDL.parse(a_string, version: 2)

The resulting document will also serialize back to the same version it was parsed as. For example, if you parse a v2 document and call to_s on it, it will output a v2 document, and similarly with v1. This behaviour can be changed by specifying the output_version option:

KDL.parse(a_string, output_version: 2)

This allows you to to convert documents between versions:

KDL.parse('foo "bar" true', version: 1, output_version: 2).to_s #=> 'foo bar #true'

You can also convert an already parsed document between versions with to_v1 and to_v2:

doc = KDL.parse('foo "bar" true', version: 1)
doc.version #=> 1
doc.to_v2.to_s #=> 'foo bar #true'

You can also set the default version globally:

KDL.default_version = 2
KDL.default_output_version = 2

You can still force automatic version detection with auto_parse:

KDL.default_version = 2
KDL.parse('foo "bar" true') #=> Error
KDL.auto_parse('foo "bar" true') #=> KDL::V1::Document

Version directives are also respected:

KDL.parse("/- kdl-version 2\nfoo bar", version: 1)
#=> Version mismatch, document specified v2, but this is a v1 parser (Racc::ParseError)

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/danini-the-panini/kdl-rb.

License

The gem is available as open source under the terms of the MIT License.

About

Ruby implementation of the KDL language

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Contributors 2

  •  
  •