polisher 0.7.1 → 0.8.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cccecc84da6d0524db953260dc592ee5424f33b0
4
- data.tar.gz: c9dc301daf1b9366e5d62eb68615b9b53004d6a8
3
+ metadata.gz: cde437d4b30595528a08d2127ed32d64458b9910
4
+ data.tar.gz: 2124dcabfc9cfda82bc6a481163e17e0ef0e6774
5
5
  SHA512:
6
- metadata.gz: bd10517253ce3ddf2c69a0169d720d52031dc61586078f7598bbd25909057f73aa0b96c4f7610ef996458bc1303b9c2d21381a7a08d338f5a85c7c9a07f5f7fb
7
- data.tar.gz: eea79b07d89a0966245a48654967bb49be12e6df13da1c1c15ba1b4c283ca2d85812a46be3d5f6f41bb00e75f83dd72c2b34cee107016744689323f25cbf25a6
6
+ metadata.gz: 46ed5242624caa97426ee83c6b37a21f14253ceab0ccaa026e2154c8936d9594e79c0383cfdb409ddc6a045129a62154b7ee5c695178ac402a9562b858644292
7
+ data.tar.gz: 029682eb264075bf04c12a8922bc58a3da54622d48bdac446501c87e58b9fe70a87e2ad3bb798c15f2b82a4b8278054e9bc65174b41c0497c078113a4b4184c6
@@ -50,7 +50,7 @@ end
50
50
  require 'mkmf'
51
51
 
52
52
  alias :_cpp_command :cpp_command
53
- def cpp_command(outfile="", opt)
53
+ def cpp_command(outfile, opt="")
54
54
  ""
55
55
  end
56
56
 
@@ -18,13 +18,13 @@ require 'optparse'
18
18
  require 'colored'
19
19
  require 'polisher/gem'
20
20
  require 'polisher/gemfile'
21
- require 'polisher/gemspec'
22
21
 
23
22
  ##########################################################
24
23
 
25
24
  conf = { :gemfile => './Gemfile',
26
25
  :gemspec => nil,
27
26
  :gemname => nil,
27
+ :groups => [],
28
28
  :devel_deps => false,
29
29
  :highlight_missing => false,
30
30
  :check_fedora => false,
@@ -46,6 +46,10 @@ optparse = OptionParser.new do |opts|
46
46
  conf[:gemfile] = g
47
47
  end
48
48
 
49
+ opts.on('--group gemfile_groups', 'Gemfile groups (may be specified multiple times)') do |g|
50
+ conf[:groups] << g
51
+ end
52
+
49
53
  opts.on('--gemspec file', 'Location of the gemspec to parse') do |g|
50
54
  conf[:gemspec] = g
51
55
  end
@@ -145,11 +149,17 @@ if conf[:gemname]
145
149
  print_dep(tgt, dep, versions)
146
150
  end
147
151
 
152
+ elsif conf[:gemspec]
153
+ gem = Polisher::Gem.from_gemspec(conf[:gemspec])
154
+ gem.versions(:recursive => true, :dev_deps => true) do |tgt, dep, versions|
155
+ print_dep(tgt, dep, versions)
156
+ end
157
+
148
158
  elsif conf[:gemfile]
149
159
  gemfile = nil
150
160
 
151
161
  begin
152
- gemfile = Polisher::Gemfile.parse(conf[:gemfile])
162
+ gemfile = Polisher::Gemfile.parse(conf[:gemfile], :groups => conf[:groups])
153
163
  rescue => e
154
164
  puts "Runtime err #{e}".red
155
165
  exit 1
@@ -158,10 +168,4 @@ elsif conf[:gemfile]
158
168
  gemfile.dependency_versions do |tgt, dep, versions|
159
169
  print_dep(tgt, dep, versions)
160
170
  end
161
-
162
- elsif conf[:gemspec]
163
- gemspec = Polisher::Gemspec.parse(conf[:gemspec])
164
- gemspec.dependency_versions do |tgt, dep, versions|
165
- print_dep(tgt, dep, versions)
166
- end
167
171
  end
@@ -61,26 +61,27 @@ Dir.chdir conf[:dir]
61
61
  conf[:gems].each do |gem_name|
62
62
  pkg =
63
63
  begin
64
- Polisher::GitPackage.new(:name => gem_name).clone
64
+ Polisher::Git::Pkg.new(:name => gem_name).clone
65
65
  rescue => e
66
+ puts "Problem Cloning Package, Skipping: #{e}"
66
67
  next
67
68
  end
68
69
 
69
70
  gem = Polisher::Gem.retrieve gem_name
70
- File.write("#{gem.name}-#{gem.version}.gem", gem.download_gem)
71
71
  pkg.update_to(gem)
72
72
  # TODO append gem dependencies to conf[:gems] list
73
73
 
74
74
  pkg.build
75
75
 
76
76
  unless pkg.spec.has_check?
77
- puts "Warning: no %check section in spec,\
78
- manually verify functionality!".bold.red
77
+ puts "Warning: no %check section in spec, "\
78
+ "manually verify functionality!".bold.red
79
79
  end
80
80
 
81
81
  pkg.commit
82
82
 
83
83
  puts "#{gem_name} commit complete".green
84
+ puts "Package located in #{pkg.path.bold}"
84
85
  puts "Push commit with: git push".blue
85
- puts "Build and tag official rpms with: #{Polisher::GitPackage::PKG_CMD} build".blue
86
+ puts "Build and tag official rpms with: #{Polisher::Git::Pkg.pkg_cmd} build".blue
86
87
  end
@@ -19,7 +19,7 @@ require 'polisher'
19
19
 
20
20
  spec_file = ARGV.shift
21
21
  source = ARGV.shift
22
- rpmspec = Polisher::RPMSpec.parse File.read(spec_file)
22
+ rpmspec = Polisher::RPM::Spec.parse File.read(spec_file)
23
23
  source = source.nil? ?
24
24
  Polisher::Gem.retrieve(rpmspec.gem_name) :
25
25
  Polisher::Upstream.parse(source)
@@ -4,7 +4,9 @@
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
6
  require 'polisher/core'
7
- require 'polisher/rpmspec'
7
+ require 'polisher/error'
8
+ require 'polisher/rpm/requirement'
9
+ require 'polisher/rpm/spec'
8
10
  require 'polisher/gem'
9
11
  require 'polisher/upstream'
10
12
  require 'polisher/gemfile'
@@ -3,7 +3,50 @@
3
3
  # Licensed under the MIT license
4
4
  # Copyright (C) 2013-2014 Red Hat, Inc.
5
5
 
6
- require 'polisher/rpmspec'
6
+ class Object
7
+ def eigenclass
8
+ class << self
9
+ self
10
+ end
11
+ end
12
+ end
13
+
14
+ module ConfHelpers
15
+ # Defines a 'config attribute' or attribute on the class
16
+ # which this is defined in. Accessors to the single shared
17
+ # attribute will be added to the class as well as instances
18
+ # of the class. Specify the default value with the attr name
19
+ # or via an env variable
20
+ #
21
+ # @example
22
+ # class Custom
23
+ # extend ConfHelpers
24
+ # conf_attr :data_dir, '/etc/'
25
+ # end
26
+ # Custom.data_dir # => '/etc/'
27
+ # ENV['POLISHER_DATA_DIR'] = '/usr/'
28
+ # Custom.data_dir # => '/usr/'
29
+ # Custom.data_dir == Custom.new.data_dir # => true
30
+ #
31
+ def conf_attr(name, default=nil)
32
+ self.send(:define_singleton_method, name) do |*args|
33
+ nvar = "@#{name}".intern
34
+ current = self.instance_variable_get(nvar)
35
+ envk = "POLISHER_#{name.to_s.upcase}"
36
+ self.instance_variable_set(nvar, default) unless current
37
+ self.instance_variable_set(ENV[envk]) if ENV.has_key?(envk)
38
+ # TODO also allow vars to be able to be set from a conf file
39
+ self.instance_variable_set(nvar, args.first) unless args.empty?
40
+ self.instance_variable_get(nvar)
41
+ end
42
+
43
+ self.send(:define_method, name) do
44
+ self.class.send(name)
45
+ end
46
+ end
47
+ end
48
+
49
+ require 'polisher/rpm/spec'
7
50
 
8
51
  class String
9
52
  # Return bool indicating if self is a path to a gem
@@ -25,8 +68,8 @@ class String
25
68
  # macro correspondents. If no rpm macro is specified macro will
26
69
  # simply be removed
27
70
  def unrpmize
28
- fmm = Polisher::RPMSpec::FILE_MACRO_MATCHERS
29
- fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS
71
+ fmm = Polisher::RPM::Spec::FILE_MACRO_MATCHERS
72
+ fmr = Polisher::RPM::Spec::FILE_MACRO_REPLACEMENTS
30
73
  f = fmm.inject(self) { |file, matcher| file.gsub(matcher, '') }
31
74
  f = fmr.keys.inject(f) { |file, r| file.gsub(Regexp.new(r), fmr[r]) }
32
75
  f
@@ -35,7 +78,7 @@ class String
35
78
  # Replace all occurrances of non-rpm macro strings in self
36
79
  # with their macro correspondences
37
80
  def rpmize
38
- fmr = Polisher::RPMSpec::FILE_MACRO_REPLACEMENTS.invert
81
+ fmr = Polisher::RPM::Spec::FILE_MACRO_REPLACEMENTS.invert
39
82
  fmr.keys.inject(self) { |file, r| file.gsub(r, fmr[r]) }
40
83
  end
41
84
  end
@@ -17,7 +17,6 @@ module Polisher
17
17
  c.ssl_verify_host = false
18
18
  c.http_auth_types = :negotiate
19
19
  c.userpwd = ':'
20
- c.get
21
20
  end
22
21
 
23
22
  @curl.url = url
@@ -0,0 +1,7 @@
1
+ # Polisher Errors
2
+ #
3
+ # Licensed under the MIT license
4
+ # Copyright (C) 2013-2014 Red Hat, Inc.
5
+
6
+ class PolisherError < StandardError
7
+ end
@@ -15,9 +15,12 @@ require 'active_support/core_ext'
15
15
 
16
16
  require 'polisher/version_checker'
17
17
  require 'polisher/gem_cache'
18
+ require 'polisher/vendor'
18
19
 
19
20
  module Polisher
20
21
  class Gem
22
+ include HasVendoredDeps
23
+
21
24
  GEM_CMD = '/usr/bin/gem'
22
25
  DIFF_CMD = '/usr/bin/diff'
23
26
 
@@ -64,6 +67,58 @@ module Polisher
64
67
  versions
65
68
  end
66
69
 
70
+ # Return new instance of Gem from JSON Specification
71
+ def self.from_json(json)
72
+ specj = JSON.parse(json)
73
+ metadata = {}
74
+ metadata[:spec] = specj
75
+ metadata[:name] = specj['name']
76
+ metadata[:version] = specj['version']
77
+
78
+ metadata[:deps] =
79
+ specj['dependencies']['runtime'].collect { |d|
80
+ ::Gem::Dependency.new d['name'], *d['requirements'].split(',')
81
+ }
82
+
83
+ metadata[:dev_deps] =
84
+ specj['dependencies']['development'].collect { |d|
85
+ ::Gem::Dependency.new d['name'], d['requirements'].split(',')
86
+ }
87
+
88
+ self.new metadata
89
+ end
90
+
91
+ # Return new instance of Gem from Gemspec
92
+ def self.from_gemspec(gemspec)
93
+ gemspec =
94
+ ::Gem::Specification.load(gemspec) if !gemspec.is_a?(::Gem::Specification) &&
95
+ File.exists?(gemspec)
96
+
97
+ metadata = {}
98
+ metadata[:spec] = gemspec
99
+ metadata[:name] = gemspec.name
100
+ metadata[:version] = gemspec.version.to_s
101
+
102
+ metadata[:deps] =
103
+ gemspec.dependencies.select { |dep|
104
+ dep.type == :runtime
105
+ }.collect { |dep| dep }
106
+
107
+ metadata[:dev_deps] =
108
+ gemspec.dependencies.select { |dep|
109
+ dep.type == :development
110
+ }.collect { |dep| dep }
111
+
112
+ self.new metadata
113
+ end
114
+
115
+ # Return new instance of Gem from rubygem
116
+ def self.from_gem(gem_path)
117
+ gem = self.parse :gemspec => ::Gem::Package.new(gem_path).spec
118
+ gem.path = gem_path
119
+ gem
120
+ end
121
+
67
122
  # Parse the specified gemspec & return new Gem instance from metadata
68
123
  #
69
124
  # @param [String,Hash] args contents of actual gemspec of option hash
@@ -71,72 +126,65 @@ module Polisher
71
126
  # @option args [String] :gemspec path to gemspec to load / parse
72
127
  # @return [Polisher::Gem] gem instantiated from gemspec metadata
73
128
  def self.parse(args={})
74
- metadata = {}
75
-
76
129
  if args.is_a?(String)
77
- specj = JSON.parse(args)
78
- metadata[:spec] = specj
79
- metadata[:name] = specj['name']
80
- metadata[:version] = specj['version']
81
-
82
- metadata[:deps] =
83
- specj['dependencies']['runtime'].collect { |d|
84
- ::Gem::Dependency.new d['name'], *d['requirements'].split(',')
85
- }
86
-
87
- metadata[:dev_deps] =
88
- specj['dependencies']['development'].collect { |d|
89
- ::Gem::Dependency.new d['name'], d['requirements'].split(',')
90
- }
130
+ return self.from_json args
91
131
 
92
132
  elsif args.has_key?(:gemspec)
93
- gemspec = ::Gem::Specification.load(args[:gemspec])
94
- metadata[:spec] = gemspec # TODO to json
95
- metadata[:name] = gemspec.name
96
- metadata[:version] = gemspec.version.to_s
97
-
98
- metadata[:deps] =
99
- gemspec.dependencies.select { |dep|
100
- dep.type == :runtime
101
- }.collect { |dep| dep }
102
-
103
- metadata[:dev_deps] =
104
- gemspec.dependencies.select { |dep|
105
- dep.type == :development
106
- }.collect { |dep| dep }
133
+ return self.from_gemspec args[:gemspec]
107
134
 
108
135
  elsif args.has_key?(:gem)
109
- # TODO
136
+ return self.from_gem args[:gem]
137
+
110
138
  end
111
139
 
112
- self.new metadata
140
+ self.new
113
141
  end
114
142
 
115
- # Download the gem and return the binary file contents as a string
143
+ # Return handler to internal curl helper
144
+ def self.client
145
+ @client ||= Curl::Easy.new
146
+ end
147
+
148
+ # Download the specified gem and return the binary file contents as a string
116
149
  #
117
150
  # @return [String] binary gem contents
118
- def download_gem
119
- cached = GemCache.get(@name, @version)
151
+ def self.download_gem(name, version)
152
+ cached = GemCache.get(name, version)
120
153
  return cached unless cached.nil?
121
154
 
122
- # TODO utilize a singleton curl instance (akin to errata module)
123
- gem_path = "https://rubygems.org/gems/#{@name}-#{@version}.gem"
124
- curl = Curl::Easy.new(gem_path)
125
- curl.follow_location = true
126
- curl.http_get
127
- gemf = curl.body_str
155
+ client.url = "https://rubygems.org/gems/#{name}-#{version}.gem"
156
+ client.follow_location = true
157
+ client.http_get
158
+ gemf = client.body_str
128
159
 
129
- GemCache.set(@name, @version, gemf)
160
+ GemCache.set(name, version, gemf)
130
161
  gemf
131
162
  end
132
163
 
164
+ # Download the local gem and return it as a string
165
+ def download_gem
166
+ self.class.download_gem @name, @version
167
+ end
168
+
169
+ # Download the specified gem / version from rubygems and
170
+ # return instance of Polisher::Gem class corresponding to it
171
+ def self.from_rubygems(name, version)
172
+ download_gem name, version
173
+ self.from_gem downloaded_gem_path(name, version)
174
+ end
175
+
133
176
  # Returns path to downloaded gem
134
177
  #
135
178
  # @return [String] path to downloaded gem
136
- def downloaded_gem_path
179
+ def self.downloaded_gem_path(name, version)
137
180
  # ensure gem is downloaded
138
- self.download_gem
139
- GemCache.path_for(@name, @version)
181
+ self.download_gem(name, version)
182
+ GemCache.path_for(name, version)
183
+ end
184
+
185
+ # Return path to downloaded gem
186
+ def downloaded_gem_path
187
+ self.class.downloaded_gem_path @name, @version
140
188
  end
141
189
 
142
190
  # Returns path to gem, either specified one of downloaded one
@@ -170,7 +218,8 @@ module Polisher
170
218
  self.unpack do |dir|
171
219
  Pathname(dir).find do |path|
172
220
  next if path.to_s == dir.to_s
173
- bl.call path
221
+ pathstr = path.to_s.gsub("#{dir}/", '')
222
+ bl.call pathstr unless pathstr.blank?
174
223
  end
175
224
  end
176
225
  end
@@ -182,8 +231,7 @@ module Polisher
182
231
  @file_paths ||= begin
183
232
  files = []
184
233
  self.each_file do |path|
185
- pathstr = path.to_s.gsub("#{dir}/", '')
186
- files << pathstr unless pathstr.blank?
234
+ files << path
187
235
  end
188
236
  files
189
237
  end
@@ -212,9 +260,10 @@ module Polisher
212
260
  def versions(args={}, &bl)
213
261
  recursive = args[:recursive]
214
262
  dev_deps = args[:dev_deps]
215
-
216
263
  versions = args[:versions] || {}
217
- versions.merge!({ self.name => Polisher::VersionChecker.versions_for(self.name, &bl) })
264
+
265
+ gem_versions = Polisher::VersionChecker.versions_for(self.name, &bl)
266
+ versions.merge!({ self.name => gem_versions })
218
267
  args[:versions] = versions
219
268
 
220
269
  if recursive
@@ -237,42 +286,21 @@ module Polisher
237
286
  versions
238
287
  end
239
288
 
240
- # Return list of file paths marked as vendored
241
- def vendored_file_paths
242
- self.file_paths.select { |f| f.include?('vendor/') }
243
- end
244
-
245
- # Return list of vendered gems in file list
246
- def vendored
247
- vendored_file_paths.inject({}){ |v,fp|
248
- vendored_file = fp.split('/')
249
- vendor_index = vendored_file.index('vendor')
250
-
251
- # only process vendor'd dirs:
252
- next v if vendor_index + 2 == vendored_file.size
253
-
254
- vname = vendored_file[vendor_index + 1]
255
- vversion = nil
256
- # TODO set vversion from version.rb:
257
- #vf.last.downcase == 'version.rb'
258
- v[vname] = vversion
259
- v
260
- }
261
- end
262
-
263
289
  # Return diff of content in this gem against other
264
290
  def diff(other)
265
291
  out = nil
266
292
 
267
293
  begin
268
294
  this_dir = self.unpack
269
- other_dir = other.unpack
295
+ other_dir = other.is_a?(Polisher::Gem) ? other.unpack :
296
+ (other.is_a?(Polisher::Git::Repo) ? other.path : other)
270
297
  result = AwesomeSpawn.run("#{DIFF_CMD} -r #{this_dir} #{other_dir}")
271
- out = result.output
298
+ out = result.output.gsub("#{this_dir}", 'a').gsub("#{other_dir}", 'b')
272
299
  rescue
273
300
  ensure
274
- FileUtils.rm_rf this_dir
275
- FileUtils.rm_rf other_dir
301
+ FileUtils.rm_rf this_dir unless this_dir.nil?
302
+ FileUtils.rm_rf other_dir unless other_dir.nil? ||
303
+ !other.is_a?(Polisher::Gem)
276
304
  end
277
305
 
278
306
  out