fpm 0.2.23 → 0.2.24

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.
data/bin/fpm CHANGED
@@ -72,7 +72,7 @@ def main(args)
72
72
  settings.source_type = st
73
73
  end # -s
74
74
 
75
- opts.on("-S PACKAGE_SUFFIX", "which suffix to append to package and dependances") do |sfx|
75
+ opts.on("-S PACKAGE_SUFFIX", "which suffix to append to package and dependencies") do |sfx|
76
76
  settings.suffix = sfx
77
77
  end # -S
78
78
 
data/lib/fpm.rb CHANGED
@@ -8,4 +8,5 @@ require "fpm/target/rpm"
8
8
  require "fpm/source"
9
9
  require "fpm/source/dir"
10
10
  require "fpm/source/gem"
11
+ require "fpm/source/python"
11
12
  require "fpm/source/rpm"
@@ -92,8 +92,9 @@ class FPM::Builder
92
92
  })
93
93
  end
94
94
 
95
- cleanup!
95
+ garbage << @source.garbage if @source.respond_to?(:garbage)
96
96
 
97
+ cleanup!
97
98
  end # def assemble!
98
99
 
99
100
  private
@@ -0,0 +1 @@
1
+ __all__ = [ "list_dependencies" ]
@@ -0,0 +1,79 @@
1
+ from distutils.core import Command
2
+ import json
3
+ import re
4
+ import time
5
+
6
+ # Note, the last time I coded python daily was at Google, so it's entirely
7
+ # possible some of my techniques below are outdated or bad.
8
+ # If you have fixes, let me know.
9
+
10
+ class get_metadata(Command):
11
+ description = "get package metadata"
12
+ user_options = []
13
+
14
+ def initialize_options(self):
15
+ pass
16
+ # def initialize_options
17
+
18
+ def finalize_options(self):
19
+ pass
20
+ # def finalize_options
21
+
22
+ def run(self):
23
+ #print type(self.distribution)
24
+ #for i in sorted(dir(self.distribution)):
25
+ #if i.startswith("_"):
26
+ #continue
27
+ ###print "%s: %r" % (i, self.__getattr__(i))
28
+ #print "%s" % i
29
+
30
+ data = {
31
+ "name": self.distribution.get_name(),
32
+ "version": self.distribution.get_version(),
33
+ "author": "%s <%s>" % (self.distribution.get_author(),
34
+ self.distribution.get_author_email()),
35
+ "description": self.distribution.get_description(),
36
+ "license": self.distribution.get_license(),
37
+ "url": self.distribution.get_url(),
38
+ }
39
+
40
+ # If there are python C/extension modules, we'll want to build a native
41
+ # arch package.
42
+ if self.distribution.has_ext_modules():
43
+ data["architecture"] = "native"
44
+ else:
45
+ data["architecture"] = "all"
46
+ # end if
47
+
48
+ dependencies = []
49
+ try:
50
+ dependencies = self.distribution.install_requires
51
+ except:
52
+ pass
53
+
54
+ final_deps = []
55
+ dep_re = re.compile("([^<>= ]+)(?:\s*([<>=]{1,2})\s*(.*))?$")
56
+ for dep in dependencies:
57
+ # python deps are strings that look like:
58
+ # "packagename"
59
+ # "packagename >= version"
60
+ # Replace 'packagename' with 'python#{suffix}-packagename'
61
+ m = dep_re.match(dep)
62
+ if m is None:
63
+ print "Bad dep: %s" % dep
64
+ time.sleep(3)
65
+ elif m.groups()[1] is None:
66
+ name, cond, version = m.groups()[0], ">=", 0
67
+ else:
68
+ name, cond, version = m.groups()
69
+ # end if
70
+
71
+ final_deps.append("%s %s %s" % (name, cond, version))
72
+ # end for i in dependencies
73
+
74
+ data["dependencies"] = final_deps
75
+
76
+ #print json.dumps(data, indent=2)
77
+ print json.dumps(data, indent=2)
78
+ # def run
79
+ # class list_dependencies
@@ -0,0 +1,102 @@
1
+ require "fpm/namespace"
2
+ require "fpm/source"
3
+ require "rubygems/package"
4
+ require "rubygems"
5
+ require "fileutils"
6
+ require "tmpdir"
7
+ require "json"
8
+
9
+ class FPM::Source::Python < FPM::Source
10
+ def get_source(params)
11
+ package = @paths.first
12
+ if ["setup.py", "."].include?(package)
13
+ # Assume we're building from an existing python package.
14
+ # Source already acquired, nothing to do!
15
+ return
16
+ end
17
+
18
+ if !File.exists?(package)
19
+ download(package, params[:version])
20
+ else
21
+ @paths = [ File.expand_path(package) ]
22
+ end
23
+ end # def get_source
24
+
25
+ def download(package, version=nil)
26
+ puts "Trying to download #{package} (using easy_install)"
27
+ @tmpdir = ::Dir.mktmpdir("python-build", ::Dir.pwd)
28
+
29
+ if version.nil?
30
+ want_pkg = "#{package}"
31
+ else
32
+ want_pkg = "#{package}==#{version}"
33
+ end
34
+ system("easy_install", "--editable", "--build-directory", @tmpdir, want_pkg)
35
+
36
+ # easy_install will put stuff in @tmpdir/packagename/, flatten that.
37
+ # That is, we want @tmpdir/setup.py, and start with
38
+ # @tmpdir/somepackage/setup.py
39
+ dirs = ::Dir.glob(File.join(@tmpdir, "*"))
40
+ if dirs.length != 1
41
+ raise "Unexpected directory layout after easy_install. Maybe file a bug? The directory is #{@tmpdir}"
42
+ end
43
+ @paths = dirs
44
+ end # def download
45
+
46
+ def get_metadata
47
+ setup_py = @paths.first
48
+ if File.directory?(setup_py)
49
+ setup_py = File.join(setup_py, "setup.py")
50
+ @paths = [setup_py]
51
+ end
52
+
53
+ if !File.exists?(setup_py)
54
+ raise "Unable to find python package; tried #{setup_py}"
55
+ end
56
+
57
+ pylib = File.expand_path(File.dirname(__FILE__))
58
+ setup_cmd = "env PYTHONPATH=#{pylib} python #{setup_py} --command-packages=pyfpm get_metadata"
59
+ output = ::Dir.chdir(File.dirname(setup_py)) { `#{setup_cmd}` }
60
+ puts output
61
+ metadata = JSON.parse(output[/\{.*\}/msx])
62
+ #p metadata
63
+
64
+ self[:architecture] = metadata["architecture"]
65
+ self[:description] = metadata["description"]
66
+ self[:license] = metadata["license"]
67
+ self[:version] = metadata["version"]
68
+ self[:name] = "python#{self[:suffix]}-#{metadata["name"]}"
69
+ self[:url] = metadata["url"]
70
+
71
+ self[:dependencies] = metadata["dependencies"].collect do |dep|
72
+ name, cmp, version = dep.split
73
+ "python#{self[:suffix]}-#{name} #{cmp} #{version}"
74
+ end
75
+ end # def get_metadata
76
+
77
+ def make_tarball!(tar_path, builddir)
78
+ setup_py = @paths.first
79
+ dir = File.dirname(setup_py)
80
+
81
+ # Some setup.py's assume $PWD == current directory of setup.py, so let's
82
+ # chdir first.
83
+ ::Dir.chdir(dir) do
84
+ system("python", "setup.py", "bdist")
85
+ end
86
+
87
+ dist_tar = ::Dir.glob(File.join(dir, "dist", "*.tar.gz")).first
88
+ puts "Found dist tar: #{dist_tar}"
89
+ puts "Copying to #{tar_path}"
90
+
91
+ @paths = [ "." ]
92
+
93
+ system("cp", dist_tar, "#{tar_path}.gz")
94
+ end # def make_tarball!
95
+
96
+ def garbage
97
+ trash = []
98
+ trash << @tmpdir if @tmpdir
99
+ return trash
100
+ end # def garbage
101
+
102
+ end # class FPM::Source::Gem
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fpm
3
3
  version: !ruby/object:Gem::Version
4
- hash: 57
4
+ hash: 39
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 23
10
- version: 0.2.23
9
+ - 24
10
+ version: 0.2.24
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jordan Sissel
@@ -51,9 +51,14 @@ files:
51
51
  - lib/fpm/namespace.rb
52
52
  - lib/fpm/source.rb
53
53
  - lib/fpm/rubyfixes.rb
54
+ - lib/fpm/source/python.rb
54
55
  - lib/fpm/source/npm.rb
55
56
  - lib/fpm/source/dir.rb
56
57
  - lib/fpm/source/rpm.rb
58
+ - lib/fpm/source/pyfpm/__init__.pyc
59
+ - lib/fpm/source/pyfpm/get_metadata.pyc
60
+ - lib/fpm/source/pyfpm/get_metadata.py
61
+ - lib/fpm/source/pyfpm/__init__.py
57
62
  - lib/fpm/source/gem.rb
58
63
  - lib/fpm/target/deb.rb
59
64
  - lib/fpm/target/rpm.rb