shaped 0.6.4 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f6ca9518d2b3b0b55988f53d055a48c1344c54d6c8f8497877fb48e8ad621e1
4
- data.tar.gz: c7e2be555928b918681670b803ea95b70ad97da25f0b4079be7fa6f16c4f6892
3
+ metadata.gz: 6243debb70327afd9840f95f340bafd00f2de355e247bba0c6f16f3328c11e6b
4
+ data.tar.gz: b993c1b5252874d7d76c845bac27331eacf6de59f24b5f6aa8da2e8caa5ff1c1
5
5
  SHA512:
6
- metadata.gz: 59c995d6a92d07d29b87a565924dbd175f8bce9e7ce158bdc98cf450aa5fb8e5073f78e6eeea5be0a140045e838e3562da9a2562a3263666dceeac23b7ac0368
7
- data.tar.gz: 4c3b1e10af00279e075c7094a06b07b8624f3fc165fcea3704db18a5d52ec48b58bf9a8dffd31320465f2bad598d820f193f901be9bbe7f29e2852e7d8eda5a3
6
+ metadata.gz: 0feed58b9c6ac20113a75ec9d560b69102a8240e192b6ce353d6a2da2e82ca01b9aa6d80422ad0565e3a367537c2bb8de9fe10c7242969a8f56a0ff8cabe824a
7
+ data.tar.gz: 2dff65af38ece59c0ad34309f8111606cbc7bee03a5be912561965f0e8557eef5253d50d872317a8d0a97669c8a0c98b4906ca57696d194c8d293fa0e37eb005
@@ -41,6 +41,8 @@ Layout/SpaceBeforeSemicolon:
41
41
  Enabled: false
42
42
  Layout/SpaceInsideHashLiteralBraces:
43
43
  EnforcedStyle: space
44
+ Lint/ConstantResolution:
45
+ Enabled: false
44
46
  Lint/RedundantSplatExpansion:
45
47
  Enabled: false
46
48
  Metrics/AbcSize:
@@ -1,3 +1,14 @@
1
+ ## v0.7.0 (2020-06-24)
2
+ ### BREAKING CHANGES
3
+ - Rename the `Or` shape to `Any`
4
+ - Add a `Method` shape (where the shape description is the name of a method which, when called on a
5
+ test object, must return a truthy value). This is a breaking change because the `Shaped::Shape`
6
+ constructor will now return an instance of `Shaped::Shapes::Method` rather than
7
+ `Shaped::Shapes::Equality` when called with a Symbol argument.
8
+
9
+ ### Added
10
+ - Add an `All` shape (w/ multiple sub-shapes, all of which must be matched)
11
+
1
12
  ## v0.6.4 (2020-06-22)
2
13
  ### Fixed
3
14
  - Make it possible to specify optional keys in a Hash shape (using an `Or` shape as the value)
@@ -92,7 +103,7 @@
92
103
  `Shaped::Shapes::Hash`):
93
104
  1. `Shaped::Shapes::Class`
94
105
  2. `Shaped::Shapes::Equality`
95
- 3. `Shaped::Shapes::Or`
106
+ 3. `Shaped::Shapes::Any`
96
107
  - All hashes and arrays in shape definitions are parsed "recursively" as shape definitions. For
97
108
  example, instead of:
98
109
 
@@ -10,7 +10,7 @@ GIT
10
10
  PATH
11
11
  remote: .
12
12
  specs:
13
- shaped (0.6.4)
13
+ shaped (0.7.0)
14
14
  activemodel (~> 6.0)
15
15
  activesupport (~> 6.0)
16
16
 
@@ -61,9 +61,9 @@ GEM
61
61
  notiffany (0.1.3)
62
62
  nenv (~> 0.1)
63
63
  shellany (~> 0.0)
64
- parallel (1.19.1)
65
- parser (2.7.1.3)
66
- ast (~> 2.4.0)
64
+ parallel (1.19.2)
65
+ parser (2.7.1.4)
66
+ ast (~> 2.4.1)
67
67
  pry (0.13.1)
68
68
  coderay (~> 1.1)
69
69
  method_source (~> 1.0)
@@ -90,13 +90,13 @@ GEM
90
90
  diff-lcs (>= 1.2.0, < 2.0)
91
91
  rspec-support (~> 3.9.0)
92
92
  rspec-support (3.9.3)
93
- rubocop (0.85.1)
93
+ rubocop (0.86.0)
94
94
  parallel (~> 1.10)
95
95
  parser (>= 2.7.0.1)
96
96
  rainbow (>= 2.2.2, < 4.0)
97
97
  regexp_parser (>= 1.7)
98
98
  rexml
99
- rubocop-ast (>= 0.0.3)
99
+ rubocop-ast (>= 0.0.3, < 1.0)
100
100
  ruby-progressbar (~> 1.7)
101
101
  unicode-display_width (>= 1.4.0, < 2.0)
102
102
  rubocop-ast (0.0.3)
data/README.md CHANGED
@@ -21,15 +21,17 @@ Validate the "shape" of Ruby objects!
21
21
  * [Shaped::Shapes::Array](#shapedshapesarray)
22
22
  * [Shaped::Shapes::Class](#shapedshapesclass)
23
23
  * [ActiveModel validations](#activemodel-validations)
24
+ * [Shaped::Shapes::Method](#shapedshapesmethod)
24
25
  * [Shaped::Shapes::Callable](#shapedshapescallable)
25
26
  * [Shaped::Shapes::Equality](#shapedshapesequality)
26
- * [Shaped::Shapes::Or](#shapedshapesor)
27
+ * [Shaped::Shapes::Any](#shapedshapesany)
28
+ * [Shaped::Shapes::All](#shapedshapesall)
27
29
  * [#to_s](#to_s)
28
30
  * [Development](#development)
29
31
  * [For maintainers](#for-maintainers)
30
32
  * [License](#license)
31
33
 
32
- <!-- Added by: david, at: Fri Jun 19 21:29:30 PDT 2020 -->
34
+ <!-- Added by: david, at: Wed Jun 24 13:56:49 PDT 2020 -->
33
35
 
34
36
  <!--te-->
35
37
 
@@ -91,7 +93,7 @@ types (all of which inherit from `Shaped::Shape`):
91
93
  1. `Shaped::Shapes::Class`
92
94
  1. `Shaped::Shapes::Callable`
93
95
  1. `Shaped::Shapes::Equality`
94
- 1. `Shaped::Shapes::Or`
96
+ 1. `Shaped::Shapes::Any`
95
97
 
96
98
  Examples illustrating the use of each shape type are below.
97
99
 
@@ -204,6 +206,21 @@ shape.matched_by?('a@b.c') # too short
204
206
  # => false
205
207
  ```
206
208
 
209
+ ## Shaped::Shapes::Method
210
+
211
+ This shape allows specifying a method name that, when called upon a test object, must return a
212
+ truthy value in order for `matched_by?` to be true.
213
+
214
+ ```rb
215
+ shape = Shaped::Shape(:odd?)
216
+
217
+ shape.matched_by?(55)
218
+ # => true
219
+
220
+ shape.matched_by?(60)
221
+ # => false
222
+ ```
223
+
207
224
  ## Shaped::Shapes::Callable
208
225
 
209
226
  This shape is very powerful if you need a very customized shape definition; you can define any
@@ -282,7 +299,7 @@ shape.matched_by?(verification_code: '321cba', new_role: 'SuperAdmin')
282
299
  # => false
283
300
  ```
284
301
 
285
- ## Shaped::Shapes::Or
302
+ ## Shaped::Shapes::Any
286
303
 
287
304
  This shape is used behind the scenes to build "compound matchers", such as an Array shape that
288
305
  allows multiple different classes:
@@ -299,7 +316,7 @@ shape.matched_by?([0.333, 55])
299
316
  # => false
300
317
  ```
301
318
 
302
- You can build an `Or` shape by invoking the `Shaped::Shape` constructor with more than one argument.
319
+ You can build an `Any` shape by invoking the `Shaped::Shape` constructor with more than one argument.
303
320
  Below is a (rather artificial) example illustrating this. To match this `shape`, an object must be
304
321
  either greater than zero OR an Integer (or both).
305
322
 
@@ -316,6 +333,23 @@ shape.matched_by?(-11.5) # it's neither greater than 0 nor an Integer
316
333
  # => false
317
334
  ```
318
335
 
336
+ ## Shaped::Shapes::All
337
+
338
+ This shape can be used to combine multiple checks, all of which must be true for a test object in
339
+ order for `#matched_by?` to be true:
340
+
341
+ ```rb
342
+ shape = Shaped::Shapes::All.new(Numeric, ->(number) { number.even? })
343
+ shape.to_s
344
+ # => "Numeric AND Proc test defined at (eval):10"
345
+
346
+ shape.matched_by?(22) # 22 is both a Numeric and `#even?`
347
+ # => true
348
+
349
+ shape.matched_by?(33) # 33 is a Numeric but it's not `#even?`
350
+ # => false
351
+ ```
352
+
319
353
  ## `#to_s`
320
354
 
321
355
  Each Shape type implements a `#to_s` instance method that aims to provide a relatively clear
@@ -13,7 +13,7 @@ module Shaped
13
13
  def self.Shape(*shape_descriptions)
14
14
  validation_options = shape_descriptions.extract_options!
15
15
  if shape_descriptions.size >= 2
16
- Shaped::Shapes::Or.new(*shape_descriptions, validation_options)
16
+ Shaped::Shapes::Any.new(*shape_descriptions, validation_options)
17
17
  else
18
18
  # If the shape_descriptions argument list was just one hash, then `extract_options!` would
19
19
  # have removed it, making `shape_descriptions` an empty array, so we need to "restore" the
@@ -30,6 +30,7 @@ module Shaped
30
30
  when Shaped::Shape then shape_description
31
31
  when Hash then Shaped::Shapes::Hash.new(shape_description)
32
32
  when Array then Shaped::Shapes::Array.new(shape_description)
33
+ when Symbol then Shaped::Shapes::Method.new(shape_description)
33
34
  when Class then Shaped::Shapes::Class.new(shape_description, validation_options)
34
35
  else
35
36
  if shape_description.respond_to?(:call)
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Shaped::Shapes::All < Shaped::Shape
4
+ def initialize(*shape_descriptions)
5
+ validation_options = shape_descriptions.extract_options!
6
+ if shape_descriptions.size <= 1
7
+ raise(Shaped::InvalidShapeDescription, <<~ERROR.squish)
8
+ A #{self.class} description must be a list of two or more shape descriptions.
9
+ ERROR
10
+ end
11
+
12
+ @shapes =
13
+ shape_descriptions.map do |description|
14
+ Shaped::Shape(description, validation_options)
15
+ end
16
+ end
17
+
18
+ def matched_by?(object)
19
+ @shapes.all? { |shape| shape.matched_by?(object) }
20
+ end
21
+
22
+ def to_s
23
+ @shapes.map(&:to_s).join(' AND ')
24
+ end
25
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Shaped::Shapes::Or < Shaped::Shape
3
+ class Shaped::Shapes::Any < Shaped::Shape
4
4
  def initialize(*shape_descriptions)
5
5
  validation_options = shape_descriptions.extract_options!
6
6
  if shape_descriptions.size <= 1
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Shaped::Shapes::Method < Shaped::Shape
4
+ def initialize(method_name)
5
+ @method_name = method_name
6
+ end
7
+
8
+ def matched_by?(object)
9
+ !!object.public_send(@method_name)
10
+ end
11
+
12
+ def to_s
13
+ "object returning truthy for ##{@method_name}"
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Shaped
4
- VERSION = '0.6.4'
4
+ VERSION = '0.7.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shaped
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.4
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Runger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-22 00:00:00.000000000 Z
11
+ date: 2020-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -65,12 +65,14 @@ files:
65
65
  - bin/setup
66
66
  - lib/shaped.rb
67
67
  - lib/shaped/shape.rb
68
+ - lib/shaped/shapes/all.rb
69
+ - lib/shaped/shapes/any.rb
68
70
  - lib/shaped/shapes/array.rb
69
71
  - lib/shaped/shapes/callable.rb
70
72
  - lib/shaped/shapes/class.rb
71
73
  - lib/shaped/shapes/equality.rb
72
74
  - lib/shaped/shapes/hash.rb
73
- - lib/shaped/shapes/or.rb
75
+ - lib/shaped/shapes/method.rb
74
76
  - lib/shaped/version.rb
75
77
  - shaped.gemspec
76
78
  homepage: https://github.com/davidrunger/shaped