speculation 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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.identity(x)
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| memo.conj(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
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Speculation
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
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.1.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-02-12 00:00:00.000000000 Z
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.4'
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: '0.2'
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: '0.2'
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: []
@@ -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