cushion_defaults 0.5.1 → 0.5.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb9a0010fb2ee9d019f6fc9552354d422289810f
4
- data.tar.gz: e34bed7551afc9746f0195766b50d2d17c02f8f5
3
+ metadata.gz: bca05c80623f43fc5f8d61f016ffb6ee18f832cb
4
+ data.tar.gz: daa36bc9f2da343a5e4699bd42e6c415da8e80cf
5
5
  SHA512:
6
- metadata.gz: a7cfe9bf2ef8919910408925c54ab14ae43b4efe50ebe3212a0e90fd850af8d6d94523d8b512d9093ea5905654d708ccb59ed44e57a3d69cf9c0fab67b84bee7
7
- data.tar.gz: f6701c502a954b8c3a266366135377119c515053e8342d36ebc124fe503169a40795982b2a07069a0b002d85538713d52ad1848c0ffd784702c9b4c1aabbbbeb
6
+ metadata.gz: 46c86103b998e49862173cc1456e1c14b6615426e9c1816ac50fa9e964b8386c3b13e27fb403cd597cfd2b65df6e6fbdb7bb556e86de0473ca2a91f7ba172cb5
7
+ data.tar.gz: 8b149e6f6e9d07047c9768348263ebd90acd1ad7242d2bd3368157accadb26e709ec4c5bf9e5daaf8e9c28df6a4c27a0e73f4856a3210668a45cc35890266f89
data/CHANGELOG.md CHANGED
@@ -1,74 +1,88 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.0.x
3
+ ## 0.5.x
4
4
 
5
- - 0.0.0: Initial version.
6
- - 0.0.1
7
- - Include MIT License.
8
- - Specify GitHub homepage.
9
- - 0.0.2
10
- - Improve `cushion_reader` speed by approx. 15%.
11
- - Specify Ruby version >= 2.0.0.
12
- - 0.0.3
13
- - Fix various bugs related to YAML config loading.
14
- - Improve examples.
5
+ - 0.5.2: PERFORMANCE
6
+ - Another 40% shaved off `cushion_reader` execution times. (In total, execution speed is ~180% faster than v. 0.0.0.)
7
+ - Between roughly 18% and 75% shaved off `cushion_writer` (depending on input).
15
8
 
16
- ## 0.1.x
9
+ - 0.5.1
10
+ - DEPENDENCY: Support now added for Ruby >= 1.9.3
11
+ - CONFIGURATION: Default log level now WARN (was INFO)
12
+ - BUGFIX: Remove unnecessary warning on adding `bang_readers`
13
+ - PERFORMANCE: Moderate performance gains (approx. 20%) on `cushion_reader`
17
14
 
18
- - 0.1.0
19
- - NEW FEATURE: Logging
20
- - Add `config.record_in_log` (boolean), `config.log_lvl (int)`, and `config.logger` (Logger or similar) options.
21
- - Add logging throughout the module at various levels.
22
- - Logging enabled by default at info level.
23
- - Improve performance of `cushion_reader` by approx. 115%.
24
- - 0.1.1
25
- - Greatly improve and expand documentation.
26
- - Switch from rdoc to Yard
15
+ - 0.5.0
16
+ - NEW FEATURE: Bang Readers
17
+ - When called, a bang reader (e.g., `var!`) crystallizes `var`, if not set, to the default value for `var`.
18
+ - Especially useful for permanently fixing the value of a proc cushion.
19
+ - Key method: `ClassMethods#bang_reader`
20
+ - NEW OPTION: bang_things_up
21
+ - If true, bang readers will automatically be set up every time a cushion_reader is created.
22
+ - Default: true
23
+ - BUGFIX: fix interaction between procs and #crystallize_defaults
24
+ - DOCUMENTATION: Expand README.md
25
+
26
+ ## 0.4.x
27
+
28
+ - 0.4.0 - NEW FEATURE: Proc Cushions
29
+ - You can now set a default to a proc that will be evaluated whenever an instance variable is absent.
30
+ - For more information, see "Proc Cushions" in README.md.
31
+
32
+ ## 0.3.x
33
+
34
+ - 0.3.1: BUGFIX: Corrected fatal error in #freeze_defaults, #deep_freeze_defaults, and #thaw_defaults
35
+
36
+ - 0.3.0 - NEW FEATURE: Freezing and thawing defaults.
37
+ - You may wish to prevent a default from further modification, either permanently or temporarily. This can prevent silly mistakes that are otherwise difficult to track down. CushionDefaults now makes this possible via a freezing and thawing API.
38
+ - For more information, see especially:
39
+ - ClassMethods#freeze_default
40
+ - ClassMethods#deep_freeze_default
41
+ - ClassMethods#thaw_default
27
42
 
28
43
  ## 0.2.x
29
44
 
30
45
  - 0.2.0
31
46
  - Place Configuration within the CushionDefaults module.
47
+
32
48
  - IMPROVEMENT: `cushion_defaults.gemspec`
33
49
  - Clarify and expand `cushion_defaults.gemspec`. Was insufficient before.
34
50
  - Now specifies development dependencies.
35
51
  - Add Gemfile for bundler
52
+
36
53
  - IMPROVEMENT: Testing
37
54
  - `test/` renamed to `spec/`
38
55
  - Add `.rspec` and `spec/spec_helper.rb`
56
+
39
57
  - DOCUMENTATION: Numerous expansions
40
58
 
41
- ## 0.3.x
59
+ ## 0.1.x
42
60
 
43
- - 0.3.0 - NEW FEATURE: Freezing and thawing defaults.
44
- - You may wish to prevent a default from further modification, either permanently or temporarily. This can prevent silly mistakes that are otherwise difficult to track down. CushionDefaults now makes this possible via a freezing and thawing API.
45
- - For more information, see especially:
46
- - ClassMethods#freeze_default
47
- - ClassMethods#deep_freeze_default
48
- - ClassMethods#thaw_default
49
- - 0.3.1: BUGFIX: Corrected fatal error in #freeze_defaults, #deep_freeze_defaults, and #thaw_defaults
61
+ - 0.1.1
62
+ - Greatly improve and expand documentation.
63
+ - Switch from rdoc to Yard
50
64
 
51
- ## 0.4.x
65
+ - 0.1.0
66
+ - NEW FEATURE: Logging
67
+ - Add `config.record_in_log` (boolean), `config.log_lvl (int)`, and `config.logger` (Logger or similar) options.
68
+ - Add logging throughout the module at various levels.
69
+ - Logging enabled by default at info level.
52
70
 
53
- -0.4.0 - NEW FEATURE: Proc Cushions
54
- - You can now set a default to a proc that will be evaluated whenever an instance variable is absent.
55
- - For more information, see "Proc Cushions" in README.md.
71
+ - Improve performance of `cushion_reader` by approx. 115%.
56
72
 
57
- ## 0.5.x
73
+ ## 0.0.x
58
74
 
59
- -0.5.0
60
- - NEW FEATURE: Bang Readers
61
- - When called, a bang reader (e.g., +var!+) crystallizes +var+, if not set, to the default value for +var+.
62
- - Especially useful for permanently fixing the value of a proc cushion.
63
- - Key method: +ClassMethods#bang_the_cushion+
64
- - NEW OPTION: bang_things_up
65
- - If true, bang readers will automatically be set up every time a cushion_reader is created.
66
- - Default: true
67
- - BUGFIX: fix interaction between procs and #crystallize_defaults
68
- - DOCUMENTATION: Expand README.md
75
+ - 0.0.3
76
+ - Fix various bugs related to YAML config loading.
77
+ - Improve examples.
69
78
 
70
- -0.5.1
71
- - DEPENDENCY: Support now added for Ruby >= 1.9.3
72
- - CONFIGURATION: Default log level now WARN (was INFO)
73
- - BUGFIX: Remove unnecessary warning on adding +bang_readers+
74
- - PERFORMANCE: Moderate performance gains (approx. 20%) on +cushion_reader+
79
+ - 0.0.2
80
+ - Improve `cushion_reader` speed by approx. 15%.
81
+ - Specify Ruby version >= 2.0.0.
82
+
83
+ - 0.0.1
84
+ - Include MIT License.
85
+ - Specify GitHub homepage.
86
+
87
+
88
+ - 0.0.0: Initial version.
data/README.md CHANGED
@@ -27,32 +27,50 @@ I try to keep all of this up-to-date, but the latest information can always be f
27
27
  ## Give Me a Quick Example
28
28
 
29
29
  ```ruby
30
+ require 'cushion_defaults' # This will be assumed henceforth.
30
31
  require 'color'
31
32
 
32
33
  class Person
33
34
  include CushionDefaults
35
+
36
+ # Set the cushion or default value for @favorite_color to the static value 'blue'
34
37
  self.defaults[:favorite_color] = 'blue'
35
- self.defaults[:favorite_shade_of_gray] = do |instance|
38
+
39
+ # Set the cushion for @favorite_shade_of_gray to the following proc.
40
+ # As long as @favorite_shade_of_gray is not set, this proc will be evaluated at each call to #favorite_shade_of_gray.
41
+ # If we wanted to fix or crystallize the value, we could call the bang version #favorite_shade_of_gray!
42
+ self.defaults[:favorite_shade_of_gray] = proc do |instance|
36
43
  Color::RGB.by_name(instance.favorite_color).to_grayscale.to_rgb
37
44
  end
45
+
46
+ # #cushion sets up a cushion_reader and cushion_writer for each of the symbols passed in
38
47
  cushion :favorite_color, :favorite_shade_of_gray
39
48
  end
40
49
 
41
50
  ryan, julia = Person.new, Person.new
51
+
42
52
  ryan.favorite_color = 'blue'
43
53
 
44
- ryan.favorite_shade_of_gray # RGB [#808080], computed from favorite_color == 'blue'
45
- ryan.favorite_shade_of_gray = Color::RGB.by_name('silver')
54
+ # This value is computed by the proc cushion defined above, since ryan's @favorite_shade_of_gray isn't defined
55
+ ryan.favorite_shade_of_gray # RGB [#808080]
56
+
57
+ ryan.favorite_shade_of_gray = Color::RGB.by_name('silver') # RGB [#cccccc]
58
+
59
+ # Since ryan's @favorite_shade_of_gray is defined now, the proc isn't called
46
60
  ryan.favorite_shade_of_gray # RGB [#cccccc]
47
61
 
48
62
  ryan.favorite_color # 'blue'
49
63
  ryan.has_specified?(:favorite_color) # true
50
64
 
51
65
  julia.favorite_color # 'blue'
66
+
67
+ # When we call julia.favorite_color, we're only getting the default color
52
68
  julia.has_specified?(:favorite_color) # false
53
69
 
70
+ # Now we set the default value for @favorite_color to a new value.
54
71
  Person.defaults[:favorite_color] = 'green'
55
72
 
73
+ # ryan has a custom favorite color, so it doesn't affect him, but julia returns 'green' now
56
74
  ryan.favorite_color # 'blue'
57
75
  julia.favorite_color # 'green'
58
76
  ```
@@ -2,15 +2,15 @@ module CushionDefaults
2
2
  # A series of class methods to be plopped into any class that includes CushionDefaults.
3
3
  module ClassMethods
4
4
 
5
- # Reader for the +defaults+ +DefaultsHash+.
5
+ # Reader for the @defaults@ @DefaultsHash@.
6
6
  attr_reader :defaults
7
7
 
8
8
  # @!attribute [w] defaults
9
- # Wipe @defaults and replace it with the keys/vals of +replacement_hash+.
9
+ # Wipe @defaults and replace it with the keys/vals of @replacement_hash@.
10
10
  #
11
11
  # If you only want to add one or more defaults, then write instead self.defaults += {new_key: val}.
12
12
  #
13
- # Note that all keys are coerced into +Symbols+.
13
+ # Note that all keys are coerced into @Symbols@.
14
14
  def defaults=(replacement_hash)
15
15
  # Need to copy over keys/vals to ensure @defaults remains a DefaultsHash and retains identity
16
16
 
@@ -24,9 +24,9 @@ module CushionDefaults
24
24
  end
25
25
  end
26
26
 
27
- # Equivalent to +@defaults[key] = val+
27
+ # Equivalent to @@defaults[key] = val@
28
28
  # @param key [#to_sym] key for new default.
29
- # @param val [Object] Default value for +key+.
29
+ # @param val [Object] Default value for @key@.
30
30
  def set_default(key, val)
31
31
  @defaults[key.to_sym] = val
32
32
  end
@@ -34,14 +34,14 @@ module CushionDefaults
34
34
  # @!group Mass Default Setting Methods
35
35
 
36
36
  # Load in the defaults for this class from a YAML file.
37
- # If +file_name+ is specified, this YAML file is loaded. Otherwise, {Configuration#yaml_file_for} is evaluated for
38
- # the current class. By default, the yaml file for +Klass+ is expected to be at +config/cushion_defaults/klass.yaml+.
37
+ # If @file_name@ is specified, this YAML file is loaded. Otherwise, {Configuration#yaml_file_for} is evaluated for
38
+ # the current class. By default, the yaml file for @Klass@ is expected to be at @config/cushion_defaults/klass.yaml@.
39
39
  # @param file_name [String] name of the YAML file to be loaded in for this class
40
40
  # @see Configuration#auto_load_from_yaml
41
41
  # @see Configuration#whiny_yaml
42
42
  def defaults_from_yaml(file_name = nil)
43
43
  if file_name
44
- yaml_path = "#{CushionDefaults::configuration.yaml_source_full_path}#{file_name}.yaml"
44
+ yaml_path = "#{CushionDefaults.conf.yaml_source_full_path}#{file_name}.yaml"
45
45
  else
46
46
  yaml_path = CushionDefaults.conf.yaml_file_for(self)
47
47
  end
@@ -75,7 +75,7 @@ module CushionDefaults
75
75
 
76
76
  # @!group Reader/Writer
77
77
 
78
- # Sets up a cushion_reader for each :sym in +syms+.
78
+ # Sets up a cushion_reader for each :sym in @syms@.
79
79
  #
80
80
  # Each reader method checks if its instance variable (:sym) is defined. If it is, it returns that. If not, it
81
81
  # returns the default value.
@@ -89,8 +89,8 @@ module CushionDefaults
89
89
  # Will set up {#bang_reader}s if
90
90
  # {CushionDefaults::Configuration#bang_things_up Configuration#bang_things_up} is true.
91
91
  #
92
- # The readers are named according to the same format as +attr_reader+.
93
- # @param syms [*#to_sym] instance variables that should have +cushion_readers+
92
+ # The readers are named according to the same format as @attr_reader@.
93
+ # @param syms [*#to_sym] instance variables that should have @cushion_readers@
94
94
  # @see Configuration#update_readers
95
95
  def cushion_reader(*syms)
96
96
  syms.each do |sym|
@@ -98,14 +98,14 @@ module CushionDefaults
98
98
  if self_or_parent_instance_method?(sym)
99
99
  CushionDefaults.log("#{self} or a parent class already has what looks like a getter method for #{sym_str}", :warn)
100
100
  end
101
- instance_variable_string = "@#{sym}"
101
+ instance_variable_sym = "@#{sym}".to_sym
102
102
 
103
103
  # significant performance gains from using this rather than #defaults in method below
104
104
  defaults_cache = @defaults
105
105
 
106
106
  define_method(sym) do
107
- if instance_variable_defined?(instance_variable_string) && (CushionDefaults.conf.no_pushies? || defaults_cache.not_pushy?(sym))
108
- instance_variable_get(instance_variable_string)
107
+ if instance_variable_defined?(instance_variable_sym) && (CushionDefaults.conf.no_pushies? || defaults_cache.not_pushy?(sym))
108
+ instance_variable_get(instance_variable_sym)
109
109
  else
110
110
  # much faster to save as var
111
111
  da_default = defaults_cache[sym]
@@ -117,16 +117,16 @@ module CushionDefaults
117
117
  bang_reader *syms if CushionDefaults.conf.bang_things_up
118
118
  end
119
119
 
120
- # Identical to {#cushion_reader} with one important exception: after determining the default value, +bang_reader+
120
+ # Identical to {#cushion_reader} with one important exception: after determining the default value, @bang_reader@
121
121
  # goes on to crystallize this default value for the instance.
122
122
  #
123
123
  # This is especially useful with proc cushions, as the below examples make clear.
124
124
  #
125
- # Note that this method is equivalent to calling +instance.crystallize_default(:sym)+.
125
+ # Note that this method is equivalent to calling @instance.crystallize_default(:sym)@.
126
126
  #
127
127
  # Note also, finally, that bang_readers can exist and function even if no {#cushion_writer}s are defined.
128
128
  #
129
- # @param syms [*#to_sym] instance variables that should have +bang_readers+
129
+ # @param syms [*#to_sym] instance variables that should have @bang_readers@
130
130
  # @see CushionDefaults::Configuration#bang_things_up Configuration#bang_things_up
131
131
  # @see CushionDefaults::CushionDefaults#crystalize_default CushionDefaults#crystalize_default
132
132
  #
@@ -177,7 +177,7 @@ module CushionDefaults
177
177
  end
178
178
  end
179
179
 
180
- # Sets up a cushion_writer for each :sym in +syms+.
180
+ # Sets up a cushion_writer for each :sym in @syms@.
181
181
  #
182
182
  # Each writer method carries out one of several checks.
183
183
  #
@@ -191,20 +191,20 @@ module CushionDefaults
191
191
  #
192
192
  # Finally, assuming it was not flagged as nilish, the variable is set to the new value.
193
193
  #
194
- # The writers are named according to the same format as +attr_writer+.
195
- # @param syms [*#to_sym] instance variables that should have +cushion_writers+
194
+ # The writers are named according to the same format as @attr_writer@.
195
+ # @param syms [*#to_sym] instance variables that should have @cushion_writers@
196
196
  # @see Configuration#update_writers
197
197
  # @see Configuration#ignore_attempts_to_set_nil
198
198
  # @see Configuration#blank_str_is_nil
199
199
  # @see Configuration#whiny_ignores
200
200
  def cushion_writer(*syms)
201
201
  syms.each do |sym|
202
- method_name = "#{sym}="
202
+ method_name = "#{sym}=".to_sym
203
203
  if self_or_parent_instance_method?(method_name)
204
204
  CushionDefaults.log("#{self} or a parent class already has what looks like a setter method for #{sym}", :warn)
205
205
  end
206
206
 
207
- instance_variable_string = "@#{sym}"
207
+ instance_variable_sym = "@#{sym}".to_sym
208
208
 
209
209
  defaults_cache = @defaults
210
210
 
@@ -213,12 +213,11 @@ module CushionDefaults
213
213
  if CushionDefaults.conf.whiny_ignores
214
214
  CushionDefaults.log("You are attempting to set a nilish value for #{sym}. This will not be recorded, and any value set will be deleted.", :warn)
215
215
  end
216
- remove_instance_variable(instance_variable_string) if instance_variable_defined?(instance_variable_string)
217
216
  else
218
217
  if CushionDefaults.conf.we_have_a_pushy? && defaults_cache.pushy?(sym)
219
218
  CushionDefaults.log("You are setting a value for #{sym}, but this is a pushy default and this value will not be returned by any cushion_readers.", :warn)
220
219
  end
221
- instance_variable_set(instance_variable_string, y)
220
+ instance_variable_set(instance_variable_sym, y)
222
221
  end
223
222
  end
224
223
  CushionDefaults.log("cushion_writer #{sym}= established for #{self}")
@@ -226,7 +225,7 @@ module CushionDefaults
226
225
  end
227
226
 
228
227
  # Undefines the reader for sym in this class (if present).
229
- # @note This method will delete any method of the form +sym+, not just cushion_readers.
228
+ # @note This method will delete any method of the form @sym@, not just cushion_readers.
230
229
  # @param sym [#to_sym] instance variable to delete reader for
231
230
  def remove_reader(sym)
232
231
  sym = sym.to_sym
@@ -237,7 +236,7 @@ module CushionDefaults
237
236
  end
238
237
 
239
238
  # Undefines any bang method for sym in this class (if present).
240
- # @note This method will delete any method of the form +sym!+, not just bang readers.
239
+ # @note This method will delete any method of the form @sym!@, not just bang readers.
241
240
  # @param sym [#to_sym] instance variable to delete bang method for
242
241
  def remove_bang(sym)
243
242
  sym = "sym!".to_sym
@@ -258,7 +257,7 @@ module CushionDefaults
258
257
  end
259
258
  end
260
259
 
261
- # Sets up both {#cushion_reader}s and {#cushion_writer}s for +syms+. Will set up {#bang_reader}s if
260
+ # Sets up both {#cushion_reader}s and {#cushion_writer}s for @syms@. Will set up {#bang_reader}s if
262
261
  # {CushionDefaults::Configuration#bang_things_up Configuration#bang_things_up} is true.
263
262
  # @param syms [*#to_sym] Those instance variables that should have {#cushion_reader}s and {#cushion_writer}s.
264
263
  def cushion(*syms)
@@ -267,24 +266,24 @@ module CushionDefaults
267
266
  cushion_writer(*syms)
268
267
  end
269
268
 
270
- # Defines {#cushion_reader}s for all of this class' +defaults+.
269
+ # Defines {#cushion_reader}s for all of this class' @defaults@.
271
270
  #
272
- # Only defines +cushion_readers+ for defaults specified for this class. All other readers are assumed to have been defined
271
+ # Only defines @cushion_readers@ for defaults specified for this class. All other readers are assumed to have been defined
273
272
  # further up the class tree.
274
273
  #
275
- # Thus, if class +A+ defines the default +var1+, and class +B+ defines the default +var2+, calling this method
276
- # within class +B+ will only generate a reader for +var2+.
274
+ # Thus, if class @A@ defines the default @var1@, and class @B@ defines the default @var2@, calling this method
275
+ # within class @B@ will only generate a reader for @var2@.
277
276
  def cushion_readers_for_defaults
278
277
  cushion_reader *defaults.keys
279
278
  end
280
279
 
281
- # Defines {#cushion_reader}s and {#cushion_writer}s for all of this class' +defaults+.
280
+ # Defines {#cushion_reader}s and {#cushion_writer}s for all of this class' @defaults@.
282
281
  #
283
- # Only defines +cushion_readers+ and +cushion_writers+ for this class defaults. All other getters are assumed to
282
+ # Only defines @cushion_readers@ and @cushion_writers@ for this class defaults. All other getters are assumed to
284
283
  # have been defined further up the class tree.
285
284
  #
286
- # Thus, if class +A+ defines the default +var1+, and class +B+ defines the default +var2+, calling this method
287
- # within class +B+ will only generate a getter for +var2+.
285
+ # Thus, if class @A@ defines the default @var1@, and class @B@ defines the default @var2@, calling this method
286
+ # within class @B@ will only generate a getter for @var2@.
288
287
  #
289
288
  # See also:
290
289
  # - #cushion
@@ -324,12 +323,12 @@ module CushionDefaults
324
323
  freeze_default *defaults.keys
325
324
  end
326
325
 
327
- # In addition to preventing the +default[:sym]+ from being set to a new value (see {#freeze_default}), also freezes
328
- # the value to which +default[:sym]+ is currently set.
326
+ # In addition to preventing the @default[:sym]@ from being set to a new value (see {#freeze_default}), also freezes
327
+ # the value to which @default[:sym]@ is currently set.
329
328
  #
330
329
  # Does not throw an error when you attempt to freeze an already-frozen default, but it does log at warning level.
331
330
  #
332
- # Equivalent to calling: +freeze_default :sym; defaults[:sym].freeze+
331
+ # Equivalent to calling: @freeze_default :sym; defaults[:sym].freeze@
333
332
  #
334
333
  # @api freeze
335
334
  def deep_freeze_default(*syms)
@@ -349,9 +348,9 @@ module CushionDefaults
349
348
 
350
349
  # Thaws a frozen default, allowing it to be set to a new value.
351
350
  #
352
- # Note that if the value of the +default[:sym]+ is itself frozen (using {#deep_freeze_default} or +Object#freeze+),
353
- # thaw_default allows you to set +default[:sym]+ to a *new* value but does not and cannot allow you to modify the
354
- # value to which +default[:sym]+ points until and unless +default[:sym]+ is set to a new value.
351
+ # Note that if the value of the @default[:sym]@ is itself frozen (using {#deep_freeze_default} or @Object#freeze@),
352
+ # thaw_default allows you to set @default[:sym]@ to a *new* value but does not and cannot allow you to modify the
353
+ # value to which @default[:sym]@ points until and unless @default[:sym]@ is set to a new value.
355
354
  #
356
355
  # Does not throw an error when you attempt to thaw a non-frozen default, but it does log at warning level.
357
356
  #
@@ -390,10 +389,10 @@ module CushionDefaults
390
389
 
391
390
  # @!endgroup
392
391
 
393
- # Ensure that if class +Klass+ includes +CushionDefaults+, then any class that subclasses +Klass+ will include it as
392
+ # Ensure that if class @Klass@ includes @CushionDefaults@, then any class that subclasses @Klass@ will include it as
394
393
  # well.
395
394
  #
396
- # Called automatically whenever any class that includes +CushionDefaults+ is inherited.
395
+ # Called automatically whenever any class that includes @CushionDefaults@ is inherited.
397
396
  # @api private
398
397
  def inherited(inheritor)
399
398
  inheritor.send :include, CushionDefaults
@@ -401,13 +400,13 @@ module CushionDefaults
401
400
 
402
401
  protected
403
402
 
404
- # Check whether this class or any parent class includes the instance method denoted by +sym+
403
+ # Check whether this class or any parent class includes the instance method denoted by @sym@
405
404
  # @param sym [#to_sym] method in question
406
405
  def self_or_parent_instance_method?(sym)
407
406
  instance_methods(true).include?(sym.to_sym)
408
407
  end
409
408
 
410
- # Check whether this class includes the instance method denoted by +sym+
409
+ # Check whether this class includes the instance method denoted by @sym@
411
410
  # @param sym [#to_sym] method in question
412
411
  def self_has_method?(sym)
413
412
  instance_methods(false).include?(sym.to_sym)
@@ -1,9 +1,9 @@
1
1
  require 'logger'
2
2
 
3
3
  module CushionDefaults
4
- # Effectively a singleton class, +Configuration+ keeps track of various configuration options for +CushionDefaults+.
4
+ # Effectively a singleton class, @Configuration@ keeps track of various configuration options for @CushionDefaults@.
5
5
  #
6
- # In addition, it also keeps track of certain state data for +CushionDefaults+.
6
+ # In addition, it also keeps track of certain state data for @CushionDefaults@.
7
7
  #
8
8
  # For configuration options, see the attribute writers.
9
9
  #
@@ -96,7 +96,7 @@ module CushionDefaults
96
96
  # Returns or computes the folder where class-specific yaml files are expected to reside.
97
97
  # @return [String] path to yaml config files.
98
98
  def yaml_source_full_path
99
- @yaml_source_full_path || CushionDefaults::CALLING_PATH + yaml_source_folder
99
+ @yaml_source_full_path || "#{CushionDefaults::CALLING_PATH}#{yaml_source_folder}"
100
100
  end
101
101
 
102
102
  # @!endgroup
@@ -107,7 +107,7 @@ module CushionDefaults
107
107
  @we_have_a_pushy = false
108
108
  end
109
109
 
110
- # Update configuration options with those values contained within +loaded_config+.
110
+ # Update configuration options with those values contained within @loaded_config@.
111
111
  #
112
112
  # @param loaded_config [Hash] hash of config options and settings
113
113
  def from_hash(loaded_config)
@@ -166,7 +166,7 @@ module CushionDefaults
166
166
  # @param klass [Class] class in question.
167
167
  # @return [String] expected path to the YAML file
168
168
  def yaml_file_for(klass)
169
- "#{CushionDefaults::configuration.yaml_source_full_path}#{underscore(klass.to_s)+'.yaml'}"
169
+ "#{CushionDefaults::configuration.yaml_source_full_path}#{underscore(klass.to_s)}.yaml}"
170
170
  end
171
171
 
172
172
 
@@ -207,7 +207,7 @@ module CushionDefaults
207
207
 
208
208
  protected
209
209
 
210
- # Specifies the formatter for logger. Will not be called if a logger is assigned with +should_assign_formatter+ set to
210
+ # Specifies the formatter for logger. Will not be called if a logger is assigned with @should_assign_formatter@ set to
211
211
  # false.
212
212
  def assign_formatter_to_logger
213
213
  logger.formatter = proc do |severity, _time, progname, msg|
@@ -1,16 +1,16 @@
1
1
  module CushionDefaults
2
- # Slight expansion of +Hash+.
2
+ # Slight expansion of @Hash@.
3
3
  #
4
- # Records a link to +owner+ and will traverse up the chain of owners looking for a default value for +x+ if no default
5
- # value for +x+ is specified.
4
+ # Records a link to @owner@ and will traverse up the chain of owners looking for a default value for @x@ if no default
5
+ # value for @x@ is specified.
6
6
  #
7
7
  # In general, a program should treat this class like a normal Hash, with two salient differences:
8
8
  # - The {DefaultsHash#+} method has been overridden.
9
9
  # - The {DefaultsHash#has_ish_key?}, which returns true if this or a parent has the key specified.
10
10
  class DefaultsHash < Hash
11
- # +default_proc+ does most of the work.
11
+ # @default_proc@ does most of the work.
12
12
 
13
- # Must be initialized with an +owner+ class.
13
+ # Must be initialized with an @owner@ class.
14
14
 
15
15
  # Set of defaults marked as pushy.
16
16
  attr_reader :pushy_defaults
@@ -22,7 +22,7 @@ module CushionDefaults
22
22
  # @param owner [Class] class for which this DefaultsHash holds the defaults.
23
23
  def initialize(owner)
24
24
  self.default_proc = proc { |_hash, key| super_defaults[key] }
25
- # look in the superclass' +defaults+ hash, if a key is not found in this class' +defaults+ hash
25
+ # look in the superclass' @defaults@ hash, if a key is not found in this class' @defaults@ hash
26
26
  @owner = owner
27
27
  @pushy_defaults = Set.new
28
28
  @polite_defaults = Set.new
@@ -35,7 +35,7 @@ module CushionDefaults
35
35
  #
36
36
  # Note that this also enables +=.
37
37
  #
38
- # If +key+ is in +self+ and +y+, then the value of +y+ will replace that in +self+ in the resulting +Hash+.
38
+ # If @key@ is in @self@ and @y@, then the value of @y@ will replace that in @self@ in the resulting @Hash@.
39
39
  #
40
40
  # @note This method was incorrectly programmed to modify self in place. In a future release, this will be changed,
41
41
  # and the current behavior should not be depended upon.
@@ -97,16 +97,16 @@ module CushionDefaults
97
97
  CushionDefaults.log("All defaults cleared for #{@owner}.", :info)
98
98
  end
99
99
 
100
- # Determine if this +DefaultsHash+ "ish" has a key. In other words, whether it or any Hashes up the chain of
101
- # +super_defaults+ has the key +key+.
100
+ # Determine if this @DefaultsHash@ "ish" has a key. In other words, whether it or any Hashes up the chain of
101
+ # @super_defaults@ has the key @key@.
102
102
  #
103
103
  # @see #ish_keys
104
104
  def has_ish_key?(key)
105
- # Obviously, this method gives much better performance than calling +ish_keys.include?(key)+.
105
+ # Obviously, this method gives much better performance than calling @ish_keys.include?(key)@.
106
106
  if has_key?(key)
107
107
  true
108
- elsif !super_defaults.empty?
109
- # super_defaults could theoretically be either a DefaultsHash or a regular Hash
108
+ # super_defaults could theoretically be either a DefaultsHash or a regular Hash
109
+ elsif super_defaults
110
110
  if super_defaults.respond_to? :has_ish_key?
111
111
  super_defaults.has_ish_key?(key)
112
112
  else
@@ -117,7 +117,7 @@ module CushionDefaults
117
117
  end
118
118
  end
119
119
 
120
- # Returns the keys of this class' +defaults+ as well as those of parent classes (if extant).
120
+ # Returns the keys of this class' @defaults@ as well as those of parent classes (if extant).
121
121
  #
122
122
  # @see #has_ish_key?
123
123
  def ish_keys
@@ -238,7 +238,7 @@ module CushionDefaults
238
238
 
239
239
  protected
240
240
 
241
- # Return (unless cached) a reference to the superclass' +defaults+ hash.
241
+ # Return (unless cached) a reference to the superclass' @defaults@ hash.
242
242
  def super_defaults
243
243
  @super_defaults ||= @owner.superclass.respond_to?(:defaults) ? @owner.superclass.defaults : {}
244
244
  end
@@ -5,19 +5,22 @@ require 'cushion_defaults/class_methods'
5
5
  require 'cushion_defaults/defaults_hash'
6
6
  require 'cushion_defaults/errors'
7
7
 
8
- # Base module. Should be included in any class that needs the functionality offered by CushionDefaults. For a basic
9
- # introduction, you are strongly encouraged to consult the {file:README.md readme}.
8
+ # h2. The Basics
10
9
  #
11
- # There are also several short example programs in the +examples/+ folder. (If anyone has any more examples to include,
10
+ # Base module. Should be included in any class that needs the functionality offered by CushionDefaults.
11
+ #
12
+ # For a detailed introduction, you are strongly encouraged to consult the "README":file.readme.html.
13
+ #
14
+ # There are also several short example programs in the @examples/@ folder. (If anyone has any more examples to include,
12
15
  # please pass them along!)
13
16
  #
14
17
  # And if you would like to run a very simple benchmark of how CushionDefaults compares to similar methods, run
15
- # +benchmarks/simple_benchmark.rb+.
18
+ # @benchmarks/simple_benchmark.rb@.
16
19
  #
17
- # == Automatic Inclusion in Child Classes
20
+ # h2. Automatic Inclusion in Child Classes
18
21
  #
19
- # NB: When included in a superclass +Klass+, it automatically includes itself in all subclassses that subsequently
20
- # subclass +Klass+.
22
+ # When included in a superclass @Klass@, CushionDefaults automatically includes itself in all subclassses that subsequently
23
+ # subclass @Klass@.
21
24
  # @example Inclusion in Child Class
22
25
  # class Klass
23
26
  # include CushionDefaults
@@ -28,26 +31,29 @@ require 'cushion_defaults/errors'
28
31
  module CushionDefaults
29
32
 
30
33
  # Version constant
31
- VERSION = '0.5.1'
34
+ VERSION = '0.5.2'
32
35
 
33
- # The path of the first file that +includes+ CushionDefaults.
36
+ # The path of the first file that includes CushionDefaults.
34
37
  CALLING_PATH = File.expand_path(File.dirname($0)) + '/'
35
38
 
36
39
  # Location CushionDefaults looks here for an (optional) config file, as well as off of the {CALLING_PATH}.
37
- CONFIG_LOCATION = CALLING_PATH + 'config/cushion_defaults.yaml'
40
+ CONFIG_LOCATION = "#{CALLING_PATH}config/cushion_defaults.yaml"
41
+
42
+ # Establish our configuration object
43
+ @conf = Configuration.new
38
44
 
39
- # Create or return a cached (effectively singleton) {Configuration} object.
45
+ # Return CushionDefaults' {Configuration} object.
40
46
  # @return [Configuration] the module's configuration object
41
47
  # @see Configuration
42
- def self.configuration
43
- @configuration ||= Configuration.new
48
+ def self.conf
49
+ @conf
44
50
  end
45
51
 
46
- # Create or return a cached (effectively singleton) {Configuration} object. Alias for {self.configuration}.
52
+ # Return CushionDefaults' {Configuration} object.
47
53
  # @return [Configuration] the module's configuration object
48
54
  # @see Configuration
49
- def self.conf
50
- self.configuration
55
+ def self.configuration
56
+ @conf
51
57
  end
52
58
 
53
59
  # Logs a message to the logger at {Configuration#logger} as long as {Configuration#record_in_log} is true.
@@ -56,44 +62,42 @@ module CushionDefaults
56
62
  # :warn, :error, :fatal, :unknown
57
63
  # @param caller_method_name [String] name of the method whose actions are being logged. If nil, the name is determined
58
64
  # programmatically.
59
- def self.log(str, level=:debug, caller_method_name=nil)
65
+ def self.log(str, level=:debug, caller_method_name=caller[0].to_s)
60
66
 
61
- # conf.record_in_log tells us whether we should be logging at all
62
- return unless conf.record_in_log
67
+ # @conf.record_in_log tells us whether we should be logging at all
68
+ return unless @conf.record_in_log
63
69
 
64
70
  # If caller_method_name is nil, magically get the name of the calling method
65
- caller_method_name ||= caller[0].to_s
66
- conf.logger.progname = caller_method_name unless caller_method_name == ''
71
+ @conf.logger.progname = caller_method_name unless caller_method_name == ''
67
72
 
68
73
  case level
69
74
  when :debug, 0
70
- conf.logger.debug {str}
75
+ @conf.logger.debug {str}
71
76
  when :fatal, 4
72
- conf.logger.fatal {str}
77
+ @conf.logger.fatal {str}
73
78
  when :error, 3
74
- conf.logger.error {str}
79
+ @conf.logger.error {str}
75
80
  when :warn, 2
76
- conf.logger.warn {str}
81
+ @conf.logger.warn {str}
77
82
  when :info, 1
78
- conf.logger.info {str}
83
+ @conf.logger.info {str}
79
84
  else
80
- conf.logger.unknown {str}
85
+ @conf.logger.unknown {str}
81
86
  end
82
87
  end
83
88
 
84
89
  # Determine whether a value should be treated as nil or nil-like. If {Configuration#ignore_attempts_to_set_nil} is
85
90
  # false, this method always returns false. If that setting is true, then it examines {Configuration#blank_str_is_nil}.
86
- # If that setting is true, it returns true if value is nil or '' (like ActiveSupport's ``#blank?``)
91
+ # If that setting is true, it returns true if value is nil or '' (like ActiveSupport's @#blank?@)
87
92
  # @param value [Object] value to examine
88
93
  # @return [boolean] as specified above
89
94
  #
90
95
  # @api private
91
96
  def self.nilish?(value)
92
- if conf.ignore_attempts_to_set_nil
93
- value.nil? || (conf.blank_str_is_nil && value.eql?(''))
94
- else
95
- false
96
- end
97
+ # @conf is guaranteed to be defined by the call to self.preliminary_setup below
98
+ # Using the instance variable here gives us surprising performance gains
99
+
100
+ @conf.ignore_attempts_to_set_nil && (value.nil? || (value.is_a?(String) && @conf.blank_str_is_nil && value.empty?))
97
101
  end
98
102
 
99
103
  # Yield the module's configuration object for manipulation.
@@ -113,7 +117,7 @@ module CushionDefaults
113
117
  #
114
118
  # @see Configuration
115
119
  def self.configure
116
- yield(configuration)
120
+ yield(@conf)
117
121
  end
118
122
 
119
123
  # Add class methods and set up an @defaults {DefaultsHash} when the module is included in a class. Called
@@ -131,14 +135,14 @@ module CushionDefaults
131
135
 
132
136
  base.extend(ClassMethods)
133
137
 
134
- if configuration.auto_load_from_yaml
138
+ if @conf.auto_load_from_yaml
135
139
  base.defaults_from_yaml
136
140
  else
137
141
  base.initialize_defaults_hash
138
142
  end
139
143
  end
140
144
 
141
- # Get class {DefaultsHash}. If +x+ is a +Klass+, then +x#defaults+ returns +Klass.defaults+.
145
+ # Get class {DefaultsHash}. If @x@ is a @Klass@, then @x#defaults@ returns @Klass.defaults@.
142
146
  # @return [DefaultsHash] the defaults for self.class
143
147
  def defaults
144
148
  self.class.defaults
@@ -153,17 +157,17 @@ module CushionDefaults
153
157
  defaults[sym]
154
158
  end
155
159
 
156
- # Wraps (in somewhat more convenient form) +Object#instance_variable_defined?+.
160
+ # Wraps (in somewhat more convenient form) @Object#instance_variable_defined?@.
157
161
  # @param sym [#to_s] String or coercable object that denotes the instance variable in question
158
162
  # @return [boolean] true if the instance variable denoted by sym is defined, false otherwise
159
163
  def has_specified?(sym)
160
164
  instance_variable_defined?("@#{sym}")
161
165
  end
162
166
 
163
- # 'Crystallize' the default: i.e., if this instance does not have +sym+ specified, then set the value of +sym+
167
+ # 'Crystallize' the default: i.e., if this instance does not have @sym@ specified, then set the value of @sym@
164
168
  # explicitly to the default value.
165
169
  #
166
- # This is most useful if you want to update the default value for +sym+ but do not want to affect one or more already
170
+ # This is most useful if you want to update the default value for @sym@ but do not want to affect one or more already
167
171
  # exsiting instances of the class.
168
172
  #
169
173
  # @param default_key [#to_sym] default to crystallize for this object
@@ -185,7 +189,7 @@ module CushionDefaults
185
189
 
186
190
  # Loads the optional config file, looking at the various locations specified therein.
187
191
  def self.preliminary_setup
188
- local_conf_path = CALLING_PATH + configuration.yaml_source_folder + 'cushion_defaults.yaml'
192
+ local_conf_path = CALLING_PATH + @conf.yaml_source_folder + 'cushion_defaults.yaml'
189
193
  if File.exists?(CONFIG_LOCATION)
190
194
  t = File.open(CONFIG_LOCATION)
191
195
  log("Found and opened config file at #{CONFIG_LOCATION}", :info)
@@ -197,7 +201,7 @@ module CushionDefaults
197
201
  log("No config file found. Looked at #{CONFIG_LOCATION} and #{local_conf_path}.", :info)
198
202
  end
199
203
 
200
- conf.from_hash(YAML::load(t)) if t
204
+ @conf.from_hash(YAML::load(t)) if t
201
205
  end
202
206
 
203
207
  self.preliminary_setup
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cushion_defaults
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Mitchell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-10 00:00:00.000000000 Z
11
+ date: 2014-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -24,8 +24,8 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.11'
27
- description: Cushion your instance variables. Get a default if a variable isn’t defined.
28
- DRY off your code.
27
+ description: Cushion your attributes. Return a static or dynamic default if your @variable
28
+ isn’t defined. DRY off your code.
29
29
  email: posgarou@gmail.com
30
30
  executables: []
31
31
  extensions: []