sinclair 1.10.0 → 1.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/README.md +414 -324
- data/config/check_specs.yml +3 -4
- data/config/yardstick.yml +2 -0
- data/lib/sinclair/matchers/add_class_method.rb +0 -1
- data/lib/sinclair/method_builder/base.rb +17 -2
- data/lib/sinclair/method_builder/call_method_builder.rb +21 -21
- data/lib/sinclair/method_builder.rb +5 -20
- data/lib/sinclair/method_definition/block_definition.rb +2 -0
- data/lib/sinclair/method_definition/call_definition.rb +15 -18
- data/lib/sinclair/method_definition/string_definition.rb +2 -0
- data/lib/sinclair/method_definition.rb +41 -3
- data/lib/sinclair/method_definitions.rb +20 -22
- data/lib/sinclair/version.rb +1 -1
- data/lib/sinclair.rb +149 -62
- data/spec/integration/readme/sinclair/types_of_definition_spec.rb +47 -0
- data/spec/integration/yard/sinclair/add_class_method_spec.rb +51 -0
- data/spec/integration/yard/sinclair/add_method_spec.rb +60 -0
- data/spec/integration/yard/sinclair/eval_and_add_method_spec.rb +26 -0
- data/spec/integration/yard/sinclair_spec.rb +0 -83
- data/spec/lib/sinclair/method_builder/base_spec.rb +15 -0
- data/spec/lib/sinclair/method_definition/call_definition_spec.rb +14 -17
- data/spec/lib/sinclair/method_definition_spec.rb +67 -2
- data/spec/lib/sinclair/method_definitions_spec.rb +15 -16
- data/spec/lib/sinclair_spec.rb +6 -160
- data/spec/support/models/dummy_builder.rb +4 -1
- data/spec/support/models/dummy_class_builder.rb +3 -0
- data/spec/support/models/person.rb +1 -1
- data/spec/support/shared_examples/sinclair.rb +112 -0
- metadata +8 -2
data/config/check_specs.yml
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
ignore:
|
2
2
|
- lib/sinclair/comparable/class_methods.rb
|
3
|
+
- lib/sinclair/exception.rb
|
3
4
|
- lib/sinclair/matchers/add_method_to.rb
|
4
5
|
- lib/sinclair/matchers/add_method.rb
|
5
|
-
- lib/sinclair/version.rb
|
6
|
-
- lib/sinclair/method_builder/base.rb
|
7
|
-
- lib/sinclair/exception.rb
|
8
|
-
- lib/sinclair/matchers/method_to.rb
|
9
6
|
- lib/sinclair/matchers/base.rb
|
7
|
+
- lib/sinclair/matchers/method_to.rb
|
10
8
|
- lib/sinclair/matchers/change_method_on.rb
|
9
|
+
- lib/sinclair/version.rb
|
data/config/yardstick.yml
CHANGED
@@ -7,7 +7,6 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# AddClassMethod is able to build an instance of {Sinclair::Matchers::AddClassMethodTo}
|
9
9
|
class AddClassMethod < AddMethod
|
10
|
-
# @method #to(target = nil)
|
11
10
|
# @example Checking if a class had a class method added
|
12
11
|
# RSpec.configure do |config|
|
13
12
|
# config.include Sinclair::Matchers
|
@@ -7,6 +7,21 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# Base class responsible for building methods
|
9
9
|
class Base
|
10
|
+
# Instantiate the class and build the method
|
11
|
+
#
|
12
|
+
# @param klass [Class] class to receive the method
|
13
|
+
# @param definition [MethodDefinition] method defined
|
14
|
+
# @param type [Symbol] type of method to be build
|
15
|
+
# - +:instance+ instance methods
|
16
|
+
# - +:class+ class methods
|
17
|
+
#
|
18
|
+
# @see #build
|
19
|
+
#
|
20
|
+
# @return [Symbol] name of the method built
|
21
|
+
def self.build(klass, definition, type:)
|
22
|
+
new(klass, definition, type: type).build
|
23
|
+
end
|
24
|
+
|
10
25
|
# @param klass [Class] class to receive the method
|
11
26
|
# @param definition [MethodDefinition] method defined
|
12
27
|
# @param type [Symbol] type of method to be build
|
@@ -22,9 +37,9 @@ class Sinclair
|
|
22
37
|
#
|
23
38
|
# @return [Symbol] name of the method built
|
24
39
|
#
|
25
|
-
# @raise
|
40
|
+
# @raise NotImplementedError
|
26
41
|
def build
|
27
|
-
raise 'Not implemented yet. this should be imlemented in subclasses'
|
42
|
+
raise NotImplementedError, 'Not implemented yet. this should be imlemented in subclasses'
|
28
43
|
end
|
29
44
|
|
30
45
|
private
|
@@ -9,41 +9,41 @@ class Sinclair
|
|
9
9
|
class CallMethodBuilder < Base
|
10
10
|
# Builds the method
|
11
11
|
#
|
12
|
+
# The build uses +module_eval+ over a class
|
13
|
+
#
|
14
|
+
# The code is ran either on the class itself or in
|
15
|
+
# a block that allow creation of class methods
|
16
|
+
#
|
12
17
|
# @return [NilClass]
|
13
18
|
def build
|
14
|
-
|
19
|
+
evaluating_class.module_eval(&code_block)
|
15
20
|
end
|
16
21
|
|
17
22
|
private
|
18
23
|
|
24
|
+
delegate :code_block, to: :definition
|
25
|
+
# @method code_block
|
19
26
|
# @api private
|
20
27
|
# @private
|
21
28
|
#
|
22
|
-
#
|
29
|
+
# Code block to be evaluated by the class
|
23
30
|
#
|
24
|
-
#
|
25
|
-
# @return (see MethodDefinition::CallDefinition#code_string)
|
26
|
-
def code_line
|
27
|
-
instance? ? code_string : class_code_string
|
28
|
-
end
|
31
|
+
# @return [Proc]
|
29
32
|
|
30
|
-
|
31
|
-
|
32
|
-
# @method code_string
|
33
|
-
# @private
|
34
|
-
# @api private
|
33
|
+
# Returns the klass where the proc block will be evaluated
|
35
34
|
#
|
36
|
-
#
|
35
|
+
# For instance type, the class itself is returned
|
37
36
|
#
|
38
|
-
#
|
39
|
-
# @return [String]
|
40
|
-
|
41
|
-
# @method class_code_string
|
42
|
-
# @private
|
43
|
-
# @api private
|
37
|
+
# For adding class methods, the superclass is returned
|
44
38
|
#
|
45
|
-
# @
|
46
|
-
|
39
|
+
# @return [Class]
|
40
|
+
def evaluating_class
|
41
|
+
return klass if instance?
|
42
|
+
|
43
|
+
class << klass
|
44
|
+
return self
|
45
|
+
end
|
46
|
+
end
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -9,7 +9,8 @@ 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
|
-
|
12
|
+
|
13
|
+
autoload :CallMethodBuilder, 'sinclair/method_builder/call_method_builder'
|
13
14
|
|
14
15
|
CLASS_METHOD = :class
|
15
16
|
INSTANCE_METHOD = :instance
|
@@ -24,11 +25,13 @@ class Sinclair
|
|
24
25
|
# @param definitions [MethodDefinitions] all methods
|
25
26
|
# definitions to be built
|
26
27
|
# @param type [Symbol] type of method to be built
|
28
|
+
# - {CLASS_METHOD} : A class method will be built
|
29
|
+
# - {INSTANCE_METHOD} : An instance method will be built
|
27
30
|
#
|
28
31
|
# @return [MethodDefinitions]
|
29
32
|
def build_methods(definitions, type)
|
30
33
|
definitions.each do |definition|
|
31
|
-
|
34
|
+
definition.build(klass, type)
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
@@ -42,23 +45,5 @@ class Sinclair
|
|
42
45
|
# class to receive the method
|
43
46
|
#
|
44
47
|
# @return [Class]
|
45
|
-
|
46
|
-
# @private
|
47
|
-
#
|
48
|
-
# Build one method from definition
|
49
|
-
#
|
50
|
-
# @param definition [MethodDefinition] the method definition
|
51
|
-
# @param type [Symbol] type of method to be built
|
52
|
-
#
|
53
|
-
# @return (see Base#build)
|
54
|
-
def build_from_definition(definition, type)
|
55
|
-
if definition.string?
|
56
|
-
StringMethodBuilder.new(klass, definition, type: type).build
|
57
|
-
elsif definition.block?
|
58
|
-
BlockMethodBuilder.new(klass, definition, type: type).build
|
59
|
-
else
|
60
|
-
CallMethodBuilder.new(klass, definition, type: type).build
|
61
|
-
end
|
62
|
-
end
|
63
48
|
end
|
64
49
|
end
|
@@ -7,6 +7,8 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# Define a method from block
|
9
9
|
class BlockDefinition < MethodDefinition
|
10
|
+
build_with MethodBuilder::BlockMethodBuilder
|
11
|
+
|
10
12
|
# @param name [String,Symbol] name of the method
|
11
13
|
# @param block [Proc] block with code to be added as method
|
12
14
|
# @param options [Hash] Options of construction
|
@@ -7,6 +7,8 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# Define a call of method to e done within the class
|
9
9
|
class CallDefinition < MethodDefinition
|
10
|
+
build_with MethodBuilder::CallMethodBuilder
|
11
|
+
|
10
12
|
# @param method_name [Symbol] method to be called
|
11
13
|
# @param arguments [Array<Symbol,String>] parameters to be passed as
|
12
14
|
# arguments to the call
|
@@ -18,35 +20,30 @@ class Sinclair
|
|
18
20
|
default_value :block?, false
|
19
21
|
default_value :string?, false
|
20
22
|
|
21
|
-
#
|
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
|
23
|
+
# Block to be evaluated by the class when adding methods
|
28
24
|
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
25
|
+
# The block will be a call from +method_name+ passing +arguments+
|
26
|
+
# as arguments
|
27
|
+
# @return [Proc]
|
28
|
+
def code_block
|
29
|
+
method_name = name
|
30
|
+
args = arguments
|
31
|
+
|
32
|
+
proc do
|
33
|
+
send(method_name, *args)
|
34
|
+
end
|
37
35
|
end
|
38
36
|
|
39
37
|
private
|
40
38
|
|
41
39
|
attr_reader :arguments
|
42
|
-
|
43
40
|
# @method arguments
|
44
41
|
# @api private
|
45
42
|
# @private
|
46
43
|
#
|
47
|
-
#
|
44
|
+
# Arguments to be passed when calling the method inside the block
|
48
45
|
#
|
49
|
-
# @return [Array<
|
46
|
+
# @return [Array<Object>]
|
50
47
|
end
|
51
48
|
end
|
52
49
|
end
|
@@ -7,6 +7,8 @@ class Sinclair
|
|
7
7
|
#
|
8
8
|
# Define an instance method from string
|
9
9
|
class StringDefinition < MethodDefinition
|
10
|
+
build_with MethodBuilder::StringMethodBuilder
|
11
|
+
|
10
12
|
# @param name [String,Symbol] name of the method
|
11
13
|
# @param code [String] code to be evaluated as method
|
12
14
|
# @param options [Hash] Options of construction
|
@@ -11,7 +11,8 @@ class Sinclair
|
|
11
11
|
autoload :BlockHelper, 'sinclair/method_definition/block_helper'
|
12
12
|
autoload :BlockDefinition, 'sinclair/method_definition/block_definition'
|
13
13
|
autoload :StringDefinition, 'sinclair/method_definition/string_definition'
|
14
|
-
|
14
|
+
|
15
|
+
autoload :CallDefinition, 'sinclair/method_definition/call_definition'
|
15
16
|
|
16
17
|
# @method name
|
17
18
|
#
|
@@ -59,13 +60,47 @@ class Sinclair
|
|
59
60
|
# The creation is based on type which will be used to infer
|
60
61
|
# which subclass of {Sinclair::MethodDefinition} to be used
|
61
62
|
#
|
63
|
+
# If type is +nil+ then call is delegated to {.from} which will infer the type
|
64
|
+
# from the arguments
|
65
|
+
#
|
62
66
|
# @param type [Symbol] the method definition type
|
63
67
|
#
|
64
68
|
# @return [Sinclair::MethodDefinition] an instance of a subclass
|
65
69
|
def for(type, *args, **options, &block)
|
70
|
+
return from(*args, **options, &block) unless type
|
71
|
+
|
66
72
|
klass = const_get("#{type}_definition".camelize)
|
67
73
|
klass.new(*args, **options, &block)
|
68
74
|
end
|
75
|
+
|
76
|
+
# Defines builder for a definition class
|
77
|
+
#
|
78
|
+
# @param builder_class [Class<MethodBuilder>]
|
79
|
+
#
|
80
|
+
# @return [Symbol] constant +:build+
|
81
|
+
#
|
82
|
+
# @!macro build_with
|
83
|
+
# @api private
|
84
|
+
#
|
85
|
+
# @!method build(klass, type)
|
86
|
+
#
|
87
|
+
# Builds the method defined
|
88
|
+
#
|
89
|
+
# The method is built using {$1}
|
90
|
+
#
|
91
|
+
# @param klass [Class] The class where the method will be built
|
92
|
+
# @param type [Symbol] type of method to be built
|
93
|
+
# - {MethodBuilder::CLASS_METHOD} : A class method will be built
|
94
|
+
# - {MethodBuilder::INSTANCE_METHOD} : An instance method will be built
|
95
|
+
#
|
96
|
+
# @see $1#build
|
97
|
+
#
|
98
|
+
# @return [Symbol] the name of the method built
|
99
|
+
def build_with(builder_class)
|
100
|
+
define_method(:build) do |klass, type|
|
101
|
+
builder_class.build(klass, self, type: type)
|
102
|
+
end
|
103
|
+
end
|
69
104
|
end
|
70
105
|
|
71
106
|
# @param name [String,Symbol] name of the method
|
@@ -87,10 +122,13 @@ class Sinclair
|
|
87
122
|
#
|
88
123
|
# @example (see MethodDefinition::StringDefinition#build)
|
89
124
|
# @example (see MethodDefinition::BlockDefinition#build)
|
125
|
+
# @example (see MethodDefinition::CallDefinition#build)
|
90
126
|
#
|
91
127
|
# @return [Symbol] name of the created method
|
92
|
-
|
93
|
-
|
128
|
+
#
|
129
|
+
# @raise NotImplementedError
|
130
|
+
def build(_klass, _type)
|
131
|
+
raise NotImplementedError, 'Build is implemented in subclasses. ' \
|
94
132
|
"Use #{self.class}.from to initialize a proper object"
|
95
133
|
end
|
96
134
|
|
@@ -12,37 +12,35 @@ class Sinclair
|
|
12
12
|
#
|
13
13
|
# The type is decided based in the arguments
|
14
14
|
#
|
15
|
-
# @param name [String,Symbol] method name
|
16
|
-
# @param options [Hash] Options of construction
|
17
|
-
# @option options cached [Boolean] Flag telling to create
|
18
|
-
# a method with cache
|
19
|
-
#
|
20
15
|
# @overload add(definition_class, name, code = nil, **options)
|
16
|
+
# @param name [String,Symbol] method name
|
21
17
|
# @param code [String] code to be evaluated when the method is ran
|
18
|
+
# @param options [Hash] Options of construction
|
19
|
+
# @option options cached [Boolean] Flag telling to create
|
20
|
+
# a method with cache
|
22
21
|
#
|
23
22
|
# @overload add(definition_class, name, **options, &block)
|
23
|
+
# @param name [String,Symbol] method name
|
24
|
+
# @param options [Hash] Options of construction
|
25
|
+
# @option options cached [Boolean] Flag telling to create
|
26
|
+
# a method with cache
|
24
27
|
# @param block [Proc] block to be ran as method
|
25
28
|
#
|
26
|
-
# @
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
29
|
+
# @overload add(type, *args, **options, &block)
|
30
|
+
# @param type [Symbol] type of definition
|
31
|
+
# - :string -> {MethodDefinition::StringDefinition}
|
32
|
+
# - :block -> {MethodDefinition::BlockDefinition}
|
33
|
+
# - :call -> {MethodDefinition::CallDefinition}
|
34
|
+
# @param options [Hash] Options of construction
|
35
|
+
# @option options cached [Boolean] Flag telling to create
|
36
|
+
# a method with cache
|
37
|
+
# @param block [Proc] block to be ran as method
|
34
38
|
#
|
35
|
-
# @
|
36
|
-
#
|
37
|
-
# - :block -> {MethodDefinition::BlockDefinition}
|
38
|
-
# - :call -> {MethodDefinition::CallDefinition}
|
39
|
-
# @param options [Hash] Options of construction
|
40
|
-
# @option options cached [Boolean] Flag telling to create
|
41
|
-
# a method with cache
|
42
|
-
# @param block [Proc] block to be ran as method
|
39
|
+
# @see MethodDefinition.for
|
40
|
+
# @see MethodDefinition.from
|
43
41
|
#
|
44
42
|
# @return [Array<MethodDefinition>]
|
45
|
-
def
|
43
|
+
def add(*args, type: nil, **options, &block)
|
46
44
|
definitions << MethodDefinition.for(type, *args, **options, &block)
|
47
45
|
end
|
48
46
|
|
data/lib/sinclair/version.rb
CHANGED
data/lib/sinclair.rb
CHANGED
@@ -179,107 +179,193 @@ class Sinclair
|
|
179
179
|
end
|
180
180
|
|
181
181
|
# Add a method to the method list to be created on klass instances
|
182
|
-
#
|
183
|
-
# @param name [String,Symbol] name of the method to be added
|
184
|
-
# @param options [Hash] Options of construction
|
185
|
-
# @option options cached [Boolean] Flag telling to create
|
186
|
-
# a method with cache
|
182
|
+
# @see MethodDefinitions#add
|
187
183
|
#
|
188
184
|
# @overload add_method(name, code, **options)
|
185
|
+
# @param name [String,Symbol] name of the method to be added
|
189
186
|
# @param code [String] code to be evaluated when the method is ran
|
187
|
+
# @param options [Hash] Options of construction
|
188
|
+
# @option options cached [Boolean] Flag telling to create
|
189
|
+
# a method with cache
|
190
|
+
# @see MethodDefinition::StringDefinition
|
191
|
+
#
|
192
|
+
# @example Using string code to add a string defined method
|
193
|
+
# class Person
|
194
|
+
# attr_accessor :first_name, :last_name
|
195
|
+
#
|
196
|
+
# def initialize(first_name, last_name)
|
197
|
+
# @first_name = first_name
|
198
|
+
# @last_name = last_name
|
199
|
+
# end
|
200
|
+
# end
|
201
|
+
#
|
202
|
+
# builder = Sinclair.new(Person)
|
203
|
+
# builder.add_method(:full_name, '[first_name, last_name].join(" ")')
|
204
|
+
# builder.build
|
205
|
+
#
|
206
|
+
# Person.new('john', 'wick').full_name # returns 'john wick'
|
190
207
|
#
|
191
208
|
# @overload add_method(name, **options, &block)
|
209
|
+
# @param name [String,Symbol] name of the method to be added
|
192
210
|
# @param block [Proc] block to be ran as method
|
211
|
+
# @param options [Hash] Options of construction
|
212
|
+
# @option options cached [Boolean] Flag telling to create
|
213
|
+
# a method with cache
|
214
|
+
# @see MethodDefinition::BlockDefinition
|
215
|
+
#
|
216
|
+
# @example Using block to add a block method
|
217
|
+
# class Person
|
218
|
+
# attr_accessor :first_name, :last_name
|
219
|
+
#
|
220
|
+
# def initialize(first_name, last_name)
|
221
|
+
# @first_name = first_name
|
222
|
+
# @last_name = last_name
|
223
|
+
# end
|
224
|
+
# end
|
193
225
|
#
|
194
|
-
#
|
195
|
-
#
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
200
|
-
#
|
226
|
+
# builder = Sinclair.new(Person)
|
227
|
+
# builder.add_method(:bond_name) { "#{last_name}, #{first_name} #{last_name}" }
|
228
|
+
# builder.build
|
229
|
+
#
|
230
|
+
# Person.new('john', 'wick').bond_name # returns 'wick, john wick'
|
231
|
+
#
|
232
|
+
# @overload add_method(*args, type:, **options, &block)
|
233
|
+
# @param args [Array<Object>] arguments to be passed to the definition
|
234
|
+
# @param type [Symbol] type of method definition
|
235
|
+
# @param block [Proc] block to be ran as method when type is block
|
236
|
+
# @param options [Hash] Options of construction
|
237
|
+
# @option options cached [Boolean] Flag telling to create
|
238
|
+
# a method with cache
|
239
|
+
# @see MethodDefinition::BlockDefinition
|
240
|
+
# @see MethodDefinition::StringDefinition
|
241
|
+
# @see MethodDefinition::CallDefinition
|
242
|
+
#
|
243
|
+
# @example Passing type block
|
244
|
+
# class Person
|
245
|
+
# attr_accessor :first_name, :last_name
|
246
|
+
#
|
247
|
+
# def initialize(first_name, last_name)
|
248
|
+
# @first_name = first_name
|
249
|
+
# @last_name = last_name
|
250
|
+
# end
|
201
251
|
# end
|
202
|
-
# end
|
203
252
|
#
|
204
|
-
#
|
205
|
-
#
|
206
|
-
#
|
253
|
+
# builder = Sinclair.new(Person)
|
254
|
+
# builder.add_method(:bond_name, type: :block, cached: true) do
|
255
|
+
# "{last_name}, #{first_name} #{last_name}"
|
256
|
+
# end
|
257
|
+
# builder.build
|
207
258
|
#
|
208
|
-
#
|
259
|
+
# person.Person.new('john', 'wick')
|
209
260
|
#
|
210
|
-
#
|
211
|
-
#
|
212
|
-
#
|
261
|
+
# person.bond_name # returns 'wick, john wick'
|
262
|
+
# person.first_name = 'Johny'
|
263
|
+
# person.bond_name # returns 'wick, john wick'
|
213
264
|
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
# @last_name = last_name
|
265
|
+
# @example Passing type call
|
266
|
+
# class Person
|
217
267
|
# end
|
218
|
-
# end
|
219
268
|
#
|
220
|
-
#
|
221
|
-
#
|
222
|
-
#
|
223
|
-
# builder.build
|
269
|
+
# builder = Sinclair.new(Person)
|
270
|
+
# builder.add_method(:attr_accessor, :bond_name, type: :call)
|
271
|
+
# builder.build
|
224
272
|
#
|
225
|
-
#
|
226
|
-
#
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
)
|
273
|
+
# person.bond_name = 'Bond, James Bond'
|
274
|
+
# person.bond_name # returns 'Bond, James Bond'
|
275
|
+
#
|
276
|
+
# @return [Array<MethodDefinition>] the list of all currently defined instance methods
|
277
|
+
def add_method(*args, type: nil, **options, &block)
|
278
|
+
definitions.add(*args, type: type, **options, &block)
|
231
279
|
end
|
232
280
|
|
233
281
|
# Add a method to the method list to be created on klass
|
234
|
-
#
|
235
|
-
# @param name [String,Symbol] name of the method to be added
|
236
|
-
# @param options [Hash] Options of construction
|
237
|
-
# @option options cached [Boolean] Flag telling to create
|
238
|
-
# a method with cache
|
282
|
+
# @see MethodDefinitions#add
|
239
283
|
#
|
240
284
|
# @overload add_class_method(name, code, **options)
|
285
|
+
# @param name [String,Symbol] name of the method to be added
|
241
286
|
# @param code [String] code to be evaluated when the method is ran
|
287
|
+
# @param options [Hash] Options of construction
|
288
|
+
# @option options cached [Boolean] Flag telling to create
|
289
|
+
# a method with cache
|
290
|
+
#
|
291
|
+
# @example Adding a method by String
|
292
|
+
# class EnvFetcher
|
293
|
+
# end
|
294
|
+
#
|
295
|
+
# builder = Sinclair.new(EnvFetcher)
|
296
|
+
#
|
297
|
+
# builder.add_class_method(:hostname, 'ENV["HOSTNAME"]')
|
298
|
+
# builder.build
|
299
|
+
#
|
300
|
+
# ENV['HOSTNAME'] = 'myhost'
|
301
|
+
#
|
302
|
+
# EnvFetcher.hostname # returns 'myhost'
|
242
303
|
#
|
243
304
|
# @overload add_class_method(name, **options, &block)
|
305
|
+
# @param name [String,Symbol] name of the method to be added
|
244
306
|
# @param block [Proc] block to be ran as method
|
307
|
+
# @param options [Hash] Options of construction
|
308
|
+
# @option options cached [Boolean] Flag telling to create
|
309
|
+
# a method with cache
|
245
310
|
#
|
246
|
-
#
|
247
|
-
#
|
248
|
-
#
|
311
|
+
# @example Adding a method by Block
|
312
|
+
# class EnvFetcher
|
313
|
+
# end
|
249
314
|
#
|
250
|
-
#
|
315
|
+
# builder = Sinclair.new(EnvFetcher)
|
251
316
|
#
|
252
|
-
#
|
253
|
-
#
|
317
|
+
# builder.add_class_method(:timeout) { ENV['TIMEOUT'] }
|
318
|
+
# builder.build
|
254
319
|
#
|
255
|
-
#
|
320
|
+
# ENV['TIMEOUT'] = '300'
|
256
321
|
#
|
257
|
-
#
|
322
|
+
# EnvFetcher.timeout # returns '300'
|
258
323
|
#
|
259
|
-
# @
|
260
|
-
#
|
261
|
-
#
|
324
|
+
# @overload add_class_method(*args, type: **options, &block)
|
325
|
+
# @param args [Array<Object>] arguments to be passed to the definition
|
326
|
+
# @param type [Symbol] type of method definition
|
327
|
+
# @param block [Proc] block to be ran as method when type is block
|
328
|
+
# @param options [Hash] Options of construction
|
329
|
+
# @option options cached [Boolean] Flag telling to create
|
330
|
+
# a method with cache
|
331
|
+
# @see MethodDefinition::BlockDefinition
|
332
|
+
# @see MethodDefinition::StringDefinition
|
333
|
+
# @see MethodDefinition::CallDefinition
|
262
334
|
#
|
263
|
-
#
|
335
|
+
# @example Passing type block
|
336
|
+
# class EnvFetcher
|
337
|
+
# end
|
264
338
|
#
|
265
|
-
#
|
266
|
-
# builder.build
|
339
|
+
# builder = Sinclair.new(EnvFetcher)
|
267
340
|
#
|
268
|
-
#
|
341
|
+
# builder.add_class_method(:timeout, type: :block) { ENV['TIMEOUT'] }
|
342
|
+
# builder.build
|
269
343
|
#
|
270
|
-
#
|
344
|
+
# ENV['TIMEOUT'] = '300'
|
271
345
|
#
|
272
|
-
#
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
346
|
+
# EnvFetcher.timeout # returns '300'
|
347
|
+
#
|
348
|
+
# @example Passing type call
|
349
|
+
# class EnvFetcher
|
350
|
+
# end
|
351
|
+
#
|
352
|
+
# builder = Sinclair.new(EnvFetcher)
|
353
|
+
#
|
354
|
+
# builder.add_class_method(:attr_accessor, :timeout, type: :call)
|
355
|
+
# builder.build
|
356
|
+
#
|
357
|
+
# EnvFetcher.timeout = 10
|
358
|
+
#
|
359
|
+
# env_fetcher.timeout # returns '10'
|
360
|
+
#
|
361
|
+
# @return [Array<MethodDefinition>] the list of all currently defined class methods
|
362
|
+
def add_class_method(*args, type: nil, **options, &block)
|
363
|
+
class_definitions.add(*args, type: type, **options, &block)
|
277
364
|
end
|
278
365
|
|
279
366
|
# Evaluetes a block which will result in a String, the method code
|
280
367
|
#
|
281
368
|
# @example Building a initial value class method
|
282
|
-
#
|
283
369
|
# module InitialValuer
|
284
370
|
# extend ActiveSupport::Concern
|
285
371
|
#
|
@@ -301,6 +387,7 @@ class Sinclair
|
|
301
387
|
# end
|
302
388
|
#
|
303
389
|
# object = MyClass.new
|
390
|
+
#
|
304
391
|
# object.age # 20
|
305
392
|
# object.age = 30
|
306
393
|
# object.age # 30
|
@@ -345,7 +432,7 @@ class Sinclair
|
|
345
432
|
# end
|
346
433
|
#
|
347
434
|
# Purchase.new(2.3, 5).total_price # returns 11.5
|
348
|
-
# @return [Array<MethodDefinition>]
|
435
|
+
# @return [Array<MethodDefinition>] the list of all currently defined instance methods
|
349
436
|
def eval_and_add_method(name, &block)
|
350
437
|
add_method(name, instance_eval(&block))
|
351
438
|
end
|