Mercurial > hg > PaInt
comparison paint/info.py @ 58:13767ee2ddf4
start adding an egg_info based information thingy
| author | Jeff Hammel <jhammel@mozilla.com> |
|---|---|
| date | Wed, 23 Jan 2013 16:59:36 -0800 |
| parents | d5e5c7496784 |
| children | acee5e882768 |
comparison
equal
deleted
inserted
replaced
| 57:d5e5c7496784 | 58:13767ee2ddf4 |
|---|---|
| 2 interfaces to get information from a package | 2 interfaces to get information from a package |
| 3 """ | 3 """ |
| 4 | 4 |
| 5 import imp | 5 import imp |
| 6 import os | 6 import os |
| 7 import subprocess | |
| 7 import sys | 8 import sys |
| 8 | 9 |
| 9 from subprocess import check_call as call | 10 from subprocess import check_call as call |
| 10 | 11 |
| 11 class PackageInfo(object): | 12 class PackageInfo(object): |
| 48 """ | 49 """ |
| 49 use `python setup.py egg_info` to gather package information | 50 use `python setup.py egg_info` to gather package information |
| 50 """ | 51 """ |
| 51 | 52 |
| 52 def __call__(self): | 53 def __call__(self): |
| 53 raise NotImplementedError("TODO") | 54 |
| 55 info = self.read_pkg_info(self._pkg_info()) | |
| 56 # TODO: install_requires | |
| 57 return info | |
| 58 | |
| 59 @classmethod | |
| 60 def read_pkg_info(cls, path): | |
| 61 """reads PKG-INFO and returns a dict""" | |
| 62 | |
| 63 # read the package information | |
| 64 info_dict = {} | |
| 65 for line in file(path).readlines(): | |
| 66 if not line or line[0].isspace(): | |
| 67 continue # XXX neglects description | |
| 68 assert ':' in line | |
| 69 key, value = [i.strip() for i in line.split(':', 1)] | |
| 70 info_dict[key] = value | |
| 71 | |
| 72 # return the information | |
| 73 return info_dict | |
| 54 | 74 |
| 55 def _egg_info(self): | 75 def _egg_info(self): |
| 56 """build the egg_info directory""" | 76 """build the egg_info directory""" |
| 57 | 77 |
| 58 if self._egg_info_path: | 78 if self._egg_info_path: |
| 59 return self._egg_info_path | 79 return self._egg_info_path |
| 60 | 80 |
| 61 raise NotImplementedError("TODO") | 81 directory = os.path.dirname(self.setup_py) |
| 82 | |
| 83 # setup the egg info | |
| 84 try: | |
| 85 call([sys.executable, 'setup.py', 'egg_info'], cwd=directory, stdout=subprocess.PIPE) | |
| 86 except Exception: | |
| 87 print "Failure to generate egg_info: %s" % self.setup_py | |
| 88 raise | |
| 89 | |
| 90 # get the .egg-info directory | |
| 91 egg_info = [i for i in os.listdir(directory) | |
| 92 if i.endswith('.egg-info')] | |
| 93 assert len(egg_info) == 1, 'Expected one .egg-info directory in %s, got: %s' % (directory, egg_info) | |
| 94 egg_info = os.path.join(directory, egg_info[0]) | |
| 95 assert os.path.isdir(egg_info), "%s is not a directory" % egg_info | |
| 96 | |
| 97 # cache it | |
| 98 self._egg_info_path = egg_info | |
| 99 return self._egg_info_path | |
| 100 | |
| 101 def _pkg_info(self): | |
| 102 """returns path to PKG-INFO file""" | |
| 103 | |
| 104 if self._pkg_info_path: | |
| 105 # return cached value | |
| 106 return self._pkg_info_path | |
| 107 | |
| 108 try: | |
| 109 egg_info = self._egg_info() | |
| 110 except Exception, exception: | |
| 111 # try to get the package info from a file | |
| 112 path = os.path.dirname(self.setup_py) | |
| 113 pkg_info = os.path.join(path, 'PKG-INFO') | |
| 114 if os.path.exists(pkg_info): | |
| 115 self._pkg_info_path = pkg_info | |
| 116 return self._pkg_info_path | |
| 117 raise Exception("Cannot find or generate PKG-INFO") | |
| 118 | |
| 119 pkg_info = os.path.join(egg_info, 'PKG-INFO') | |
| 120 assert os.path.exists(pkg_info) | |
| 121 self._pkg_info_path = pkg_info | |
| 122 return self._pkg_info_path | |
| 123 |
