LibUCL is a universal configuration language.
This gem is a Ruby wrapper around LibUCL implemented with FFI.
It was heavily inspired by pyucl.
Put this in your Gemfile :
gem 'ucl'then run bundle install.
LibUCL is vendored with the gem and is automatically compiled when you install the gem.
You can disable this behavior by setting USE_GLOBAL_LIBUCL environment variable to true before running bundle install.
By default the gem looks for libucl.so in the system path and fallbacks to the bundled version if not found.
UCL.load(string)
ucl_conf =
'''
string: "bar",
"string2": baz,
true = true
false = false
nil: null
integer 1864
double 23.42
time: 10s
array: [
"foo",
true,
false,
null,
1864,
23.42,
10s,
]
hash: {
foo "bar"
bar = baz
baz: "foo"
}
array_of_array: [
["foo", "bar"]
["bar", "baz"]
]
auto_array = {
key: "foo"
key: "bar"
key: "baz"
}
section "foo" {
key = value;
}
section bar {
key = value;
}
section "baz" "foo" {
key = value;
}
'''
object = UCL.load(ucl_conf)
puts object # =>
{
'string' => 'bar',
'string2' => 'baz',
'true' => true,
'false' => false,
'nil' => nil,
'integer' => 1864,
'double' => 23.42,
'time' => 10.0,
'array' => [
'foo',
true,
false,
nil,
1864,
23.42,
10.0
],
'hash' => {
'foo' => 'bar',
'bar' => 'baz',
'baz' => 'foo'
},
'array_of_array' => [
["foo", "bar"],
["bar", "baz"]
],
'auto_array' => {
'key' => ['foo', 'bar', 'baz']
},
'section' => {
'foo' => {
'key' => 'value'
},
'bar' => {
'key' => 'value',
},
'baz' => {
'foo' => {
'key' => 'value'
}
},
},
}UCL.dump(object)
object =
{
'string' => 'bar',
'true' => true,
'false' => false,
'nil' => nil,
'integer' => 1864,
'double' => 23.42,
'time' => 10.seconds,
'array' => [
'foo',
true,
false,
nil,
1864,
23.42,
10.seconds
],
'hash' => {
'foo' => 'bar',
'bar' => 'baz',
'baz' => 'foo'
},
'array_of_array' => [
["foo", "bar"],
["bar", "baz"]
],
'section' => {
'foo' => {
'key' => 'value'
},
'bar' => {
'key' => 'value',
},
'baz' => {
'foo' => {
'key' => 'value'
}
},
},
}
ucl_conf = UCL.dump(object)
puts ucl_conf # =>
'''
string = "bar";
true = true;
false = false;
nil = null;
integer = 1864;
double = 23.420000;
time = 10.0;
array [
"foo",
true,
false,
null,
1864,
23.420000,
10.0,
]
hash {
foo = "bar";
bar = "baz";
baz = "foo";
}
array_of_array [
[
"foo",
"bar",
]
[
"bar",
"baz",
]
]
section {
foo {
key = "value";
}
bar {
key = "value";
}
baz {
foo {
key = "value";
}
}
}
'''UCL.validate(schema, string)
schema =
'''
{
"type": "object",
"properties": {
"key": {
"type": "string"
}
}
}
'''
ucl_conf =
'''
{
"key": "some string"
}
'''
puts UCL.validate(schema, string) # =>
trueIt raises an exception (UCL::Error::SchemaError) if the schema is not valid.
To compile LibUCL in dev environment use bin/rake compile.
To run specs use bin/rspec.