Class: Bibliothecary::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/bibliothecary/runner.rb

Overview

A class that allows bibliothecary to run with multiple configurations at once, rather than with one global

Instance Method Summary collapse

Constructor Details

#initialize(configuration) ⇒ Runner

Returns a new instance of Runner.



5
6
7
# File 'lib/bibliothecary/runner.rb', line 5

def initialize(configuration)
  @configuration = configuration
end

Instance Method Details

#analyse(path, ignore_unparseable_files: true) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/bibliothecary/runner.rb', line 9

def analyse(path, ignore_unparseable_files: true)
  info_list = load_file_info_list(path)

  info_list = info_list.reject { |info| info.package_manager.nil? } if ignore_unparseable_files

  # Each package manager needs to see its entire list so it can
  # associate related manifests and lockfiles for example.
  analyses = package_managers.map do |pm|
    matching_infos = info_list.select { |info| info.package_manager == pm }
    pm.analyse_file_info(matching_infos)
  end
  analyses = analyses.flatten.compact

  info_list.select { |info| info.package_manager.nil? }.each do |info|
    analyses.push(Bibliothecary::Analyser::create_error_analysis('unknown', info.relative_path, 'unknown',
                                                                 'No parser for this file type'))
  end

  analyses
end

#analyse_file(file_path, contents) ⇒ Object



85
86
87
88
89
# File 'lib/bibliothecary/runner.rb', line 85

def analyse_file(file_path, contents)
  package_managers.select { |pm| pm.match?(file_path, contents) }.map do |pm|
    pm.analyse_contents(file_path, contents)
  end.flatten.uniq.compact
end

#find_manifests(path) ⇒ Object



77
78
79
# File 'lib/bibliothecary/runner.rb', line 77

def find_manifests(path)
  RelatedFilesInfo.create_from_file_infos(load_file_info_list(path).reject { |info| info.package_manager.nil? })
end

#find_manifests_from_paths(paths) ⇒ Object



81
82
83
# File 'lib/bibliothecary/runner.rb', line 81

def find_manifests_from_paths(paths)
  RelatedFilesInfo.create_from_file_infos(load_file_info_list_from_paths(paths).reject { |info| info.package_manager.nil? })
end

#identify_manifests(file_list) ⇒ Object

this skips manifests sometimes because it doesn’t look at file contents and can’t establish from only regexes that the thing is a manifest. We exclude rather than include ambiguous filenames because this API is used by libraries.io and we don’t want to download all .xml files from GitHub.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/bibliothecary/runner.rb', line 96

def identify_manifests(file_list)
  ignored_dirs_with_slash = ignored_dirs.map { |d| if d.end_with?("/") then d else d + "/" end }
  allowed_file_list = file_list.reject do |f|
    ignored_dirs.include?(f) || f.start_with?(*ignored_dirs_with_slash)
  end
  allowed_file_list = allowed_file_list.reject{|f| ignored_files.include?(f)}
  package_managers.map do |pm|
    allowed_file_list.select do |file_path|
      # this is a call to match? without file contents, which will skip
      # ambiguous filenames that are only possibly a manifest
      pm.match?(file_path)
    end
  end.flatten.uniq.compact
end

#ignored_dirsObject



111
112
113
# File 'lib/bibliothecary/runner.rb', line 111

def ignored_dirs
  @configuration.ignored_dirs
end

#ignored_filesObject



115
116
117
# File 'lib/bibliothecary/runner.rb', line 115

def ignored_files
  @configuration.ignored_files
end

#init_package_manager(info) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/bibliothecary/runner.rb', line 35

def init_package_manager(info)
  # set the package manager on each info
  matches = package_managers.select { |pm| pm.match_info?(info) }

  info.package_manager = matches[0] if matches.length == 1

  # this is a bug at the moment if it's raised (we don't handle it sensibly)
  raise "Multiple package managers fighting over #{info.relative_path}: #{matches.map(&:to_s)}" if matches.length > 1
end

#load_file_info_list(path) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/bibliothecary/runner.rb', line 62

def load_file_info_list(path)
  file_list = []
  Find.find(path) do |subpath|
    info = FileInfo.new(path, subpath)
    Find.prune if FileTest.directory?(subpath) && ignored_dirs.include?(info.relative_path)
    next unless FileTest.file?(subpath)
    next if ignored_files.include?(info.relative_path)

    init_package_manager(info)

    file_list.push(info)
  end
  file_list
end

#load_file_info_list_from_paths(paths) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/bibliothecary/runner.rb', line 49

def load_file_info_list_from_paths(paths)
  file_list = []
  paths.each do |path|
    info = FileInfo.new(nil, path)

    next if ignored_files.include?(info.relative_path)

    init_package_manager(info)
    file_list.push(info)
  end
  file_list
end

#load_file_list(path) ⇒ Object

deprecated; use load_file_info_list.



31
32
33
# File 'lib/bibliothecary/runner.rb', line 31

def load_file_list(path)
  load_file_info_list(path).map { |info| info.full_path }
end

#package_managersObject



45
46
47
# File 'lib/bibliothecary/runner.rb', line 45

def package_managers
  Bibliothecary::Parsers.constants.map{|c| Bibliothecary::Parsers.const_get(c) }.sort_by{|c| c.to_s.downcase }
end