collapsium-config 0.1.1 → 0.2.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: b003113648d35417f65b7f142c1e1957df44390e
4
- data.tar.gz: 4c6ddaf1aafe5804b918877b5663169a85206afe
3
+ metadata.gz: a5580fb8452b9b3d0c23ee9a987638fc870317e4
4
+ data.tar.gz: c3f68cac77df64fc6bc9175ebbcfde04d845d9d3
5
5
  SHA512:
6
- metadata.gz: 07fd37c0e483fb12ecbd24924a27af10a49f4c07a8ffaff28bf9555b983b26377fdd5ab7b3a29b19ff0687d95a64c746db21df980838b9e87aed4be2a551dfa9
7
- data.tar.gz: a0df3d326c1a71bd9001517b5f801fd9d7aab93054dd105d42a4604382881eb8b790c452b7ab2d7245534bb93ce19dc78460c74695eb665fd41cd787cfd3dfed
6
+ metadata.gz: 8e0fdc2746cb84e896168f26ade95ce81374848bbb536d18352b3f761648808c6f2c8a7696385c3fee1a4d052261c150d509c9cb1a77162d22470f4ce3c09f42
7
+ data.tar.gz: 4b7fdb6738ec3dc159a4e30bc8ecbecfa33690f2f09220f7db3c353fe81d95e9dcbc6b4fc11417b5dbf7002087122ad368b81085155ceabb7ca4f165868a26c0
@@ -1,51 +1,51 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- collapsium-config (0.1.1)
5
- collapsium (~> 0.1)
4
+ collapsium-config (0.2.0)
5
+ collapsium (~> 0.4)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- ast (2.2.0)
11
- codeclimate-test-reporter (0.5.0)
10
+ ast (2.3.0)
11
+ codeclimate-test-reporter (0.6.0)
12
12
  simplecov (>= 0.7.1, < 1.0.0)
13
- collapsium (0.1.0)
13
+ collapsium (0.4.0)
14
14
  diff-lcs (1.2.5)
15
15
  docile (1.1.5)
16
- json (1.8.3)
17
- parser (2.3.1.0)
16
+ json (2.0.2)
17
+ parser (2.3.1.2)
18
18
  ast (~> 2.2)
19
19
  powerpack (0.1.1)
20
20
  rainbow (2.1.0)
21
- rake (11.1.2)
22
- rspec (3.4.0)
23
- rspec-core (~> 3.4.0)
24
- rspec-expectations (~> 3.4.0)
25
- rspec-mocks (~> 3.4.0)
26
- rspec-core (3.4.4)
27
- rspec-support (~> 3.4.0)
28
- rspec-expectations (3.4.0)
21
+ rake (11.2.2)
22
+ rspec (3.5.0)
23
+ rspec-core (~> 3.5.0)
24
+ rspec-expectations (~> 3.5.0)
25
+ rspec-mocks (~> 3.5.0)
26
+ rspec-core (3.5.2)
27
+ rspec-support (~> 3.5.0)
28
+ rspec-expectations (3.5.0)
29
29
  diff-lcs (>= 1.2.0, < 2.0)
30
- rspec-support (~> 3.4.0)
31
- rspec-mocks (3.4.1)
30
+ rspec-support (~> 3.5.0)
31
+ rspec-mocks (3.5.0)
32
32
  diff-lcs (>= 1.2.0, < 2.0)
33
- rspec-support (~> 3.4.0)
34
- rspec-support (3.4.1)
35
- rubocop (0.40.0)
36
- parser (>= 2.3.1.0, < 3.0)
33
+ rspec-support (~> 3.5.0)
34
+ rspec-support (3.5.0)
35
+ rubocop (0.42.0)
36
+ parser (>= 2.3.1.1, < 3.0)
37
37
  powerpack (~> 0.1)
38
38
  rainbow (>= 1.99.1, < 3.0)
39
39
  ruby-progressbar (~> 1.7)
40
40
  unicode-display_width (~> 1.0, >= 1.0.1)
41
- ruby-progressbar (1.8.0)
42
- simplecov (0.11.2)
41
+ ruby-progressbar (1.8.1)
42
+ simplecov (0.12.0)
43
43
  docile (~> 1.1.0)
44
- json (~> 1.8)
44
+ json (>= 1.8, < 3)
45
45
  simplecov-html (~> 0.10.0)
46
46
  simplecov-html (0.10.0)
47
- unicode-display_width (1.0.5)
48
- yard (0.8.7.6)
47
+ unicode-display_width (1.1.0)
48
+ yard (0.9.5)
49
49
 
50
50
  PLATFORMS
51
51
  ruby
@@ -54,11 +54,11 @@ DEPENDENCIES
54
54
  bundler (~> 1.12)
55
55
  codeclimate-test-reporter
56
56
  collapsium-config!
57
- rake (~> 11.1)
58
- rspec (~> 3.4)
59
- rubocop (~> 0.40)
60
- simplecov (~> 0.11)
61
- yard (~> 0.8)
57
+ rake (~> 11.2)
58
+ rspec (~> 3.5)
59
+ rubocop (~> 0.42)
60
+ simplecov (~> 0.12)
61
+ yard (~> 0.9)
62
62
 
63
63
  BUNDLED WITH
64
- 1.12.3
64
+ 1.12.5
@@ -37,13 +37,13 @@ Gem::Specification.new do |spec|
37
37
  spec.required_ruby_version = '>= 2.0'
38
38
 
39
39
  spec.add_development_dependency "bundler", "~> 1.12"
40
- spec.add_development_dependency "rubocop", "~> 0.40"
41
- spec.add_development_dependency "rake", "~> 11.1"
42
- spec.add_development_dependency "rspec", "~> 3.4"
43
- spec.add_development_dependency "simplecov", "~> 0.11"
44
- spec.add_development_dependency "yard", "~> 0.8"
40
+ spec.add_development_dependency "rubocop", "~> 0.42"
41
+ spec.add_development_dependency "rake", "~> 11.2"
42
+ spec.add_development_dependency "rspec", "~> 3.5"
43
+ spec.add_development_dependency "simplecov", "~> 0.12"
44
+ spec.add_development_dependency "yard", "~> 0.9"
45
45
 
46
- spec.add_dependency 'collapsium', '~> 0.1'
46
+ spec.add_dependency 'collapsium', '~> 0.4'
47
47
  end
48
48
  # rubocop:enable Style/SpaceAroundOperators
49
49
  # rubocop:enable Style/UnneededPercentQ, Style/ExtraSpacing
@@ -39,6 +39,8 @@ module Collapsium
39
39
  # That means that if you are trying to merge a hash with an array config, the
40
40
  # result may be unexpected.
41
41
  class Configuration < ::Collapsium::UberHash
42
+ include ::Collapsium::EnvironmentOverride
43
+
42
44
  # @api private
43
45
  # Very simple YAML parser
44
46
  class YAMLParser
@@ -46,7 +48,7 @@ module Collapsium
46
48
 
47
49
  # @return parsed string
48
50
  def self.parse(string)
49
- YAML.load(string)
51
+ return YAML.load(string)
50
52
  end
51
53
  end
52
54
  private_constant :YAMLParser
@@ -58,44 +60,11 @@ module Collapsium
58
60
 
59
61
  # @return parsed string
60
62
  def self.parse(string)
61
- JSON.parse(string)
63
+ return JSON.parse(string)
62
64
  end
63
65
  end
64
66
  private_constant :JSONParser
65
67
 
66
- UberHash::READ_METHODS.each do |method|
67
- # Wrap all read functions into something that checks for environment
68
- # variables first.
69
- define_method(method) do |*args, &block|
70
- # If there are no arguments, there's nothing to do with paths. Just
71
- # delegate to the hash.
72
- if args.empty?
73
- return super(*args, &block)
74
- end
75
-
76
- # We'll make it rather simple: since the first argument is a key, we
77
- # will just transform it to the matching environment variable name,
78
- # and see if that environment variable is set.
79
- env_name = args[0].to_s.upcase.gsub(split_pattern, '_')
80
- contents = nil
81
- if env_name != '_'
82
- contents = ENV[env_name]
83
- end
84
-
85
- # No environment variable set? Fine, just do the usual thing.
86
- if contents.nil? or contents.empty?
87
- return super(*args, &block)
88
- end
89
-
90
- # With an environment variable, we will try to parse it as JSON first.
91
- begin
92
- return JSONParser.parse(contents)
93
- rescue JSON::ParserError
94
- return contents
95
- end
96
- end
97
- end
98
-
99
68
  class << self
100
69
  # @api private
101
70
  # Mapping of file name extensions to parser types.
@@ -117,24 +86,32 @@ module Collapsium
117
86
  # detected based on one of the extensions in FILE_TO_PARSER.
118
87
  #
119
88
  # @param path [String] the path of the configuration file to load.
120
- # @param resolve_extensions [Boolean] flag whether to resolve configuration
121
- # hash extensions. (see `#resolve_extensions`)
122
- def load_config(path, resolve_extensions = true)
89
+ # @param options [Hash] options hash with the following keys:
90
+ # - resolve_extensions [Boolean] flag whether to resolve configuration
91
+ # hash extensions. (see `#resolve_extensions`)
92
+ # - data [Hash] data Hash to pass on to the templating mechanism.
93
+ def load_config(path, options = {})
94
+ # Option defaults
95
+ if options[:resolve_extensions].nil?
96
+ options[:resolve_extensions] = true
97
+ end
98
+ options[:data] ||= {}
99
+
123
100
  # Load base and local configuration files
124
- base, config = load_base_config(path)
125
- _, local_config = load_local_config(base)
101
+ base, config = load_base_config(path, options[:data])
102
+ _, local_config = load_local_config(base, options[:data])
126
103
 
127
104
  # Merge local configuration
128
105
  config.recursive_merge!(local_config)
129
106
 
130
107
  # Resolve includes
131
- config = resolve_includes(base, config)
108
+ config = resolve_includes(base, config, options[:data])
132
109
 
133
110
  # Create config from the result
134
111
  cfg = Configuration.new(config)
135
112
 
136
113
  # Now resolve config hashes that extend other hashes.
137
- if resolve_extensions
114
+ if options[:resolve_extensions]
138
115
  cfg.resolve_extensions!
139
116
  end
140
117
 
@@ -143,7 +120,17 @@ module Collapsium
143
120
 
144
121
  private
145
122
 
146
- def load_base_config(path)
123
+ def parse(extension, contents, data)
124
+ # Evaluate template
125
+ require 'erb'
126
+ b = binding
127
+ contents = ERB.new(contents).result(b)
128
+
129
+ # Pass on to file type parser
130
+ return FILE_TO_PARSER[extension].parse(contents)
131
+ end
132
+
133
+ def load_base_config(path, template_data)
147
134
  # Make sure the format is recognized early on.
148
135
  base = Pathname.new(path)
149
136
  formats = FILE_TO_PARSER.keys
@@ -158,12 +145,12 @@ module Collapsium
158
145
  contents = file.read
159
146
 
160
147
  # Parse the contents.
161
- config = FILE_TO_PARSER[base.extname].parse(contents)
148
+ config = parse(base.extname, contents, template_data)
162
149
 
163
150
  return base, UberHash.new(hashify(config))
164
151
  end
165
152
 
166
- def load_local_config(base)
153
+ def load_local_config(base, template_data)
167
154
  # Now construct a file name for a local override.
168
155
  local = Pathname.new(base.dirname)
169
156
  local = local.join(base.basename(base.extname).to_s + "-local" +
@@ -177,7 +164,7 @@ module Collapsium
177
164
  file = local.open
178
165
  contents = file.read
179
166
 
180
- local_config = FILE_TO_PARSER[base.extname].parse(contents)
167
+ local_config = parse(base.extname, contents, template_data)
181
168
 
182
169
  return local, UberHash.new(hashify(local_config))
183
170
  end
@@ -192,7 +179,7 @@ module Collapsium
192
179
  return data
193
180
  end
194
181
 
195
- def resolve_includes(base, config)
182
+ def resolve_includes(base, config, template_data)
196
183
  processed = []
197
184
  includes = []
198
185
 
@@ -219,14 +206,14 @@ module Collapsium
219
206
  file = incfile.open
220
207
  contents = file.read
221
208
 
222
- parsed = FILE_TO_PARSER[incfile.extname].parse(contents)
209
+ parsed = parse(incfile.extname, contents, template_data)
223
210
 
224
211
  # Extract and merge includes
225
212
  inner_inc = extract_includes(parsed)
226
213
  includes += inner_inc
227
214
 
228
215
  # Merge the rest
229
- config.recursive_merge!(UberHash.new(hashify(parsed)))
216
+ config.recursive_merge!(hashify(parsed))
230
217
 
231
218
  processed << filename
232
219
  end
@@ -9,6 +9,6 @@
9
9
  module Collapsium
10
10
  module Config
11
11
  # The current release version
12
- VERSION = "0.1.1".freeze
12
+ VERSION = "0.2.0".freeze
13
13
  end # module Config
14
14
  end # module Collapsium
@@ -83,6 +83,17 @@ describe Collapsium::Config::Configuration do
83
83
  expect(cfg["baz"]).to eql "override"
84
84
  ENV.delete("BAZ")
85
85
  end
86
+
87
+ it "parses JSON when overriding from the environment" do
88
+ config = File.join(@data_path, 'hash.yml')
89
+ cfg = Collapsium::Config::Configuration.load_config(config)
90
+
91
+ ENV["BAZ"] = '{ "json_key": "json_value" }'
92
+ expect(cfg["foo"]).to eql "bar"
93
+ expect(cfg["baz"].is_a?(Hash)).to be_truthy
94
+ expect(cfg["baz.json_key"]).to eql "json_value"
95
+ ENV.delete("BAZ")
96
+ end
86
97
  end
87
98
 
88
99
  describe "extend functionality" do
@@ -180,4 +191,18 @@ describe Collapsium::Config::Configuration do
180
191
  expect { cfg[] }.to raise_error(ArgumentError)
181
192
  end
182
193
  end
194
+
195
+ describe "ERB templating" do
196
+ it "replaces variables" do
197
+ config = File.join(@data_path, 'template.yml')
198
+
199
+ data = {
200
+ my_var: Random.rand
201
+ }
202
+ cfg = Collapsium::Config::Configuration.load_config(config, data: data)
203
+
204
+ expect(cfg["foo"]).to eql "bar"
205
+ expect(cfg["baz"]).to eql data[:my_var]
206
+ end
207
+ end
183
208
  end
@@ -0,0 +1,3 @@
1
+ ---
2
+ foo: bar
3
+ baz: <%= data[:my_var] %>
@@ -26,7 +26,7 @@ describe Collapsium::Config do
26
26
 
27
27
  it "loads configuration from an existing path" do
28
28
  Collapsium::Config.config_file = File.join(@data_path, 'global.yml')
29
- expect { config.empty? }.not_to raise_error(ArgumentError)
29
+ expect { config.empty? }.not_to raise_error
30
30
  expect(config.empty?).to be_falsy
31
31
  end
32
32
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collapsium-config
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Finkhaeuser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-11 00:00:00.000000000 Z
11
+ date: 2016-08-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,84 +30,84 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.40'
33
+ version: '0.42'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.40'
40
+ version: '0.42'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '11.1'
47
+ version: '11.2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '11.1'
54
+ version: '11.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.4'
61
+ version: '3.5'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.4'
68
+ version: '3.5'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.11'
75
+ version: '0.12'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0.11'
82
+ version: '0.12'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: yard
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.8'
89
+ version: '0.9'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.8'
96
+ version: '0.9'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: collapsium
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '0.1'
103
+ version: '0.4'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '0.1'
110
+ version: '0.4'
111
111
  description: "\n Using collapsium's UberHash class for easy access to configuration
112
112
  values,\n this gem reads and merges various configuration sources into one\n
113
113
  \ configuration object.\n "
@@ -152,6 +152,7 @@ files:
152
152
  - spec/data/merge-hash.yml
153
153
  - spec/data/recurse.yml
154
154
  - spec/data/recursive.yml
155
+ - spec/data/template.yml
155
156
  - spec/data/test.json
156
157
  - spec/module_spec.rb
157
158
  - spec/spec_helper.rb
@@ -201,7 +202,7 @@ test_files:
201
202
  - spec/data/merge-hash.yml
202
203
  - spec/data/recurse.yml
203
204
  - spec/data/recursive.yml
205
+ - spec/data/template.yml
204
206
  - spec/data/test.json
205
207
  - spec/module_spec.rb
206
208
  - spec/spec_helper.rb
207
- has_rdoc: