diff --git a/lib/bibliothecary/parsers/conda.rb b/lib/bibliothecary/parsers/conda.rb index c6cce305..4a39dab5 100644 --- a/lib/bibliothecary/parsers/conda.rb +++ b/lib/bibliothecary/parsers/conda.rb @@ -1,67 +1,53 @@ -require 'json' +require "json" module Bibliothecary module Parsers class Conda include Bibliothecary::Analyser - FILE_KINDS = %w[manifest lockfile] def self.mapping { match_filename("environment.yml") => { - kind: FILE_KINDS + parser: :parse_conda, + kind: "manifest", }, match_filename("environment.yaml") => { - kind: FILE_KINDS - } + parser: :parse_conda, + kind: "manifest", + }, + match_filename("environment.yml.lock") => { + parser: :parse_conda_lockfile, + kind: "lockfile", + }, + match_filename("environment.yaml.lock") => { + parser: :parse_conda_lockfile, + kind: "lockfile", + }, } end - # Overrides Analyser.analyse_contents_from_info - def self.analyse_contents_from_info(info) - [parse_conda(info), parse_pip(info)].flatten.compact - rescue Bibliothecary::RemoteParsingError => e - Bibliothecary::Analyser::create_error_analysis(platform_name, info.relative_path, "runtime", e.message) - rescue Psych::SyntaxError => e - Bibliothecary::Analyser::create_error_analysis(platform_name, info.relative_path, "runtime", e.message) - end - - private - def self.parse_conda(info) - results = call_conda_parser_web(info.contents) - FILE_KINDS.map do |kind| - Bibliothecary::Analyser.create_analysis( - "conda", - info.relative_path, - kind, - results[kind.to_sym].map { |dep| dep.slice(:name, :requirement).merge(type: "runtime") } - ) - end + dependencies = call_conda_parser_web(info, :manifest)[:manifest] + dependencies.map { |dep| dep.merge(type: "runtime") } end - def self.parse_pip(info) - dependencies = YAML.safe_load(info.contents)["dependencies"] - pip = dependencies.find { |dep| dep.is_a?(Hash) && dep["pip"]} - return unless pip - - Bibliothecary::Analyser.create_analysis( - "pypi", - info.relative_path, - "manifest", - Pypi.parse_requirements_txt(pip["pip"].join("\n")) - ) + def self.parse_conda_lockfile(info) + dependencies = call_conda_parser_web(info, :lockfile)[:lockfile] + dependencies.map { |dep| dep.merge(type: "runtime") } end - def self.call_conda_parser_web(file_contents) + private_class_method def self.call_conda_parser_web(file_contents, kind) host = Bibliothecary.configuration.conda_parser_host response = Typhoeus.post( "#{host}/parse", headers: { - ContentType: 'multipart/form-data' + ContentType: "multipart/form-data", }, - # hardcoding `environment.yml` to send to `conda.libraries.io`, downside is logs will always show `environment.yml` there - body: {file: file_contents, filename: 'environment.yml'} + body: { + file: file_contents, + # Unfortunately we do not get the filename in the mapping parsers, so hardcoding the file name depending on the kind + filename: kind == "manifest" ? "environment.yml" : "environment.yml.lock", + } ) raise Bibliothecary::RemoteParsingError.new("Http Error #{response.response_code} when contacting: #{host}/parse", response.response_code) unless response.success? diff --git a/spec/parsers/conda_spec.rb b/spec/parsers/conda_spec.rb index 1cea1812..9f3c1800 100644 --- a/spec/parsers/conda_spec.rb +++ b/spec/parsers/conda_spec.rb @@ -1,12 +1,12 @@ -require 'spec_helper' +require "spec_helper" describe Bibliothecary::Parsers::Conda do - it 'has a platform name' do - expect(described_class.platform_name).to eq('conda') + it "has a platform name" do + expect(described_class.platform_name).to eq("conda") end - it 'parses dependencies from environment.yml', :vcr do - expect(described_class.analyse_contents('environment.yml', load_fixture('environment.yml'))).to eq([ + it "parses dependencies from environment.yml", :vcr do + expect(described_class.analyse_contents("environment.yml", load_fixture("environment.yml"))).to eq( { :platform=>"conda", :path=>"environment.yml", @@ -17,116 +17,98 @@ {:name=>"ncurses", :requirement=>"6.1", :type=>"runtime"}, {:name=>"numpy", :requirement=>"1.16.4", :type=>"runtime"}, {:name=>"openssl", :requirement=>"1.1.1c", :type=>"runtime"}, - {:name=>"pip", :requirement=>"19.2.2", :type=>"runtime"}, + {:name=>"pip", :requirement=>"", :type=>"runtime"}, {:name=>"python", :requirement=>"3.7.3", :type=>"runtime"}, {:name=>"readline", :requirement=>"7.0", :type=>"runtime"}, - {:name=>"setuptools", :requirement=>"41.0.1", :type=>"runtime"}, + {:name=>"setuptools", :requirement=>"", :type=>"runtime"}, {:name=>"sqlite", :requirement=>"3.29.0", :type=>"runtime"} ], kind: "manifest", success: true - }, + } + ) + end + + it "parses dependencies from environment.yml.lock", :vcr do + expect(described_class.analyse_contents("environment.yml.lock", load_fixture("environment.yml"))).to eq( { :platform=>"conda", - :path=>"environment.yml", + :path=>"environment.yml.lock", :dependencies=>[ - {:name=>"_libgcc_mutex", :requirement=>"0.1", :type=>"runtime"}, - {:name=>"beautifulsoup4", :requirement=>"4.7.1", :type=>"runtime"}, - {:name=>"biopython", :requirement=>"1.74", :type=>"runtime"}, - {:name=>"blas", :requirement=>"1.0", :type=>"runtime"}, - {:name=>"ca-certificates", :requirement=>"2019.5.15", :type=>"runtime"}, - {:name=>"certifi", :requirement=>"2019.6.16", :type=>"runtime"}, - {:name=>"intel-openmp", :requirement=>"2019.4", :type=>"runtime"}, - {:name=>"libedit", :requirement=>"3.1.20181209", :type=>"runtime"}, - {:name=>"libffi", :requirement=>"3.2.1", :type=>"runtime"}, - {:name=>"libgcc-ng", :requirement=>"9.1.0", :type=>"runtime"}, - {:name=>"libgfortran-ng", :requirement=>"7.3.0", :type=>"runtime"}, - {:name=>"libstdcxx-ng", :requirement=>"9.1.0", :type=>"runtime"}, - {:name=>"mkl", :requirement=>"2019.4", :type=>"runtime"}, - {:name=>"mkl-service", :requirement=>"2.0.2", :type=>"runtime"}, - {:name=>"mkl_fft", :requirement=>"1.0.14", :type=>"runtime"}, - {:name=>"mkl_random", :requirement=>"1.0.2", :type=>"runtime"}, - {:name=>"ncurses", :requirement=>"6.1", :type=>"runtime"}, - {:name=>"numpy", :requirement=>"1.16.4", :type=>"runtime"}, - {:name=>"numpy-base", :requirement=>"1.16.4", :type=>"runtime"}, - {:name=>"openssl", :requirement=>"1.1.1c", :type=>"runtime"}, - {:name=>"pip", :requirement=>"19.2.2", :type=>"runtime"}, - {:name=>"python", :requirement=>"3.7.3", :type=>"runtime"}, - {:name=>"readline", :requirement=>"7.0", :type=>"runtime"}, - {:name=>"setuptools", :requirement=>"41.0.1", :type=>"runtime"}, - {:name=>"six", :requirement=>"1.12.0", :type=>"runtime"}, - {:name=>"soupsieve", :requirement=>"1.9.2", :type=>"runtime"}, - {:name=>"sqlite", :requirement=>"3.29.0", :type=>"runtime"}, - {:name=>"tk", :requirement=>"8.6.8", :type=>"runtime"}, - {:name=>"wheel", :requirement=>"0.33.4", :type=>"runtime"}, - {:name=>"xz", :requirement=>"5.2.4", :type=>"runtime"}, - {:name=>"zlib", :requirement=>"1.2.11", :type=>"runtime"} + {:name=>"_libgcc_mutex", :requirement=>"0.1", :type=>"runtime"}, + {:name=>"beautifulsoup4", :requirement=>"4.7.1", :type=>"runtime"}, + {:name=>"biopython", :requirement=>"1.74", :type=>"runtime"}, + {:name=>"blas", :requirement=>"1.0", :type=>"runtime"}, + {:name=>"ca-certificates", :requirement=>"2019.8.28", :type=>"runtime"}, + {:name=>"certifi", :requirement=>"2019.6.16", :type=>"runtime"}, + {:name=>"intel-openmp", :requirement=>"2019.4", :type=>"runtime"}, + {:name=>"libedit", :requirement=>"3.1.20181209", :type=>"runtime"}, + {:name=>"libffi", :requirement=>"3.2.1", :type=>"runtime"}, + {:name=>"libgcc-ng", :requirement=>"9.1.0", :type=>"runtime"}, + {:name=>"libgfortran-ng", :requirement=>"7.3.0", :type=>"runtime"}, + {:name=>"libstdcxx-ng", :requirement=>"9.1.0", :type=>"runtime"}, + {:name=>"mkl", :requirement=>"2019.4", :type=>"runtime"}, + {:name=>"mkl-service", :requirement=>"2.3.0", :type=>"runtime"}, + {:name=>"mkl_fft", :requirement=>"1.0.14", :type=>"runtime"}, + {:name=>"mkl_random", :requirement=>"1.1.0", :type=>"runtime"}, + {:name=>"ncurses", :requirement=>"6.1", :type=>"runtime"}, + {:name=>"numpy", :requirement=>"1.16.4", :type=>"runtime"}, + {:name=>"numpy-base", :requirement=>"1.16.4", :type=>"runtime"}, + {:name=>"openssl", :requirement=>"1.1.1c", :type=>"runtime"}, + {:name=>"pip", :requirement=>"19.2.3", :type=>"runtime"}, + {:name=>"python", :requirement=>"3.7.3", :type=>"runtime"}, + {:name=>"readline", :requirement=>"7.0", :type=>"runtime"}, + {:name=>"setuptools", :requirement=>"41.2.0", :type=>"runtime"}, + {:name=>"six", :requirement=>"1.12.0", :type=>"runtime"}, + {:name=>"soupsieve", :requirement=>"1.9.3", :type=>"runtime"}, + {:name=>"sqlite", :requirement=>"3.29.0", :type=>"runtime"}, + {:name=>"tk", :requirement=>"8.6.8", :type=>"runtime"}, + {:name=>"wheel", :requirement=>"0.33.6", :type=>"runtime"}, + {:name=>"xz", :requirement=>"5.2.4", :type=>"runtime"}, + {:name=>"zlib", :requirement=>"1.2.11", :type=>"runtime"} ], kind: "lockfile", success: true } - ] ) end - it 'parses dependencies from environment.yml with pip', :vcr do - expect(described_class.analyse_contents('conda_with_pip/environment.yml', load_fixture('conda_with_pip/environment.yml'))).to eq([ - { - :platform=>"conda", - :path=>"conda_with_pip/environment.yml", - :dependencies=>[ - {:name=>"pip", :requirement=>"19.2.2", :type=>"runtime"}, - {:name=>"sqlite", :requirement=>"3.29.0", :type=>"runtime"} - ], - kind: "manifest", - success: true - }, - { - :platform=>"conda", - :path=>"conda_with_pip/environment.yml", - :dependencies=>[ - {:name=>"_libgcc_mutex", :requirement=>"0.1", :type=>"runtime"}, - {:name=>"ca-certificates", :requirement=>"2019.5.15", :type=>"runtime"}, - {:name=>"certifi", :requirement=>"2019.6.16", :type=>"runtime"}, - {:name=>"libedit", :requirement=>"3.1.20181209", :type=>"runtime"}, - {:name=>"libffi", :requirement=>"3.2.1", :type=>"runtime"}, - {:name=>"libgcc-ng", :requirement=>"9.1.0", :type=>"runtime"}, - {:name=>"libstdcxx-ng", :requirement=>"9.1.0", :type=>"runtime"}, - {:name=>"ncurses", :requirement=>"6.1", :type=>"runtime"}, - {:name=>"openssl", :requirement=>"1.1.1c", :type=>"runtime"}, - {:name=>"pip", :requirement=>"19.2.2", :type=>"runtime"}, - {:name=>"python", :requirement=>"3.7.4", :type=>"runtime"}, - {:name=>"readline", :requirement=>"7.0", :type=>"runtime"}, - {:name=>"setuptools", :requirement=>"41.0.1", :type=>"runtime"}, - {:name=>"sqlite", :requirement=>"3.29.0", :type=>"runtime"}, - {:name=>"tk", :requirement=>"8.6.8", :type=>"runtime"}, - {:name=>"wheel", :requirement=>"0.33.4", :type=>"runtime"}, - {:name=>"xz", :requirement=>"5.2.4", :type=>"runtime"}, - {:name=>"zlib", :requirement=>"1.2.11", :type=>"runtime"}, - ], - kind: "lockfile", - success: true - }, - { - :platform=>"pypi", - :path=>"conda_with_pip/environment.yml", - :dependencies=>[ - {:name=>"urllib3", :requirement=>"*", :type=>"runtime"}, - {:name=>"Django", :requirement=>"==2.0.0", :type=>"runtime"}, - - ], - kind: "manifest", - success: true + it "parses dependencies from environment.yml.lock with pip", :vcr do + expect(described_class.analyse_contents("conda_with_pip/environment.yml.lock", load_fixture("conda_with_pip/environment.yml"))).to eq( + { + :platform=>"conda", + :path=>"conda_with_pip/environment.yml.lock", + :dependencies=>[ + {:name=>"_libgcc_mutex", :requirement=>"0.1", :type=>"runtime"}, + {:name=>"ca-certificates", :requirement=>"2019.8.28", :type=>"runtime"}, + {:name=>"certifi", :requirement=>"2019.9.11", :type=>"runtime"}, + {:name=>"libedit", :requirement=>"3.1.20181209", :type=>"runtime"}, + {:name=>"libffi", :requirement=>"3.2.1", :type=>"runtime"}, + {:name=>"libgcc-ng", :requirement=>"9.1.0", :type=>"runtime"}, + {:name=>"libstdcxx-ng", :requirement=>"9.1.0", :type=>"runtime"}, + {:name=>"ncurses", :requirement=>"6.1", :type=>"runtime"}, + {:name=>"openssl", :requirement=>"1.1.1d", :type=>"runtime"}, + {:name=>"pip", :requirement=>"19.2.3", :type=>"runtime"}, + {:name=>"python", :requirement=>"3.7.4", :type=>"runtime"}, + {:name=>"readline", :requirement=>"7.0", :type=>"runtime"}, + {:name=>"setuptools", :requirement=>"41.2.0", :type=>"runtime"}, + {:name=>"sqlite", :requirement=>"3.29.0", :type=>"runtime"}, + {:name=>"tk", :requirement=>"8.6.8", :type=>"runtime"}, + {:name=>"wheel", :requirement=>"0.33.6", :type=>"runtime"}, + {:name=>"xz", :requirement=>"5.2.4", :type=>"runtime"}, + {:name=>"zlib", :requirement=>"1.2.11", :type=>"runtime"} + ], + kind: "lockfile", + success: true } - ] - ) + ) end - it 'matches valid manifest filepaths' do - expect(described_class.match?('environment.yml')).to be_truthy + it "matches valid manifest filepaths" do + expect(described_class.match?("environment.yml")).to be_truthy end it "doesn't match invalid manifest filepaths" do - expect(described_class.match?('test/foo/aenvironment.yml')).to be_falsey + expect(described_class.match?("test/foo/aenvironment.yml")).to be_falsey end -end +end \ No newline at end of file diff --git a/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml.yml b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml.yml index b8d11aec..adfa80d2 100644 --- a/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml.yml +++ b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml.yml @@ -5,7 +5,7 @@ http_interactions: uri: https://conda-parser.libraries.io/parse body: encoding: UTF-8 - string: file=name%3A%20testingenv%0Achannels%3A%0A%20%20-%20defaults%0Adependencies%3A%0A%20%20-%20beautifulsoup4%3D4.7.1%3Dpy37_1%0A%20%20-%20biopython%3D1.74%3Dpy37h7b6447c_0%0A%20%20-%20certifi%3D2019.6.16%3Dpy37_1%0A%20%20-%20ncurses%3D6.1%3Dhe6710b0_1%0A%20%20-%20numpy%3D1.16.4%3Dpy37h7e9f1db_0%0A%20%20-%20openssl%3D1.1.1c%3Dh7b6447c_1%0A%20%20-%20pip%0A%20%20-%20python%3D3.7.3%3Dh0371630_0%0A%20%20-%20readline%3D7.0%3Dh7b6447c_5%0A%20%20-%20setuptools%0A%20%20-%20sqlite%3D3.29.0%3Dh7b6447c_0&filename=environment.yml + string: file=name%3A%20testingenv%0Achannels%3A%0A%20%20-%20defaults%0Adependencies%3A%0A%20%20-%20beautifulsoup4%3D4.7.1%3Dpy37_1%0A%20%20-%20biopython%3D1.74%3Dpy37h7b6447c_0%0A%20%20-%20certifi%3D2019.6.16%3Dpy37_1%0A%20%20-%20ncurses%3D6.1%3Dhe6710b0_1%0A%20%20-%20numpy%3D1.16.4%3Dpy37h7e9f1db_0%0A%20%20-%20openssl%3D1.1.1c%3Dh7b6447c_1%0A%20%20-%20pip%0A%20%20-%20python%3D3.7.3%3Dh0371630_0%0A%20%20-%20readline%3D7.0%3Dh7b6447c_5%0A%20%20-%20setuptools%0A%20%20-%20sqlite%3D3.29.0%3Dh7b6447c_0&filename=environment.yml.lock headers: User-Agent: - Typhoeus - https://github.com/typhoeus/typhoeus @@ -21,20 +21,20 @@ http_interactions: Server: - gunicorn/19.9.0 Date: - - Thu, 22 Aug 2019 15:00:05 GMT + - Tue, 01 Oct 2019 14:57:48 GMT Content-Type: - application/json Content-Length: - - '1824' + - '1827' Via: - 1.1 google Alt-Svc: - clear body: encoding: UTF-8 - string: '{"channels":["defaults"],"lockfile":[{"name":"_libgcc_mutex","requirement":"0.1"},{"name":"beautifulsoup4","requirement":"4.7.1"},{"name":"biopython","requirement":"1.74"},{"name":"blas","requirement":"1.0"},{"name":"ca-certificates","requirement":"2019.5.15"},{"name":"certifi","requirement":"2019.6.16"},{"name":"intel-openmp","requirement":"2019.4"},{"name":"libedit","requirement":"3.1.20181209"},{"name":"libffi","requirement":"3.2.1"},{"name":"libgcc-ng","requirement":"9.1.0"},{"name":"libgfortran-ng","requirement":"7.3.0"},{"name":"libstdcxx-ng","requirement":"9.1.0"},{"name":"mkl","requirement":"2019.4"},{"name":"mkl-service","requirement":"2.0.2"},{"name":"mkl_fft","requirement":"1.0.14"},{"name":"mkl_random","requirement":"1.0.2"},{"name":"ncurses","requirement":"6.1"},{"name":"numpy","requirement":"1.16.4"},{"name":"numpy-base","requirement":"1.16.4"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":"19.2.2"},{"name":"python","requirement":"3.7.3"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":"41.0.1"},{"name":"six","requirement":"1.12.0"},{"name":"soupsieve","requirement":"1.9.2"},{"name":"sqlite","requirement":"3.29.0"},{"name":"tk","requirement":"8.6.8"},{"name":"wheel","requirement":"0.33.4"},{"name":"xz","requirement":"5.2.4"},{"name":"zlib","requirement":"1.2.11"}],"manifest":[{"name":"beautifulsoup4","requirement":"4.7.1"},{"name":"biopython","requirement":"1.74"},{"name":"certifi","requirement":"2019.6.16"},{"name":"ncurses","requirement":"6.1"},{"name":"numpy","requirement":"1.16.4"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":"19.2.2"},{"name":"python","requirement":"3.7.3"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":"41.0.1"},{"name":"sqlite","requirement":"3.29.0"}]} + string: '{"bad_specs":[],"channels":["defaults"],"lockfile":[{"name":"_libgcc_mutex","requirement":"0.1"},{"name":"beautifulsoup4","requirement":"4.7.1"},{"name":"biopython","requirement":"1.74"},{"name":"blas","requirement":"1.0"},{"name":"ca-certificates","requirement":"2019.8.28"},{"name":"certifi","requirement":"2019.6.16"},{"name":"intel-openmp","requirement":"2019.4"},{"name":"libedit","requirement":"3.1.20181209"},{"name":"libffi","requirement":"3.2.1"},{"name":"libgcc-ng","requirement":"9.1.0"},{"name":"libgfortran-ng","requirement":"7.3.0"},{"name":"libstdcxx-ng","requirement":"9.1.0"},{"name":"mkl","requirement":"2019.4"},{"name":"mkl-service","requirement":"2.3.0"},{"name":"mkl_fft","requirement":"1.0.14"},{"name":"mkl_random","requirement":"1.1.0"},{"name":"ncurses","requirement":"6.1"},{"name":"numpy","requirement":"1.16.4"},{"name":"numpy-base","requirement":"1.16.4"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":"19.2.3"},{"name":"python","requirement":"3.7.3"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":"41.2.0"},{"name":"six","requirement":"1.12.0"},{"name":"soupsieve","requirement":"1.9.3"},{"name":"sqlite","requirement":"3.29.0"},{"name":"tk","requirement":"8.6.8"},{"name":"wheel","requirement":"0.33.6"},{"name":"xz","requirement":"5.2.4"},{"name":"zlib","requirement":"1.2.11"}],"manifest":[{"name":"beautifulsoup4","requirement":"4.7.1"},{"name":"biopython","requirement":"1.74"},{"name":"certifi","requirement":"2019.6.16"},{"name":"ncurses","requirement":"6.1"},{"name":"numpy","requirement":"1.16.4"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":""},{"name":"python","requirement":"3.7.3"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":""},{"name":"sqlite","requirement":"3.29.0"}]} ' - http_version: - recorded_at: Thu, 22 Aug 2019 15:00:05 GMT + http_version: + recorded_at: Tue, 01 Oct 2019 14:57:48 GMT recorded_with: VCR 5.0.0 diff --git a/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_lock.yml b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_lock.yml new file mode 100644 index 00000000..a17396dc --- /dev/null +++ b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_lock.yml @@ -0,0 +1,40 @@ +--- +http_interactions: +- request: + method: post + uri: https://conda-parser.libraries.io/parse + body: + encoding: UTF-8 + string: file=name%3A%20testingenv%0Achannels%3A%0A%20%20-%20defaults%0Adependencies%3A%0A%20%20-%20beautifulsoup4%3D4.7.1%3Dpy37_1%0A%20%20-%20biopython%3D1.74%3Dpy37h7b6447c_0%0A%20%20-%20certifi%3D2019.6.16%3Dpy37_1%0A%20%20-%20ncurses%3D6.1%3Dhe6710b0_1%0A%20%20-%20numpy%3D1.16.4%3Dpy37h7e9f1db_0%0A%20%20-%20openssl%3D1.1.1c%3Dh7b6447c_1%0A%20%20-%20pip%0A%20%20-%20python%3D3.7.3%3Dh0371630_0%0A%20%20-%20readline%3D7.0%3Dh7b6447c_5%0A%20%20-%20setuptools%0A%20%20-%20sqlite%3D3.29.0%3Dh7b6447c_0&filename=environment.yml.lock + headers: + User-Agent: + - Typhoeus - https://github.com/typhoeus/typhoeus + Contenttype: + - multipart/form-data + Expect: + - '' + response: + status: + code: 200 + message: OK + headers: + Server: + - gunicorn/19.9.0 + Date: + - Tue, 01 Oct 2019 14:57:49 GMT + Content-Type: + - application/json + Content-Length: + - '1827' + Via: + - 1.1 google + Alt-Svc: + - clear + body: + encoding: UTF-8 + string: '{"bad_specs":[],"channels":["defaults"],"lockfile":[{"name":"_libgcc_mutex","requirement":"0.1"},{"name":"beautifulsoup4","requirement":"4.7.1"},{"name":"biopython","requirement":"1.74"},{"name":"blas","requirement":"1.0"},{"name":"ca-certificates","requirement":"2019.8.28"},{"name":"certifi","requirement":"2019.6.16"},{"name":"intel-openmp","requirement":"2019.4"},{"name":"libedit","requirement":"3.1.20181209"},{"name":"libffi","requirement":"3.2.1"},{"name":"libgcc-ng","requirement":"9.1.0"},{"name":"libgfortran-ng","requirement":"7.3.0"},{"name":"libstdcxx-ng","requirement":"9.1.0"},{"name":"mkl","requirement":"2019.4"},{"name":"mkl-service","requirement":"2.3.0"},{"name":"mkl_fft","requirement":"1.0.14"},{"name":"mkl_random","requirement":"1.1.0"},{"name":"ncurses","requirement":"6.1"},{"name":"numpy","requirement":"1.16.4"},{"name":"numpy-base","requirement":"1.16.4"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":"19.2.3"},{"name":"python","requirement":"3.7.3"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":"41.2.0"},{"name":"six","requirement":"1.12.0"},{"name":"soupsieve","requirement":"1.9.3"},{"name":"sqlite","requirement":"3.29.0"},{"name":"tk","requirement":"8.6.8"},{"name":"wheel","requirement":"0.33.6"},{"name":"xz","requirement":"5.2.4"},{"name":"zlib","requirement":"1.2.11"}],"manifest":[{"name":"beautifulsoup4","requirement":"4.7.1"},{"name":"biopython","requirement":"1.74"},{"name":"certifi","requirement":"2019.6.16"},{"name":"ncurses","requirement":"6.1"},{"name":"numpy","requirement":"1.16.4"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":""},{"name":"python","requirement":"3.7.3"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":""},{"name":"sqlite","requirement":"3.29.0"}]} + + ' + http_version: + recorded_at: Tue, 01 Oct 2019 14:57:49 GMT +recorded_with: VCR 5.0.0 diff --git a/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_lock_with_pip.yml b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_lock_with_pip.yml new file mode 100644 index 00000000..964f29ac --- /dev/null +++ b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_lock_with_pip.yml @@ -0,0 +1,40 @@ +--- +http_interactions: +- request: + method: post + uri: https://conda-parser.libraries.io/parse + body: + encoding: UTF-8 + string: file=name%3A%20testingenv%0Achannels%3A%0A%20%20-%20defaults%0Adependencies%3A%0A%20%20-%20pip%0A%20%20-%20pip%3A%0A%20%20%20%20%20%20-%20urllib3%0A%20%20%20%20%20%20-%20Django%3D%3D2.0.0%0A%20%20-%20sqlite%3D3.29.0%3Dh7b6447c_0%0A&filename=environment.yml.lock + headers: + User-Agent: + - Typhoeus - https://github.com/typhoeus/typhoeus + Contenttype: + - multipart/form-data + Expect: + - '' + response: + status: + code: 200 + message: OK + headers: + Server: + - gunicorn/19.9.0 + Date: + - Tue, 01 Oct 2019 14:57:50 GMT + Content-Type: + - application/json + Content-Length: + - '896' + Via: + - 1.1 google + Alt-Svc: + - clear + body: + encoding: UTF-8 + string: '{"bad_specs":[],"channels":["defaults"],"lockfile":[{"name":"_libgcc_mutex","requirement":"0.1"},{"name":"ca-certificates","requirement":"2019.8.28"},{"name":"certifi","requirement":"2019.9.11"},{"name":"libedit","requirement":"3.1.20181209"},{"name":"libffi","requirement":"3.2.1"},{"name":"libgcc-ng","requirement":"9.1.0"},{"name":"libstdcxx-ng","requirement":"9.1.0"},{"name":"ncurses","requirement":"6.1"},{"name":"openssl","requirement":"1.1.1d"},{"name":"pip","requirement":"19.2.3"},{"name":"python","requirement":"3.7.4"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":"41.2.0"},{"name":"sqlite","requirement":"3.29.0"},{"name":"tk","requirement":"8.6.8"},{"name":"wheel","requirement":"0.33.6"},{"name":"xz","requirement":"5.2.4"},{"name":"zlib","requirement":"1.2.11"}],"manifest":[{"name":"pip","requirement":""},{"name":"sqlite","requirement":"3.29.0"}]} + + ' + http_version: + recorded_at: Tue, 01 Oct 2019 14:57:50 GMT +recorded_with: VCR 5.0.0 diff --git a/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_with_pip.yml b/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_with_pip.yml deleted file mode 100644 index dacd1f45..00000000 --- a/spec/vcr/Bibliothecary_Parsers_Conda/parses_dependencies_from_environment_yml_with_pip.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -http_interactions: -- request: - method: post - uri: https://conda-parser.libraries.io/parse - body: - encoding: UTF-8 - string: file=name%3A%20testingenv%0Achannels%3A%0A%20%20-%20defaults%0Adependencies%3A%0A%20%20-%20pip%0A%20%20-%20sqlite%3D3.29.0%3Dh7b6447c_0%0A%20%20-%20pip%3A%0A%20%20%20%20-%20urllib3&filename=environment.yml - headers: - User-Agent: - - Typhoeus - https://github.com/typhoeus/typhoeus - Contenttype: - - multipart/form-data - Expect: - - '' - response: - status: - code: 200 - message: OK - headers: - Server: - - gunicorn/19.9.0 - Date: - - Tue, 27 Aug 2019 17:55:06 GMT - Content-Type: - - application/json - Content-Length: - - '887' - Via: - - 1.1 google - Alt-Svc: - - clear - body: - encoding: UTF-8 - string: '{"channels":["defaults"],"lockfile":[{"name":"_libgcc_mutex","requirement":"0.1"},{"name":"ca-certificates","requirement":"2019.5.15"},{"name":"certifi","requirement":"2019.6.16"},{"name":"libedit","requirement":"3.1.20181209"},{"name":"libffi","requirement":"3.2.1"},{"name":"libgcc-ng","requirement":"9.1.0"},{"name":"libstdcxx-ng","requirement":"9.1.0"},{"name":"ncurses","requirement":"6.1"},{"name":"openssl","requirement":"1.1.1c"},{"name":"pip","requirement":"19.2.2"},{"name":"python","requirement":"3.7.4"},{"name":"readline","requirement":"7.0"},{"name":"setuptools","requirement":"41.0.1"},{"name":"sqlite","requirement":"3.29.0"},{"name":"tk","requirement":"8.6.8"},{"name":"wheel","requirement":"0.33.4"},{"name":"xz","requirement":"5.2.4"},{"name":"zlib","requirement":"1.2.11"}],"manifest":[{"name":"pip","requirement":"19.2.2"},{"name":"sqlite","requirement":"3.29.0"}]} - - ' - http_version: - recorded_at: Tue, 27 Aug 2019 17:55:06 GMT -recorded_with: VCR 5.0.0