sinclair 1.3.0 → 1.3.1

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.
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Sinclair::MethodDefinition::BlockDefinition 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.from(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
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Sinclair::MethodDefinition::StringDefinition 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, code)
12
+ end
13
+
14
+ let(:method_name) { :the_method }
15
+
16
+ let(:code) { '@x = @x.to_i + 1' }
17
+
18
+ it_behaves_like 'MethodDefinition#build without cache'
19
+
20
+ context 'with cached options' do
21
+ subject(:method_definition) do
22
+ described_class.from(method_name, code, cached: cached_option)
23
+ end
24
+
25
+ it_behaves_like 'MethodDefinition#build with cache options'
26
+ end
27
+ end
28
+ end
@@ -2,32 +2,6 @@
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
-
31
5
  describe Sinclair::MethodDefinition do
32
6
  let(:klass) { Class.new }
33
7
  let(:instance) { klass.new }
@@ -35,70 +9,55 @@ describe Sinclair::MethodDefinition do
35
9
  describe '#build' do
36
10
  let(:method_name) { :the_method }
37
11
 
12
+ context 'when instantiating the class itself' do
13
+ subject(:method_definition) do
14
+ described_class.new(method_name)
15
+ end
16
+
17
+ it do
18
+ expect { method_definition.build(klass) }.to raise_error(
19
+ RuntimeError,
20
+ 'Build is implemented in subclasses. ' \
21
+ "Use #{described_class}.from to initialize a proper object"
22
+ )
23
+ end
24
+ end
25
+
38
26
  context 'when method was defined with a string' do
39
27
  subject(:method_definition) do
40
- described_class.new(method_name, code)
28
+ described_class.from(method_name, code)
41
29
  end
42
30
 
43
31
  let(:code) { '@x = @x.to_i + 1' }
44
32
 
45
- it_behaves_like 'MethodDefinition#build'
46
-
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)
51
- end
33
+ it_behaves_like 'MethodDefinition#build without cache'
52
34
 
53
35
  context 'with cached options' do
54
36
  subject(:method_definition) do
55
- described_class.new(method_name, code, cached: true)
37
+ described_class.from(method_name, code, cached: cached_option)
56
38
  end
57
39
 
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
40
+ it_behaves_like 'MethodDefinition#build with cache options'
64
41
  end
65
42
  end
66
43
 
67
44
  context 'when method was defined with a block' do
68
45
  subject(:method_definition) do
69
- described_class.new(method_name) do
46
+ described_class.from(method_name) do
70
47
  @x = @x.to_i + 1
71
48
  end
72
49
  end
73
50
 
74
- it_behaves_like 'MethodDefinition#build'
75
-
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)
80
- end
51
+ it_behaves_like 'MethodDefinition#build without cache'
81
52
 
82
53
  context 'with cached options' do
83
54
  subject(:method_definition) do
84
- described_class.new(method_name, cached: true) do
55
+ described_class.from(method_name, cached: cached_option) do
85
56
  @x = @x.to_i + 1
86
57
  end
87
58
  end
88
59
 
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
60
+ it_behaves_like 'MethodDefinition#build with cache options'
102
61
  end
103
62
  end
104
63
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DefaultValueBuilder < Sinclair
4
+ def add_default_values(*methods)
5
+ default_value = value
6
+
7
+ methods.each do |method|
8
+ add_method(method, cached: cache_type) { default_value }
9
+ end
10
+
11
+ build
12
+ end
13
+
14
+ private
15
+
16
+ delegate :accept_nil, :value, to: :options_object
17
+
18
+ def cache_type
19
+ accept_nil ? :full : :simple
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './spec/support/models/default_value_builder'
4
+
5
+ module DefaultValueable
6
+ def default_reader(*methods, value:, accept_nil: false)
7
+ DefaultValueBuilder.new(
8
+ self, value: value, accept_nil: accept_nil
9
+ ).add_default_values(*methods)
10
+ end
11
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class HttpJsonModel
4
+ attr_reader :json
5
+
6
+ class << self
7
+ def parse(attribute, path: [])
8
+ builder = Sinclair.new(self)
9
+
10
+ keys = (path + [attribute]).map(&:to_s)
11
+
12
+ builder.add_method(attribute) do
13
+ keys.inject(hash) { |h, key| h[key] }
14
+ end
15
+
16
+ builder.build
17
+ end
18
+ end
19
+
20
+ def initialize(json)
21
+ @json = json
22
+ end
23
+
24
+ def hash
25
+ @hash ||= JSON.parse(json)
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './spec/support/models/http_json_model'
4
+
5
+ class HttpPerson < HttpJsonModel
6
+ parse :uid
7
+ parse :name, path: [:personal_information]
8
+ parse :age, path: [:personal_information]
9
+ parse :username, path: [:digital_information]
10
+ parse :email, path: [:digital_information]
11
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require './spec/support/models/default_valueable'
4
+
5
+ class Server
6
+ extend DefaultValueable
7
+
8
+ attr_writer :host, :port
9
+
10
+ default_reader :host, value: 'server.com', accept_nil: false
11
+ default_reader :port, value: 80, accept_nil: true
12
+
13
+ def url
14
+ return "http://#{host}" unless port
15
+
16
+ "http://#{host}:#{port}"
17
+ end
18
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples 'MethodDefinition#build' do
4
+ it do
5
+ expect { method_definition.build(klass) }.to add_method(method_name).to(klass)
6
+ end
7
+
8
+ describe 'after build' do
9
+ before do
10
+ method_definition.build(klass)
11
+ end
12
+
13
+ it 'adds the method to the klass instance' do
14
+ expect(instance).to respond_to(method_name)
15
+ end
16
+
17
+ it 'evaluates return of the method within the instance context' do
18
+ expect(instance.the_method).to eq(1)
19
+ end
20
+
21
+ it 'evaluates in the context of the instance' do
22
+ expect { instance.the_method }
23
+ .to change { instance.instance_variable_get(:@x) }
24
+ .from(nil).to(1)
25
+ end
26
+ end
27
+ end
28
+
29
+ shared_examples 'MethodDefinition#build without cache' do
30
+ it_behaves_like 'MethodDefinition#build'
31
+
32
+ it 'creates a dynamic method' do
33
+ method_definition.build(klass)
34
+ expect { instance.the_method }.to change(instance, :the_method)
35
+ .from(1).to(3)
36
+ end
37
+ end
38
+
39
+ shared_examples 'MethodDefinition#build with cache' do
40
+ it_behaves_like 'MethodDefinition#build'
41
+
42
+ it 'creates a semi-dynamic method' do
43
+ method_definition.build(klass)
44
+ expect { instance.the_method }.not_to change(instance, :the_method)
45
+ end
46
+
47
+ it 'sets the instance variable' do
48
+ method_definition.build(klass)
49
+ expect { instance.the_method }
50
+ .to change { instance.instance_variable_get("@#{method_name}") }
51
+ .from(nil).to(1)
52
+ end
53
+ end
54
+
55
+ shared_examples 'MethodDefinition#build with cache options' do
56
+ context 'when cached is true' do
57
+ let(:cached_option) { true }
58
+
59
+ it_behaves_like 'MethodDefinition#build with cache'
60
+
61
+ context 'when instance variable has been set as nil' do
62
+ before do
63
+ method_definition.build(klass)
64
+ instance.instance_variable_set(:@the_method, nil)
65
+ end
66
+
67
+ it 'returns a new value' do
68
+ expect(instance.the_method).to eq(1)
69
+ end
70
+ end
71
+ end
72
+
73
+ context 'when cached is full' do
74
+ let(:cached_option) { :full }
75
+
76
+ it_behaves_like 'MethodDefinition#build with cache'
77
+
78
+ context 'when instance variable has been set as nil' do
79
+ before do
80
+ method_definition.build(klass)
81
+ instance.instance_variable_set(:@the_method, nil)
82
+ end
83
+
84
+ it 'returns always nil' do
85
+ expect(instance.the_method).to be_nil
86
+ end
87
+ end
88
+ end
89
+
90
+ context 'when cached is false' do
91
+ let(:cached_option) { false }
92
+
93
+ it_behaves_like 'MethodDefinition#build without cache'
94
+ end
95
+ end
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.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - DarthJee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-15 00:00:00.000000000 Z
11
+ date: 2019-06-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -194,6 +194,8 @@ files:
194
194
  - lib/sinclair/matchers/add_method.rb
195
195
  - lib/sinclair/matchers/add_method_to.rb
196
196
  - lib/sinclair/method_definition.rb
197
+ - lib/sinclair/method_definition/block_definition.rb
198
+ - lib/sinclair/method_definition/string_definition.rb
197
199
  - lib/sinclair/options_parser.rb
198
200
  - lib/sinclair/version.rb
199
201
  - scripts/check_readme.sh
@@ -202,6 +204,7 @@ files:
202
204
  - sinclair.jpg
203
205
  - spec/integration/readme/my_class_spec.rb
204
206
  - spec/integration/readme/my_model_spec.rb
207
+ - spec/integration/readme/sinclair/configurable_spec.rb
205
208
  - spec/integration/readme/sinclair/matchers_spec.rb
206
209
  - spec/integration/readme/sinclair_spec.rb
207
210
  - spec/integration/sinclair/matchers_spec.rb
@@ -211,6 +214,8 @@ files:
211
214
  - spec/integration/yard/sinclair/configurable_spec.rb
212
215
  - spec/integration/yard/sinclair/matchers/add_method_spec.rb
213
216
  - spec/integration/yard/sinclair/matchers/add_method_to_spec.rb
217
+ - spec/integration/yard/sinclair/method_definition/block_definition_spec.rb
218
+ - spec/integration/yard/sinclair/method_definition/string_definition_spec.rb
214
219
  - spec/integration/yard/sinclair/method_definition_spec.rb
215
220
  - spec/integration/yard/sinclair/options_parser_spec.rb
216
221
  - spec/integration/yard/sinclair_spec.rb
@@ -220,16 +225,22 @@ files:
220
225
  - spec/lib/sinclair/matchers/add_method_spec.rb
221
226
  - spec/lib/sinclair/matchers/add_method_to_spec.rb
222
227
  - spec/lib/sinclair/matchers_spec.rb
228
+ - spec/lib/sinclair/method_definition/block_definition_spec.rb
229
+ - spec/lib/sinclair/method_definition/string_definition_spec.rb
223
230
  - spec/lib/sinclair/method_definition_spec.rb
224
231
  - spec/lib/sinclair/options_parser_spec.rb
225
232
  - spec/lib/sinclair_spec.rb
226
233
  - spec/spec_helper.rb
227
234
  - spec/support/fixture_helpers.rb
228
235
  - spec/support/models/default_value.rb
236
+ - spec/support/models/default_value_builder.rb
237
+ - spec/support/models/default_valueable.rb
229
238
  - spec/support/models/dummy_builder.rb
230
239
  - spec/support/models/dummy_config.rb
231
240
  - spec/support/models/dummy_configurable.rb
232
241
  - spec/support/models/dummy_options_parser.rb
242
+ - spec/support/models/http_json_model.rb
243
+ - spec/support/models/http_person.rb
233
244
  - spec/support/models/initial_valuer.rb
234
245
  - spec/support/models/my_builder.rb
235
246
  - spec/support/models/my_class.rb
@@ -239,7 +250,9 @@ files:
239
250
  - spec/support/models/my_model.rb
240
251
  - spec/support/models/person.rb
241
252
  - spec/support/models/purchase.rb
253
+ - spec/support/models/server.rb
242
254
  - spec/support/models/validator_builder.rb
255
+ - spec/support/shared_examples/method_definition.rb
243
256
  homepage: https://github.com/darthjee/sinclair
244
257
  licenses: []
245
258
  metadata: {}