summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormo khan <mo.khan@gmail.com>2020-02-02 13:59:08 -0700
committermo khan <mo.khan@gmail.com>2020-02-02 13:59:08 -0700
commitfb1c12a79a15472e710bb019e61ed9c19194f62a (patch)
treeec251efb24067cbf94b5dfa768fb56a81a5c608b
parentc8fd92b56b07090901d1c74862c19cfc1d2df166 (diff)
Separate nuget specific code out of generic index
-rw-r--r--lib/spandx/gateways/nuget.rb38
-rw-r--r--lib/spandx/index.rb37
-rw-r--r--spec/spec_helper.rb5
-rw-r--r--spec/unit/gateways/nuget_spec.rb15
-rw-r--r--spec/unit/index_spec.rb33
5 files changed, 74 insertions, 54 deletions
diff --git a/lib/spandx/gateways/nuget.rb b/lib/spandx/gateways/nuget.rb
index 1ae9458..92bfb51 100644
--- a/lib/spandx/gateways/nuget.rb
+++ b/lib/spandx/gateways/nuget.rb
@@ -15,23 +15,18 @@ module Spandx
@host = 'api.nuget.org'
end
- def each(limit: nil)
+ def update_index(index, limit: nil)
counter = 0
- each_page do |page|
- items_from(page).each do |item|
- yield fetch_json(item['@id'])
+ each do |spec|
+ name = spec['id']
+ version = spec['version']
+ key = [host, name, version]
+ next if index.indexed?(key)
- counter += 1
- break if limit && counter > limit
- end
- break if limit && counter > limit
- end
- end
+ index.write(key, licenses_for(name, version).join(' '))
- def each_page
- url = "https://#{host}/v3/catalog0/index.json"
- items_from(fetch_json(url)).each do |page|
- yield fetch_json(page['@id'])
+ counter += 1
+ break if limit && counter > limit
end
end
@@ -46,6 +41,21 @@ module Spandx
attr_reader :http, :catalogue, :guess
+ def each
+ each_page do |page|
+ items_from(page).each do |item|
+ yield fetch_json(item['@id'])
+ end
+ end
+ end
+
+ def each_page
+ url = "https://#{host}/v3/catalog0/index.json"
+ items_from(fetch_json(url)).each do |page|
+ yield fetch_json(page['@id'])
+ end
+ end
+
def nuspec_url_for(name, version)
"https://#{host}/v3-flatcontainer/#{name}/#{version}/#{name}.nuspec"
end
diff --git a/lib/spandx/index.rb b/lib/spandx/index.rb
index 4dd32e6..82b5db5 100644
--- a/lib/spandx/index.rb
+++ b/lib/spandx/index.rb
@@ -3,42 +3,39 @@
module Spandx
class Index
DEFAULT_DIR = File.expand_path(File.join(Dir.home, '.local', 'share', 'spandx'))
- attr_reader :directory, :http
+ attr_reader :directory
- def initialize(directory: DEFAULT_DIR, http: Spandx.http)
+ def initialize(directory: DEFAULT_DIR)
@directory = directory
- @http = http
end
- def update!(gateway, limit: nil)
- gateway.each(limit: limit) do |spec|
- name = spec['id']
- version = spec['version']
- key = key_for(gateway.host, name, version)
- next if indexed?(key)
+ def indexed?(key)
+ File.exist?(data_file_for(digest_for(key)))
+ end
- data = gateway.licenses_for(name, version).join(' ')
- write(key, data)
+ def read(key)
+ open_data(digest_for(key), mode: 'r') do |file|
+ file.read
end
end
- private
-
def write(key, data)
return if data.nil? || data.empty?
- open_data(key) do |x|
+ open_data(digest_for(key)) do |x|
x.write(data)
end
end
- def key_for(host, name, version)
- Digest::SHA1.hexdigest(File.join(host, name, version))
+ private
+
+ def digest_for(components)
+ Digest::SHA1.hexdigest(Array(components).join('/'))
end
- def open_data(key)
+ def open_data(key, mode: 'w')
FileUtils.mkdir_p(data_dir_for(key))
- File.open(data_file_for(key), 'w') do |file|
+ File.open(data_file_for(key), mode) do |file|
yield file
end
end
@@ -50,9 +47,5 @@ module Spandx
def data_file_for(key)
File.join(data_dir_for(key), 'data')
end
-
- def indexed?(key)
- File.exist?(data_file_for(key))
- end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index dccb16f..76907d7 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -3,9 +3,12 @@
require 'bundler/setup'
require 'spandx'
require 'spandx/cli'
+
require 'rspec-benchmark'
-require 'webmock/rspec'
require 'securerandom'
+require 'tmpdir'
+require 'webmock/rspec'
+
Dir['./spec/support/**/*.rb'].sort.each { |f| require f }
RSpec.configure do |config|
diff --git a/spec/unit/gateways/nuget_spec.rb b/spec/unit/gateways/nuget_spec.rb
index 196b12f..fd0b38d 100644
--- a/spec/unit/gateways/nuget_spec.rb
+++ b/spec/unit/gateways/nuget_spec.rb
@@ -17,4 +17,19 @@ RSpec.describe Spandx::Gateways::Nuget do
pending 'when the package specifies the license using a file'
pending 'when the package specifies the license using a url'
end
+
+ xdescribe '#update_index' do
+ let(:package_key) { Digest::SHA1.hexdigest('api.nuget.org/SpecFlow.Contrib.Variants/1.1.2') }
+ let(:package_data_dir) { File.join(directory, package_key.scan(/../).join('/')) }
+ let(:package_data_file) { File.join(package_data_dir, 'data') }
+ let(:index) { instance_double(Spandx::Index, indexed?: false, write: nil) }
+
+ before do
+ VCR.use_cassette('nuget-catalogue') do
+ subject.update_index(index, limit: 10)
+ end
+ end
+
+ specify { expect(index).to have_received(:write).with(['api.nuget.org', 'SpecFlow.Contrib.Variants', '1.1.2'], 'MIT') }
+ end
end
diff --git a/spec/unit/index_spec.rb b/spec/unit/index_spec.rb
index fda450e..751dadb 100644
--- a/spec/unit/index_spec.rb
+++ b/spec/unit/index_spec.rb
@@ -1,7 +1,5 @@
# frozen_string_literal: true
-require 'tmpdir'
-
RSpec.describe Spandx::Index do
subject { described_class.new(directory: directory) }
@@ -11,24 +9,25 @@ RSpec.describe Spandx::Index do
FileUtils.rm_r(directory, force: true, secure: true)
end
- describe '#update!' do
- let(:nuget) { Spandx::Gateways::Nuget.new(catalogue: catalogue) }
- let(:catalogue) { Spandx::Catalogue.from_file(fixture_file('spdx/json/licenses.json')) }
+ describe "#read" do
+ let(:key) { ['x', 'y', 'z'] }
+ let(:data) { SecureRandom.uuid }
- context 'when building the nuget index' do
- let(:package_key) { Digest::SHA1.hexdigest('api.nuget.org/SpecFlow.Contrib.Variants/1.1.2') }
- let(:package_data_dir) { File.join(directory, package_key.scan(/../).join('/')) }
- let(:package_data_file) { File.join(package_data_dir, 'data') }
+ before do
+ subject.write(key, data)
+ end
- before do
- VCR.use_cassette('nuget-catalogue') do
- subject.update!(nuget, limit: 10)
- end
- end
+ specify { expect(subject.read(key)).to eql(data) }
+ end
- specify { expect(Dir).to exist(package_data_dir) }
- specify { expect(File).to exist(package_data_file) }
- specify { expect(IO.read(package_data_file)).to eql('MIT') }
+ describe "#indexed?" do
+ let(:key) { ['x', 'y', 'z'] }
+ let(:data) { SecureRandom.uuid }
+
+ before do
+ subject.write(key, data)
end
+
+ specify { expect(subject).to be_indexed(key) }
end
end