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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
require 'rubygems/command'
require 'rubygems/local_remote_options'
require 'rubygems/version_option'
require 'rubygems/package'
class Gem::Commands::SpecificationCommand < Gem::Command
include Gem::LocalRemoteOptions
include Gem::VersionOption
def initialize
Gem.load_yaml
super 'specification', 'Display gem specification (in yaml)',
:domain => :local, :version => Gem::Requirement.default,
:format => :yaml
add_version_option('examine')
add_platform_option
add_prerelease_option
add_option('--all', 'Output specifications for all versions of',
'the gem') do |value, options|
options[:all] = true
end
add_option('--ruby', 'Output ruby format') do |value, options|
options[:format] = :ruby
end
add_option('--yaml', 'Output YAML format') do |value, options|
options[:format] = :yaml
end
add_option('--marshal', 'Output Marshal format') do |value, options|
options[:format] = :marshal
end
add_local_remote_options
end
def arguments # :nodoc:
<<-ARGS
GEMFILE name of gem to show the gemspec for
FIELD name of gemspec field to show
ARGS
end
def defaults_str # :nodoc:
"--local --version '#{Gem::Requirement.default}' --yaml"
end
def description # :nodoc:
<<-EOF
The specification command allows you to extract the specification from
a gem for examination.
The specification can be output in YAML, ruby or Marshal formats.
Specific fields in the specification can be extracted in YAML format:
$ gem spec rake summary
--- Ruby based make-like utility.
...
EOF
end
def usage # :nodoc:
"#{program_name} [GEMFILE] [FIELD]"
end
def execute
specs = []
gem = options[:args].shift
unless gem then
raise Gem::CommandLineError,
"Please specify a gem name or file on the command line"
end
case v = options[:version]
when String
req = Gem::Requirement.create v
when Gem::Requirement
req = v
else
raise Gem::CommandLineError, "Unsupported version type: '#{v}'"
end
if !req.none? and options[:all]
alert_error "Specify --all or -v, not both"
terminate_interaction 1
end
if options[:all]
dep = Gem::Dependency.new gem
else
dep = Gem::Dependency.new gem, req
end
field = get_one_optional_argument
raise Gem::CommandLineError, "--ruby and FIELD are mutually exclusive" if
field and options[:format] == :ruby
if local? then
if File.exist? gem then
specs << Gem::Package.new(gem).spec rescue nil
end
if specs.empty? then
specs.push(*dep.matching_specs)
end
end
if remote? then
dep.prerelease = options[:prerelease]
found, _ = Gem::SpecFetcher.fetcher.spec_for_dependency dep
specs.push(*found.map { |spec,| spec })
end
if specs.empty? then
alert_error "No gem matching '#{dep}' found"
terminate_interaction 1
end
unless options[:all] then
specs = [specs.max_by { |s| s.version }]
end
specs.each do |s|
s = s.send field if field
say case options[:format]
when :ruby then s.to_ruby
when :marshal then Marshal.dump s
else s.to_yaml
end
say "\n"
end
end
end
|