in_threads 1.5.4 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a13000fc0f561105a6adeeea71266dbf5c612be3db0a9091966b2296e5778f4
4
- data.tar.gz: f8fd0391af01fcf83066904a32fd99e9709e2724d301753e960a0d227b0bc551
3
+ metadata.gz: 9ab96a79a5ad21d6198f4c91e689a37343371ca5932a30d695c91f8f8949a9c5
4
+ data.tar.gz: 91e41ba4f9073cff55f925e40cbc8728893974ec365a440b1f57cafd315ce4be
5
5
  SHA512:
6
- metadata.gz: db4a7b1c67f3a0e53af5e74b43c8620ca90a7ba863415c8d7246feb55f687ac49772d4aa96e43152b64df6b8822e34563186f94233ea9fff8a49002e0d920a29
7
- data.tar.gz: 7a5305b83387426a78f502a71941f476f0af8dd69c1ca16cb95902270898aebf72b5c7f513c52419b398e0fc02f8fec5e65466279f44cec953f3c547a3340259
6
+ metadata.gz: 0c03797c1506c3bc73b1fd8191ba931f21c63c30e56a897bc309815a461eaa2baa368e7daa88a2023113c954c1016666f0b267cfa11b01455d59b3af4d0999f7
7
+ data.tar.gz: 274d7a37b752f0f673eb575a348422999b177cdd56e9519f11dbbee0305bd16b17aceccdfd08f1c2ba12b46c8119a309e1a4cc88f8ff3be6078940dc579f96f0
@@ -0,0 +1,51 @@
1
+ name: check
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: 45 4 * * 3
7
+ jobs:
8
+ check:
9
+ runs-on: ubuntu-latest
10
+ strategy:
11
+ matrix:
12
+ ruby:
13
+ - '2.0'
14
+ - '2.1'
15
+ - '2.2'
16
+ - '2.3'
17
+ - '2.4'
18
+ - '2.5'
19
+ - '2.6'
20
+ - '2.7'
21
+ - '3.0'
22
+ - '3.1'
23
+ - jruby-9.1
24
+ - jruby-9.2
25
+ - jruby-9.3
26
+ include:
27
+ - ruby: ruby-head
28
+ allow-failure: allow-failure
29
+ fail-fast: false
30
+ continue-on-error: ${{ matrix.allow-failure && true || false }}
31
+ timeout-minutes: 5
32
+ steps:
33
+ - uses: actions/checkout@v2
34
+ - uses: ruby/setup-ruby@v1
35
+ with:
36
+ ruby-version: "${{ matrix.ruby }}"
37
+ bundler-cache: true
38
+ - run: bundle exec rspec --format documentation
39
+ legacy:
40
+ runs-on: ubuntu-latest
41
+ container: ${{ matrix.container }}
42
+ strategy:
43
+ matrix:
44
+ container:
45
+ - rspec/ci:1.8.7
46
+ - rspec/ci:1.9.3
47
+ fail-fast: false
48
+ steps:
49
+ - uses: actions/checkout@v2
50
+ - run: bundle install
51
+ - run: bundle exec rspec --format documentation
@@ -0,0 +1,16 @@
1
+ name: rubocop
2
+ on:
3
+ push:
4
+ pull_request:
5
+ schedule:
6
+ - cron: 45 4 * * 3
7
+ jobs:
8
+ rubocop:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v2
12
+ - uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: '3.1'
15
+ bundler-cache: true
16
+ - run: bundle exec rubocop
data/.rubocop.yml CHANGED
@@ -1,6 +1,8 @@
1
1
  AllCops:
2
2
  Exclude:
3
3
  - '*.gemspec'
4
+ - 'vendor/bundle/**/*'
5
+ NewCops: enable
4
6
 
5
7
  Layout/AccessModifierIndentation:
6
8
  EnforcedStyle: outdent
@@ -17,6 +19,9 @@ Layout/EndAlignment:
17
19
  Layout/FirstHashElementIndentation:
18
20
  EnforcedStyle: consistent
19
21
 
22
+ Layout/LineLength:
23
+ Max: 120
24
+
20
25
  Layout/RescueEnsureAlignment:
21
26
  Enabled: false
22
27
 
@@ -52,21 +57,30 @@ Metrics/ClassLength:
52
57
  Metrics/CyclomaticComplexity:
53
58
  Max: 10
54
59
 
55
- Metrics/LineLength:
56
- Max: 120
57
-
58
60
  Metrics/MethodLength:
59
61
  Max: 30
60
62
 
61
63
  Style/DoubleNegation:
62
64
  Enabled: false
63
65
 
66
+ Style/HashEachMethods:
67
+ Enabled: true
68
+
64
69
  Style/HashSyntax:
65
70
  EnforcedStyle: hash_rockets
66
71
 
72
+ Style/HashTransformKeys:
73
+ Enabled: false
74
+
75
+ Style/HashTransformValues:
76
+ Enabled: false
77
+
67
78
  Style/IfUnlessModifier:
68
79
  Enabled: false
69
80
 
81
+ Style/OptionalBooleanParameter:
82
+ Enabled: false
83
+
70
84
  Style/ParallelAssignment:
71
85
  Enabled: false
72
86
 
data/CHANGELOG.markdown CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## unreleased
4
4
 
5
+ ## v1.6.0 (2022-01-18)
6
+
7
+ * Fix return for shortcut `enum.in_threads{ break … }` vs `enum.in_threads.each{ break … }` [@toy](https://github.com/toy)
8
+ * Switch `each_with_object` to run in threads, unlike inject/reduce there is no contradiction, care should be taken if passed object is not thread safe [@toy](https://github.com/toy)
9
+ * Switch `to_h` (ruby >= 2.6) and `to_set` to run in threads, they accept block to apply before creating Hash and Set respectively [@toy](https://github.com/toy)
10
+ * Register `compact` added in 3.1 to run without threads (as it doesn't accept block) [@toy](https://github.com/toy)
11
+
5
12
  ## v1.5.4 (2019-12-26)
6
13
 
7
14
  * Register `filter_map` to run in threads and `tally` to run without threads (as it doesn't accept block) [@toy](https://github.com/toy)
data/Gemfile CHANGED
@@ -5,7 +5,3 @@ source 'https://rubygems.org'
5
5
  gemspec
6
6
 
7
7
  gem 'rspec-retry', '< 0.6.1' if RUBY_VERSION < '1.9'
8
-
9
- if RUBY_VERSION >= '2.0'
10
- gem 'travis_check_rubies', '~> 0.2'
11
- end
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009-2019 Ivan Kuchin
1
+ Copyright (c) 2009-2022 Ivan Kuchin
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.markdown CHANGED
@@ -1,8 +1,8 @@
1
- [![Gem Version](https://img.shields.io/gem/v/in_threads.svg?style=flat)](https://rubygems.org/gems/in_threads)
2
- [![Build Status](https://img.shields.io/travis/toy/in_threads/master.svg?style=flat)](https://travis-ci.org/toy/in_threads)
3
- [![Code Climate](https://img.shields.io/codeclimate/maintainability/toy/in_threads.svg?style=flat)](https://codeclimate.com/github/toy/in_threads)
4
- [![Depfu](https://badges.depfu.com/badges/0579058f30df655f684aff1be244691e/overview.svg)](https://depfu.com/github/toy/in_threads)
5
- [![Inch CI](https://inch-ci.org/github/toy/in_threads.svg?branch=master&style=flat)](https://inch-ci.org/github/toy/in_threads)
1
+ [![Gem Version](https://img.shields.io/gem/v/in_threads?logo=rubygems)](https://rubygems.org/gems/in_threads)
2
+ [![Build Status](https://img.shields.io/github/workflow/status/toy/in_threads/check/master?logo=github)](https://github.com/toy/in_threads/actions/workflows/check.yml)
3
+ [![Code Climate](https://img.shields.io/codeclimate/maintainability/toy/in_threads?logo=codeclimate)](https://codeclimate.com/github/toy/in_threads)
4
+ [![Depfu](https://img.shields.io/depfu/toy/in_threads)](https://depfu.com/github/toy/in_threads)
5
+ [![Inch CI](https://inch-ci.org/github/toy/in_threads.svg?branch=master)](https://inch-ci.org/github/toy/in_threads)
6
6
 
7
7
  # in_threads
8
8
 
@@ -25,13 +25,13 @@ gem 'in_threads'
25
25
  ...and install it with [Bundler](http://bundler.io).
26
26
 
27
27
  ```sh
28
- $ bundle install
28
+ bundle install
29
29
  ```
30
30
 
31
31
  Or install globally:
32
32
 
33
33
  ```sh
34
- $ gem install in_threads
34
+ gem install in_threads
35
35
  ```
36
36
 
37
37
  ## Usage
@@ -90,9 +90,20 @@ urls.in_threads.all? { |url| HTTP.get(url).status == 200 }
90
90
  urls.in_threads.any? { |url| HTTP.get(url).status == 404 }
91
91
  ```
92
92
 
93
- You can call any `Enumerable` method, but some (`#inject`, `#reduce`, `#max`,
94
- `#min`, `#sort`, `#to_a`, and others) cannot run concurrently, and so will
95
- simply act as if `in_threads` wasn't used.
93
+ ### Compatibility
94
+
95
+ All methods of `Enumerable` with a block can be used if block calls are evaluated independently, so following will
96
+
97
+ `all?`, `any?`, `collect_concat`, `collect`, `count`, `cycle`, `detect`, `drop_while`, `each_cons`, `each_entry`,
98
+ `each_slice`, `each_with_index`, `each_with_object`, `each`, `enum_cons`, `enum_slice`, `enum_with_index`,
99
+ `filter_map`, `filter`, `find_all`, `find_index`, `find`, `flat_map`, `group_by`, `map`, `max_by`, `min_by`,
100
+ `minmax_by`, `none?`, `one?`, `partition`, `reject`, `reverse_each`, `select`, `sort_by`, `sum`, `take_while`, `to_h`,
101
+ `to_set`, `uniq`, `zip`.
102
+
103
+ Following either don't accept block (like `first`), depend on previous block evaluation (like `inject`) or return an enumerator (like `chunk`), so will simply act as if `in_threads` wasn't used:
104
+
105
+ `chain`, `chunk_while`, `chunk`, `compact`, `drop`, `entries`, `first`, `include?`, `inject`, `lazy`, `max`, `member?`,
106
+ `minmax`, `min`, `reduce`, `slice_after`, `slice_before`, `slice_when`, `sort`, `take`, `tally`, `to_a`.
96
107
 
97
108
  ### Break and exceptions
98
109
 
@@ -100,8 +111,8 @@ Exceptions are caught and re-thrown after allowing blocks that are still running
100
111
 
101
112
  **IMPORTANT**: only the first encountered exception is propagated, so it is recommended to handle exceptions in the block.
102
113
 
103
- `break` is handled in ruby >= 1.9 and should be handled in jruby [after 9.1.9.0](https://github.com/jruby/jruby/issues/4697). Handling is done in special way: as blocks are run outside of original context, calls to `break` cause `LocalJumpError` which is caught and its result is returned.
114
+ `break` is handled in ruby >= 1.9 and should be handled in jruby [9.1 after 9.1.9.0](https://github.com/jruby/jruby/issues/4697) and [9.2 and 9.3 after #7009](https://github.com/jruby/jruby/issues/7009). Handling is done in special way: as blocks are run outside of original context, calls to `break` cause `LocalJumpError` which is caught and its result is returned.
104
115
 
105
116
  ## Copyright
106
117
 
107
- Copyright (c) 2009-2019 Ivan Kuchin. See LICENSE.txt for details.
118
+ Copyright (c) 2009-2022 Ivan Kuchin. See LICENSE.txt for details.
data/in_threads.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'in_threads'
5
- s.version = '1.5.4'
5
+ s.version = '1.6.0'
6
6
  s.summary = %q{Run all possible enumerable methods in concurrent/parallel threads}
7
7
  s.homepage = "https://github.com/toy/#{s.name}"
8
8
  s.authors = ['Ivan Kuchin']
@@ -22,7 +22,8 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.add_development_dependency 'rspec', '~> 3.0'
24
24
  s.add_development_dependency 'rspec-retry', '~> 0.3'
25
- if RUBY_VERSION >= '2.2'
26
- s.add_development_dependency 'rubocop', '~> 0.59', '!= 0.78.0'
25
+ if RUBY_VERSION >= '2.5'
26
+ s.add_development_dependency 'rubocop', '~> 1.22', '!= 1.22.2'
27
+ s.add_development_dependency 'rubocop-rspec', '~> 2.0'
27
28
  end
28
29
  end
data/lib/in_threads.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'thread'
4
4
  require 'delegate'
5
+ require 'set'
5
6
 
6
7
  Enumerable.class_eval do
7
8
  # Run enumerable method blocks in threads
@@ -33,17 +34,23 @@ class InThreads < SimpleDelegator
33
34
  protected :__getobj__, :__setobj__
34
35
 
35
36
  attr_reader :enumerable, :thread_count
36
- def initialize(enumerable, thread_count = 10, &block)
37
+
38
+ def self.new(enumerable, thread_count = 10, &block)
39
+ if block
40
+ super.each(&block)
41
+ else
42
+ super
43
+ end
44
+ end
45
+
46
+ def initialize(enumerable, thread_count = 10)
37
47
  super(enumerable)
48
+
38
49
  @enumerable, @thread_count = enumerable, thread_count.to_i
39
- unless enumerable.is_a?(Enumerable)
40
- fail ArgumentError, '`enumerable` should include Enumerable.'
41
- end
42
- if thread_count < 2
43
- fail ArgumentError, '`thread_count` can\'t be less than 2.'
44
- end
45
50
 
46
- each(&block) if block
51
+ fail ArgumentError, '`enumerable` should include Enumerable.' unless enumerable.is_a?(Enumerable)
52
+
53
+ fail ArgumentError, '`thread_count` can\'t be less than 2.' if thread_count < 2
47
54
  end
48
55
 
49
56
  # Creates new instance using underlying enumerable and new thread_count
@@ -68,13 +75,13 @@ class InThreads < SimpleDelegator
68
75
  next if ignore_undefined && !enumerable_method?(method)
69
76
 
70
77
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
71
- def #{method}(*args, &block)
72
- if block
73
- #{runner}(:#{method}, *args, &block)
74
- else
75
- enumerable.#{method}(*args)
76
- end
77
- end
78
+ def #{method}(*args, &block) # def foo_bar(*args, &block)
79
+ if block # if block
80
+ #{runner}(:#{method}, *args, &block) # run_in_threads_method(:foo_bar, *args, &block)
81
+ else # else
82
+ enumerable.#{method}(*args) # enumerable.foo_bar(*args)
83
+ end # end
84
+ end # end
78
85
  RUBY
79
86
  end
80
87
  end
@@ -94,6 +101,7 @@ class InThreads < SimpleDelegator
94
101
  zip
95
102
  cycle
96
103
  each_entry
104
+ each_with_object
97
105
  ], :ignore_undefined => true
98
106
  use :run_in_threads_use_block_result, :for => %w[
99
107
  all? any? none? one?
@@ -102,22 +110,37 @@ class InThreads < SimpleDelegator
102
110
  collect map group_by max_by min_by minmax_by sort_by sum uniq
103
111
  flat_map collect_concat
104
112
  filter_map
113
+ to_set
105
114
  ], :ignore_undefined => true
106
115
 
107
- INCOMPATIBLE_METHODS = %w[
116
+ DEPENDENT_BLOCK_CALLS = %w[
108
117
  inject reduce
109
118
  max min minmax sort
110
- entries to_a to_set to_h
119
+ ].map(&:to_sym)
120
+
121
+ ENUMERATOR_RETURNED = %w[
122
+ chunk chunk_while slice_before slice_after slice_when
123
+ ].map(&:to_sym)
124
+
125
+ BLOCKLESS_METHODS = %w[
126
+ entries to_a
111
127
  drop take
112
128
  first
113
129
  include? member?
114
- each_with_object
115
- chunk chunk_while slice_before slice_after slice_when
116
130
  lazy
117
131
  chain
118
132
  tally
133
+ compact
119
134
  ].map(&:to_sym)
120
135
 
136
+ if enumerable_method?(:to_h) && [[0, 0]].to_h{ [1, 1] } == {1 => 1}
137
+ use :run_in_threads_use_block_result, :for => %w[to_h]
138
+ else
139
+ BLOCKLESS_METHODS << :to_h
140
+ end
141
+
142
+ INCOMPATIBLE_METHODS = DEPENDENT_BLOCK_CALLS + ENUMERATOR_RETURNED + BLOCKLESS_METHODS
143
+
121
144
  # Special case method, works by applying `run_in_threads_use_block_result` with
122
145
  # map on enumerable returned by blockless run
123
146
  def grep(*args, &block)
@@ -18,7 +18,12 @@ end
18
18
  # not in jruby in mri < 1.9
19
19
  # https://github.com/jruby/jruby/issues/4697
20
20
  SKIP_IF_BREAK_IN_THREAD_IS_IGNORED = begin
21
- Thread.new{ break }.join
21
+ proc do |&block|
22
+ Thread.new do
23
+ Thread.current.report_on_exception = false if Thread.current.respond_to?(:report_on_exception=)
24
+ block.call
25
+ end.join
26
+ end.call{ break } # rubocop:disable Style/MultilineBlockChain
22
27
  'can not handle break in thread'
23
28
  rescue LocalJumpError
24
29
  false
@@ -142,6 +147,13 @@ describe InThreads do
142
147
  end
143
148
 
144
149
  describe 'exception/break handling' do
150
+ it 'returns identical to each when initialized with block', :skip => SKIP_IF_BREAK_IN_THREAD_IS_IGNORED do
151
+ v = double
152
+ expect(enum.each{ break v }).to eq(v) # rubocop:disable Lint/UnreachableLoop
153
+ expect(enum.in_threads{ break v }).to eq(v)
154
+ expect(enum.in_threads.each{ break v }).to eq(v) # rubocop:disable Lint/UnreachableLoop
155
+ end
156
+
145
157
  %w[each map all?].each do |method|
146
158
  describe "for ##{method}" do
147
159
  it 'passes exception raised in block' do
@@ -153,7 +165,7 @@ describe InThreads do
153
165
  fail 'expected'
154
166
  end
155
167
 
156
- expect{ enum.in_threads.send(method){} }.to raise_error('expected')
168
+ expect{ enum.in_threads.send(method){ nil } }.to raise_error('expected')
157
169
  end
158
170
 
159
171
  it 'handles break', :skip => SKIP_IF_BREAK_IN_THREAD_IS_IGNORED do
@@ -205,15 +217,18 @@ describe InThreads do
205
217
  context 'exception order' do
206
218
  before do
207
219
  stub_const('Order', Queue.new)
220
+ def Order.releasing
221
+ fail 'expected'
222
+ ensure
223
+ push nil
224
+ end
208
225
  end
209
226
 
210
227
  it 'passes exception raised during iteration if it happens earlier than in block' do
211
228
  def enum.each(&block)
212
229
  5.times(&block)
213
- begin
230
+ Order.releasing do
214
231
  fail 'expected'
215
- ensure
216
- Order.push nil
217
232
  end
218
233
  end
219
234
 
@@ -236,10 +251,8 @@ describe InThreads do
236
251
 
237
252
  expect do
238
253
  enum.in_threads(10).send(method) do
239
- begin
254
+ Order.releasing do
240
255
  fail 'expected'
241
- ensure
242
- Order.push nil
243
256
  end
244
257
  end
245
258
  end.to raise_error('expected')
@@ -249,10 +262,8 @@ describe InThreads do
249
262
  expect do
250
263
  enum.in_threads(10).send(method) do |i|
251
264
  if i == 5
252
- begin
265
+ Order.releasing do
253
266
  fail 'expected'
254
- ensure
255
- Order.push nil
256
267
  end
257
268
  else
258
269
  Thread.pass while Order.empty?
@@ -511,8 +522,13 @@ describe InThreads do
511
522
  collect map
512
523
  group_by max_by min_by minmax_by sort_by
513
524
  sum uniq
525
+ to_h to_set
514
526
  ].each do |method|
527
+ next if method == 'to_h' && InThreads::INCOMPATIBLE_METHODS.include?(:to_h)
528
+
515
529
  describe_enum_method method do
530
+ let(:value_proc){ proc{ [rand] * 2 } } if method == 'to_h'
531
+
516
532
  it 'returns same result with threads' do
517
533
  expect(enum.in_threads.send(method, &:compute)).
518
534
  to eq(enum.send(method, &:compute))
@@ -718,6 +734,34 @@ describe InThreads do
718
734
  end
719
735
  end
720
736
  end
737
+
738
+ describe_enum_method :each_with_object do
739
+ let(:block) do
740
+ proc do |o, h|
741
+ v = o.compute
742
+ mutex.synchronize{ h[v] = true }
743
+ end
744
+ end
745
+
746
+ it 'returns same result with threads' do
747
+ expect(enum.in_threads.each_with_object({}, &block)).
748
+ to eq(enum.each_with_object({}, &block))
749
+ end
750
+
751
+ it 'yields same objects' do
752
+ yielded = []
753
+ enum.in_threads.each_with_object({}) do |o, _h|
754
+ mutex.synchronize{ yielded << o }
755
+ o.compute
756
+ end
757
+ expect(yielded).to match_array(items)
758
+ end
759
+
760
+ it 'runs faster with threads', :flaky do
761
+ expect{ enum.in_threads.each_with_object({}, &block) }.
762
+ to be_faster_than{ enum.each_with_object({}, &block) }
763
+ end
764
+ end
721
765
  end
722
766
 
723
767
  context 'unthreaded' do
@@ -776,14 +820,6 @@ describe InThreads do
776
820
  end
777
821
  end
778
822
 
779
- describe_enum_method :each_with_object do
780
- let(:block){ proc{ |o, h| h[o] = true } }
781
-
782
- it 'returns same result' do
783
- expect(enum.in_threads.each_with_object({}, &block)).to eq(enum.each_with_object({}, &block))
784
- end
785
- end
786
-
787
823
  %w[chunk slice_before slice_after].each do |method|
788
824
  describe_enum_method method do
789
825
  it 'returns same result' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: in_threads
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.4
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kuchin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-26 00:00:00.000000000 Z
11
+ date: 2022-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -44,29 +44,44 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.59'
47
+ version: '1.22'
48
48
  - - "!="
49
49
  - !ruby/object:Gem::Version
50
- version: 0.78.0
50
+ version: 1.22.2
51
51
  type: :development
52
52
  prerelease: false
53
53
  version_requirements: !ruby/object:Gem::Requirement
54
54
  requirements:
55
55
  - - "~>"
56
56
  - !ruby/object:Gem::Version
57
- version: '0.59'
57
+ version: '1.22'
58
58
  - - "!="
59
59
  - !ruby/object:Gem::Version
60
- version: 0.78.0
61
- description:
62
- email:
60
+ version: 1.22.2
61
+ - !ruby/object:Gem::Dependency
62
+ name: rubocop-rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ description:
76
+ email:
63
77
  executables: []
64
78
  extensions: []
65
79
  extra_rdoc_files: []
66
80
  files:
81
+ - ".github/workflows/check.yml"
82
+ - ".github/workflows/rubocop.yml"
67
83
  - ".gitignore"
68
84
  - ".rubocop.yml"
69
- - ".travis.yml"
70
85
  - CHANGELOG.markdown
71
86
  - Gemfile
72
87
  - LICENSE.txt
@@ -80,9 +95,9 @@ licenses:
80
95
  metadata:
81
96
  bug_tracker_uri: https://github.com/toy/in_threads/issues
82
97
  changelog_uri: https://github.com/toy/in_threads/blob/master/CHANGELOG.markdown
83
- documentation_uri: https://www.rubydoc.info/gems/in_threads/1.5.4
98
+ documentation_uri: https://www.rubydoc.info/gems/in_threads/1.6.0
84
99
  source_code_uri: https://github.com/toy/in_threads
85
- post_install_message:
100
+ post_install_message:
86
101
  rdoc_options: []
87
102
  require_paths:
88
103
  - lib
@@ -97,8 +112,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
112
  - !ruby/object:Gem::Version
98
113
  version: '0'
99
114
  requirements: []
100
- rubygems_version: 3.1.2
101
- signing_key:
115
+ rubygems_version: 3.3.5
116
+ signing_key:
102
117
  specification_version: 4
103
118
  summary: Run all possible enumerable methods in concurrent/parallel threads
104
119
  test_files:
data/.travis.yml DELETED
@@ -1,33 +0,0 @@
1
- sudo: false
2
- dist: trusty
3
- language: ruby
4
- rvm:
5
- - '1.8.7-p374'
6
- - '1.9.3-p551'
7
- - '2.0.0-p648'
8
- - '2.1.10'
9
- - '2.2.10'
10
- - '2.3.8'
11
- - '2.4.9'
12
- - '2.5.7'
13
- - '2.6.5'
14
- - '2.7.0'
15
- - 'ruby-head'
16
- - 'jruby-9.1.17.0'
17
- - 'jruby-9.2.7.0'
18
- before_install:
19
- - gem install rubygems-update || gem install rubygems-update --version '< 3'
20
- - gem update --system
21
- - gem install bundler || gem install bundler --version '< 2'
22
- script: bundle exec rspec
23
- matrix:
24
- include:
25
- - env: RUBOCOP=✓
26
- rvm: '2.6.5'
27
- script: bundle exec rubocop
28
- - env: CHECK_RUBIES=✓
29
- rvm: '2.6.5'
30
- script: bundle exec travis_check_rubies
31
- allow_failures:
32
- - rvm: 'ruby-head'
33
- - rvm: 'jruby-9.2.7.0'