option_initializer 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -15,24 +15,39 @@ require 'option_initializer'
15
15
 
16
16
  class Person
17
17
  include OptionInitializer
18
- option_initializer :id, :name, :age
18
+ option_initializer :id, :name, :age, :greetings
19
19
 
20
20
  def initialize opts
21
21
  @options = opts
22
22
  end
23
23
 
24
24
  def say_hello
25
- puts "Hi, I'm #{@options[:name]}!"
25
+ puts @options[:greetings].call @options[:name]
26
26
  end
27
27
  end
28
28
 
29
29
  # Then
30
- john = Person.name('John Doe').age(19).id(1000).new
30
+ john = Person.
31
+ name('John Doe').
32
+ age(19).
33
+ greetings { |name| "Hi, I'm #{name}!" }.
34
+ id(1000).
35
+ new
31
36
 
32
37
  # becomes equivalent to
33
- john = Person.new :id => 1000, :name => 'John Doe', :age => 19
38
+ john = Person.new(
39
+ :id => 1000,
40
+ :name => 'John Doe',
41
+ :age => 19,
42
+ :greetings => proc { |name| "Hi, I'm #{name}!" }
43
+ )
34
44
 
35
45
  # Method call shortcut
36
- Person.name('John Doe').age(19).id(1000).say_hello
46
+ Person.
47
+ name('John Doe').
48
+ age(19).
49
+ greetings { |name| "Hi, I'm #{name}!" }.
50
+ id(1000).
51
+ say_hello
37
52
  ```
38
53
 
@@ -11,7 +11,7 @@ module OptionInitializer
11
11
  @options = options
12
12
  end
13
13
 
14
- def new *args
14
+ def new *args, &block
15
15
  args = args.dup
16
16
  opts = @options
17
17
 
@@ -22,7 +22,7 @@ module OptionInitializer
22
22
  args << opts.dup
23
23
  end
24
24
 
25
- @base.new(*args)
25
+ @base.new(*args, &block)
26
26
  end
27
27
 
28
28
  def merge opts
@@ -37,9 +37,14 @@ module OptionInitializer
37
37
  raise NoMethodError, "undefined method `#{sym}' for #{self}"
38
38
  end
39
39
  end
40
- } unless base.constants.include?(:OptionInitializing)
40
+ } unless base.constants.map(&:to_sym).include?(:OptionInitializing)
41
41
 
42
42
  base.class_eval do
43
+ class << self
44
+ if method_defined?(:option_initializer)
45
+ undef_method(:option_initializer)
46
+ end
47
+ end
43
48
  def base.option_initializer *syms
44
49
  oi = self.const_get(:OptionInitializing)
45
50
 
@@ -48,8 +53,19 @@ module OptionInitializer
48
53
  self.class_eval do
49
54
  # define_singleton_method not available on 1.8
50
55
  singleton = class << self; self end
51
- singleton.send :define_method, sym do |v|
52
- oi.new self, sym => v
56
+ singleton.send :undef_method, sym if singleton.method_defined?(sym)
57
+ singleton.send :define_method, sym do |*v, &b|
58
+ if b && v.empty?
59
+ oi.new self, sym => b
60
+ elsif b && !v.empty?
61
+ raise ArgumentError,
62
+ "wrong number of arguments (#{v.length} for 0 when block given)"
63
+ elsif v.length == 1
64
+ oi.new self, sym => v.first
65
+ else
66
+ raise ArgumentError,
67
+ "wrong number of arguments (#{v.length} for 1)"
68
+ end
53
69
  end
54
70
  end
55
71
  end
@@ -57,8 +73,19 @@ module OptionInitializer
57
73
  # Instance methods
58
74
  oi.class_eval do
59
75
  syms.each do |sym|
60
- define_method(sym) do |v|
61
- merge(sym => v)
76
+ undef_method(sym) if method_defined?(sym)
77
+ define_method(sym) do |*v, &b|
78
+ if b && v.empty?
79
+ merge(sym => b)
80
+ elsif b && !v.empty?
81
+ raise ArgumentError,
82
+ "wrong number of arguments (#{v.length} for 0 when block given)"
83
+ elsif v.length == 1
84
+ merge(sym => v.first)
85
+ else
86
+ raise ArgumentError,
87
+ "wrong number of arguments (#{v.length} for 1)"
88
+ end
62
89
  end
63
90
  end
64
91
  end
@@ -1,3 +1,3 @@
1
1
  module OptionInitializer
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -7,19 +7,24 @@ require 'option_initializer'
7
7
  class MyClass
8
8
  include OptionInitializer
9
9
  option_initializer :aaa, :bbb
10
- option_initializer :ccc
10
+ option_initializer :ccc, :ddd
11
+ option_initializer :ccc, :ddd
11
12
 
12
- attr_reader :a, :b, :options
13
+ attr_reader :a, :b, :options, :y
13
14
 
14
15
  def initialize a, b, opts
15
16
  @a = a
16
17
  @b = b
17
18
  @options = opts
19
+
20
+ @y = yield if block_given?
18
21
  end
19
22
  end
20
23
 
21
24
  class MyClass2
22
25
  include OptionInitializer
26
+ include OptionInitializer
27
+
23
28
  option_initializer :aaa, :bbb, :ccc
24
29
 
25
30
  def initialize options
@@ -35,25 +40,43 @@ class MyClass2
35
40
  end
36
41
  end
37
42
 
43
+ # Excerpt from README
44
+ class Person
45
+ include OptionInitializer
46
+ option_initializer :id, :name, :age, :greetings
47
+
48
+ def initialize opts
49
+ @options = opts
50
+ end
51
+
52
+ def say_hello
53
+ puts @options[:greetings].call @options[:name]
54
+ end
55
+ end
56
+
38
57
  class TestOptionInitializer < MiniTest::Unit::TestCase
39
58
  def test_oi
40
- o = MyClass.aaa(1).bbb(2).ccc(3).new(1, 2)
59
+ o = MyClass.aaa(1).bbb(2).ddd { 4 }.ccc(3).new(1, 2)
41
60
  assert_equal 1, o.options[:aaa]
42
61
  assert_equal 2, o.options[:bbb]
43
62
  assert_equal 3, o.options[:ccc]
63
+ assert_equal 4, o.options[:ddd].call
44
64
  assert_equal 1, o.a
45
65
  assert_equal 2, o.b
66
+ assert_equal nil, o.y
46
67
 
47
- o = MyClass.aaa(1).bbb(2).ccc(3).aaa(4).new(1, 2, :ddd => 4)
68
+ o = MyClass.aaa(1).bbb(2).ccc(3).aaa(4).new(1, 2, :ddd => 4) { :y }
48
69
  assert_equal 4, o.options[:aaa]
49
70
  assert_equal 2, o.options[:bbb]
50
71
  assert_equal 3, o.options[:ccc]
51
72
  assert_equal 4, o.options[:ddd]
52
73
  assert_equal 1, o.a
53
74
  assert_equal 2, o.b
75
+ assert_equal :y, o.y
54
76
 
55
77
  assert_instance_of MyClass::OptionInitializing, MyClass.aaa(1)
56
78
 
79
+ assert_raises(ArgumentError) { MyClass.aaa(1) { 1 } }
57
80
  assert_raises(ArgumentError) { MyClass.aaa(1, 2) }
58
81
  assert_raises(ArgumentError) { MyClass.aaa(1).new(1) }
59
82
  assert_raises(ArgumentError) { MyClass.aaa(1).new(1, 2, 3) }
@@ -63,5 +86,11 @@ class TestOptionInitializer < MiniTest::Unit::TestCase
63
86
  assert_equal 2, MyClass2.aaa(1).bbb(2).num_options(true)
64
87
  assert_equal 2, MyClass2.aaa(1).bbb(2).echo(1) { |a| a * 2 }
65
88
  end
89
+
90
+ def test_readme
91
+ john = Person.name('John Doe').age(19).greetings { |name| "Hi, I'm #{name}!" }.id(1000).new
92
+ john = Person.new :id => 1000, :name => 'John Doe', :age => 19, :greetings => proc { |name| "Hi, I'm #{name}!" }
93
+ Person.name('John Doe').age(19).greetings { |name| "Hi, I'm #{name}!" }.id(1000).say_hello
94
+ end
66
95
  end
67
96
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: option_initializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
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: 2013-02-24 00:00:00.000000000 Z
12
+ date: 2013-02-25 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Object construction with method chaining
15
15
  email: