cjbottaro-app_config 1.0.0 → 1.0.1

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.
data/CHANGELOG ADDED
@@ -0,0 +1,8 @@
1
+ 10/03/2008
2
+ * recursively merge the configuration hashes
3
+
4
+ 07/01/2009
5
+ * Packaged as a gem (but still works as a Rails plugin).
6
+ * The app config object is now an instance of ApplicationConfiguration.
7
+ * NoMethodError raised if you try to access a config element that doesn't exist.
8
+ * ApplicationConfiguration#reload! to reread the config files and rebuild the app config object.
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :major: 1
3
2
  :minor: 0
4
- :patch: 0
3
+ :major: 1
4
+ :patch: 1
@@ -0,0 +1,56 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{app_config}
8
+ s.version = "1.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Christopher J Bottaro"]
12
+ s.date = %q{2009-08-27}
13
+ s.description = %q{Application level configuration that supports YAML config file, inheritance, ERB, and object member notation.}
14
+ s.email = %q{cjbottaro@alumni.cs.utexas.edu}
15
+ s.extra_rdoc_files = [
16
+ "README.rdoc"
17
+ ]
18
+ s.files = [
19
+ "CHANGELOG",
20
+ "README.rdoc",
21
+ "Rakefile",
22
+ "VERSION.yml",
23
+ "app_config.gemspec",
24
+ "init.rb",
25
+ "install.rb",
26
+ "lib/app_config.rb",
27
+ "lib/closed_struct.rb",
28
+ "tasks/app_config_tasks.rake",
29
+ "test/app_config.yml",
30
+ "test/app_config_test.rb",
31
+ "test/closed_struct_test.rb",
32
+ "test/development.yml",
33
+ "test/empty1.yml",
34
+ "test/empty2.yml",
35
+ "uninstall.rb"
36
+ ]
37
+ s.homepage = %q{http://github.com/cjbottaro/app_config}
38
+ s.rdoc_options = ["--charset=UTF-8"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = %q{1.3.3}
41
+ s.summary = %q{Application level configuration.}
42
+ s.test_files = [
43
+ "test/app_config_test.rb",
44
+ "test/closed_struct_test.rb"
45
+ ]
46
+
47
+ if s.respond_to? :specification_version then
48
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
52
+ else
53
+ end
54
+ else
55
+ end
56
+ end
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'app_config'
2
+
3
+ ::AppConfig = ApplicationConfiguration.new(RAILS_ROOT+"/config/app_config.yml",
4
+ RAILS_ROOT+"/config/environments/#{RAILS_ENV}.yml")
data/install.rb ADDED
@@ -0,0 +1 @@
1
+ # Install hook code here
data/lib/app_config.rb CHANGED
@@ -22,7 +22,7 @@ class ApplicationConfiguration
22
22
  conf1 = load_conf_file(@conf_path_1)
23
23
  conf2 = load_conf_file(@conf_path_2)
24
24
  conf = recursive_merge(conf1, conf2)
25
- @config = convert(conf)
25
+ @config = ClosedStruct.r_new(conf)
26
26
  end
27
27
 
28
28
  private
@@ -42,22 +42,6 @@ private
42
42
  end
43
43
  end
44
44
 
45
- # Recursively converts Hashes to ClosedStructs (including Hashes inside Arrays)
46
- def convert(h) #:nodoc:
47
- s = ClosedStruct.new(h.keys)
48
- h.each do |k, v|
49
- if v.instance_of?(Hash)
50
- s.send( (k+'=').to_sym, convert(v))
51
- elsif v.instance_of?(Array)
52
- converted_array = v.collect { |e| e.instance_of?(Hash) ? convert(e) : e }
53
- s.send( (k+'=').to_sym, converted_array)
54
- else
55
- s.send( (k+'=').to_sym, v)
56
- end
57
- end
58
- s
59
- end
60
-
61
45
  # Recursively merges hashes. h2 will overwrite h1.
62
46
  def recursive_merge(h1, h2) #:nodoc:
63
47
  h1.merge(h2){ |k, v1, v2| v2.kind_of?(Hash) ? recursive_merge(v1, v2) : v2 }
data/lib/closed_struct.rb CHANGED
@@ -1,13 +1,22 @@
1
1
  require 'ostruct'
2
2
 
3
- class ClosedStruct < OpenStruct # :nodoc:
3
+ # Like OpenStruct, but raises an exception if you try to access a member that wasn't specified in the initializer.
4
+ class ClosedStruct < OpenStruct
5
+
6
+ def self.r_new(hash)
7
+ closed_struct = ClosedStruct.new(hash)
8
+ closed_struct.send(:recursive_initialize)
9
+ closed_struct
10
+ end
4
11
 
5
12
  def initialize(*args)
6
- if args.length == 1
13
+ if args.length == 1 and args.first.kind_of?(Hash)
7
14
  super(args.first)
15
+ elsif args.length > 1 and args.all?{ |arg| [Symbol, String].include?(arg.class) }
16
+ args = args.inject({}){ |memo, arg| memo[arg.to_sym] = nil; memo }
17
+ super(args)
8
18
  else
9
- h = args.inject({}){ |memo, k| memo[k] = nil; memo }
10
- super(h)
19
+ raise ArgumentError, "invalid arguments: #{args.inspect}"
11
20
  end
12
21
  @closed = true
13
22
  end
@@ -36,4 +45,16 @@ class ClosedStruct < OpenStruct # :nodoc:
36
45
  @table.dup
37
46
  end
38
47
 
39
- end
48
+ private
49
+
50
+ def recursive_initialize
51
+ @table.each do |k, v|
52
+ if v.kind_of?(Hash)
53
+ @table[k] = ClosedStruct.r_new(v)
54
+ elsif v.kind_of?(Array)
55
+ @table[k] = v.collect{ |e| e.kind_of?(Hash) ? ClosedStruct.r_new(e) : e }
56
+ end
57
+ end
58
+ end
59
+
60
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :app_config do
3
+ # # Task goes here
4
+ # end
@@ -0,0 +1,33 @@
1
+ require 'test/unit'
2
+ require 'app_config'
3
+
4
+ class ClosedStructTest < Test::Unit::TestCase
5
+
6
+ def test_from_hash
7
+ s = ClosedStruct.new :a => "a", "b" => "b", :c => 123
8
+ assert_equal "a", s.a
9
+ assert_equal "b", s.b
10
+ assert_equal 123, s.c
11
+ assert_raise(NoMethodError){ s.d }
12
+ end
13
+
14
+ def test_from_array
15
+ s = ClosedStruct.new :a, :b, :c
16
+ s.b = "b"
17
+ assert_nil s.a
18
+ assert_equal "b", s.b
19
+ assert_nil s.c
20
+ assert_raise(NoMethodError){ s.d }
21
+ end
22
+
23
+ def test_nested_hash
24
+ s = ClosedStruct.r_new :a => :a, :b => { :c => :c }, :d => :d
25
+ assert_equal :c, s.b.c
26
+ end
27
+
28
+ def test_nested_hashes_in_array
29
+ s = ClosedStruct.r_new :a => :a, :b => [ {:c => :c }, { :d => :d } ], :e => :e
30
+ assert_equal :c, s.b[0].c
31
+ end
32
+
33
+ end
data/uninstall.rb ADDED
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cjbottaro-app_config
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christopher J Bottaro
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-01 00:00:00 -07:00
12
+ date: 2009-08-27 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -22,19 +22,25 @@ extensions: []
22
22
  extra_rdoc_files:
23
23
  - README.rdoc
24
24
  files:
25
+ - CHANGELOG
25
26
  - README.rdoc
26
27
  - Rakefile
27
28
  - VERSION.yml
29
+ - app_config.gemspec
30
+ - init.rb
31
+ - install.rb
28
32
  - lib/app_config.rb
29
33
  - lib/closed_struct.rb
34
+ - tasks/app_config_tasks.rake
30
35
  - test/app_config.yml
31
36
  - test/app_config_test.rb
37
+ - test/closed_struct_test.rb
32
38
  - test/development.yml
33
39
  - test/empty1.yml
34
40
  - test/empty2.yml
35
- has_rdoc: true
41
+ - uninstall.rb
42
+ has_rdoc: false
36
43
  homepage: http://github.com/cjbottaro/app_config
37
- licenses:
38
44
  post_install_message:
39
45
  rdoc_options:
40
46
  - --charset=UTF-8
@@ -55,9 +61,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
61
  requirements: []
56
62
 
57
63
  rubyforge_project:
58
- rubygems_version: 1.3.5
64
+ rubygems_version: 1.2.0
59
65
  signing_key:
60
66
  specification_version: 3
61
67
  summary: Application level configuration.
62
68
  test_files:
63
69
  - test/app_config_test.rb
70
+ - test/closed_struct_test.rb