php-composer 0.4.5 → 1.0.0.pre.alpha11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rbenv-gemsets +1 -0
- data/.rubocop.yml +131 -188
- data/.ruby-version +1 -0
- data/Gemfile +0 -9
- data/Rakefile +11 -0
- data/lib/composer.rb +52 -49
- data/lib/composer/json/json_file.rb +110 -83
- data/lib/composer/json/json_formatter.rb +43 -77
- data/lib/composer/json/{json_validaton_error.rb → json_validation_error.rb} +6 -2
- data/lib/composer/package/alias_package.rb +77 -61
- data/lib/composer/package/complete_package.rb +88 -18
- data/lib/composer/package/dumper/hash_dumper.rb +50 -118
- data/lib/composer/package/dumper/hash_dumper/complete_package_attribute_dumpers.rb +47 -0
- data/lib/composer/package/dumper/hash_dumper/package_attribute_dumpers.rb +145 -0
- data/lib/composer/package/dumper/hash_dumper/root_package_attribute_dumpers.rb +24 -0
- data/lib/composer/package/link.rb +15 -5
- data/lib/composer/package/loader/hash_loader.rb +92 -228
- data/lib/composer/package/loader/hash_loader/complete_package_attribute_loaders.rb +83 -0
- data/lib/composer/package/loader/hash_loader/package_attribute_loaders.rb +181 -0
- data/lib/composer/package/loader/hash_loader/root_package_attribute_loaders.rb +32 -0
- data/lib/composer/package/loader/json_loader.rb +7 -9
- data/lib/composer/package/package.rb +611 -43
- data/lib/composer/package/root_alias_package.rb +186 -15
- data/lib/composer/package/root_package.rb +12 -4
- data/lib/composer/package/version/version_parser.rb +16 -532
- data/lib/composer/package/version/version_selector.rb +127 -68
- data/lib/composer/repository/base_repository.rb +46 -3
- data/lib/composer/repository/composite_repository.rb +4 -4
- data/lib/composer/repository/filesystem_repository.rb +15 -8
- data/lib/composer/repository/hash_repository.rb +62 -45
- data/lib/composer/repository/writeable_hash_repository.rb +5 -5
- data/lib/composer/util/composer_mirror.rb +76 -0
- data/php-composer.gemspec +14 -8
- data/resources/composer-schema.json +12 -0
- metadata +117 -16
- data/lib/composer/error.rb +0 -8
- data/lib/composer/package/base_package.rb +0 -130
- data/lib/composer/package/link_constraint/base_constraint.rb +0 -36
- data/lib/composer/package/link_constraint/empty_constraint.rb +0 -35
- data/lib/composer/package/link_constraint/multi_constraint.rb +0 -67
- data/lib/composer/package/link_constraint/specific_constraint.rb +0 -41
- data/lib/composer/package/link_constraint/version_constraint.rb +0 -221
- data/lib/composer/version.rb +0 -3
@@ -1,6 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# This file was ported to ruby from Composer php source code file.
|
3
|
+
#
|
3
4
|
# Original Source: Composer\Json\JsonFormatter.php
|
5
|
+
# Ref SHA: ce085826711a6354024203c6530ee0b56fea9c13
|
4
6
|
#
|
5
7
|
# (c) Nils Adermann <naderman@naderman.de>
|
6
8
|
# Jordi Boggiano <j.boggiano@seld.be>
|
@@ -9,18 +11,9 @@
|
|
9
11
|
# file that was distributed with this source code.
|
10
12
|
#
|
11
13
|
|
12
|
-
# JSON_HEX_TAG => 1
|
13
|
-
# JSON_HEX_AMP => 2
|
14
|
-
# JSON_HEX_APOS => 4
|
15
|
-
# JSON_HEX_QUOT => 8
|
16
|
-
# JSON_FORCE_OBJECT => 16
|
17
|
-
# JSON_NUMERIC_CHECK => 32
|
18
|
-
# JSON_UNESCAPED_SLASHES => 64
|
19
|
-
# JSON_PRETTY_PRINT => 128
|
20
|
-
# JSON_UNESCAPED_UNICODE => 256
|
21
|
-
|
22
14
|
module Composer
|
23
15
|
module Json
|
16
|
+
|
24
17
|
# * Formats json strings used for php < 5.4 because the json_encode doesn't
|
25
18
|
# * supports the flags JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
|
26
19
|
# * in these versions
|
@@ -33,27 +26,18 @@ module Composer
|
|
33
26
|
# Ioannis Kappas <ikappas@devworks.gr>
|
34
27
|
class JsonFormatter
|
35
28
|
|
36
|
-
JSON_HEX_TAG = 1
|
37
|
-
JSON_HEX_AMP = 2
|
38
|
-
JSON_HEX_APOS = 4
|
39
|
-
JSON_HEX_QUOT = 8
|
40
|
-
JSON_FORCE_OBJECT = 16
|
41
|
-
JSON_NUMERIC_CHECK = 32
|
42
|
-
JSON_UNESCAPED_SLASHES = 64
|
43
|
-
JSON_PRETTY_PRINT = 128
|
44
|
-
JSON_UNESCAPED_UNICODE = 256
|
45
|
-
|
46
29
|
class << self
|
30
|
+
|
47
31
|
# This code is based on the function found at:
|
48
32
|
# http://recursive-design.com/blog/2008/03/11/format-json-with-php/
|
49
33
|
#
|
50
34
|
# Originally licensed under MIT by Dave Perrett <mail@recursive-design.com>
|
51
35
|
#
|
52
36
|
# @param json string
|
53
|
-
# @param unescape_unicode bool
|
54
|
-
# @param unescape_slashes bool
|
37
|
+
# @param unescape_unicode bool Whether to unescape unicode
|
38
|
+
# @param unescape_slashes bool Whether to unescape slashes
|
55
39
|
# @return string
|
56
|
-
def format(json,
|
40
|
+
def format(json, unescape_unicode, unescape_slashes)
|
57
41
|
|
58
42
|
result = ''
|
59
43
|
pos = 0
|
@@ -63,14 +47,14 @@ module Composer
|
|
63
47
|
out_of_quotes = true
|
64
48
|
buffer = ''
|
65
49
|
no_escape = true
|
66
|
-
|
50
|
+
|
67
51
|
for i in 0..(str_len - 1)
|
68
52
|
|
69
|
-
#
|
53
|
+
# grab the next character in the string
|
70
54
|
char = json[i]
|
71
55
|
|
72
|
-
#
|
73
|
-
if '"'
|
56
|
+
# are we inside a quoted string?
|
57
|
+
if char === '"' && no_escape
|
74
58
|
out_of_quotes = !out_of_quotes
|
75
59
|
end
|
76
60
|
|
@@ -78,79 +62,61 @@ module Composer
|
|
78
62
|
buffer << char
|
79
63
|
no_escape = '\\' === char ? !no_escape : true
|
80
64
|
next
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
86
|
-
if options & JSON_HEX_AMP === JSON_HEX_AMP
|
87
|
-
buffer.gsub!('&', '\\u0026')
|
88
|
-
end
|
89
|
-
if options & JSON_HEX_APOS === JSON_HEX_APOS
|
90
|
-
buffer.gsub!('\'', '\\u0027')
|
91
|
-
end
|
92
|
-
if options & JSON_HEX_QUOT === JSON_HEX_QUOT
|
93
|
-
buffer.gsub!('\"', '\\u0022')
|
94
|
-
end
|
95
|
-
if options & JSON_UNESCAPED_SLASHES === JSON_UNESCAPED_SLASHES
|
65
|
+
|
66
|
+
elsif !buffer.empty?
|
67
|
+
|
68
|
+
if unescape_slashes
|
96
69
|
buffer.gsub!('\\/', '/')
|
97
70
|
end
|
98
|
-
|
71
|
+
|
72
|
+
if unescape_unicode
|
99
73
|
buffer.gsub!(/\\u([\da-fA-F]{4})/) {|m| [$1].pack('H*').unpack('n*').pack('U*')}
|
100
74
|
end
|
101
75
|
|
102
76
|
result << buffer + char
|
103
77
|
buffer = ''
|
104
78
|
next
|
79
|
+
|
105
80
|
end
|
106
81
|
|
107
|
-
if
|
108
|
-
if char === ':'
|
82
|
+
if char === ':'
|
109
83
|
# Add a space after the : character
|
110
84
|
char << ' '
|
111
|
-
elsif char === '}' || char === ']'
|
112
|
-
pos -= 1
|
113
|
-
prev_char = json[i - 1] #substr(json, i - 1, 1)
|
114
|
-
|
115
|
-
if prev_char != '{' && prev_char != '['
|
116
|
-
# If this character is the end of an element,
|
117
|
-
# output a new line and indent the next line
|
118
|
-
result << new_line
|
119
|
-
|
120
|
-
for j in 0..(pos - 1)
|
121
|
-
result << indent_str
|
122
|
-
end
|
123
|
-
else
|
124
|
-
# Collapse empty {} and []
|
125
|
-
result.rstrip!
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
85
|
|
130
|
-
|
86
|
+
elsif char === '}' || char === ']'
|
87
|
+
|
88
|
+
pos -= 1
|
89
|
+
prev_char = json[i - 1]
|
131
90
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
if char === ',' || char === '{' || char === '['
|
91
|
+
if prev_char != '{' && prev_char != '['
|
92
|
+
# If this character is the end of an element,
|
93
|
+
# output a new line and indent the next line
|
136
94
|
result << new_line
|
137
|
-
|
95
|
+
|
138
96
|
for j in 0..(pos - 1)
|
139
97
|
result << indent_str
|
140
98
|
end
|
99
|
+
else
|
100
|
+
# Collapse empty {} and []
|
101
|
+
result.rstrip!
|
141
102
|
end
|
142
103
|
end
|
143
|
-
end
|
144
104
|
|
145
|
-
|
146
|
-
end
|
105
|
+
result << char
|
147
106
|
|
148
|
-
|
149
|
-
|
150
|
-
|
107
|
+
# If the last character was the beginning of an element,
|
108
|
+
# output a new line and indent the next line
|
109
|
+
if char === ',' || char === '{' || char === '['
|
110
|
+
result << new_line
|
111
|
+
pos += 1 if char === '{' || char === '['
|
112
|
+
for j in 0..(pos - 1)
|
113
|
+
result << indent_str
|
114
|
+
end
|
115
|
+
end
|
151
116
|
|
152
|
-
|
153
|
-
|
117
|
+
end
|
118
|
+
|
119
|
+
result
|
154
120
|
end
|
155
121
|
|
156
122
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
#
|
2
2
|
# This file was ported to ruby from Composer php source code file.
|
3
|
+
#
|
3
4
|
# Original Source: Composer\Json\JsonValidationException.php
|
5
|
+
# Ref SHA: 16578d1d01656ce7b694abd5517af44395cc53b3
|
4
6
|
#
|
5
7
|
# (c) Nils Adermann <naderman@naderman.de>
|
6
8
|
# Jordi Boggiano <j.boggiano@seld.be>
|
@@ -11,6 +13,7 @@
|
|
11
13
|
|
12
14
|
module Composer
|
13
15
|
module Json
|
16
|
+
|
14
17
|
# Represents a Json Validation error
|
15
18
|
#
|
16
19
|
# PHP Authors:
|
@@ -18,12 +21,13 @@ module Composer
|
|
18
21
|
#
|
19
22
|
# Ruby Authors:
|
20
23
|
# Ioannis Kappas <ikappas@devworks.gr>
|
21
|
-
class JsonValidationError <
|
24
|
+
class JsonValidationError < ::Composer::Error
|
22
25
|
attr_reader :errors
|
23
26
|
|
24
27
|
def initialize(errors)
|
25
28
|
@errors = errors
|
26
29
|
end
|
27
30
|
end
|
31
|
+
|
28
32
|
end
|
29
|
-
end
|
33
|
+
end
|
@@ -9,6 +9,8 @@
|
|
9
9
|
# file that was distributed with this source code.
|
10
10
|
#
|
11
11
|
|
12
|
+
require 'composer/semver'
|
13
|
+
|
12
14
|
module Composer
|
13
15
|
module Package
|
14
16
|
|
@@ -16,84 +18,53 @@ module Composer
|
|
16
18
|
# and contains additional metadata
|
17
19
|
# @php_author Jordi Boggiano <j.boggiano@seld.be>
|
18
20
|
# @author Ioannis Kappas <ikappas@devworks.gr>
|
19
|
-
class AliasPackage < Composer::Package::
|
21
|
+
class AliasPackage < ::Composer::Package::CompletePackage
|
20
22
|
|
21
|
-
attr_reader :alias_of, :requires, :conflicts, :provides, :replaces
|
22
|
-
:dev_requires
|
23
|
+
attr_reader :alias_of, :requires, :conflicts, :provides, :replaces, :dev_requires
|
23
24
|
|
24
|
-
attr_accessor :repositories, :license, :keywords, :authors,
|
25
|
-
|
26
|
-
|
25
|
+
# attr_accessor :repositories, :license, :keywords, :authors,
|
26
|
+
# :description, :homepage, :scripts, :support,
|
27
|
+
# :source_url, :source_reference, :source_mirrors
|
27
28
|
|
28
|
-
# All descendants' constructors should call this parent constructor
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
29
|
+
# All descendants' constructors should call this parent constructor.
|
30
|
+
#
|
31
|
+
# Params:
|
32
|
+
# +alias_of+:: the package this package is an alias of
|
33
|
+
# +version+:: the version the alias must report
|
34
|
+
# +pretty_version+:: the alias's non-normalized version
|
32
35
|
def initialize(alias_of, version, pretty_version)
|
33
|
-
|
36
|
+
|
37
|
+
unless alias_of.kind_of?(::Composer::Package::Package)
|
38
|
+
raise ::Composer::ArgumentError,
|
39
|
+
'Invalid alias_of argument supplied.'
|
40
|
+
end
|
41
|
+
|
42
|
+
super(alias_of.name, version, pretty_version)
|
34
43
|
|
35
44
|
@version = version
|
36
45
|
@pretty_version = pretty_version
|
37
46
|
@alias_of = alias_of
|
38
|
-
@stability = Composer::
|
47
|
+
@stability = ::Composer::Semver::VersionParser::parse_stability(version)
|
39
48
|
@dev = @stability === 'dev'
|
40
49
|
|
41
50
|
# replace self.version dependencies
|
42
|
-
%w{requires dev_requires}.each do |type|
|
43
|
-
|
44
|
-
|
45
|
-
links.each do |index, link|
|
46
|
-
# link is self.version, but must be replacing also the replaced version
|
47
|
-
if 'self.version' === link.pretty_constraint
|
48
|
-
links[index] = Composer::Package::Link.new(
|
49
|
-
link.source,
|
50
|
-
link.target,
|
51
|
-
Composer::Package::LinkConstraint::VersionConstraint.new(
|
52
|
-
'=',
|
53
|
-
@version
|
54
|
-
),
|
55
|
-
type,
|
56
|
-
pretty_version
|
57
|
-
)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
@type = links
|
51
|
+
%w{requires dev_requires conflicts provides replaces}.each do |type|
|
52
|
+
links = alias_of.send type
|
53
|
+
@type = replace_self_version_dependencies links, type
|
61
54
|
end
|
62
|
-
|
63
|
-
# duplicate self.version provides
|
64
|
-
%w{conflicts provides replaces}.each do |type|
|
65
|
-
links = alias_of.send(type)
|
66
|
-
new_links = []
|
67
|
-
links.each do |link|
|
68
|
-
# link is self.version, but must be replacing also the replaced version
|
69
|
-
if 'self.version' === link.pretty_constraint
|
70
|
-
new_links = Composer.Package.Link.new(
|
71
|
-
link.source,
|
72
|
-
link.target,
|
73
|
-
Composer::Package::LinkConstraint.VersionConstraint.new(
|
74
|
-
'=',
|
75
|
-
@version
|
76
|
-
),
|
77
|
-
type,
|
78
|
-
pretty_version
|
79
|
-
)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
@type = links.zip(new_links).flatten.compact
|
83
|
-
# @type = (links << new_links)
|
84
|
-
end
|
85
|
-
|
86
55
|
end
|
87
56
|
|
88
57
|
# Determine if development package
|
89
58
|
# Return: true if development package; Otherwise false.
|
90
|
-
def is_dev
|
59
|
+
def is_dev?
|
91
60
|
@dev
|
92
61
|
end
|
93
62
|
|
94
63
|
# Stores whether this is an alias created by an aliasing in the requirements of the root package or not
|
95
64
|
# Use by the policy for sorting manually aliased packages first, see #576
|
96
|
-
#
|
65
|
+
#
|
66
|
+
# Params:
|
67
|
+
# +value+:: bool $value
|
97
68
|
# @return mixed
|
98
69
|
def root_package_alias=(value)
|
99
70
|
@root_package_alias = value
|
@@ -110,7 +81,7 @@ module Composer
|
|
110
81
|
#######################################
|
111
82
|
|
112
83
|
def type
|
113
|
-
@alias_of.
|
84
|
+
@alias_of.type
|
114
85
|
end
|
115
86
|
|
116
87
|
def target_dir
|
@@ -154,7 +125,7 @@ module Composer
|
|
154
125
|
end
|
155
126
|
|
156
127
|
def source_mirrors
|
157
|
-
@alias_of.
|
128
|
+
@alias_of.source_mirrors
|
158
129
|
end
|
159
130
|
|
160
131
|
def dist_type
|
@@ -261,13 +232,58 @@ module Composer
|
|
261
232
|
@alias_of.archive_excludes
|
262
233
|
end
|
263
234
|
|
264
|
-
def
|
265
|
-
@alias_of.
|
235
|
+
def abandoned?
|
236
|
+
@alias_of.abandoned?
|
266
237
|
end
|
267
238
|
|
268
239
|
def replacement_package
|
269
240
|
@alias_of.replacement_package
|
270
241
|
end
|
242
|
+
|
243
|
+
protected
|
244
|
+
|
245
|
+
##
|
246
|
+
# Replace self version dependencies helper
|
247
|
+
#
|
248
|
+
# @param links array
|
249
|
+
# An array of links
|
250
|
+
# @param link_type
|
251
|
+
# The specified links type
|
252
|
+
#
|
253
|
+
# @return array
|
254
|
+
##
|
255
|
+
def replace_self_version_dependencies(links, link_type)
|
256
|
+
if %w{conflicts provides replaces}.include? link_type
|
257
|
+
new_links = []
|
258
|
+
links.each do |link|
|
259
|
+
# link is self.version, but must be replacing also the replaced version
|
260
|
+
if 'self.version' === link.pretty_constraint
|
261
|
+
new_links = ::Composer.Package.Link.new(
|
262
|
+
link.source,
|
263
|
+
link.target,
|
264
|
+
::Composer::Semver::Constraint::Constraint.new('=', @version),
|
265
|
+
type,
|
266
|
+
pretty_version
|
267
|
+
)
|
268
|
+
end
|
269
|
+
end
|
270
|
+
links = links.zip(new_links).flatten.compact
|
271
|
+
else
|
272
|
+
links.each do |index, link|
|
273
|
+
# link is self.version, but must be replacing also the replaced version
|
274
|
+
if 'self.version' === link.pretty_constraint
|
275
|
+
links[index] = ::Composer::Package::Link.new(
|
276
|
+
link.source,
|
277
|
+
link.target,
|
278
|
+
::Composer::Semver::Constraint::Constraint.new('=', @version),
|
279
|
+
type,
|
280
|
+
pretty_version
|
281
|
+
)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
285
|
+
links
|
286
|
+
end
|
271
287
|
end
|
272
288
|
end
|
273
289
|
end
|
@@ -12,42 +12,112 @@
|
|
12
12
|
module Composer
|
13
13
|
module Package
|
14
14
|
|
15
|
-
#
|
16
|
-
class CompletePackage < Composer::Package::Package
|
15
|
+
# Represents a package containing additional metadata that is not used by the solver.
|
16
|
+
class CompletePackage < ::Composer::Package::Package
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# Param: string prettyVersion The package's non-normalized version
|
18
|
+
# Creates a new in memory complete package.
|
19
|
+
#
|
20
|
+
# Params:
|
21
|
+
# +name+:: The package's name.
|
22
|
+
# +version+:: The package's version.
|
23
|
+
# +pretty_version+:: The package's non-normalized version.
|
25
24
|
def initialize(name, version, pretty_version)
|
26
25
|
super(name, version, pretty_version)
|
27
|
-
|
28
|
-
@license = []
|
29
26
|
@scripts = []
|
27
|
+
@repositories = nil
|
28
|
+
@license = []
|
29
|
+
@keywords = nil
|
30
|
+
@authors = nil
|
31
|
+
@description = nil
|
32
|
+
@homepage = nil
|
30
33
|
@support = []
|
31
34
|
@abandoned = false
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
37
|
+
attr_writer :scripts
|
38
|
+
|
39
|
+
# Returns the scripts of this package
|
40
|
+
# @return array array('script name' => array('listeners'))
|
41
|
+
attr_reader :scripts
|
42
|
+
|
43
|
+
# Set the repositories
|
44
|
+
# @param repositories array
|
45
|
+
attr_writer :repositories
|
46
|
+
|
47
|
+
# Returns an array of repositories
|
48
|
+
#
|
49
|
+
# {"<type>": {<config key/values>}}
|
50
|
+
#
|
51
|
+
# @return array Repositories
|
52
|
+
attr_reader :repositories
|
53
|
+
|
54
|
+
# Set the license
|
55
|
+
# @param license array
|
56
|
+
attr_writer :license
|
57
|
+
|
58
|
+
# Returns the package license, e.g. MIT, BSD, GPL
|
59
|
+
# @return array The package licenses
|
60
|
+
attr_reader :license
|
61
|
+
|
62
|
+
# Set the keywords
|
63
|
+
# @param keywords array
|
64
|
+
attr_writer :keywords
|
65
|
+
|
66
|
+
# Returns an array of keywords relating to the package
|
67
|
+
# @return array
|
68
|
+
attr_reader :keywords
|
69
|
+
|
70
|
+
# Set the authors
|
71
|
+
# @param authors array
|
72
|
+
attr_writer :authors
|
73
|
+
|
74
|
+
# Returns an array of authors of the package
|
75
|
+
# Each item can contain name/homepage/email keys
|
76
|
+
#
|
77
|
+
# @return array
|
78
|
+
attr_reader :authors
|
79
|
+
|
80
|
+
# Set the description
|
81
|
+
# @param description string
|
82
|
+
attr_writer :description
|
83
|
+
|
84
|
+
# Returns the package description
|
85
|
+
# @return string
|
86
|
+
attr_reader :description
|
87
|
+
|
88
|
+
# Set the homepage
|
89
|
+
# @param homepage string
|
90
|
+
attr_writer :homepage
|
91
|
+
|
92
|
+
# Returns the package homepage
|
93
|
+
# @return string
|
94
|
+
attr_reader :homepage
|
95
|
+
|
96
|
+
# Set the support information
|
97
|
+
# @param support array
|
98
|
+
attr_writer :support
|
99
|
+
|
100
|
+
# Returns the support information
|
101
|
+
# @return array
|
102
|
+
attr_reader :support
|
103
|
+
|
104
|
+
# Determine whether the package is abandoned.
|
105
|
+
# @return bool true if package is abandoned; Otherwise false.
|
106
|
+
def abandoned?
|
107
|
+
@abandoned.kind_of?(String) ? true : @abandoned === true
|
38
108
|
end
|
39
109
|
|
40
110
|
# Set abandoned
|
41
|
-
#
|
111
|
+
# @param abandoned bool
|
42
112
|
def abandoned=(abandoned)
|
43
113
|
@abandoned = abandoned
|
44
114
|
end
|
45
115
|
|
46
116
|
# If the package is abandoned and has a suggested replacement,
|
47
|
-
# this method returns it
|
117
|
+
# this method returns it.
|
48
118
|
# @return string|nil
|
49
119
|
def replacement_package
|
50
|
-
|
120
|
+
@abandoned.kind_of?(String) ? @abandoned : nil
|
51
121
|
end
|
52
122
|
|
53
123
|
end
|