shape_of 0.2.2 → 1.0.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shape_of.rb +14 -51
  3. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 752eb59a030bfd813d4d4a06fb470860dcc4906566601b606b31ae6d2e9a377e
4
- data.tar.gz: 8549d7a936ead7069f6a2976045b1b9a2a41514dd2aa87086a0009c030c1b2cc
3
+ metadata.gz: 6029b808200bb28201b18af2fac69cdd6c7ef68a27c55d7c94d95ee459dcdc3e
4
+ data.tar.gz: 7a07a494f474b3ed1fb1f33d0f6f6633b5e2c1a27b69abe3f37cbcba7c60cb86
5
5
  SHA512:
6
- metadata.gz: efe740174b7c8f1c4ede6040e118038cd97e6f7e6b3e21b19e5d97d947bfbe2aaf4399b9b3b905893735eeaeb5b1277ec4188980a5a2874468fd989068a4fbea
7
- data.tar.gz: 9bef6f76ff9fcb92ae39c1fa88c3cd608d843cff8ce189de92651a77ee92aba7343dfe2459e7d79f75167508a46a8ebea55d1b60aaa2169940a340428378b03b
6
+ metadata.gz: 1874ea9da0b26864298dd7b9ccd5874fa39301c05c83e83ec18d4943726c6a58c877bed7e2fdafb5ad64cdbb40afe3a5611673e591a97315265644cd05741b8c
7
+ data.tar.gz: b9c36bdcc7fb8b5ef7f5913e7ec5fd34cbfc9dbffc5e8bd7a058f54f0ace2adafa9ed937a710a5780a3755b785a456d571af4bd67140d095d0de8c4d3d8df989
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 Hash, are the core components of this module.
132
+ # This, along with Array, 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.first].shape_of? elem
164
+ Array[@shape].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,8 +175,7 @@ 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.
179
- # 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. Hash (without square brackets) is just a hash with any shape.
180
179
  # This, along with Array, are the core components of this module.
181
180
  # Note that the keys are converted to strings for comparison for both the shape and object provided.
182
181
  class Hash < Shape
@@ -223,7 +222,7 @@ module ShapeOf
223
222
  if @shape[key].respond_to? :shape_of?
224
223
  @shape[key].shape_of? elem
225
224
  elsif @shape[key].is_a? ::Array
226
- Array[@shape[key].first].shape_of? elem
225
+ Array[@shape[key]].shape_of? elem
227
226
  elsif @shape[key].is_a? ::Hash
228
227
  Hash[@shape[key]].shape_of? elem
229
228
  elsif @shape[key].is_a? Class
@@ -243,7 +242,7 @@ module ShapeOf
243
242
  end
244
243
  end
245
244
 
246
- # Union[shape1, shape2, ...] denotes that it can be of one the provided shapes.
245
+ # Union[Shape1, Shape2, ...] denotes that it can be of one the provided shapes
247
246
  class Union < Shape
248
247
  def self.[](*shapes)
249
248
  Class.new(self) do
@@ -281,8 +280,7 @@ module ShapeOf
281
280
  end
282
281
  end
283
282
 
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)
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)
286
284
  class Optional < Shape
287
285
  def self.[](shape)
288
286
  raise TypeError, "Shape cannot be nil" if shape.nil? || shape == NilClass
@@ -301,14 +299,13 @@ module ShapeOf
301
299
  end
302
300
  end
303
301
 
304
- # Anything matches unless key does not exist in the Hash.
305
302
  class Any < Shape
306
303
  def self.shape_of?(object)
307
304
  true
308
305
  end
309
306
  end
310
307
 
311
- # Only passes when the key does not exist in the Hash.
308
+ # Nothing only passes when the key does not exist in the Hash.
312
309
  class Nothing < Shape
313
310
  def self.shape_of?(object)
314
311
  false
@@ -319,44 +316,10 @@ module ShapeOf
319
316
  end
320
317
  end
321
318
 
322
- # Matches a Regexp against a String using Regexp#match?.
323
- # Pretty much a wrapper around Regexp because a Regexp instance will be tested for equality
324
- # in the ShapeOf::Hash and ShapeOf::Array since it's not a class.
325
- class Pattern < Shape
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
- raise TypeError, "expected #{String.inspect}, was instead #{object.inspect}" unless object.instance_of?(String)
347
-
348
- @shape.match?(object)
349
- end
350
- end
351
- end
352
- end
353
-
354
- # Union[Integer, Float, Rational, Complex]
355
319
  Numeric = Union[Integer, Float, Rational, Complex].tap do |this|
356
320
  this.instance_variable_set(:@class_name, this.name.sub(/Union.*/, 'Numeric'))
357
321
  end
358
322
 
359
- # Union[TrueClass, FalseClass]
360
323
  Boolean = Union[TrueClass, FalseClass].tap do |this|
361
324
  this.instance_variable_set(:@class_name, this.name.sub(/Union.*/, 'Boolean'))
362
325
  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.2
4
+ version: 1.0.0
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-28 00:00:00.000000000 Z
11
+ date: 2021-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest