namedarguments 0.0.3 → 0.0.5

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.
@@ -1,4 +1,5 @@
1
- == 0.0.1 / 2006-12-04
2
-
3
- * 1 major enhancement
4
- * L� breithe!
1
+ == 1.0.0 / 2007-06-03
2
+
3
+ * 1 major enhancement
4
+ * Birthday!
5
+
@@ -1,10 +1,10 @@
1
- History.txt
2
- Manifest.txt
3
- README.txt
4
- Rakefile
5
- bin/named_arguments
6
- lib/named_arguments.rb
7
- lib/hash_extended_tools.rb
8
- lib/singleton_creator_mixin.rb
9
- lib/class_settings_mixin.rb
10
- test/test_named_arguments.rb
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/named_arguments.rb
6
+ lib/named_arguments/class_settings_mixin.rb
7
+ lib/named_arguments/hash_extended_tools.rb
8
+ lib/named_arguments/method_extensions.rb
9
+ test/unit/named_arguments_test.rb
10
+ test/test_helper.rb
data/README.txt CHANGED
@@ -1,52 +1,48 @@
1
- NamedArguments
2
- by James M. Moore
3
-
4
- == DESCRIPTION:
5
-
6
- Adds the ability to call class constructors with a hash of arguments to
7
- initialize attributes in the new object.
8
-
9
- == FEATURES/PROBLEMS:
10
-
11
- class Snark
12
- include NamedArguments
13
-
14
- attr_accessor :color, :size, :name
15
-
16
- attribute_defaults :color => 'blue', :size => lambda {|s| some_method_call(s)}
17
- required_fields :color, :name
18
- required_respond_to :name => :to_s
19
- required_kind_of? :size => Fixnum
20
- type_conversion :size => Fixnum
21
- end
22
-
23
- s = Snark.new :boojum => 7, :color => red
24
-
25
- == INSTALL:
26
-
27
- gem install namedarguments
28
-
29
- == LICENSE:
30
-
31
- (The MIT License)
32
-
33
- Copyright (c) 2006 James M. Moore
34
-
35
- Permission is hereby granted, free of charge, to any person obtaining
36
- a copy of this software and associated documentation files (the
37
- 'Software'), to deal in the Software without restriction, including
38
- without limitation the rights to use, copy, modify, merge, publish,
39
- distribute, sublicense, and/or sell copies of the Software, and to
40
- permit persons to whom the Software is furnished to do so, subject to
41
- the following conditions:
42
-
43
- The above copyright notice and this permission notice shall be
44
- included in all copies or substantial portions of the Software.
45
-
46
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
47
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
48
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
49
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
50
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
51
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
52
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ namedarguments
2
+ by FIX (your name)
3
+ FIX (url)
4
+
5
+ == DESCRIPTION:
6
+
7
+ FIX (describe your package)
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * FIX (list of features or problems)
12
+
13
+ == SYNOPSIS:
14
+
15
+ FIX (code sample of usage)
16
+
17
+ == REQUIREMENTS:
18
+
19
+ * FIX (list of requirements)
20
+
21
+ == INSTALL:
22
+
23
+ * FIX (sudo gem install, anything else)
24
+
25
+ == LICENSE:
26
+
27
+ (The MIT License)
28
+
29
+ Copyright (c) 2007 FIX
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ 'Software'), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
45
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
46
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
47
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
48
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile CHANGED
@@ -1,12 +1,17 @@
1
+ # -*- ruby -*-
2
+
1
3
  require 'rubygems'
2
4
  require 'hoe'
3
5
  require './lib/named_arguments.rb'
4
6
 
5
7
  Hoe.new('namedarguments', NamedArguments::VERSION) do |p|
6
- p.summary = 'Provide named arguments (hashes) to constructors to initialize attributes.'
7
- p.author = "James M Moore"
8
- p.email = 'james@phonesonrails.com'
9
- p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
8
+ p.rubyforge_name = 'namedarguments'
9
+ # p.author = 'FIX'
10
+ # p.email = 'FIX'
11
+ # p.summary = 'FIX'
12
+ # p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
10
13
  # p.url = p.paragraphs_of('README.txt', 0).first.split(/\n/)[1..-1]
11
14
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
12
15
  end
16
+
17
+ # vim: syntax=Ruby
@@ -1,6 +1,6 @@
1
- require File.dirname(__FILE__) + '/class_settings_mixin'
2
- require File.dirname(__FILE__) + '/hash_extended_tools'
3
- require File.dirname(__FILE__) + '/singleton_creator_mixin'
1
+ require File.dirname(__FILE__) + '/named_arguments/method_extensions'
2
+ require File.dirname(__FILE__) + '/named_arguments/hash_extended_tools'
3
+ require File.dirname(__FILE__) + '/named_arguments/class_settings_mixin'
4
4
 
5
5
  # Adds the following features to a class:
6
6
  #
@@ -27,14 +27,24 @@ require File.dirname(__FILE__) + '/singleton_creator_mixin'
27
27
  #
28
28
  # = See also
29
29
  #
30
- # See NamedArgumentsClassMethods for more methods:
30
+ # See ClassMethods for more methods:
31
31
  #
32
- # * NamedArgumentsClassMethods#type_converter
33
- # * NamedArgumentsClassMethods#option_attr
32
+ # * ClassMethods#type_converter
33
+ # * ClassMethods#option_attr
34
34
  module NamedArguments
35
- VERSION = '0.0.3'
35
+ VERSION = '0.0.5'
36
36
 
37
- include HashExtendedTools
37
+ def self.included target # :nodoc:
38
+ target.class_eval do
39
+ include HashExtendedTools
40
+ include ClassSettingsMixin
41
+ extend ClassMethods
42
+ create_class_settings_method :required_fields
43
+ create_class_settings_method :required_kind_of
44
+ create_class_settings_method :required_respond_to
45
+ create_class_settings_method :attribute_defaults
46
+ end
47
+ end
38
48
 
39
49
  # Requires that object.snark.kind_of? String be true
40
50
  # on the call to initialize.
@@ -84,15 +94,6 @@ module NamedArguments
84
94
  # Dummy for rdoc
85
95
  end
86
96
 
87
- def self.included target # :nodoc:
88
- target.send :include, ClassSettingsMixin
89
- target.send :extend, NamedArgumentsClassMethods
90
- target.send :create_class_settings_method, :required_fields
91
- target.send :create_class_settings_method, :required_kind_of
92
- target.send :create_class_settings_method, :required_respond_to
93
- target.send :create_class_settings_method, :attribute_defaults
94
- end
95
-
96
97
  # Set the attributes for this object. Normally called
97
98
  # by initialize.
98
99
 
@@ -108,9 +109,9 @@ module NamedArguments
108
109
  def set_default_attributes(args) # :nodoc:
109
110
  defaults = {}
110
111
  (attribute_defaults? || {}).each_pair do |k, v|
111
- if v.kind_of? Class
112
+ if Class === v
112
113
  result = v.new
113
- elsif v.kind_of? Proc
114
+ elsif Proc === v
114
115
  result = v.call self
115
116
  elsif v.class == Array and v.empty?
116
117
  result = Array.new
@@ -124,7 +125,8 @@ module NamedArguments
124
125
  args = defaults.merge args
125
126
  args.each_pair do
126
127
  |k, v|
127
- self.send("#{k}=", v)
128
+ m = "#{k}="
129
+ send m, v if respond_to? m
128
130
  end
129
131
  end
130
132
 
@@ -143,9 +145,8 @@ module NamedArguments
143
145
  # See also: required_fields
144
146
 
145
147
  def check_required_field(fields_set) # :nodoc:
146
- (required_fields? || []).each do
147
- |f|
148
- raise NamedArgumentException.new("Must set parameter: " + f.to_s) unless fields_set.has_key? f.to_sym
148
+ (required_fields? || []).each do |f|
149
+ raise ParameterRequired, "Must set parameter: " + f.to_s unless fields_set.has_key? f.to_sym
149
150
  end
150
151
  end
151
152
 
@@ -157,16 +158,14 @@ module NamedArguments
157
158
  # * #set_default_attributes
158
159
 
159
160
  def check_required_kind # :nodoc:
160
- (required_kind_of? || {}).each_pair do
161
- |k, v|
162
- raise NamedArgumentException.new("Wrong class: #{k.to_s}; should have been #{v.to_s}, object is #{self.send(k).inspect}") unless self.send(k).kind_of?(v)
161
+ (required_kind_of? || {}).each_pair do |k, v|
162
+ raise WrongClass.new("Wrong class: #{k.to_s}; should have been #{v.to_s}, object is #{self.send(k).inspect}") unless v === self.send(k)
163
163
  end
164
164
  end
165
165
 
166
166
  def check_required_respond_to # :nodoc:
167
- (required_respond_to? || {}).each_pair do
168
- |k, v|
169
- raise NamedArgumentException.new("#{k} must respond to #{v}; the object is #{self.send(k).inspect}") unless self.send(k).respond_to?(v)
167
+ (required_respond_to? || {}).each_pair do |k, v|
168
+ raise MustRespondTo.new("#{k} must respond to #{v}; the object is #{self.send(k).inspect}") unless self.send(k).respond_to?(v)
170
169
  end
171
170
  end
172
171
 
@@ -186,7 +185,6 @@ module NamedArguments
186
185
  super()
187
186
  end
188
187
  attributes_set args
189
- yield self if block_given?
190
188
  end
191
189
 
192
190
  def option_attr_get k # :nodoc:
@@ -214,7 +212,7 @@ module NamedArguments
214
212
  # Class methods (methods of the class
215
213
  # object itself) provided when
216
214
  # NamedArguments in included.
217
- module NamedArgumentsClassMethods
215
+ module ClassMethods
218
216
  def option_attr *array_of_names
219
217
  array_of_names.each { |n|
220
218
  define_method n, lambda {
@@ -231,7 +229,7 @@ module NamedArguments
231
229
  setter_method_name = (field.to_s + '=').to_sym
232
230
  alias_method alias_name, setter_method_name
233
231
  send :define_method, setter_method_name do |rhs|
234
- if [Fixnum].member? new_klass
232
+ if Integer === new_klass
235
233
  v = rhs.to_i
236
234
  elsif new_klass == String
237
235
  v = rhs.to_s
@@ -239,7 +237,7 @@ module NamedArguments
239
237
  v = rhs.to_sym
240
238
  elsif new_klass == :boolean
241
239
  v = !!rhs
242
- elsif new_klass.kind_of? Proc
240
+ elsif Proc === new_klass
243
241
  v = new_klass.call v
244
242
  else
245
243
  v = new_klass.new rhs
@@ -248,8 +246,13 @@ module NamedArguments
248
246
  end
249
247
  end
250
248
  end
249
+
250
+ class Error < RuntimeError; end
251
+ class ParameterRequired < Error; end
252
+ class WrongClass < Error; end
253
+ class MustRespondTo < Error; end
251
254
  end
252
255
 
253
- # Exception class thrown by NamedArguments methods.
254
- class NamedArgumentException < Exception
255
- end
256
+ # If Rails isn't around, fake ActiveRecord
257
+ module ActiveRecord; end;
258
+ class ActiveRecord::Base; end
@@ -0,0 +1,122 @@
1
+ module NamedArguments
2
+ module ClassSettingsMixin
3
+ def self.included target
4
+ target.class_eval do
5
+ include NamedArguments::MethodExtensions
6
+ extend ClassMethods
7
+ end
8
+ end
9
+
10
+ module ClassMethods
11
+ include NamedArguments::MethodExtensions
12
+
13
+ def self.included target
14
+ target.class_eval do
15
+ include NamedArguments::MethodExtensions
16
+ end
17
+ end
18
+
19
+ # Allow you to define
20
+ # methods that set a class value hash
21
+ # and an accessor for that hash.
22
+ #
23
+ # Example:
24
+ #
25
+ # create_class_settings_method :settings
26
+ #
27
+ # creates:
28
+ #
29
+ # settings:: A class method that allows
30
+ # you to set variables
31
+ # settings?:: The current value of those variables
32
+ #
33
+ # class BlueCar
34
+ # create_class_settings_method :settings
35
+ # create_class_settings_method :has_these
36
+ #
37
+ # settings :color => :blue, :another_settting => 10
38
+ # settings :painted => true
39
+ # has_these :doors, :windows
40
+ # has_these :wheels
41
+ # end
42
+ #
43
+ # class Convertable < BlueCar
44
+ # has_these :poptop
45
+ # end
46
+ #
47
+ # BlueCar.color
48
+ # => :blue
49
+ #
50
+ # BlueCar.new.settings?
51
+ # => {:color => :blue, :painted => true, :another_settting => 10}
52
+ def create_class_settings_method name
53
+ # Build the class methods first
54
+ l = class_setting_lambda name
55
+ define_method_with_context name, &l
56
+
57
+ # Allow #name? to be called as an instance method
58
+ # and default its return value to nil.
59
+ # This will be replaced on any call to the
60
+ # setter.
61
+ value_name = value_field_identifier(name)
62
+ instance_method = lambda {nil}
63
+ define_method value_name, instance_method
64
+ end
65
+
66
+ protected
67
+
68
+ # Returns a lambda that will create
69
+ # two methods:
70
+ #
71
+ # A singleton method on the current object
72
+ # that takes multiple parameters and
73
+ # stores their values. This allows
74
+ # you to define methods on the class
75
+ # that will save their parameters.
76
+ # An instance method that returns those
77
+ # saved parameters
78
+ def class_setting_lambda name #:nodoc:
79
+ value_field_id = value_field_identifier name
80
+ result = lambda do
81
+ # Note that this lambda is called
82
+ # either with a single argument
83
+ # containing a hash, or an array
84
+ # of arguments.
85
+ |*args|
86
+
87
+ if args.first.kind_of? Hash
88
+ args = args.first
89
+ end
90
+
91
+ begin
92
+ current_value = self.send value_field_id
93
+ case current_value
94
+ when Array then val = merge_arrays_of_symbols current_value, args
95
+ when Hash then val = current_value.merge args
96
+ else
97
+ raise RuntimeError.new("Attempting to merge two different kinds of data")
98
+ end
99
+ rescue NoMethodError
100
+ val = args
101
+ end
102
+
103
+ # Define the class method
104
+ define_method_with_value value_field_id, val
105
+
106
+ # Define the instance method
107
+ define_method value_field_id, lambda {val}
108
+ end
109
+ result
110
+ end
111
+
112
+ def value_field_identifier name #:nodoc:
113
+ return "#{name}?"
114
+ end
115
+
116
+ def merge_arrays_of_symbols a, b #:nodoc:
117
+ result = a.map(&:to_sym) + b.map(&:to_sym)
118
+ result.uniq
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,94 @@
1
+ module NamedArguments
2
+ # Provides several hash utilities.
3
+ #
4
+ # Note that you need to extend your hash with this module:
5
+ #
6
+ # hash = {}
7
+ # hash.extend HashExtendedTools
8
+ # hash = hash.exclude :foo, :bar
9
+ #
10
+ # Or create a new class:
11
+ #
12
+ # class HashWithExtendedTools < Hash
13
+ # include HashExtendedTools
14
+ # end
15
+ module HashExtendedTools
16
+ # Change keys in a hash.
17
+ #
18
+ # Pass in a hash of:
19
+ #
20
+ # old_key => new_key
21
+ #
22
+ # Any keys matching +old_key+ will be
23
+ # deleted and a new entry created with
24
+ # the same value and the new key.
25
+ def switch_keys args = {}
26
+ args.each_pair do
27
+ |old_key, new_key|
28
+ if self.has_key?(old_key)
29
+ self[new_key] = self[old_key]
30
+ delete(old_key)
31
+ end
32
+ end
33
+ self
34
+ end
35
+
36
+ # Return a new hash not including
37
+ # keys that are contained in
38
+ # +keys_to_exclude+.
39
+ #
40
+ # Keys that match entries in
41
+ # +keys_to_exclude+ are deleted if
42
+ # either they match as string or a
43
+ # symbol (created with to_sym).
44
+ def exclude *keys_to_exclude
45
+ result = self.dup
46
+ keys_to_exclude.each do |k|
47
+ result.delete k.to_s
48
+ result.delete k.to_sym
49
+ end
50
+ result
51
+ end
52
+
53
+ # Given an array of keys,
54
+ # return a hash containing
55
+ # the key/value pairs
56
+ # for the matching keys.
57
+ #
58
+ # Values that are nil are not
59
+ # returned.
60
+ def slice *slice_keys
61
+ result = {}
62
+ slice_keys.each do |k|
63
+ result[k] = self[k] unless self[k].nil?
64
+ end
65
+ result
66
+ end
67
+
68
+ # Return the given attributes as a hash containing
69
+ # attribute => value pairs.
70
+ #
71
+ # obj.a = 10
72
+ # obj.b = 20
73
+ # attributes_as_hash(:a, :b)
74
+ # => {:a => 10, :b => 20}
75
+ def attributes_as_hash *attrs
76
+ result = {}
77
+ attrs.each do |a|
78
+ v = self.send a
79
+ result[a] = v unless v.nil?
80
+ end
81
+ result
82
+ end
83
+
84
+ def symbol_keys_as_strings
85
+ sym_keys = self.keys.select {|k| k.kind_of? Symbol}
86
+ new_keys = {}
87
+ sym_keys.each {|k| new_keys[k] = k.to_s}
88
+ result = dup
89
+ result.extend HashExtendedTools
90
+ result.switch_keys new_keys
91
+ result
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,51 @@
1
+ module NamedArguments
2
+ # Adds two methods to a class:
3
+ #
4
+ # define_method_with_context
5
+ # define_method_with_value
6
+ module MethodExtensions
7
+ def self.included target
8
+ target.class_eval do
9
+ include ExtendedDefines
10
+ extend ExtendedDefines
11
+ end
12
+ end
13
+
14
+ module ExtendedDefines
15
+ # Create a method out of a
16
+ # name and a lambda.
17
+ #
18
+ # Example:
19
+ #
20
+ # my_lambda = lambda {13}
21
+ # define_method_with_context :return_13, my_lambda
22
+ #
23
+ # assert 13 == self.return_13
24
+ def define_method_with_context method_name, &block
25
+ sclass = class << self; self end
26
+ sclass.send(:define_method, method_name, block)
27
+ sclass.send(:public, method_name)
28
+ end
29
+
30
+ # Create a method out of a
31
+ # value and a name
32
+ # The method will return the value.
33
+ #
34
+ # Example:
35
+ #
36
+ # define_method_with_value :return_14, 14
37
+ #
38
+ # assert 14 == self.return_14
39
+ def define_method_with_value name, value
40
+ define_method_with_context name do
41
+ value
42
+ end
43
+ end
44
+
45
+ def define_method_noop name
46
+ define_method_with_context name do
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/named_arguments'
@@ -0,0 +1,59 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+ require 'test/unit'
3
+
4
+ class NamedArgumentsTest < Test::Unit::TestCase
5
+ class TestClassAttributeDefaults
6
+ include NamedArguments
7
+ attr_accessor :foo, :bar
8
+ attribute_defaults :foo => 3
9
+ attribute_defaults :bar => 'bar'
10
+ end
11
+
12
+ class TestClassRequiredFields
13
+ include NamedArguments
14
+ required_fields :foo, :bar
15
+ attr_accessor :foo, :bar
16
+ end
17
+
18
+ class TestClassTypeConverter
19
+ include NamedArguments
20
+ attr_accessor :foo
21
+ type_converter :foo, String
22
+ end
23
+
24
+ # attribute_defaults :color => 'blue', :size => lambda {|s| some_method_call(s)}
25
+ # required_fields :color, :name
26
+ # required_respond_to :name => :to_s
27
+ # required_kind_of? :size => Fixnum
28
+ # type_converter :size => Fixnum
29
+ def test_attribute_defaults
30
+ o = TestClassAttributeDefaults.new
31
+ assert_equal 3, o.foo
32
+ assert_equal 'bar', o.bar
33
+ o = TestClassAttributeDefaults.new :bar => 7
34
+ assert_equal 7, o.bar
35
+ end
36
+
37
+ def test_required_fields
38
+ assert_raises NamedArguments::ParameterRequired do
39
+ o = TestClassRequiredFields.new
40
+ end
41
+ end
42
+
43
+ def test_required_respond_to
44
+ end
45
+
46
+ def type_converter
47
+ o = TestClassTypeConverter.new :foo => 3
48
+ assert_equal '3', o.foo
49
+
50
+ o = TestClassTypeConverter.new :foo => 3
51
+ assert_equal '3', o.foo
52
+ end
53
+
54
+ def test_includes
55
+ t = TestClassTypeConverter.new
56
+ t.define_method_with_value :test_method, 7
57
+ assert_equal 7, t.test_method
58
+ end
59
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: namedarguments
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.0.3
7
- date: 2006-12-06 00:00:00 -08:00
8
- summary: Provide named arguments (hashes) to constructors to initialize attributes.
6
+ version: 0.0.5
7
+ date: 2007-06-03 00:00:00 -07:00
8
+ summary: The author was too lazy to write a summary
9
9
  require_paths:
10
10
  - lib
11
- email: james@phonesonrails.com
11
+ email: ryand-ruby@zenspider.com
12
12
  homepage: http://www.zenspider.com/ZSS/Products/namedarguments/
13
13
  rubyforge_project: namedarguments
14
- description: "Adds the ability to call class constructors with a hash of arguments to initialize attributes in the new object. == FEATURES/PROBLEMS: class Snark include NamedArguments attr_accessor :color, :size, :name attribute_defaults :color => 'blue', :size => lambda {|s| some_method_call(s)} required_fields :color, :name required_respond_to :name => :to_s required_kind_of? :size => Fixnum type_conversion :size => Fixnum end s = Snark.new :boojum => 7, :color => red == INSTALL:"
14
+ description: The author was too lazy to write a description
15
15
  autorequire:
16
16
  default_executable:
17
17
  bindir: bin
@@ -25,27 +25,31 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
- - James M Moore
30
+ - Ryan Davis
30
31
  files:
31
32
  - History.txt
32
33
  - Manifest.txt
33
34
  - README.txt
34
35
  - Rakefile
35
- - bin/named_arguments
36
36
  - lib/named_arguments.rb
37
- - lib/hash_extended_tools.rb
38
- - lib/singleton_creator_mixin.rb
39
- - lib/class_settings_mixin.rb
40
- - test/test_named_arguments.rb
37
+ - lib/named_arguments/class_settings_mixin.rb
38
+ - lib/named_arguments/hash_extended_tools.rb
39
+ - lib/named_arguments/method_extensions.rb
40
+ - test/unit/named_arguments_test.rb
41
+ - test/test_helper.rb
41
42
  test_files:
42
- - test/test_named_arguments.rb
43
- rdoc_options: []
44
-
45
- extra_rdoc_files: []
43
+ - test/test_helper.rb
44
+ rdoc_options:
45
+ - --main
46
+ - README.txt
47
+ extra_rdoc_files:
48
+ - History.txt
49
+ - Manifest.txt
50
+ - README.txt
51
+ executables: []
46
52
 
47
- executables:
48
- - named_arguments
49
53
  extensions: []
50
54
 
51
55
  requirements: []
@@ -58,5 +62,5 @@ dependencies:
58
62
  requirements:
59
63
  - - ">="
60
64
  - !ruby/object:Gem::Version
61
- version: 1.1.6
65
+ version: 1.2.1
62
66
  version:
File without changes
@@ -1,113 +0,0 @@
1
- require File.dirname(__FILE__) + '/singleton_creator_mixin'
2
-
3
- module ClassSettingsMixin
4
- def self.included target
5
- target.send :extend, ClassSettingsMixinClassMethods
6
- end
7
- end
8
-
9
- module ClassSettingsMixinClassMethods
10
- include SingletonMethodCreatorMixin
11
-
12
- # Allow you to define
13
- # methods that set a class value hash
14
- # and an accessor for that hash.
15
- #
16
- # Example:
17
- #
18
- # create_class_settings_method :settings
19
- #
20
- # creates:
21
- #
22
- # settings:: A class method that allows
23
- # you to set variables
24
- # settings?:: The current value of those variables
25
- #
26
- # class BlueCar
27
- # create_class_settings_method :settings
28
- # create_class_settings_method :has_these
29
- #
30
- # settings :color => :blue, :another_settting => 10
31
- # settings :painted => true
32
- # has_these :doors, :windows
33
- # has_these :wheels
34
- # end
35
- #
36
- # class Convertable < BlueCar
37
- # has_these :poptop
38
- # end
39
- #
40
- # BlueCar.color
41
- # => :blue
42
- #
43
- # BlueCar.new.settings?
44
- # => {:color => :blue, :painted => true, :another_settting => 10}
45
- def create_class_settings_method name
46
- # Build the class methods first
47
- l = class_setting_lambda name
48
- create_singleton_method name, l
49
-
50
- # Allow #name? to be called as an instance method
51
- # and default its return value to nil.
52
- # This will be replaced on any call to the
53
- # setter.
54
- value_name = value_field_identifier(name)
55
- instance_method = lambda {nil}
56
- define_method value_name, instance_method
57
- end
58
-
59
- protected
60
-
61
- # Returns a lambda that will create
62
- # two methods:
63
- #
64
- # A singleton method on the current object
65
- # that takes multiple parameters and
66
- # stores their values. This allows
67
- # you to define methods on the class
68
- # that will save their parameters.
69
- # An instance method that returns those
70
- # saved parameters
71
- def class_setting_lambda name #:nodoc:
72
- value_field_id = value_field_identifier name
73
- result = lambda do
74
- # Note that this lambda is called
75
- # either with a single argument
76
- # containing a hash, or an array
77
- # of arguments.
78
- |*args|
79
-
80
- if args.first.kind_of? Hash
81
- args = args.first
82
- end
83
-
84
- begin
85
- current_value = self.send value_field_id
86
- case current_value
87
- when Array then val = merge_arrays_of_symbols current_value, args
88
- when Hash then val = current_value.merge args
89
- else
90
- raise RuntimeError.new("Attempting to merge two different kinds of data")
91
- end
92
- rescue NoMethodError
93
- val = args
94
- end
95
-
96
- # Define the class method
97
- create_singleton_value_method value_field_id, val
98
-
99
- # Define the instance method
100
- define_method value_field_id, lambda {val}
101
- end
102
- result
103
- end
104
-
105
- def value_field_identifier name #:nodoc:
106
- return "#{name}?"
107
- end
108
-
109
- def merge_arrays_of_symbols a, b #:nodoc:
110
- result = a.map(&:to_sym) + b.map(&:to_sym)
111
- result.uniq
112
- end
113
- end
@@ -1,81 +0,0 @@
1
- # Provides several hash utilities.
2
- #
3
- # Note that you need to extend your hash with this module:
4
- #
5
- # hash = {}
6
- # hash.extend HashExtendedTools
7
- # hash = hash.exclude :foo, :bar
8
- #
9
- # Or create a new class:
10
- #
11
- # class HashWithExtendedTools < Hash
12
- # include HashExtendedTools
13
- # end
14
- module HashExtendedTools
15
- # Change keys in a hash.
16
- #
17
- # Pass in a hash of:
18
- #
19
- # old_key => new_key
20
- #
21
- # Any keys matching +old_key+ will be
22
- # deleted and a new entry created with
23
- # the same value and the new key.
24
- def switch_keys args = {}
25
- args.each_pair do
26
- |old_key, new_key|
27
- if self.has_key?(old_key)
28
- self[new_key] = self[old_key]
29
- delete(old_key)
30
- end
31
- end
32
- end
33
-
34
- # Return a new hash not including
35
- # keys that are contained in
36
- # +keys_to_exclude+.
37
- #
38
- # Keys that match entries in
39
- # +keys_to_exclude+ are deleted if
40
- # either they match as string or a
41
- # symbol (created with to_sym).
42
- def exclude *keys_to_exclude
43
- result = self.dup
44
- keys_to_exclude.each do |k|
45
- result.delete k.to_s
46
- result.delete k.to_sym
47
- end
48
- result
49
- end
50
-
51
- # Given an array of keys,
52
- # return a hash containing
53
- # the key/value pairs
54
- # for the matching keys.
55
- #
56
- # Values that are nil are not
57
- # returned.
58
- def slice *slice_keys
59
- result = {}
60
- slice_keys.each do |k|
61
- result[k] = self[k] unless self[k].nil?
62
- end
63
- result
64
- end
65
-
66
- # Return the given attributes as a hash containing
67
- # attribute => value pairs.
68
- #
69
- # obj.a = 10
70
- # obj.b = 20
71
- # attributes_as_hash(:a, :b)
72
- # => {:a => 10, :b => 20}
73
- def attributes_as_hash *attrs
74
- result = {}
75
- attrs.each do |a|
76
- v = self.send a
77
- result[a] = v unless v.nil?
78
- end
79
- result
80
- end
81
- end
@@ -1,29 +0,0 @@
1
- module SingletonMethodCreatorMixin
2
- # Create a method out of a
3
- # name and a lambda.
4
- #
5
- # Example:
6
- #
7
- # my_lambda = lambda {13}
8
- # create_singleton_method :return_13, my_lambda
9
- #
10
- # assert 13 == self.return_13
11
- def create_singleton_method method_name, lambda_obj
12
- sclass = class << self; self end
13
- sclass.send(:define_method, method_name, lambda_obj)
14
- sclass.send(:public, method_name)
15
- end
16
-
17
- # Create a method out of a
18
- # value and a name
19
- # The method will return the value.
20
- #
21
- # Example:
22
- #
23
- # create_singleton_value_method :return_14, 14
24
- #
25
- # assert 14 == self.return_14
26
- def create_singleton_value_method name, value
27
- create_singleton_method(name, lambda { value })
28
- end
29
- end
File without changes