Sha256: 1f64ec7c811493bc7880d1368baa80efd1cd8711fb6c3fcfb4255df76f7e5e38

Contents?: true

Size: 1.99 KB

Versions: 5

Compression:

Stored size: 1.99 KB

Contents

require "json"

module Bibliothecary
  module Parsers
    class Conda
      include Bibliothecary::Analyser

      def self.mapping
        {
          match_filename("environment.yml") => {
            parser: :parse_conda,
            kind: "manifest",
          },
          match_filename("environment.yaml") => {
            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

      add_multi_parser(Bibliothecary::MultiParsers::CycloneDX)

      def self.parse_conda(file_contents, options: {})
        parse_conda_with_kind(file_contents, "manifest")
      end

      def self.parse_conda_lockfile(file_contents, options: {})
        parse_conda_with_kind(file_contents, "lockfile")
      end

      def self.parse_conda_with_kind(info, kind)
        dependencies = call_conda_parser_web(info, kind)[kind.to_sym]
        dependencies.map { |dep| dep.merge(type: "runtime") }
      end

      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",
          },
          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?

        JSON.parse(response.body, symbolize_names: true)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
bibliothecary-8.2.1 lib/bibliothecary/parsers/conda.rb
bibliothecary-8.2.0 lib/bibliothecary/parsers/conda.rb
bibliothecary-8.1.1 lib/bibliothecary/parsers/conda.rb
bibliothecary-8.1.0 lib/bibliothecary/parsers/conda.rb
bibliothecary-8.0.0 lib/bibliothecary/parsers/conda.rb