autoconfig 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.
Files changed (3) hide show
  1. data/README.markdown +8 -5
  2. data/lib/autoconfig.rb +21 -79
  3. metadata +32 -42
@@ -1,5 +1,5 @@
1
1
  !!!plain
2
-
2
+ _ ____
3
3
  | | / __/
4
4
  __ _ _ _| |_ ___ ___ ___ _ __ | |_ _ __ _
5
5
  / _` | | | | __|/ _ \ / __|/ _ \| '_ \| _| |/ _` |
@@ -10,9 +10,11 @@
10
10
 
11
11
  ## What is it
12
12
 
13
- Autoconfig in an automated way to create flexible configuration structures representing your YAML configuration
13
+ `autoconfig` in an automated way to create flexible configuration structures.
14
+
15
+ Since version 2.0.0 `autoconfig` relies on [heirarchical_config](https://rubygems.org/gems/hierarchical_config) for the strategy for configuring an application in a static, declarative, robust, and intuitive way.
14
16
 
15
- ## How does it work
17
+ ## Usage
16
18
 
17
19
  1. require 'autoconfig'
18
20
  2. profit!
@@ -30,8 +32,8 @@ Lets say you have application.yml in your config folder:
30
32
  web:
31
33
  hostname: "the.production.com"
32
34
 
33
- After requiring 'autoconfig' you should expect ApplicationConfig structure that will contain all the information. In production environment
34
- ApplicationConfig.web.hostname call will return "the.production.com".
35
+ After requiring 'autoconfig' you should expect `ApplicationConfig` structure that will contain all the information.
36
+ In production environment `ApplicationConfig.web.hostname` call will return `the.production.com`.
35
37
 
36
38
  ## Advance Example
37
39
 
@@ -66,6 +68,7 @@ Check it out under test/config/one
66
68
  three: five
67
69
 
68
70
  Autoconfig can support:
71
+
69
72
  * specifying which keys are required via !REQUIRED yaml type
70
73
  * environment specific defaults shared across some environments
71
74
  * deep nested structures
@@ -1,13 +1,6 @@
1
- require 'ostruct'
2
- require 'yaml'
3
- require 'erb'
4
- require 'set'
5
-
1
+ require 'hierarchical_config'
6
2
 
7
3
  module AutoConfig
8
- REQUIRED = :REQUIRED
9
- YAML.add_builtin_type( 'REQUIRED' ){ REQUIRED }
10
-
11
4
  module StringCamelize
12
5
  # Taken straight from active support inflector.rb, line 161
13
6
  def camelize(first_letter_in_uppercase = true)
@@ -20,23 +13,6 @@ module AutoConfig
20
13
  end
21
14
  String.send(:include, StringCamelize) unless String.instance_methods.include?("camelize")
22
15
 
23
- class OpenStruct < ::OpenStruct
24
- def method_missing(mid, *args) # :nodoc:
25
- mname = mid.id2name
26
- len = args.length
27
- if mname.chomp!('=')
28
- if len != 1
29
- raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
30
- end
31
- modifiable[new_ostruct_member(mname)] = args[0]
32
- elsif len == 0 && @table.key?( mid )
33
- @table[mid]
34
- else
35
- raise NoMethodError, "undefined method `#{mname}' for #{self}", caller(1)
36
- end
37
- end
38
- end
39
-
40
16
  class Base
41
17
  class << self
42
18
  def root
@@ -45,11 +21,11 @@ module AutoConfig
45
21
  end
46
22
 
47
23
  def pattern
48
- ENV['AUTOCONFIG_PATTERN'] || 'config/*.yml'
24
+ ENV['AUTOCONFIG_PATTERN'] || '*.yml'
49
25
  end
50
26
 
51
27
  def path
52
- ENV['AUTOCONFIG_PATH'] || File.expand_path(pattern, root)
28
+ ENV['AUTOCONFIG_PATH'] || File.expand_path('config',root)
53
29
  end
54
30
 
55
31
  def environment
@@ -65,32 +41,26 @@ module AutoConfig
65
41
  Regexp.new(names)
66
42
  end
67
43
 
68
- def reload
44
+ def load(name)
45
+ HierarchicalConfig.load_config( name, path, environment )
46
+ end
47
+
48
+
49
+ def autoload
69
50
  wipe
70
- files = Dir.glob(path)
51
+ files = Dir.glob(File.join(path,pattern))
71
52
  begin
72
53
  old_verbose, $VERBOSE = $VERBOSE, nil
73
54
 
74
55
  files.each do |file|
75
- name = File.basename(file, '.yml')
76
- next if name.match(ignored_filenames)
56
+ name = File.basename(file, pattern.gsub('*',''))
57
+ next if name.match(ignored_filenames) || name.match(/-overrides/)
77
58
 
78
- constant_name = "#{name}Config".gsub('-','_').camelize
59
+ constant_name = "#{name}Config".gsub('-','_').camelize.intern
79
60
  begin
80
- yaml_config = YAML::load(ERB.new(IO.read(file)).result)
81
-
82
- @ordered_stanza_labels[constant_name] = []
83
- @ordered_stanza_labels[constant_name] << 'defaults' if yaml_config.key? 'defaults'
84
- @ordered_stanza_labels[constant_name] += yaml_config.keys.grep(/^defaults\[.*#{environment}/).sort_by{ |a| a.count(',') }
85
- @ordered_stanza_labels[constant_name] << environment if yaml_config.key? environment
86
-
87
- config = @ordered_stanza_labels[constant_name].inject({}) do |acc, label|
88
- deep_merge(acc,yaml_config[label])
89
- end
90
-
91
- ensure_requirements_met_and_ostructify!(config, constant_name )
92
-
93
- Object::const_set(constant_name.intern, OpenStruct.new(config))
61
+ Object::const_set(constant_name, load(name))
62
+ @autoset_constants ||= Set.new
63
+ @autoset_constants << constant_name
94
64
  rescue StandardError => e
95
65
  @errors << <<-ERROR
96
66
  Error reading file #{file} into #{constant_name}.
@@ -108,46 +78,18 @@ module AutoConfig
108
78
  end
109
79
  end
110
80
 
81
+ alias :reload :autoload
82
+
111
83
  private
84
+
112
85
  # unsets created constants
113
86
  def wipe
114
- unless @ordered_stanza_labels.nil?
115
- @ordered_stanza_labels.keys.each{|const| Object::const_set(const.intern, nil) }
87
+ unless @autoset_constants.nil?
88
+ @autoset_constants.each{|const| Object::const_set(const, nil) }
116
89
  end
117
- @ordered_stanza_labels = {}
118
90
  @errors = Set.new
119
91
  end
120
92
 
121
- # merges two hashes with nested hashes if present
122
- def deep_merge( hash1, hash2 )
123
- hash1 = hash1.dup
124
- ( hash1.keys + hash2.keys ).each do | key |
125
- if hash1.key?( key ) && hash2.key?( key ) &&
126
- hash1[key].is_a?( Hash ) && hash2[key].is_a?( Hash )
127
- hash1[key] = deep_merge( hash1[key], hash2[key] )
128
- elsif hash2.key?( key )
129
- hash1[key] = hash2[key]
130
- end
131
- end
132
- hash1
133
- end
134
- # Mutator method that does two things:
135
- # * checks if any of the keys were required and not set. Upon finding
136
- # it adds key to the error set
137
- # * recursively sets open structs for deep hashes
138
- def ensure_requirements_met_and_ostructify!( hash, path )
139
- hash.each do | key, value |
140
- case
141
- when value.respond_to?( :keys ) && value.respond_to?( :values )
142
- ensure_requirements_met_and_ostructify!( value, path + '.' + key )
143
- when value == REQUIRED
144
- @errors << "#{path}.#{key} is REQUIRED"
145
- end
146
- hash[key] = OpenStruct.new(value) if value.is_a?( Hash )
147
- end
148
- end
149
93
  end
150
94
  end
151
95
  end
152
-
153
- AutoConfig::Base.reload
metadata CHANGED
@@ -1,69 +1,59 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: autoconfig
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: '2.0'
5
5
  prerelease:
6
- segments:
7
- - 1
8
- - 1
9
- - 0
10
- version: 1.1.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - tjbladez
14
9
  - timgaleckas
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2011-10-12 00:00:00 -05:00
20
- default_executable:
21
- dependencies: []
22
-
23
- description: Automated way to create flexible configuration structures representing your YAML configuration
13
+ date: 2011-10-12 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hierarchical_config
17
+ requirement: &70155900128960 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70155900128960
26
+ description: Automated way to create flexible configuration structures representing
27
+ your YAML configuration
24
28
  email: nick@tjbladez.com, tim@galeckas.com
25
29
  executables: []
26
-
27
30
  extensions: []
28
-
29
31
  extra_rdoc_files: []
30
-
31
- files:
32
+ files:
32
33
  - lib/autoconfig.rb
33
34
  - README.markdown
34
- has_rdoc: false
35
35
  homepage: http://github.com/tjbladez/autoconfig
36
36
  licenses: []
37
-
38
37
  post_install_message: Forget about loading your yaml configuration
39
38
  rdoc_options: []
40
-
41
- require_paths:
39
+ require_paths:
42
40
  - lib
43
- required_ruby_version: !ruby/object:Gem::Requirement
41
+ required_ruby_version: !ruby/object:Gem::Requirement
44
42
  none: false
45
- requirements:
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- hash: 3
49
- segments:
50
- - 0
51
- version: "0"
52
- required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
48
  none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
61
53
  requirements: []
62
-
63
54
  rubyforge_project:
64
- rubygems_version: 1.6.2
55
+ rubygems_version: 1.8.10
65
56
  signing_key:
66
57
  specification_version: 3
67
58
  summary: Automagically creates Config structures from your config/*.yml files
68
59
  test_files: []
69
-