sinclair 1.4.2 → 1.5.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/.circleci/config.yml +4 -1
- data/Dockerfile +3 -3
- data/README.md +1 -1
- data/config/check_specs.yml +5 -0
- data/config/yardstick.yml +3 -0
- data/lib/sinclair.rb +26 -9
- data/lib/sinclair/config/methods_builder.rb +3 -1
- data/lib/sinclair/config_factory.rb +4 -2
- data/lib/sinclair/matchers/add_class_method_to.rb +1 -0
- data/lib/sinclair/method_builder.rb +61 -0
- data/lib/sinclair/method_builder/base.rb +67 -0
- data/lib/sinclair/method_builder/block_method_builder.rb +34 -0
- data/lib/sinclair/method_builder/string_method_builder.rb +50 -0
- data/lib/sinclair/method_definition.rb +38 -17
- data/lib/sinclair/method_definition/block_definition.rb +8 -94
- data/lib/sinclair/method_definition/block_helper.rb +46 -0
- data/lib/sinclair/method_definition/string_definition.rb +7 -66
- data/lib/sinclair/method_definitions.rb +16 -4
- data/lib/sinclair/version.rb +1 -1
- data/sinclair.gemspec +1 -1
- data/spec/lib/sinclair/method_builder/block_method_builder_spec.rb +55 -0
- data/spec/lib/sinclair/method_builder/string_method_builder_spec.rb +54 -0
- data/spec/lib/sinclair/method_builder_spec.rb +53 -0
- data/spec/lib/sinclair/method_definition/block_definition_spec.rb +66 -0
- data/spec/lib/sinclair/method_definition/block_helper_spec.rb +111 -0
- data/spec/lib/sinclair/method_definition/string_definition_spec.rb +70 -0
- data/spec/lib/sinclair/method_definition_spec.rb +23 -88
- data/spec/lib/sinclair/method_definitions_spec.rb +45 -0
- data/spec/support/models/random_generator.rb +13 -0
- metadata +18 -20
- data/lib/sinclair/method_definition/class_block_definition.rb +0 -22
- data/lib/sinclair/method_definition/class_method_definition.rb +0 -50
- data/lib/sinclair/method_definition/class_string_definition.rb +0 -24
- data/lib/sinclair/method_definition/instance_block_definition.rb +0 -22
- data/lib/sinclair/method_definition/instance_method_definition.rb +0 -48
- data/lib/sinclair/method_definition/instance_string_definition.rb +0 -24
- data/spec/integration/yard/sinclair/method_definition/class_block_definition_spec.rb +0 -34
- data/spec/integration/yard/sinclair/method_definition/class_method_definition_spec.rb +0 -28
- data/spec/integration/yard/sinclair/method_definition/class_string_definition_spec.rb +0 -23
- data/spec/integration/yard/sinclair/method_definition/instance_block_definition_spec.rb +0 -25
- data/spec/integration/yard/sinclair/method_definition/instance_method_definition_spec.rb +0 -35
- data/spec/integration/yard/sinclair/method_definition/instance_string_definition_spec.rb +0 -32
- data/spec/lib/sinclair/method_definition/class_block_definition_spec.rb +0 -29
- data/spec/lib/sinclair/method_definition/class_string_definition_spec.rb +0 -27
- data/spec/lib/sinclair/method_definition/instance_block_definition_spec.rb +0 -30
- data/spec/lib/sinclair/method_definition/instance_string_definition_spec.rb +0 -28
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Sinclair
|
4
|
-
class MethodDefinition
|
5
|
-
# @api private
|
6
|
-
# @author darthjee
|
7
|
-
#
|
8
|
-
# Define an class method from block
|
9
|
-
class ClassBlockDefinition < BlockDefinition
|
10
|
-
private
|
11
|
-
|
12
|
-
# @private
|
13
|
-
#
|
14
|
-
# Method used to define a class method
|
15
|
-
#
|
16
|
-
# @return [Symbol] Always :define_singleton_method
|
17
|
-
def method_definer
|
18
|
-
:define_singleton_method
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Sinclair
|
4
|
-
class MethodDefinition
|
5
|
-
# @api private
|
6
|
-
# @author darthjee
|
7
|
-
#
|
8
|
-
# Module responsible for building class method definitions
|
9
|
-
module ClassMethodDefinition
|
10
|
-
# Returns an instance method definition
|
11
|
-
#
|
12
|
-
# When block is given returns an instance of
|
13
|
-
# {InstanceBlockDefinition}, and when not, returns
|
14
|
-
# {InstanceStringDefinition}
|
15
|
-
#
|
16
|
-
# @param name [String,Symbol] name of the method
|
17
|
-
# @param code [String] code to be evaluated as method
|
18
|
-
# @param block [Proc] block with code to be added as method
|
19
|
-
# @param options [Hash] Options of construction
|
20
|
-
# @option options cached [Boolean] Flag telling to create
|
21
|
-
# a method with cache
|
22
|
-
#
|
23
|
-
# @example With cache
|
24
|
-
# klass = Class.new
|
25
|
-
#
|
26
|
-
# method_definition = Sinclair::MethodDefinition::InstanceMethodDefinition.from(
|
27
|
-
# :sequence, cached: true
|
28
|
-
# ) do
|
29
|
-
# @x = @x.to_i ** 2 + 1
|
30
|
-
# end
|
31
|
-
#
|
32
|
-
# method_definition.build(klass)
|
33
|
-
#
|
34
|
-
# klass.sequence # returns 1
|
35
|
-
# klass.sequence # returns 1
|
36
|
-
#
|
37
|
-
# klass.instance_variable_get(:@x) # returns 1
|
38
|
-
# klass.instance_variable_get(:@sequence) # returns 1
|
39
|
-
#
|
40
|
-
# @return MethodDefinition
|
41
|
-
def self.from(name, code = nil, **options, &block)
|
42
|
-
if block
|
43
|
-
ClassBlockDefinition.new(name, **options, &block)
|
44
|
-
else
|
45
|
-
ClassStringDefinition.new(name, code, **options)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Sinclair
|
4
|
-
class MethodDefinition
|
5
|
-
# @api private
|
6
|
-
# @author darthjee
|
7
|
-
#
|
8
|
-
# Define a method from string
|
9
|
-
class ClassStringDefinition < StringDefinition
|
10
|
-
private
|
11
|
-
|
12
|
-
# @private
|
13
|
-
#
|
14
|
-
# String used when defining method
|
15
|
-
#
|
16
|
-
# Class definition appends +self.+ to method name
|
17
|
-
#
|
18
|
-
# @return [String]
|
19
|
-
def method_name
|
20
|
-
"self.#{name}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Sinclair
|
4
|
-
class MethodDefinition
|
5
|
-
# @api private
|
6
|
-
# @author darthjee
|
7
|
-
#
|
8
|
-
# Define a method from block
|
9
|
-
class InstanceBlockDefinition < BlockDefinition
|
10
|
-
private
|
11
|
-
|
12
|
-
# @private
|
13
|
-
#
|
14
|
-
# Method used to define an instance method
|
15
|
-
#
|
16
|
-
# @return [Symbol] Always :define_method
|
17
|
-
def method_definer
|
18
|
-
:define_method
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Sinclair
|
4
|
-
class MethodDefinition
|
5
|
-
# @api private
|
6
|
-
# @author darthjee
|
7
|
-
#
|
8
|
-
# Module responsible for building instance method definitions
|
9
|
-
module InstanceMethodDefinition
|
10
|
-
# Returns an instance method definition
|
11
|
-
#
|
12
|
-
# When block is given returns an instance of
|
13
|
-
# {InstanceBlockDefinition}, and when not, returns
|
14
|
-
# {InstanceStringDefinition}
|
15
|
-
#
|
16
|
-
# @param name [String,Symbol] name of the method
|
17
|
-
# @param code [String] code to be evaluated as method
|
18
|
-
# @param block [Proc] block with code to be added as method
|
19
|
-
# @param options [Hash] Options of construction
|
20
|
-
# @option options cached [Boolean] Flag telling to create
|
21
|
-
# a method with cache
|
22
|
-
#
|
23
|
-
# @example
|
24
|
-
# klass = Class.new
|
25
|
-
#
|
26
|
-
# method_definition = Sinclair::MethodDefinition::InstanceMethodDefinition.from(
|
27
|
-
# :sequence, '@x = @x.to_i ** 2 + 1'
|
28
|
-
# )
|
29
|
-
#
|
30
|
-
# method_definition.build(klass)
|
31
|
-
#
|
32
|
-
# instance = klass.new
|
33
|
-
#
|
34
|
-
# instance.sequence # returns 1
|
35
|
-
# instance.sequence # returns 2
|
36
|
-
# instance.sequence # returns 5
|
37
|
-
#
|
38
|
-
# @return MethodDefinition
|
39
|
-
def self.from(name, code = nil, **options, &block)
|
40
|
-
if block
|
41
|
-
InstanceBlockDefinition.new(name, **options, &block)
|
42
|
-
else
|
43
|
-
InstanceStringDefinition.new(name, code, **options)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Sinclair
|
4
|
-
class MethodDefinition
|
5
|
-
# @api private
|
6
|
-
# @author darthjee
|
7
|
-
#
|
8
|
-
# Define an instance method from string
|
9
|
-
class InstanceStringDefinition < StringDefinition
|
10
|
-
private
|
11
|
-
|
12
|
-
# @private
|
13
|
-
#
|
14
|
-
# String used when defining method
|
15
|
-
#
|
16
|
-
# Instance definition always returns +name+
|
17
|
-
#
|
18
|
-
# @return [String]
|
19
|
-
def method_name
|
20
|
-
name
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Sinclair::MethodDefinition::ClassBlockDefinition do
|
6
|
-
describe 'yard' do
|
7
|
-
describe '#build' do
|
8
|
-
subject(:method_definition) do
|
9
|
-
described_class.new(name) do
|
10
|
-
@x = @x.to_i**2 + 1
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:klass) { Class.new }
|
15
|
-
let(:name) { :sequence }
|
16
|
-
|
17
|
-
it 'adds a dynamic method' do
|
18
|
-
expect { method_definition.build(klass) }.to add_class_method(name).to(klass)
|
19
|
-
expect { klass.sequence }
|
20
|
-
.to change { klass.instance_variable_get(:@x) }.from(nil).to 1
|
21
|
-
expect(klass.sequence).to eq(2)
|
22
|
-
expect(klass.sequence).to eq(5)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'changes instance variable' do
|
26
|
-
method_definition.build(klass)
|
27
|
-
|
28
|
-
expect { klass.sequence }
|
29
|
-
.to change { klass.instance_variable_get(:@x) }
|
30
|
-
.from(nil).to 1
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Sinclair::MethodDefinition::ClassMethodDefinition do
|
6
|
-
describe 'yard' do
|
7
|
-
describe '#build' do
|
8
|
-
describe 'using block with cache option' do
|
9
|
-
subject(:method_definition) do
|
10
|
-
described_class.from(name, cached: true) do
|
11
|
-
@x = @x.to_i**2 + 1
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:klass) { Class.new }
|
16
|
-
let(:name) { :sequence }
|
17
|
-
|
18
|
-
it 'adds a dynamic method' do
|
19
|
-
expect { method_definition.build(klass) }.to add_class_method(name).to(klass)
|
20
|
-
expect { klass.sequence }
|
21
|
-
.to change { klass.instance_variable_get(:@x) }.from(nil).to 1
|
22
|
-
expect { klass.sequence }.not_to change(klass, :sequence)
|
23
|
-
expect(klass.instance_variable_get(:@sequence)).to eq(1)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Sinclair::MethodDefinition::ClassStringDefinition do
|
4
|
-
describe 'yard' do
|
5
|
-
describe '#build' do
|
6
|
-
subject(:method_definition) do
|
7
|
-
described_class.new(name, code, cached: true)
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:klass) { Class.new }
|
11
|
-
let(:code) { '@x = @x.to_i ** 2 + 1' }
|
12
|
-
let(:name) { :sequence }
|
13
|
-
|
14
|
-
it 'adds a dynamic method' do
|
15
|
-
expect { method_definition.build(klass) }.to add_class_method(name).to(klass)
|
16
|
-
expect { klass.sequence }
|
17
|
-
.to change { klass.instance_variable_get(:@x) }.from(nil).to(1)
|
18
|
-
expect { klass.sequence }.not_to change(klass, :sequence)
|
19
|
-
expect(klass.instance_variable_get(:@sequence)).to eq(1)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Sinclair::MethodDefinition::InstanceBlockDefinition do
|
4
|
-
describe 'yard' do
|
5
|
-
describe '#build' do
|
6
|
-
subject(:method_definition) do
|
7
|
-
described_class.new(name, cached: true) do
|
8
|
-
@x = @x.to_i**2 + 1
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
let(:klass) { Class.new }
|
13
|
-
let(:instance) { klass.new }
|
14
|
-
let(:name) { :sequence }
|
15
|
-
|
16
|
-
it 'adds a dynamic method' do
|
17
|
-
expect { method_definition.build(klass) }.to add_method(name).to(instance)
|
18
|
-
expect { instance.sequence }
|
19
|
-
.to change { instance.instance_variable_get(:@x) }.from(nil).to(1)
|
20
|
-
expect { instance.sequence }.not_to change(instance, :sequence)
|
21
|
-
expect(instance.instance_variable_get(:@sequence)).to eq(1)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Sinclair::MethodDefinition::InstanceMethodDefinition do
|
6
|
-
describe 'yard' do
|
7
|
-
describe '#from' do
|
8
|
-
describe 'using string method with no options' do
|
9
|
-
subject(:method_definition) do
|
10
|
-
described_class.from(name, code)
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:klass) { Class.new }
|
14
|
-
let(:instance) { klass.new }
|
15
|
-
let(:code) { '@x = @x.to_i ** 2 + 1' }
|
16
|
-
let(:name) { :sequence }
|
17
|
-
|
18
|
-
it 'adds a dynamic method' do
|
19
|
-
expect { method_definition.build(klass) }.to add_method(name).to(instance)
|
20
|
-
expect(instance.sequence).to eq(1)
|
21
|
-
expect(instance.sequence).to eq(2)
|
22
|
-
expect(instance.sequence).to eq(5)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'changes instance variable' do
|
26
|
-
method_definition.build(klass)
|
27
|
-
|
28
|
-
expect { instance.sequence }
|
29
|
-
.to change { instance.instance_variable_get(:@x) }
|
30
|
-
.from(nil).to 1
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
describe Sinclair::MethodDefinition::InstanceStringDefinition do
|
4
|
-
describe 'yard' do
|
5
|
-
describe '#build' do
|
6
|
-
subject(:method_definition) do
|
7
|
-
described_class.new(name, code)
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:klass) { Class.new }
|
11
|
-
let(:instance) { klass.new }
|
12
|
-
let(:code) { '@x = @x.to_i ** 2 + 1' }
|
13
|
-
let(:name) { :sequence }
|
14
|
-
|
15
|
-
it 'adds a dynamic method' do
|
16
|
-
expect { method_definition.build(klass) }.to add_method(name).to(instance)
|
17
|
-
expect { instance.sequence }
|
18
|
-
.to change { instance.instance_variable_get(:@x) }.from(nil).to 1
|
19
|
-
expect(instance.sequence).to eq(2)
|
20
|
-
expect(instance.sequence).to eq(5)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'changes instance variable' do
|
24
|
-
method_definition.build(klass)
|
25
|
-
|
26
|
-
expect { instance.sequence }
|
27
|
-
.to change { instance.instance_variable_get(:@x) }
|
28
|
-
.from(nil).to 1
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Sinclair::MethodDefinition::ClassBlockDefinition do
|
6
|
-
let(:klass) { Class.new }
|
7
|
-
|
8
|
-
describe '#build' do
|
9
|
-
subject(:method_definition) do
|
10
|
-
described_class.new(method_name) do
|
11
|
-
@x = @x.to_i + 1
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
let(:method_name) { :the_method }
|
16
|
-
|
17
|
-
it_behaves_like 'ClassMethodDefinition#build without cache'
|
18
|
-
|
19
|
-
context 'with cached options' do
|
20
|
-
subject(:method_definition) do
|
21
|
-
described_class.new(method_name, cached: cached_option) do
|
22
|
-
@x = @x.to_i + 1
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it_behaves_like 'ClassMethodDefinition#build with cache options'
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Sinclair::MethodDefinition::ClassStringDefinition do
|
6
|
-
let(:klass) { Class.new }
|
7
|
-
|
8
|
-
describe '#build' do
|
9
|
-
subject(:method_definition) do
|
10
|
-
described_class.new(method_name, code)
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:method_name) { :the_method }
|
14
|
-
|
15
|
-
let(:code) { '@x = @x.to_i + 1' }
|
16
|
-
|
17
|
-
it_behaves_like 'ClassMethodDefinition#build without cache'
|
18
|
-
|
19
|
-
context 'with cached options' do
|
20
|
-
subject(:method_definition) do
|
21
|
-
described_class.new(method_name, code, cached: cached_option)
|
22
|
-
end
|
23
|
-
|
24
|
-
it_behaves_like 'ClassMethodDefinition#build with cache options'
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe Sinclair::MethodDefinition::InstanceBlockDefinition do
|
6
|
-
let(:klass) { Class.new }
|
7
|
-
let(:instance) { klass.new }
|
8
|
-
|
9
|
-
describe '#build' do
|
10
|
-
subject(:method_definition) do
|
11
|
-
described_class.new(method_name) do
|
12
|
-
@x = @x.to_i + 1
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
let(:method_name) { :the_method }
|
17
|
-
|
18
|
-
it_behaves_like 'MethodDefinition#build without cache'
|
19
|
-
|
20
|
-
context 'with cached options' do
|
21
|
-
subject(:method_definition) do
|
22
|
-
described_class.new(method_name, cached: cached_option) do
|
23
|
-
@x = @x.to_i + 1
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it_behaves_like 'MethodDefinition#build with cache options'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|