ruby-configurable 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 1.0.1 / 2011-05-06
2
+
3
+ * 2 bugfixes
4
+
5
+ * to_args now returns a Hash with symbols as keys. This lets you pass
6
+ your configuration directly to methods that expect option-style hash
7
+ arguments.
8
+
9
+ * to_args now excludes nil values from the resulting hash.
10
+
1
11
  === 1.0.0 / 2011-05-03
2
12
 
3
13
  * 1 major enhancement
data/README.txt CHANGED
@@ -40,51 +40,68 @@ Lets you make your Ruby class configurable with a simple mixin.
40
40
 
41
41
  == SYNOPSIS:
42
42
 
43
- require 'configurable'
44
- class Doodad
45
- include Configurable
43
+ require 'configurable'
44
+ class Doodad
45
+ include Configurable
46
46
 
47
- # Declare the allowed options and their default values
48
- configurable_options :foo => 'default',
49
- :bar => {:quux => 42, :wibble => nil},
50
- :baz => nil
51
- end
47
+ # Declare the allowed options and their default values
48
+ configurable_options :foo => 'default',
49
+ :bar => {:quux => 42, :wibble => nil},
50
+ :baz => nil
51
+ end
52
52
 
53
- Doodad::Config # => a ConfigStruct::Struct
54
- Doodad::Config::Bar # => another ConfigStruct::Struct
53
+ Doodad::Config # => a ConfigStruct::Struct
54
+ Doodad::Config::Bar # => another ConfigStruct::Struct
55
55
 
56
- Doodad.default_config # => #<struct Doodad::Config
57
- # bar=#<struct Doodad::Config::Bar
58
- # quux=42, wibble=nil>,
59
- # baz=nil,
60
- # foo="default">
56
+ Doodad.default_config # => #<struct Doodad::Config
57
+ # bar=#<struct Doodad::Config::Bar
58
+ # quux=42, wibble=nil>,
59
+ # baz=nil,
60
+ # foo="default">
61
61
 
62
- Doodad.config # => a (deep) copy of default_config,
63
- # ready for use
62
+ Doodad.config # => a (deep) copy of default_config,
63
+ # ready for use
64
64
 
65
- Doodad.config.replace( # replaces config with passed values
66
- :foo => 'mine',
67
- :bar => {:quux => 9})
65
+ Doodad.config.replace( # replaces config with passed values
66
+ :foo => 'mine',
67
+ :bar => {:quux => 9})
68
68
 
69
- Doodad.config.replace( # loads config from a YAML file
70
- YAML.load('config.yml'))
69
+ Doodad.config.update( # loads config from a YAML file
70
+ YAML.load('config.yml'))
71
71
 
72
72
  See the documentation on Configurable for an overview and links to more
73
73
  specifics.
74
74
 
75
+ === Using with Rails
76
+
77
+ If you want to make a Rails class configurable, you'll need some special
78
+ mojo to reconfigure the class when it gets reloaded in development mode.
79
+ You can do this with Rails.application.config.to_prepare. For example,
80
+ to have your class configuration reloaded from a YAML file, create an
81
+ initializer like so:
82
+
83
+ Rails.application.config.to_prepare do
84
+ begin
85
+ Doodad.config.update(
86
+ YAML.load_file(File.join(Rails.root, 'config', 'doodad.yml')) || {})
87
+ rescue Errno::ENOENT
88
+ # handle missing config file
89
+ end
90
+ end
91
+
75
92
  == REQUIREMENTS:
76
93
 
77
94
  * Ruby
78
95
 
79
96
  == INSTALL:
80
97
 
81
- $ gem install configurable
98
+ $ gem install ruby-configurable
82
99
 
83
100
  == DEVELOPERS:
84
101
 
85
102
  After checking out the source, run:
86
103
 
87
- $ rake newb
104
+ $ rake newb
88
105
 
89
106
  This task will install any missing dependencies, run the tests/specs,
90
107
  and generate the RDoc.
data/lib/configurable.rb CHANGED
@@ -30,7 +30,7 @@ require 'configurable/core_ext/inflections'
30
30
  # Doodad.config.one # => 1
31
31
  #
32
32
  module Configurable
33
- VERSION = '1.0.0' #:nodoc:
33
+ VERSION = '1.0.1' #:nodoc:
34
34
 
35
35
  def self.included(klass) #:nodoc:
36
36
  klass.extend Macros
@@ -116,11 +116,12 @@ module ConfigStruct
116
116
  #
117
117
  def to_hash
118
118
  members.inject({}) do |hsh, k|
119
+ v = self[k]
119
120
  hsh.tap do |h|
120
- h[k] = if self[k].is_a? Struct
121
- self[k].to_hash
121
+ h[k] = if v.is_a? Struct
122
+ v.to_hash
122
123
  else
123
- self[k]
124
+ v
124
125
  end
125
126
  end
126
127
  end
@@ -129,8 +130,19 @@ module ConfigStruct
129
130
  # Puts config values into an array suitable for expanding into a
130
131
  # parameter list. This is for convenience in recursive traversals of
131
132
  # a struct instance.
132
- def to_args
133
- self.to_hash.to_args
133
+ def to_args(box = true)
134
+ args = each_pair.inject({}) do |hsh, pair|
135
+ k, v = pair
136
+ hsh.tap do |h|
137
+ next if v.nil?
138
+ h[k.to_sym] = if v.is_a? Struct
139
+ v.to_args(false)
140
+ else
141
+ v
142
+ end
143
+ end
144
+ end
145
+ box ? args.to_args : args
134
146
  end
135
147
 
136
148
 
@@ -22,7 +22,7 @@ class Array
22
22
 
23
23
  # Returns the array in a form suitable for expanding into a parameter
24
24
  # list, that is, just the array itself.
25
- def to_args
25
+ def to_args(box = true)
26
26
  self
27
27
  end
28
28
  end
@@ -39,11 +39,27 @@ class Hash
39
39
  end
40
40
  end
41
41
 
42
+ # needed for to_args
43
+ unless {}.respond_to? :symbolize_keys!
44
+ # Destructively convert all keys to symbols, as long as they respond
45
+ # to +to_sym+.
46
+ def symbolize_keys!
47
+ keys.each do |key|
48
+ self[(key.to_sym rescue key) || key] = delete(key)
49
+ end
50
+ self
51
+ end
52
+
53
+ def symbolize_keys
54
+ dup.symbolize_keys!
55
+ end
56
+ end
57
+
42
58
  # Puts the hash into an array suitable for expanding into a parameter
43
59
  # list, such that it will be interpreted as keyword parameters if the
44
60
  # method you're calling expects that.
45
- def to_args
46
- [self]
61
+ def to_args(box = true)
62
+ args = self.symbolize_keys
63
+ box ? [args] : args
47
64
  end
48
65
  end
49
-
@@ -27,6 +27,26 @@ describe ConfigStruct::Struct do
27
27
  assert_equal 42, inst.to_hash['a']
28
28
  end
29
29
 
30
+ describe 'to_args' do
31
+ before do
32
+ @inst = @struct.new(42, 'foobar')
33
+ @args = @inst.to_args
34
+ end
35
+
36
+ it 'should convert to option args' do
37
+ # should be a hash wrapped in an array
38
+ assert_respond_to @args, :[]
39
+ assert_respond_to @args.first, :keys
40
+ assert_respond_to @args.first, :to_hash
41
+ end
42
+
43
+ it 'should have symbol keys' do
44
+ for key in @args.first.keys
45
+ assert_kind_of Symbol, key
46
+ end
47
+ end
48
+ end
49
+
30
50
  describe 'replace' do
31
51
  before do
32
52
  @inst = @struct.new(5, 3)
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-configurable
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 0
9
- - 0
10
- version: 1.0.0
9
+ - 1
10
+ version: 1.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kevin R. Bullock
@@ -15,7 +15,8 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-05 00:00:00 Z
18
+ date: 2011-05-06 00:00:00 -05:00
19
+ default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rubyforge
@@ -74,6 +75,7 @@ files:
74
75
  - lib/configurable/core_ext/inflections.rb
75
76
  - test/test_config_struct.rb
76
77
  - test/test_configurable.rb
78
+ has_rdoc: true
77
79
  homepage: http://bitbucket.org/krbullock/configurable
78
80
  licenses: []
79
81
 
@@ -104,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
106
  requirements: []
105
107
 
106
108
  rubyforge_project: handtools
107
- rubygems_version: 1.7.2
109
+ rubygems_version: 1.6.1
108
110
  signing_key:
109
111
  specification_version: 3
110
112
  summary: Lets you make your Ruby class configurable with a simple mixin.