foundry 0.4.0 → 0.5.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: 0d2491a84ca38fbb4654e718bc97107610a1d8aa
4
- data.tar.gz: 6d1e0e431a2b7f03c2d41753ba5eb334fb12551a
3
+ metadata.gz: 8c5e26aee10f8b0f8ce70041ac8f58bc3d15053c
4
+ data.tar.gz: 69cc9a43621f3d13eb8a95993574fd942bcf7378
5
5
  SHA512:
6
- metadata.gz: b7df5b0ae04f808fbf30c3f5072bd37100c2dd4a47ab033d68bc4bd6b1aeea2cb5dd95be88e3418ccdc0a73b02c19610e09d80816daa38637a213fdc2009d49f
7
- data.tar.gz: 8982aa92e9096317c24b982709b3f9145262e3db2069bc8cee7977d49d50a0709de5c81d7c1629ae129d9d5d557663abf97ec5a7c91ddff6cc7a5a739d4d9370
6
+ metadata.gz: c2d80f91e70408abd0676c7fa09152712d4243c4589fe25f1daa8a3d7b3f88d552e254f3cb65acbee31354488cd9ef2644b5e8c03ad68168941ea53ade1161ec
7
+ data.tar.gz: 6e3cb8321089f61f99d830ba0305bea7ede7c966e9c59137ea6b0e7248286acac7dd49921fe44812657d9f8c5917f520e453c93a9e79aac4c877cc097070ba16
data/.travis.yml CHANGED
@@ -1,20 +1,8 @@
1
1
  language: ruby
2
2
 
3
- matrix:
4
- allow_failures:
5
- - rvm: jruby-19mode
6
- - rvm: rbx-2
7
-
8
3
  rvm:
9
- - 1.8.7
10
- - 1.9.2
11
- - 1.9.3
12
4
  - 2.0.0
13
- - 2.1.0
14
- - 2.1.1
15
- - 2.1.2
16
- - 2.1.3
17
- - 2.1.4
18
- - 2.1.5
19
- - jruby-19mode
20
- - rbx-2
5
+ - 2.1.9
6
+ - 2.2.6
7
+ - 2.3.3
8
+ - 2.4.0
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Foundry
1
+ # Foundry
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/jzaleski/foundry.png?branch=master)](http://travis-ci.org/jzaleski/foundry)
4
4
  [![Dependency Status](https://gemnasium.com/jzaleski/foundry.png)](https://gemnasium.com/jzaleski/foundry)
@@ -11,8 +11,8 @@ This gem aims to keep it simple and fully decouple the two concerns.
11
11
 
12
12
  Features:
13
13
 
14
- * Can load YAML from a local-file
15
- * Can load YAML from a HTTP/HTTPS endpoint
14
+ * Can load JSON or YAML from a local-file
15
+ * Can load JSON or YAML from a HTTP/HTTPS endpoint
16
16
  * Supports Basic Authentication for HTTP{,S} endpoints
17
17
  * Supports ERB interpolation
18
18
  * Returns an easy to navigate object-graph
@@ -46,20 +46,19 @@ config = Foundry::Configurator.configure(
46
46
  Loading from a HTTP/HTTPS endpoint:
47
47
 
48
48
  ```ruby
49
+ # defaults to a source-type of `Foundry::Sources::URI` and a parser-type of `Foundry::Parsers::YAML`
49
50
  config = Foundry::Configurator.configure(
50
51
  :root_path => 'http-or-https-root-url',
51
52
  :relative_path => 'relative-path-to-file',
52
- :source_type => Foundry::Sources::URI
53
53
  )
54
54
  ```
55
55
 
56
- Loading from a HTTP/HTTPS endpoint using "Basic Authentication":
56
+ Loading YAML from a HTTP/HTTPS endpoint using "Basic Authentication":
57
57
 
58
58
  ```ruby
59
59
  config = Foundry::Configurator.configure(
60
60
  :root_path => 'http-or-https-root-url',
61
61
  :relative_path => 'relative-path-to-file',
62
- :source_type => Foundry::Sources::URI,
63
62
  :username => 'basic-auth-username',
64
63
  :password => 'basic-auth-password'
65
64
  )
@@ -95,9 +94,10 @@ Inheritance support:
95
94
  ```ruby
96
95
  # The examples below assume that there are two files available, relative to the
97
96
  # `root_path`, named "file1.yml" and "file2.yml" (and that "file2.yml" inherits
98
- # from "file1.yml").
97
+ # from "file1.yml" -- it is immaterial at this point whether the file-format is
98
+ # JSON or YAML).
99
99
  #
100
- # The file contents are as follows:
100
+ # When using the YAML parser, the file contents would be as follows:
101
101
  #
102
102
  # === file1.yml ===
103
103
  #
@@ -110,12 +110,22 @@ Inheritance support:
110
110
  # value2: value
111
111
  # inherit: file1.yml
112
112
  #
113
+ # When using the JSON parser, the file contents would be as follows:
114
+ #
115
+ # === file1.json ===
116
+ #
117
+ # { "value1": "value" }
118
+ #
119
+ # === file2.json ===
120
+ #
121
+ # { "inherit": "file1.json", "value2": "value" }
122
+ #
113
123
  # It is also assumed that the files have already been loaded and processed by a
114
124
  # call to `Foundry::Configurator.configure` (into a variable named `config`).
115
125
  #
116
- # The result now contains values for both `value1` and `value2` and can be used
117
- # as follows (it is worth noting that the `inherit` key is removed during the
118
- # configuration process):
126
+ # Regardless of parser-type the result now contains values for both `value1` and
127
+ # `value2` and can be used as follows (it is worth noting that the `inherit` key
128
+ # is removed during the configuration process):
119
129
 
120
130
  # Fetching `value1` and `value2` using dot-notation
121
131
  value1 = config.value1
data/foundry.gemspec CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'foundry/version'
@@ -22,11 +23,11 @@ Gem::Specification.new do |gem|
22
23
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
23
24
  gem.require_paths = ['lib']
24
25
 
25
- gem.add_dependency('json', '~> 1.8')
26
+ gem.add_dependency('json', '~> 2.0')
26
27
 
27
28
  gem.add_development_dependency 'bundler', '~> 1.0'
28
29
  gem.add_development_dependency 'pry', '~> 0.10'
29
- gem.add_development_dependency 'rake', '~> 10.4'
30
- gem.add_development_dependency 'rspec', '~> 3.1'
31
- gem.add_development_dependency 'webmock', '~> 1.20'
30
+ gem.add_development_dependency 'rake', '~> 12.0'
31
+ gem.add_development_dependency 'rspec', '~> 3.0'
32
+ gem.add_development_dependency 'webmock', '~> 3.0'
32
33
  end
@@ -1,5 +1,6 @@
1
1
  require 'ostruct'
2
2
 
3
+
3
4
  module Foundry
4
5
  class Configurator
5
6
  def self.configure(opts)
@@ -9,7 +10,9 @@ module Foundry
9
10
  def configure(opts)
10
11
  with_opts(opts) do
11
12
  relative_path = opts.fetch(:relative_path)
12
- structify(mergify(transmorgify(relative_path)))
13
+ transmorg = transmorgify(relative_path)
14
+ merged = mergify(transmorg)
15
+ structify(merged)
13
16
  end
14
17
  end
15
18
 
@@ -18,7 +21,7 @@ module Foundry
18
21
  DEFAULT_OPTS = {
19
22
  :parser_type => Foundry::Parsers::YAML,
20
23
  :source_type => Foundry::Sources::URI,
21
- :template_engine_type => Foundry::TemplateEngines::ERB
24
+ :template_engine_type => Foundry::TemplateEngines::ERB,
22
25
  }
23
26
 
24
27
  attr_reader :opts
@@ -63,20 +66,16 @@ module Foundry
63
66
  opts_value_or_default(:source_type)
64
67
  end
65
68
 
66
- def structify(object)
67
- case object
69
+ def structify(value)
70
+ case value
68
71
  when Array
69
- object.map do |value|
70
- structify(value)
71
- end
72
+ value.map { |item| structify(item) }
72
73
  when Hash
73
- OpenStruct.new.tap do |open_struct|
74
- object.each do |key, value|
75
- open_struct.send("#{key}=", structify(value))
76
- end
74
+ OpenStruct.new.tap do |struct|
75
+ value.each { |item| struct.send("#{item[0]}=", structify(item[1])) }
77
76
  end
78
77
  else
79
- object
78
+ value
80
79
  end
81
80
  end
82
81
 
@@ -1,5 +1,6 @@
1
1
  require 'json'
2
2
 
3
+
3
4
  module Foundry
4
5
  module Parsers
5
6
  class JSON
@@ -1,5 +1,6 @@
1
1
  require 'yaml'
2
2
 
3
+
3
4
  module Foundry
4
5
  module Parsers
5
6
  class YAML
@@ -2,6 +2,7 @@ require 'net/http'
2
2
  require 'openssl'
3
3
  require 'uri'
4
4
 
5
+
5
6
  module Foundry
6
7
  module Sources
7
8
  class URI
@@ -17,7 +18,8 @@ module Foundry
17
18
  request.basic_auth(username, password)
18
19
  end
19
20
  response = client.request(request)
20
- raise "Unknown configuration file: #{uri}" unless response.is_a?(Net::HTTPSuccess)
21
+ raise "Unknown configuration file: #{uri}" \
22
+ unless response.is_a?(Net::HTTPSuccess)
21
23
  response.body
22
24
  end
23
25
  end
@@ -1,5 +1,6 @@
1
1
  require 'erb'
2
2
 
3
+
3
4
  module Foundry
4
5
  module TemplateEngines
5
6
  class ERB
@@ -1,3 +1,3 @@
1
1
  module Foundry
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -1,16 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Foundry::Configurator do
4
- REQUIRED_OPTS = [
5
- :root_path,
6
- :relative_path
7
- ]
4
+ REQUIRED_OPTS = [:relative_path, :root_path]
8
5
 
9
6
  let(:opts) { REQUIRED_OPTS.reduce({}) { |memo, opt| memo[opt] = nil; memo } }
10
7
 
11
8
  REQUIRED_OPTS.each do |key|
12
9
  it %{must be passed a "#{key}"} do
13
- expect { subject.configure(opts.without(key)) }.to raise_error
10
+ expect { subject.configure(opts.without(key)) }.to raise_error KeyError
14
11
  end
15
12
  end
16
13
 
@@ -26,7 +23,7 @@ describe Foundry::Configurator do
26
23
  with_parser do |parser|
27
24
  expect(source).to receive(:load)
28
25
  expect(parser).to receive(:parse).and_call_original
29
- expect { subject.configure(opts) }.to raise_error
26
+ expect { subject.configure(opts) }.to raise_error ZeroDivision
30
27
  end
31
28
  end
32
29
  end
@@ -35,7 +32,7 @@ describe Foundry::Configurator do
35
32
  with_source do |source|
36
33
  expect(source).to receive(:load) { 'foo: <%= 1/0 %>' }
37
34
  expect(template_engine).to receive(:evaluate).and_call_original
38
- expect { subject.configure(opts) }.to raise_error
35
+ expect { subject.configure(opts) }.to raise_error ZeroDivision
39
36
  end
40
37
  end
41
38
 
@@ -6,6 +6,6 @@ describe Foundry::Parsers::JSON do
6
6
  end
7
7
 
8
8
  it 'will raise an error if the JSON is unparseable' do
9
- expect { subject.parse(nil) }.to raise_error
9
+ expect { subject.parse(nil) }.to raise_error TypeError
10
10
  end
11
11
  end
@@ -6,6 +6,6 @@ describe Foundry::Parsers::YAML do
6
6
  end
7
7
 
8
8
  it 'will raise an error if the YAML is unparseable' do
9
- expect { subject.parse(nil) }.to raise_error
9
+ expect { subject.parse(nil) }.to raise_error TypeError
10
10
  end
11
11
  end
@@ -7,6 +7,6 @@ describe Foundry::Sources::File do
7
7
  end
8
8
 
9
9
  it 'will raise an error if the file does not exist' do
10
- expect { subject.load('', '', {}) }.to raise_error
10
+ expect { subject.load('', '', {}) }.to raise_error Errno::EISDIR
11
11
  end
12
12
  end
@@ -14,7 +14,6 @@ describe Foundry::Sources::URI do
14
14
  let(:https_response_body) { 'https_response_body' }
15
15
  let(:https_opts) { {} }
16
16
 
17
- let(:basic_auth_uri) { "http://#{basic_auth_username}:#{basic_auth_password}@#{domain}/#{relative_path}" }
18
17
  let(:basic_auth_root_path) { http_root_path }
19
18
  let(:basic_auth_response_body) { 'basic_auth_response_body' }
20
19
  let(:basic_auth_username) { 'basic_auth_username' }
@@ -49,7 +48,7 @@ describe Foundry::Sources::URI do
49
48
  end
50
49
 
51
50
  it 'can load from a endpoint using basic-auth' do
52
- stub_request(:get, basic_auth_uri).to_return(:body => basic_auth_response_body)
51
+ stub_request(:get, http_uri).to_return(:body => basic_auth_response_body)
53
52
 
54
53
  expect(
55
54
  subject.load(
@@ -6,6 +6,6 @@ describe Foundry::TemplateEngines::ERB do
6
6
  end
7
7
 
8
8
  it 'will raise an error if evaluation of an ERB template fails' do
9
- expect { subject.evaluate('<%= 1/0 %>') }.to raise_error
9
+ expect { subject.evaluate('<%= 1/0 %>') }.to raise_error ZeroDivisionError
10
10
  end
11
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foundry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan W. Zaleski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-08 00:00:00.000000000 Z
11
+ date: 2017-05-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.8'
19
+ version: '2.0'
20
20
  type: :runtime
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.8'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,42 +58,42 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '10.4'
61
+ version: '12.0'
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: '10.4'
68
+ version: '12.0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.1'
75
+ version: '3.0'
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: '3.1'
82
+ version: '3.0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: webmock
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.20'
89
+ version: '3.0'
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: '1.20'
96
+ version: '3.0'
97
97
  description: |2
98
98
  Let's face it, there are a number of problems when application/environment
99
99
  configuration logic is too tightly coupled with the configuration-data itself.
@@ -153,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
153
  version: '0'
154
154
  requirements: []
155
155
  rubyforge_project:
156
- rubygems_version: 2.4.5
156
+ rubygems_version: 2.6.10
157
157
  signing_key:
158
158
  specification_version: 4
159
159
  summary: An application configuration gem that aims to keep it simple