Class: MetricFu::GemVersion

Inherits:
Object
  • Object
show all
Defined in:
lib/metric_fu/gem_version.rb

Constant Summary collapse

GEM_NAME =
/[a-zA-Z0-9\-_\.]+/
QUOTED_GEM_NAME =
/(?:(?<gq>["'])(?<name>#{GEM_NAME})\k<gq>|%q<(?<name>#{GEM_NAME})>)/
MATCHER =
/(?:=|!=|>|<|>=|<=|~>)/
VERSION =
/[0-9]+(?:\.[a-zA-Z0-9]+)*/
REQUIREMENT =
/[ \t]*(?:#{MATCHER}[ \t]*)?#{VERSION}[ \t]*/
REQUIREMENT_LIST =
/(?<qr1>["'])(?<req1>#{REQUIREMENT})\k<qr1>(?:[ \t]*,[ \t]*(?<qr2>["'])(?<req2>#{REQUIREMENT})\k<qr2>)?/
REQUIREMENTS =
/(?:#{REQUIREMENT_LIST}|\[[ \t]*#{REQUIREMENT_LIST}[ \t]*\])/
COMMENT =
/(#[^\n]*)?/
ADD_DEPENDENCY_CALL =
/^[ \t]*\w+\.add(?<type>_runtime|_development)?_dependency\(?[ \t]*#{QUOTED_GEM_NAME}(.freeze)?(?:[ \t]*,[ \t]*#{REQUIREMENTS})?[ \t]*\)?[ \t]*#{COMMENT}$/
RESOLVER =
new

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeGemVersion

Returns a new instance of GemVersion.



17
18
19
# File 'lib/metric_fu/gem_version.rb', line 17

def initialize
  @gem_spec = File.open(gemspec, "rb") { |f| f.readlines }
end

Class Method Details

.activated_gemsObject



63
64
65
66
67
68
69
# File 'lib/metric_fu/gem_version.rb', line 63

def self.activated_gems
  if Gem::Specification.respond_to?(:stubs)
    Gem::Specification.stubs
  else
    Gem.loaded_specs.values
  end.select(&:activated?)
end

.activated_version(name) ⇒ Object



71
72
73
74
75
# File 'lib/metric_fu/gem_version.rb', line 71

def self.activated_version(name)
  activated_gems.find do |gem|
    return gem.version.version if gem.name == name
  end
end

.dependenciesObject



59
60
61
# File 'lib/metric_fu/gem_version.rb', line 59

def self.dependencies
  RESOLVER.gem_runtime_dependencies.dup
end

.dependencies_summaryObject



86
87
88
89
90
# File 'lib/metric_fu/gem_version.rb', line 86

def self.dependencies_summary
  dependencies.map do |gem_dep|
    dependency_summary(gem_dep)
  end
end

.dependency_summary(gem_dep) ⇒ Object



77
78
79
80
81
82
83
84
# File 'lib/metric_fu/gem_version.rb', line 77

def self.dependency_summary(gem_dep)
  name = gem_dep.name
  version = activated_version(gem_dep.name) || gem_dep.requirements_list
  {
    "name" => name,
    "version" => version,
  }
end

.for(name) ⇒ Object



55
56
57
# File 'lib/metric_fu/gem_version.rb', line 55

def self.for(name)
  RESOLVER.for(name).dup
end

Instance Method Details

#for(name) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/metric_fu/gem_version.rb', line 41

def for(name)
  name.downcase!
  dep = gem_runtime_dependencies.find(unknown_dependency(name)) do |gem_dep|
    gem_dep.name == name
  end

  dep.requirements_list
end

#gem_runtime_dependenciesObject



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/metric_fu/gem_version.rb', line 29

def gem_runtime_dependencies
  @gem_runtime_dependencies ||=
    begin
      @gem_spec.grep(/add_dependency|add_runtime/).map do |line|
        match = line.match(ADD_DEPENDENCY_CALL)
        name = match["name"].downcase.sub("metric_fu-", "")
        version = [match["req1"], match["req2"]].compact
        new_dependency(name, version)
      end.compact << new_dependency("rcov", ["~> 0.8"])
    end
end

#gemspecObject



21
22
23
# File 'lib/metric_fu/gem_version.rb', line 21

def gemspec
  File.join(MetricFu.root_dir, "metric_fu.gemspec")
end

#new_dependency(name, version) ⇒ Object



25
26
27
# File 'lib/metric_fu/gem_version.rb', line 25

def new_dependency(name, version)
  Gem::Dependency.new(name, version, :runtime)
end

#unknown_dependency(name) ⇒ Object



50
51
52
# File 'lib/metric_fu/gem_version.rb', line 50

def unknown_dependency(name)
  -> { new_dependency(name, [">= 0"]) }
end