spandx 0.12.3 → 0.13.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +74 -25
- data/README.md +11 -7
- data/exe/spandx +1 -2
- data/ext/spandx/extconf.rb +5 -0
- data/ext/spandx/spandx.c +55 -0
- data/ext/spandx/spandx.h +6 -0
- data/lib/spandx.rb +6 -3
- data/lib/spandx/cli.rb +2 -0
- data/lib/spandx/cli/commands/build.rb +13 -2
- data/lib/spandx/cli/commands/scan.rb +11 -20
- data/lib/spandx/cli/main.rb +3 -2
- data/lib/spandx/core/cache.rb +38 -51
- data/lib/spandx/core/content.rb +5 -23
- data/lib/spandx/core/data_file.rb +66 -0
- data/lib/spandx/core/dependency.rb +47 -13
- data/lib/spandx/core/git.rb +8 -32
- data/lib/spandx/core/guess.rb +48 -40
- data/lib/spandx/core/http.rb +7 -2
- data/lib/spandx/core/index_file.rb +103 -0
- data/lib/spandx/core/license_plugin.rb +15 -4
- data/lib/spandx/core/parser.rb +10 -3
- data/lib/spandx/core/path_traversal.rb +35 -0
- data/lib/spandx/core/relation.rb +38 -0
- data/lib/spandx/core/report.rb +6 -12
- data/lib/spandx/core/spinner.rb +51 -0
- data/lib/spandx/dotnet/index.rb +21 -79
- data/lib/spandx/dotnet/parsers/csproj.rb +7 -7
- data/lib/spandx/dotnet/parsers/packages_config.rb +7 -7
- data/lib/spandx/dotnet/parsers/sln.rb +10 -13
- data/lib/spandx/dotnet/project_file.rb +3 -3
- data/lib/spandx/java/index.rb +5 -2
- data/lib/spandx/java/parsers/maven.rb +7 -7
- data/lib/spandx/js/parsers/npm.rb +6 -6
- data/lib/spandx/js/parsers/yarn.rb +7 -7
- data/lib/spandx/php/parsers/composer.rb +7 -7
- data/lib/spandx/python/index.rb +4 -33
- data/lib/spandx/python/parsers/pipfile_lock.rb +4 -4
- data/lib/spandx/python/pypi.rb +0 -2
- data/lib/spandx/python/source.rb +12 -0
- data/lib/spandx/ruby/parsers/gemfile_lock.rb +10 -9
- data/lib/spandx/spdx/catalogue.rb +5 -1
- data/lib/spandx/spdx/composite_license.rb +60 -0
- data/lib/spandx/spdx/expression.rb +114 -0
- data/lib/spandx/spdx/license.rb +4 -14
- data/lib/spandx/version.rb +1 -1
- data/spandx.gemspec +16 -10
- metadata +100 -30
- data/lib/spandx/core/null_gateway.rb +0 -11
- data/lib/spandx/core/table.rb +0 -29
- data/lib/spandx/core/thread_pool.rb +0 -38
data/lib/spandx/spdx/license.rb
CHANGED
@@ -61,14 +61,6 @@ module Spandx
|
|
61
61
|
attributes[:referenceNumber] = value
|
62
62
|
end
|
63
63
|
|
64
|
-
def content
|
65
|
-
@content ||= ::Spandx::Core::Content.new(raw_content)
|
66
|
-
end
|
67
|
-
|
68
|
-
def content=(value)
|
69
|
-
@content = ::Spandx::Core::Content.new(value)
|
70
|
-
end
|
71
|
-
|
72
64
|
def <=>(other)
|
73
65
|
id <=> other.id
|
74
66
|
end
|
@@ -77,14 +69,12 @@ module Spandx
|
|
77
69
|
id
|
78
70
|
end
|
79
71
|
|
80
|
-
def
|
81
|
-
|
72
|
+
def inspect
|
73
|
+
"#<Spandx::Spdx::License id='#{id}'>"
|
82
74
|
end
|
83
75
|
|
84
|
-
|
85
|
-
|
86
|
-
def raw_content
|
87
|
-
@raw_content ||= (Spandx.git[:spdx].read("text/#{id}.txt") || '')
|
76
|
+
def self.unknown(text)
|
77
|
+
new(licenseId: 'Nonstandard', name: text)
|
88
78
|
end
|
89
79
|
end
|
90
80
|
end
|
data/lib/spandx/version.rb
CHANGED
data/spandx.gemspec
CHANGED
@@ -7,21 +7,22 @@ require 'spandx/version'
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'spandx'
|
9
9
|
spec.version = Spandx::VERSION
|
10
|
-
spec.authors = ['mo khan']
|
11
|
-
spec.email = ['mo@mokhan.ca']
|
10
|
+
spec.authors = ['Can Eldem', 'mo khan']
|
11
|
+
spec.email = ['eldemcan@gmail.com', 'mo@mokhan.ca']
|
12
12
|
|
13
13
|
spec.summary = 'A ruby interface to the SPDX catalogue.'
|
14
|
-
spec.description = '
|
15
|
-
spec.homepage = 'https://github.
|
14
|
+
spec.description = 'Spanx is a ruby API for interacting with the spdx.org software license catalogue. This gem includes a command line interface to scan a software project for the software licenses that are associated with each dependency in the project. Spandx also allows you to hook additional information for each dependency found. For instance, you can add plugin to Spandx to find and report vulnerabilities for the dependencies it found.'
|
15
|
+
spec.homepage = 'https://spandx.github.io/'
|
16
16
|
spec.license = 'MIT'
|
17
|
-
spec.required_ruby_version = Gem::Requirement.new('>= 2.
|
17
|
+
spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
|
18
18
|
|
19
19
|
spec.metadata['homepage_uri'] = spec.homepage
|
20
|
-
spec.metadata['source_code_uri'] = 'https://github.com/
|
21
|
-
spec.metadata['changelog_uri'] = 'https://github.com/
|
20
|
+
spec.metadata['source_code_uri'] = 'https://github.com/spandx/spandx'
|
21
|
+
spec.metadata['changelog_uri'] = 'https://github.com/spandx/spandx/blob/master/CHANGELOG.md'
|
22
22
|
|
23
23
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
24
24
|
Dir.glob('exe/*') +
|
25
|
+
Dir.glob('ext/**/**/*.{rb,c,h}') +
|
25
26
|
Dir.glob('lib/**/**/*.{rb}') +
|
26
27
|
Dir.glob('*.{md,gemspec,txt}')
|
27
28
|
end
|
@@ -29,25 +30,30 @@ Gem::Specification.new do |spec|
|
|
29
30
|
spec.bindir = 'exe'
|
30
31
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
32
|
spec.require_paths = ['lib']
|
33
|
+
spec.extensions = ['ext/spandx/extconf.rb']
|
32
34
|
|
33
35
|
spec.add_dependency 'addressable', '~> 2.7'
|
34
36
|
spec.add_dependency 'bundler', '>= 1.16', '< 3.0.0'
|
37
|
+
spec.add_dependency 'nanospinner', '~> 1.0.0'
|
35
38
|
spec.add_dependency 'net-hippie', '~> 0.3'
|
36
39
|
spec.add_dependency 'nokogiri', '~> 1.10'
|
40
|
+
spec.add_dependency 'parslet', '~> 2.0'
|
41
|
+
spec.add_dependency 'terminal-table', '~> 1.8'
|
37
42
|
spec.add_dependency 'thor'
|
43
|
+
spec.add_dependency 'tty-screen', '~> 0.7'
|
38
44
|
spec.add_dependency 'zeitwerk', '~> 2.3'
|
39
45
|
|
46
|
+
spec.add_development_dependency 'benchmark-ips', '~> 2.8'
|
40
47
|
spec.add_development_dependency 'bundler-audit', '~> 0.6'
|
41
48
|
spec.add_development_dependency 'byebug', '~> 11.1'
|
42
|
-
spec.add_development_dependency 'jaro_winkler', '~> 1.5'
|
43
49
|
spec.add_development_dependency 'licensed', '~> 2.8'
|
44
|
-
spec.add_development_dependency 'parallel_tests', '~> 2.32'
|
45
50
|
spec.add_development_dependency 'rake', '~> 13.0'
|
51
|
+
spec.add_development_dependency 'rake-compiler', '~> 1.1'
|
46
52
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
47
53
|
spec.add_development_dependency 'rspec-benchmark', '~> 0.5'
|
48
54
|
spec.add_development_dependency 'rubocop', '~> 0.52'
|
49
55
|
spec.add_development_dependency 'rubocop-rspec', '~> 1.22'
|
50
|
-
spec.add_development_dependency '
|
56
|
+
spec.add_development_dependency 'ruby-prof', '~> 1.3'
|
51
57
|
spec.add_development_dependency 'vcr', '~> 5.0'
|
52
58
|
spec.add_development_dependency 'webmock', '~> 3.7'
|
53
59
|
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spandx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.13.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Can Eldem
|
7
8
|
- mo khan
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date: 2020-
|
12
|
+
date: 2020-05-26 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: addressable
|
@@ -44,6 +45,20 @@ dependencies:
|
|
44
45
|
- - "<"
|
45
46
|
- !ruby/object:Gem::Version
|
46
47
|
version: 3.0.0
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: nanospinner
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.0
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.0
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: net-hippie
|
49
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +87,34 @@ dependencies:
|
|
72
87
|
- - "~>"
|
73
88
|
- !ruby/object:Gem::Version
|
74
89
|
version: '1.10'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: parslet
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.0'
|
97
|
+
type: :runtime
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '2.0'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: terminal-table
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.8'
|
111
|
+
type: :runtime
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.8'
|
75
118
|
- !ruby/object:Gem::Dependency
|
76
119
|
name: thor
|
77
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,6 +129,20 @@ dependencies:
|
|
86
129
|
- - ">="
|
87
130
|
- !ruby/object:Gem::Version
|
88
131
|
version: '0'
|
132
|
+
- !ruby/object:Gem::Dependency
|
133
|
+
name: tty-screen
|
134
|
+
requirement: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.7'
|
139
|
+
type: :runtime
|
140
|
+
prerelease: false
|
141
|
+
version_requirements: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.7'
|
89
146
|
- !ruby/object:Gem::Dependency
|
90
147
|
name: zeitwerk
|
91
148
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,47 +158,47 @@ dependencies:
|
|
101
158
|
- !ruby/object:Gem::Version
|
102
159
|
version: '2.3'
|
103
160
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
161
|
+
name: benchmark-ips
|
105
162
|
requirement: !ruby/object:Gem::Requirement
|
106
163
|
requirements:
|
107
164
|
- - "~>"
|
108
165
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
166
|
+
version: '2.8'
|
110
167
|
type: :development
|
111
168
|
prerelease: false
|
112
169
|
version_requirements: !ruby/object:Gem::Requirement
|
113
170
|
requirements:
|
114
171
|
- - "~>"
|
115
172
|
- !ruby/object:Gem::Version
|
116
|
-
version: '
|
173
|
+
version: '2.8'
|
117
174
|
- !ruby/object:Gem::Dependency
|
118
|
-
name:
|
175
|
+
name: bundler-audit
|
119
176
|
requirement: !ruby/object:Gem::Requirement
|
120
177
|
requirements:
|
121
178
|
- - "~>"
|
122
179
|
- !ruby/object:Gem::Version
|
123
|
-
version: '
|
180
|
+
version: '0.6'
|
124
181
|
type: :development
|
125
182
|
prerelease: false
|
126
183
|
version_requirements: !ruby/object:Gem::Requirement
|
127
184
|
requirements:
|
128
185
|
- - "~>"
|
129
186
|
- !ruby/object:Gem::Version
|
130
|
-
version: '
|
187
|
+
version: '0.6'
|
131
188
|
- !ruby/object:Gem::Dependency
|
132
|
-
name:
|
189
|
+
name: byebug
|
133
190
|
requirement: !ruby/object:Gem::Requirement
|
134
191
|
requirements:
|
135
192
|
- - "~>"
|
136
193
|
- !ruby/object:Gem::Version
|
137
|
-
version: '1
|
194
|
+
version: '11.1'
|
138
195
|
type: :development
|
139
196
|
prerelease: false
|
140
197
|
version_requirements: !ruby/object:Gem::Requirement
|
141
198
|
requirements:
|
142
199
|
- - "~>"
|
143
200
|
- !ruby/object:Gem::Version
|
144
|
-
version: '1
|
201
|
+
version: '11.1'
|
145
202
|
- !ruby/object:Gem::Dependency
|
146
203
|
name: licensed
|
147
204
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,33 +214,33 @@ dependencies:
|
|
157
214
|
- !ruby/object:Gem::Version
|
158
215
|
version: '2.8'
|
159
216
|
- !ruby/object:Gem::Dependency
|
160
|
-
name:
|
217
|
+
name: rake
|
161
218
|
requirement: !ruby/object:Gem::Requirement
|
162
219
|
requirements:
|
163
220
|
- - "~>"
|
164
221
|
- !ruby/object:Gem::Version
|
165
|
-
version: '
|
222
|
+
version: '13.0'
|
166
223
|
type: :development
|
167
224
|
prerelease: false
|
168
225
|
version_requirements: !ruby/object:Gem::Requirement
|
169
226
|
requirements:
|
170
227
|
- - "~>"
|
171
228
|
- !ruby/object:Gem::Version
|
172
|
-
version: '
|
229
|
+
version: '13.0'
|
173
230
|
- !ruby/object:Gem::Dependency
|
174
|
-
name: rake
|
231
|
+
name: rake-compiler
|
175
232
|
requirement: !ruby/object:Gem::Requirement
|
176
233
|
requirements:
|
177
234
|
- - "~>"
|
178
235
|
- !ruby/object:Gem::Version
|
179
|
-
version: '
|
236
|
+
version: '1.1'
|
180
237
|
type: :development
|
181
238
|
prerelease: false
|
182
239
|
version_requirements: !ruby/object:Gem::Requirement
|
183
240
|
requirements:
|
184
241
|
- - "~>"
|
185
242
|
- !ruby/object:Gem::Version
|
186
|
-
version: '
|
243
|
+
version: '1.1'
|
187
244
|
- !ruby/object:Gem::Dependency
|
188
245
|
name: rspec
|
189
246
|
requirement: !ruby/object:Gem::Requirement
|
@@ -241,7 +298,7 @@ dependencies:
|
|
241
298
|
- !ruby/object:Gem::Version
|
242
299
|
version: '1.22'
|
243
300
|
- !ruby/object:Gem::Dependency
|
244
|
-
name:
|
301
|
+
name: ruby-prof
|
245
302
|
requirement: !ruby/object:Gem::Requirement
|
246
303
|
requirements:
|
247
304
|
- - "~>"
|
@@ -282,19 +339,28 @@ dependencies:
|
|
282
339
|
- - "~>"
|
283
340
|
- !ruby/object:Gem::Version
|
284
341
|
version: '3.7'
|
285
|
-
description:
|
286
|
-
|
342
|
+
description: Spanx is a ruby API for interacting with the spdx.org software license
|
343
|
+
catalogue. This gem includes a command line interface to scan a software project
|
344
|
+
for the software licenses that are associated with each dependency in the project.
|
345
|
+
Spandx also allows you to hook additional information for each dependency found.
|
346
|
+
For instance, you can add plugin to Spandx to find and report vulnerabilities for
|
347
|
+
the dependencies it found.
|
287
348
|
email:
|
349
|
+
- eldemcan@gmail.com
|
288
350
|
- mo@mokhan.ca
|
289
351
|
executables:
|
290
352
|
- spandx
|
291
|
-
extensions:
|
353
|
+
extensions:
|
354
|
+
- ext/spandx/extconf.rb
|
292
355
|
extra_rdoc_files: []
|
293
356
|
files:
|
294
357
|
- CHANGELOG.md
|
295
358
|
- LICENSE.txt
|
296
359
|
- README.md
|
297
360
|
- exe/spandx
|
361
|
+
- ext/spandx/extconf.rb
|
362
|
+
- ext/spandx/spandx.c
|
363
|
+
- ext/spandx/spandx.h
|
298
364
|
- lib/spandx.rb
|
299
365
|
- lib/spandx/cli.rb
|
300
366
|
- lib/spandx/cli/commands/build.rb
|
@@ -304,20 +370,22 @@ files:
|
|
304
370
|
- lib/spandx/core/cache.rb
|
305
371
|
- lib/spandx/core/circuit.rb
|
306
372
|
- lib/spandx/core/content.rb
|
373
|
+
- lib/spandx/core/data_file.rb
|
307
374
|
- lib/spandx/core/dependency.rb
|
308
375
|
- lib/spandx/core/gateway.rb
|
309
376
|
- lib/spandx/core/git.rb
|
310
377
|
- lib/spandx/core/guess.rb
|
311
378
|
- lib/spandx/core/http.rb
|
379
|
+
- lib/spandx/core/index_file.rb
|
312
380
|
- lib/spandx/core/license_plugin.rb
|
313
|
-
- lib/spandx/core/null_gateway.rb
|
314
381
|
- lib/spandx/core/parser.rb
|
382
|
+
- lib/spandx/core/path_traversal.rb
|
315
383
|
- lib/spandx/core/plugin.rb
|
316
384
|
- lib/spandx/core/registerable.rb
|
385
|
+
- lib/spandx/core/relation.rb
|
317
386
|
- lib/spandx/core/report.rb
|
318
387
|
- lib/spandx/core/score.rb
|
319
|
-
- lib/spandx/core/
|
320
|
-
- lib/spandx/core/thread_pool.rb
|
388
|
+
- lib/spandx/core/spinner.rb
|
321
389
|
- lib/spandx/dotnet/index.rb
|
322
390
|
- lib/spandx/dotnet/nuget_gateway.rb
|
323
391
|
- lib/spandx/dotnet/package_reference.rb
|
@@ -342,17 +410,19 @@ files:
|
|
342
410
|
- lib/spandx/ruby/gateway.rb
|
343
411
|
- lib/spandx/ruby/parsers/gemfile_lock.rb
|
344
412
|
- lib/spandx/spdx/catalogue.rb
|
413
|
+
- lib/spandx/spdx/composite_license.rb
|
414
|
+
- lib/spandx/spdx/expression.rb
|
345
415
|
- lib/spandx/spdx/gateway.rb
|
346
416
|
- lib/spandx/spdx/license.rb
|
347
417
|
- lib/spandx/version.rb
|
348
418
|
- spandx.gemspec
|
349
|
-
homepage: https://github.
|
419
|
+
homepage: https://spandx.github.io/
|
350
420
|
licenses:
|
351
421
|
- MIT
|
352
422
|
metadata:
|
353
|
-
homepage_uri: https://github.
|
354
|
-
source_code_uri: https://github.com/
|
355
|
-
changelog_uri: https://github.com/
|
423
|
+
homepage_uri: https://spandx.github.io/
|
424
|
+
source_code_uri: https://github.com/spandx/spandx
|
425
|
+
changelog_uri: https://github.com/spandx/spandx/blob/master/CHANGELOG.md
|
356
426
|
post_install_message:
|
357
427
|
rdoc_options: []
|
358
428
|
require_paths:
|
@@ -361,14 +431,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
361
431
|
requirements:
|
362
432
|
- - ">="
|
363
433
|
- !ruby/object:Gem::Version
|
364
|
-
version: 2.
|
434
|
+
version: 2.5.0
|
365
435
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
366
436
|
requirements:
|
367
437
|
- - ">="
|
368
438
|
- !ruby/object:Gem::Version
|
369
439
|
version: '0'
|
370
440
|
requirements: []
|
371
|
-
rubygems_version: 3.1.
|
441
|
+
rubygems_version: 3.1.3
|
372
442
|
signing_key:
|
373
443
|
specification_version: 4
|
374
444
|
summary: A ruby interface to the SPDX catalogue.
|
data/lib/spandx/core/table.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Spandx
|
4
|
-
module Core
|
5
|
-
class Table
|
6
|
-
def initialize
|
7
|
-
@rows = []
|
8
|
-
@max_justification = 0
|
9
|
-
yield self
|
10
|
-
end
|
11
|
-
|
12
|
-
def <<(item)
|
13
|
-
row = item.to_a
|
14
|
-
new_max = row[0].size
|
15
|
-
@max_justification = new_max + 1 if new_max > @max_justification
|
16
|
-
@rows << row
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_s
|
20
|
-
@rows.map do |row|
|
21
|
-
row.each.with_index.map do |cell, index|
|
22
|
-
justification = index.zero? ? @max_justification : 15
|
23
|
-
Array(cell).join(', ').ljust(justification, ' ')
|
24
|
-
end.join
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Spandx
|
4
|
-
module Core
|
5
|
-
class ThreadPool
|
6
|
-
def initialize(size: Etc.nprocessors)
|
7
|
-
@size = size
|
8
|
-
@jobs = Queue.new
|
9
|
-
@pool = size.times { start_worker_thread }
|
10
|
-
end
|
11
|
-
|
12
|
-
def schedule(*args, &block)
|
13
|
-
@jobs << [block, args]
|
14
|
-
end
|
15
|
-
|
16
|
-
def shutdown
|
17
|
-
@size.times do
|
18
|
-
schedule { throw :exit }
|
19
|
-
end
|
20
|
-
|
21
|
-
@pool.map(&:join)
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def start_worker_thread
|
27
|
-
Thread.new do
|
28
|
-
catch(:exit) do
|
29
|
-
loop do
|
30
|
-
job, args = @jobs.deq
|
31
|
-
job.call(*args)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|