Class: Brew::Vulns::Formula

Inherits:
Object
  • Object
show all
Defined in:
lib/brew/vulns/formula.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Formula

Returns a new instance of Formula.



11
12
13
14
15
16
17
# File 'lib/brew/vulns/formula.rb', line 11

def initialize(data)
  @name = data["name"] || data["full_name"]
  @version = data.dig("versions", "stable") || data["version"]
  @source_url = data.dig("urls", "stable", "url")
  @head_url = data.dig("urls", "head", "url")
  @dependencies = data["dependencies"] || []
end

Instance Attribute Details

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



9
10
11
# File 'lib/brew/vulns/formula.rb', line 9

def dependencies
  @dependencies
end

#head_urlObject (readonly)

Returns the value of attribute head_url.



9
10
11
# File 'lib/brew/vulns/formula.rb', line 9

def head_url
  @head_url
end

#nameObject (readonly)

Returns the value of attribute name.



9
10
11
# File 'lib/brew/vulns/formula.rb', line 9

def name
  @name
end

#source_urlObject (readonly)

Returns the value of attribute source_url.



9
10
11
# File 'lib/brew/vulns/formula.rb', line 9

def source_url
  @source_url
end

#versionObject (readonly)

Returns the value of attribute version.



9
10
11
# File 'lib/brew/vulns/formula.rb', line 9

def version
  @version
end

Class Method Details

.load_installed(formula_filter = nil) ⇒ Object

Raises:



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/brew/vulns/formula.rb', line 41

def self.load_installed(formula_filter = nil)
  json, status = Open3.capture2("brew", "info", "--json=v2", "--installed")
  raise Error, "brew info failed with status #{status.exitstatus}" unless status.success?

  data = JSON.parse(json)
  formulae = data["formulae"].map { |f| new(f) }

  if formula_filter
    formulae.select! { |f| f.name == formula_filter || f.name.start_with?("#{formula_filter}@") }
  end

  formulae
end

.load_with_dependencies(formula_filter = nil) ⇒ Object

Raises:



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/brew/vulns/formula.rb', line 55

def self.load_with_dependencies(formula_filter = nil)
  json, status = Open3.capture2("brew", "info", "--json=v2", "--installed")
  raise Error, "brew info failed with status #{status.exitstatus}" unless status.success?

  data = JSON.parse(json)
  all_formulae = data["formulae"].map { |f| new(f) }
  formulae_by_name = all_formulae.each_with_object({}) { |f, h| h[f.name] = f }

  if formula_filter
    filtered = all_formulae.select { |f| f.name == formula_filter || f.name.start_with?("#{formula_filter}@") }
    return [] if filtered.empty?

    deps_output, = Open3.capture2("brew", "deps", "--installed", formula_filter)
    dep_names = deps_output.split("\n").map(&:strip)

    result = filtered.each_with_object({}) { |f, h| h[f.name] = f }
    dep_names.each do |dep_name|
      dep = formulae_by_name[dep_name]
      result[dep_name] = dep if dep && !result[dep_name]
    end

    result.values
  else
    all_formulae
  end
end

Instance Method Details

#github?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/brew/vulns/formula.rb', line 31

def github?
  repo_url&.include?("github.com")
end

#repo_urlObject



19
20
21
22
23
# File 'lib/brew/vulns/formula.rb', line 19

def repo_url
  return @repo_url if defined?(@repo_url)

  @repo_url = extract_repo_url(source_url) || extract_repo_url(head_url)
end

#tagObject



25
26
27
28
29
# File 'lib/brew/vulns/formula.rb', line 25

def tag
  return @tag if defined?(@tag)

  @tag = extract_tag_from_url(source_url)
end

#to_osv_queryObject



35
36
37
38
39
# File 'lib/brew/vulns/formula.rb', line 35

def to_osv_query
  return nil unless repo_url && tag

  { repo_url: repo_url, version: tag, name: name }
end