Mercurial > hg > PaInt
annotate paint/package.py @ 17:e74fc40e1f64
interpolate string
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Fri, 24 Feb 2012 16:05:07 -0800 |
| parents | e6cdc58fc4f5 |
| children | 4c4d1e194bf7 |
| rev | line source |
|---|---|
| 4 | 1 """ |
| 2 package model for python PAckage INTrospection | |
| 3 """ | |
| 4 | |
| 7 | 5 import os |
|
9
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
6 import shutil |
| 7 | 7 import tarfile |
| 5 | 8 import tempfile |
| 7 | 9 import urllib2 |
| 10 import utils | |
| 5 | 11 |
| 10 | 12 __all__ = ['Package'] |
| 13 | |
| 4 | 14 class Package(object): |
| 7 | 15 # XXX much of this is generic resource stuff and should be split off |
| 4 | 16 |
| 17 def __init__(self, src): | |
| 18 self.src = src | |
|
13
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
19 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
20 # ephemeral data |
| 5 | 21 self._tmppath = None |
|
13
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
22 self._egg_info = None |
| 5 | 23 |
| 24 def path(self): | |
| 25 """filesystem path to package""" | |
| 7 | 26 |
| 27 # return cached copy if it exists | |
| 28 if self._tmppath: | |
| 29 return self._tmppath | |
| 30 | |
| 31 # fetch from the web if a URL | |
| 32 tmpfile = None | |
| 33 src = self.src | |
| 5 | 34 if utils.isURL(self.src): |
| 8 | 35 tmpfile = src = self.fetch() |
| 7 | 36 |
| 37 # unpack if an archive | |
| 38 if self.is_archive(src): | |
| 8 | 39 try: |
| 40 self.unpack(src) | |
| 41 finally: | |
| 42 if tmpfile: | |
| 43 os.remove(tmpfile) | |
| 7 | 44 return self._tmppath |
| 45 | |
| 5 | 46 return self.src |
| 47 | |
| 48 def fetch(self): | |
| 8 | 49 """fetch from remote source to a temporary file""" |
|
15
8c8b7482772f
fix a few failures but still failing
Jeff Hammel <jhammel@mozilla.com>
parents:
14
diff
changeset
|
50 resource = urllib2.urlopen(self.src) |
| 11 | 51 fd, filename = tempfile.mkstemp() |
| 7 | 52 os.write(fd, resource.read()) |
| 53 os.close(fd) | |
| 54 return filename | |
| 55 | |
| 56 def unpack(self, archive): | |
| 57 """unpack the archive to a temporary destination""" | |
| 58 # TODO: should handle zipfile additionally at least | |
| 59 # Ideally, this would be pluggable, etc | |
| 8 | 60 assert tarfile.is_tarfile(archive), "%s is not an archive" % self.src |
|
9
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
61 tf = tarfile.TarFile.open(archive) |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
62 self._tmppath = tempfile.mkdtemp() |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
63 tf.extractall(path=self._tmppath) |
| 7 | 64 |
| 65 def is_archive(self, path): | |
| 66 """returns if the filesystem path is an archive""" | |
| 67 # TODO: should handle zipfile additionally at least | |
| 68 # Ideally, this would be pluggable, etc | |
| 69 return tarfile.is_tarfile(path) | |
|
9
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
70 |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
71 def cleanup(self): |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
72 if self._tmppath: |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
73 shutil.rmtree(self._tmppath) |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
74 self._tmppath = None |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
75 |
|
562230cc2e86
now the package class should at least extracts things. it doesnt actually do anything useful
Jeff Hammel <jhammel@mozilla.com>
parents:
8
diff
changeset
|
76 __del__ = cleanup |
| 11 | 77 |
|
13
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
78 ### python-package-specific functionality |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
79 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
80 def egg_info(self): |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
81 """build the egg_info directory""" |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
82 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
83 if self._egg_info: |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
84 # return cached copy |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
85 return self._egg_info |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
86 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
87 directory = self.path() |
| 16 | 88 setup_py = os.path.join(directory, 'setup.py') |
| 89 if not os.path.exists(setup_py): | |
| 17 | 90 raise AssertionError("%s does not exist" % setup_py) |
| 11 | 91 |
|
13
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
92 # setup the egg info |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
93 call([sys.executable, 'setup.py', 'egg_info'], cwd=directory, stdout=PIPE) |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
94 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
95 # get the .egg-info directory |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
96 egg_info = [i for i in os.listdir(directory) |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
97 if i.endswith('.egg-info')] |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
98 assert len(egg_info) == 1, 'Expected one .egg-info directory in %s, got: %s' % (directory, egg_info) |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
99 egg_info = os.path.join(directory, egg_info[0]) |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
100 assert os.path.isdir(egg_info), "%s is not a directory" % egg_info |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
101 |
|
14
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
102 # cache it |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
103 self._egg_info = egg_info |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
104 return self._egg_info |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
105 |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
106 def info(self): |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
107 """return info dictionary for package""" |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
108 # could use pkginfo |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
109 |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
110 egg_info = self.egg_info() |
|
13
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
111 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
112 # read the package information |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
113 pkg_info = os.path.join(egg_info, 'PKG-INFO') |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
114 info_dict = {} |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
115 for line in file(pkg_info).readlines(): |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
116 if not line or line[0].isspace(): |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
117 continue # XXX neglects description |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
118 assert ':' in line |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
119 key, value = [i.strip() for i in line.split(':', 1)] |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
120 info_dict[key] = value |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
121 |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
122 # return the information |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
123 return info_dict['Name'], dependencies |
|
0dd1f8f83be2
moving towards some sort of organization
Jeff Hammel <jhammel@mozilla.com>
parents:
12
diff
changeset
|
124 |
| 11 | 125 def dependencies(self): |
|
14
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
126 """return the dependencies""" |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
127 |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
128 egg_info = self.egg_info() |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
129 |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
130 # read the dependencies |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
131 requires = os.path.join(egg_info, 'requires.txt') |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
132 if os.path.exists(requires): |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
133 dependencies = [i.strip() for i in file(requires).readlines() if i.strip()] |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
134 else: |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
135 dependencies = [] |
|
6d27c2136163
a decent structure; need to reuse more
Jeff Hammel <jhammel@mozilla.com>
parents:
13
diff
changeset
|
136 |
