collapsium-config 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: