spandx 0.13.2 → 0.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e89b8200563a7e8d6499790a3cec3673744cb46be6f3eb4a279cb28c311bc9cd
4
- data.tar.gz: 2f33ec62f37e65a69e77872cef146c988f41bf7b9832ddd97cb7454ae2dd0281
3
+ metadata.gz: 4b36f49bab527c52c6d3f6ddf1d70e022422f70c678bf865231921982460a4b4
4
+ data.tar.gz: 5d31efbe54079dd42a07c46f9d47bbe508d712ebed5d7294537685112d170079
5
5
  SHA512:
6
- metadata.gz: dd107af13cc5a9acf8e5f915f01f1be6e687e3322ed3a2bdb499ab03ffed7b287b0424aa1682cd97212fe9206e51ff6a4e4f2773a1ce5d2f434c23a410c8472d
7
- data.tar.gz: f984aed0d5db9ff517fffb491f9be9794419795186fbc9b9e9287529ecd286e0876f7f97588bc31b264c10d02049e56d125bea565e3579cc4c8ce7ff1eae3858
6
+ metadata.gz: abe3e8e231a35f5861b3e85502a7b5c415684ce351756b0d64c77cfcf417bfd099e25587714c9e88b9a3ddb7309154921e0b57b4601bbe9aa74de7f057165773
7
+ data.tar.gz: 757dd76cebbd921d4034a69e794beffac0c9ff00ec846491b4037bf01a687d06aad5a8d258dccb59dc6cce6d94626dbb6df77eae53ccc8755982482a780bf65f
data/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- Version 0.13.2
1
+ Version 0.13.3
2
2
 
3
3
  # Changelog
4
4
 
@@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
+ ## [0.13.3] - 2020-05-19
13
+ ### Fixed
14
+ - Ignore invalid URLs during scan.
15
+
12
16
  ## [0.13.2] - 2020-05-17
13
17
  ### Fixed
14
18
  - Detect licenses when provided as an array.
@@ -177,7 +181,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
177
181
  ### Added
178
182
  - Provide ruby API to the latest SPDX catalogue.
179
183
 
180
- [Unreleased]: https://github.com/spandx/spandx/compare/v0.13.0...HEAD
184
+ [Unreleased]: https://github.com/spandx/spandx/compare/v0.13.3...HEAD
185
+ [0.13.3]: https://github.com/spandx/spandx/compare/v0.13.2...v0.13.3
186
+ [0.13.2]: https://github.com/spandx/spandx/compare/v0.13.1...v0.13.2
187
+ [0.13.1]: https://github.com/spandx/spandx/compare/v0.13.0...v0.13.1
181
188
  [0.13.0]: https://github.com/spandx/spandx/compare/v0.12.3...v0.13.0
182
189
  [0.12.3]: https://github.com/spandx/spandx/compare/v0.12.2...v0.12.3
183
190
  [0.12.2]: https://github.com/spandx/spandx/compare/v0.12.1...v0.12.2
data/lib/spandx/cli.rb CHANGED
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'nanospinner'
3
4
  require 'thor'
4
- require 'tty-progressbar'
5
+ require 'tty-screen'
5
6
 
6
7
  module Spandx
7
8
  module Cli
@@ -4,28 +4,26 @@ module Spandx
4
4
  module Cli
5
5
  module Commands
6
6
  class Scan
7
- NULL_BAR = Class.new do
8
- def advance(*args); end
9
- end.new
10
-
11
- attr_reader :scan_path
7
+ attr_reader :scan_path, :spinner
12
8
 
13
9
  def initialize(scan_path, options)
14
10
  @scan_path = ::Pathname.new(scan_path)
15
11
  @options = options
12
+ @spinner = options[:show_progress] ? ::Spandx::Core::Spinner.new : ::Spandx::Core::Spinner::NULL
16
13
  require(options[:require]) if options[:require]
17
14
  end
18
15
 
19
16
  def execute(output: $stdout)
20
- Spandx::Core::ThreadPool.open do |pool|
21
- report = ::Spandx::Core::Report.new
22
- each_file do |file|
23
- each_dependency_from(file, pool) do |dependency|
24
- report.add(dependency)
25
- end
17
+ report = ::Spandx::Core::Report.new
18
+ each_file do |file|
19
+ spinner.spin(file)
20
+ each_dependency_from(file) do |dependency|
21
+ spinner.spin(file)
22
+ report.add(dependency)
26
23
  end
27
- output.puts(format(report.to(@options[:format])))
28
24
  end
25
+ spinner.stop
26
+ output.puts(format(report.to(@options[:format])))
29
27
  end
30
28
 
31
29
  private
@@ -36,16 +34,12 @@ module Spandx
36
34
  .each { |file| yield file }
37
35
  end
38
36
 
39
- def each_dependency_from(file, pool)
40
- dependencies = ::Spandx::Core::Parser.for(file).parse(file)
41
- with_progress(title_for(file), dependencies.size) do |bar|
42
- ::Spandx::Core::Concurrent
43
- .map(dependencies, pool: pool) { |dependency| enhance(dependency) }
44
- .each do |dependency|
45
- bar.advance(1)
46
- yield dependency
47
- end
48
- end
37
+ def each_dependency_from(file)
38
+ ::Spandx::Core::Parser
39
+ .for(file)
40
+ .parse(file)
41
+ .map { |x| enhance(x) }
42
+ .each { |dependency| yield dependency }
49
43
  end
50
44
 
51
45
  def format(output)
@@ -57,14 +51,6 @@ module Spandx
57
51
  .all
58
52
  .inject(dependency) { |memo, plugin| plugin.enhance(memo) }
59
53
  end
60
-
61
- def title_for(file)
62
- "#{file} [:bar, :elapsed] :percent"
63
- end
64
-
65
- def with_progress(title, total)
66
- yield @options[:show_progress] ? TTY::ProgressBar.new(title, total: total) : NULL_BAR
67
- end
68
54
  end
69
55
  end
70
56
  end
@@ -27,7 +27,7 @@ module Spandx
27
27
  client.get(escape ? Addressable::URI.escape(uri) : uri)
28
28
  end
29
29
  end
30
- rescue *Net::Hippie::CONNECTION_ERRORS
30
+ rescue *Net::Hippie::CONNECTION_ERRORS, URI::InvalidURIError
31
31
  default
32
32
  end
33
33
 
@@ -26,6 +26,8 @@ module Spandx
26
26
  until min >= max
27
27
  mid = mid_for(min, max)
28
28
  row = reader.row(mid)
29
+ return unless row
30
+
29
31
  comparison = yield row
30
32
  return row if comparison.zero?
31
33
 
@@ -26,7 +26,8 @@ module Spandx
26
26
 
27
27
  def cache_for(dependency, git: Spandx.git)
28
28
  git = git[dependency.package_manager.to_sym] || git[:cache]
29
- Spandx::Core::Cache.new(dependency.package_manager, root: "#{git.root}/.index")
29
+ key = key_for(dependency.package_manager)
30
+ Spandx::Core::Cache.new(key, root: "#{git.root}/.index")
30
31
  end
31
32
 
32
33
  def known?(package_manager)
@@ -49,6 +50,10 @@ module Spandx
49
50
  end
50
51
  dependency
51
52
  end
53
+
54
+ def key_for(package_manager)
55
+ package_manager == :yarn ? :npm : package_manager
56
+ end
52
57
  end
53
58
  end
54
59
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spandx
4
+ module Core
5
+ class Spinner
6
+ NULL = Class.new do
7
+ def self.spin(*args); end
8
+
9
+ def self.stop(*args); end
10
+ end
11
+
12
+ attr_reader :columns, :spinner
13
+
14
+ def initialize(columns: TTY::Screen.columns, output: $stderr)
15
+ @columns = columns
16
+ @spinner = Nanospinner.new(output)
17
+ @queue = Queue.new
18
+ @thread = Thread.new { work }
19
+ end
20
+
21
+ def spin(message)
22
+ @queue.enq(justify(message))
23
+ yield if block_given?
24
+ end
25
+
26
+ def stop
27
+ @queue.clear
28
+ @queue.enq(:stop)
29
+ @thread.join
30
+ end
31
+
32
+ private
33
+
34
+ def justify(message)
35
+ message.to_s.ljust(columns - 3)
36
+ end
37
+
38
+ def work
39
+ last_message = justify('')
40
+ loop do
41
+ message = @queue.empty? ? last_message : @queue.deq
42
+ break if message == :stop
43
+
44
+ spinner.spin(message)
45
+ last_message = message
46
+ sleep 0.1
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -28,11 +28,23 @@ module Spandx
28
28
  end
29
29
  end
30
30
 
31
+ def ==(other)
32
+ name == other.name &&
33
+ uri.to_s == other.uri.to_s &&
34
+ verify_ssl == other.verify_ssl
35
+ end
36
+
37
+ def eql(other)
38
+ self == other
39
+ end
40
+
31
41
  class << self
32
42
  def sources_from(json)
33
43
  meta = json['_meta']
34
44
  meta['sources'].map do |hash|
35
45
  new(hash)
46
+ rescue URI::InvalidURIError
47
+ default
36
48
  end
37
49
  end
38
50
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Spandx
4
- VERSION = '0.13.2'
4
+ VERSION = '0.13.3'
5
5
  end
data/spandx.gemspec CHANGED
@@ -34,11 +34,12 @@ Gem::Specification.new do |spec|
34
34
 
35
35
  spec.add_dependency 'addressable', '~> 2.7'
36
36
  spec.add_dependency 'bundler', '>= 1.16', '< 3.0.0'
37
+ spec.add_dependency 'nanospinner', '~> 1.0.0'
37
38
  spec.add_dependency 'net-hippie', '~> 0.3'
38
39
  spec.add_dependency 'nokogiri', '~> 1.10'
39
40
  spec.add_dependency 'parslet', '~> 2.0'
40
41
  spec.add_dependency 'thor'
41
- spec.add_dependency 'tty-progressbar', '~> 0.17'
42
+ spec.add_dependency 'tty-screen', '~> 0.7'
42
43
  spec.add_dependency 'zeitwerk', '~> 2.3'
43
44
 
44
45
  spec.add_development_dependency 'benchmark-ips', '~> 2.8'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spandx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.2
4
+ version: 0.13.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Can Eldem
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2020-05-18 00:00:00.000000000 Z
12
+ date: 2020-05-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -45,6 +45,20 @@ dependencies:
45
45
  - - "<"
46
46
  - !ruby/object:Gem::Version
47
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
48
62
  - !ruby/object:Gem::Dependency
49
63
  name: net-hippie
50
64
  requirement: !ruby/object:Gem::Requirement
@@ -102,19 +116,19 @@ dependencies:
102
116
  - !ruby/object:Gem::Version
103
117
  version: '0'
104
118
  - !ruby/object:Gem::Dependency
105
- name: tty-progressbar
119
+ name: tty-screen
106
120
  requirement: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '0.17'
124
+ version: '0.7'
111
125
  type: :runtime
112
126
  prerelease: false
113
127
  version_requirements: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '0.17'
131
+ version: '0.7'
118
132
  - !ruby/object:Gem::Dependency
119
133
  name: zeitwerk
120
134
  requirement: !ruby/object:Gem::Requirement
@@ -341,7 +355,6 @@ files:
341
355
  - lib/spandx/cli/main.rb
342
356
  - lib/spandx/core/cache.rb
343
357
  - lib/spandx/core/circuit.rb
344
- - lib/spandx/core/concurrent.rb
345
358
  - lib/spandx/core/content.rb
346
359
  - lib/spandx/core/data_file.rb
347
360
  - lib/spandx/core/dependency.rb
@@ -351,7 +364,6 @@ files:
351
364
  - lib/spandx/core/http.rb
352
365
  - lib/spandx/core/index_file.rb
353
366
  - lib/spandx/core/license_plugin.rb
354
- - lib/spandx/core/line_io.rb
355
367
  - lib/spandx/core/parser.rb
356
368
  - lib/spandx/core/path_traversal.rb
357
369
  - lib/spandx/core/plugin.rb
@@ -359,8 +371,8 @@ files:
359
371
  - lib/spandx/core/relation.rb
360
372
  - lib/spandx/core/report.rb
361
373
  - lib/spandx/core/score.rb
374
+ - lib/spandx/core/spinner.rb
362
375
  - lib/spandx/core/table.rb
363
- - lib/spandx/core/thread_pool.rb
364
376
  - lib/spandx/dotnet/index.rb
365
377
  - lib/spandx/dotnet/nuget_gateway.rb
366
378
  - lib/spandx/dotnet/package_reference.rb
@@ -413,7 +425,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
413
425
  - !ruby/object:Gem::Version
414
426
  version: '0'
415
427
  requirements: []
416
- rubygems_version: 3.1.2
428
+ rubygems_version: 3.1.3
417
429
  signing_key:
418
430
  specification_version: 4
419
431
  summary: A ruby interface to the SPDX catalogue.
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spandx
4
- module Core
5
- class Concurrent
6
- include Enumerable
7
-
8
- def self.map(items, pool:, &block)
9
- queue = Queue.new
10
-
11
- items.each do |item|
12
- pool.schedule([item, block]) do |marshalled_item, callable|
13
- queue.enq(callable.call(marshalled_item))
14
- end
15
- end
16
-
17
- new(queue, items.size)
18
- end
19
-
20
- attr_reader :queue, :size
21
-
22
- def initialize(queue, size)
23
- @queue = queue
24
- @size = size
25
- end
26
-
27
- def each
28
- size.times { yield queue.deq }
29
- end
30
-
31
- def to_enum
32
- Enumerator.new do |yielder|
33
- each do |item|
34
- yielder.yield item
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spandx
4
- module Core
5
- class LineIo
6
- def initialize(absolute_path)
7
- file_descriptor = IO.sysopen(absolute_path)
8
- @io = IO.new(file_descriptor)
9
- @buffer = ''
10
- end
11
-
12
- def each(&block)
13
- @buffer << @io.sysread(512) until @buffer.include?($INPUT_RECORD_SEPARATOR)
14
-
15
- line, @buffer = @buffer.split($INPUT_RECORD_SEPARATOR, 2)
16
- block.call(line)
17
- each(&block)
18
- rescue EOFError
19
- @io.close
20
- end
21
- end
22
- end
23
- end
@@ -1,49 +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
- @queue = Queue.new
9
- @pool = size.times.map { start_worker_thread }
10
- end
11
-
12
- def schedule(*args, &block)
13
- @queue.enq([block, args])
14
- end
15
-
16
- def done?
17
- @queue.empty?
18
- end
19
-
20
- def shutdown
21
- @size.times do
22
- schedule { throw :exit }
23
- end
24
-
25
- @pool.map(&:join)
26
- end
27
-
28
- def self.open
29
- pool = new
30
- yield pool
31
- ensure
32
- pool.shutdown
33
- end
34
-
35
- private
36
-
37
- def start_worker_thread
38
- Thread.new do
39
- catch(:exit) do
40
- loop do
41
- job, args = @queue.deq
42
- job.call(*args)
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end