hocon 0.0.7 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +4 -2
  3. data/lib/hocon.rb +2 -0
  4. data/lib/hocon/config.rb +1010 -0
  5. data/lib/hocon/config_error.rb +32 -2
  6. data/lib/hocon/config_factory.rb +46 -0
  7. data/lib/hocon/config_include_context.rb +49 -0
  8. data/lib/hocon/config_includer_file.rb +27 -0
  9. data/lib/hocon/config_list.rb +49 -0
  10. data/lib/hocon/config_mergeable.rb +74 -0
  11. data/lib/hocon/config_object.rb +144 -1
  12. data/lib/hocon/config_parse_options.rb +33 -9
  13. data/lib/hocon/config_parseable.rb +51 -0
  14. data/lib/hocon/config_render_options.rb +4 -2
  15. data/lib/hocon/config_resolve_options.rb +31 -0
  16. data/lib/hocon/config_syntax.rb +5 -2
  17. data/lib/hocon/config_util.rb +73 -0
  18. data/lib/hocon/config_value.rb +122 -0
  19. data/lib/hocon/config_value_factory.rb +66 -2
  20. data/lib/hocon/config_value_type.rb +5 -2
  21. data/lib/hocon/impl.rb +2 -0
  22. data/lib/hocon/impl/abstract_config_node.rb +29 -0
  23. data/lib/hocon/impl/abstract_config_node_value.rb +11 -0
  24. data/lib/hocon/impl/abstract_config_object.rb +148 -42
  25. data/lib/hocon/impl/abstract_config_value.rb +251 -11
  26. data/lib/hocon/impl/array_iterator.rb +19 -0
  27. data/lib/hocon/impl/config_boolean.rb +7 -1
  28. data/lib/hocon/impl/config_concatenation.rb +177 -28
  29. data/lib/hocon/impl/config_delayed_merge.rb +329 -0
  30. data/lib/hocon/impl/config_delayed_merge_object.rb +274 -0
  31. data/lib/hocon/impl/config_document_parser.rb +647 -0
  32. data/lib/hocon/impl/config_double.rb +44 -0
  33. data/lib/hocon/impl/config_impl.rb +143 -19
  34. data/lib/hocon/impl/config_impl_util.rb +18 -0
  35. data/lib/hocon/impl/config_include_kind.rb +10 -0
  36. data/lib/hocon/impl/config_int.rb +13 -1
  37. data/lib/hocon/impl/config_node_array.rb +11 -0
  38. data/lib/hocon/impl/config_node_comment.rb +19 -0
  39. data/lib/hocon/impl/config_node_complex_value.rb +54 -0
  40. data/lib/hocon/impl/config_node_concatenation.rb +11 -0
  41. data/lib/hocon/impl/config_node_field.rb +81 -0
  42. data/lib/hocon/impl/config_node_include.rb +33 -0
  43. data/lib/hocon/impl/config_node_object.rb +276 -0
  44. data/lib/hocon/impl/config_node_path.rb +48 -0
  45. data/lib/hocon/impl/config_node_root.rb +60 -0
  46. data/lib/hocon/impl/config_node_simple_value.rb +42 -0
  47. data/lib/hocon/impl/config_node_single_token.rb +17 -0
  48. data/lib/hocon/impl/config_null.rb +15 -7
  49. data/lib/hocon/impl/config_number.rb +43 -4
  50. data/lib/hocon/impl/config_parser.rb +403 -0
  51. data/lib/hocon/impl/config_reference.rb +142 -0
  52. data/lib/hocon/impl/config_string.rb +55 -7
  53. data/lib/hocon/impl/container.rb +29 -0
  54. data/lib/hocon/impl/default_transformer.rb +24 -15
  55. data/lib/hocon/impl/from_map_mode.rb +3 -1
  56. data/lib/hocon/impl/full_includer.rb +2 -0
  57. data/lib/hocon/impl/memo_key.rb +42 -0
  58. data/lib/hocon/impl/mergeable_value.rb +8 -0
  59. data/lib/hocon/impl/origin_type.rb +8 -2
  60. data/lib/hocon/impl/parseable.rb +455 -91
  61. data/lib/hocon/impl/path.rb +181 -59
  62. data/lib/hocon/impl/path_builder.rb +24 -3
  63. data/lib/hocon/impl/path_parser.rb +280 -0
  64. data/lib/hocon/impl/replaceable_merge_stack.rb +22 -0
  65. data/lib/hocon/impl/resolve_context.rb +254 -0
  66. data/lib/hocon/impl/resolve_memos.rb +21 -0
  67. data/lib/hocon/impl/resolve_result.rb +39 -0
  68. data/lib/hocon/impl/resolve_source.rb +354 -0
  69. data/lib/hocon/impl/resolve_status.rb +3 -1
  70. data/lib/hocon/impl/simple_config.rb +264 -10
  71. data/lib/hocon/impl/simple_config_document.rb +48 -0
  72. data/lib/hocon/impl/simple_config_list.rb +282 -8
  73. data/lib/hocon/impl/simple_config_object.rb +424 -88
  74. data/lib/hocon/impl/simple_config_origin.rb +263 -71
  75. data/lib/hocon/impl/simple_include_context.rb +31 -1
  76. data/lib/hocon/impl/simple_includer.rb +196 -1
  77. data/lib/hocon/impl/substitution_expression.rb +38 -0
  78. data/lib/hocon/impl/token.rb +17 -4
  79. data/lib/hocon/impl/token_type.rb +6 -2
  80. data/lib/hocon/impl/tokenizer.rb +339 -109
  81. data/lib/hocon/impl/tokens.rb +330 -79
  82. data/lib/hocon/impl/unmergeable.rb +14 -1
  83. data/lib/hocon/impl/unsupported_operation_error.rb +6 -0
  84. data/lib/hocon/impl/url.rb +37 -0
  85. data/lib/hocon/parser.rb +7 -0
  86. data/lib/hocon/parser/config_document.rb +92 -0
  87. data/lib/hocon/parser/config_document_factory.rb +36 -0
  88. data/lib/hocon/parser/config_node.rb +30 -0
  89. metadata +67 -43
  90. data/lib/hocon/impl/config_float.rb +0 -13
  91. data/lib/hocon/impl/parser.rb +0 -977
  92. data/lib/hocon/impl/properties_parser.rb +0 -83
@@ -1,8 +1,16 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'hocon'
2
4
 
3
5
  class Hocon::ConfigError < StandardError
4
6
  def initialize(origin, message, cause)
5
- super(message)
7
+ msg =
8
+ if origin.nil?
9
+ message
10
+ else
11
+ "#{origin.description}: #{message}"
12
+ end
13
+ super(msg)
6
14
  @origin = origin
7
15
  @cause = cause
8
16
  end
@@ -20,18 +28,40 @@ class Hocon::ConfigError < StandardError
20
28
  end
21
29
  end
22
30
 
31
+ class ConfigIOError < Hocon::ConfigError
32
+ def initialize(origin, message, cause = nil)
33
+ super(origin, message, cause)
34
+ end
35
+ end
36
+
23
37
  class ConfigParseError < Hocon::ConfigError
24
38
  end
25
39
 
26
40
  class ConfigWrongTypeError < Hocon::ConfigError
41
+ def self.with_expected_actual(origin, path, expected, actual, cause = nil)
42
+ ConfigWrongTypeError.new(origin, "#{path} has type #{actual} rather than #{expected}", cause)
43
+ end
27
44
  end
28
45
 
29
46
  class ConfigBugOrBrokenError < Hocon::ConfigError
30
- def initialize(message, cause)
47
+ def initialize(message, cause = nil)
31
48
  super(nil, message, cause)
32
49
  end
33
50
  end
34
51
 
35
52
  class ConfigNotResolvedError < Hocon::ConfigError::ConfigBugOrBrokenError
36
53
  end
54
+
55
+ class ConfigBadPathError < Hocon::ConfigError
56
+ def initialize(origin, path, message, cause = nil)
57
+ error_message = !path.nil? ? "Invalid path '#{path}': #{message}" : message
58
+ super(origin, error_message, cause)
59
+ end
60
+ end
61
+
62
+ class UnresolvedSubstitutionError < ConfigParseError
63
+ def initialize(origin, detail, cause = nil)
64
+ super(origin, "Could not resolve substitution to a value: " + detail, cause)
65
+ end
66
+ end
37
67
  end
@@ -1,6 +1,10 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'hocon'
2
4
  require 'hocon/impl/parseable'
3
5
  require 'hocon/config_parse_options'
6
+ require 'hocon/impl/config_impl'
7
+ require 'hocon/config_factory'
4
8
 
5
9
  class Hocon::ConfigFactory
6
10
  def self.parse_file(file_path, options = Hocon::ConfigParseOptions.defaults)
@@ -10,4 +14,46 @@ class Hocon::ConfigFactory
10
14
  def self.parse_string(string, options = Hocon::ConfigParseOptions.defaults)
11
15
  Hocon::Impl::Parseable.new_string(string, options).parse.to_config
12
16
  end
17
+
18
+ def self.parse_file_any_syntax(file_base_name, options)
19
+ Hocon::Impl::ConfigImpl.parse_file_any_syntax(file_base_name, options).to_config
20
+ end
21
+
22
+ def self.empty(origin_description = nil)
23
+ Hocon::Impl::ConfigImpl.empty_config(origin_description)
24
+ end
25
+
26
+ # Because of how optional arguments work, if either parse or resolve options is supplied
27
+ # both must be supplied. load_file_with_parse_options or load_file_with_resolve_options
28
+ # can be used instead, or the argument you don't care about in load_file can be nil
29
+ #
30
+ # e.g.:
31
+ # load_file("settings", my_parse_options, nil)
32
+ # is equivalent to:
33
+ # load_file_with_parse_options("settings", my_parse_options)
34
+ def self.load_file(file_base_name, parse_options = nil, resolve_options = nil)
35
+ parse_options ||= Hocon::ConfigParseOptions.defaults
36
+ resolve_options ||= Hocon::ConfigResolveOptions.defaults
37
+
38
+ config = Hocon::ConfigFactory.parse_file_any_syntax(file_base_name, parse_options)
39
+
40
+ self.load_from_config(config, resolve_options)
41
+ end
42
+
43
+ def self.load_file_with_parse_options(file_base_name, parse_options)
44
+ self.load_file(file_base_name, parse_options, nil)
45
+ end
46
+
47
+ def self.load_file_with_resolve_options(file_base_name, resolve_options)
48
+ self.load_file(file_base_name, nil, resolve_options)
49
+ end
50
+
51
+ def self.load_from_config(config, resolve_options)
52
+
53
+ config.with_fallback(self.default_reference).resolve(resolve_options)
54
+ end
55
+
56
+ def self.default_reference
57
+ Hocon::Impl::ConfigImpl.default_reference
58
+ end
13
59
  end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'hocon'
4
+ require 'hocon/config_error'
5
+
6
+ #
7
+ # Context provided to a {@link ConfigIncluder}; this interface is only useful
8
+ # inside a {@code ConfigIncluder} implementation, and is not intended for apps
9
+ # to implement.
10
+ #
11
+ # <p>
12
+ # <em>Do not implement this interface</em>; it should only be implemented by
13
+ # the config library. Arbitrary implementations will not work because the
14
+ # library internals assume a specific concrete implementation. Also, this
15
+ # interface is likely to grow new methods over time, so third-party
16
+ # implementations will break.
17
+ #
18
+ module Hocon::ConfigIncludeContext
19
+ #
20
+ # Tries to find a name relative to whatever is doing the including, for
21
+ # example in the same directory as the file doing the including. Returns
22
+ # null if it can't meaningfully create a relative name. The returned
23
+ # parseable may not exist; this function is not required to do any IO, just
24
+ # compute what the name would be.
25
+ #
26
+ # The passed-in filename has to be a complete name (with extension), not
27
+ # just a basename. (Include statements in config files are allowed to give
28
+ # just a basename.)
29
+ #
30
+ # @param filename
31
+ # the name to make relative to the resource doing the including
32
+ # @return parseable item relative to the resource doing the including, or
33
+ # null
34
+ #
35
+ def relative_to(filename)
36
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of `ConfigIncludeContext` must implement `relative_to` (#{self.class})"
37
+ end
38
+
39
+ #
40
+ # Parse options to use (if you use another method to get a
41
+ # {@link ConfigParseable} then use {@link ConfigParseable#options()}
42
+ # instead though).
43
+ #
44
+ # @return the parse options
45
+ #
46
+ def parse_options
47
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of `ConfigIncludeContext` must implement `parse_options` (#{self.class})"
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ require 'hocon'
4
+ require 'hocon/config_error'
5
+
6
+ #
7
+ # Implement this <em>in addition to</em> {@link ConfigIncluder} if you want to
8
+ # support inclusion of files with the {@code include file("filename")} syntax.
9
+ # If you do not implement this but do implement {@link ConfigIncluder},
10
+ # attempts to load files will use the default includer.
11
+ #
12
+ module Hocon::ConfigIncluderFile
13
+ #
14
+ # Parses another item to be included. The returned object typically would
15
+ # not have substitutions resolved. You can throw a ConfigException here to
16
+ # abort parsing, or return an empty object, but may not return null.
17
+ #
18
+ # @param context
19
+ # some info about the include context
20
+ # @param what
21
+ # the include statement's argument
22
+ # @return a non-null ConfigObject
23
+ #
24
+ def include_file(context, what)
25
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of `ConfigIncluderFile` must implement `include_file` (#{self.class})"
26
+ end
27
+ end
@@ -0,0 +1,49 @@
1
+ # encoding: utf-8
2
+
3
+ require 'hocon'
4
+ require 'hocon/config_value'
5
+ require 'hocon/config_error'
6
+
7
+ #
8
+ # Subtype of {@link ConfigValue} representing a list value, as in JSON's
9
+ # {@code [1,2,3]} syntax.
10
+ #
11
+ # <p>
12
+ # {@code ConfigList} implements {@code java.util.List<ConfigValue>} so you can
13
+ # use it like a regular Java list. Or call {@link #unwrapped()} to unwrap the
14
+ # list elements into plain Java values.
15
+ #
16
+ # <p>
17
+ # Like all {@link ConfigValue} subtypes, {@code ConfigList} is immutable. This
18
+ # makes it threadsafe and you never have to create "defensive copies." The
19
+ # mutator methods from {@link java.util.List} all throw
20
+ # {@link java.lang.UnsupportedOperationException}.
21
+ #
22
+ # <p>
23
+ # The {@link ConfigValue#valueType} method on a list returns
24
+ # {@link ConfigValueType#LIST}.
25
+ #
26
+ # <p>
27
+ # <em>Do not implement {@code ConfigList}</em>; it should only be implemented
28
+ # by the config library. Arbitrary implementations will not work because the
29
+ # library internals assume a specific concrete implementation. Also, this
30
+ # interface is likely to grow new methods over time, so third-party
31
+ # implementations will break.
32
+ #
33
+ #
34
+ module Hocon::ConfigList
35
+ include Hocon::ConfigValue
36
+
37
+ #
38
+ # Recursively unwraps the list, returning a list of plain Java values such
39
+ # as Integer or String or whatever is in the list.
40
+ #
41
+ def unwrapped
42
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigValue should provide their own implementation of `unwrapped` (#{self.class})"
43
+ end
44
+
45
+ def with_origin(origin)
46
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigValue should provide their own implementation of `with_origin` (#{self.class})"
47
+ end
48
+
49
+ end
@@ -0,0 +1,74 @@
1
+ # encoding: utf-8
2
+
3
+ require 'hocon'
4
+ require 'hocon/config_error'
5
+
6
+ #
7
+ # Marker for types whose instances can be merged, that is {@link Config} and
8
+ # {@link ConfigValue}. Instances of {@code Config} and {@code ConfigValue} can
9
+ # be combined into a single new instance using the
10
+ # {@link ConfigMergeable#withFallback withFallback()} method.
11
+ #
12
+ # <p>
13
+ # <em>Do not implement this interface</em>; it should only be implemented by
14
+ # the config library. Arbitrary implementations will not work because the
15
+ # library internals assume a specific concrete implementation. Also, this
16
+ # interface is likely to grow new methods over time, so third-party
17
+ # implementations will break.
18
+ #
19
+ module Hocon::ConfigMergeable
20
+ #
21
+ # Returns a new value computed by merging this value with another, with
22
+ # keys in this value "winning" over the other one.
23
+ #
24
+ # <p>
25
+ # This associative operation may be used to combine configurations from
26
+ # multiple sources (such as multiple configuration files).
27
+ #
28
+ # <p>
29
+ # The semantics of merging are described in the <a
30
+ # href="https://github.com/typesafehub/config/blob/master/HOCON.md">spec
31
+ # for HOCON</a>. Merging typically occurs when either the same object is
32
+ # created twice in the same file, or two config files are both loaded. For
33
+ # example:
34
+ #
35
+ # <pre>
36
+ # foo = { a: 42 }
37
+ # foo = { b: 43 }
38
+ # </pre>
39
+ #
40
+ # Here, the two objects are merged as if you had written:
41
+ #
42
+ # <pre>
43
+ # foo = { a: 42, b: 43 }
44
+ # </pre>
45
+ #
46
+ # <p>
47
+ # Only {@link ConfigObject} and {@link Config} instances do anything in
48
+ # this method (they need to merge the fallback keys into themselves). All
49
+ # other values just return the original value, since they automatically
50
+ # override any fallback. This means that objects do not merge "across"
51
+ # non-objects; if you write
52
+ # <code>object.withFallback(nonObject).withFallback(otherObject)</code>,
53
+ # then <code>otherObject</code> will simply be ignored. This is an
54
+ # intentional part of how merging works, because non-objects such as
55
+ # strings and integers replace (rather than merging with) any prior value:
56
+ #
57
+ # <pre>
58
+ # foo = { a: 42 }
59
+ # foo = 10
60
+ # </pre>
61
+ #
62
+ # Here, the number 10 "wins" and the value of <code>foo</code> would be
63
+ # simply 10. Again, for details see the spec.
64
+ #
65
+ # @param other
66
+ # an object whose keys should be used as fallbacks, if the keys
67
+ # are not present in this one
68
+ # @return a new object (or the original one, if the fallback doesn't get
69
+ # used)
70
+ #
71
+ def with_fallback(other)
72
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of `ConfigMergeable` must implement `with_fallback` (#{self.class})"
73
+ end
74
+ end
@@ -1,4 +1,147 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'hocon'
4
+ require 'hocon/config_value'
2
5
 
6
+ #
7
+ # Subtype of {@link ConfigValue} representing an object (AKA dictionary or map)
8
+ # value, as in JSON's curly brace <code>{ "a" : 42 }</code> syntax.
9
+ #
10
+ # <p>
11
+ # An object may also be viewed as a {@link Config} by calling
12
+ # {@link ConfigObject#toConfig()}.
13
+ #
14
+ # <p>
15
+ # {@code ConfigObject} implements {@code java.util.Map<String, ConfigValue>} so
16
+ # you can use it like a regular Java map. Or call {@link #unwrapped()} to
17
+ # unwrap the map to a map with plain Java values rather than
18
+ # {@code ConfigValue}.
19
+ #
20
+ # <p>
21
+ # Like all {@link ConfigValue} subtypes, {@code ConfigObject} is immutable.
22
+ # This makes it threadsafe and you never have to create "defensive copies." The
23
+ # mutator methods from {@link java.util.Map} all throw
24
+ # {@link java.lang.UnsupportedOperationException}.
25
+ #
26
+ # <p>
27
+ # The {@link ConfigValue#valueType} method on an object returns
28
+ # {@link ConfigValueType#OBJECT}.
29
+ #
30
+ # <p>
31
+ # In most cases you want to use the {@link Config} interface rather than this
32
+ # one. Call {@link #toConfig()} to convert a {@code ConfigObject} to a
33
+ # {@code Config}.
34
+ #
35
+ # <p>
36
+ # The API for a {@code ConfigObject} is in terms of keys, while the API for a
37
+ # {@link Config} is in terms of path expressions. Conceptually,
38
+ # {@code ConfigObject} is a tree of maps from keys to values, while a
39
+ # {@code Config} is a one-level map from paths to values.
40
+ #
41
+ # <p>
42
+ # Use {@link ConfigUtil#joinPath} and {@link ConfigUtil#splitPath} to convert
43
+ # between path expressions and individual path elements (keys).
44
+ #
45
+ # <p>
46
+ # A {@code ConfigObject} may contain null values, which will have
47
+ # {@link ConfigValue#valueType()} equal to {@link ConfigValueType#NULL}. If
48
+ # {@link ConfigObject#get(Object)} returns Java's null then the key was not
49
+ # present in the parsed file (or wherever this value tree came from). If
50
+ # {@code get("key")} returns a {@link ConfigValue} with type
51
+ # {@code ConfigValueType#NULL} then the key was set to null explicitly in the
52
+ # config file.
53
+ #
54
+ # <p>
55
+ # <em>Do not implement interface {@code ConfigObject}</em>; it should only be
56
+ # implemented by the config library. Arbitrary implementations will not work
57
+ # because the library internals assume a specific concrete implementation.
58
+ # Also, this interface is likely to grow new methods over time, so third-party
59
+ # implementations will break.
60
+ #
3
61
  module Hocon::ConfigObject
4
- end
62
+ include Hocon::ConfigValue
63
+
64
+ #
65
+ # Converts this object to a {@link Config} instance, enabling you to use
66
+ # path expressions to find values in the object. This is a constant-time
67
+ # operation (it is not proportional to the size of the object).
68
+ #
69
+ # @return a {@link Config} with this object as its root
70
+ #
71
+ def to_config
72
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `to_config` (#{self.class})"
73
+ end
74
+
75
+ #
76
+ # Recursively unwraps the object, returning a map from String to whatever
77
+ # plain Java values are unwrapped from the object's values.
78
+ #
79
+ # @return a {@link java.util.Map} containing plain Java objects
80
+ #
81
+ def unwrapped
82
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `unwrapped` (#{self.class})"
83
+ end
84
+
85
+ def with_fallback(other)
86
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `with_fallback` (#{self.class})"
87
+ end
88
+
89
+ #
90
+ # Gets a {@link ConfigValue} at the given key, or returns null if there is
91
+ # no value. The returned {@link ConfigValue} may have
92
+ # {@link ConfigValueType#NULL} or any other type, and the passed-in key
93
+ # must be a key in this object (rather than a path expression).
94
+ #
95
+ # @param key
96
+ # key to look up
97
+ #
98
+ # @return the value at the key or null if none
99
+ #
100
+ def get(key)
101
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `get` (#{self.class})"
102
+ end
103
+
104
+ #
105
+ # Clone the object with only the given key (and its children) retained; all
106
+ # sibling keys are removed.
107
+ #
108
+ # @param key
109
+ # key to keep
110
+ # @return a copy of the object minus all keys except the one specified
111
+ #
112
+ def with_only_key(key)
113
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `with_only_key` (#{self.class})"
114
+ end
115
+
116
+ #
117
+ # Clone the object with the given key removed.
118
+ #
119
+ # @param key
120
+ # key to remove
121
+ # @return a copy of the object minus the specified key
122
+ #
123
+ def without_key(key)
124
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `without_key` (#{self.class})"
125
+ end
126
+
127
+ #
128
+ # Returns a {@code ConfigObject} based on this one, but with the given key
129
+ # set to the given value. Does not modify this instance (since it's
130
+ # immutable). If the key already has a value, that value is replaced. To
131
+ # remove a value, use {@link ConfigObject#withoutKey(String)}.
132
+ #
133
+ # @param key
134
+ # key to add
135
+ # @param value
136
+ # value at the new key
137
+ # @return the new instance with the new map entry
138
+ #
139
+ def with_value(key, value)
140
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `with_value` (#{self.class})"
141
+ end
142
+
143
+ def with_origin(origin)
144
+ raise Hocon::ConfigError::ConfigBugOrBrokenError, "subclasses of ConfigObject should provide their own implementation of `with_origin` (#{self.class})"
145
+ end
146
+
147
+ end