/
dependency.rb
108 lines (81 loc) · 2.11 KB
/
dependency.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
class Dependency < ApplicationRecord
belongs_to :rubygem
belongs_to :version
before_validation :use_gem_dependency,
:use_existing_rubygem,
:parse_gem_dependency
validates :requirements, presence: true
validates :scope, inclusion: { in: %w[development runtime] }
attr_accessor :gem_dependency
def self.unresolved(rubygem)
where(unresolved_name: nil, rubygem_id: rubygem.id)
end
def self.mark_unresolved_for(rubygem)
unresolved(rubygem).update_all(unresolved_name: rubygem.name,
rubygem_id: nil)
end
def self.development
where(scope: 'development')
end
def self.runtime
where(scope: 'runtime')
end
def name
unresolved_name || rubygem.try(:name)
end
def payload
{
'name' => name,
'requirements' => clean_requirements
}
end
def as_json(*)
payload
end
def to_xml(options = {})
payload.to_xml(options.merge(root: 'dependency'))
end
def to_yaml(*args)
payload.to_yaml(*args)
end
def encode_with(coder)
coder.tag = nil
coder.implicit = true
coder.map = payload
end
def to_s
"#{name} #{clean_requirements}"
end
def clean_requirements(reqs = requirements)
reqs.gsub(/#<YAML::Syck::DefaultKey[^>]*>/, "=")
end
def update_resolved(rubygem)
self.rubygem = rubygem
self.unresolved_name = nil
save!
end
private
def use_gem_dependency
return if rubygem
if gem_dependency.class != Gem::Dependency
errors.add :rubygem, "Please use Gem::Dependency to specify dependencies."
throw :abort
end
if gem_dependency.name.empty?
errors.add :rubygem, "Blank is not a valid dependency name"
return :abort
end
true
end
def use_existing_rubygem
return if rubygem
self.rubygem = Rubygem.find_by_name(gem_dependency.name)
self.unresolved_name = gem_dependency.name unless rubygem
end
def parse_gem_dependency
return if requirements
reqs = gem_dependency.requirements_list.join(', ')
self.requirements = clean_requirements(reqs)
self.scope = gem_dependency.type.to_s
end
end