shape_of 0.2.0 → 1.0.2

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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shape_of.rb +19 -55
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9663853638d239d448381e9ab748aeb7813a76b42ed9bd97c423f6d142c95d80
4
- data.tar.gz: b1bdfeb51c08760c7c83519ce640c48d1202d23f3878adb93a2824761525219e
3
+ metadata.gz: a3927b79cdab33d77c8c7e3d603fa534374db3249711e52ddc38f80fe7f3b261
4
+ data.tar.gz: 850512ef062009d3573d1030d53a71bca63bd4160d9984abfbb63f419997bb09
5
5
  SHA512:
6
- metadata.gz: 49cc6be2be276d554b25affe85bd97aca4ff3a134ee2a6334a0d37f35982f34ff28c39d3ce090418d2843b15dbc9d4b5b3bcbe568be69acbed90e31bcfab1ec6
7
- data.tar.gz: cbaa2ed60315ffc111228a0f2093e950ad930a5ecbbba25c471f2d55044d1f14829e040e04d6e6705fcb767519994b1df46b67d0e61ea1046d90a54b87ff3057
6
+ metadata.gz: ad23f6d1177ced41798e95b6021bf95d193d369d12b4acf932257edd6c3b1e782fc15c98c771e7fb2f70c6cffb5d2f5360f9403ebe0da5a68e4233788a05ea30
7
+ data.tar.gz: 8d3d24c669c79cbe84e739ea36bfd0fc4a09cb415cfa6720ee05126dbde7abb4605a11b9bb8ac54444be3d1e7f00f071453fc85074169b53c0e564f625e87dc8
data/lib/shape_of.rb CHANGED
@@ -89,11 +89,11 @@ module ShapeOf
89
89
  module Assertions
90
90
  def assert_shape_of(object, shape)
91
91
  if shape.respond_to? :shape_of?
92
- assert_operator shape, :shape_of?, object
92
+ assert shape.shape_of? object
93
93
  elsif shape.instance_of? ::Array
94
- assert_operator Array[shape.first], :shape_of?, object
94
+ assert Array[shape.first].shape_of? object
95
95
  elsif shape.instance_of? ::Hash
96
- assert_operator Hash[shape], :shape_of?, object
96
+ assert Hash[shape].shape_of? object
97
97
  else
98
98
  raise TypeError, "Expected #{Shape.inspect}, an #{::Array.inspect}, or a #{::Hash.inspect} as the shape"
99
99
  end
@@ -101,11 +101,11 @@ module ShapeOf
101
101
 
102
102
  def refute_shape_of(object, shape)
103
103
  if shape.respond_to? :shape_of?
104
- refute_operator shape, :shape_of?, object
104
+ refute shape.shape_of? object
105
105
  elsif shape.instance_of? ::Array
106
- refute_operator Array[shape.first], :shape_of?, object
106
+ refute Array[shape.first].shape_of? object
107
107
  elsif shape.instance_of? ::Hash
108
- refute_operator Hash[shape], :shape_of?, object
108
+ refute Hash[shape].shape_of? object
109
109
  else
110
110
  raise TypeError, "Expected #{Shape.inspect}, an #{::Array.inspect}, or a #{::Hash.inspect} as the shape"
111
111
  end
@@ -127,9 +127,9 @@ module ShapeOf
127
127
  end
128
128
  end
129
129
 
130
- # Array[Shape] denotes that it is an array of shapes.
130
+ # Array[shape] denotes that it is an array of shapes.
131
131
  # It checks every element in the array and verifies that the element is in the correct shape.
132
- # This, along with Array, are the core components of this module.
132
+ # This, along with Hash, are the core components of this module.
133
133
  # Note that a ShapeOf::Array[Integer].shape_of?([]) will pass because it is vacuously true for an empty array.
134
134
  class Array < Shape
135
135
  @internal_class = ::Array
@@ -161,7 +161,7 @@ module ShapeOf
161
161
  if @shape.respond_to? :shape_of?
162
162
  @shape.shape_of? elem
163
163
  elsif @shape.is_a? ::Array
164
- Array[@shape].shape_of? elem
164
+ Array[@shape.first].shape_of? elem
165
165
  elsif @shape.is_a? ::Hash
166
166
  Hash[@shape].shape_of? elem
167
167
  elsif @shape.is_a? Class
@@ -175,7 +175,8 @@ module ShapeOf
175
175
  end
176
176
  end
177
177
 
178
- # Hash[key: Shape, ...] denotes it is a hash of shapes with a very specific structure. Hash (without square brackets) is just a hash with any shape.
178
+ # Hash[key: shape, ...] denotes it is a hash of shapes with a very specific structure.
179
+ # Hash (without square brackets) is just a hash with any shape.
179
180
  # This, along with Array, are the core components of this module.
180
181
  # Note that the keys are converted to strings for comparison for both the shape and object provided.
181
182
  class Hash < Shape
@@ -222,7 +223,7 @@ module ShapeOf
222
223
  if @shape[key].respond_to? :shape_of?
223
224
  @shape[key].shape_of? elem
224
225
  elsif @shape[key].is_a? ::Array
225
- Array[@shape[key]].shape_of? elem
226
+ Array[@shape[key].first].shape_of? elem
226
227
  elsif @shape[key].is_a? ::Hash
227
228
  Hash[@shape[key]].shape_of? elem
228
229
  elsif @shape[key].is_a? Class
@@ -242,7 +243,7 @@ module ShapeOf
242
243
  end
243
244
  end
244
245
 
245
- # Union[Shape1, Shape2, ...] denotes that it can be of one the provided shapes
246
+ # Union[shape1, shape2, ...] denotes that it can be of one the provided shapes.
246
247
  class Union < Shape
247
248
  def self.[](*shapes)
248
249
  Class.new(self) do
@@ -280,7 +281,8 @@ module ShapeOf
280
281
  end
281
282
  end
282
283
 
283
- # Optional[Shape] denotes that the usual type is a Shape, but is optional (meaning if it is nil or the key is not present in the Hash, it's still true)
284
+ # Optional[shape] denotes that the usual type is a shape, but is optional
285
+ # (meaning if it is nil or the key is not present in the Hash, it's still true)
284
286
  class Optional < Shape
285
287
  def self.[](shape)
286
288
  raise TypeError, "Shape cannot be nil" if shape.nil? || shape == NilClass
@@ -299,13 +301,14 @@ module ShapeOf
299
301
  end
300
302
  end
301
303
 
304
+ # Anything matches unless key does not exist in the Hash.
302
305
  class Any < Shape
303
306
  def self.shape_of?(object)
304
307
  true
305
308
  end
306
309
  end
307
310
 
308
- # Nothing only passes when the key does not exist in the Hash.
311
+ # Only passes when the key does not exist in the Hash.
309
312
  class Nothing < Shape
310
313
  def self.shape_of?(object)
311
314
  false
@@ -316,51 +319,12 @@ module ShapeOf
316
319
  end
317
320
  end
318
321
 
319
- class Regexp < Shape
320
- @internal_class = ::Regexp
321
-
322
- def self.shape_of?(object)
323
- object.instance_of? @internal_class
324
- end
325
-
326
- def self.[](shape)
327
- raise TypeError, "Shape must be #{::Regexp.inspect}, was #{shape.inspect}" unless shape.instance_of? ::Regexp
328
-
329
- Class.new(self) do
330
- @class_name = "#{superclass.name}[#{shape.inspect}]"
331
- @shape = shape
332
-
333
- def self.name
334
- @class_name
335
- end
336
-
337
- def self.to_s
338
- @class_name
339
- end
340
-
341
- def self.inspect
342
- @class_name
343
- end
344
-
345
- def self.shape_of?(object)
346
- unless object.instance_of?(::Regexp) || object.instance_of?(String)
347
- raise TypeError, "expected #{::Regexp.inspect} or #{String.inspect}, was instead #{object.inspect}"
348
- end
349
-
350
- if object.instance_of?(::Regexp)
351
- @shape == object
352
- else # string
353
- @shape.match?(object)
354
- end
355
- end
356
- end
357
- end
358
- end
359
-
322
+ # Union[Integer, Float, Rational, Complex]
360
323
  Numeric = Union[Integer, Float, Rational, Complex].tap do |this|
361
324
  this.instance_variable_set(:@class_name, this.name.sub(/Union.*/, 'Numeric'))
362
325
  end
363
326
 
327
+ # Union[TrueClass, FalseClass]
364
328
  Boolean = Union[TrueClass, FalseClass].tap do |this|
365
329
  this.instance_variable_set(:@class_name, this.name.sub(/Union.*/, 'Boolean'))
366
330
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shape_of
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Isom
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-17 00:00:00.000000000 Z
11
+ date: 2021-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest