hocon 1.0.1 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f53bd3b94192eb5515fdd8dee18a31f1b7ec3301
4
- data.tar.gz: 9528170c7011011e68058de66b134240b6aaba5b
3
+ metadata.gz: f5f840792a5f3186c9fa371d26249c29160d789f
4
+ data.tar.gz: b0ef532026b4e0884ba1d17bfe44206835ed3053
5
5
  SHA512:
6
- metadata.gz: 692390bfc06e62f8674b9a45ac76777df321738ccb647180cff3378e69ff489a182f1a91573243da0703586709fcb4d02ae874ce2f7f2674770485b0b14afa18
7
- data.tar.gz: e4f43e24a79072d8964fd3ee89dab2e9daa2e96dd1a9afd1b2db0ae97b5249f16d49a67617fa20272ef023b9c1836e502c9d9f0885c49d463ff45c01a0606f2f
6
+ metadata.gz: d705bb5985d3a0c1792726de5526272bb46ea28502e25da8b98d171aae1b3c598aa57908ecb56ba76d0c6ae1ca5cc8e941cd4ecf55a69fd2a65e5b0bd6617075
7
+ data.tar.gz: adcea68d2278b03b1e4ff067a8f615e8c9796574c61dabaad49397cdd8ef81dfb4d60d3aa298a4d6a8ec2c2cd5398195886dd3f69d1d53f1cee4b5bb6539ce47
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## 1.1.0
2
+ This is a bugfix/feature release
3
+
4
+ * Fixed a bug where unrecognized config file extensions caused `Hocon.load` to return an empty
5
+ hash instead of an error.
6
+ * Added an optional `:syntax` key to the `Hocon.load` method to explicitly specify the file format
7
+ * Renamed internal usage of `name` methods to avoid overriding built in `Object#name` method
8
+
1
9
  ## 1.0.1
2
10
 
3
11
  This is a bugfix release.
data/README.md CHANGED
@@ -8,7 +8,7 @@ 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`
11
+ At present, it supports parsing and modification of existing HOCON/JSON files via the `ConfigFactory`
12
12
  class and the `ConfigValueFactory` class, and rendering parsed config objects back to a String
13
13
  ([see examples below](#basic-usage)). It also supports the parsing and modification of HOCON/JSON files via
14
14
  `ConfigDocumentFactory`.
@@ -35,6 +35,22 @@ conf = Hocon.load("myapp.conf")
35
35
  puts "Here's a setting: #{conf["foo"]["bar"]["baz"]}"
36
36
  ```
37
37
 
38
+ By default, the simple API will determine the configuration file syntax/format
39
+ based on the filename extension of the file; `.conf` will be interpreted as HOCON,
40
+ `.json` will be interpreted as strict JSON, and any other extension will cause an
41
+ error to be raised since the syntax is unknown. If you'd like to use a different
42
+ file extension, you manually specify the syntax, like this:
43
+
44
+ ```rb
45
+ require 'hocon'
46
+ require 'hocon/config_syntax'
47
+
48
+ conf = Hocon.load("myapp.blah", {:syntax => Hocon::ConfigSyntax::HOCON})
49
+ ```
50
+
51
+ Supported values for `:syntax` are: JSON, CONF, and HOCON. (CONF and HOCON are
52
+ aliases, and both map to the underlying HOCON syntax.)
53
+
38
54
  To use the ConfigDocument API, if you need both read/write capability for
39
55
  modifying settings in a config file, or if you want to retain access to
40
56
  things like comments and line numbers:
@@ -61,7 +77,7 @@ Testing
61
77
  =======
62
78
 
63
79
  ```sh
64
- bundle install
80
+ bundle install --path .bundle
65
81
  bundle exec rspec spec
66
82
  ```
67
83
 
@@ -77,3 +93,9 @@ Unsupported features include:
77
93
  * Parsing anything other than files and strings
78
94
  * Duration and size settings
79
95
  * Java system properties
96
+
97
+ ## Maintainence
98
+
99
+ Maintainers: Joe Pinsonault <joe.pinsonault@puppet.com>, Chris Price <chris@puppet.com>, Kevin Corcoran <kevin.corcoran@puppet.com>
100
+
101
+ Tickets: https://tickets.puppetlabs.com/browse/HC
data/lib/hocon.rb CHANGED
@@ -1,13 +1,39 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Hocon
4
- def self.load(file)
5
- # doing this require lazily, because otherwise, classes that need to
4
+ # NOTE: the behavior of this load method differs a bit from the upstream public
5
+ # API, where a file extension may be the preferred method of determining
6
+ # the config syntax, even if you specify a Syntax value on ConfigParseOptions.
7
+ # Here we prefer the syntax (optionally) specified by the user no matter what
8
+ # the file extension is, and if they don't specify one and the file extension
9
+ # is unrecognized, we raise an error.
10
+ def self.load(file, opts = nil)
11
+ # doing these requires lazily, because otherwise, classes that need to
6
12
  # `require 'hocon'` to get the module into scope will end up recursing
7
13
  # through this require and probably ending up with circular dependencies.
8
14
  require 'hocon/config_factory'
9
- config = Hocon::ConfigFactory.load_file(file)
10
- return config.root.unwrapped
15
+ require 'hocon/impl/parseable'
16
+ require 'hocon/config_parse_options'
17
+ require 'hocon/config_resolve_options'
18
+ require 'hocon/config_error'
19
+ syntax = opts ? opts[:syntax] : nil
20
+
21
+ if syntax.nil?
22
+ unless Hocon::Impl::Parseable.syntax_from_extension(file)
23
+ raise Hocon::ConfigError::ConfigParseError.new(
24
+ nil, "Unrecognized file extension '#{File.extname(file)}' and no value provided for :syntax option", nil)
25
+ end
26
+ config = Hocon::ConfigFactory.parse_file_any_syntax(
27
+ file, Hocon::ConfigParseOptions.defaults)
28
+ else
29
+ config = Hocon::ConfigFactory.parse_file(
30
+ file, Hocon::ConfigParseOptions.defaults.set_syntax(syntax))
31
+ end
32
+
33
+ resolved_config = Hocon::ConfigFactory.load_from_config(
34
+ config, Hocon::ConfigResolveOptions.defaults)
35
+
36
+ return resolved_config.root.unwrapped
11
37
  end
12
38
 
13
39
  def self.parse(string)
@@ -5,6 +5,8 @@ require 'hocon'
5
5
  module Hocon::ConfigSyntax
6
6
  JSON = 0
7
7
  CONF = 1
8
+ # alias 'HOCON' to 'CONF' since some users may be more familiar with that
9
+ HOCON = 1
8
10
  # we're not going to try to support .properties files any time soon :)
9
11
  #PROPERTIES = 2
10
12
  end
@@ -15,7 +15,7 @@ module Hocon::ConfigValueType
15
15
  NULL = 4
16
16
  STRING = 5
17
17
 
18
- def self.name(config_value_type)
18
+ def self.value_type_name(config_value_type)
19
19
  case config_value_type
20
20
  when OBJECT then "OBJECT"
21
21
  when LIST then "LIST"
@@ -8,7 +8,7 @@ module Hocon::Impl::FromMapMode
8
8
  KEYS_ARE_KEYS = 1
9
9
  ConfigBugOrBrokenError = Hocon::ConfigError::ConfigBugOrBrokenError
10
10
 
11
- def self.name(from_map_mode)
11
+ def self.map_mode_name(from_map_mode)
12
12
  case from_map_mode
13
13
  when KEYS_ARE_PATHS then "KEYS_ARE_PATHS"
14
14
  when KEYS_ARE_KEYS then "KEYS_ARE_KEYS"
@@ -125,7 +125,7 @@ class Hocon::Impl::Parseable
125
125
  raise Hocon::ConfigError::ConfigWrongTypeError.with_expected_actual(value.origin,
126
126
  "",
127
127
  "object at file root",
128
- value.value_type.name)
128
+ value.value_type.value_type_name)
129
129
  end
130
130
  end
131
131
 
@@ -61,12 +61,12 @@ class Hocon::Impl::SimpleConfig
61
61
  if v.value_type == ConfigValueType::NULL
62
62
  raise ConfigNullError.new(v.origin,
63
63
  (ConfigNullError.make_message(original_path.render,
64
- (not expected.nil?) ? ConfigValueType.name(expected) : nil)),
64
+ (not expected.nil?) ? ConfigValueType.value_type_name(expected) : nil)),
65
65
  nil)
66
66
  elsif (not expected.nil?) && v.value_type != expected
67
67
  raise ConfigWrongTypeError.new(v.origin,
68
- "#{original_path.render} has type #{ConfigValueType.name(v.value_type)} " +
69
- "rather than #{ConfigValueType.name(expected)}",
68
+ "#{original_path.render} has type #{ConfigValueType.value_type_name(v.value_type)} " +
69
+ "rather than #{ConfigValueType.value_type_name(expected)}",
70
70
  nil)
71
71
  else
72
72
  return v
@@ -121,8 +121,8 @@ class Hocon::Impl::SimpleConfig
121
121
  if (not expected.nil?) && (v.value_type != expected && v.value_type != Hocon::ConfigValueType::NULL)
122
122
  raise Hocon::ConfigError::ConfigWrongTypeError.with_expected_actual(v.origin,
123
123
  original_path.render,
124
- expected.name,
125
- Hocon::ConfigValueType.name(v.value_type))
124
+ expected.value_type_name,
125
+ Hocon::ConfigValueType.value_type_name(v.value_type))
126
126
  else
127
127
  return v
128
128
  end
@@ -220,8 +220,8 @@ class Hocon::Impl::SimpleConfig
220
220
  end
221
221
  if v.value_type != expected
222
222
  raise ConfigWrongTypeError.with_expected_actual(origin, path,
223
- "list of #{expected.name}",
224
- "list of #{v.value_type.name}")
223
+ "list of #{expected.value_type_name}",
224
+ "list of #{v.value_type.value_type_name}")
225
225
  end
226
226
  l << v.unwrapped
227
227
  end
@@ -271,8 +271,8 @@ class Hocon::Impl::SimpleConfig
271
271
  end
272
272
  if v.value_type != expected
273
273
  raise ConfigWrongTypeError.with_expected_actual(origin, path,
274
- "list of #{expected.name}",
275
- "list of #{v.value_type.name}")
274
+ "list of #{expected.value_type_name}",
275
+ "list of #{v.value_type.value_type_name}")
276
276
  end
277
277
  l << v
278
278
  end
@@ -30,7 +30,7 @@ class Hocon::Impl::Token
30
30
  if !@debug_string.nil?
31
31
  @debug_string
32
32
  else
33
- Hocon::Impl::TokenType.name(@token_type)
33
+ Hocon::Impl::TokenType.token_type_name(@token_type)
34
34
  end
35
35
  end
36
36
 
@@ -21,7 +21,7 @@ class Hocon::Impl::TokenType
21
21
  PLUS_EQUALS = 15
22
22
  IGNORED_WHITESPACE = 16
23
23
 
24
- def self.name(token_type)
24
+ def self.token_type_name(token_type)
25
25
  case token_type
26
26
  when START then "START"
27
27
  when EOF then "EOF"
@@ -35,9 +35,9 @@ class Hocon::Impl::Tokens
35
35
 
36
36
  def to_s
37
37
  if value.resolve_status == ResolveStatus::RESOLVED
38
- "'#{value.unwrapped}' (#{Hocon::ConfigValueType.name(value.value_type)})"
38
+ "'#{value.unwrapped}' (#{Hocon::ConfigValueType.value_type_name(value.value_type)})"
39
39
  else
40
- "'<unresolved value>' (#{@value.value_type.name})"
40
+ "'<unresolved value>' (#{@value.value_type.value_type_name})"
41
41
  end
42
42
 
43
43
  end
@@ -0,0 +1,4 @@
1
+ # Comment
2
+ {
3
+ "meow": "cats"
4
+ }
@@ -0,0 +1,4 @@
1
+ # Comment
2
+ {
3
+ "meow": "cats"
4
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "meow": "cats"
3
+ }
@@ -0,0 +1,7 @@
1
+ ## RUBY-SPECIFIC TESTS
2
+
3
+ This directory should only contain tests that are specific to the Ruby library/API.
4
+ Tests ported from the upstream Java library should live in spec/typesafe/config.
5
+
6
+ Where possible it would be good to avoid sharing fixtures between the two types
7
+ of tests as well.
@@ -3,6 +3,10 @@
3
3
  require 'spec_helper'
4
4
  require 'hocon'
5
5
  require 'hocon/config_render_options'
6
+ require 'hocon/config_error'
7
+ require 'hocon/config_syntax'
8
+
9
+ ConfigParseError = Hocon::ConfigError::ConfigParseError
6
10
 
7
11
  describe Hocon do
8
12
  let(:render_options) { Hocon::ConfigRenderOptions.defaults }
@@ -50,5 +54,39 @@ describe Hocon do
50
54
  expect(conf).to eq(expected)
51
55
  end
52
56
  end
57
+
58
+ context "loading a file with an unknown extension" do
59
+ context "without specifying the config format" do
60
+ it "should raise an error" do
61
+ expect {
62
+ Hocon.load("#{FIXTURE_DIR}/hocon/by_extension/cat.test")
63
+ }.to raise_error(ConfigParseError, /Unrecognized file extension '.test'/)
64
+ end
65
+ end
66
+
67
+ context "while specifying the config format" do
68
+ it "should parse properly if the config format is correct" do
69
+ expect(Hocon.load("#{FIXTURE_DIR}/hocon/by_extension/cat.test",
70
+ {:syntax => Hocon::ConfigSyntax::HOCON})).
71
+ to eq({"meow" => "cats"})
72
+ expect(Hocon.load("#{FIXTURE_DIR}/hocon/by_extension/cat.test-json",
73
+ {:syntax => Hocon::ConfigSyntax::HOCON})).
74
+ to eq({"meow" => "cats"})
75
+ end
76
+ it "should parse properly if the config format is compatible" do
77
+ expect(Hocon.load("#{FIXTURE_DIR}/hocon/by_extension/cat.test-json",
78
+ {:syntax => Hocon::ConfigSyntax::JSON})).
79
+ to eq({"meow" => "cats"})
80
+ end
81
+ it "should raise an error if the config format is incompatible" do
82
+ expect {
83
+ Hocon.load("#{FIXTURE_DIR}/hocon/by_extension/cat.test",
84
+ {:syntax => Hocon::ConfigSyntax::JSON})
85
+ }.to raise_error(ConfigParseError, /Document must have an object or array at root/)
86
+ end
87
+ end
88
+ end
89
+
90
+
53
91
  end
54
92
 
@@ -0,0 +1,4 @@
1
+ ## TESTS PORTED FROM UPSTREAM
2
+
3
+ This directory should only contain tests that are ported from the upstream
4
+ Java library.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hocon
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Price
@@ -138,6 +138,9 @@ files:
138
138
  - lib/hocon/parser/config_document.rb
139
139
  - lib/hocon/parser/config_document_factory.rb
140
140
  - lib/hocon/parser/config_node.rb
141
+ - spec/fixtures/hocon/by_extension/cat.conf
142
+ - spec/fixtures/hocon/by_extension/cat.test
143
+ - spec/fixtures/hocon/by_extension/cat.test-json
141
144
  - spec/fixtures/parse_render/example1/input.conf
142
145
  - spec/fixtures/parse_render/example1/output.conf
143
146
  - spec/fixtures/parse_render/example1/output_nocomments.conf
@@ -160,6 +163,9 @@ files:
160
163
  - spec/fixtures/test_utils/resources/test03.conf
161
164
  - spec/spec_helper.rb
162
165
  - spec/test_utils.rb
166
+ - spec/unit/hocon/README.md
167
+ - spec/unit/hocon/hocon_spec.rb
168
+ - spec/unit/typesafe/config/README.md
163
169
  - spec/unit/typesafe/config/concatenation_spec.rb
164
170
  - spec/unit/typesafe/config/conf_parser_spec.rb
165
171
  - spec/unit/typesafe/config/config_document_parser_spec.rb
@@ -168,7 +174,6 @@ files:
168
174
  - spec/unit/typesafe/config/config_node_spec.rb
169
175
  - spec/unit/typesafe/config/config_value_factory_spec.rb
170
176
  - spec/unit/typesafe/config/config_value_spec.rb
171
- - spec/unit/typesafe/config/hocon_spec.rb
172
177
  - spec/unit/typesafe/config/path_spec.rb
173
178
  - spec/unit/typesafe/config/public_api_spec.rb
174
179
  - spec/unit/typesafe/config/simple_config_spec.rb
@@ -194,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
199
  version: '0'
195
200
  requirements: []
196
201
  rubyforge_project:
197
- rubygems_version: 2.5.2
202
+ rubygems_version: 2.5.1
198
203
  signing_key:
199
204
  specification_version: 4
200
205
  summary: HOCON Config Library