sinclair 1.13.0 → 1.14.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46b430c9db3658979d128e45ecbbb03aab30bb993d8651ecc8cc3bd9fe1b18e3
4
- data.tar.gz: fa78aa3bde540b7f90675566086e65d884cea51b2874b6cd5166ffc50018ab73
3
+ metadata.gz: 4984ad62935fbe5a85e51b846b5124b72153b94cf9433a8a668f824c11e5eeaf
4
+ data.tar.gz: 336e7c54378ccd676f59eb92fe2a1bf32de84ff9a8bc2a91c8a6dd1e6494b46d
5
5
  SHA512:
6
- metadata.gz: 9a290bcea44d39854bd7b8bd99b28c18d0a6c827b31f140fb339b82d49a9add6e505f738b4925b27c25ddedd695d06963a4221c55ff9b869157aaec5753a5747
7
- data.tar.gz: dfdc3723b6a6d31611eceb727007680aafc3f56d9cda1e16922768df7e9ce14238d0c982ff7e4232a914015c8d22850b869ab08601b8121727ce0673c43ca10b
6
+ metadata.gz: f3a84c2a80644b15e31991cb99a314378453e642c29c9864080e96f28bd34234f2476735284291ba56dd48ab9d67883a5b16709a1aa67b31116ef262dd6b1df1
7
+ data.tar.gz: d1405b56826158314eb4d304b33c02dc18015e63fe58e716371f5a58c7a8f417652ea1026d5b533c844e7c5a89ffeae7990f70334e61dbf4019006f412359dfe
@@ -0,0 +1,28 @@
1
+ FROM darthjee/scripts:0.3.1 as scripts
2
+
3
+ FROM darthjee/circleci_ruby_270:1.2.0 as base
4
+
5
+ COPY --chown=app:app ./ /home/circleci/project/
6
+
7
+ ######################################
8
+
9
+ FROM base as builder
10
+
11
+ COPY --chown=circleci:circleci --from=scripts /home/scripts/builder/bundle_builder.sh /usr/local/sbin/bundle_builder.sh
12
+
13
+ ENV PROJECT sinclair
14
+ ENV HOME_DIR /home/circleci
15
+ RUN bundle_builder.sh
16
+
17
+ #######################
18
+ #FINAL IMAGE
19
+ FROM base
20
+
21
+ COPY --chown=circleci:circleci --from=builder /home/circleci/bundle/ /home/circleci/.rubygems/
22
+
23
+ COPY --chown=circleci:circleci --from=scripts /home/scripts/sbin/rubycritic.sh /usr/local/sbin/
24
+ COPY --chown=circleci:circleci --from=scripts /home/scripts/sbin/check_specs /usr/local/sbin/
25
+ COPY --chown=circleci:circleci --from=scripts /home/scripts/sbin/check_readme.sh /usr/local/sbin/
26
+ COPY --chown=circleci:circleci --from=scripts /home/scripts/sbin/build_gem.sh /usr/local/sbin/
27
+
28
+ RUN bundle install
data/README.md CHANGED
@@ -9,17 +9,19 @@ Sinclair
9
9
 
10
10
  ![sinclair](https://raw.githubusercontent.com/darthjee/sinclair/master/sinclair.jpg)
11
11
 
12
- This gem helps the creation of complex gems/concerns
13
- that enables creation of methods on the fly through class
14
- methods
12
+ Sinclair is a Ruby gem that provides developers with a variety of utility modules and classes
13
+ to simplify common tasks, reusability and avoid boilerplate code. Whether you need to class methods to create methods on the fly,
14
+ create custom comparators, configure your application, create powerfull options, Sinclair has got you covered.
15
15
 
16
- Current Release: [1.13.0](https://github.com/darthjee/sinclair/tree/1.13.0)
16
+ Employing Sinclair in your applications helps you streamline your development workflow and enhance your development process through more efficient, cleaner code
17
17
 
18
- [Next release](https://github.com/darthjee/sinclair/compare/1.13.0...master)
18
+ Current Release: [1.14.1](https://github.com/darthjee/sinclair/tree/1.14.1)
19
+
20
+ [Next release](https://github.com/darthjee/sinclair/compare/1.14.1...master)
19
21
 
20
22
  Yard Documentation
21
23
  -------------------
22
- [https://www.rubydoc.info/gems/sinclair/1.13.0](https://www.rubydoc.info/gems/sinclair/1.13.0)
24
+ [https://www.rubydoc.info/gems/sinclair/1.14.1](https://www.rubydoc.info/gems/sinclair/1.14.1)
23
25
 
24
26
  Installation
25
27
  ---------------
@@ -524,8 +526,16 @@ Client.config.url # returns 'http://interstella.com:8080'
524
526
 
525
527
  ### Sinclair::EnvSettable
526
528
 
527
- Settable allows classes to extract configuration from environments through
528
- a simple meta-programable way
529
+ EnvSettable is a convenient utility that allows you to read environment
530
+ variables using Ruby class methods.
531
+
532
+ With this tool, you can define the usage of environment variables for your application in a single location
533
+ allowing the use of prefixes to isolate groups of variables.
534
+
535
+ This not only makes your code more readable and maintainable but also adds layer of security by ensuring
536
+ that sensitive information like API keys and passwords are not exposed in your source code.
537
+
538
+ EnvSettable allows accessing those variables thorugh a simple meta-programable way
529
539
 
530
540
  <details>
531
541
  <summary>Using env settable example</summary>
@@ -627,7 +637,8 @@ When creating a model class, options can be passed
627
637
  <summary>Example of simple usage</summary>
628
638
 
629
639
  ```ruby
630
- class Human < Sinclair::Model.for(:name, :age, { gender: :undefined }, **{})
640
+ class Human < Sinclair::Model
641
+ initialize_with :name, :age, { gender: :undefined }, **{}
631
642
  end
632
643
 
633
644
  human1 = Human.new(name: 'John Doe', age: 22)
@@ -644,7 +655,8 @@ human1 == human2 # returns true
644
655
  <summary>Example with options</summary>
645
656
 
646
657
  ```ruby
647
- class Tv < Sinclair::Model.for(:model, writter: false, comparable: false)
658
+ class Tv < Sinclair::Model
659
+ initialize_with :model, writter: false, comparable: false
648
660
  end
649
661
 
650
662
  tv1 = Tv.new(model: 'Sans Sunga Xt')
@@ -7,4 +7,5 @@ ignore:
7
7
  - lib/sinclair/matchers/base.rb
8
8
  - lib/sinclair/matchers/change_method_on.rb
9
9
  - lib/sinclair/matchers/method_to.rb
10
+ - lib/sinclair/model/builder_options.rb
10
11
  - lib/sinclair/version.rb
data/config/yardstick.yml CHANGED
@@ -30,6 +30,7 @@ rules:
30
30
  - Sinclair::Matchers#change_method
31
31
  - Sinclair::Matchers#change_class_method
32
32
  - Sinclair::Model.for
33
+ - Sinclair::Model.initialize_with
33
34
  ReturnTag:
34
35
  enabled: true
35
36
  exclude:
data/docker-compose.yml CHANGED
@@ -21,3 +21,14 @@ services:
21
21
  <<: *base
22
22
  depends_on: [base_build]
23
23
  command: /bin/bash -c 'rspec && yard && rake yardstick_measure && rake verify_measurements'
24
+
25
+ sinclair_circleci:
26
+ <<: *base
27
+ image: sinclair_circleci
28
+ container_name: sinclair_circleci
29
+ volumes:
30
+ - .:/home/circleci/project
31
+ working_dir: /home/circleci/project
32
+ command: /bin/bash
33
+ build:
34
+ dockerfile: Dockerfile.circleci
@@ -26,7 +26,7 @@ class Sinclair
26
26
  # @param parameters_list [Array<Object>] list of parameters and defaults
27
27
  # @param named [TrueClass,FalseClass] Flag informing if the parameters are
28
28
  # named parameters
29
- def initialize(parameters_list, named: false)
29
+ def initialize(parameters_list, named: nil)
30
30
  @parameters_list = parameters_list
31
31
  @named = named
32
32
  end
@@ -40,7 +40,7 @@ class Sinclair
40
40
  def strings
41
41
  return [] unless parameters_list
42
42
 
43
- parameters_strings + defaults_strings
43
+ parameters_strings + defaults_strings + wild_card_parameters
44
44
  end
45
45
 
46
46
  private
@@ -81,7 +81,18 @@ class Sinclair
81
81
  # @return [Array<Symbol>]
82
82
  def parameters
83
83
  parameters_list.reject do |param|
84
- param.is_a?(Hash)
84
+ param.is_a?(Hash) || param.to_s.match?(/^\*/)
85
+ end
86
+ end
87
+
88
+ # Returns the named parameters that have not been defined
89
+ #
90
+ # THis is usually extra options
91
+ #
92
+ # @return [Array<String>]
93
+ def wild_card_parameters
94
+ parameters_list.reject do |param|
95
+ param.is_a?(Hash) || !param.to_s.match?(/^\*/)
85
96
  end
86
97
  end
87
98
 
@@ -26,11 +26,10 @@ class Sinclair
26
26
  # method should be added
27
27
  # @param comparable [TrueClass,FalseClass] flag to make the class {Comparable}
28
28
  # by the fields
29
- def initialize(klass, *attributes, writter: true, comparable: true)
29
+ def initialize(klass, *attributes, **options)
30
30
  super(klass)
31
31
  @attributes = attributes.flatten
32
- @writter = writter
33
- @comparable = comparable
32
+ @options = BuilderOptions.new(**options)
34
33
 
35
34
  add_methods
36
35
  change_equals
@@ -39,7 +38,9 @@ class Sinclair
39
38
 
40
39
  private
41
40
 
42
- attr_reader :attributes, :writter, :comparable
41
+ attr_reader :attributes, :options
42
+
43
+ delegate :writter, :comparable, to: :options
43
44
  alias writter? writter
44
45
  alias comparable? comparable
45
46
 
@@ -54,6 +55,14 @@ class Sinclair
54
55
  #
55
56
  # @return [Array<Symbol,Hash>]
56
57
 
58
+ # @!method options
59
+ # @api private
60
+ # @private
61
+ #
62
+ # Class building options
63
+ #
64
+ # @return [BuilderOptions]
65
+
57
66
  # @!method writter
58
67
  # @api private
59
68
  # @private
@@ -118,11 +127,15 @@ class Sinclair
118
127
  #
119
128
  # @return [Array<MethodDefinition>]
120
129
  def change_initializer
121
- code = attributes_names.map do |attr|
130
+ lines = attributes_names.map do |attr|
122
131
  "@#{attr} = #{attr}"
123
- end.join("\n")
132
+ end
133
+
134
+ lines << 'super(**attributes)'
135
+
136
+ code = lines.join("\n")
124
137
 
125
- add_method(:initialize, code, named_parameters: attributes)
138
+ add_method(:initialize, code, named_parameters: attributes + ['**attributes'])
126
139
  end
127
140
 
128
141
  # @private
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Sinclair
4
+ class Model
5
+ # @api private
6
+ # @author Darthjee
7
+ #
8
+ # Options for building model class
9
+ class BuilderOptions < Sinclair::Options
10
+ with_options writter: true, comparable: true
11
+ end
12
+ end
13
+ end
@@ -6,11 +6,14 @@ class Sinclair
6
6
  #
7
7
  # Basic model to be used when defining new classes quickly
8
8
  class Model
9
- autoload :Builder, 'sinclair/model/builder'
9
+ autoload :Builder, 'sinclair/model/builder'
10
+ autoload :BuilderOptions, 'sinclair/model/builder_options'
10
11
 
11
12
  class << self
12
13
  # Returns a new class that inherits from model
13
14
  #
15
+ # @deprecated Use {.initialize_with} instead
16
+ #
14
17
  # @overload for(*attributes, writter: true, comparable: true)
15
18
  # @param attributes [Array<Symbol>] attributes to be added in both the
16
19
  # initialization and adding the methos to the model
@@ -53,6 +56,53 @@ class Sinclair
53
56
  Builder.new(klass, *attributes, **options).build
54
57
  end
55
58
  end
59
+
60
+ # Adds methods needed for the model
61
+ #
62
+ # The readers/writters, +==+ and initializer are added
63
+ #
64
+ # @overload initialize_with(*attributes, writter: true, comparable: true)
65
+ # @param attributes [Array<Symbol>] attributes to be added in both the
66
+ # initialization and adding the methos to the model
67
+ # @param writter [TrueClass,FalseClass] flag informing if the writter/setter
68
+ # method should be added
69
+ # @param comparable [TrueClass,FalseClass] flag to make the class {Comparable}
70
+ # by the fields
71
+ #
72
+ # @example A model with readers
73
+ # class Car < Sinclair::Model
74
+ # initialize_with(:brand, :model, writter: false)
75
+ # end
76
+ #
77
+ # car = Car.new(brand: :ford, model: :T)
78
+ #
79
+ # car.brand # returns :ford
80
+ # car.model # returns :T
81
+ #
82
+ # @overload initialize_with(*attributes, defaults, writter: true, comparable: true)
83
+ # @param attributes [Array<Symbol>] attributes to be added in both the
84
+ # initialization and adding the methos to the model
85
+ # @param defaults [Hash] attributes to be added with a default value in the initializer
86
+ # @param writter [TrueClass,FalseClass] flag informing if the writter/setter
87
+ # method should be added
88
+ # @param comparable [TrueClass,FalseClass] flag to make the class {Comparable}
89
+ # by the fields
90
+ #
91
+ # @example A model with writters
92
+ # class Job < Sinclair::Model
93
+ # initialize_with({ state: :starting }, writter: true)
94
+ # end
95
+ #
96
+ # job = Job.new
97
+ #
98
+ # job.state # returns :starting
99
+ # job.state = :done
100
+ # job.state # returns :done
101
+ #
102
+ # @return [Array<MethodDefinition>]
103
+ def initialize_with(*attributes, **options)
104
+ Builder.new(self, *attributes, **options).build
105
+ end
56
106
  end
57
107
  end
58
108
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Sinclair
4
- VERSION = '1.13.0'
4
+ VERSION = '1.14.1'
5
5
  end
data/sinclair.gemspec CHANGED
@@ -21,7 +21,7 @@ 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', '2.3.25'
24
+ gem.add_development_dependency 'bundler', '>= 2.3.25'
25
25
  gem.add_development_dependency 'pry', '0.14.1'
26
26
  gem.add_development_dependency 'pry-nav', '1.0.0'
27
27
  gem.add_development_dependency 'rake', '13.0.1'
@@ -22,6 +22,17 @@ describe Sinclair::MethodDefinition::ParameterHelper do
22
22
  .to eq(['a = 10', 'b = "word"', 'c = true', 'd = false', 'e = nil', 'f = :symbol'])
23
23
  end
24
24
  end
25
+
26
+ context 'when the parameter is an undefined parameter' do
27
+ let(:parameters) do
28
+ [:a, :b, '*args', { c: 10, d: 'word' }]
29
+ end
30
+
31
+ it 'returns a list of parameters' do
32
+ expect(described_class.parameters_from(parameters))
33
+ .to eq(['a', 'b', 'c = 10', 'd = "word"', '*args'])
34
+ end
35
+ end
25
36
  end
26
37
 
27
38
  context 'when parameters are named' do
@@ -42,6 +53,17 @@ describe Sinclair::MethodDefinition::ParameterHelper do
42
53
  .to eq(['a: 10', 'b: "word"', 'c: true', 'd: false', 'e: nil', 'f: :symbol'])
43
54
  end
44
55
  end
56
+
57
+ context 'when the parameter is an undefined parameter' do
58
+ let(:parameters) do
59
+ [:a, :b, '**opts', { c: 10, d: 'word' }]
60
+ end
61
+
62
+ it 'returns a list of parameters' do
63
+ expect(described_class.parameters_from(parameters, named: true))
64
+ .to eq(['a:', 'b:', 'c: 10', 'd: "word"', '**opts'])
65
+ end
66
+ end
45
67
  end
46
68
  end
47
69
  end
@@ -3,136 +3,94 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Sinclair::Model do
6
- describe '.with_attributes' do
7
- subject(:model) { klass.new(name: name) }
6
+ subject(:model) { klass.new(name: name) }
8
7
 
9
- let(:name) { SecureRandom.hex(10) }
10
- let(:attributes) { %i[name] }
8
+ let(:name) { SecureRandom.hex(10) }
9
+ let(:attributes) { %i[name] }
10
+ let(:options) { {} }
11
11
 
12
- context 'when the call happens with no options' do
13
- subject(:klass) { described_class.for(*attributes) }
12
+ describe '.for' do
13
+ subject(:klass) { described_class.for(*attributes, **options) }
14
14
 
15
- it 'Returns a new class' do
16
- expect(klass.superclass)
17
- .to eq(described_class)
18
- end
19
-
20
- it 'returns a class with getter' do
21
- expect(klass.instance_method(:name))
22
- .to be_a(UnboundMethod)
23
- end
24
-
25
- it 'returns a class with setter' do
26
- expect(klass.instance_method(:name=))
27
- .to be_a(UnboundMethod)
28
- end
15
+ it_behaves_like 'sinclair model building'
16
+ end
29
17
 
30
- it 'returns a new class with a comparable that finds matches' do
31
- expect(model).to eq(klass.new(name: name))
32
- end
18
+ describe '.initialize_with' do
19
+ subject(:klass) { Class.new(described_class) }
33
20
 
34
- it 'returns a new class with a comparable that find misses' do
35
- expect(model).not_to eq(klass.new(name: SecureRandom.hex(10)))
21
+ context 'when no options are given' do
22
+ it do
23
+ expect { klass.initialize_with(*attributes, **options) }
24
+ .to add_method(:name).to(klass)
36
25
  end
37
26
 
38
- context 'when reader is called' do
39
- it do
40
- expect(model.name).to eq(name)
41
- end
27
+ it do
28
+ expect { klass.initialize_with(*attributes, **options) }
29
+ .to add_method(:name=).to(klass)
42
30
  end
43
31
 
44
- context 'when setter is called' do
45
- let(:name) { SecureRandom.hex(10) }
46
- let(:model) { klass.new(name: nil) }
47
-
48
- it do
49
- expect { model.name = name }
50
- .to change(model, :name)
51
- .from(nil)
52
- .to(name)
53
- end
32
+ it do
33
+ expect { klass.initialize_with(*attributes, **options) }
34
+ .to change_method(:==).on(klass)
54
35
  end
55
36
  end
56
37
 
57
- context 'when the call happens with comparable false' do
58
- subject(:klass) { described_class.for(*attributes, **options) }
59
-
60
- let(:options) { { comparable: false } }
38
+ context 'when writter and comparable are not enabled' do
39
+ let(:options) { { writter: false, comparable: false } }
61
40
 
62
- it 'returns a new class without comparable' do
63
- expect(model).not_to eq(klass.new(name: name))
41
+ it do
42
+ expect { klass.initialize_with(*attributes, **options) }
43
+ .to add_method(:name).to(klass)
64
44
  end
65
- end
66
-
67
- context 'when the call happens with reader options' do
68
- subject(:klass) { described_class.for(*attributes, **options) }
69
-
70
- let(:options) { { writter: false } }
71
45
 
72
- it 'Returns a new class' do
73
- expect(klass.superclass)
74
- .to eq(described_class)
46
+ it do
47
+ expect { klass.initialize_with(*attributes, **options) }
48
+ .not_to add_method(:name=).to(klass)
75
49
  end
76
50
 
77
- it 'returns a class with getter' do
78
- expect(klass.instance_method(:name))
79
- .to be_a(UnboundMethod)
51
+ it do
52
+ expect { klass.initialize_with(*attributes, **options) }
53
+ .not_to change_method(:==).on(klass)
80
54
  end
55
+ end
81
56
 
82
- it 'returns a class without setter' do
83
- expect { klass.instance_method(:name=) }
84
- .to raise_error(NameError)
85
- end
57
+ context 'when class is subclass of another model' do
58
+ subject(:model) { klass.new(name: name, age: age) }
86
59
 
87
- context 'when reader is called' do
88
- it do
89
- expect(model.name).to eq(name)
60
+ let(:age) { Random.rand(10..20) }
61
+
62
+ let(:superclass) do
63
+ Class.new(described_class) do
64
+ initialize_with(:age)
90
65
  end
91
66
  end
92
- end
93
67
 
94
- context 'when the call happens with defaults' do
95
- subject(:klass) do
96
- described_class.for({ name: 'John Doe' }, **{})
68
+ let(:klass) do
69
+ Class.new(superclass) do
70
+ initialize_with(:name)
71
+ end
97
72
  end
98
73
 
99
- it 'Returns a new class' do
100
- expect(klass.superclass)
101
- .to eq(described_class)
74
+ it 'is initialized with both attributes' do
75
+ expect { klass.new(name: name, age: age) }
76
+ .not_to raise_error
102
77
  end
103
78
 
104
- it 'returns a class with getter' do
105
- expect(klass.instance_method(:name))
106
- .to be_a(UnboundMethod)
79
+ it 'is initializes new attributes' do
80
+ expect(model.name).to eq(name)
107
81
  end
108
82
 
109
- it 'returns a class with setter' do
110
- expect(klass.instance_method(:name=))
111
- .to be_a(UnboundMethod)
83
+ it 'is initializes old attributes' do
84
+ expect(model.age).to eq(age)
112
85
  end
86
+ end
113
87
 
114
- context 'when reader is called' do
115
- subject(:model) { klass.new }
116
-
117
- let(:name) { SecureRandom.hex(10) }
118
-
119
- it 'returns the dfault value' do
120
- expect(model.name).to eq('John Doe')
121
- end
88
+ context 'when the build is done' do
89
+ before do
90
+ klass.initialize_with(*attributes, **options)
122
91
  end
123
92
 
124
- context 'when setter is called' do
125
- subject(:model) { klass.new }
126
-
127
- let(:name) { SecureRandom.hex(10) }
128
-
129
- it do
130
- expect { model.name = name }
131
- .to change(model, :name)
132
- .from('John Doe')
133
- .to(name)
134
- end
135
- end
93
+ it_behaves_like 'sinclair model building'
136
94
  end
137
95
  end
138
96
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
- class Car < Sinclair::Model.for(:brand, :model, writter: false)
3
+ class Car < Sinclair::Model
4
+ initialize_with(:brand, :model, writter: false)
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Human < Sinclair::Model.for(:name, :age, { gender: :undefined }, **{})
3
+ class Human < Sinclair::Model
4
+ initialize_with :name, :age, { gender: :undefined }, **{}
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
- class Job < Sinclair::Model.for({ state: :starting }, writter: true)
3
+ class Job < Sinclair::Model
4
+ initialize_with({ state: :starting }, writter: true)
4
5
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Tv < Sinclair::Model.for(:model, writter: false, comparable: false)
3
+ class Tv < Sinclair::Model
4
+ initialize_with :model, writter: false, comparable: false
4
5
  end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples 'sinclair model building' do
4
+ context 'when the call happens with no options' do
5
+ it 'Returns a new class' do
6
+ expect(klass.superclass)
7
+ .to eq(described_class)
8
+ end
9
+
10
+ it 'returns a class with getter' do
11
+ expect(klass.instance_method(:name))
12
+ .to be_a(UnboundMethod)
13
+ end
14
+
15
+ it 'returns a class with setter' do
16
+ expect(klass.instance_method(:name=))
17
+ .to be_a(UnboundMethod)
18
+ end
19
+
20
+ it 'returns a new class with a comparable that finds matches' do
21
+ expect(model).to eq(klass.new(name: name))
22
+ end
23
+
24
+ it 'returns a new class with a comparable that find misses' do
25
+ expect(model).not_to eq(klass.new(name: SecureRandom.hex(10)))
26
+ end
27
+
28
+ context 'when reader is called' do
29
+ it do
30
+ expect(model.name).to eq(name)
31
+ end
32
+ end
33
+
34
+ context 'when setter is called' do
35
+ let(:name) { SecureRandom.hex(10) }
36
+ let(:model) { klass.new(name: nil) }
37
+
38
+ it do
39
+ expect { model.name = name }
40
+ .to change(model, :name)
41
+ .from(nil)
42
+ .to(name)
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'when the call happens with comparable false' do
48
+ let(:options) { { comparable: false } }
49
+
50
+ it 'returns a new class without comparable' do
51
+ expect(model).not_to eq(klass.new(name: name))
52
+ end
53
+ end
54
+
55
+ context 'when the call happens with reader options' do
56
+ let(:options) { { writter: false } }
57
+
58
+ it 'Returns a new class' do
59
+ expect(klass.superclass)
60
+ .to eq(described_class)
61
+ end
62
+
63
+ it 'returns a class with getter' do
64
+ expect(klass.instance_method(:name))
65
+ .to be_a(UnboundMethod)
66
+ end
67
+
68
+ it 'returns a class without setter' do
69
+ expect { klass.instance_method(:name=) }
70
+ .to raise_error(NameError)
71
+ end
72
+
73
+ context 'when reader is called' do
74
+ it do
75
+ expect(model.name).to eq(name)
76
+ end
77
+ end
78
+ end
79
+
80
+ context 'when the call happens with defaults' do
81
+ let(:attributes) { [{ name: 'John Doe' }] }
82
+
83
+ it 'Returns a new class' do
84
+ expect(klass.superclass)
85
+ .to eq(described_class)
86
+ end
87
+
88
+ it 'returns a class with getter' do
89
+ expect(klass.instance_method(:name))
90
+ .to be_a(UnboundMethod)
91
+ end
92
+
93
+ it 'returns a class with setter' do
94
+ expect(klass.instance_method(:name=))
95
+ .to be_a(UnboundMethod)
96
+ end
97
+
98
+ context 'when reader is called' do
99
+ subject(:model) { klass.new }
100
+
101
+ let(:name) { SecureRandom.hex(10) }
102
+
103
+ it 'returns the dfault value' do
104
+ expect(model.name).to eq('John Doe')
105
+ end
106
+ end
107
+
108
+ context 'when setter is called' do
109
+ subject(:model) { klass.new }
110
+
111
+ let(:name) { SecureRandom.hex(10) }
112
+
113
+ it do
114
+ expect { model.name = name }
115
+ .to change(model, :name)
116
+ .from('John Doe')
117
+ .to(name)
118
+ end
119
+ end
120
+ end
121
+ 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.13.0
4
+ version: 1.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - DarthJee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-15 00:00:00.000000000 Z
11
+ date: 2023-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -28,14 +28,14 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.3.25
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
40
  version: 2.3.25
41
41
  - !ruby/object:Gem::Dependency
@@ -261,6 +261,7 @@ files:
261
261
  - ".rubocop.yml"
262
262
  - ".rubocop_todo.yml"
263
263
  - Dockerfile
264
+ - Dockerfile.circleci
264
265
  - Gemfile
265
266
  - LICENSE
266
267
  - README.md
@@ -316,6 +317,7 @@ files:
316
317
  - lib/sinclair/method_definitions.rb
317
318
  - lib/sinclair/model.rb
318
319
  - lib/sinclair/model/builder.rb
320
+ - lib/sinclair/model/builder_options.rb
319
321
  - lib/sinclair/options.rb
320
322
  - lib/sinclair/options/builder.rb
321
323
  - lib/sinclair/options/class_methods.rb
@@ -448,6 +450,7 @@ files:
448
450
  - spec/support/shared_examples/config_factory.rb
449
451
  - spec/support/shared_examples/env_settable.rb
450
452
  - spec/support/shared_examples/instance_method_definition.rb
453
+ - spec/support/shared_examples/model.rb
451
454
  - spec/support/shared_examples/sinclair.rb
452
455
  homepage: https://github.com/darthjee/sinclair
453
456
  licenses: []
@@ -467,7 +470,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
467
470
  - !ruby/object:Gem::Version
468
471
  version: '0'
469
472
  requirements: []
470
- rubygems_version: 3.3.25
473
+ rubygems_version: 3.1.2
471
474
  signing_key:
472
475
  specification_version: 4
473
476
  summary: Gem for easy concern creation