sinclair 1.1.3 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,14 +2,15 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe 'yard' do
6
- describe Sinclair::OptionsParser do
5
+ describe Sinclair::OptionsParser do
6
+ describe 'yard' do
7
+ subject(:model) { described_class::Dummy.new(options) }
8
+
7
9
  let(:options) { { switch: false, option_1: 10, option_2: 20 } }
8
- subject { described_class::Dummy.new(options) }
9
10
 
10
11
  describe '#the_method' do
11
12
  it 'returns the value for option given' do
12
- expect(subject.the_method).to eq('The value is not 10 but 20')
13
+ expect(model.the_method).to eq('The value is not 10 but 20')
13
14
  end
14
15
  end
15
16
  end
@@ -2,27 +2,27 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
- describe 'yarn' do
6
- describe Sinclair do
7
- let(:klass) { Class.new(MyModel) }
8
- let(:instance) { klass.new }
9
- let(:builder) { Sinclair.new(klass) }
5
+ describe Sinclair do
6
+ describe 'yarn' do
7
+ let(:klass) { Class.new(MyModel) }
8
+ let(:instance) { klass.new }
9
+ let(:builder) { described_class.new(klass) }
10
10
  let(:default_value) { 10 }
11
11
 
12
12
  describe '#initialize' do
13
13
  describe '#total_price' do
14
14
  before do
15
- subject.eval_and_add_method(:total_price) do
15
+ builder.eval_and_add_method(:total_price) do
16
16
  code = 'self.value * self.quantity'
17
17
  code.concat ' rescue 0' if options_object.rescue_error
18
18
  code
19
19
  end
20
20
 
21
- subject.build
21
+ builder.build
22
22
  end
23
23
 
24
24
  context 'without options' do
25
- subject { Sinclair.new(klass, rescue_error: true) }
25
+ subject(:builder) { described_class.new(klass, rescue_error: true) }
26
26
 
27
27
  let(:klass) { Class.new(Purchase) }
28
28
  let(:instance) { klass.new(2.3, 5) }
@@ -33,7 +33,7 @@ describe 'yarn' do
33
33
  end
34
34
 
35
35
  context 'with options' do
36
- subject { Sinclair.new(klass) }
36
+ subject(:model) { described_class.new(klass) }
37
37
 
38
38
  let(:klass) { Class.new(Purchase) }
39
39
  let(:instance) { klass.new(2.3, 5) }
@@ -63,8 +63,9 @@ describe 'yarn' do
63
63
  builder.add_method(:value=) { |val| @value = val }
64
64
  end
65
65
 
66
- context 'after the build' do
66
+ describe 'after the build' do
67
67
  before { builder.build }
68
+
68
69
  it 'creates the expected methods' do
69
70
  expect(instance.value).to eq(10)
70
71
  end
@@ -80,7 +81,7 @@ describe 'yarn' do
80
81
  end
81
82
  end
82
83
 
83
- context 'calling the build' do
84
+ context 'when calling the build' do
84
85
  it do
85
86
  expect do
86
87
  builder.build
@@ -112,13 +113,10 @@ describe 'yarn' do
112
113
  expect(instance.bond_name).to eq('wick, john wick')
113
114
  end
114
115
  end
115
-
116
- describe '#bond_style' do
117
- end
118
116
  end
119
117
 
120
118
  describe '#eval_and_add_method' do
121
- subject { klass.new }
119
+ subject(:builder) { klass.new }
122
120
 
123
121
  let(:klass) do
124
122
  Class.new do
@@ -131,18 +129,18 @@ describe 'yarn' do
131
129
  describe '#age' do
132
130
  context 'when it has not been initialized' do
133
131
  it do
134
- expect(subject.age).to eq(20)
132
+ expect(builder.age).to eq(20)
135
133
  end
136
134
  end
137
135
 
138
136
  context 'when it has been initialized' do
139
137
  before do
140
- subject.age
141
- subject.age = 30
138
+ builder.age
139
+ builder.age = 30
142
140
  end
143
141
 
144
142
  it do
145
- expect(subject.age).to eq(30)
143
+ expect(builder.age).to eq(30)
146
144
  end
147
145
  end
148
146
  end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Sinclair::Matchers::AddMethod do
6
- subject { described_class.new(method) }
6
+ subject(:matcher) { described_class.new(method) }
7
7
 
8
8
  let(:method) { :the_method }
9
9
  let(:klass) { Class.new }
@@ -11,22 +11,21 @@ describe Sinclair::Matchers::AddMethod do
11
11
 
12
12
  describe '#to' do
13
13
  it do
14
- expect(subject.to(klass.new)).to be_a(Sinclair::Matchers::AddMethodTo)
14
+ expect(matcher.to(klass.new)).to be_a(Sinclair::Matchers::AddMethodTo)
15
15
  end
16
16
 
17
17
  it 'returns an add_method_to' do
18
- expect(subject.to(instance)).to eq(Sinclair::Matchers::AddMethodTo.new(instance, method))
18
+ expect(matcher.to(instance)).to eq(Sinclair::Matchers::AddMethodTo.new(instance, method))
19
19
  end
20
20
  end
21
21
 
22
22
  describe '#matches?' do
23
23
  it do
24
- expect do
25
- subject.matches?(proc {})
26
- end.to raise_error(
27
- SyntaxError, 'You should specify which instance the method is being added to' \
24
+ expect { matcher.matches?(proc {}) }
25
+ .to raise_error(
26
+ SyntaxError, 'You should specify which instance the method is being added to' \
28
27
  "add_method(:#{method}).to(instance)"
29
- )
28
+ )
30
29
  end
31
30
  end
32
31
  end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Sinclair::Matchers::AddMethodTo do
6
- subject { described_class.new(instance, method) }
6
+ subject(:matcher) { described_class.new(instance, method) }
7
7
 
8
8
  let(:method) { :the_method }
9
9
  let(:klass) { Class.new }
@@ -15,13 +15,13 @@ describe Sinclair::Matchers::AddMethodTo do
15
15
  end
16
16
 
17
17
  context 'when a method is added' do
18
- it { expect(subject.matches?(event_proc)).to be_truthy }
18
+ it { expect(matcher).to be_matches(event_proc) }
19
19
  end
20
20
 
21
21
  context 'when a method is not added' do
22
22
  let(:event_proc) { proc {} }
23
23
 
24
- it { expect(subject.matches?(event_proc)).to be_falsey }
24
+ it { expect(matcher).not_to be_matches(event_proc) }
25
25
  end
26
26
 
27
27
  context 'when the wrong method is added' do
@@ -29,69 +29,71 @@ describe Sinclair::Matchers::AddMethodTo do
29
29
  proc { klass.send(:define_method, :another_method) {} }
30
30
  end
31
31
 
32
- it { expect(subject.matches?(event_proc)).to be_falsey }
32
+ it { expect(matcher).not_to be_matches(event_proc) }
33
33
  end
34
34
 
35
35
  context 'when initializing with class' do
36
- subject { described_class.new(klass, method) }
36
+ subject(:matcher) { described_class.new(klass, method) }
37
37
 
38
38
  context 'when a method is added' do
39
- it { expect(subject.matches?(event_proc)).to be_truthy }
39
+ it { expect(matcher).to be_matches(event_proc) }
40
40
  end
41
41
  end
42
42
  end
43
43
 
44
44
  describe '#failure_message_for_should' do
45
45
  it 'returns information on the instance class and method' do
46
- expect(subject.failure_message_for_should)
46
+ expect(matcher.failure_message_for_should)
47
47
  .to eq("expected '#{method}' to be added to #{klass} but it didn't")
48
48
  end
49
49
 
50
50
  context 'when method already exited' do
51
51
  before do
52
52
  klass.send(:define_method, method) {}
53
- subject.matches?(proc {})
53
+ matcher.matches?(proc {})
54
54
  end
55
55
 
56
56
  it 'returns information on the instance class and method' do
57
- expect(subject.failure_message_for_should)
57
+ expect(matcher.failure_message_for_should)
58
58
  .to eq("expected '#{method}' to be added to #{klass} but it already existed")
59
59
  end
60
60
  end
61
61
 
62
62
  context 'when initializing with class' do
63
- subject { described_class.new(klass, method) }
63
+ subject(:matcher) { described_class.new(klass, method) }
64
64
 
65
65
  it 'returns information on the instance class and method' do
66
- expect(subject.failure_message_for_should)
66
+ expect(matcher.failure_message_for_should)
67
67
  .to eq("expected '#{method}' to be added to #{klass} but it didn't")
68
68
  end
69
+ end
69
70
 
70
- context 'when method already exited' do
71
- before do
72
- klass.send(:define_method, method) {}
73
- subject.matches?(proc {})
74
- end
71
+ context 'when initializing with class and method already exited' do
72
+ subject(:matcher) { described_class.new(klass, method) }
75
73
 
76
- it 'returns information on the instance class and method' do
77
- expect(subject.failure_message_for_should)
78
- .to eq("expected '#{method}' to be added to #{klass} but it already existed")
79
- end
74
+ before do
75
+ klass.send(:define_method, method) {}
76
+ matcher.matches?(proc {})
77
+ end
78
+
79
+ it 'returns information on the instance class and method' do
80
+ expect(matcher.failure_message_for_should)
81
+ .to eq("expected '#{method}' to be added to #{klass} but it already existed")
80
82
  end
81
83
  end
82
84
  end
83
85
 
84
86
  describe '#failure_message_for_should_not' do
85
87
  it 'returns information on the instance class and method' do
86
- expect(subject.failure_message_for_should_not)
88
+ expect(matcher.failure_message_for_should_not)
87
89
  .to eq("expected '#{method}' not to be added to #{klass} but it was")
88
90
  end
89
91
 
90
92
  context 'when initializing with class' do
91
- subject { described_class.new(klass, method) }
93
+ subject(:matcher) { described_class.new(klass, method) }
92
94
 
93
95
  it 'returns information on the instance class and method' do
94
- expect(subject.failure_message_for_should_not)
96
+ expect(matcher.failure_message_for_should_not)
95
97
  .to eq("expected '#{method}' not to be added to #{klass} but it was")
96
98
  end
97
99
  end
@@ -99,15 +101,15 @@ describe Sinclair::Matchers::AddMethodTo do
99
101
 
100
102
  describe 'description' do
101
103
  it 'returns information on the instance class and method' do
102
- expect(subject.description)
104
+ expect(matcher.description)
103
105
  .to eq("add method '#{method}' to #{klass} instances")
104
106
  end
105
107
 
106
108
  context 'when initializing with class' do
107
- subject { described_class.new(klass, method) }
109
+ subject(:matcher) { described_class.new(klass, method) }
108
110
 
109
111
  it 'returns information on the instance class and method' do
110
- expect(subject.description)
112
+ expect(matcher.description)
111
113
  .to eq("add method '#{method}' to #{klass} instances")
112
114
  end
113
115
  end
@@ -2,48 +2,103 @@
2
2
 
3
3
  require 'spec_helper'
4
4
 
5
+ shared_examples 'MethodDefinition#build' do
6
+ it do
7
+ expect { method_definition.build(klass) }.to add_method(method_name).to(klass)
8
+ end
9
+
10
+ describe 'after build' do
11
+ before do
12
+ method_definition.build(klass)
13
+ end
14
+
15
+ it 'adds the method to the klass instance' do
16
+ expect(instance).to respond_to(method_name)
17
+ end
18
+
19
+ it 'evaluates return of the method within the instance context' do
20
+ expect(instance.the_method).to eq(1)
21
+ end
22
+
23
+ it 'evaluates in the context of the instance' do
24
+ expect { instance.the_method }
25
+ .to change { instance.instance_variable_get(:@x) }
26
+ .from(nil).to(1)
27
+ end
28
+ end
29
+ end
30
+
5
31
  describe Sinclair::MethodDefinition do
6
- let(:klass) { Class.new }
32
+ let(:klass) { Class.new }
7
33
  let(:instance) { klass.new }
8
34
 
9
35
  describe '#build' do
10
36
  let(:method_name) { :the_method }
11
37
 
12
- context 'when method was defined with an string' do
13
- let(:code) { '"Self ==> " + self.to_s' }
38
+ context 'when method was defined with a string' do
39
+ subject(:method_definition) do
40
+ described_class.new(method_name, code)
41
+ end
14
42
 
15
- subject { described_class.new(method_name, code) }
43
+ let(:code) { '@x = @x.to_i + 1' }
16
44
 
17
- before do
18
- subject.build(klass)
19
- end
45
+ it_behaves_like 'MethodDefinition#build'
20
46
 
21
- it 'adds the method to the klass instance' do
22
- expect(instance).to respond_to(method_name)
47
+ it 'creates a dynamic method' do
48
+ method_definition.build(klass)
49
+ expect { instance.the_method }.to change(instance, :the_method)
50
+ .from(1).to(3)
23
51
  end
24
52
 
25
- it 'evaluates return of the method within the instance context' do
26
- expect(instance.the_method).to eq("Self ==> #{instance}")
53
+ context 'with cached options' do
54
+ subject(:method_definition) do
55
+ described_class.new(method_name, code, cached: true)
56
+ end
57
+
58
+ it_behaves_like 'MethodDefinition#build'
59
+
60
+ it 'creates a semi-dynamic method' do
61
+ method_definition.build(klass)
62
+ expect { instance.the_method }.not_to change(instance, :the_method)
63
+ end
27
64
  end
28
65
  end
29
66
 
30
67
  context 'when method was defined with a block' do
31
- subject do
68
+ subject(:method_definition) do
32
69
  described_class.new(method_name) do
33
- 'Self ==> ' + to_s
70
+ @x = @x.to_i + 1
34
71
  end
35
72
  end
36
73
 
37
- before do
38
- subject.build(klass)
39
- end
74
+ it_behaves_like 'MethodDefinition#build'
40
75
 
41
- it 'adds the method to the klass instance' do
42
- expect(instance).to respond_to(method_name)
76
+ it 'creates a dynamic method' do
77
+ method_definition.build(klass)
78
+ expect { instance.the_method }.to change(instance, :the_method)
79
+ .from(1).to(3)
43
80
  end
44
81
 
45
- it 'evaluates return of the method within the instance context' do
46
- expect(instance.the_method).to eq("Self ==> #{instance}")
82
+ context 'with cached options' do
83
+ subject(:method_definition) do
84
+ described_class.new(method_name, cached: true) do
85
+ @x = @x.to_i + 1
86
+ end
87
+ end
88
+
89
+ it_behaves_like 'MethodDefinition#build'
90
+
91
+ it 'creates a dynamic method' do
92
+ method_definition.build(klass)
93
+ expect { instance.the_method }.not_to change(instance, :the_method)
94
+ end
95
+
96
+ it 'sets the instance variable' do
97
+ method_definition.build(klass)
98
+ expect { instance.the_method }
99
+ .to change { instance.instance_variable_get("@#{method_name}") }
100
+ .from(nil).to(1)
101
+ end
47
102
  end
48
103
  end
49
104
  end
@@ -3,24 +3,22 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Sinclair::OptionsParser do
6
- let(:klass) { described_class::Dummy }
7
- let(:switched) { true }
8
- let(:value_1) { 'value1' }
9
- let(:options) { { switch: switched, option_1: value_1, option_2: 2 } }
6
+ subject(:model) { klass.new(options) }
10
7
 
11
- subject do
12
- klass.new(options)
13
- end
8
+ let(:klass) { described_class::Dummy }
9
+ let(:switched) { true }
10
+ let(:value_1) { 'value1' }
11
+ let(:options) { { switch: switched, option_1: value_1, option_2: 2 } }
14
12
 
15
13
  it 'enables the given options to be acced' do
16
- expect(subject.the_method).to eq('The value is value1')
14
+ expect(model.the_method).to eq('The value is value1')
17
15
  end
18
16
 
19
17
  context 'when changing the options' do
20
18
  let(:switched) { false }
21
19
 
22
20
  it 'enables the given options to be acced' do
23
- expect(subject.the_method).to eq('The value is not value1 but 2')
21
+ expect(model.the_method).to eq('The value is not value1 but 2')
24
22
  end
25
23
  end
26
24
 
@@ -28,33 +26,34 @@ describe Sinclair::OptionsParser do
28
26
  let(:options) { { option_1: 'value1', option_2: 2 } }
29
27
 
30
28
  it do
31
- expect { subject.the_method }.not_to raise_error
29
+ expect { model.the_method }.not_to raise_error
32
30
  end
33
31
 
34
32
  it 'considers is to be nil' do
35
- expect(subject.the_method).to eq('missing option')
33
+ expect(model.the_method).to eq('missing option')
36
34
  end
37
35
  end
38
36
 
39
37
  context 'when changing the options before the option call' do
40
38
  before do
41
- subject
39
+ model
42
40
  options[:switch] = false
43
41
  end
44
42
 
45
43
  it 'does not reevaluate the options' do
46
- expect(subject.the_method).to eq('The value is value1')
44
+ expect(model.the_method).to eq('The value is value1')
47
45
  end
48
46
 
49
47
  context 'when the option value is another object on its own' do
50
48
  let(:value_1) { { key: 'value' } }
49
+
51
50
  before do
52
- subject
51
+ model
53
52
  options[:option_1][:key] = 100
54
53
  end
55
54
 
56
55
  it 'does not reevaluate the options' do
57
- expect(subject.the_method).to eq('The value is {:key=>"value"}')
56
+ expect(model.the_method).to eq('The value is {:key=>"value"}')
58
57
  end
59
58
  end
60
59
  end