fear 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +30 -4
  3. data/.travis.yml +2 -3
  4. data/Appraisals +5 -9
  5. data/CHANGELOG.md +9 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE.txt +1 -1
  8. data/README.md +255 -85
  9. data/Rakefile +393 -0
  10. data/fear.gemspec +13 -6
  11. data/gemfiles/dry_equalizer_0.1.0.gemfile +1 -0
  12. data/gemfiles/dry_equalizer_0.1.0.gemfile.lock +31 -27
  13. data/gemfiles/dry_equalizer_0.2.1.gemfile +1 -0
  14. data/gemfiles/dry_equalizer_0.2.1.gemfile.lock +31 -27
  15. data/lib/fear/either.rb +49 -14
  16. data/lib/fear/either_pattern_match.rb +48 -0
  17. data/lib/fear/empty_partial_function.rb +36 -0
  18. data/lib/fear/failure.rb +5 -4
  19. data/lib/fear/failure_pattern_match.rb +8 -0
  20. data/lib/fear/for.rb +46 -51
  21. data/lib/fear/left.rb +7 -1
  22. data/lib/fear/left_pattern_match.rb +9 -0
  23. data/lib/fear/none.rb +37 -2
  24. data/lib/fear/none_pattern_match.rb +12 -0
  25. data/lib/fear/option.rb +65 -31
  26. data/lib/fear/option_pattern_match.rb +45 -0
  27. data/lib/fear/partial_function/and_then.rb +48 -0
  28. data/lib/fear/partial_function/any.rb +26 -0
  29. data/lib/fear/partial_function/combined.rb +51 -0
  30. data/lib/fear/partial_function/empty.rb +6 -0
  31. data/lib/fear/partial_function/guard/and.rb +36 -0
  32. data/lib/fear/partial_function/guard/and3.rb +39 -0
  33. data/lib/fear/partial_function/guard/or.rb +36 -0
  34. data/lib/fear/partial_function/guard.rb +90 -0
  35. data/lib/fear/partial_function/lifted.rb +20 -0
  36. data/lib/fear/partial_function/or_else.rb +62 -0
  37. data/lib/fear/partial_function.rb +171 -0
  38. data/lib/fear/partial_function_class.rb +26 -0
  39. data/lib/fear/pattern_match.rb +102 -0
  40. data/lib/fear/pattern_matching_api.rb +110 -0
  41. data/lib/fear/right.rb +7 -1
  42. data/lib/fear/right_biased.rb +2 -12
  43. data/lib/fear/right_pattern_match.rb +9 -0
  44. data/lib/fear/some.rb +5 -2
  45. data/lib/fear/some_pattern_match.rb +11 -0
  46. data/lib/fear/success.rb +5 -4
  47. data/lib/fear/success_pattern_match.rb +10 -0
  48. data/lib/fear/try.rb +56 -16
  49. data/lib/fear/try_pattern_match.rb +28 -0
  50. data/lib/fear/utils.rb +24 -14
  51. data/lib/fear/version.rb +1 -1
  52. data/lib/fear.rb +21 -4
  53. data/spec/fear/either_pattern_match_spec.rb +37 -0
  54. data/spec/fear/failure_spec.rb +41 -3
  55. data/spec/fear/for_spec.rb +17 -29
  56. data/spec/fear/guard_spec.rb +101 -0
  57. data/spec/fear/left_spec.rb +38 -0
  58. data/spec/fear/none_spec.rb +80 -0
  59. data/spec/fear/option_pattern_match_spec.rb +35 -0
  60. data/spec/fear/partial_function/empty_spec.rb +36 -0
  61. data/spec/fear/partial_function_and_then_spec.rb +145 -0
  62. data/spec/fear/partial_function_composition_spec.rb +80 -0
  63. data/spec/fear/partial_function_or_else_spec.rb +274 -0
  64. data/spec/fear/partial_function_spec.rb +165 -0
  65. data/spec/fear/pattern_match_spec.rb +59 -0
  66. data/spec/fear/right_biased/left.rb +1 -6
  67. data/spec/fear/right_biased/right.rb +0 -5
  68. data/spec/fear/right_spec.rb +38 -0
  69. data/spec/fear/some_spec.rb +37 -0
  70. data/spec/fear/success_spec.rb +41 -4
  71. data/spec/fear/try_pattern_match_spec.rb +37 -0
  72. metadata +97 -23
  73. data/lib/fear/for/evaluation_context.rb +0 -91
data/Rakefile CHANGED
@@ -1 +1,394 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'benchmark/ips'
3
+ require_relative 'lib/fear'
4
+
5
+ namespace :perf do
6
+ namespace :guard do
7
+ task :and1 do
8
+ condition = Integer
9
+
10
+ Benchmark.ips do |x|
11
+ x.report('Guard.new') do |n|
12
+ Fear::PartialFunction::Guard.new(condition) === n
13
+ end
14
+
15
+ x.report('Guard.single') do |n|
16
+ Fear::PartialFunction::Guard.and1(condition) === n
17
+ end
18
+
19
+ x.compare!
20
+ end
21
+ end
22
+
23
+ task :and1 do
24
+ first = Integer
25
+
26
+ and1 = Fear::PartialFunction::Guard.and1(first)
27
+ guard = Fear::PartialFunction::Guard.new(first)
28
+
29
+ Benchmark.ips do |x|
30
+ x.report('guard') do |n|
31
+ and1 === n
32
+ end
33
+
34
+ x.report('single') do |n|
35
+ guard === n
36
+ end
37
+
38
+ x.compare!
39
+ end
40
+ end
41
+
42
+ task :and2 do
43
+ first = Integer
44
+ second = ->(x) { x > 2 }
45
+
46
+ and2 = Fear::PartialFunction::Guard.and2(first, second)
47
+ and_and = Fear::PartialFunction::Guard.new(first).and(Fear::PartialFunction::Guard.new(second))
48
+
49
+ Benchmark.ips do |x|
50
+ x.report('and2') do |n|
51
+ and2 === n
52
+ end
53
+
54
+ x.report('Guard#and') do |n|
55
+ and_and === n
56
+ end
57
+
58
+ x.compare!
59
+ end
60
+ end
61
+
62
+ task :and3 do
63
+ first = Integer
64
+ second = ->(x) { x > 2 }
65
+ third = ->(x) { x < 10 }
66
+
67
+ and3 = Fear::PartialFunction::Guard.and3(first, second, third)
68
+
69
+ and_and_and = Fear::PartialFunction::Guard.new(first)
70
+ .and(Fear::PartialFunction::Guard.new(second))
71
+ .and(Fear::PartialFunction::Guard.new(third))
72
+
73
+ Benchmark.ips do |x|
74
+ x.report('Guard.and3') do |n|
75
+ and3 === n
76
+ end
77
+
78
+ x.report('Guard#and') do |n|
79
+ and_and_and === n
80
+ end
81
+
82
+ x.compare!
83
+ end
84
+ end
85
+ end
86
+
87
+ require 'qo'
88
+ require 'dry/matcher'
89
+
90
+ namespace :pattern_matching do
91
+ task :try do
92
+ module ExhaustivePatternMatch
93
+ def initialize(*)
94
+ super
95
+ @default ||= self.else { raise Fear::MatchError }
96
+ end
97
+ end
98
+
99
+ SuccessBranch = Qo.create_branch(name: 'success', precondition: Fear::Success, extractor: :get)
100
+ FailureBranch = Qo.create_branch(name: 'failure', precondition: Fear::Failure, extractor: :exception)
101
+
102
+ PatternMatch = Qo.create_pattern_match(
103
+ branches: [
104
+ SuccessBranch,
105
+ FailureBranch,
106
+ ],
107
+ ).prepend(ExhaustivePatternMatch)
108
+
109
+ Fear::Success.include(PatternMatch.mixin(as: :qo_match))
110
+
111
+ success_case = Dry::Matcher::Case.new(
112
+ match: lambda { |try, *pattern|
113
+ try.is_a?(Fear::Success) && pattern.all? { |p| p === try.get }
114
+ },
115
+ resolve: ->(try) { try.get },
116
+ )
117
+
118
+ failure_case = Dry::Matcher::Case.new(
119
+ match: lambda { |try, *pattern|
120
+ try.is_a?(Fear::Failure) && pattern.all? { |p| p === try.exception }
121
+ },
122
+ resolve: ->(value) { value.exception },
123
+ )
124
+
125
+ # Build the matcher
126
+ matcher = Dry::Matcher.new(success: success_case, failure: failure_case)
127
+
128
+ success = Fear::Success.new(4)
129
+
130
+ Benchmark.ips do |x|
131
+ x.report('Qo') do
132
+ success.qo_match do |m|
133
+ m.failure { |y| y }
134
+ m.success(->(y) { y % 4 == 0 }) { |y| y }
135
+ m.success { 'else' }
136
+ end
137
+ end
138
+
139
+ x.report('Fear') do
140
+ success.match do |m|
141
+ m.failure { |y| y }
142
+ m.success(->(y) { y % 4 == 0 }) { |y| y }
143
+ m.success { 'else' }
144
+ end
145
+ end
146
+
147
+ x.report('Dr::Matcher') do
148
+ matcher.call(success) do |m|
149
+ m.failure { |_y| 'failure' }
150
+ m.success(->(y) { y % 4 == 0 }) { |y| "2: #{y}" }
151
+ m.success { 'else' }
152
+ end
153
+ end
154
+
155
+ x.compare!
156
+ end
157
+ end
158
+
159
+ task :either do
160
+ module ExhaustivePatternMatch
161
+ def initialize(*)
162
+ super
163
+ @default ||= self.else { raise Fear::MatchError }
164
+ end
165
+ end
166
+
167
+ RightBranch = Qo.create_branch(name: 'right', precondition: Fear::Right, extractor: :right_value)
168
+ LeftBranch = Qo.create_branch(name: 'left', precondition: Fear::Left, extractor: :left_value)
169
+
170
+ PatternMatch = Qo.create_pattern_match(
171
+ branches: [
172
+ RightBranch,
173
+ LeftBranch,
174
+ ],
175
+ ).prepend(ExhaustivePatternMatch)
176
+
177
+ Fear::Right.include(PatternMatch.mixin(as: :qo_match))
178
+
179
+ right = Fear::Right.new(4)
180
+
181
+ Benchmark.ips do |x|
182
+ x.report('Qo') do
183
+ right.qo_match do |m|
184
+ m.left(->(y) { y % 3 == 0 }) { |y| y }
185
+ m.right(->(y) { y % 4 == 0 }) { |y| y }
186
+ m.else { 'else' }
187
+ end
188
+ end
189
+
190
+ x.report('Fear') do
191
+ right.match do |m|
192
+ m.left(->(y) { y % 3 == 0 }) { |y| y }
193
+ m.right(->(y) { y % 4 == 0 }) { |y| y }
194
+ m.else { 'else' }
195
+ end
196
+ end
197
+
198
+ x.compare!
199
+ end
200
+ end
201
+
202
+ task :option do
203
+ module ExhaustivePatternMatch
204
+ def initialize(*)
205
+ super
206
+ @default ||= self.else { raise Fear::MatchError }
207
+ end
208
+ end
209
+
210
+ SomeBranch = Qo.create_branch(name: 'some', precondition: Fear::Some, extractor: :get)
211
+ NoneBranch = Qo.create_branch(name: 'none', precondition: Fear::None)
212
+
213
+ PatternMatch = Qo.create_pattern_match(
214
+ branches: [
215
+ SomeBranch,
216
+ NoneBranch,
217
+ ],
218
+ ).prepend(ExhaustivePatternMatch)
219
+
220
+ Fear::Some.include(PatternMatch.mixin(as: :qo_match))
221
+
222
+ some = Fear::Some.new(4)
223
+
224
+ some_case = Dry::Matcher::Case.new(
225
+ match: lambda { |option, *pattern|
226
+ option.is_a?(Fear::Some) && pattern.all? { |p| p === option.get }
227
+ },
228
+ resolve: ->(try) { try.get },
229
+ )
230
+
231
+ none_case = Dry::Matcher::Case.new(
232
+ match: lambda { |option, *pattern|
233
+ Fear::None == option && pattern.all? { |p| p === option }
234
+ },
235
+ resolve: ->(value) { value },
236
+ )
237
+
238
+ else_case = Dry::Matcher::Case.new(
239
+ match: ->(*) { true },
240
+ resolve: ->(value) { value },
241
+ )
242
+
243
+ # Build the matcher
244
+ matcher = Dry::Matcher.new(some: some_case, none: none_case, else: else_case)
245
+
246
+ option_matcher = Fear::Option.matcher do |m|
247
+ m.some(->(y) { y % 3 == 0 }) { |y| y }
248
+ m.some(->(y) { y % 4 == 0 }) { |y| y }
249
+ m.none { 'none' }
250
+ m.else { 'else' }
251
+ end
252
+
253
+ Benchmark.ips do |x|
254
+ x.report('Qo') do
255
+ some.qo_match do |m|
256
+ m.some(->(y) { y % 3 == 0 }) { |y| y }
257
+ m.some(->(y) { y % 4 == 0 }) { |y| y }
258
+ m.none { 'none' }
259
+ m.else { 'else' }
260
+ end
261
+ end
262
+
263
+ x.report('Fear::Some#math') do
264
+ some.match do |m|
265
+ m.some(->(y) { y % 3 == 0 }) { |y| y }
266
+ m.some(->(y) { y % 4 == 0 }) { |y| y }
267
+ m.none { 'none' }
268
+ m.else { 'else' }
269
+ end
270
+ end
271
+
272
+ x.report('Fear::Option.mather') do
273
+ option_matcher.call(some)
274
+ end
275
+
276
+ x.report('Dry::Matcher') do
277
+ matcher.call(some) do |m|
278
+ m.some(->(y) { y % 3 == 0 }) { |y| y }
279
+ m.some(->(y) { y % 4 == 0 }) { |y| y }
280
+ m.none { 'none' }
281
+ m.else { 'else' }
282
+ end
283
+ end
284
+
285
+ x.compare!
286
+ end
287
+ end
288
+
289
+ task :option_execution do
290
+ module ExhaustivePatternMatch
291
+ def initialize(*)
292
+ super
293
+ @default ||= self.else { raise Fear::MatchError }
294
+ end
295
+ end
296
+
297
+ SomeBranch = Qo.create_branch(name: 'some', precondition: Fear::Some, extractor: :get)
298
+ NoneBranch = Qo.create_branch(name: 'none', precondition: Fear::None)
299
+
300
+ PatternMatch = Qo.create_pattern_match(
301
+ branches: [
302
+ SomeBranch,
303
+ NoneBranch,
304
+ ],
305
+ ).prepend(ExhaustivePatternMatch)
306
+
307
+ some = Fear::Some.new(4)
308
+
309
+ qo_matcher = PatternMatch.new do |m|
310
+ m.some(->(y) { y % 3 == 0 }) { |y| y }
311
+ m.some(->(y) { y % 4 == 0 }) { |y| y }
312
+ m.none { 'none' }
313
+ m.else { 'else' }
314
+ end
315
+
316
+ fear_matcher = Fear::OptionPatternMatch.new do |m|
317
+ m.some(->(y) { y % 3 == 0 }) { |y| y }
318
+ m.some(->(y) { y % 4 == 0 }) { |y| y }
319
+ m.none { 'none' }
320
+ m.else { 'else' }
321
+ end
322
+
323
+ Benchmark.ips do |x|
324
+ x.report('Qo') do
325
+ qo_matcher.call(some)
326
+ end
327
+
328
+ x.report('Fear') do
329
+ fear_matcher.call(some)
330
+ end
331
+
332
+ x.compare!
333
+ end
334
+ end
335
+
336
+ task :factorial do
337
+ factorial_proc = proc do |n|
338
+ if n <= 1
339
+ 1
340
+ else
341
+ n * factorial_proc.call(n - 1)
342
+ end
343
+ end
344
+
345
+ factorial_pm = Fear.matcher do |m|
346
+ m.case(->(n) { n <= 1 }) { 1 }
347
+ m.else { |n| n * factorial_pm.call(n - 1) }
348
+ end
349
+
350
+ factorial_qo = Qo.match do |m|
351
+ m.when(->(n) { n <= 1 }) { 1 }
352
+ m.else { |n| n * factorial_qo.call(n - 1) }
353
+ end
354
+
355
+ Benchmark.ips do |x|
356
+ x.report('Proc') do
357
+ factorial_proc.call(100)
358
+ end
359
+
360
+ x.report('Fear') do
361
+ factorial_pm.call(100)
362
+ end
363
+
364
+ x.report('Qo') do
365
+ factorial_qo.call(100)
366
+ end
367
+
368
+ x.compare!
369
+ end
370
+ end
371
+
372
+ task :construction_vs_execution do
373
+ matcher = Fear::PatternMatch.new do |m|
374
+ m.case(Integer) { |x| x * 2 }
375
+ m.case(String) { |x| x.to_i(10) * 2 }
376
+ end
377
+
378
+ Benchmark.ips do |x|
379
+ x.report('construction') do
380
+ Fear::PatternMatch.new do |m|
381
+ m.case(Integer) { |y| y * 2 }
382
+ m.case(String) { |y| y.to_i(10) * 2 }
383
+ end
384
+ end
385
+
386
+ x.report('execution') do
387
+ matcher.call(42)
388
+ end
389
+
390
+ x.compare!
391
+ end
392
+ end
393
+ end
394
+ end
data/fear.gemspec CHANGED
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
 
4
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
4
 
@@ -19,14 +18,22 @@ Gem::Specification.new do |spec|
19
18
  spec.test_files = spec.files.grep(%r{^spec\/})
20
19
  spec.require_paths = ['lib']
21
20
 
21
+ spec.post_install_message = <<-MSG
22
+ Fear v0.11.0 introduces backwards-incompatible changes.
23
+ Please see https://github.com/bolshakov/fear/blob/master/CHANGELOG.md#0110 for details.
24
+ Successfully installed fear-#{Fear::VERSION}
25
+ MSG
26
+
22
27
  spec.add_runtime_dependency 'dry-equalizer', '<= 0.2.1'
23
28
 
24
29
  spec.add_development_dependency 'appraisal'
30
+ spec.add_development_dependency 'benchmark-ips'
25
31
  spec.add_development_dependency 'bundler'
32
+ spec.add_development_dependency 'dry-matcher'
33
+ spec.add_development_dependency 'qo'
26
34
  spec.add_development_dependency 'rake', '~> 10.0'
27
35
  spec.add_development_dependency 'rspec', '~> 3.1'
28
- spec.add_development_dependency 'rubocop', '0.47.1'
29
- spec.add_development_dependency 'rubocop-rspec', '1.13.0'
30
- spec.add_development_dependency 'simplecov'
31
- spec.add_development_dependency 'spbtv_code_style'
36
+ spec.add_development_dependency 'rubocop', '0.65.0'
37
+ spec.add_development_dependency 'rubocop-rspec', '1.32.0'
38
+ spec.add_development_dependency 'yard'
32
39
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "qo", github: "baweaver/qo"
5
6
  gem "dry-equalizer", "0.1.0"
6
7
 
7
8
  gemspec path: "../"
@@ -1,26 +1,36 @@
1
+ GIT
2
+ remote: git://github.com/baweaver/qo.git
3
+ revision: 8951ce899559118eb60321014b43cf4211730bd0
4
+ specs:
5
+ qo (0.99.0)
6
+ any (= 0.1.0)
7
+
1
8
  PATH
2
9
  remote: ..
3
10
  specs:
4
- fear (0.10.0)
11
+ fear (0.11.0)
5
12
  dry-equalizer (<= 0.2.1)
6
13
 
7
14
  GEM
8
15
  remote: https://rubygems.org/
9
16
  specs:
17
+ any (0.1.0)
10
18
  appraisal (2.2.0)
11
19
  bundler
12
20
  rake
13
21
  thor (>= 0.14.0)
14
22
  ast (2.4.0)
23
+ benchmark-ips (2.7.2)
15
24
  diff-lcs (1.3)
16
- docile (1.3.1)
17
25
  dry-equalizer (0.1.0)
18
- json (2.1.0)
26
+ dry-matcher (0.7.0)
27
+ jaro_winkler (1.5.2)
28
+ parallel (1.14.0)
19
29
  parser (2.6.0.0)
20
30
  ast (~> 2.4.0)
21
31
  powerpack (0.1.2)
22
- rainbow (2.2.2)
23
- rake
32
+ psych (3.1.0)
33
+ rainbow (3.0.0)
24
34
  rake (10.5.0)
25
35
  rspec (3.8.0)
26
36
  rspec-core (~> 3.8.0)
@@ -35,44 +45,38 @@ GEM
35
45
  diff-lcs (>= 1.2.0, < 2.0)
36
46
  rspec-support (~> 3.8.0)
37
47
  rspec-support (3.8.0)
38
- rspec_junit_formatter (0.4.1)
39
- rspec-core (>= 2, < 4, != 2.12.0)
40
- rubocop (0.47.1)
41
- parser (>= 2.3.3.1, < 3.0)
48
+ rubocop (0.65.0)
49
+ jaro_winkler (~> 1.5.1)
50
+ parallel (~> 1.10)
51
+ parser (>= 2.5, != 2.5.1.1)
42
52
  powerpack (~> 0.1)
43
- rainbow (>= 1.99.1, < 3.0)
53
+ psych (>= 3.1.0)
54
+ rainbow (>= 2.2.2, < 4.0)
44
55
  ruby-progressbar (~> 1.7)
45
- unicode-display_width (~> 1.0, >= 1.0.1)
46
- rubocop-checkstyle_formatter (0.4.0)
47
- rubocop (>= 0.35.1)
48
- rubocop-rspec (1.13.0)
49
- rubocop (>= 0.42.0)
56
+ unicode-display_width (~> 1.4.0)
57
+ rubocop-rspec (1.32.0)
58
+ rubocop (>= 0.60.0)
50
59
  ruby-progressbar (1.10.0)
51
- simplecov (0.16.1)
52
- docile (~> 1.1)
53
- json (>= 1.8, < 3)
54
- simplecov-html (~> 0.10.0)
55
- simplecov-html (0.10.2)
56
- spbtv_code_style (1.7.0)
57
- rspec_junit_formatter
58
- rubocop-checkstyle_formatter
59
60
  thor (0.20.3)
60
61
  unicode-display_width (1.4.1)
62
+ yard (0.9.18)
61
63
 
62
64
  PLATFORMS
63
65
  ruby
64
66
 
65
67
  DEPENDENCIES
66
68
  appraisal
69
+ benchmark-ips
67
70
  bundler
68
71
  dry-equalizer (= 0.1.0)
72
+ dry-matcher
69
73
  fear!
74
+ qo!
70
75
  rake (~> 10.0)
71
76
  rspec (~> 3.1)
72
- rubocop (= 0.47.1)
73
- rubocop-rspec (= 1.13.0)
74
- simplecov
75
- spbtv_code_style
77
+ rubocop (= 0.65.0)
78
+ rubocop-rspec (= 1.32.0)
79
+ yard
76
80
 
77
81
  BUNDLED WITH
78
82
  1.16.2
@@ -2,6 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "qo", github: "baweaver/qo"
5
6
  gem "dry-equalizer", "0.2.1"
6
7
 
7
8
  gemspec path: "../"
@@ -1,26 +1,36 @@
1
+ GIT
2
+ remote: git://github.com/baweaver/qo.git
3
+ revision: 8951ce899559118eb60321014b43cf4211730bd0
4
+ specs:
5
+ qo (0.99.0)
6
+ any (= 0.1.0)
7
+
1
8
  PATH
2
9
  remote: ..
3
10
  specs:
4
- fear (0.10.0)
11
+ fear (0.11.0)
5
12
  dry-equalizer (<= 0.2.1)
6
13
 
7
14
  GEM
8
15
  remote: https://rubygems.org/
9
16
  specs:
17
+ any (0.1.0)
10
18
  appraisal (2.2.0)
11
19
  bundler
12
20
  rake
13
21
  thor (>= 0.14.0)
14
22
  ast (2.4.0)
23
+ benchmark-ips (2.7.2)
15
24
  diff-lcs (1.3)
16
- docile (1.3.1)
17
25
  dry-equalizer (0.2.1)
18
- json (2.1.0)
26
+ dry-matcher (0.7.0)
27
+ jaro_winkler (1.5.2)
28
+ parallel (1.14.0)
19
29
  parser (2.6.0.0)
20
30
  ast (~> 2.4.0)
21
31
  powerpack (0.1.2)
22
- rainbow (2.2.2)
23
- rake
32
+ psych (3.1.0)
33
+ rainbow (3.0.0)
24
34
  rake (10.5.0)
25
35
  rspec (3.8.0)
26
36
  rspec-core (~> 3.8.0)
@@ -35,44 +45,38 @@ GEM
35
45
  diff-lcs (>= 1.2.0, < 2.0)
36
46
  rspec-support (~> 3.8.0)
37
47
  rspec-support (3.8.0)
38
- rspec_junit_formatter (0.4.1)
39
- rspec-core (>= 2, < 4, != 2.12.0)
40
- rubocop (0.47.1)
41
- parser (>= 2.3.3.1, < 3.0)
48
+ rubocop (0.65.0)
49
+ jaro_winkler (~> 1.5.1)
50
+ parallel (~> 1.10)
51
+ parser (>= 2.5, != 2.5.1.1)
42
52
  powerpack (~> 0.1)
43
- rainbow (>= 1.99.1, < 3.0)
53
+ psych (>= 3.1.0)
54
+ rainbow (>= 2.2.2, < 4.0)
44
55
  ruby-progressbar (~> 1.7)
45
- unicode-display_width (~> 1.0, >= 1.0.1)
46
- rubocop-checkstyle_formatter (0.4.0)
47
- rubocop (>= 0.35.1)
48
- rubocop-rspec (1.13.0)
49
- rubocop (>= 0.42.0)
56
+ unicode-display_width (~> 1.4.0)
57
+ rubocop-rspec (1.32.0)
58
+ rubocop (>= 0.60.0)
50
59
  ruby-progressbar (1.10.0)
51
- simplecov (0.16.1)
52
- docile (~> 1.1)
53
- json (>= 1.8, < 3)
54
- simplecov-html (~> 0.10.0)
55
- simplecov-html (0.10.2)
56
- spbtv_code_style (1.7.0)
57
- rspec_junit_formatter
58
- rubocop-checkstyle_formatter
59
60
  thor (0.20.3)
60
61
  unicode-display_width (1.4.1)
62
+ yard (0.9.18)
61
63
 
62
64
  PLATFORMS
63
65
  ruby
64
66
 
65
67
  DEPENDENCIES
66
68
  appraisal
69
+ benchmark-ips
67
70
  bundler
68
71
  dry-equalizer (= 0.2.1)
72
+ dry-matcher
69
73
  fear!
74
+ qo!
70
75
  rake (~> 10.0)
71
76
  rspec (~> 3.1)
72
- rubocop (= 0.47.1)
73
- rubocop-rspec (= 1.13.0)
74
- simplecov
75
- spbtv_code_style
77
+ rubocop (= 0.65.0)
78
+ rubocop-rspec (= 1.32.0)
79
+ yard
76
80
 
77
81
  BUNDLED WITH
78
82
  1.16.2