hocon 0.9.5 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -2
- data/README.md +22 -10
- data/lib/hocon.rb +9 -3
- data/lib/hocon/config_factory.rb +4 -0
- data/lib/hocon/config_value_factory.rb +13 -2
- data/lib/hocon/impl/config_reference.rb +5 -2
- data/lib/hocon/impl/simple_config_origin.rb +1 -1
- data/spec/fixtures/parse_render/example1/input.conf +21 -0
- data/spec/fixtures/parse_render/example1/output.conf +26 -0
- data/spec/fixtures/parse_render/example1/output_nocomments.conf +17 -0
- data/spec/fixtures/parse_render/example2/input.conf +10 -0
- data/spec/fixtures/parse_render/example2/output.conf +17 -0
- data/spec/fixtures/parse_render/example2/output_nocomments.conf +17 -0
- data/spec/fixtures/parse_render/example3/input.conf +2 -0
- data/spec/fixtures/parse_render/example3/output.conf +2 -0
- data/spec/fixtures/parse_render/example4/input.json +6 -0
- data/spec/fixtures/parse_render/example4/output.conf +6 -0
- data/spec/fixtures/test_utils/resources/bom.conf +2 -0
- data/spec/fixtures/test_utils/resources/cycle.conf +1 -0
- data/spec/fixtures/test_utils/resources/file-include.conf +5 -0
- data/spec/fixtures/test_utils/resources/include-from-list.conf +4 -0
- data/spec/fixtures/test_utils/resources/subdir/bar.conf +1 -0
- data/spec/fixtures/test_utils/resources/subdir/baz.conf +1 -0
- data/spec/fixtures/test_utils/resources/subdir/foo.conf +5 -0
- data/spec/fixtures/test_utils/resources/test01.conf +80 -0
- data/spec/fixtures/test_utils/resources/test01.json +4 -0
- data/spec/fixtures/test_utils/resources/test03.conf +36 -0
- data/spec/spec_helper.rb +43 -0
- data/spec/test_utils.rb +757 -0
- data/spec/unit/typesafe/config/concatenation_spec.rb +417 -0
- data/spec/unit/typesafe/config/conf_parser_spec.rb +822 -0
- data/spec/unit/typesafe/config/config_document_parser_spec.rb +494 -0
- data/spec/unit/typesafe/config/config_document_spec.rb +576 -0
- data/spec/unit/typesafe/config/config_factory_spec.rb +120 -0
- data/spec/unit/typesafe/config/config_node_spec.rb +552 -0
- data/spec/unit/typesafe/config/config_value_factory_spec.rb +85 -0
- data/spec/unit/typesafe/config/config_value_spec.rb +935 -0
- data/spec/unit/typesafe/config/hocon_spec.rb +54 -0
- data/spec/unit/typesafe/config/path_spec.rb +261 -0
- data/spec/unit/typesafe/config/public_api_spec.rb +520 -0
- data/spec/unit/typesafe/config/simple_config_spec.rb +112 -0
- data/spec/unit/typesafe/config/token_spec.rb +188 -0
- data/spec/unit/typesafe/config/tokenizer_spec.rb +801 -0
- metadata +39 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f53bd3b94192eb5515fdd8dee18a31f1b7ec3301
|
4
|
+
data.tar.gz: 9528170c7011011e68058de66b134240b6aaba5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 692390bfc06e62f8674b9a45ac76777df321738ccb647180cff3378e69ff489a182f1a91573243da0703586709fcb4d02ae874ce2f7f2674770485b0b14afa18
|
7
|
+
data.tar.gz: e4f43e24a79072d8964fd3ee89dab2e9daa2e96dd1a9afd1b2db0ae97b5249f16d49a67617fa20272ef023b9c1836e502c9d9f0885c49d463ff45c01a0606f2f
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,18 @@
|
|
1
|
-
## 0.
|
1
|
+
## 1.0.1
|
2
2
|
|
3
|
-
This is a
|
3
|
+
This is a bugfix release.
|
4
|
+
The API is stable enough and the code is being used in production, so the version is also being bumped to 1.0.0
|
5
|
+
|
6
|
+
* Fixed a bug wherein calling "Hocon.load" would not
|
7
|
+
resolve substitutions.
|
8
|
+
* Fixed a circular dependency between the Hocon and Hocon::ConfigFactory
|
9
|
+
namespaces. Using the Hocon::ConfigFactory class now requires you to
|
10
|
+
use a `require 'hocon/config_factory'` instead of `require hocon`
|
11
|
+
* Add support for hashes with keyword keys
|
12
|
+
|
13
|
+
## 1.0.0
|
14
|
+
|
15
|
+
This version number was burned.
|
4
16
|
|
5
17
|
## 0.9.3
|
6
18
|
|
data/README.md
CHANGED
@@ -8,12 +8,16 @@ This is a port of the [Typesafe Config](https://github.com/typesafehub/config) l
|
|
8
8
|
The library provides Ruby support for the [HOCON](https://github.com/typesafehub/config/blob/master/HOCON.md) configuration file format.
|
9
9
|
|
10
10
|
|
11
|
-
At present, it supports supports parsing and modification of existing HOCON/JSON files via the `ConfigFactory`
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
At present, it supports supports parsing and modification of existing HOCON/JSON files via the `ConfigFactory`
|
12
|
+
class and the `ConfigValueFactory` class, and rendering parsed config objects back to a String
|
13
|
+
([see examples below](#basic-usage)). It also supports the parsing and modification of HOCON/JSON files via
|
14
|
+
`ConfigDocumentFactory`.
|
15
15
|
|
16
|
-
|
16
|
+
**Note:** While the project is production ready, since not all features in the Typesafe library are supported,
|
17
|
+
you may still run into some issues. If you find a problem, feel free to open a github issue.
|
18
|
+
|
19
|
+
The implementation is intended to be as close to a line-for-line port as the two languages allow,
|
20
|
+
in hopes of making it fairly easy to port over new changesets from the Java code base over time.
|
17
21
|
|
18
22
|
Basic Usage
|
19
23
|
===========
|
@@ -22,15 +26,18 @@ Basic Usage
|
|
22
26
|
gem install hocon
|
23
27
|
```
|
24
28
|
|
29
|
+
To use the simple API, for reading config values:
|
25
30
|
|
26
31
|
```rb
|
27
|
-
require 'hocon
|
32
|
+
require 'hocon'
|
28
33
|
|
29
|
-
conf = Hocon
|
30
|
-
|
34
|
+
conf = Hocon.load("myapp.conf")
|
35
|
+
puts "Here's a setting: #{conf["foo"]["bar"]["baz"]}"
|
31
36
|
```
|
32
37
|
|
33
|
-
To use the ConfigDocument API
|
38
|
+
To use the ConfigDocument API, if you need both read/write capability for
|
39
|
+
modifying settings in a config file, or if you want to retain access to
|
40
|
+
things like comments and line numbers:
|
34
41
|
|
35
42
|
```rb
|
36
43
|
require 'hocon/parser/config_document_factory'
|
@@ -46,6 +53,10 @@ doc_has_value = doc.has_value?("a") # returns boolean
|
|
46
53
|
orig_doc_text = doc.render # returns string
|
47
54
|
```
|
48
55
|
|
56
|
+
Note that a `ConfigDocument` is used primarily for simple configuration manipulation while preserving
|
57
|
+
whitespace and comments. As such, it is not powerful as the regular `Config` API, and will not resolve
|
58
|
+
substitutions.
|
59
|
+
|
49
60
|
Testing
|
50
61
|
=======
|
51
62
|
|
@@ -57,7 +68,8 @@ bundle exec rspec spec
|
|
57
68
|
Unsupported Features
|
58
69
|
====================
|
59
70
|
|
60
|
-
This supports many of the same things as the Java library, but there are some notable exceptions.
|
71
|
+
This supports many of the same things as the Java library, but there are some notable exceptions.
|
72
|
+
Unsupported features include:
|
61
73
|
|
62
74
|
* Non file includes
|
63
75
|
* Loading resources from the class path or URLs
|
data/lib/hocon.rb
CHANGED
@@ -1,14 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module Hocon
|
4
|
-
require 'hocon/config_factory'
|
5
|
-
|
6
4
|
def self.load(file)
|
7
|
-
|
5
|
+
# doing this require lazily, because otherwise, classes that need to
|
6
|
+
# `require 'hocon'` to get the module into scope will end up recursing
|
7
|
+
# through this require and probably ending up with circular dependencies.
|
8
|
+
require 'hocon/config_factory'
|
9
|
+
config = Hocon::ConfigFactory.load_file(file)
|
8
10
|
return config.root.unwrapped
|
9
11
|
end
|
10
12
|
|
11
13
|
def self.parse(string)
|
14
|
+
# doing this require lazily, because otherwise, classes that need to
|
15
|
+
# `require 'hocon'` to get the module into scope will end up recursing
|
16
|
+
# through this require and probably ending up with circular dependencies.
|
17
|
+
require 'hocon/config_factory'
|
12
18
|
config = Hocon::ConfigFactory.parse_string(string)
|
13
19
|
return config.root.unwrapped
|
14
20
|
end
|
data/lib/hocon/config_factory.rb
CHANGED
@@ -6,6 +6,10 @@ require 'hocon/config_parse_options'
|
|
6
6
|
require 'hocon/impl/config_impl'
|
7
7
|
require 'hocon/config_factory'
|
8
8
|
|
9
|
+
## Please note that the `parse` operations will simply create a ConfigValue
|
10
|
+
## and do nothing else, whereas the `load` operations will perform a higher-level
|
11
|
+
## operation and will resolve substitutions. If you have substitutions in your
|
12
|
+
## configuration, use a `load` function
|
9
13
|
class Hocon::ConfigFactory
|
10
14
|
def self.parse_file(file_path, options = Hocon::ConfigParseOptions.defaults)
|
11
15
|
Hocon::Impl::Parseable.new_file(file_path, options).parse.to_config
|
@@ -55,7 +55,11 @@ class Hocon::ConfigValueFactory
|
|
55
55
|
# @return a new value
|
56
56
|
#
|
57
57
|
def self.from_any_ref(object, origin_description = nil)
|
58
|
-
|
58
|
+
if object.is_a?(Hash)
|
59
|
+
from_map(object, origin_description)
|
60
|
+
else
|
61
|
+
ConfigImpl.from_any_ref(object, origin_description)
|
62
|
+
end
|
59
63
|
end
|
60
64
|
|
61
65
|
#
|
@@ -69,6 +73,13 @@ class Hocon::ConfigValueFactory
|
|
69
73
|
# @return a new {@link ConfigObject}
|
70
74
|
#
|
71
75
|
def self.from_map(values, origin_description = nil)
|
72
|
-
ConfigImpl.from_any_ref(values, origin_description)
|
76
|
+
ConfigImpl.from_any_ref(process_hash(values), origin_description)
|
73
77
|
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def self.process_hash(hash)
|
82
|
+
Hash[hash.map {|k, v| [k.is_a?(Symbol) ? k.to_s : k, v.is_a?(Hash) ? process_hash(v) : v]}]
|
83
|
+
end
|
84
|
+
|
74
85
|
end
|
@@ -3,13 +3,16 @@
|
|
3
3
|
require 'hocon'
|
4
4
|
require 'hocon/impl'
|
5
5
|
require 'hocon/impl/abstract_config_value'
|
6
|
-
require 'hocon/impl/resolve_source'
|
7
|
-
require 'hocon/impl/resolve_result'
|
8
6
|
|
9
7
|
class Hocon::Impl::ConfigReference
|
10
8
|
include Hocon::Impl::Unmergeable
|
11
9
|
include Hocon::Impl::AbstractConfigValue
|
12
10
|
|
11
|
+
# Require these lazily, to avoid circular dependencies
|
12
|
+
require 'hocon/impl/resolve_source'
|
13
|
+
require 'hocon/impl/resolve_result'
|
14
|
+
|
15
|
+
|
13
16
|
NotPossibleToResolve = Hocon::Impl::AbstractConfigValue::NotPossibleToResolve
|
14
17
|
UnresolvedSubstitutionError = Hocon::ConfigError::UnresolvedSubstitutionError
|
15
18
|
|
@@ -212,7 +212,7 @@ class Hocon::Impl::SimpleConfigOrigin
|
|
212
212
|
if a.origin_type == b.origin_type
|
213
213
|
a.origin_type
|
214
214
|
else
|
215
|
-
Hocon::Impl::OriginType
|
215
|
+
Hocon::Impl::OriginType::GENERIC
|
216
216
|
end
|
217
217
|
|
218
218
|
# first use the "description" field which has no line numbers
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# These are some opening comments
|
2
|
+
# These are some additional opening comments
|
3
|
+
foo.bar {
|
4
|
+
// the baz is is blah blah
|
5
|
+
baz = 42
|
6
|
+
boom = [1, 2, {derp : duh }, 4]
|
7
|
+
empty = []
|
8
|
+
|
9
|
+
# abracadabra setting
|
10
|
+
abracadabra = "hi"
|
11
|
+
}
|
12
|
+
|
13
|
+
// as for the yippee
|
14
|
+
# it entails some things
|
15
|
+
foo.bar.yahoo = "yippee"
|
16
|
+
|
17
|
+
# truthy
|
18
|
+
foo.bar.truthy = true
|
19
|
+
|
20
|
+
# falsy
|
21
|
+
foo.bar.falsy = false
|
@@ -0,0 +1,26 @@
|
|
1
|
+
foo {
|
2
|
+
# These are some opening comments
|
3
|
+
# These are some additional opening comments
|
4
|
+
bar {
|
5
|
+
# falsy
|
6
|
+
falsy=false
|
7
|
+
# truthy
|
8
|
+
truthy=true
|
9
|
+
# as for the yippee
|
10
|
+
# it entails some things
|
11
|
+
yahoo=yippee
|
12
|
+
# the baz is is blah blah
|
13
|
+
baz=42
|
14
|
+
boom=[
|
15
|
+
1,
|
16
|
+
2,
|
17
|
+
{
|
18
|
+
derp=duh
|
19
|
+
},
|
20
|
+
4
|
21
|
+
]
|
22
|
+
empty=[]
|
23
|
+
# abracadabra setting
|
24
|
+
abracadabra=hi
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
jruby-puppet {
|
2
|
+
jruby-pools=[
|
3
|
+
{
|
4
|
+
environment=production
|
5
|
+
}
|
6
|
+
]
|
7
|
+
load-path=[
|
8
|
+
"/usr/lib/ruby/site_ruby/1.8",
|
9
|
+
"/usr/lib/ruby/site_ruby/1.8"
|
10
|
+
]
|
11
|
+
master-conf-dir="/etc/puppet"
|
12
|
+
master-var-dir="/var/lib/puppet"
|
13
|
+
}
|
14
|
+
|
15
|
+
webserver {
|
16
|
+
host="1.2.3.4"
|
17
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
jruby-puppet {
|
2
|
+
jruby-pools=[
|
3
|
+
{
|
4
|
+
environment=production
|
5
|
+
}
|
6
|
+
]
|
7
|
+
load-path=[
|
8
|
+
"/usr/lib/ruby/site_ruby/1.8",
|
9
|
+
"/usr/lib/ruby/site_ruby/1.8"
|
10
|
+
]
|
11
|
+
master-conf-dir="/etc/puppet"
|
12
|
+
master-var-dir="/var/lib/puppet"
|
13
|
+
}
|
14
|
+
|
15
|
+
webserver {
|
16
|
+
host="1.2.3.4"
|
17
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
include "cycle.conf"
|
@@ -0,0 +1 @@
|
|
1
|
+
bar=43
|
@@ -0,0 +1 @@
|
|
1
|
+
baz=45
|
@@ -0,0 +1,80 @@
|
|
1
|
+
{
|
2
|
+
"ints" : {
|
3
|
+
"fortyTwo" : 42,
|
4
|
+
"fortyTwoAgain" : ${ints.fortyTwo}
|
5
|
+
},
|
6
|
+
|
7
|
+
"floats" : {
|
8
|
+
"fortyTwoPointOne" : 42.1,
|
9
|
+
"fortyTwoPointOneAgain" : ${floats.fortyTwoPointOne}
|
10
|
+
},
|
11
|
+
|
12
|
+
"strings" : {
|
13
|
+
"abcd" : "abcd",
|
14
|
+
"abcdAgain" : ${strings.a}${strings.b}${strings.c}${strings.d},
|
15
|
+
"a" : "a",
|
16
|
+
"b" : "b",
|
17
|
+
"c" : "c",
|
18
|
+
"d" : "d",
|
19
|
+
"concatenated" : null bar 42 baz true 3.14 hi,
|
20
|
+
"double" : "3.14",
|
21
|
+
"number" : "57",
|
22
|
+
"null" : "null",
|
23
|
+
"true" : "true",
|
24
|
+
"yes" : "yes",
|
25
|
+
"false" : "false",
|
26
|
+
"no" : "no"
|
27
|
+
},
|
28
|
+
|
29
|
+
"arrays" : {
|
30
|
+
"empty" : [],
|
31
|
+
"ofInt" : [1, 2, 3],
|
32
|
+
"ofString" : [ ${strings.a}, ${strings.b}, ${strings.c} ],
|
33
|
+
"ofDouble" : [3.14, 4.14, 5.14],
|
34
|
+
"ofNull" : [null, null, null],
|
35
|
+
"ofBoolean" : [true, false],
|
36
|
+
"ofArray" : [${arrays.ofString}, ${arrays.ofString}, ${arrays.ofString}],
|
37
|
+
"ofObject" : [${ints}, ${booleans}, ${strings}],
|
38
|
+
"firstElementNotASubst" : [ "a", ${strings.b} ]
|
39
|
+
},
|
40
|
+
|
41
|
+
"booleans" : {
|
42
|
+
"true" : true,
|
43
|
+
"trueAgain" : ${booleans.true},
|
44
|
+
"false" : false,
|
45
|
+
"falseAgain" : ${booleans.false}
|
46
|
+
},
|
47
|
+
|
48
|
+
"nulls" : {
|
49
|
+
"null" : null,
|
50
|
+
"nullAgain" : ${nulls.null}
|
51
|
+
},
|
52
|
+
|
53
|
+
"durations" : {
|
54
|
+
"second" : 1s,
|
55
|
+
"secondsList" : [1s,2seconds,3 s, 4000],
|
56
|
+
"secondAsNumber" : 1000,
|
57
|
+
"halfSecond" : 0.5s,
|
58
|
+
"millis" : 1 milli,
|
59
|
+
"micros" : 2000 micros
|
60
|
+
},
|
61
|
+
|
62
|
+
"memsizes" : {
|
63
|
+
"meg" : 1M,
|
64
|
+
"megsList" : [1M, 1024K, 1048576],
|
65
|
+
"megAsNumber" : 1048576,
|
66
|
+
"halfMeg" : 0.5M
|
67
|
+
},
|
68
|
+
|
69
|
+
"system" : {
|
70
|
+
"javaversion" : ${?java.version},
|
71
|
+
"userhome" : ${?user.home},
|
72
|
+
"home" : ${?HOME},
|
73
|
+
"pwd" : ${?PWD},
|
74
|
+
"shell" : ${?SHELL},
|
75
|
+
"lang" : ${?LANG},
|
76
|
+
"path" : ${?PATH},
|
77
|
+
"not_here" : ${?NOT_HERE},
|
78
|
+
"concatenated" : Your Java version is ${?system.javaversion} and your user.home is ${?system.userhome}
|
79
|
+
}
|
80
|
+
}
|