figleaf 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,7 +15,6 @@
15
15
  /spec/tmp/*
16
16
  /tmp/*
17
17
  /vendor/bundle
18
- Gemfile.lock
19
18
  InstalledFiles
20
19
  _yardoc
21
20
  capybara-*.html
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ ---
2
+ language: ruby
3
+ bundler_args:
4
+ rvm:
5
+ - 1.9.2
6
+ - 1.9.3
7
+ - jruby-19mode
8
+ - jruby-head
9
+ - ruby-head
10
+ - rbx-19mode
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  source :rubygems
2
2
 
3
3
  gemspec
4
+ gem 'hashie', git: 'https://github.com/intridea/hashie.git'
data/Gemfile.lock ADDED
@@ -0,0 +1,48 @@
1
+ GIT
2
+ remote: https://github.com/intridea/hashie.git
3
+ revision: 8dd0fec950c33373c5c954d7ac72df4724334b12
4
+ specs:
5
+ hashie (2.0.0.beta)
6
+
7
+ PATH
8
+ remote: .
9
+ specs:
10
+ figleaf (0.0.2)
11
+ activesupport
12
+ hashie
13
+
14
+ GEM
15
+ remote: http://rubygems.org/
16
+ specs:
17
+ activesupport (3.2.8)
18
+ i18n (~> 0.6)
19
+ multi_json (~> 1.0)
20
+ coderay (1.0.7)
21
+ diff-lcs (1.1.3)
22
+ i18n (0.6.0)
23
+ method_source (0.8)
24
+ multi_json (1.3.6)
25
+ pry (0.9.10)
26
+ coderay (~> 1.0.5)
27
+ method_source (~> 0.8)
28
+ slop (~> 3.3.1)
29
+ rake (0.9.2.2)
30
+ rspec (2.11.0)
31
+ rspec-core (~> 2.11.0)
32
+ rspec-expectations (~> 2.11.0)
33
+ rspec-mocks (~> 2.11.0)
34
+ rspec-core (2.11.1)
35
+ rspec-expectations (2.11.2)
36
+ diff-lcs (~> 1.1.3)
37
+ rspec-mocks (2.11.2)
38
+ slop (3.3.2)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ figleaf!
45
+ hashie!
46
+ pry
47
+ rake
48
+ rspec
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Settings
1
+ # Figleaf
2
+ [![Build Status](https://secure.travis-ci.org/challengepost/figleaf.png?branch=master)](http://travis-ci.org/challengepost/figleaf)
3
+
2
4
 
3
5
  YAML based DRY settings manager.
4
6
 
@@ -10,7 +12,7 @@ and include in our applications.
10
12
 
11
13
  Add this line to your application's Gemfile:
12
14
 
13
- gem 'settings'
15
+ gem 'figleaf'
14
16
 
15
17
  And then execute:
16
18
 
@@ -18,14 +20,14 @@ And then execute:
18
20
 
19
21
  Or install it yourself as:
20
22
 
21
- $ gem install settings
23
+ $ gem install figleaf
22
24
 
23
25
  ## Usage
24
26
 
25
27
  In `application.rb`:
26
28
 
27
29
  ```
28
- Settings.configure_with_auto_define do |s|
30
+ Figleaf::Settings.configure_with_auto_define do |s|
29
31
  s.env = Rails.env
30
32
  s.some_awesome_flag = true
31
33
  s.load_settings
@@ -36,7 +38,7 @@ files.
36
38
 
37
39
  eg: In `production.rb`
38
40
  ```
39
- Settings.configure do |s|
41
+ Figleaf::Settings.configure do |s|
40
42
  s.some_awesome_flag = false
41
43
  end
42
44
  ```
@@ -57,11 +59,11 @@ production:
57
59
  foo: foo
58
60
  ```
59
61
 
60
- The Settings parser will create a namespace for your YAML file after the file
62
+ The Figleaf::Settings parser will create a namespace for your YAML file after the file
61
63
  name.
62
64
 
63
65
  Then, assuming that you named your YAML file `mysetting.yml`. you can just
64
- access `foo` as `Settings.mysetting["foo"]`. (Inspired by Rails' `database.yml`,
66
+ access `foo` as `Figleaf::Settings.mysetting["foo"]`. (Inspired by Rails' `database.yml`,
65
67
  of course.)
66
68
 
67
69
  ## Contributing
data/figleaf.gemspec CHANGED
@@ -15,9 +15,10 @@ Gem::Specification.new do |gem|
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Figleaf::VERSION
17
17
 
18
- %w(rake rspec).each do |g|
18
+ %w(rake rspec pry).each do |g|
19
19
  gem.add_development_dependency(g)
20
20
  end
21
21
 
22
22
  gem.add_dependency("activesupport")
23
+ gem.add_dependency("hashie")
23
24
  end
@@ -0,0 +1,54 @@
1
+ module Figleaf
2
+ module Configuration
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ class_attribute :auto_define
7
+ self.auto_define = false
8
+ end
9
+
10
+ module ClassMethods
11
+ def configure_with_auto_define
12
+ self.auto_define.tap do |cached_auto_define|
13
+ self.auto_define = true
14
+ yield self
15
+ self.auto_define = cached_auto_define
16
+ end
17
+ end
18
+
19
+ def configure
20
+ self.auto_define.tap do |cached_auto_define|
21
+ self.auto_define = false
22
+ yield self
23
+ self.auto_define = cached_auto_define
24
+ end
25
+ end
26
+
27
+ def override_with_local!(local_file)
28
+ #this file (i.e. test.local.rb) is an optional place to put settings
29
+ local_file.tap do |local_settings_path|
30
+ eval(IO.read(local_settings_path), binding) if File.exists?(local_settings_path)
31
+ end
32
+ end
33
+
34
+ def method_missing(method_name, *args)
35
+ if self.auto_define && method_name.to_s =~ /=$/ && args.length == 1
36
+ self.define_cattr_methods(method_name)
37
+ self.send(method_name, args.shift)
38
+ else
39
+ super
40
+ end
41
+ end
42
+
43
+ def define_cattr_methods(setter_name)
44
+ getter_name = setter_name.to_s.gsub('=','')
45
+
46
+ cattr_writer getter_name
47
+ define_singleton_method(getter_name) do
48
+ result = class_variable_get "@@#{getter_name}"
49
+ result.respond_to?(:call) ? result.call : result
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ module Figleaf
2
+ class Fighash < Hash
3
+ include Hashie::Extensions::IndifferentAccess
4
+ include Hashie::Extensions::MergeInitializer
5
+ include Hashie::Extensions::MethodAccess
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ require 'pry'
2
+ module Figleaf
3
+ module LoadSettings
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ # Load all files in config/settings and set their contents as first level
8
+ # citizen of Settings:
9
+ # config/settings/some_service.yml contains
10
+ # production:
11
+ # foo: bar
12
+ # --> Settings.some_service.foo = bar
13
+ def load_settings
14
+ Dir.glob(root.join('config', 'settings', '*.yml')).each do |file|
15
+ property_name = File.basename(file, '.yml')
16
+ property = YAML.load_file(file)[env]
17
+ property = use_hashie_if_hash(property)
18
+ self.configure_with_auto_define do |s|
19
+ s.send("#{property_name}=", property)
20
+ end
21
+ end
22
+ end
23
+
24
+ def root
25
+ return Rails.root if defined?(Rails)
26
+ Pathname.new('.')
27
+ end
28
+
29
+ def env
30
+ return Rails.env if defined?(Rails)
31
+ ENV['ENVIRONMENT']
32
+ end
33
+
34
+ def use_hashie_if_hash(property)
35
+ return Figleaf::Fighash.new(property) if property.is_a?(Hash)
36
+ property
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,78 +1,6 @@
1
- require 'yaml'
2
- require 'active_support/core_ext/class'
3
- require 'pathname'
4
-
5
1
  module Figleaf
6
2
  class Settings
7
- class_attribute :auto_define
8
- self.auto_define = false
9
-
10
- def self.configure_with_auto_define
11
- self.auto_define.tap do |cached_auto_define|
12
- self.auto_define = true
13
- yield self
14
- self.auto_define = cached_auto_define
15
- end
16
- end
17
-
18
- def self.configure
19
- self.auto_define.tap do |cached_auto_define|
20
- self.auto_define = false
21
- yield self
22
- self.auto_define = cached_auto_define
23
- end
24
- end
25
-
26
- def self.override_with_local!(local_file)
27
- #this file (i.e. test.local.rb) is an optional place to put settings
28
- local_file.tap do |local_settings_path|
29
- eval(IO.read(local_settings_path), binding) if File.exists?(local_settings_path)
30
- end
31
- end
32
-
33
- def self.method_missing(method_name, *args)
34
- if self.auto_define && method_name.to_s =~ /=$/ && args.length == 1
35
- self.define_cattr_methods(method_name)
36
- self.send(method_name, args.shift)
37
- else
38
- super
39
- end
40
- end
41
-
42
- def self.define_cattr_methods(setter_name)
43
- getter_name = setter_name.to_s.gsub('=','')
44
-
45
- cattr_writer getter_name
46
- define_singleton_method(getter_name) do
47
- result = class_variable_get "@@#{getter_name}"
48
- result.respond_to?(:call) ? result.call : result
49
- end
50
- end
51
-
52
- # Load all files in config/settings and set their contents as first level
53
- # citizen of Settings:
54
- # config/settings/some_service.yml contains
55
- # production:
56
- # foo: bar
57
- # --> Settings.some_service.foo = bar
58
- def self.load_settings
59
- Dir.glob(root.join('config', 'settings', '*.yml')).each do |file|
60
- property_name = File.basename(file, '.yml')
61
- property = YAML.load_file(file)[env]
62
- configure_with_auto_define do |s|
63
- s.send("#{property_name}=", property)
64
- end
65
- end
66
- end
67
-
68
- def self.root
69
- return Rails.root if defined?(Rails)
70
- Pathname.new('.')
71
- end
72
-
73
- def self.env
74
- return Rails.env if defined?(Rails)
75
- ENV['ENVIRONMENT']
76
- end
3
+ include Figleaf::Configuration
4
+ include Figleaf::LoadSettings
77
5
  end
78
6
  end
@@ -1,3 +1,3 @@
1
1
  module Figleaf
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
data/lib/figleaf.rb CHANGED
@@ -1,4 +1,13 @@
1
+ require 'active_support/concern'
2
+ require 'active_support/core_ext/class'
3
+ require 'hashie'
4
+ require 'pathname'
5
+ require 'yaml'
6
+
1
7
  module Figleaf
8
+ autoload :Fighash, 'figleaf/fighash'
9
+ autoload :Configuration, 'figleaf/configuration'
10
+ autoload :LoadSettings, 'figleaf/load_settings'
2
11
  autoload :Settings, 'figleaf/settings'
3
12
  autoload :VERSION, 'figleaf/version'
4
13
  end
@@ -79,14 +79,76 @@ describe Figleaf::Settings do
79
79
  end
80
80
  end
81
81
 
82
- describe "self.load_described_class" do
83
- it "should load google analytics" do
84
- Dir.should_receive(:glob).and_return(["config/described_class/some_service.yml"])
85
- described_class.should_receive(:env).and_return("test")
86
- YAML.should_receive(:load_file).and_return({"test" => "foo"})
82
+ describe "self.load_settings" do
83
+ let(:configuration) {
84
+ {
85
+ "test" => {
86
+ "foo" => "bar",
87
+ "bool_true" => true,
88
+ "bool_false" => false
89
+ }
90
+ }
91
+ }
92
+
93
+ before do
94
+ Dir.stub(:glob).and_return(["config/described_class/some_service.yml"])
95
+ described_class.stub(:env).and_return("test")
96
+ YAML.stub(:load_file).and_return(configuration)
97
+
98
+ described_class.load_settings
99
+ end
100
+
101
+ it "should load some service" do
102
+ described_class.some_service["foo"].should == "bar"
103
+ end
104
+
105
+ it "should load indifferently the key names" do
106
+ described_class.some_service["foo"].should == "bar"
107
+ described_class.some_service[:foo].should == "bar"
108
+ end
109
+
110
+ it "should create foo as a method" do
111
+ described_class.some_service.foo.should == "bar"
112
+ end
113
+
114
+ it "should create bool_true? and return true" do
115
+ described_class.some_service.bool_true?.should be_true
116
+ end
117
+
118
+ it "should create bool_false? and return false" do
119
+ described_class.some_service.bool_false?.should be_false
120
+ end
121
+
122
+ it "should work for arrays as well" do
123
+ YAML.stub(:load_file).and_return({ "test" => [1, 2] })
124
+ described_class.load_settings
125
+ described_class.some_service.should == [1, 2]
126
+ end
127
+
128
+ it "and for plain strings" do
129
+ YAML.stub(:load_file).and_return({ "test" => "Hello, World!" })
130
+ described_class.load_settings
131
+ described_class.some_service.should == "Hello, World!"
132
+ end
133
+
134
+ it "and for booleans (true)" do
135
+ YAML.stub(:load_file).and_return({ "test" => true })
87
136
  described_class.load_settings
88
- described_class.some_service.should == "foo"
137
+ described_class.some_service.should be_true
89
138
  end
139
+
140
+ it "and for booleans (false)" do
141
+ YAML.stub(:load_file).and_return({ "test" => false })
142
+ described_class.load_settings
143
+ described_class.some_service.should be_false
144
+ end
145
+
146
+ it "should raise exception when loading an undefined value" do
147
+ YAML.stub(:load_file).and_return({ "test" => {} })
148
+ described_class.load_settings
149
+ expect { described_class.some_service.blah }.to raise_error NoMethodError
150
+ end
151
+
90
152
  end
91
153
 
92
154
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: figleaf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-13 00:00:00.000000000 Z
12
+ date: 2012-08-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: activesupport
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +75,22 @@ dependencies:
59
75
  - - ! '>='
60
76
  - !ruby/object:Gem::Version
61
77
  version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: hashie
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
62
94
  description: YAML based DRY settings manager.
63
95
  email:
64
96
  - jcmuller@gmail.com
@@ -68,12 +100,17 @@ extra_rdoc_files: []
68
100
  files:
69
101
  - .gitignore
70
102
  - .rspec
103
+ - .travis.yml
71
104
  - Gemfile
105
+ - Gemfile.lock
72
106
  - LICENSE
73
107
  - README.md
74
108
  - Rakefile
75
109
  - figleaf.gemspec
76
110
  - lib/figleaf.rb
111
+ - lib/figleaf/configuration.rb
112
+ - lib/figleaf/fighash.rb
113
+ - lib/figleaf/load_settings.rb
77
114
  - lib/figleaf/settings.rb
78
115
  - lib/figleaf/version.rb
79
116
  - spec/settings_spec.rb
@@ -90,12 +127,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
127
  - - ! '>='
91
128
  - !ruby/object:Gem::Version
92
129
  version: '0'
130
+ segments:
131
+ - 0
132
+ hash: -1491263342896218815
93
133
  required_rubygems_version: !ruby/object:Gem::Requirement
94
134
  none: false
95
135
  requirements:
96
136
  - - ! '>='
97
137
  - !ruby/object:Gem::Version
98
138
  version: '0'
139
+ segments:
140
+ - 0
141
+ hash: -1491263342896218815
99
142
  requirements: []
100
143
  rubyforge_project:
101
144
  rubygems_version: 1.8.24