Skip to content

Commit

Permalink
Added support for wheels
Browse files Browse the repository at this point in the history
  • Loading branch information
tgross committed Feb 12, 2014
1 parent 625b729 commit bb9b15c
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 13 deletions.
37 changes: 28 additions & 9 deletions libpip2pi/commands.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import re
import sys
import cgi
import shutil
Expand Down Expand Up @@ -42,10 +43,16 @@ def file_to_package(file, basedir=None):
('foo', '1.2.3-rc1.tar.gz')
>>> file_to_package("foo-bar-1.2.tgz")
('foo-bar', '1.2.tgz')
>>> file_to_package("foo-bar-1.2-py27-none-any.whl")
('foo-bar', '1.2-py27-none-any.whl')
>>> """
if os.path.splitext(file)[1].lower() == ".egg":
return egg_to_package(file)
split = file.rsplit("-", 1)

if os.path.splitext(file)[1].lower() == ".whl":
split = list(re.match(r'^(.*)\-(.*\-.*\-.*\-.*\.whl)$', file).groups())
else:
split = file.rsplit("-", 1)
if len(split) != 2:
msg = "unexpected file name: %r " %(file, )
msg += "(not in 'pkg-name-version.xxx' format"
Expand All @@ -55,8 +62,8 @@ def file_to_package(file, basedir=None):
raise ValueError(msg)
return (split[0], pkg_resources.safe_name(split[1]))

def archive_pip_packages(path, package_cmds):
pip_args = ["install", "-d", path] + package_cmds
def archive_pip_packages(pip_args, path, package_cmds):
pip_args = pip_args + [path] + package_cmds
try:
import pip
except ImportError:
Expand All @@ -76,6 +83,7 @@ def archive_pip_packages(path, package_cmds):
%(version, ))
pip.main(pip_args)


def dir2pi(argv=sys.argv):
if len(argv) != 2:
print(dedent("""
Expand Down Expand Up @@ -146,29 +154,40 @@ def dir2pi(argv=sys.argv):

@maintain_cwd
def pip2tgz(argv=sys.argv):
return pip2archive(argv)

@maintain_cwd
def pip2whl(argv=sys.argv):
return pip2archive(argv, use_wheels=True)

def pip2archive(argv, use_wheels=False):
cmd_name = 'pip2whl' if use_wheels else 'pip2tgz'
glob_test = './*.whl' if use_wheels else './*.tar.*'
pip_cmd = ['wheel', '--wheel-dir'] if use_wheels else ['install', '-d']

if len(argv) < 3:
print(dedent("""
usage: pip2tgz OUTPUT_DIRECTORY PACKAGE_NAME ...
usage: {0} OUTPUT_DIRECTORY PACKAGE_NAME ...
Where PACKAGE_NAMES are any names accepted by pip (ex, `foo`,
`foo==1.2`, `-r requirements.txt`).
pip2tgz will download all packages required to install PACKAGE_NAMES and
{0} will download all packages required to install PACKAGE_NAMES and
save them to sanely-named tarballs in OUTPUT_DIRECTORY.
For example:
$ pip2tgz /var/www/packages/ -r requirements.txt foo==1.2 baz/
"""))
$ {0} /var/www/packages/ -r requirements.txt foo==1.2 baz/
""".format(cmd_name)))
return 1

outdir = os.path.abspath(argv[1])
if not os.path.exists(outdir):
os.mkdir(outdir)

archive_pip_packages(outdir, argv[2:])
archive_pip_packages(pip_cmd, outdir, argv[2:])
os.chdir(outdir)
num_pakages = len(glob.glob('./*.tar.*'))
num_pakages = len(glob.glob(glob_test))

print("\nDone. %s archives currently saved in %r." %(num_pakages, argv[1]))
return 0
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
'dir2pi = libpip2pi.commands:dir2pi',
'pip2pi = libpip2pi.commands:pip2pi',
'pip2tgz = libpip2pi.commands:pip2tgz',
'pip2whl = libpip2pi.commands:pip2whl',
],
},
install_requires=[
Expand Down
17 changes: 13 additions & 4 deletions tests/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,18 +107,18 @@ class BackgroundIt(threading.Thread):
server = None
def run(self):
self.server.serve_forever()

class ThreadingServer(ThreadingMixIn, HTTPServer):
pass

@classmethod
def setUpClass(cls):
cls._server_thread = cls.BackgroundIt()
cls.server = cls.ThreadingServer(("127.0.0.1", cls.SERVER_PORT),
Pip2PiRequestHandler)
cls._server_thread.server = cls.server
cls._server_thread.start()

@classmethod
def tearDownClass(cls):
cls.server.shutdown()
Expand All @@ -133,7 +133,7 @@ def tearDown(self):
shutil.rmtree(self._temp_dir)

def assertDirsEqual(self, a, b):
res = subprocess.call(["diff", "-x", "*.tar.gz", "-r", a, b])
res = subprocess.call(["diff", "-x", "*", "-r", a, b])
if res:
with chdir(a):
print("1st directory:", a)
Expand Down Expand Up @@ -172,5 +172,14 @@ def test_eggs_in_packages(self):
self.exc("dir2pi", [self.temp_dir])
self.assertDirsEqual("test_eggs_in_packages/", self.temp_dir)

def test_wheels(self):
res = self.exc("pip2whl", [
self.temp_dir,
self.index_url,
"-r", "test_wheels/requirements.txt",
])
self.assertEqual(res, 0)
self.assertDirsEqual('test_wheels/expected/', self.temp_dir)

if __name__ == "__main__":
unittest.main()
Binary file not shown.
1 change: 1 addition & 0 deletions tests/test_wheels/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fish

0 comments on commit bb9b15c

Please sign in to comment.