Sha256: 579b7baa621e98ded5ca6c1ace4b0811fc1720e4b64a1d892ea5f3e70f527dfc

Contents?: true

Size: 1.87 KB

Versions: 46

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true

module LicenseFinder
  class ConanInfoParser
    def parse(info)
      @lines = info.lines.map(&:chomp)
      @state = :project_level # state of the state machine
      @projects = [] # list of projects
      @current_project = nil # current project being populated in the SM
      @current_vals = [] # current val list being populate in the SM
      @current_key = nil # current key to be associated with the current val
      while (line = @lines.shift)
        next if line == ''

        case @state
        when :project_level
          @current_project = {}
          @current_project['name'] = line.strip
          @state = :key_val
        when :key_val
          parse_key_val(line)
        when :val_list
          parse_val_list(line)
        end
      end
      wrap_up
    end

    private

    def parse_key_val(line)
      key, val = key_val(line)
      if val
        @current_project[key] = val
      elsif line.start_with?(' ')
        @current_key = key
        @current_vals = []
        @state = :val_list
      else
        change_to_new_project_state line
      end
    end

    def parse_val_list(line)
      if val_list_level(line)
        @current_vals << line.strip
      else
        @current_project[@current_key] = @current_vals
        if line.start_with?(' ')
          @state = :key_val
          @lines.unshift(line)
        else
          change_to_new_project_state line
        end
      end
    end

    def wrap_up
      @current_project[@current_key] = @current_vals if @current_vals.count && @current_key
      @projects << @current_project
    end

    def val_list_level(line)
      line.start_with?('        ')
    end

    def change_to_new_project_state(line)
      @state = :project_level
      @projects << @current_project
      @lines.unshift(line)
    end

    def key_val(info)
      info.split(':', 2).map(&:strip!)
    end
  end
end

Version data entries

46 entries across 46 versions & 2 rubygems

Version Path
license_finder-7.1.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-7.0.1 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-7.0.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.15.0 lib/license_finder/package_utils/conan_info_parser.rb
gitlab-license_finder-6.14.2.1 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.14.2 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.14.1 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.13.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.12.2 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.12.1 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.12.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.11.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.10.1 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.10.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.9.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.8.2 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.8.1 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.8.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.7.0 lib/license_finder/package_utils/conan_info_parser.rb
license_finder-6.6.2 lib/license_finder/package_utils/conan_info_parser.rb