dry-config 1.1.3 → 1.1.4

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: 98683afd3015ee5ff47cf5b9f01467dd7c63f7b6
4
- data.tar.gz: 4ce00ecb1bfe04cef403638b91212fbd368f98b1
3
+ metadata.gz: 2e5ef4a6ae7ca95ba67b4727fe8137765874464f
4
+ data.tar.gz: 90bf572de240fd4250dd88353fed2be01b4b6bde
5
5
  SHA512:
6
- metadata.gz: 3b70a9e1af3df65faf2b9835a7fcb7cd096c2077a575dc05721c293eb3012b115cd9a52a0ae7040a8634c52d3478e797ed56835987e0af28a54cf68af800919a
7
- data.tar.gz: 0677f1074dbff533cb8d419ff434ff9e51aec379d4c3f14cde2b37c1ba4cc6c82f000becfe6ccec37dc4e9a73a5ae3ee900f288c2dd863c0c724f9e36f9e137f
6
+ metadata.gz: db019775409ec7a2f0aa72a47f903c8dbe25d40a4f77b6af9af3b466c701ba73c2bb642c1eabfe96a9daf8be55061a7d4298eac7998de1c96591ae0d5570cbca
7
+ data.tar.gz: 44db43c679ec43e5187f773fe90cbad3e76baeb0c4809d9737268894125bd1255fe284fd41ecf09d0ce3dcd105a6e10adef7cb822b6de728381fe35c7d4167ea
data/.gitignore CHANGED
@@ -16,3 +16,4 @@ spec/reports
16
16
  test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
+ test-reports
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --require spec_helper
2
+ --require spec_helper
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ dry_config
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.2.2
data/README.md CHANGED
@@ -111,6 +111,22 @@ config.options[:'aws:autoscaling:launchconfiguration'][:InstanceType] # t1.large
111
111
  - An optional `#seed_default_configuration` allows you to provide a configuration base
112
112
  - `#clear` will restore to the seed configuration, allowing you to `#load!` new settings.
113
113
 
114
+ ## ENV Interpolation/substitution/expansion
115
+
116
+ ENV variable substitution is supported and enabled by default. It may be disabled by initializing with `{interpolation: false}`.
117
+
118
+ The following formats are acceptable:
119
+
120
+ ```yaml
121
+ interpolations:
122
+ - ~/foo
123
+ - $HOME/foo
124
+ - ${HOME}/foo
125
+ - #{HOME}/foo
126
+ # mixed example
127
+ - ~/docker/mysql/${PROJECT_NAME}-${BUILD}:/var/lib/mysql:rw
128
+ ```
129
+
114
130
  ## White Label sample
115
131
 
116
132
  ```ruby
data/dry-config.gemspec CHANGED
@@ -18,8 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
19
  s.require_paths = ['lib']
20
20
 
21
- s.add_development_dependency 'bundler', '~> 1.3'
21
+ s.add_development_dependency 'bundler'
22
22
  s.add_development_dependency 'rake'
23
- s.add_development_dependency 'rspec', '>= 2.14.1'
23
+ s.add_development_dependency 'rspec'
24
24
 
25
25
  end
@@ -17,7 +17,9 @@ module Dry
17
17
  attr_reader :environment
18
18
  attr_reader :filenames
19
19
 
20
- def initialize(*args)
20
+ def initialize(options = {})
21
+ @options = {interpolation: true}.merge options
22
+
21
23
  seed_default_configuration
22
24
 
23
25
  # used for pruning initial base set. See #load!
@@ -80,11 +82,38 @@ module Dry
80
82
  end
81
83
 
82
84
  def load_yaml_file(filename)
83
- config = YAML::load_file(filename)
85
+
86
+ # without interpolation
87
+ # config = Psych.load_file(filename)
88
+
89
+ # get file contents as string
90
+ file = File.open(filename, 'r:bom|utf-8')
91
+ contents = file.read
92
+
93
+ if @options[:interpolation]
94
+ # interpolate/substitute/expand ENV variables with the string contents before parsing
95
+ # bash - $VAR
96
+ contents = contents.gsub(/\$(\w+)/) { ENV[$1] }
97
+ # bash - ${VAR}
98
+ contents = contents.gsub(/\${(\w+)}/) { ENV[$1] }
99
+ # bash - ~ is ENV['HOME']
100
+ contents = contents.gsub(/(~)/) { ENV['HOME'] }
101
+ # ruby - #{VAR}
102
+ contents = contents.gsub(/\#{(\w+)}/) { ENV[$1] }
103
+ end
104
+ # now parse
105
+ config = Psych.load(contents, filename)
106
+
84
107
  raise "Failed to load #{filename}" if config.nil?
85
108
  config.deep_symbolize
86
109
  end
87
110
 
111
+ def write_yaml_file(filename)
112
+ File.open(filename, 'w') do |file|
113
+ file.write(Psych.dump(@configuration))
114
+ end
115
+ end
116
+
88
117
  def reload!
89
118
  clear
90
119
  load! @environment, @filenames
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Config
3
- VERSION = '1.1.3'
3
+ VERSION = '1.1.4'
4
4
  end
5
5
  end
@@ -0,0 +1,22 @@
1
+ # https://docs.docker.com/v1.6/compose/cli/#environment-variables
2
+ web:
3
+ build: .
4
+ command: bin/rails server --port 3000 --binding 0.0.0.0
5
+ ports:
6
+ - "3000:3000"
7
+ links:
8
+ - db
9
+ volumes:
10
+ - .:/myapp
11
+ db:
12
+ # https://github.com/docker-library/docs/tree/master/mysql
13
+ image: library/mysql:5.7.6
14
+ ports:
15
+ - "3306:3306"
16
+ # volumes:
17
+ # - ~/docker/mysql/${PROJECT_NAME}:/var/lib/mysql:rw
18
+ # interpolation coming in compose 1.5
19
+ # https://github.com/docker/compose/pull/1765
20
+ # https://github.com/docker/compose/issues/1377
21
+ environment:
22
+ - MYSQL_ALLOW_EMPTY_PASSWORD=true
@@ -0,0 +1,27 @@
1
+ # https://docs.docker.com/v1.6/compose/cli/#environment-variables
2
+ web:
3
+ build: .
4
+ command: bin/rails server --port 3000 --binding 0.0.0.0
5
+ ports:
6
+ - "3000:3000"
7
+ links:
8
+ - db
9
+ volumes:
10
+ - .:/myapp
11
+ db:
12
+ # https://github.com/docker-library/docs/tree/master/mysql
13
+ image: library/mysql:5.7.6
14
+ ports:
15
+ - "3306:3306"
16
+ volumes:
17
+ - ~/docker/mysql/${PROJECT_NAME}-${BUILD}:/var/lib/mysql:rw
18
+ # interpolation coming in compose 1.5
19
+ # https://github.com/docker/compose/pull/1765
20
+ # https://github.com/docker/compose/issues/1377
21
+ environment:
22
+ - MYSQL_ALLOW_EMPTY_PASSWORD=true
23
+ interpolations:
24
+ - ~/foo
25
+ - $HOME/foo
26
+ - ${HOME}/foo
27
+ - #{HOME}/foo
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+ require 'singleton'
3
+
4
+ describe Dry::Config::Base do
5
+
6
+ class ComposeConfig < Dry::Config::Base
7
+ end
8
+
9
+ subject(:new_compose) { ComposeConfig.new }
10
+
11
+ context 'no interpolation' do
12
+ let(:config_file_name) { 'docker-compose-template-simple.yml' }
13
+ subject(:compose) { new_compose}
14
+ before(:each) { FileUtils.rm_r tmp_dir }
15
+
16
+ it 'should read file and write file with all values intact' do
17
+ compose.clear
18
+ compose.load!(nil, config_file_name_path)
19
+
20
+ expected_config = compose.configuration
21
+ tmp_file = tmp_file(config_file_name.gsub('.', '-out.'))
22
+ compose.write_yaml_file(tmp_file)
23
+
24
+ compose.clear
25
+ compose.load!(nil, tmp_file)
26
+ actual_config = compose.configuration
27
+
28
+ expect(actual_config).to eq expected_config
29
+ end
30
+ end
31
+
32
+ context 'interpolation' do
33
+ let(:config_file_name) { 'docker-compose-template.yml' }
34
+ before(:each) {
35
+ ENV['HOME'] = '/Users/rosskevin'
36
+ ENV['PROJECT_NAME'] = 'acme'
37
+ ENV['BUILD'] = '888'
38
+ }
39
+ subject(:compose) {
40
+ compose = new_compose
41
+ compose.clear
42
+ compose.load!(nil, config_file_name_path)
43
+ compose
44
+ }
45
+ let(:configuration) { compose.configuration }
46
+
47
+ it 'parses structure' do
48
+ expect(configuration[:db]).not_to be_nil
49
+ end
50
+
51
+ it 'multiple' do
52
+ expect(configuration[:db][:volumes][0]).to eq '/Users/rosskevin/docker/mysql/acme-888:/var/lib/mysql:rw'
53
+ end
54
+
55
+ it 'all varieties' do
56
+ interpolations = configuration[:interpolations]
57
+ interpolations.each do |result|
58
+ expect(result).to eq '/Users/rosskevin/foo'
59
+ end
60
+ end
61
+
62
+ context 'disabled' do
63
+ subject(:new_compose) {ComposeConfig.new(interpolation: false)}
64
+
65
+ it 'parses structure' do
66
+ expect(configuration[:db]).not_to be_nil
67
+ end
68
+
69
+ it 'it does not interpolate' do
70
+ expect(configuration[:db][:volumes][0]).to eq '~/docker/mysql/${PROJECT_NAME}-${BUILD}:/var/lib/mysql:rw'
71
+ end
72
+ end
73
+ end
74
+
75
+
76
+ private
77
+
78
+ def config_file_name_path
79
+ File.expand_path("../#{config_file_name}", __FILE__)
80
+ end
81
+
82
+ def tmp_file(filename)
83
+ file = File.expand_path(filename, tmp_dir)
84
+ file
85
+ end
86
+
87
+ def tmp_dir
88
+ dir = File.expand_path("../.././../../tmp/interpolation", __FILE__)
89
+ FileUtils.mkdir_p(dir) unless File.exists? dir
90
+ dir
91
+ end
92
+ end
data/spec/spec_helper.rb CHANGED
@@ -4,5 +4,8 @@ require 'bundler/setup'
4
4
  # our gem
5
5
  require 'dry/config'
6
6
 
7
+ Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
8
+
7
9
  RSpec.configure do |config|
10
+ # config.include Dry::Config::Foo
8
11
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-config
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Ross
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-12 00:00:00.000000000 Z
11
+ date: 2015-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 2.14.1
47
+ version: '0'
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: 2.14.1
54
+ version: '0'
55
55
  description: Simple base class for DRY environment based configurations.
56
56
  email:
57
57
  - kevin.ross@alienfast.com
@@ -61,7 +61,8 @@ extra_rdoc_files: []
61
61
  files:
62
62
  - ".gitignore"
63
63
  - ".rspec"
64
- - ".rvmrc"
64
+ - ".ruby-gemset"
65
+ - ".ruby-version"
65
66
  - Gemfile
66
67
  - LICENSE.txt
67
68
  - README.md
@@ -74,6 +75,9 @@ files:
74
75
  - spec/dry/config/acme.yml
75
76
  - spec/dry/config/base_spec.rb
76
77
  - spec/dry/config/deep_symbolizable_spec.rb
78
+ - spec/dry/config/docker-compose-template-simple.yml
79
+ - spec/dry/config/docker-compose-template.yml
80
+ - spec/dry/config/interpolation_spec.rb
77
81
  - spec/dry/config/white-label/acme.com.yml
78
82
  - spec/dry/config/white-label/base.yml
79
83
  - spec/dry/config/white-label/scheduling.acme.com.yml
@@ -98,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
102
  version: '0'
99
103
  requirements: []
100
104
  rubyforge_project:
101
- rubygems_version: 2.2.2
105
+ rubygems_version: 2.4.8
102
106
  signing_key:
103
107
  specification_version: 4
104
108
  summary: Simple base class for DRY environment based configurations.
@@ -106,6 +110,9 @@ test_files:
106
110
  - spec/dry/config/acme.yml
107
111
  - spec/dry/config/base_spec.rb
108
112
  - spec/dry/config/deep_symbolizable_spec.rb
113
+ - spec/dry/config/docker-compose-template-simple.yml
114
+ - spec/dry/config/docker-compose-template.yml
115
+ - spec/dry/config/interpolation_spec.rb
109
116
  - spec/dry/config/white-label/acme.com.yml
110
117
  - spec/dry/config/white-label/base.yml
111
118
  - spec/dry/config/white-label/scheduling.acme.com.yml
data/.rvmrc DELETED
@@ -1 +0,0 @@
1
- rvm use ruby-2.1.2@dry_config --create