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.
|
3
|
+
#
|
3
4
|
# Original Source: Composer\Package\Dumper\ArrayDumper.php
|
5
|
+
# Ref SHA: 346133d2a112dbc52163eceeee67814d351efe3f
|
4
6
|
#
|
5
7
|
# (c) Nils Adermann <naderman@naderman.de>
|
6
8
|
# Jordi Boggiano <j.boggiano@seld.be>
|
@@ -12,6 +14,7 @@
|
|
12
14
|
module Composer
|
13
15
|
module Package
|
14
16
|
module Dumper
|
17
|
+
|
15
18
|
# Dumps a hash from a package
|
16
19
|
#
|
17
20
|
# PHP Authors:
|
@@ -21,148 +24,77 @@ module Composer
|
|
21
24
|
# Ruby Authors:
|
22
25
|
# Ioannis Kappas <ikappas@devworks.gr>
|
23
26
|
class HashDumper
|
24
|
-
def dump(package)
|
25
|
-
keys = {
|
26
|
-
'binaries' => 'bin',
|
27
|
-
'type' => 'type',
|
28
|
-
'extra' => 'extra',
|
29
|
-
'installation_source' => 'installation-source',
|
30
|
-
'autoload' => 'autoload',
|
31
|
-
'dev_autoload' => 'autoload-dev',
|
32
|
-
'notification_url' => 'notification-url',
|
33
|
-
'include_paths' => 'include-path',
|
34
|
-
}
|
35
27
|
|
36
|
-
|
37
|
-
data['name'] = package.pretty_name
|
38
|
-
data['version'] = package.pretty_version
|
39
|
-
data['version_normalized'] = package.version
|
28
|
+
class << self
|
40
29
|
|
41
|
-
|
42
|
-
|
30
|
+
def attr_dumpers
|
31
|
+
@attr_dumpers ||= []
|
43
32
|
end
|
44
33
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
if mirrors = package.source_mirrors
|
51
|
-
data['source']['mirrors'] = mirrors
|
34
|
+
def attr_dumper( attr, options = {}, &block)
|
35
|
+
if block_given?
|
36
|
+
attr_dumpers.push({ attr: attr, options: options, callback: block })
|
37
|
+
else
|
38
|
+
attr_dumpers.push({ attr: attr, options: options })
|
52
39
|
end
|
53
40
|
end
|
54
41
|
|
55
|
-
|
56
|
-
data['dist'] = {}
|
57
|
-
data['dist']['type'] = package.dist_type
|
58
|
-
data['dist']['url'] = package.dist_url
|
59
|
-
data['dist']['reference'] = package.dist_reference
|
60
|
-
data['dist']['shasum'] = package.dist_sha1_checksum
|
61
|
-
if mirrors = package.dist_mirrors
|
62
|
-
data['dist']['mirrors'] = mirrors
|
63
|
-
end
|
64
|
-
end
|
42
|
+
end
|
65
43
|
|
66
|
-
|
67
|
-
data['archive'] = {}
|
68
|
-
data['archive']['exclude'] = package.archive_excludes
|
69
|
-
end
|
44
|
+
def dump(package)
|
70
45
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
next if links.is_a?(Hash) && links.empty?
|
76
|
-
data[type] = {} unless data.key?(type)
|
77
|
-
values = links.is_a?(Hash) ? links.values : links
|
78
|
-
values.each do |link|
|
79
|
-
data[type][link.target] = link.pretty_constraint
|
80
|
-
end
|
81
|
-
data[type].keys.sort.each do |k|
|
82
|
-
data[type][k] = data[type].delete k
|
83
|
-
end
|
46
|
+
# verify supplied arguments
|
47
|
+
unless package
|
48
|
+
raise ArgumentError,
|
49
|
+
'Invalid package configuration supplied.'
|
84
50
|
end
|
85
51
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
packages[k] = packages.delete k
|
90
|
-
end
|
91
|
-
data['suggest'] = packages
|
92
|
-
end
|
52
|
+
unless package.respond_to?(:pretty_name)
|
53
|
+
raise UnexpectedValueError,
|
54
|
+
'The package specified is missing the "pretty_name" method.'
|
93
55
|
end
|
94
56
|
|
95
|
-
|
96
|
-
|
57
|
+
unless package.respond_to?(:pretty_version)
|
58
|
+
raise UnexpectedValueError,
|
59
|
+
'The package specified is missing the "pretty_version" method.'
|
97
60
|
end
|
98
61
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
# data.delete('type')
|
103
|
-
# end
|
104
|
-
|
105
|
-
if package.is_a?(Composer::Package::CompletePackage)
|
106
|
-
keys = %w{scripts license authors description homepage keywords repositories support}
|
107
|
-
data = dump_values(package, keys, data)
|
108
|
-
|
109
|
-
if data.key?('keywords') && is_array?(data, 'keywords')
|
110
|
-
data['keywords'].sort!
|
111
|
-
end
|
112
|
-
|
113
|
-
if package.is_abandoned?
|
114
|
-
replacement = package.replacement_package
|
115
|
-
data['abandoned'] = replacement ? replacement : true
|
116
|
-
end
|
62
|
+
unless package.respond_to?(:version)
|
63
|
+
raise UnexpectedValueError,
|
64
|
+
'The package specified is missing the "version" method.'
|
117
65
|
end
|
118
66
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
end
|
124
|
-
end
|
67
|
+
data = {}
|
68
|
+
data['name'] = package.pretty_name
|
69
|
+
data['version'] = package.pretty_version
|
70
|
+
data['version_normalized'] = package.version
|
125
71
|
|
126
|
-
|
127
|
-
|
72
|
+
# load class specific attributes
|
73
|
+
HashDumper.attr_dumpers.each do |dumper|
|
74
|
+
if package.respond_to? dumper[:attr]
|
75
|
+
if dumper[:callback]
|
76
|
+
instance_exec package, data, &dumper[:callback]
|
77
|
+
else
|
78
|
+
attr_value = package.send dumper[:attr]
|
79
|
+
unless attr_value.nil? || attr_value.empty?
|
80
|
+
if dumper[:options][:to]
|
81
|
+
attr_key = dumper[:options][:to]
|
82
|
+
else
|
83
|
+
attr_key = dumper[:attr].to_s.tr('_', '-')
|
84
|
+
end
|
85
|
+
data[attr_key] = attr_value
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
128
89
|
end
|
129
90
|
|
130
91
|
data
|
131
92
|
end
|
132
93
|
|
133
|
-
|
94
|
+
require_relative 'hash_dumper/package_attribute_dumpers'
|
95
|
+
require_relative 'hash_dumper/complete_package_attribute_dumpers'
|
96
|
+
require_relative 'hash_dumper/root_package_attribute_dumpers'
|
134
97
|
|
135
|
-
def dump_values(package, keys, data)
|
136
|
-
keys.each do |method, key|
|
137
|
-
key = method unless key
|
138
|
-
next unless value = package.send(method)
|
139
|
-
next if value.nil?
|
140
|
-
next if value.is_a?(Array) && value.empty?
|
141
|
-
next if value.is_a?(Hash) && value.empty?
|
142
|
-
data[key] = value
|
143
|
-
end
|
144
|
-
data
|
145
|
-
end
|
146
|
-
|
147
|
-
def is_numeric?(value)
|
148
|
-
true if Float(value) rescue false
|
149
|
-
end
|
150
|
-
|
151
|
-
def is_empty?(config, key)
|
152
|
-
config.key?(key) ? config[key].empty? : true
|
153
|
-
end
|
154
|
-
|
155
|
-
def is_hash?(config, key)
|
156
|
-
config.key?(key) ? config[key].is_a?(Hash) : false
|
157
|
-
end
|
158
|
-
|
159
|
-
def is_array?(config, key)
|
160
|
-
config.key?(key) ? config[key].is_a?(Array) : false
|
161
|
-
end
|
162
|
-
|
163
|
-
def is_string?(config, key)
|
164
|
-
config.key?(key) ? config[key].is_a?(String) : false
|
165
|
-
end
|
166
98
|
end
|
167
99
|
end
|
168
100
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#
|
2
|
+
# This file was ported to ruby from Composer php source code.
|
3
|
+
#
|
4
|
+
# Original Source: Composer\Package\Loader\ArrayLoader.php
|
5
|
+
# Ref SHA: a1427d7fd626d4308c190a267dd7a993f87c6a2a
|
6
|
+
#
|
7
|
+
# (c) Nils Adermann <naderman@naderman.de>
|
8
|
+
# Jordi Boggiano <j.boggiano@seld.be>
|
9
|
+
#
|
10
|
+
# For the full copyright and license information, please view the LICENSE
|
11
|
+
# file that was distributed with this source code.
|
12
|
+
#
|
13
|
+
|
14
|
+
module Composer
|
15
|
+
module Package
|
16
|
+
module Dumper
|
17
|
+
class HashDumper
|
18
|
+
|
19
|
+
attr_dumper :scripts
|
20
|
+
attr_dumper :license
|
21
|
+
attr_dumper :authors
|
22
|
+
attr_dumper :description
|
23
|
+
attr_dumper :homepage
|
24
|
+
attr_dumper :repositories
|
25
|
+
attr_dumper :support
|
26
|
+
|
27
|
+
attr_dumper :keywords do |package, data|
|
28
|
+
keywords = package.keywords
|
29
|
+
unless keywords.nil? || keywords.empty?
|
30
|
+
data['keywords'] = keywords.is_a?(Array) ? keywords.sort! : keywords
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
attr_dumper :abandoned? do |package, data|
|
35
|
+
if package.abandoned?
|
36
|
+
replacement = true
|
37
|
+
if package.respond_to?(:replacement_package)
|
38
|
+
replacement = package.replacement_package
|
39
|
+
end
|
40
|
+
data['abandoned'] = replacement ? replacement : true
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
#
|
2
|
+
# This file was ported to ruby from Composer php source code.
|
3
|
+
#
|
4
|
+
# Original Source: Composer\Package\Loader\ArrayLoader.php
|
5
|
+
# Ref SHA: a1427d7fd626d4308c190a267dd7a993f87c6a2a
|
6
|
+
#
|
7
|
+
# (c) Nils Adermann <naderman@naderman.de>
|
8
|
+
# Jordi Boggiano <j.boggiano@seld.be>
|
9
|
+
#
|
10
|
+
# For the full copyright and license information, please view the LICENSE
|
11
|
+
# file that was distributed with this source code.
|
12
|
+
#
|
13
|
+
|
14
|
+
module Composer
|
15
|
+
module Package
|
16
|
+
module Dumper
|
17
|
+
class HashDumper
|
18
|
+
|
19
|
+
attr_dumper :target_dir
|
20
|
+
|
21
|
+
attr_dumper :source_type do |package, data|
|
22
|
+
source_type = package.source_type
|
23
|
+
unless source_type.nil? || source_type.empty?
|
24
|
+
|
25
|
+
data['source'] = {}
|
26
|
+
data['source']['type'] = package.source_type
|
27
|
+
|
28
|
+
if package.respond_to? :source_url
|
29
|
+
source_url = package.source_url
|
30
|
+
unless source_url.nil? || source_url.empty?
|
31
|
+
data['source']['url'] = package.source_url
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
if package.respond_to? :source_reference
|
36
|
+
source_reference = package.source_reference
|
37
|
+
unless source_reference.nil? || source_reference.empty?
|
38
|
+
data['source']['reference'] = source_reference
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
if package.respond_to? :source_mirrors
|
43
|
+
source_mirrors = package.source_mirrors
|
44
|
+
unless source_mirrors.nil? || source_mirrors.empty?
|
45
|
+
data['source']['mirrors'] = source_mirrors
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
attr_dumper :dist_type do |package, data|
|
53
|
+
dist_type = package.dist_type
|
54
|
+
unless dist_type.nil? || dist_type.empty?
|
55
|
+
|
56
|
+
data['dist'] = {}
|
57
|
+
data['dist']['type'] = package.dist_type
|
58
|
+
|
59
|
+
if package.respond_to? :dist_url
|
60
|
+
dist_url = package.dist_url
|
61
|
+
unless dist_url.nil? || dist_url.empty?
|
62
|
+
data['dist']['url'] = package.dist_url
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
if package.respond_to? :dist_reference
|
67
|
+
dist_reference = package.dist_reference
|
68
|
+
unless dist_reference.nil? || dist_reference.empty?
|
69
|
+
data['dist']['reference'] = dist_reference
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
if package.respond_to? :dist_sha1_checksum
|
74
|
+
dist_sha1_checksum = package.dist_sha1_checksum
|
75
|
+
unless dist_sha1_checksum.nil? || dist_sha1_checksum.empty?
|
76
|
+
data['dist']['shasum'] = dist_sha1_checksum
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
if package.respond_to? :dist_mirrors
|
81
|
+
dist_mirrors = package.dist_mirrors
|
82
|
+
unless dist_mirrors.nil? || dist_mirrors.empty?
|
83
|
+
data['dist']['mirrors'] = dist_mirrors
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
attr_dumper :archive_excludes do |package, data|
|
91
|
+
archive_excludes = package.archive_excludes
|
92
|
+
unless archive_excludes.nil? || archive_excludes.empty?
|
93
|
+
data['archive'] = {}
|
94
|
+
data['archive']['exclude'] = archive_excludes
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
::Composer::Package::SUPPORTED_LINK_TYPES.each do |type, opts|
|
99
|
+
attr_dumper opts[:method] do |package, data|
|
100
|
+
links = package.send(opts[:method])
|
101
|
+
next if links.nil?
|
102
|
+
next if links.is_a?(Array) && links.empty?
|
103
|
+
next if links.is_a?(Hash) && links.empty?
|
104
|
+
values = links.is_a?(Hash) ? links.values : links
|
105
|
+
values.each do |link|
|
106
|
+
data[type] = {} unless data.key?(type)
|
107
|
+
data[type][link.target] = link.pretty_constraint
|
108
|
+
end
|
109
|
+
data[type].keys.sort.each do |k|
|
110
|
+
data[type][k] = data[type].delete k
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
attr_dumper :suggests do |package, data|
|
116
|
+
packages = package.suggests
|
117
|
+
unless packages.nil? || packages.empty?
|
118
|
+
packages.keys.sort.each do |k|
|
119
|
+
packages[k] = packages.delete k
|
120
|
+
end
|
121
|
+
data['suggest'] = packages
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
attr_dumper :release_date do |package, data|
|
126
|
+
release_date = package.release_date
|
127
|
+
unless release_date.nil?
|
128
|
+
data['time'] = release_date.strftime('%Y-%m-%d %H:%M:%S')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
attr_dumper :binaries, to: 'bin'
|
133
|
+
attr_dumper :type
|
134
|
+
attr_dumper :extra
|
135
|
+
attr_dumper :installation_source
|
136
|
+
attr_dumper :autoload
|
137
|
+
attr_dumper :dev_autoload, to: 'autoload-dev'
|
138
|
+
attr_dumper :notification_url
|
139
|
+
attr_dumper :include_paths, to: 'include-path'
|
140
|
+
attr_dumper :transport_options
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#
|
2
|
+
# This file was ported to ruby from Composer php source code.
|
3
|
+
#
|
4
|
+
# Original Source: Composer\Package\Loader\ArrayLoader.php
|
5
|
+
# Ref SHA: a1427d7fd626d4308c190a267dd7a993f87c6a2a
|
6
|
+
#
|
7
|
+
# (c) Nils Adermann <naderman@naderman.de>
|
8
|
+
# Jordi Boggiano <j.boggiano@seld.be>
|
9
|
+
#
|
10
|
+
# For the full copyright and license information, please view the LICENSE
|
11
|
+
# file that was distributed with this source code.
|
12
|
+
#
|
13
|
+
|
14
|
+
module Composer
|
15
|
+
module Package
|
16
|
+
module Dumper
|
17
|
+
class HashDumper
|
18
|
+
|
19
|
+
attr_dumper :minimum_stability
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -18,11 +18,12 @@ module Composer
|
|
18
18
|
attr_reader :source, :target, :constraint
|
19
19
|
|
20
20
|
# Creates a new package link.
|
21
|
-
#
|
22
|
-
# @param string
|
23
|
-
# @param
|
24
|
-
# @param
|
25
|
-
# @param string
|
21
|
+
#
|
22
|
+
# @param source string
|
23
|
+
# @param target string
|
24
|
+
# @param constraint LinkConstraintInterface Constraint applying to the target of this link
|
25
|
+
# @param description string Used to create a descriptive string representation
|
26
|
+
# @param pretty_constraint string
|
26
27
|
def initialize(source, target, constraint = nil, description = 'relates to', pretty_constraint = nil)
|
27
28
|
@source = source.downcase
|
28
29
|
@target = target.downcase
|
@@ -31,6 +32,9 @@ module Composer
|
|
31
32
|
@pretty_constraint = pretty_constraint
|
32
33
|
end
|
33
34
|
|
35
|
+
# Get the link's pretty constraint.
|
36
|
+
#
|
37
|
+
# @return string
|
34
38
|
def pretty_constraint
|
35
39
|
unless @pretty_constraint
|
36
40
|
raise UnexpectedValueError, "Link #{self} has been misconfigured and had no pretty constraint given."
|
@@ -38,10 +42,16 @@ module Composer
|
|
38
42
|
@pretty_constraint
|
39
43
|
end
|
40
44
|
|
45
|
+
# Get the link's pretty string.
|
46
|
+
#
|
47
|
+
# @return string
|
41
48
|
def pretty_string(source_package)
|
42
49
|
"#{source_package.pretty_string} #{@description} #{@target} #{@constraint.pretty_string}"
|
43
50
|
end
|
44
51
|
|
52
|
+
# Get the link's string representation.
|
53
|
+
#
|
54
|
+
# @return string
|
45
55
|
def to_s
|
46
56
|
"#{@source} #{@description} #{@target} (#{@constraint})"
|
47
57
|
end
|