Class: ProjectDependency

Inherits:
Object
  • Object
show all
Includes:
ActionView::Helpers::TextHelper
Defined in:
app/models/project_dependency.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ ProjectDependency

Returns a new instance of ProjectDependency.



5
6
7
8
# File 'app/models/project_dependency.rb', line 5

def initialize(*args)
  @project, @key_dependency, @version = args
  @version = project.dependency_version(key_dependency.slug) if args.length < 3
end

Instance Attribute Details

#key_dependencyObject (readonly) Also known as: dependency

Returns the value of attribute key_dependency.



17
18
19
# File 'app/models/project_dependency.rb', line 17

def key_dependency
  @key_dependency
end

#projectObject (readonly)

Returns the value of attribute project.



17
18
19
# File 'app/models/project_dependency.rb', line 17

def project
  @project
end

#versionObject (readonly)

Returns the value of attribute version.



17
18
19
# File 'app/models/project_dependency.rb', line 17

def version
  @version
end

Class Method Details

.for(project) ⇒ Object



10
11
12
13
# File 'app/models/project_dependency.rb', line 10

def self.for(project)
  project = ProjectDependencies.new(project)
  KeyDependency.all.map { |dependency| self.new(project, dependency) }.select(&:valid?)
end

Instance Method Details

#maintenance_lightObject



61
62
63
64
65
# File 'app/models/project_dependency.rb', line 61

def maintenance_light
  return nil if nil?
  return maintenance_light_for_target_versions if target_versions.any?
  maintenance_light_for_latest_release
end

#maintenance_light_for_latest_releaseObject



81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'app/models/project_dependency.rb', line 81

def maintenance_light_for_latest_release
  if releases_since_version > 2
    MaintenanceLight.new self, "red", "#{releases_since_version} versions out-of-date"
  elsif releases_since_version == 2
    MaintenanceLight.new self, "orange", "#{releases_since_version} versions out-of-date"
  elsif releases_since_version == 1
    MaintenanceLight.new self, "yellow", "1 version out-of-date"
  elsif version < latest_version
    MaintenanceLight.new self, "spring-green", "#{pluralize(patches.index(version.to_s), "patches")} out-of-date"
  else
    MaintenanceLight.new self, "green", "up-to-date"
  end
end

#maintenance_light_for_target_versionsObject



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/models/project_dependency.rb', line 67

def maintenance_light_for_target_versions
  return MaintenanceLight.new(self, "green", "Nice! #{project.name} is running the latest version of #{dependency.name}.") if up_to_date?

  target_versions.each do |target_version|
    next unless minor_version_of(target_version) == minor_version

    patches_behind = patchlevel_of(target_version) - patchlevel_of(version)
    return MaintenanceLight.new(self, "spring-green", "#{project.name} is running a safe version of #{dependency.name}.") if patches_behind <= 0
    return MaintenanceLight.new(self, "yellow", "#{project.name} is running a version of #{dependency.name} only #{pluralize(patches_behind, "patch")} behind #{target_version}. It should be a painless upgrade.")
  end

  MaintenanceLight.new(self, "red", "#{project.name} is running an older version of #{dependency.name}. Watch for breaking changes!")
end

#minor_versionObject



22
23
24
# File 'app/models/project_dependency.rb', line 22

def minor_version
  @minor_version ||= minor_version_of(version)
end

#minor_versionsObject



46
47
48
# File 'app/models/project_dependency.rb', line 46

def minor_versions
  @minor_versions ||= versions.map(&method(:minor_version_of)).uniq
end

#nil?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'app/models/project_dependency.rb', line 32

def nil?
  version.nil?
end

#patchesObject



50
51
52
53
54
55
56
57
# File 'app/models/project_dependency.rb', line 50

def patches
  @patches ||= begin
    stringified_versions = versions.map(&:to_s)
    current_minor_version = stringified_versions.first[/\d+\.\d+/]
    rx = /^#{current_minor_version}\.\d+$/
    stringified_versions.select { |version| version =~ rx }
  end
end

#releases_since_versionObject



42
43
44
# File 'app/models/project_dependency.rb', line 42

def releases_since_version
  @releases_since_version ||= minor_versions.index(minor_version)
end

#up_to_date?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'app/models/project_dependency.rb', line 36

def up_to_date?
  @up_to_date ||= (version == target_versions.first)
end

#valid?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'app/models/project_dependency.rb', line 28

def valid?
  version && versions.any?
end