contracted_value 0.1.0 → 0.1.2

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: fec55efa08a60e3b4f73c1b8813af1a6a188493c6a870a08083d008dbff19a18
4
- data.tar.gz: 70a611199db2edce337a2571b3a5ef22be515081c671ef64aff389658e6d3c39
3
+ metadata.gz: 1955c7fa4eaf8ae64db37e57575a6da241315ebd5855d72097e8e175292d0ee3
4
+ data.tar.gz: d34b3b78b78e7e27466468851e96968293e978cadfc40104e3a67425e69eb4a5
5
5
  SHA512:
6
- metadata.gz: b709ba4fd278372200a7b97379ba6fb69eb73099e9c13c0006537c6de921aa5228242b5d742f6c46c4969da89789b2edd40672a184fe5074d62101db5e3e09ac
7
- data.tar.gz: efdd16b4cc5343a984105a3ac19e98caab7f88b5e399793cd99f94753f57711f4cf821d3ff9daeee864158248e3a47b7beeec3da058cfc3c3839d9973fc888ae
6
+ metadata.gz: 125f0ff78bdf35d47b2fd7400ebb93db3a249d0b04abe1462394b732ad1d804326d7d89c7b04e0d3ca28cb738bc1f350a5091d2ae559490cfea468b864a1d03d
7
+ data.tar.gz: 184cd1009cbd96af31d5fce7c075c483ce4762fc77936843c66a13df2c43b0aa95e70fe14e5e7c8ddaea1ebaf6a85084fc0345479af1e2a273cab6ca8942f64d
@@ -0,0 +1,13 @@
1
+ # Lines starting with '#' are comments.
2
+ # Each line is a file pattern followed by one or more owners.
3
+
4
+ # These owners will be the default owners for everything in the repo.
5
+ * @PikachuEXE
6
+
7
+ # Order is important. The last matching pattern has the most precedence.
8
+ # So if a pull request only touches javascript files, only these owners
9
+ # will be requested to review.
10
+ # *.rb @PikachuEXE
11
+
12
+ # You can also use email addresses if you prefer.
13
+ # docs/* docs@example.com
@@ -0,0 +1,2 @@
1
+ github:
2
+ - PikachuEXE
@@ -0,0 +1,20 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: monthly
7
+ time: "06:00"
8
+ timezone: Asia/Hong_Kong
9
+ open-pull-requests-limit: 10
10
+ labels:
11
+ - "dependencies"
12
+ - package-ecosystem: github-actions
13
+ directory: "/"
14
+ schedule:
15
+ interval: monthly
16
+ time: "06:00"
17
+ timezone: Asia/Hong_Kong
18
+ open-pull-requests-limit: 10
19
+ labels:
20
+ - "dependencies"
@@ -0,0 +1,63 @@
1
+ name: Coverage
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ paths-ignore:
8
+ - 'README.md'
9
+ push:
10
+ branches:
11
+ - master
12
+ paths-ignore:
13
+ - 'README.md'
14
+
15
+ jobs:
16
+ coverage:
17
+ name: Coverage
18
+ # Homemade support for [ci skip] no longer needed
19
+ # https://github.blog/changelog/2021-02-08-github-actions-skip-pull-request-and-push-workflows-with-skip-ci/
20
+ # if: "contains(github.event.commits[0].message, '[ci skip]') == false"
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os:
25
+ - ubuntu-latest
26
+ ruby:
27
+ - "3.2"
28
+ gemfile:
29
+ - gemfiles/contracts_17_0.gemfile
30
+ env:
31
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
32
+ COVERALLS: true
33
+ runs-on: ${{ matrix.os }}
34
+ steps:
35
+ - name: Checkout
36
+ uses: actions/checkout@v4
37
+
38
+ - name: Setup Ruby
39
+ uses: ruby/setup-ruby@v1
40
+ with:
41
+ ruby-version: ${{ matrix.ruby }}
42
+ bundler-cache: true
43
+
44
+ - name: Collect coverage info
45
+ run: bundle exec rake spec
46
+
47
+ - name: Coveralls Parallel
48
+ uses: coverallsapp/github-action@master
49
+ continue-on-error: true
50
+ with:
51
+ github-token: ${{ secrets.github_token }}
52
+ flag-name: run-${{ matrix.ruby }}-${{ matrix.gemfile }}
53
+ parallel: true
54
+
55
+ finish:
56
+ needs: coverage
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - name: Send to Coveralls
60
+ uses: coverallsapp/github-action@master
61
+ with:
62
+ github-token: ${{ secrets.GITHUB_TOKEN }}
63
+ parallel-finished: true
@@ -0,0 +1,53 @@
1
+ name: Tests
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - master
7
+ paths-ignore:
8
+ - 'README.md'
9
+ push:
10
+ branches:
11
+ - master
12
+ paths-ignore:
13
+ - 'README.md'
14
+
15
+ jobs:
16
+ unit_tests:
17
+ name: Unit Tests
18
+ # Homemade support for [ci skip] no longer needed
19
+ # https://github.blog/changelog/2021-02-08-github-actions-skip-pull-request-and-push-workflows-with-skip-ci/
20
+ # if: "contains(github.event.commits[0].message, '[ci skip]') == false"
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os:
25
+ - ubuntu-latest
26
+ ruby:
27
+ - "3.0"
28
+ - "3.1"
29
+ - "3.2"
30
+ gemfile:
31
+ - gemfiles/contracts_17_0.gemfile
32
+ allow_failures:
33
+ - false
34
+ include:
35
+ - os: ubuntu-latest
36
+ ruby: "ruby-head"
37
+ gemfile: gemfiles/contracts_17_0.gemfile
38
+ allow_failures: true
39
+ env:
40
+ BUNDLE_GEMFILE: "${{ matrix.gemfile }}"
41
+ ALLOW_FAILURES: "${{ matrix.allow_failures }}"
42
+ runs-on: ${{ matrix.os }}
43
+ continue-on-error: ${{ endsWith(matrix.ruby, 'head') || matrix.ruby == 'debug' }}
44
+ steps:
45
+ - name: Checkout
46
+ uses: actions/checkout@v4
47
+ - name: Setup Ruby
48
+ uses: ruby/setup-ruby@v1
49
+ with:
50
+ ruby-version: ${{ matrix.ruby }}
51
+ bundler-cache: true
52
+ - name: Test
53
+ run: bundle exec rake spec || $ALLOW_FAILURES
data/Appraisals CHANGED
@@ -1,9 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- appraise "contracts_15_0" do
4
- gem "contracts", "~> 0.15.0"
5
- end
6
-
7
- appraise "contracts_16_0" do
8
- gem "contracts", "~> 0.16.0"
3
+ appraise "contracts_17_0" do
4
+ gem "contracts", "~> 0.17.0"
9
5
  end
data/CHANGELOG.md CHANGED
@@ -18,10 +18,31 @@ This project adheres to [Semantic Versioning](http://semver.org/).
18
18
  - Nothing
19
19
 
20
20
 
21
+ ## [0.1.2]
22
+
23
+ ### Changed
24
+
25
+ - Requires Ruby 3.0, contracts >= 0.17 (Ruby 2.7 EOL)
26
+ - Make code "Object Shape friendly"
27
+ (https://github.com/PikachuEXE/contracted_value/pull/5)
28
+
29
+
30
+ ## [0.1.1]
31
+
32
+ ### Changed
33
+
34
+ - Requires Ruby 2.7 (due to use of ["Forward all arguments" syntax](https://rubyreferences.github.io/rubychanges/2.7.html#keyword-argument-related-changes))
35
+
36
+ ### Fixed
37
+
38
+ - Fix Ruby 3.x compatibility
39
+
40
+
21
41
  ## 0.1.0 - 2019-06-05
22
42
 
23
43
  ### Added
24
44
 
25
45
  - Initial release
26
46
 
27
- [Unreleased]: https://github.com/PikachuEXE/contracted_value/compare/v0.1.0...HEAD
47
+ [0.1.2]: https://github.com/PikachuEXE/contracted_value/compare/v0.1.1...v0.1.2
48
+ [0.1.1]: https://github.com/PikachuEXE/contracted_value/compare/v0.1.0...v0.1.1
data/README.md CHANGED
@@ -2,15 +2,6 @@
2
2
 
3
3
  Library for creating contracted immutable(by default) value objects
4
4
 
5
- [![Gem Version](http://img.shields.io/gem/v/contracted_value.svg?style=flat-square)](http://badge.fury.io/rb/contracted_value)
6
- [![License](https://img.shields.io/github/license/PikachuEXE/contracted_value.svg?style=flat-square)](http://badge.fury.io/rb/contracted_value)
7
-
8
- [![Build Status](http://img.shields.io/travis/PikachuEXE/contracted_value.svg?style=flat-square)](https://travis-ci.org/PikachuEXE/contracted_value)
9
-
10
- [![Code Climate](https://img.shields.io/codeclimate/maintainability/PikachuEXE/contracted_value.svg?style=flat-square)](https://codeclimate.com/github/PikachuEXE/contracted_value)
11
- [![Coverage Status](https://img.shields.io/codecov/c/github/PikachuEXE/contracted_value.svg?style=flat-square)](https://codecov.io/gh/PikachuEXE/contracted_value)
12
-
13
-
14
5
  This gem allows creation of value objects which are
15
6
  - contracted (enforced by [`contracts.ruby`](https://github.com/egonSchiele/contracts.ruby))
16
7
  - immutable (enforced by [`ice_nine`](https://github.com/dkubb/ice_nine))
@@ -18,6 +9,19 @@ This gem allows creation of value objects which are
18
9
  See details explanation in below sections
19
10
 
20
11
 
12
+ ## Status
13
+
14
+ [![GitHub Build Status](https://img.shields.io/github/actions/workflow/status/PikachuEXE/contracted_value/tests.yaml?branch=master&style=flat-square)](https://github.com/PikachuEXE/contracted_value/actions/workflows/tests.yaml)
15
+
16
+ [![Gem Version](http://img.shields.io/gem/v/contracted_value.svg?style=flat-square)](http://badge.fury.io/rb/contracted_value)
17
+ [![License](https://img.shields.io/github/license/PikachuEXE/contracted_value.svg?style=flat-square)](http://badge.fury.io/rb/contracted_value)
18
+
19
+ [![Code Climate](https://img.shields.io/codeclimate/maintainability/PikachuEXE/contracted_value.svg?style=flat-square)](https://codeclimate.com/github/PikachuEXE/contracted_value)
20
+ [![Coverage Status](http://img.shields.io/coveralls/PikachuEXE/contracted_value.svg?style=flat-square)](https://coveralls.io/r/PikachuEXE/contracted_value)
21
+
22
+ > The above badges are generated by https://shields.io/
23
+
24
+
21
25
  ## Installation
22
26
 
23
27
  Add this line to your application's Gemfile:
@@ -146,6 +150,36 @@ location_range = ::Geometry::LocationRange::Entry.new(location)
146
150
 
147
151
  ```
148
152
 
153
+ #### Passing objects of different `ContractedValue::Value` subclasses to `.new`
154
+ Possible due to the implementation calling `#to_h` for `ContractedValue::Value` objects
155
+ But in case the attribute names are different, or adding new attributes/updating existing attributes is needed
156
+ You will need to call `#to_h` to get a `Hash` and do whatever modification needed before passing into `.new`
157
+
158
+ ```ruby
159
+ class Pokemon < ::ContractedValue::Value
160
+ attribute(:name)
161
+ attribute(:type)
162
+ end
163
+
164
+ class Pikachu < ::Pokemon
165
+ attribute(:name, default_value: "Pikachu")
166
+ attribute(:type, default_value: "Thunder")
167
+ end
168
+
169
+ # Ya I love using pokemon as examples, problem?
170
+ pikachu = Pikachu.new(name: "PikaPika")
171
+ pikachu.name #=> "PikaPika"
172
+ pikachu.type #=> "Thunder"
173
+
174
+ pokemon1 = Pokemon.new(pikachu)
175
+ pokemon1.name #=> "PikaPika"
176
+ pokemon1.type #=> "Thunder"
177
+
178
+ pokemon2 = Pokemon.new(pikachu.to_h.merge(name: "Piak"))
179
+ pokemon2.name #=> "Piak"
180
+ pokemon2.type #=> "Thunder"
181
+ ```
182
+
149
183
 
150
184
  ### Input Validation
151
185
 
@@ -154,9 +188,9 @@ Input values are validated on object creation (instead of on attribute value acc
154
188
  - Value presence
155
189
 
156
190
  #### Value contract
157
- An attribute can be declared without any contract, and any input value would be pass the validation
158
- But you can pass a contract via `contract` option (must be a [`contracts.ruby`](https://github.com/egonSchiele/contracts.ruby) contract)
159
- Passing input value violating an attribute's contract would cause an error
191
+ An attribute can be declared without any contract, and any input value would be pass the validation
192
+ But you can pass a contract via `contract` option (must be a [`contracts.ruby`](https://github.com/egonSchiele/contracts.ruby) contract)
193
+ Passing input value violating an attribute's contract would cause an error
160
194
 
161
195
  ```ruby
162
196
  class YetAnotherRationalNumber < ::ContractedValue::Value
@@ -181,10 +215,10 @@ YetAnotherRationalNumber.new(
181
215
  ```
182
216
 
183
217
  #### Value presence
184
- An attribute declared should be provided a value on object creation, even the input value is `nil`
185
- Otherwise an error is raised
186
- You can pass default value via option `default_value`
187
- The default value will need to confront to the contract passed in `contract` option too
218
+ An attribute declared should be provided a value on object creation, even the input value is `nil`
219
+ Otherwise an error is raised
220
+ You can pass default value via option `default_value`
221
+ The default value will need to confront to the contract passed in `contract` option too
188
222
 
189
223
 
190
224
  ```ruby
@@ -289,6 +323,8 @@ end
289
323
 
290
324
  # Ya I love using pokemon as examples, problem?
291
325
  pikachu = Pikachu.new(name: "PikaPika")
326
+ pikachu.name #=> "PikaPika"
327
+ pikachu.type #=> "Thunder"
292
328
  ```
293
329
 
294
330
  #### All existing attributes can be redeclared
@@ -12,9 +12,9 @@ Gem::Specification.new do |s|
12
12
  s.platform = Gem::Platform::RUBY
13
13
  s.name = gem_name
14
14
  s.version = ContractedValue::VERSION
15
- s.summary = "Some Tweaks for ActiveRecord"
15
+ s.summary = "Contracted immutable(by default) value objects"
16
16
  s.description = <<-DOC
17
- ActiveRecord is great, but could be better. Here are some tweaks for it.
17
+ Library for creating contracted immutable(by default) value objects supported by contracts.ruby & ice_nine
18
18
  DOC
19
19
 
20
20
  s.license = "MIT"
@@ -28,20 +28,20 @@ Gem::Specification.new do |s|
28
28
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
29
29
  s.require_paths = ["lib"]
30
30
 
31
- s.add_dependency "contracts", "~> 0.15"
31
+ s.add_dependency "contracts", "~> 0.17"
32
32
  s.add_dependency "ice_nine"
33
33
 
34
34
  s.add_development_dependency "bundler", ">= 1.0.0"
35
- s.add_development_dependency "rake", ">= 10.0", "<= 13.0"
35
+ s.add_development_dependency "rake", ">= 10.0", "<= 14.0"
36
36
  s.add_development_dependency "pry"
37
37
 
38
- s.add_development_dependency "appraisal", "~> 2.0"
38
+ s.add_development_dependency "appraisal", "~> 2.0", ">= 2.5.0"
39
39
 
40
40
  s.add_development_dependency "rspec", "~> 3.0"
41
41
  s.add_development_dependency "rspec-its", "~> 1.0"
42
42
 
43
- s.add_development_dependency "simplecov"
44
- s.add_development_dependency "codecov"
43
+ s.add_development_dependency "simplecov", ">= 0.21"
44
+ s.add_development_dependency "simplecov-lcov", ">= 0.8"
45
45
 
46
46
  s.add_development_dependency "gem-release", ">= 0.7"
47
47
 
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
49
49
 
50
50
  s.add_development_dependency "rubocop", ">= 0.70"
51
51
 
52
- s.required_ruby_version = ">= 2.3.0"
52
+ s.required_ruby_version = ">= 3.0.0"
53
53
 
54
54
  s.required_rubygems_version = ">= 1.4.0"
55
55
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "contracts", "~> 0.15.0"
5
+ gem "contracts", "~> 0.17.0"
6
6
 
7
7
  gemspec path: "../"
@@ -131,7 +131,7 @@ module ContractedValue
131
131
  end
132
132
 
133
133
  class Attribute
134
- def self.new(*)
134
+ def self.new(...)
135
135
  ::IceNine.deep_freeze(super)
136
136
  end
137
137
 
@@ -182,10 +182,17 @@ module ContractedValue
182
182
  attr_reader :default_value
183
183
 
184
184
  def raise_error_if_inputs_invalid
185
+ raise_error_if_name_invalid
185
186
  raise_error_if_refrigeration_mode_invalid
186
187
  raise_error_if_default_value_invalid
187
188
  end
188
189
 
190
+ def raise_error_if_name_invalid
191
+ return if name.is_a?(Symbol)
192
+
193
+ raise NotImplementedError, "Internal error: name is not a symbol (#{name.class.name})"
194
+ end
195
+
189
196
  def raise_error_if_refrigeration_mode_invalid
190
197
  return if RefrigerationMode::Enum.all.include?(refrigeration_mode)
191
198
 
@@ -231,6 +238,8 @@ module ContractedValue
231
238
  )
232
239
  end
233
240
 
241
+ @attr_values = {}
242
+
234
243
  self.class.send(:attribute_set).each_attribute do |attribute|
235
244
  attr_value = attribute.extract_value(input_attr_values_hash)
236
245
 
@@ -253,8 +262,8 @@ module ContractedValue
253
262
 
254
263
  # Using symbol since attribute names are limited in number
255
264
  # An alternative would be using frozen string
256
- instance_variable_set(
257
- :"@#{attribute.name}",
265
+ @attr_values.store(
266
+ attribute.name.to_sym,
258
267
  sometimes_frozen_attr_value,
259
268
  )
260
269
  end
@@ -265,10 +274,7 @@ module ContractedValue
265
274
  # rubocop:enable Metrics/CyclomaticComplexity
266
275
 
267
276
  def to_h
268
- self.class.send(:attribute_set).
269
- each_attribute.each_with_object({}) do |attribute, hash|
270
- hash[attribute.name] = instance_variable_get(:"@#{attribute.name}")
271
- end
277
+ @attr_values.clone
272
278
  end
273
279
 
274
280
  # == Class interface == #
@@ -288,16 +294,19 @@ module ContractedValue
288
294
  refrigeration_mode: RefrigerationMode::Enum::DEEP,
289
295
  default_value: Private::ATTR_DEFAULT_VALUE_ABSENT_VAL
290
296
  )
297
+ # Using symbol since attribute names are limited in number
298
+ # An alternative would be using frozen string
299
+ name_in_sym = name.to_sym
291
300
 
292
301
  attr = Attribute.new(
293
- name: name,
302
+ name: name_in_sym,
294
303
  contract: contract,
295
304
  refrigeration_mode: refrigeration_mode,
296
305
  default_value: default_value,
297
306
  )
298
307
  @attribute_set = @attribute_set.add(attr)
299
308
 
300
- attr_reader(name)
309
+ define_method(name_in_sym) { @attr_values[name_in_sym] }
301
310
  end
302
311
 
303
312
  # @api private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ContractedValue
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.2"
5
5
  end
@@ -10,40 +10,50 @@ require "spec_helper"
10
10
  end
11
11
 
12
12
  example "does not raise error when NOT declaring any attribute" do
13
- expect(->{ value_class }).to_not raise_error
13
+ expect { value_class }.to_not raise_error
14
14
  end
15
15
 
16
16
  example "does not raise error when declaring 1 attribute" do
17
- expect(
18
- ->{
19
- value_class.class_eval do
20
- attribute(:attribute_1)
21
- end
22
- },
23
- ).to_not raise_error
17
+ expect {
18
+ value_class.class_eval do
19
+ attribute(:attribute_1)
20
+ end
21
+ }.to_not raise_error
24
22
  end
25
23
 
26
24
  example "does not raise error when declaring N attributes with different names" do
27
- expect(
28
- ->{
29
- value_class.class_eval do
30
- attribute(:attribute_1)
31
- attribute(:attribute_2)
32
- end
33
- },
34
- ).to_not raise_error
25
+ expect {
26
+ value_class.class_eval do
27
+ attribute(:attribute_1)
28
+ attribute(:attribute_2)
29
+ end
30
+ }.to_not raise_error
35
31
  end
36
32
 
37
33
  example "does raise error when declaring N attributes with the same name" do
38
- expect(
39
- ->{
40
- value_class.class_eval do
41
- attribute(:attribute_1)
42
- attribute(:attribute_2)
43
- attribute(:attribute_1)
44
- end
45
- },
46
- ).to raise_error(::ContractedValue::Errors::DuplicateAttributeDeclaration)
34
+ expect {
35
+ value_class.class_eval do
36
+ attribute(:attribute_1)
37
+ attribute(:attribute_2)
38
+ attribute(:attribute_1)
39
+ end
40
+ }.to raise_error(::ContractedValue::Errors::DuplicateAttributeDeclaration)
41
+ end
42
+
43
+ example "does not raise error when declaring 1 attribute with string name" do
44
+ expect {
45
+ value_class.class_eval do
46
+ attribute("attribute_1")
47
+ end
48
+ }.to_not raise_error
49
+ end
50
+
51
+ example "does not raise error when declaring 1 attribute with number name" do
52
+ expect {
53
+ value_class.class_eval do
54
+ attribute(1)
55
+ end
56
+ }.to raise_error(::NoMethodError, /undefined method `to_sym'/)
47
57
  end
48
58
  end
49
59
 
@@ -79,39 +89,39 @@ require "spec_helper"
79
89
 
80
90
  it "does raise error when input is not a hash" do
81
91
  aggregate_failures do
82
- expect(
83
- ->{
84
- value_class.new(
85
- non_hash,
86
- )
87
- },
88
- ).to raise_error(::ContractedValue::Errors::InvalidInputType)
92
+ expect {
93
+ value_class.new(
94
+ non_hash,
95
+ )
96
+ }.to raise_error(::ContractedValue::Errors::InvalidInputType)
89
97
  end
90
98
  end
91
99
 
92
100
  it "does not raise error when input is a hash" do
93
101
  aggregate_failures do
94
- expect(
95
- ->{
96
- value_class.new(
97
- default_inputs,
98
- )
99
- },
100
- ).to_not raise_error
102
+ expect {
103
+ value_class.new(
104
+ default_inputs,
105
+ )
106
+ }.to_not raise_error
101
107
  end
102
108
  end
103
109
 
104
110
  it "does not raise error when input is a value" do
105
111
  aggregate_failures do
106
- expect(
107
- ->{
112
+ new_val = nil
113
+ expect {
114
+ new_val = value_class.new(
108
115
  value_class.new(
109
- value_class.new(
110
- default_inputs,
111
- ),
112
- )
113
- },
114
- ).to_not raise_error
116
+ default_inputs,
117
+ ),
118
+ )
119
+ }.to_not raise_error
120
+ if new_val
121
+ default_inputs.each_pair do |attr_name, attr_val|
122
+ expect(new_val.public_send(attr_name)).to eq(attr_val)
123
+ end
124
+ end
115
125
  end
116
126
  end
117
127
 
@@ -121,13 +131,11 @@ require "spec_helper"
121
131
  :attribute_1,
122
132
  :attribute_2,
123
133
  ].each do |attr_name|
124
- expect(
125
- ->{
126
- value_class.new(
127
- default_inputs.dup.tap{|h| h.delete(attr_name)},
128
- )
129
- },
130
- ).to raise_error(::ContractedValue::Errors::MissingAttributeInput)
134
+ expect {
135
+ value_class.new(
136
+ default_inputs.dup.tap{|h| h.delete(attr_name)},
137
+ )
138
+ }.to raise_error(::ContractedValue::Errors::MissingAttributeInput)
131
139
  end
132
140
  end
133
141
  end
@@ -138,15 +146,13 @@ require "spec_helper"
138
146
  :attribute_1,
139
147
  :attribute_2,
140
148
  ].each do |attr_name|
141
- expect(
142
- ->{
143
- value_class.new(
144
- default_inputs.each_with_object({}) do |(k, _v), h|
145
- h[k] = nil
146
- end
147
- )
148
- },
149
- ).to_not raise_error
149
+ expect {
150
+ value_class.new(
151
+ default_inputs.each_with_object({}) do |(k, _v), h|
152
+ h[k] = nil
153
+ end
154
+ )
155
+ }.to_not raise_error
150
156
  end
151
157
  end
152
158
  end
@@ -175,36 +181,30 @@ require "spec_helper"
175
181
 
176
182
 
177
183
  it "does not raise error when all values are valid according to contracts" do
178
- expect(
179
- ->{
180
- value_class.new(
181
- default_inputs
182
- )
183
- },
184
- ).to_not raise_error
184
+ expect {
185
+ value_class.new(
186
+ default_inputs
187
+ )
188
+ }.to_not raise_error
185
189
  end
186
190
 
187
191
  it "does raise error when any value is invalid according to contracts" do
188
192
  aggregate_failures do
189
- expect(
190
- ->{
191
- value_class.new(
192
- default_inputs.merge(
193
- attribute_with_contract_1: "",
194
- ),
195
- )
196
- },
197
- ).to raise_error(::ContractedValue::Errors::InvalidAttributeValue)
193
+ expect {
194
+ value_class.new(
195
+ default_inputs.merge(
196
+ attribute_with_contract_1: "",
197
+ ),
198
+ )
199
+ }.to raise_error(::ContractedValue::Errors::InvalidAttributeValue)
198
200
 
199
- expect(
200
- ->{
201
- value_class.new(
202
- default_inputs.merge(
203
- attribute_with_contract_2: 0,
204
- ),
205
- )
206
- },
207
- ).to raise_error(::ContractedValue::Errors::InvalidAttributeValue)
201
+ expect {
202
+ value_class.new(
203
+ default_inputs.merge(
204
+ attribute_with_contract_2: 0,
205
+ ),
206
+ )
207
+ }.to raise_error(::ContractedValue::Errors::InvalidAttributeValue)
208
208
  end
209
209
  end
210
210
  end
@@ -237,22 +237,18 @@ require "spec_helper"
237
237
  # Create it just before expectation
238
238
  value_object
239
239
 
240
- expect(
241
- ->{
242
- hash_as_input[:a] = nil
243
- },
244
- ).to raise_error(::RuntimeError, /can't modify frozen/)
240
+ expect {
241
+ hash_as_input[:a] = nil
242
+ }.to raise_error(::RuntimeError, /can't modify frozen/)
245
243
  end
246
244
 
247
245
  it "does deeply freeze the inputs" do
248
246
  # Create it just before expectation
249
247
  value_object
250
248
 
251
- expect(
252
- ->{
253
- hash_as_deep_nested_content[:a] = nil
254
- },
255
- ).to raise_error(::RuntimeError, /can't modify frozen/)
249
+ expect {
250
+ hash_as_deep_nested_content[:a] = nil
251
+ }.to raise_error(::RuntimeError, /can't modify frozen/)
256
252
  end
257
253
  end
258
254
 
@@ -265,22 +261,18 @@ require "spec_helper"
265
261
  # Create it just before expectation
266
262
  value_object
267
263
 
268
- expect(
269
- ->{
270
- hash_as_input[:a] = nil
271
- },
272
- ).to raise_error(::RuntimeError, /can't modify frozen/)
264
+ expect {
265
+ hash_as_input[:a] = nil
266
+ }.to raise_error(::RuntimeError, /can't modify frozen/)
273
267
  end
274
268
 
275
269
  it "does not deeply freeze the inputs" do
276
270
  # Create it just before expectation
277
271
  value_object
278
272
 
279
- expect(
280
- ->{
281
- hash_as_deep_nested_content[:a] = nil
282
- },
283
- ).to_not raise_error
273
+ expect {
274
+ hash_as_deep_nested_content[:a] = nil
275
+ }.to_not raise_error
284
276
  end
285
277
  end
286
278
 
@@ -293,22 +285,18 @@ require "spec_helper"
293
285
  # Create it just before expectation
294
286
  value_object
295
287
 
296
- expect(
297
- ->{
298
- hash_as_input[:a] = nil
299
- },
300
- ).to_not raise_error
288
+ expect {
289
+ hash_as_input[:a] = nil
290
+ }.to_not raise_error
301
291
  end
302
292
 
303
293
  it "does not deeply freeze the inputs" do
304
294
  # Create it just before expectation
305
295
  value_object
306
296
 
307
- expect(
308
- ->{
309
- hash_as_deep_nested_content[:a] = nil
310
- },
311
- ).to_not raise_error
297
+ expect {
298
+ hash_as_deep_nested_content[:a] = nil
299
+ }.to_not raise_error
312
300
  end
313
301
  end
314
302
 
@@ -533,11 +521,9 @@ require "spec_helper"
533
521
  end
534
522
 
535
523
  example "does not raise error" do
536
- expect(
537
- ->{
538
- child_value_class.new(attribute_1: "wut")
539
- },
540
- ).to_not raise_error
524
+ expect {
525
+ child_value_class.new(attribute_1: "wut")
526
+ }.to_not raise_error
541
527
  end
542
528
 
543
529
  end
@@ -559,36 +545,30 @@ require "spec_helper"
559
545
  end
560
546
 
561
547
  example "does not raise error when declaring 1 new attribute" do
562
- expect(
563
- ->{
564
- child_value_class.class_eval do
565
- attribute(:attribute_3)
566
- end
567
- },
568
- ).to_not raise_error
548
+ expect {
549
+ child_value_class.class_eval do
550
+ attribute(:attribute_3)
551
+ end
552
+ }.to_not raise_error
569
553
  end
570
554
 
571
555
  example "does not raise error when declaring N attributes with different names" do
572
- expect(
573
- ->{
574
- child_value_class.class_eval do
575
- attribute(:attribute_3)
576
- attribute(:attribute_4)
577
- end
578
- },
579
- ).to_not raise_error
556
+ expect {
557
+ child_value_class.class_eval do
558
+ attribute(:attribute_3)
559
+ attribute(:attribute_4)
560
+ end
561
+ }.to_not raise_error
580
562
  end
581
563
 
582
564
  example "does raise error when declaring N attributes with the same name" do
583
- expect(
584
- ->{
585
- child_value_class.class_eval do
586
- attribute(:attribute_3)
587
- attribute(:attribute_4)
588
- attribute(:attribute_3)
589
- end
590
- },
591
- ).to raise_error(::ContractedValue::Errors::DuplicateAttributeDeclaration)
565
+ expect {
566
+ child_value_class.class_eval do
567
+ attribute(:attribute_3)
568
+ attribute(:attribute_4)
569
+ attribute(:attribute_3)
570
+ end
571
+ }.to raise_error(::ContractedValue::Errors::DuplicateAttributeDeclaration)
592
572
  end
593
573
 
594
574
  end
@@ -632,31 +612,27 @@ require "spec_helper"
632
612
  end
633
613
 
634
614
  example "does not raise error when declaring existing attribute with different contract" do
635
- expect(
636
- ->{
637
- child_value_class.class_eval do
638
- attribute(
639
- :attribute_1,
640
- contract: ::Contracts::Builtin::NatPos
641
- )
642
- end
643
- child_value_class.new(attribute_1: "")
644
- },
645
- ).to raise_error(::ContractedValue::Errors::InvalidAttributeValue)
615
+ expect {
616
+ child_value_class.class_eval do
617
+ attribute(
618
+ :attribute_1,
619
+ contract: ::Contracts::Builtin::NatPos
620
+ )
621
+ end
622
+ child_value_class.new(attribute_1: "")
623
+ }.to raise_error(::ContractedValue::Errors::InvalidAttributeValue)
646
624
  end
647
625
 
648
626
  example "does not raise error when declaring existing attribute with different default_value" do
649
- expect(
650
- ->{
651
- child_value_class.class_eval do
652
- attribute(
653
- :attribute_1,
654
- default_value: nil,
655
- )
656
- end
657
- child_value_class.new
658
- },
659
- ).to_not raise_error
627
+ expect {
628
+ child_value_class.class_eval do
629
+ attribute(
630
+ :attribute_1,
631
+ default_value: nil,
632
+ )
633
+ end
634
+ child_value_class.new
635
+ }.to_not raise_error
660
636
  end
661
637
 
662
638
  example "does not raise error when declaring existing attribute with different refrigeration_mode" do
data/spec/spec_helper.rb CHANGED
@@ -1,15 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
4
- require "contracted_value"
5
-
6
- if ENV["TRAVIS"]
3
+ if ENV["COVERALLS"]
7
4
  require "simplecov"
8
- SimpleCov.start
5
+ require "simplecov-lcov"
6
+
7
+ SimpleCov::Formatter::LcovFormatter.config do |c|
8
+ c.report_with_single_file = true
9
+ c.single_report_path = "coverage/lcov.info"
10
+ end
9
11
 
10
- require "codecov"
11
- SimpleCov.formatter = SimpleCov::Formatter::Codecov
12
+ SimpleCov.formatters = SimpleCov::Formatter::MultiFormatter.new(
13
+ [SimpleCov::Formatter::HTMLFormatter, SimpleCov::Formatter::LcovFormatter]
14
+ )
15
+
16
+ SimpleCov.start do
17
+ add_filter "spec/"
18
+ end
12
19
  end
13
20
 
21
+ $LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
22
+ require "contracted_value"
23
+
14
24
  require "rspec"
15
25
  require "rspec/its"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contracted_value
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - PikachuEXE
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-05 00:00:00.000000000 Z
11
+ date: 2023-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: contracts
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.15'
19
+ version: '0.17'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.15'
26
+ version: '0.17'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ice_nine
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -61,7 +61,7 @@ dependencies:
61
61
  version: '10.0'
62
62
  - - "<="
63
63
  - !ruby/object:Gem::Version
64
- version: '13.0'
64
+ version: '14.0'
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,7 +71,7 @@ dependencies:
71
71
  version: '10.0'
72
72
  - - "<="
73
73
  - !ruby/object:Gem::Version
74
- version: '13.0'
74
+ version: '14.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: pry
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -93,6 +93,9 @@ dependencies:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
95
  version: '2.0'
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 2.5.0
96
99
  type: :development
97
100
  prerelease: false
98
101
  version_requirements: !ruby/object:Gem::Requirement
@@ -100,6 +103,9 @@ dependencies:
100
103
  - - "~>"
101
104
  - !ruby/object:Gem::Version
102
105
  version: '2.0'
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 2.5.0
103
109
  - !ruby/object:Gem::Dependency
104
110
  name: rspec
105
111
  requirement: !ruby/object:Gem::Requirement
@@ -134,28 +140,28 @@ dependencies:
134
140
  requirements:
135
141
  - - ">="
136
142
  - !ruby/object:Gem::Version
137
- version: '0'
143
+ version: '0.21'
138
144
  type: :development
139
145
  prerelease: false
140
146
  version_requirements: !ruby/object:Gem::Requirement
141
147
  requirements:
142
148
  - - ">="
143
149
  - !ruby/object:Gem::Version
144
- version: '0'
150
+ version: '0.21'
145
151
  - !ruby/object:Gem::Dependency
146
- name: codecov
152
+ name: simplecov-lcov
147
153
  requirement: !ruby/object:Gem::Requirement
148
154
  requirements:
149
155
  - - ">="
150
156
  - !ruby/object:Gem::Version
151
- version: '0'
157
+ version: '0.8'
152
158
  type: :development
153
159
  prerelease: false
154
160
  version_requirements: !ruby/object:Gem::Requirement
155
161
  requirements:
156
162
  - - ">="
157
163
  - !ruby/object:Gem::Version
158
- version: '0'
164
+ version: '0.8'
159
165
  - !ruby/object:Gem::Dependency
160
166
  name: gem-release
161
167
  requirement: !ruby/object:Gem::Requirement
@@ -198,8 +204,8 @@ dependencies:
198
204
  - - ">="
199
205
  - !ruby/object:Gem::Version
200
206
  version: '0.70'
201
- description: " ActiveRecord is great, but could be better. Here are some tweaks
202
- for it.\n"
207
+ description: " Library for creating contracted immutable(by default) value objects
208
+ supported by contracts.ruby & ice_nine\n"
203
209
  email:
204
210
  - pikachuexe@gmail.com
205
211
  executables: []
@@ -208,9 +214,13 @@ extra_rdoc_files: []
208
214
  files:
209
215
  - ".codeclimate.yml"
210
216
  - ".editorconfig"
217
+ - ".github/CODEOWNERS"
218
+ - ".github/FUNDING.yml"
219
+ - ".github/dependabot.yml"
220
+ - ".github/workflows/coverage.yml"
221
+ - ".github/workflows/tests.yaml"
211
222
  - ".gitignore"
212
223
  - ".rubocop.yml"
213
- - ".travis.yml"
214
224
  - Appraisals
215
225
  - CHANGELOG.md
216
226
  - Gemfile
@@ -218,8 +228,7 @@ files:
218
228
  - README.md
219
229
  - Rakefile
220
230
  - contracted_value.gemspec
221
- - gemfiles/contracts_15_0.gemfile
222
- - gemfiles/contracts_16_0.gemfile
231
+ - gemfiles/contracts_17_0.gemfile
223
232
  - lib/contracted_value.rb
224
233
  - lib/contracted_value/core.rb
225
234
  - lib/contracted_value/version.rb
@@ -230,7 +239,7 @@ homepage: http://github.com/PikachuEXE/contracted_value
230
239
  licenses:
231
240
  - MIT
232
241
  metadata: {}
233
- post_install_message:
242
+ post_install_message:
234
243
  rdoc_options: []
235
244
  require_paths:
236
245
  - lib
@@ -238,17 +247,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
238
247
  requirements:
239
248
  - - ">="
240
249
  - !ruby/object:Gem::Version
241
- version: 2.3.0
250
+ version: 3.0.0
242
251
  required_rubygems_version: !ruby/object:Gem::Requirement
243
252
  requirements:
244
253
  - - ">="
245
254
  - !ruby/object:Gem::Version
246
255
  version: 1.4.0
247
256
  requirements: []
248
- rubygems_version: 3.0.3
249
- signing_key:
257
+ rubygems_version: 3.4.20
258
+ signing_key:
250
259
  specification_version: 4
251
- summary: Some Tweaks for ActiveRecord
260
+ summary: Contracted immutable(by default) value objects
252
261
  test_files:
253
262
  - spec/contracted_value/value_spec.rb
254
263
  - spec/contracted_value_spec.rb
data/.travis.yml DELETED
@@ -1,25 +0,0 @@
1
- # Send builds to container-based infrastructure
2
- # http://docs.travis-ci.com/user/workers/container-based-infrastructure/
3
- sudo: false
4
- language: ruby
5
- before_install:
6
- # This is required since 2.6.8 has issue when installing `rainbow`
7
- # https://github.com/sickill/rainbow/issues/48
8
- - gem update --system
9
- - gem --version
10
- cache:
11
- - bundler
12
- rvm:
13
- - 2.4
14
- - 2.5
15
- - 2.6
16
- - 2.7
17
- - ruby-head
18
- gemfile:
19
- - gemfiles/contracts_15_0.gemfile
20
- - gemfiles/contracts_16_0.gemfile
21
- matrix:
22
- fast_finish: true
23
- allow_failures:
24
- - rvm: 2.7
25
- - rvm: ruby-head
@@ -1,7 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "contracts", "~> 0.16.0"
6
-
7
- gemspec path: "../"