speculation 0.1.0 → 0.2.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/.rubocop.yml +13 -0
- data/.travis.yml +2 -4
- data/README.md +22 -12
- data/Rakefile +5 -9
- data/bin/console +54 -7
- data/examples/codebreaker.rb +246 -0
- data/examples/spec_guide.rb +1288 -0
- data/lib/speculation.rb +145 -146
- data/lib/speculation/error.rb +4 -3
- data/lib/speculation/gen.rb +51 -47
- data/lib/speculation/identifier.rb +7 -7
- data/lib/speculation/namespaced_symbols.rb +26 -19
- data/lib/speculation/pmap.rb +9 -10
- data/lib/speculation/spec_impl/and_spec.rb +3 -4
- data/lib/speculation/spec_impl/every_spec.rb +24 -24
- data/lib/speculation/spec_impl/f_spec.rb +32 -35
- data/lib/speculation/spec_impl/hash_spec.rb +33 -41
- data/lib/speculation/spec_impl/merge_spec.rb +2 -3
- data/lib/speculation/spec_impl/nilable_spec.rb +8 -9
- data/lib/speculation/spec_impl/or_spec.rb +5 -7
- data/lib/speculation/spec_impl/regex_spec.rb +2 -3
- data/lib/speculation/spec_impl/spec.rb +3 -5
- data/lib/speculation/spec_impl/tuple_spec.rb +8 -10
- data/lib/speculation/test.rb +126 -101
- data/lib/speculation/utils.rb +31 -5
- data/lib/speculation/version.rb +1 -1
- data/speculation.gemspec +0 -1
- metadata +30 -44
- data/lib/speculation/conj.rb +0 -32
- data/lib/speculation/utils_specs.rb +0 -57
data/lib/speculation/utils.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "set"
|
3
|
-
require "speculation/conj"
|
4
3
|
|
5
4
|
module Speculation
|
6
|
-
using Conj
|
7
|
-
|
8
5
|
# @private
|
9
6
|
module Utils
|
10
7
|
def self.hash?(x)
|
@@ -19,7 +16,7 @@ module Speculation
|
|
19
16
|
xs.respond_to?(:each)
|
20
17
|
end
|
21
18
|
|
22
|
-
def self.
|
19
|
+
def self.itself(x)
|
23
20
|
x
|
24
21
|
end
|
25
22
|
|
@@ -58,7 +55,36 @@ module Speculation
|
|
58
55
|
end
|
59
56
|
|
60
57
|
def self.into(to, from)
|
61
|
-
from.reduce(to) { |memo, obj|
|
58
|
+
from.reduce(to) { |memo, obj| conj(memo, obj) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.count_eq?(coll, count)
|
62
|
+
coll.count == count
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.count_between?(coll, min_count, max_count)
|
66
|
+
coll.count.between?(min_count, max_count)
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.key?(hash, key)
|
70
|
+
hash.key?(key)
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.empty?(coll)
|
74
|
+
coll.empty?
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.conj(a, b)
|
78
|
+
case a
|
79
|
+
when Array, Set
|
80
|
+
a + [b]
|
81
|
+
when Hash
|
82
|
+
case b
|
83
|
+
when Array then a.merge(b[0] => b[1])
|
84
|
+
else a.merge(b)
|
85
|
+
end
|
86
|
+
else raise ArgumentError, "#{a}: must be an Array, Set or Hash"
|
87
|
+
end
|
62
88
|
end
|
63
89
|
end
|
64
90
|
end
|
data/lib/speculation/version.rb
CHANGED
data/speculation.gemspec
CHANGED
@@ -25,7 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_dependency "concurrent-ruby", "~> 1.0"
|
26
26
|
spec.add_dependency "rantly", "~> 1.0"
|
27
27
|
|
28
|
-
spec.add_development_dependency "test-queue", "~> 0.4"
|
29
28
|
spec.add_development_dependency "bundler", "~> 1.13"
|
30
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
31
30
|
spec.add_development_dependency "yard", "~> 0.9"
|
metadata
CHANGED
@@ -1,164 +1,150 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: speculation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie English
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: concurrent-ruby
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - "~>"
|
17
18
|
- !ruby/object:Gem::Version
|
18
19
|
version: '1.0'
|
19
|
-
name: concurrent-ruby
|
20
|
-
prerelease: false
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: rantly
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
31
|
- - "~>"
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '1.0'
|
33
|
-
name: rantly
|
34
|
-
prerelease: false
|
35
34
|
type: :runtime
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1.0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0.4'
|
47
|
-
name: test-queue
|
48
35
|
prerelease: false
|
49
|
-
type: :development
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0
|
40
|
+
version: '1.0'
|
55
41
|
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
56
43
|
requirement: !ruby/object:Gem::Requirement
|
57
44
|
requirements:
|
58
45
|
- - "~>"
|
59
46
|
- !ruby/object:Gem::Version
|
60
47
|
version: '1.13'
|
61
|
-
name: bundler
|
62
|
-
prerelease: false
|
63
48
|
type: :development
|
49
|
+
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
52
|
- - "~>"
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: '1.13'
|
69
55
|
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
70
57
|
requirement: !ruby/object:Gem::Requirement
|
71
58
|
requirements:
|
72
59
|
- - "~>"
|
73
60
|
- !ruby/object:Gem::Version
|
74
61
|
version: '10.0'
|
75
|
-
name: rake
|
76
|
-
prerelease: false
|
77
62
|
type: :development
|
63
|
+
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
66
|
- - "~>"
|
81
67
|
- !ruby/object:Gem::Version
|
82
68
|
version: '10.0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
name: yard
|
84
71
|
requirement: !ruby/object:Gem::Requirement
|
85
72
|
requirements:
|
86
73
|
- - "~>"
|
87
74
|
- !ruby/object:Gem::Version
|
88
75
|
version: '0.9'
|
89
|
-
name: yard
|
90
|
-
prerelease: false
|
91
76
|
type: :development
|
77
|
+
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
80
|
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0.9'
|
97
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
98
85
|
requirement: !ruby/object:Gem::Requirement
|
99
86
|
requirements:
|
100
87
|
- - "~>"
|
101
88
|
- !ruby/object:Gem::Version
|
102
89
|
version: '5.0'
|
103
|
-
name: minitest
|
104
|
-
prerelease: false
|
105
90
|
type: :development
|
91
|
+
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
96
|
version: '5.0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
100
|
requirements:
|
114
101
|
- - "~>"
|
115
102
|
- !ruby/object:Gem::Version
|
116
103
|
version: '0.10'
|
117
|
-
name: pry
|
118
|
-
prerelease: false
|
119
104
|
type: :development
|
105
|
+
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
108
|
- - "~>"
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0.10'
|
125
111
|
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-byebug
|
126
113
|
requirement: !ruby/object:Gem::Requirement
|
127
114
|
requirements:
|
128
115
|
- - "~>"
|
129
116
|
- !ruby/object:Gem::Version
|
130
|
-
version: '
|
131
|
-
name: pry-nav
|
132
|
-
prerelease: false
|
117
|
+
version: '3.4'
|
133
118
|
type: :development
|
119
|
+
prerelease: false
|
134
120
|
version_requirements: !ruby/object:Gem::Requirement
|
135
121
|
requirements:
|
136
122
|
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
124
|
+
version: '3.4'
|
139
125
|
- !ruby/object:Gem::Dependency
|
126
|
+
name: pry-doc
|
140
127
|
requirement: !ruby/object:Gem::Requirement
|
141
128
|
requirements:
|
142
129
|
- - "~>"
|
143
130
|
- !ruby/object:Gem::Version
|
144
131
|
version: '0.9'
|
145
|
-
name: pry-doc
|
146
|
-
prerelease: false
|
147
132
|
type: :development
|
133
|
+
prerelease: false
|
148
134
|
version_requirements: !ruby/object:Gem::Requirement
|
149
135
|
requirements:
|
150
136
|
- - "~>"
|
151
137
|
- !ruby/object:Gem::Version
|
152
138
|
version: '0.9'
|
153
139
|
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
154
141
|
requirement: !ruby/object:Gem::Requirement
|
155
142
|
requirements:
|
156
143
|
- - "~>"
|
157
144
|
- !ruby/object:Gem::Version
|
158
145
|
version: '0.47'
|
159
|
-
name: rubocop
|
160
|
-
prerelease: false
|
161
146
|
type: :development
|
147
|
+
prerelease: false
|
162
148
|
version_requirements: !ruby/object:Gem::Requirement
|
163
149
|
requirements:
|
164
150
|
- - "~>"
|
@@ -196,8 +182,9 @@ files:
|
|
196
182
|
- bin/yard
|
197
183
|
- bin/yardoc
|
198
184
|
- bin/yri
|
185
|
+
- examples/codebreaker.rb
|
186
|
+
- examples/spec_guide.rb
|
199
187
|
- lib/speculation.rb
|
200
|
-
- lib/speculation/conj.rb
|
201
188
|
- lib/speculation/error.rb
|
202
189
|
- lib/speculation/gen.rb
|
203
190
|
- lib/speculation/identifier.rb
|
@@ -216,14 +203,13 @@ files:
|
|
216
203
|
- lib/speculation/spec_impl/tuple_spec.rb
|
217
204
|
- lib/speculation/test.rb
|
218
205
|
- lib/speculation/utils.rb
|
219
|
-
- lib/speculation/utils_specs.rb
|
220
206
|
- lib/speculation/version.rb
|
221
207
|
- speculation.gemspec
|
222
208
|
homepage: https://github.com/english/speculation
|
223
209
|
licenses:
|
224
210
|
- MIT
|
225
211
|
metadata: {}
|
226
|
-
post_install_message:
|
212
|
+
post_install_message:
|
227
213
|
rdoc_options: []
|
228
214
|
require_paths:
|
229
215
|
- lib
|
@@ -238,9 +224,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
224
|
- !ruby/object:Gem::Version
|
239
225
|
version: '0'
|
240
226
|
requirements: []
|
241
|
-
rubyforge_project:
|
227
|
+
rubyforge_project:
|
242
228
|
rubygems_version: 2.6.10
|
243
|
-
signing_key:
|
229
|
+
signing_key:
|
244
230
|
specification_version: 4
|
245
231
|
summary: Ruby port of clojure.spec
|
246
232
|
test_files: []
|
data/lib/speculation/conj.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Speculation
|
4
|
-
# @private
|
5
|
-
module Conj
|
6
|
-
refine Array do
|
7
|
-
def conj(x)
|
8
|
-
self + [x]
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
refine Set do
|
13
|
-
def conj(x)
|
14
|
-
self + Set[x]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
refine Hash do
|
19
|
-
def conj(x)
|
20
|
-
if Utils.array?(x)
|
21
|
-
unless x.count == 2
|
22
|
-
raise ArgumentError, "Array arg to conj must be a pair"
|
23
|
-
end
|
24
|
-
|
25
|
-
merge(x[0] => x[1])
|
26
|
-
else
|
27
|
-
merge(x)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,57 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Speculation
|
4
|
-
# @private
|
5
|
-
module UtilsSpecs
|
6
|
-
using Speculation::NamespacedSymbols.refine(self)
|
7
|
-
|
8
|
-
S = Speculation
|
9
|
-
U = Speculation::Utils
|
10
|
-
|
11
|
-
S.fdef(U.method(:hash?),
|
12
|
-
:args => S.tuple(:any.ns(S)),
|
13
|
-
:ret => :boolean.ns(S))
|
14
|
-
|
15
|
-
S.fdef(U.method(:array?),
|
16
|
-
:args => S.tuple(:any.ns(S)),
|
17
|
-
:ret => :boolean.ns(S))
|
18
|
-
|
19
|
-
S.fdef(U.method(:collection?),
|
20
|
-
:args => S.tuple(:any.ns(S)),
|
21
|
-
:ret => :boolean.ns(S))
|
22
|
-
|
23
|
-
S.fdef(U.method(:identity),
|
24
|
-
:args => S.cat(:x => :any.ns(S)),
|
25
|
-
:ret => :any.ns(S),
|
26
|
-
:fn => ->(x) { x[:args][:x].equal?(x[:ret]) })
|
27
|
-
|
28
|
-
S.fdef(U.method(:complement),
|
29
|
-
:args => :empty.ns(S),
|
30
|
-
:block => S.fspec(:args => S.zero_or_more(:any.ns(S)),
|
31
|
-
:ret => :any.ns(S)),
|
32
|
-
:ret => S.fspec(:args => S.zero_or_more(:any.ns(S)),
|
33
|
-
:ret => :boolean.ns(S)))
|
34
|
-
|
35
|
-
S.fdef(U.method(:constantly),
|
36
|
-
:args => S.cat(:x => :any.ns(S)),
|
37
|
-
:ret => Proc,
|
38
|
-
:fn => ->(x) { x[:args][:x].equal?(x[:ret].call) })
|
39
|
-
|
40
|
-
S.fdef(U.method(:distinct?),
|
41
|
-
:args => S.cat(:coll => Enumerable),
|
42
|
-
:ret => :boolean.ns(S))
|
43
|
-
|
44
|
-
S.fdef(U.method(:ident?),
|
45
|
-
:args => S.cat(:x => :any.ns(S)),
|
46
|
-
:ret => :boolean.ns(S))
|
47
|
-
|
48
|
-
S.fdef(U.method(:method?),
|
49
|
-
:args => S.cat(:x => :any.ns(S)),
|
50
|
-
:ret => :boolean.ns(S))
|
51
|
-
|
52
|
-
S.fdef(U.method(:empty),
|
53
|
-
:args => S.cat(:coll => Enumerable),
|
54
|
-
:ret => S.and(Enumerable, ->(coll) { coll.empty? }),
|
55
|
-
:fn => ->(x) { x[:args][:coll].class == x[:ret].class })
|
56
|
-
end
|
57
|
-
end
|