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