diff options
| author | mo khan <mo.khan@gmail.com> | 2020-02-02 13:59:08 -0700 |
|---|---|---|
| committer | mo khan <mo.khan@gmail.com> | 2020-02-02 13:59:08 -0700 |
| commit | fb1c12a79a15472e710bb019e61ed9c19194f62a (patch) | |
| tree | ec251efb24067cbf94b5dfa768fb56a81a5c608b | |
| parent | c8fd92b56b07090901d1c74862c19cfc1d2df166 (diff) | |
Separate nuget specific code out of generic index
| -rw-r--r-- | lib/spandx/gateways/nuget.rb | 38 | ||||
| -rw-r--r-- | lib/spandx/index.rb | 37 | ||||
| -rw-r--r-- | spec/spec_helper.rb | 5 | ||||
| -rw-r--r-- | spec/unit/gateways/nuget_spec.rb | 15 | ||||
| -rw-r--r-- | spec/unit/index_spec.rb | 33 |
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 |
