sinclair 1.9.0 → 1.10.0
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 +4 -4
- data/.rubocop.yml +1 -1
- data/README.md +2 -2
- data/config/yardstick.yml +7 -1
- data/lib/sinclair/configurable.rb +2 -0
- data/lib/sinclair/equals_checker.rb +2 -0
- data/lib/sinclair/matchers/add_class_method.rb +27 -36
- data/lib/sinclair/matchers/add_instance_method.rb +59 -59
- data/lib/sinclair/matchers/add_method.rb +33 -35
- data/lib/sinclair/matchers/change_class_method.rb +22 -16
- data/lib/sinclair/matchers/change_instance_method.rb +46 -16
- data/lib/sinclair/matchers.rb +2 -8
- data/lib/sinclair/method_builder/call_method_builder.rb +49 -0
- data/lib/sinclair/method_builder.rb +4 -1
- data/lib/sinclair/method_definition/call_definition.rb +52 -0
- data/lib/sinclair/method_definition/string_definition.rb +0 -2
- data/lib/sinclair/method_definition.rb +40 -24
- data/lib/sinclair/method_definitions.rb +21 -1
- data/lib/sinclair/options/builder.rb +8 -0
- data/lib/sinclair/options.rb +1 -13
- data/lib/sinclair/version.rb +1 -1
- data/spec/integration/yard/sinclair/matchers/change_class_method_spec.rb +24 -0
- data/spec/integration/yard/sinclair/matchers/change_instance_method_spec.rb +40 -0
- data/spec/lib/sinclair/method_builder/call_method_builder_spec.rb +76 -0
- data/spec/lib/sinclair/method_builder_spec.rb +63 -20
- data/spec/lib/sinclair/method_definition/call_definition_spec.rb +36 -0
- data/spec/lib/sinclair/method_definition_spec.rb +64 -0
- data/spec/lib/sinclair/method_definitions_spec.rb +79 -0
- data/spec/lib/sinclair/options/builder_spec.rb +13 -0
- data/spec/lib/sinclair/options/class_methods_spec.rb +23 -8
- data/spec/support/shared_examples/attribute_accessor.rb +103 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a3575c54efcf82ce477b70a6a34b6f6d37d6242b2c272454b141942ee90e381
|
4
|
+
data.tar.gz: fdae2230f95d50d239537f01dace6b278b7930cef96115667b424910d7106c78
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 424c2bd3b847482b32b45da5f3778c724c967fff11a14fdb5664e1d9b61fd0c484dc00e5f938739ffa46d3f04fcce7614ee9ed55b2fa3c3151af24a543b9d20e
|
7
|
+
data.tar.gz: 5094b1a51ae631f01163015b97131f7aaf78b349ca959f326823939de6b4205da8d64d750fad32837bdb28e74b76888644cf1518d9d51cdd2baba5318f61e595
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -13,11 +13,11 @@ This gem helps the creation of complex gems/concerns
|
|
13
13
|
that enables creation of methods on the fly through class
|
14
14
|
methods
|
15
15
|
|
16
|
-
Next release: [1.
|
16
|
+
Next release: [1.11.0](https://github.com/darthjee/sinclair/compare/1.10.0...master)
|
17
17
|
|
18
18
|
Yard Documentation
|
19
19
|
-------------------
|
20
|
-
[https://www.rubydoc.info/gems/sinclair/1.
|
20
|
+
[https://www.rubydoc.info/gems/sinclair/1.10.0](https://www.rubydoc.info/gems/sinclair/1.10.0)
|
21
21
|
|
22
22
|
Installation
|
23
23
|
---------------
|
data/config/yardstick.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
threshold:
|
1
|
+
threshold: 100
|
2
2
|
require_exact_threshold: false
|
3
3
|
rules:
|
4
4
|
ApiTag::Presence:
|
@@ -23,6 +23,10 @@ rules:
|
|
23
23
|
- Sinclair::Options#==
|
24
24
|
- Sinclair::OptionsParser#options
|
25
25
|
- Sinclair::OptionsParser#options_object
|
26
|
+
- Sinclair::Matchers#add_method
|
27
|
+
- Sinclair::Matchers#add_class_method
|
28
|
+
- Sinclair::Matchers#change_method
|
29
|
+
- Sinclair::Matchers#change_class_method
|
26
30
|
ReturnTag:
|
27
31
|
enabled: true
|
28
32
|
exclude:
|
@@ -50,7 +54,9 @@ rules:
|
|
50
54
|
- Sinclair::Matchers::ChangeInstanceMethodOn#initialize
|
51
55
|
- Sinclair::MethodBuilder
|
52
56
|
- Sinclair::MethodBuilder::Base#initialize
|
57
|
+
- Sinclair::MethodBuilder::Accessor#initialize
|
53
58
|
- Sinclair::MethodDefinition#initialize
|
59
|
+
- Sinclair::MethodDefinition::CallDefinition#initialize
|
54
60
|
- Sinclair::MethodDefinition::BlockDefinition#initialize
|
55
61
|
- Sinclair::MethodDefinition::StringDefinition#initialize
|
56
62
|
- Sinclair::Options#initialize
|
@@ -81,6 +81,8 @@ class Sinclair
|
|
81
81
|
# @method as_options(options_hash = {})
|
82
82
|
# @api public
|
83
83
|
#
|
84
|
+
# Returns options with configurated values
|
85
|
+
#
|
84
86
|
# @param (see Sinclair::Config#as_options)
|
85
87
|
# @return (see Sinclair::Config#as_options)
|
86
88
|
# @example (see Sinclair::Config#as_options)
|
@@ -6,33 +6,33 @@ class Sinclair
|
|
6
6
|
# @author darthjee
|
7
7
|
#
|
8
8
|
# AddClassMethod is able to build an instance of {Sinclair::Matchers::AddClassMethodTo}
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
9
|
+
class AddClassMethod < AddMethod
|
10
|
+
# @method #to(target = nil)
|
11
|
+
# @example Checking if a class had a class method added
|
12
|
+
# RSpec.configure do |config|
|
13
|
+
# config.include Sinclair::Matchers
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# class MyModel
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# RSpec.describe 'MyBuilder' do
|
20
|
+
# let(:clazz) { Class.new(MyModel) }
|
21
|
+
#
|
22
|
+
# let(:block) do
|
23
|
+
# proc do
|
24
|
+
# clazz.define_singleton_method(:new_method) { 2 }
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
#
|
28
|
+
# it do
|
29
|
+
# expect(&block).to add_class_method(:new_method).to(clazz)
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# # outputs
|
34
|
+
# # should add method class_method 'new_method' to #<Class:0x000055b4d0a25c80>
|
35
|
+
with_final_matcher :to, AddClassMethodTo
|
36
36
|
|
37
37
|
private
|
38
38
|
|
@@ -45,15 +45,6 @@ class Sinclair
|
|
45
45
|
'You should specify which class the method is being added to' \
|
46
46
|
"add_class_method(:#{method_name}).to(klass)"
|
47
47
|
end
|
48
|
-
|
49
|
-
# @private
|
50
|
-
#
|
51
|
-
# Class of the real matcher
|
52
|
-
#
|
53
|
-
# @return [Class<Sinclair::Matchers::Base>]
|
54
|
-
def add_method_to_class
|
55
|
-
AddClassMethodTo
|
56
|
-
end
|
57
48
|
end
|
58
49
|
end
|
59
50
|
end
|
@@ -7,56 +7,65 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# AddInstanceMethod is able to build an instance of {Sinclair::Matchers::AddInstanceMethodTo}
|
9
9
|
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
10
|
+
class AddInstanceMethod < AddMethod
|
11
|
+
# @example Using inside RSpec and checking an instance method being added
|
12
|
+
# RSpec.configure do |config|
|
13
|
+
# config.include Sinclair::Matchers
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# class MyModel
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# RSpec.describe "MyBuilder" do
|
20
|
+
# let(:clazz) { Class.new(MyModel) }
|
21
|
+
# let(:builder) { Sinclair.new(clazz) }
|
22
|
+
#
|
23
|
+
# before do
|
24
|
+
# builder.add_method(:new_method, "2")
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# it do
|
28
|
+
# expect { builder.build }.to add_method(:new_method).to(clazz)
|
29
|
+
# end
|
30
|
+
# end
|
31
|
+
#
|
32
|
+
# # Outputs
|
33
|
+
# # 'should add method 'new_method' to #<Class:0x000056441bf46608> instances'
|
34
|
+
#
|
35
|
+
# @example Using inside RSpec and checking instance
|
36
|
+
# RSpec.configure do |config|
|
37
|
+
# config.include Sinclair::Matchers
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# class MyModel
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# RSpec.describe "MyBuilder" do
|
44
|
+
# let(:clazz) { Class.new(MyModel) }
|
45
|
+
# let(:builder) { Sinclair.new(clazz) }
|
46
|
+
# let(:instance) { clazz.new }
|
47
|
+
#
|
48
|
+
# before do
|
49
|
+
# builder.add_method(:the_method, "true")
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# it do
|
53
|
+
# expect { builder.build }.to add_method(:the_method).to(instance)
|
54
|
+
# end
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# # Outputs
|
58
|
+
# # 'should add method 'the_method' to #<Class:0x000056441bf46608> instances'
|
59
|
+
with_final_matcher :to, AddInstanceMethodTo
|
60
|
+
|
61
|
+
# @method to(target = nil)
|
62
|
+
# @api public
|
63
|
+
#
|
64
|
+
# The matcher checks if an instance method was added to a class
|
65
|
+
#
|
66
|
+
# @param (see AddMethod#to)
|
67
|
+
#
|
68
|
+
# @return [AddClassMethodTo]
|
60
69
|
|
61
70
|
private
|
62
71
|
|
@@ -69,15 +78,6 @@ class Sinclair
|
|
69
78
|
'You should specify which instance the method is being added to' \
|
70
79
|
"add_method(:#{method_name}).to(instance)"
|
71
80
|
end
|
72
|
-
|
73
|
-
# @private
|
74
|
-
#
|
75
|
-
# Class of the real matcher
|
76
|
-
#
|
77
|
-
# @return [Class<Sinclair::Matchers::Base>]
|
78
|
-
def add_method_to_class
|
79
|
-
AddInstanceMethodTo
|
80
|
-
end
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -4,41 +4,39 @@ class Sinclair
|
|
4
4
|
module Matchers
|
5
5
|
# @api private
|
6
6
|
#
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def to(target = nil)
|
41
|
-
add_method_to_class.new(target, method_name)
|
7
|
+
# Common methods for matchers
|
8
|
+
class AddMethod < Base
|
9
|
+
class << self
|
10
|
+
private
|
11
|
+
|
12
|
+
# @api private
|
13
|
+
# @private
|
14
|
+
#
|
15
|
+
# Add a method to generate the final matcher
|
16
|
+
#
|
17
|
+
# @param name [String,Symbol] the name of the method
|
18
|
+
# @param matcher_class [Class<AddMethodTo>] The matcher class to be returned
|
19
|
+
#
|
20
|
+
# @return (see Sinclair#build)
|
21
|
+
#
|
22
|
+
# @!macro with_final_matcher
|
23
|
+
# @!method $1(target = nil)
|
24
|
+
# @api public
|
25
|
+
#
|
26
|
+
# Builds final matcher
|
27
|
+
#
|
28
|
+
# The matcher checks if a method was added
|
29
|
+
# to a class or instance
|
30
|
+
#
|
31
|
+
# @param [Class,Object] target where the method will be added
|
32
|
+
#
|
33
|
+
# @return [$2]
|
34
|
+
def with_final_matcher(name, matcher_class)
|
35
|
+
matcher = matcher_class
|
36
|
+
Sinclair.new(self).tap do |builder|
|
37
|
+
builder.add_method(name) { |target| matcher.new(target, method_name) }
|
38
|
+
end.build
|
39
|
+
end
|
42
40
|
end
|
43
41
|
|
44
42
|
# @abstract
|
@@ -7,15 +7,30 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# AddInstanceMethod is able to build an instance of
|
9
9
|
# {Sinclair::Matchers::ChangeClassMethodOn}
|
10
|
-
class ChangeClassMethod <
|
11
|
-
|
12
|
-
|
13
|
-
#
|
10
|
+
class ChangeClassMethod < AddMethod
|
11
|
+
# @example Checking if a class method has changed
|
12
|
+
# RSpec.configure do |config|
|
13
|
+
# config.include Sinclair::Matchers
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# class MyModel
|
17
|
+
# end
|
14
18
|
#
|
15
|
-
#
|
19
|
+
# RSpec.describe 'my test' do
|
20
|
+
# let(:builder) { Sinclair.new(klass) }
|
21
|
+
# let(:klass) { Class.new(MyModel) }
|
16
22
|
#
|
17
|
-
#
|
18
|
-
|
23
|
+
# before do
|
24
|
+
# builder.add_class_method(:the_method) { 10 }
|
25
|
+
# builder.build
|
26
|
+
# builder.add_class_method(:the_method) { 20 }
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# it do
|
30
|
+
# expect{ builder.build }.to change_class_method(:the_method).on(klass)
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
with_final_matcher :on, ChangeClassMethodOn
|
19
34
|
|
20
35
|
private
|
21
36
|
|
@@ -28,15 +43,6 @@ class Sinclair
|
|
28
43
|
'You should specify which class the method is being changed on' \
|
29
44
|
"change_class_method(:#{method_name}).on(klass)"
|
30
45
|
end
|
31
|
-
|
32
|
-
# @private
|
33
|
-
#
|
34
|
-
# Class of the real matcher
|
35
|
-
#
|
36
|
-
# @return [Class<ChangeClassMethodOn>]
|
37
|
-
def add_method_to_class
|
38
|
-
ChangeClassMethodOn
|
39
|
-
end
|
40
46
|
end
|
41
47
|
end
|
42
48
|
end
|
@@ -7,15 +7,54 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# AddInstanceMethod is able to build an instance of
|
9
9
|
# {Sinclair::Matchers::ChangeInstanceMethodOn}
|
10
|
-
class ChangeInstanceMethod <
|
11
|
-
|
12
|
-
|
13
|
-
#
|
10
|
+
class ChangeInstanceMethod < AddMethod
|
11
|
+
# @example Checking if an instance method has changed
|
12
|
+
# RSpec.configure do |config|
|
13
|
+
# config.include Sinclair::Matchers
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# class MyModel
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# RSpec.describe 'my test' do
|
20
|
+
# let(:builder) { Sinclair.new(klass) }
|
21
|
+
# let(:klass) { Class.new(MyModel) }
|
22
|
+
#
|
23
|
+
# before do
|
24
|
+
# builder.add_method(:the_method) { 10 }
|
25
|
+
# builder.build
|
26
|
+
# builder.add_method(:the_method) { 20 }
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# it do
|
30
|
+
# expect{ builder.build }.to change_method(:the_method).on(klass)
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @example Checking if an instance method has changed on an instance
|
35
|
+
# RSpec.configure do |config|
|
36
|
+
# config.include Sinclair::Matchers
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# class MyModel
|
40
|
+
# end
|
14
41
|
#
|
15
|
-
#
|
42
|
+
# RSpec.describe 'my test' do
|
43
|
+
# let(:builder) { Sinclair.new(klass) }
|
44
|
+
# let(:instance) { klass.new }
|
45
|
+
# let(:klass) { Class.new(MyModel) }
|
16
46
|
#
|
17
|
-
#
|
18
|
-
|
47
|
+
# before do
|
48
|
+
# builder.add_method(:the_method) { 10 }
|
49
|
+
# builder.build
|
50
|
+
# builder.add_method(:the_method) { 20 }
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# it do
|
54
|
+
# expect{ builder.build }.to change_method(:the_method).on(instance)
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
with_final_matcher :on, ChangeInstanceMethodOn
|
19
58
|
|
20
59
|
private
|
21
60
|
|
@@ -28,15 +67,6 @@ class Sinclair
|
|
28
67
|
'You should specify which instance the method is being changed on' \
|
29
68
|
"change_method(:#{method_name}).on(instance)"
|
30
69
|
end
|
31
|
-
|
32
|
-
# @private
|
33
|
-
#
|
34
|
-
# Class of the real matcher
|
35
|
-
#
|
36
|
-
# @return [Class<Sinclair::Matchers::Base>]
|
37
|
-
def add_method_to_class
|
38
|
-
ChangeInstanceMethodOn
|
39
|
-
end
|
40
70
|
end
|
41
71
|
end
|
42
72
|
end
|
data/lib/sinclair/matchers.rb
CHANGED
@@ -6,8 +6,6 @@ class Sinclair
|
|
6
6
|
#
|
7
7
|
# Matchers module will have the DSL to be included in RSpec in order to have
|
8
8
|
# access to the matchers
|
9
|
-
#
|
10
|
-
# @example (see Sinclair::Matchers::AddMethod#to)
|
11
9
|
module Matchers
|
12
10
|
autoload :Base, 'sinclair/matchers/base'
|
13
11
|
autoload :AddInstanceMethod, 'sinclair/matchers/add_instance_method'
|
@@ -25,7 +23,6 @@ class Sinclair
|
|
25
23
|
|
26
24
|
# DSL to AddInstanceMethod
|
27
25
|
#
|
28
|
-
# @example (see Sinclair::Matchers)
|
29
26
|
# @example (see Sinclair::Matchers::AddInstanceMethod#to)
|
30
27
|
#
|
31
28
|
# @return [AddInstanceMethod] RSpec Matcher
|
@@ -35,7 +32,6 @@ class Sinclair
|
|
35
32
|
|
36
33
|
# DSL to AddClassMethod
|
37
34
|
#
|
38
|
-
# @example (see Sinclair::Matchers)
|
39
35
|
# @example (see Sinclair::Matchers::AddClassMethod#to)
|
40
36
|
#
|
41
37
|
# @return [AddClassMethod] RSpec Matcher
|
@@ -45,8 +41,7 @@ class Sinclair
|
|
45
41
|
|
46
42
|
# DSL to ChangeInstanceMethod
|
47
43
|
#
|
48
|
-
# @example (see Sinclair::Matchers)
|
49
|
-
# @example (see Sinclair::Matchers::ChangeInstanceMethod#to)
|
44
|
+
# @example (see Sinclair::Matchers::ChangeInstanceMethod#on)
|
50
45
|
#
|
51
46
|
# @return [ChangeInstanceMethod] RSpec Matcher
|
52
47
|
def change_method(method_name)
|
@@ -55,8 +50,7 @@ class Sinclair
|
|
55
50
|
|
56
51
|
# DSL to ChangeClassMethod
|
57
52
|
#
|
58
|
-
# @example (see Sinclair::Matchers)
|
59
|
-
# @example (see Sinclair::Matchers::ChangeClassMethod#to)
|
53
|
+
# @example (see Sinclair::Matchers::ChangeClassMethod#on)
|
60
54
|
#
|
61
55
|
# @return [ChangeClassMethod] RSpec Matcher
|
62
56
|
def change_class_method(method_name)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Sinclair
|
4
|
+
class MethodBuilder
|
5
|
+
# @api private
|
6
|
+
# @author darthjee
|
7
|
+
#
|
8
|
+
# Build a method based on a {MethodDefinition::CallDefinition}
|
9
|
+
class CallMethodBuilder < Base
|
10
|
+
# Builds the method
|
11
|
+
#
|
12
|
+
# @return [NilClass]
|
13
|
+
def build
|
14
|
+
klass.module_eval(code_line, __FILE__, __LINE__ + 1)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# @api private
|
20
|
+
# @private
|
21
|
+
#
|
22
|
+
# String to be evaluated when building the method
|
23
|
+
#
|
24
|
+
# This can be {code_string} or {class_code_string}
|
25
|
+
# @return (see MethodDefinition::CallDefinition#code_string)
|
26
|
+
def code_line
|
27
|
+
instance? ? code_string : class_code_string
|
28
|
+
end
|
29
|
+
|
30
|
+
delegate :code_string, :class_code_string, to: :definition
|
31
|
+
|
32
|
+
# @method code_string
|
33
|
+
# @private
|
34
|
+
# @api private
|
35
|
+
#
|
36
|
+
# Delegated from {MethodDefinition::CallDefinition}
|
37
|
+
#
|
38
|
+
# @see MethodDefinition::CallDefinition#code_string
|
39
|
+
# @return [String]
|
40
|
+
|
41
|
+
# @method class_code_string
|
42
|
+
# @private
|
43
|
+
# @api private
|
44
|
+
#
|
45
|
+
# @see MethodDefinition::CallDefinition#class_code_string
|
46
|
+
# @return [String]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -9,6 +9,7 @@ class Sinclair
|
|
9
9
|
autoload :Base, 'sinclair/method_builder/base'
|
10
10
|
autoload :StringMethodBuilder, 'sinclair/method_builder/string_method_builder'
|
11
11
|
autoload :BlockMethodBuilder, 'sinclair/method_builder/block_method_builder'
|
12
|
+
autoload :CallMethodBuilder, 'sinclair/method_builder/call_method_builder'
|
12
13
|
|
13
14
|
CLASS_METHOD = :class
|
14
15
|
INSTANCE_METHOD = :instance
|
@@ -53,8 +54,10 @@ class Sinclair
|
|
53
54
|
def build_from_definition(definition, type)
|
54
55
|
if definition.string?
|
55
56
|
StringMethodBuilder.new(klass, definition, type: type).build
|
56
|
-
|
57
|
+
elsif definition.block?
|
57
58
|
BlockMethodBuilder.new(klass, definition, type: type).build
|
59
|
+
else
|
60
|
+
CallMethodBuilder.new(klass, definition, type: type).build
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Sinclair
|
4
|
+
class MethodDefinition
|
5
|
+
# @api private
|
6
|
+
# @author darthjee
|
7
|
+
#
|
8
|
+
# Define a call of method to e done within the class
|
9
|
+
class CallDefinition < MethodDefinition
|
10
|
+
# @param method_name [Symbol] method to be called
|
11
|
+
# @param arguments [Array<Symbol,String>] parameters to be passed as
|
12
|
+
# arguments to the call
|
13
|
+
def initialize(method_name, *arguments)
|
14
|
+
@arguments = arguments
|
15
|
+
super(method_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
default_value :block?, false
|
19
|
+
default_value :string?, false
|
20
|
+
|
21
|
+
# String to be executed within the class
|
22
|
+
# @return [String]
|
23
|
+
def code_string
|
24
|
+
"#{name} :#{arguments.join(', :')}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# String to be executed within the class running code to change the class itself
|
28
|
+
#
|
29
|
+
# @see code_string
|
30
|
+
# @return [String]
|
31
|
+
def class_code_string
|
32
|
+
<<-CODE
|
33
|
+
class << self
|
34
|
+
#{code_string}
|
35
|
+
end
|
36
|
+
CODE
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
attr_reader :arguments
|
42
|
+
|
43
|
+
# @method arguments
|
44
|
+
# @api private
|
45
|
+
# @private
|
46
|
+
#
|
47
|
+
# parameters to be passed as arguments to the call
|
48
|
+
#
|
49
|
+
# @return [Array<Symbol,String>]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|