shape_of 0.2.0 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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