sinclair 1.1.2 → 1.1.3
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 +5 -5
- data/.circleci/config.yml +22 -8
- data/.gitignore +2 -0
- data/Dockerfile +6 -0
- data/README.md +3 -2
- data/Rakefile +4 -0
- data/config/yardstick.rb +13 -0
- data/config/yardstick.yml +54 -0
- data/docker-compose.yml +14 -9
- data/lib/sinclair.rb +37 -23
- data/lib/sinclair/matchers.rb +7 -0
- data/lib/sinclair/matchers/add_method.rb +69 -8
- data/lib/sinclair/matchers/add_method_to.rb +62 -3
- data/lib/sinclair/method_definition.rb +25 -1
- data/lib/sinclair/options_parser.rb +10 -0
- data/lib/sinclair/version.rb +1 -1
- data/scripts/check_readme.sh +6 -0
- data/sinclair.gemspec +9 -7
- data/spec/integration/matcher_spec.rb +1 -0
- data/spec/integration/yard/matchers/add_method_spec.rb +36 -0
- data/spec/spec_helper.rb +1 -0
- metadata +58 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ac0a266d5bf3934653eeb107bc0e7305bfffb80b1845be7abe617aef8b910be6
|
4
|
+
data.tar.gz: 978c830d6045dc169d426f07a79e96bdafbd25482ca982636c8244d3348d69e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c62398491d7d08baa0134e5a5bbe0bfc7b964e2deb2e2c2f25db63788069c654d2636d07aa52ed1f653ee9ba9395f70425d5ab58116447f705ff2b54d0e4273e
|
7
|
+
data.tar.gz: a8642cb8a8aaafab6c5ef20663f02bcb7ee629900f463f3dc385e3c27cf3ef8c272221987fac9b6cf26c165ad07e0fa9710fcb1d3fa884d94fabaa9c3602e3d7
|
data/.circleci/config.yml
CHANGED
@@ -2,13 +2,27 @@ version: 2
|
|
2
2
|
jobs:
|
3
3
|
build:
|
4
4
|
docker:
|
5
|
-
- image:
|
5
|
+
- image: darthjee/circleci_ruby_gems:0.0.1
|
6
6
|
steps:
|
7
7
|
- checkout
|
8
|
-
- run:
|
9
|
-
|
10
|
-
|
11
|
-
- run:
|
12
|
-
|
13
|
-
|
14
|
-
- run:
|
8
|
+
- run:
|
9
|
+
name: Prepare Coverage Test Report
|
10
|
+
command: cc-test-reporter before-build
|
11
|
+
- run:
|
12
|
+
name: Bundle Install
|
13
|
+
command: bundle install
|
14
|
+
- run:
|
15
|
+
name: RSpec
|
16
|
+
command: bundle exec rspec
|
17
|
+
- run:
|
18
|
+
name: Rubocop
|
19
|
+
command: rubocop
|
20
|
+
- run:
|
21
|
+
name: Coverage Test Report
|
22
|
+
command: cc-test-reporter after-build --exit-code $?
|
23
|
+
- run:
|
24
|
+
name: Yardstick coverage check
|
25
|
+
command: bundle exec rake verify_measurements
|
26
|
+
- run:
|
27
|
+
name: Check version documentation
|
28
|
+
command: scripts/check_readme.sh
|
data/.gitignore
CHANGED
data/Dockerfile
ADDED
data/README.md
CHANGED
@@ -29,7 +29,7 @@ Installation
|
|
29
29
|
|
30
30
|
Yard Documentation
|
31
31
|
-------------------
|
32
|
-
https://www.rubydoc.info/gems/sinclair/
|
32
|
+
https://www.rubydoc.info/gems/sinclair/1.1.3
|
33
33
|
|
34
34
|
Usage
|
35
35
|
---------------
|
@@ -131,7 +131,7 @@ adding methods to your class or by extending it for more complex logics
|
|
131
131
|
```surname``` ```surname=``` ```surname_valid?```
|
132
132
|
```age``` ```age=``` ```age_valid?```
|
133
133
|
```legs``` ```legs=``` ```legs_valid?```
|
134
|
-
```valid
|
134
|
+
```valid?```.
|
135
135
|
|
136
136
|
```ruby
|
137
137
|
|
@@ -181,6 +181,7 @@ You can use the provided matcher to check that your builder is adding a method c
|
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
184
|
+
require 'sinclair/matchers'
|
184
185
|
RSpec.configure do |config|
|
185
186
|
config.include Sinclair::Matchers
|
186
187
|
end
|
data/Rakefile
CHANGED
data/config/yardstick.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yardstick/rake/measurement'
|
4
|
+
require 'yardstick/rake/verify'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
options = YAML.load_file('config/yardstick.yml')
|
8
|
+
|
9
|
+
Yardstick::Rake::Measurement.new(:yardstick_measure, options) do |measurement|
|
10
|
+
measurement.output = 'measurement/report.txt'
|
11
|
+
end
|
12
|
+
|
13
|
+
Yardstick::Rake::Verify.new(:verify_measurements, options)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
threshold: 100
|
2
|
+
require_exact_threshold: false
|
3
|
+
rules:
|
4
|
+
ApiTag::Presence:
|
5
|
+
enabled: true
|
6
|
+
exclude: []
|
7
|
+
ApiTag::Inclusion:
|
8
|
+
enabled: true
|
9
|
+
exclude: []
|
10
|
+
ApiTag::ProtectedMethod:
|
11
|
+
enabled: true
|
12
|
+
exclude: []
|
13
|
+
ApiTag::PrivateMethod:
|
14
|
+
enabled: true
|
15
|
+
exclude: []
|
16
|
+
ExampleTag:
|
17
|
+
enabled: true
|
18
|
+
exclude:
|
19
|
+
- Sinclair::OptionsParser#options
|
20
|
+
- Sinclair::OptionsParser#options_object
|
21
|
+
ReturnTag:
|
22
|
+
enabled: true
|
23
|
+
exclude:
|
24
|
+
- Sinclair#klass
|
25
|
+
- Sinclair::Matchers::AddMethod#method
|
26
|
+
- Sinclair::Matchers::AddMethodTo#method
|
27
|
+
- Sinclair::Matchers::AddMethodTo#instance
|
28
|
+
- Sinclair::MethodDefinition#name
|
29
|
+
- Sinclair::MethodDefinition#code
|
30
|
+
- Sinclair::MethodDefinition#block
|
31
|
+
- Sinclair::OptionsParser#options
|
32
|
+
- Sinclair::OptionsParser#options_object
|
33
|
+
- Sinclair::Matchers::AddMethodTo#raise_block_syntax_error
|
34
|
+
Summary::Presence:
|
35
|
+
enabled: true
|
36
|
+
exclude:
|
37
|
+
- Sinclair#klass
|
38
|
+
- Sinclair::Matchers::AddMethod#method
|
39
|
+
- Sinclair::Matchers::AddMethodTo#method
|
40
|
+
- Sinclair::Matchers::AddMethodTo#instance
|
41
|
+
- Sinclair::MethodDefinition#name
|
42
|
+
- Sinclair::MethodDefinition#code
|
43
|
+
- Sinclair::MethodDefinition#block
|
44
|
+
- Sinclair::OptionsParser#options
|
45
|
+
- Sinclair::OptionsParser#options_object
|
46
|
+
Summary::Length:
|
47
|
+
enabled: true
|
48
|
+
exclude: []
|
49
|
+
Summary::Delimiter:
|
50
|
+
enabled: true
|
51
|
+
exclude: []
|
52
|
+
Summary::SingleLine:
|
53
|
+
enabled: true
|
54
|
+
exclude: []
|
data/docker-compose.yml
CHANGED
@@ -1,18 +1,23 @@
|
|
1
|
-
version: '
|
1
|
+
version: '3'
|
2
2
|
services:
|
3
3
|
base: &base
|
4
|
-
image:
|
5
|
-
working_dir: /home/app/
|
4
|
+
image: sinclair
|
5
|
+
working_dir: /home/app/app
|
6
6
|
volumes:
|
7
|
-
- .:/home/app/
|
8
|
-
- sinclair_gems_2_4_0:/usr/local/bundle
|
7
|
+
- .:/home/app/app
|
9
8
|
|
10
|
-
|
9
|
+
base_build:
|
10
|
+
<<: *base
|
11
|
+
build: .
|
12
|
+
command: echo done
|
11
13
|
|
12
14
|
sinclair:
|
13
15
|
<<: *base
|
14
16
|
container_name: sinclair
|
15
|
-
|
17
|
+
depends_on: [base_build]
|
18
|
+
command: /bin/bash -c 'rspec'
|
16
19
|
|
17
|
-
|
18
|
-
|
20
|
+
test_all:
|
21
|
+
<<: *base
|
22
|
+
depends_on: [base_build]
|
23
|
+
command: /bin/bash -c 'rspec && yard && rake yardstick_measure && rake verify_measurements'
|
data/lib/sinclair.rb
CHANGED
@@ -3,10 +3,12 @@
|
|
3
3
|
require 'active_support'
|
4
4
|
require 'active_support/all'
|
5
5
|
|
6
|
+
# @api public
|
7
|
+
# @author darthjee
|
8
|
+
#
|
6
9
|
# Builder that add instance methods to a class
|
7
10
|
#
|
8
11
|
# @example
|
9
|
-
#
|
10
12
|
# class MyModel
|
11
13
|
# end
|
12
14
|
#
|
@@ -27,10 +29,11 @@ class Sinclair
|
|
27
29
|
|
28
30
|
autoload :VERSION, 'sinclair/version'
|
29
31
|
autoload :MethodDefinition, 'sinclair/method_definition'
|
30
|
-
autoload :Matchers, 'sinclair/matchers'
|
31
32
|
|
32
33
|
include OptionsParser
|
33
34
|
|
35
|
+
# Returns a new instance of Sinclair
|
36
|
+
#
|
34
37
|
# @param klass [Class] to receive the methods
|
35
38
|
# @param options [Hash] open hash options to be used by builders inheriting from Sinclair
|
36
39
|
# through the Sinclair::OptionsParser concern
|
@@ -70,6 +73,8 @@ class Sinclair
|
|
70
73
|
# builder.build
|
71
74
|
#
|
72
75
|
# MyModel.new.respond_to(:default_value) # returns true
|
76
|
+
#
|
77
|
+
# @return [Array<MethodDefinition>]
|
73
78
|
def build
|
74
79
|
definitions.each do |definition|
|
75
80
|
definition.build(klass)
|
@@ -79,42 +84,41 @@ class Sinclair
|
|
79
84
|
# add a method to the method list to be created on klass
|
80
85
|
#
|
81
86
|
# @overload add_method(name, code)
|
82
|
-
# @param name [String
|
87
|
+
# @param name [String,Symbol] name of the method to be added
|
83
88
|
# @param code [String] code to be evaluated when the method is ran
|
84
89
|
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
90
|
+
# @example Using string code
|
91
|
+
# class Person
|
92
|
+
# attr_reader :first_name, :last_name
|
88
93
|
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
# end
|
94
|
+
# def initialize(first_name, last_name)
|
95
|
+
# @first_name = first_name
|
96
|
+
# @last_name = last_name
|
93
97
|
# end
|
98
|
+
# end
|
94
99
|
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
100
|
+
# builder = Sinclair.new(Person)
|
101
|
+
# builder.add_method(:full_name, '[first_name, last_name].join(" ")')
|
102
|
+
# builder.build
|
98
103
|
#
|
99
|
-
#
|
104
|
+
# Person.new('john', 'wick').full_name # returns 'john wick'
|
100
105
|
#
|
101
106
|
# @overload add_method(name, &block)
|
102
|
-
# @param name [String
|
107
|
+
# @param name [String,Symbol] name of the method to be added
|
103
108
|
# @param block [Proc] block to be ran as method
|
104
109
|
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# builder.build
|
110
|
+
# @example Using block
|
111
|
+
# builder = Sinclair.new(Person)
|
112
|
+
# builder.add_method(:bond_name) { "#{last_name}, #{full_name}" }
|
113
|
+
# builder.build
|
110
114
|
#
|
111
|
-
#
|
115
|
+
# Person.new('john', 'wick').bond_name # returns 'wick, john wick'
|
116
|
+
# @return [Array<MethodDefinition>]
|
112
117
|
def add_method(name, code = nil, &block)
|
113
118
|
definitions << MethodDefinition.new(name, code, &block)
|
114
119
|
end
|
115
120
|
|
116
|
-
#
|
117
|
-
# then used as code for the method
|
121
|
+
# Evaluetes a block which will result in a String, the method code
|
118
122
|
#
|
119
123
|
# @example
|
120
124
|
#
|
@@ -183,14 +187,24 @@ class Sinclair
|
|
183
187
|
# end
|
184
188
|
#
|
185
189
|
# Purchase.new(2.3, 5).total_price # returns 11.5
|
190
|
+
# @return [Array<MethodDefinition>]
|
186
191
|
def eval_and_add_method(name, &block)
|
187
192
|
add_method(name, instance_eval(&block))
|
188
193
|
end
|
189
194
|
|
190
195
|
private
|
191
196
|
|
197
|
+
# @api private
|
198
|
+
# @private
|
192
199
|
attr_reader :klass
|
193
200
|
|
201
|
+
# @private
|
202
|
+
#
|
203
|
+
# @api private
|
204
|
+
#
|
205
|
+
# List of mthod definitions
|
206
|
+
#
|
207
|
+
# @return [Array<MethodDefinition>]
|
194
208
|
def definitions
|
195
209
|
@definitions ||= []
|
196
210
|
end
|
data/lib/sinclair/matchers.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Sinclair
|
4
|
+
# @api public
|
5
|
+
# @author darthjee
|
6
|
+
#
|
4
7
|
# Matchers module will have the DSL to be included in RSpec in order to have
|
5
8
|
# access to the matchers
|
6
9
|
#
|
@@ -29,6 +32,10 @@ class Sinclair
|
|
29
32
|
autoload :AddMethodTo, 'sinclair/matchers/add_method_to'
|
30
33
|
|
31
34
|
# DSL to AddMethod
|
35
|
+
#
|
36
|
+
# @example (see Sinclair::Matchers)
|
37
|
+
# @example (see Sinclair::Matchers::AddMethod#to)
|
38
|
+
#
|
32
39
|
# @return [AddMethod] RSpec Matcher
|
33
40
|
def add_method(method)
|
34
41
|
Sinclair::Matchers::AddMethod.new(method)
|
@@ -2,21 +2,33 @@
|
|
2
2
|
|
3
3
|
class Sinclair
|
4
4
|
module Matchers
|
5
|
+
# @author darthjee
|
5
6
|
# AddMethod is able to build an instance of Sinclair::Matchers::AddMethodTo
|
6
7
|
class AddMethod < RSpec::Matchers::BuiltIn::BaseMatcher
|
7
|
-
#
|
8
|
-
#
|
8
|
+
# @api private
|
9
|
+
# @abstract
|
10
|
+
#
|
11
|
+
# Raise a warning on the usage as this is only a builder for AddMethodTo
|
12
|
+
#
|
13
|
+
# @raise SyntaxError
|
9
14
|
def matches?(_actual)
|
10
15
|
raise SyntaxError, 'You should specify which instance the method is being added to' \
|
11
16
|
"add_method(:#{method}).to(instance)"
|
12
17
|
end
|
13
18
|
|
14
|
-
# @
|
19
|
+
# @api private
|
20
|
+
#
|
21
|
+
# Returns a new instance of AddMethod
|
22
|
+
#
|
23
|
+
# @param method [String,Symbol] the method, to be checked, name
|
15
24
|
def initialize(method)
|
16
25
|
@method = method
|
17
26
|
end
|
18
27
|
|
19
|
-
# @
|
28
|
+
# @api public
|
29
|
+
#
|
30
|
+
# Creates a matcher AddMethodTo
|
31
|
+
#
|
20
32
|
# @overload to(klass)
|
21
33
|
# @param [Class] klass
|
22
34
|
# class where the method should be added to
|
@@ -24,22 +36,71 @@ class Sinclair
|
|
24
36
|
# @overload to(instance)
|
25
37
|
# @param [Object] instance
|
26
38
|
# instance of the class where the method should be added to
|
39
|
+
#
|
40
|
+
# @example Using inside RSpec and checking Class
|
41
|
+
# RSpec.describe "MyBuilder" do
|
42
|
+
# let(:clazz) { Class.new }
|
43
|
+
# let(:builder) { Sinclair.new(clazz) }
|
44
|
+
#
|
45
|
+
# before do
|
46
|
+
# builder.add_method(:new_method, "2")
|
47
|
+
# end
|
48
|
+
#
|
49
|
+
# it do
|
50
|
+
# expect { builder.build }.to add_method(:new_method).to(clazz)
|
51
|
+
# end
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# # Outputs
|
55
|
+
# # 'should add method 'new_method' to #<Class:0x000056441bf46608> instances'
|
56
|
+
# @example Using inside RSpec and checking instance
|
57
|
+
# RSpec.describe "MyBuilder" do
|
58
|
+
# let(:clazz) { Class.new }
|
59
|
+
# let(:builder) { Sinclair.new(clazz) }
|
60
|
+
# let(:instance) { clazz.new }
|
61
|
+
#
|
62
|
+
# before do
|
63
|
+
# builder.add_method(:the_method, "true")
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# it do
|
67
|
+
# expect { builder.build }.to add_method(:the_method).to(instance)
|
68
|
+
# end
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# # Outputs
|
72
|
+
# # 'should add method 'the_method' to #<Class:0x000056441bf46608> instances'
|
73
|
+
#
|
74
|
+
# @return [AddMethodTo] the correct matcher
|
27
75
|
def to(target = nil)
|
28
76
|
AddMethodTo.new(target, method)
|
29
77
|
end
|
30
78
|
|
79
|
+
# @api private
|
80
|
+
#
|
81
|
+
# definition needed for block matchers
|
82
|
+
#
|
83
|
+
# @return [Boolean]
|
84
|
+
def supports_block_expectations?
|
85
|
+
true
|
86
|
+
end
|
87
|
+
|
88
|
+
# @api private
|
89
|
+
#
|
90
|
+
# Checkes if another instnce is equal self
|
91
|
+
#
|
92
|
+
# @return [Boolean]
|
31
93
|
def equal?(other)
|
32
94
|
return unless other.class == self.class
|
33
95
|
other.method == method
|
34
96
|
end
|
35
97
|
|
36
|
-
|
37
|
-
def supports_block_expectations?
|
38
|
-
true
|
39
|
-
end
|
98
|
+
alias == equal?
|
40
99
|
|
41
100
|
protected
|
42
101
|
|
102
|
+
# @api private
|
103
|
+
# @private
|
43
104
|
attr_reader :method
|
44
105
|
end
|
45
106
|
end
|
@@ -2,6 +2,9 @@
|
|
2
2
|
|
3
3
|
class Sinclair
|
4
4
|
module Matchers
|
5
|
+
# @api private
|
6
|
+
# @author darthjee
|
7
|
+
#
|
5
8
|
# AddMethodTo checks whether a method was or not added by the call of a block
|
6
9
|
#
|
7
10
|
# This is used with a RSpec DSL method add_method(method_name).to(class_object)
|
@@ -29,6 +32,10 @@ class Sinclair
|
|
29
32
|
# end
|
30
33
|
# end
|
31
34
|
class AddMethodTo < RSpec::Matchers::BuiltIn::BaseMatcher
|
35
|
+
# @private
|
36
|
+
#
|
37
|
+
# Returns a new instance of AddMethodTo
|
38
|
+
#
|
32
39
|
# @overload initialize(klass, method)
|
33
40
|
# @param [Class] klass
|
34
41
|
# class where the method should be added to
|
@@ -48,22 +55,38 @@ class Sinclair
|
|
48
55
|
@method = method
|
49
56
|
end
|
50
57
|
|
51
|
-
# @
|
58
|
+
# @private
|
59
|
+
#
|
60
|
+
# Returnst expectaton description
|
61
|
+
#
|
62
|
+
# @return [String]
|
52
63
|
def description
|
53
64
|
"add method '#{method}' to #{klass} instances"
|
54
65
|
end
|
55
66
|
|
56
|
-
# @
|
67
|
+
# @private
|
68
|
+
#
|
69
|
+
# Returns message on expectation failure
|
70
|
+
#
|
71
|
+
# @return [String]
|
57
72
|
def failure_message_for_should
|
58
73
|
"expected '#{method}' to be added to #{klass} but " \
|
59
74
|
"#{@initial_state ? 'it already existed' : "it didn't"}"
|
60
75
|
end
|
61
76
|
|
62
|
-
# @
|
77
|
+
# @private
|
78
|
+
#
|
79
|
+
# Returns message on expectation failure for negative expectation
|
80
|
+
#
|
81
|
+
# @return [String]
|
63
82
|
def failure_message_for_should_not
|
64
83
|
"expected '#{method}' not to be added to #{klass} but it was"
|
65
84
|
end
|
66
85
|
|
86
|
+
# @private
|
87
|
+
#
|
88
|
+
# Checks if expectation is true or not
|
89
|
+
#
|
67
90
|
# @return [Boolean] expectation check
|
68
91
|
def matches?(event_proc)
|
69
92
|
return false unless event_proc.is_a?(Proc)
|
@@ -77,36 +100,72 @@ class Sinclair
|
|
77
100
|
true
|
78
101
|
end
|
79
102
|
|
103
|
+
# @api private
|
104
|
+
#
|
105
|
+
# Checkes if another instnce is equal self
|
106
|
+
#
|
107
|
+
# @return [Boolean]
|
80
108
|
def equal?(other)
|
81
109
|
return unless other.class == self.class
|
82
110
|
other.method == method &&
|
83
111
|
other.instance == instance
|
84
112
|
end
|
85
113
|
|
114
|
+
alias == equal?
|
115
|
+
alias failure_message failure_message_for_should
|
116
|
+
alias failure_message_when_negated failure_message_for_should_not
|
117
|
+
|
86
118
|
protected
|
87
119
|
|
120
|
+
# @api private
|
121
|
+
# @private
|
88
122
|
attr_reader :method, :instance
|
89
123
|
|
90
124
|
private
|
91
125
|
|
126
|
+
# @private
|
127
|
+
#
|
128
|
+
# Checks if a method was added (didn't exist before)
|
129
|
+
#
|
130
|
+
# @return Boolean
|
92
131
|
def added?
|
93
132
|
!@initial_state && @final_state
|
94
133
|
end
|
95
134
|
|
135
|
+
# @private
|
136
|
+
#
|
137
|
+
# Call block to check if it aded a method or not
|
138
|
+
#
|
139
|
+
# @return [Boolan]
|
96
140
|
def perform_change(event_proc)
|
97
141
|
@initial_state = method_defined?
|
98
142
|
event_proc.call
|
99
143
|
@final_state = method_defined?
|
100
144
|
end
|
101
145
|
|
146
|
+
# @private
|
147
|
+
#
|
148
|
+
# Checks if class has instance method defined
|
149
|
+
#
|
150
|
+
# @return [Boolean]
|
102
151
|
def method_defined?
|
103
152
|
klass.method_defined?(method)
|
104
153
|
end
|
105
154
|
|
155
|
+
# @private
|
156
|
+
#
|
157
|
+
# Class to be analised
|
158
|
+
#
|
159
|
+
# @return [Class]
|
106
160
|
def klass
|
107
161
|
@klass ||= instance.class
|
108
162
|
end
|
109
163
|
|
164
|
+
# @private
|
165
|
+
#
|
166
|
+
# Raises when block was not given
|
167
|
+
#
|
168
|
+
# @raise SyntaxError
|
110
169
|
def raise_block_syntax_error
|
111
170
|
raise SyntaxError, 'Block not received by the `add_method_to` matcher. ' \
|
112
171
|
'Perhaps you want to use `{ ... }` instead of do/end?'
|
@@ -1,12 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Sinclair
|
4
|
+
# @api private
|
5
|
+
# @author darthjee
|
6
|
+
#
|
4
7
|
# Definition of the code or block to be aded as method
|
5
8
|
class MethodDefinition
|
9
|
+
# Returns a new instance of MethodDefinition
|
10
|
+
#
|
6
11
|
# @overload initialize(name, code)
|
7
12
|
# @overload initialize(name, &block)
|
8
13
|
#
|
9
|
-
# @param name [String
|
14
|
+
# @param name [String,Symbol] name of the method
|
10
15
|
# @param code [String] code to be evaluated as method
|
11
16
|
# @param block [Proc] block with code to be added as method
|
12
17
|
#
|
@@ -22,7 +27,10 @@ class Sinclair
|
|
22
27
|
end
|
23
28
|
|
24
29
|
# Adds the method to given klass
|
30
|
+
#
|
25
31
|
# @param klass [Class] class which will receive the new method
|
32
|
+
#
|
33
|
+
# @return [Symbol] name of the created method
|
26
34
|
def build(klass)
|
27
35
|
if code.is_a?(String)
|
28
36
|
build_code_method(klass)
|
@@ -33,16 +41,32 @@ class Sinclair
|
|
33
41
|
|
34
42
|
private
|
35
43
|
|
44
|
+
# @private
|
36
45
|
attr_reader :name, :code, :block
|
37
46
|
|
47
|
+
# @private
|
48
|
+
#
|
49
|
+
# Add method from block
|
50
|
+
#
|
51
|
+
# @return [Symbol] name of the created method
|
38
52
|
def build_block_method(klass)
|
39
53
|
klass.send(:define_method, name, block)
|
40
54
|
end
|
41
55
|
|
56
|
+
# @private
|
57
|
+
#
|
58
|
+
# Add method from String code
|
59
|
+
#
|
60
|
+
# @return [Symbol] name of the created method
|
42
61
|
def build_code_method(klass)
|
43
62
|
klass.module_eval(code_definition, __FILE__, __LINE__ + 1)
|
44
63
|
end
|
45
64
|
|
65
|
+
# @private
|
66
|
+
#
|
67
|
+
# Builds full code of method
|
68
|
+
#
|
69
|
+
# @return [String]
|
46
70
|
def code_definition
|
47
71
|
<<-CODE
|
48
72
|
def #{name}
|
@@ -1,6 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Sinclair
|
4
|
+
# @api public
|
5
|
+
#
|
6
|
+
# @author darthjee
|
7
|
+
#
|
4
8
|
# Concern for easily adding options
|
5
9
|
#
|
6
10
|
# @example
|
@@ -28,8 +32,14 @@ class Sinclair
|
|
28
32
|
|
29
33
|
private
|
30
34
|
|
35
|
+
# @!visibility public
|
31
36
|
attr_reader :options
|
32
37
|
|
38
|
+
# @!visibility public
|
39
|
+
#
|
40
|
+
# Builds an openstruct of the Hash
|
41
|
+
#
|
42
|
+
# @return [OpenStruct]
|
33
43
|
def options_object
|
34
44
|
@options_object ||= OpenStruct.new options
|
35
45
|
end
|
data/lib/sinclair/version.rb
CHANGED
data/sinclair.gemspec
CHANGED
@@ -21,11 +21,13 @@ Gem::Specification.new do |gem|
|
|
21
21
|
|
22
22
|
gem.add_runtime_dependency 'activesupport', '~> 5.2.0'
|
23
23
|
|
24
|
-
gem.add_development_dependency 'bundler',
|
25
|
-
gem.add_development_dependency 'pry-nav'
|
26
|
-
gem.add_development_dependency 'rake',
|
27
|
-
gem.add_development_dependency 'rspec',
|
28
|
-
gem.add_development_dependency 'rubocop'
|
29
|
-
gem.add_development_dependency '
|
30
|
-
gem.add_development_dependency '
|
24
|
+
gem.add_development_dependency 'bundler', '~> 1.16.1'
|
25
|
+
gem.add_development_dependency 'pry-nav', '~> 0.2.4'
|
26
|
+
gem.add_development_dependency 'rake', '>= 12.3.1'
|
27
|
+
gem.add_development_dependency 'rspec', '>= 3.8'
|
28
|
+
gem.add_development_dependency 'rubocop', '0.58.1'
|
29
|
+
gem.add_development_dependency 'rubocop-rspec', '1.30.0'
|
30
|
+
gem.add_development_dependency 'simplecov', '~> 0.16.x'
|
31
|
+
gem.add_development_dependency 'yard', '>= 0.9.18'
|
32
|
+
gem.add_development_dependency 'yardstick', '>= 0.9.9'
|
31
33
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Sinclair::Matchers::AddMethod do
|
6
|
+
describe 'yard' do
|
7
|
+
describe '#to' do
|
8
|
+
context 'checking against Class' do
|
9
|
+
let(:clazz) { Class.new }
|
10
|
+
let(:builder) { Sinclair.new(clazz) }
|
11
|
+
|
12
|
+
before do
|
13
|
+
builder.add_method(:new_method, '2')
|
14
|
+
end
|
15
|
+
|
16
|
+
it do
|
17
|
+
expect { builder.build }.to add_method(:new_method).to(clazz)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'checking against instance' do
|
22
|
+
let(:clazz) { Class.new }
|
23
|
+
let(:builder) { Sinclair.new(clazz) }
|
24
|
+
let(:instance) { clazz.new }
|
25
|
+
|
26
|
+
before do
|
27
|
+
builder.add_method(:the_method, 'true')
|
28
|
+
end
|
29
|
+
|
30
|
+
it do
|
31
|
+
expect { builder.build }.to add_method(:the_method).to(instance)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinclair
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- DarthJee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -30,98 +30,126 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.16.1
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.16.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry-nav
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 0.2.4
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 0.2.4
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 12.
|
61
|
+
version: 12.3.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 12.
|
68
|
+
version: 12.3.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.8'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.8'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 0.58.1
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.58.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop-rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
95
102
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
103
|
+
version: 1.30.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 1.30.0
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: simplecov
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.16.
|
117
|
+
version: 0.16.x
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.16.
|
124
|
+
version: 0.16.x
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: yard
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
116
130
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
131
|
+
version: 0.9.18
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.9.18
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: yardstick
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.9.9
|
118
146
|
type: :development
|
119
147
|
prerelease: false
|
120
148
|
version_requirements: !ruby/object:Gem::Requirement
|
121
149
|
requirements:
|
122
150
|
- - ">="
|
123
151
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
152
|
+
version: 0.9.9
|
125
153
|
description: Gem for easy concern creation
|
126
154
|
email:
|
127
155
|
- darthjee@gmail.com
|
@@ -134,10 +162,13 @@ files:
|
|
134
162
|
- ".rspec"
|
135
163
|
- ".rubocop.yml"
|
136
164
|
- ".rubocop_todo.yml"
|
165
|
+
- Dockerfile
|
137
166
|
- Gemfile
|
138
167
|
- LICENSE
|
139
168
|
- README.md
|
140
169
|
- Rakefile
|
170
|
+
- config/yardstick.rb
|
171
|
+
- config/yardstick.yml
|
141
172
|
- docker-compose.yml
|
142
173
|
- lib/sinclair.rb
|
143
174
|
- lib/sinclair/matchers.rb
|
@@ -146,12 +177,14 @@ files:
|
|
146
177
|
- lib/sinclair/method_definition.rb
|
147
178
|
- lib/sinclair/options_parser.rb
|
148
179
|
- lib/sinclair/version.rb
|
180
|
+
- scripts/check_readme.sh
|
149
181
|
- sinclair.gemspec
|
150
182
|
- sinclair.jpg
|
151
183
|
- spec/integration/matcher_spec.rb
|
152
184
|
- spec/integration/readme/matcher_spec.rb
|
153
185
|
- spec/integration/readme/my_class_spec.rb
|
154
186
|
- spec/integration/readme_spec.rb
|
187
|
+
- spec/integration/yard/matchers/add_method_spec.rb
|
155
188
|
- spec/integration/yard/matchers/add_method_to_spec.rb
|
156
189
|
- spec/integration/yard/options_parser_spec.rb
|
157
190
|
- spec/integration/yard/sinclair_spec.rb
|
@@ -192,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
225
|
version: '0'
|
193
226
|
requirements: []
|
194
227
|
rubyforge_project:
|
195
|
-
rubygems_version: 2.6
|
228
|
+
rubygems_version: 2.7.6
|
196
229
|
signing_key:
|
197
230
|
specification_version: 4
|
198
231
|
summary: Gem for easy concern creation
|