hashape 1.0.0 → 2.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.
- checksums.yaml +4 -4
- data/Gemfile +1 -3
- data/README.md +67 -1
- data/hashape.gemspec +1 -0
- data/lib/hashape.rb +22 -11
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e35dfd6e8729b87cdfa05e269c7f49a91e30226164cd9389f01af772065d0d06
|
4
|
+
data.tar.gz: b28498ce41057dd4c993798438c90b5e98e67ab7619e0f4da2d29da279c8d837
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3768ff18d9b09f28904b3a7567d5b8b0fb6c673afff7519446a43be0e70e588e76134ab20533416c3301c29046b6aef2d6f4428c1ce8e5bfd2a355c24a522888
|
7
|
+
data.tar.gz: 269ebb1c077e3fef044402c7cac58af93c2d3b73ed1218920350370c882f06973b20891dd569019a156cc92c5e8a8a1508a5db29b1eb04316d1cde5e884a69c7
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -22,7 +22,73 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
25
|
+
First, you can define your shape using `Hashape.shape`, which returns an
|
26
|
+
instance of `Hashape::Shape`.
|
27
|
+
Each key must be given a specifier, which can be one of the following:
|
28
|
+
|
29
|
+
- A type
|
30
|
+
- Simple values (e.g. strings, booleans, numbers)
|
31
|
+
- Another hash
|
32
|
+
- Regular expressions
|
33
|
+
- An instance of any class in `Hashape::Specifiers`
|
34
|
+
|
35
|
+
(Fundamentally, comparisons are done using `===` with your specifier on the left
|
36
|
+
hand side, so anything which supports this will work.)
|
37
|
+
|
38
|
+
You can then check that a given hash matches this shape using either
|
39
|
+
`Shape#matches?`, which returns a boolean, or `Shape#matches!`, which raises an
|
40
|
+
exception if the shape does not match.
|
41
|
+
|
42
|
+
Here's an example of checking that a hash has a `:name` key which is a string,
|
43
|
+
and a `:success` key which must be true:
|
44
|
+
|
45
|
+
```
|
46
|
+
require 'hashape'
|
47
|
+
include Hashape
|
48
|
+
|
49
|
+
shape = Shape.new({
|
50
|
+
name: String,
|
51
|
+
success: true
|
52
|
+
})
|
53
|
+
|
54
|
+
p shape.matches?({
|
55
|
+
name: 'Aaron',
|
56
|
+
success: true
|
57
|
+
}) #=> true
|
58
|
+
|
59
|
+
p shape.matches?({
|
60
|
+
name: 'Aaron',
|
61
|
+
success: false
|
62
|
+
}) #=> false
|
63
|
+
|
64
|
+
shape.matches!({
|
65
|
+
name: 3,
|
66
|
+
success: true
|
67
|
+
}) #=> ShapeMatchError (key name with value 3 does not match spec String)
|
68
|
+
```
|
69
|
+
|
70
|
+
Extra specifiers, which are within the `Hashape::Specifiers` module, give you
|
71
|
+
a bit more flexibility. They wrap another specifier (or an array of them) to
|
72
|
+
alter their behaviour. (Note that you can nest specifiers.) For example:
|
73
|
+
|
74
|
+
```
|
75
|
+
require 'hashape'
|
76
|
+
include Hashape
|
77
|
+
include Hashape::Specifiers
|
78
|
+
|
79
|
+
# Note: for all specifiers, Name[...] is a shortcut for Name.new(...).
|
80
|
+
|
81
|
+
shape = Shape.new({
|
82
|
+
data: Optional[String]
|
83
|
+
})
|
84
|
+
shape.matches?({ data: "Hello!" }) #=> true
|
85
|
+
shape.matches?({ }) #=> true
|
86
|
+
shape.matches?({ data: 3 }) #=> false
|
87
|
+
|
88
|
+
shape = Shape.new({
|
89
|
+
data: OneOf[[String, Integer]]
|
90
|
+
})
|
91
|
+
```
|
26
92
|
|
27
93
|
## License
|
28
94
|
|
data/hashape.gemspec
CHANGED
data/lib/hashape.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
module Hashape
|
5
5
|
##
|
6
6
|
# The library version.
|
7
|
-
VERSION = '
|
7
|
+
VERSION = '2.0.0'
|
8
8
|
|
9
9
|
##
|
10
10
|
# Specifiers which can provide additional typing to shapes.
|
@@ -19,7 +19,7 @@ module Hashape
|
|
19
19
|
# @param [*] spec The type spec for this specifier to match against.
|
20
20
|
# @return [Specifier] A new specifier.
|
21
21
|
def self.[](spec)
|
22
|
-
|
22
|
+
self.new(spec)
|
23
23
|
end
|
24
24
|
|
25
25
|
##
|
@@ -59,6 +59,11 @@ module Hashape
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
##
|
63
|
+
# Raised when Shape#matches! fails.
|
64
|
+
class ShapeMatchError < StandardError
|
65
|
+
end
|
66
|
+
|
62
67
|
##
|
63
68
|
# A template hash representing how a hash should be structured, allowing
|
64
69
|
# other hashes to be validated against it.
|
@@ -80,21 +85,27 @@ module Hashape
|
|
80
85
|
# @return [TrueClass|FalseClass] A boolean indicating whether the subject
|
81
86
|
# hash matches the template hash.
|
82
87
|
def matches?(subject)
|
83
|
-
subject
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
shape[k] === v
|
88
|
-
end
|
89
|
-
end
|
88
|
+
matches!(subject)
|
89
|
+
true
|
90
|
+
rescue ShapeMatchError
|
91
|
+
false
|
90
92
|
end
|
91
93
|
|
92
94
|
##
|
93
95
|
# Calls #matches? and raises a RuntimeError if it does not return true.
|
94
96
|
# @param [Hash] subject The hash to compare the template hash against.
|
95
97
|
def matches!(subject)
|
96
|
-
|
97
|
-
|
98
|
+
shape.each do |k, spec|
|
99
|
+
v = subject[k]
|
100
|
+
if v.is_a?(Hash) && spec.is_a?(Hash)
|
101
|
+
Shape.new(spec).matches!(v)
|
102
|
+
else
|
103
|
+
unless spec === v
|
104
|
+
raise ShapeMatchError,
|
105
|
+
"key #{k} with value #{v} does not match spec #{spec}" \
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
98
109
|
end
|
99
110
|
end
|
100
111
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashape
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Christiansen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.16.1
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.16.1
|
55
69
|
description:
|
56
70
|
email:
|
57
71
|
- aaronc20000@gmail.com
|