Source code for dktasklib.package.package_interface
# -*- coding: utf-8 -*-
import json
# import pprint
from ConfigParser import RawConfigParser
import invoke
from dkfileutils.pfind import pfind as _pfind
from dkfileutils.path import Path
# from dkfileutils.changed import Directory
from invoke.config import Config
from dkpkg import Package as DKPKGPackage
[docs]def pfind(path, *fnames):
res = _pfind(path, *fnames)
return Path(res) if res is not None else None
[docs]class Package(DKPKGPackage):
overridables = DKPKGPackage.KEYS | {'version'}
[docs] def overrides(self, **res):
setup_py = pfind('.', 'setup.py')
if setup_py:
root = setup_py.dirname()
with root.abspath().cd():
res['version'] = self.ctx.run(
'python setup.py --version',
hide=True
).stdout.strip()
res.update(self._read_dkbuild_ini())
package_json = pfind('.', 'package.json')
if package_json:
# root = package_json.dirname()
with open(package_json, 'rb') as fp:
pj = json.load(fp)
for k, v in pj.items():
if k in Package.overridables:
res[k] = v
return res
def _read_dkbuild_ini(self):
dkbuild_ini = pfind('.', 'dkbuild.ini')
if not dkbuild_ini:
return {}
cp = RawConfigParser()
cp.read(dkbuild_ini)
return dict((k, v) for k, v in cp.items('dkbuild')
if k in Package.overridables)
def __init__(self, ctx=None):
self.ctx = ctx or invoke.Context()
pkgdir = pfind('.',
'setup.py',
'dkbuild.ini',
'package.json')
if pkgdir is None:
raise IOError("Didn't find setup.py|dkbuild.ini|package.json in "
"any parent directory up to, and including root.")
root = pkgdir.dirname()
ispkg = 'setup.py' in root
overrides = self.overrides() if ispkg else self.overrides(source=root)
super(Package, self).__init__(root, **overrides)
# invoke'ism?
[docs] def config(self): # pragma: nocover
cfg = Config(dict(iter(self)))
cfg.name = self.name
cfg.root = self.root
cfg.source = self.source
cfg.docs = self.docs
cfg.django_static = self.django_static
return cfg
def __repr__(self):
return self.__class__.__name__
# return pprint.pformat(self.config())
def __getitem__(self, key):
try:
return getattr(self, key)
except AttributeError as e:
raise KeyError(str(e))
[docs] def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
def __iter__(self):
return iter([])