PK'\Fgumby_elf/__init__.pyPK'\F v v gumby_elf/cli.pyfrom os import path, mkdir from subprocess import call from glob import glob from setuptools_scm import get_version import click from . import config from . import packing @click.group() @click.pass_context @click.option( '--root', type=click.Path(dir_okay=True, file_okay=False, resolve_path=True), default='.') def main(ctx, root): ctx.obj = config.read_specification(root) ctx.obj.version = get_version() if not path.isdir('dist'): mkdir('dist') @main.command() @click.pass_context def develop(ctx): version = ctx.invoke(build_wheel, develop=True) ctx.invoke(install_wheel, force_version=version, extras='dev') @main.command() def lint(): call(['flake8', 'src', 'testing'] + glob('*.py')) @main.command() @click.pass_context def install(ctx): version = ctx.invoke(build_wheel, develop=false) ctx.invoke(install_wheel, force_version=version) @main.command() @click.pass_obj @click.option('--develop', is_flag=True) def build_wheel(obj, develop): if develop: packing.build_develop_wheel(obj, 'dist') return packing.develop_version(obj.version) else: packing.build_wheel(obj, 'dist') return obj.version @main.command() @click.pass_obj def build_sdist(obj): click.secho("Missing sdist build", fg='red', bold=True) @main.command() @click.pass_obj @click.option('--force-version') @click.option('--extras', default=None) def install_wheel(obj, force_version, extras): packagename = '{name}{extras}==={version}'.format( name=obj.name, version=force_version, extras='' if extras is None else '[%s]' % extras ) click.secho('reinstalling ' + packagename, bold=True) call(['pip', 'uninstall', packagename, '-yq']) call([ 'pip', 'install', packagename, '--find-links', 'dist', '-q']) @main.command() @click.pass_context def dist(ctx): return [ packing.build_wheel(ctx.obj, 'dist'), #ctx.invoke(build_sdist), ] @main.command() @click.pass_context @click.option('--repository', default='pypi') def publish(ctx, repository): files = ctx.invoke(dist) from twine.commands.upload import upload upload( dists=files, repository=repository, sign=False, identity=None, username=None, password=None, comment='', sign_with=None, ) PK'\FkD||gumby_elf/config.pyimport os def read_specification(root): joined = os.path.join(root, 'gumby_elf.ll.ini') if os.path.exists(joined): with open(joined) as fp: return GumbyLowlevelIniSpecification(fp) assert 0 class Specification(object): def __init__(self, fp): self.filename = fp.name with fp: self.deserialize(fp) def deserialize(self, fp): raise NotImplementedError('deserialize') class PackageJSonSpecification(Specification): def deserialize(self, fp): self.data = json.load(fp)['python package'] def __getitem__(self, key): return self.data[key] def get(self, key, default=None): return self.data.get(key, default) class GumbyLowlevelIniSpecification(Specification): _metadata = None def deserialize(self, fp): try: from configparser import ConfigParser except ImportError: from ConfigParser import ConfigParser self.parser = ConfigParser() self.parser.readfp(fp) @property def name(self): return self.metadata['Name'] @property def package(self): return self.parser.get('gumby_elf', 'package') @property def metadata(self): if self._metadata is None: metadata_file = self.parser.get("gumby_elf", 'metadata_base') import email with open(metadata_file) as fp: self._metadata = email.message_from_file(fp) return self._metadata def get_requires(self): return [ x for x in self.metadata.get_all('requires-dist') if ';' not in x ] PK'\F2ogumby_elf/metadata.pyfrom collections import namedtuple class EntryPoint(namedtuple('EntryPoint', 'name entry extras')): def __str__(self): return "{self.name} = {self.entry} {self.extras}".format(self=self) class EntryPoints(object): def __init__(self): self.listings = {} @classmethod def from_spec_dict(cls, data): self = cls() data = data.get('entrypoints', data) for name, mapping in data.items(): items = self.listings[name] = [] for entry_name, entry_str in mapping.items(): items.append(EntryPoint( name=entry_name, entry=entry_str, extras='', )) return self def to_11_metadata(self): res = [] for name, listing in self.listings.items(): res.append('[{}]'.format(name)) for item in listing: res.append(str(item).strip()) return '\n'.join(res) class WheelInfo(object): def __init__(self, wheel_version, tags, root_purelib): self.wheel_version = wheel_version self.tags = tags self.root_purelib = root_purelib @classmethod def default(cls): return cls( wheel_version='1.0', tags=[ 'py27-none-any', 'py3-none-any', ], root_purelib=True, ) def __str__(self): res = [ 'Wheel-Version: {wv}'.format(wv=self.wheel_version), 'Generator: gumby_elf pre alpha', 'Root-Is-Purelib: {rp}'.format( rp='true' if self.root_purelib else 'false'), ] for tag in self.tags: res.append( 'Tag: {tag}'.format(tag=tag) ) return '\n'.join(res) PK'\F0#gumby_elf/bootstrap_template.py.txt# development script generated by gumby elf import os __path__ = [{srcfolder!r}] __file__ = os.path.join({srcfolder!r}, '__init__.py') del os with open(__file__) as fp: __code = compile(fp.read(), __file__, 'exec') exec(__code, globals(), globals()) PK'\Fu-gumby_elf/packing.pyimport os.path import zipfile import pkgutil import hashlib import base64 from .mkwheel import ( WheelBuilder, wheel_name, finalize_whl_metadata, write_src_to_whl, ) def develop_version(version): spec_char = '.' if '+' in version else '+' return version + spec_char + "gumby.develop" def build_wheel(spec, distdir): target_filename = wheel_name(distdir, spec, version=spec.version) bld = WheelBuilder(target_filename) write_src_to_whl(bld, spec) finalize_whl_metadata(bld, spec, version=spec.version) return target_filename def bootstraper(spec): fn = os.path.abspath(spec.filename) srcdir = os.path.join(os.path.dirname(fn), 'src') template = pkgutil.get_data(__name__, 'bootstrap_template.py.txt') return template.format(srcfolder=srcdir) def build_develop_wheel(spec, distdir): version = develop_version(spec.version) target_filename = wheel_name(distdir, spec, version=version) bld = WheelBuilder(target_filename) bld.add_file( name=spec.package + '.py', data=bootstraper(spec), ) finalize_whl_metadata(bld, spec, version=version) return target_filename PK'\F gumby_elf/mkwheel.pyfrom os import path, walk from zipfile import ZipFile from base64 import urlsafe_b64encode from hashlib import sha1 from .metadata import EntryPoints, WheelInfo WHEEL_FMT = '{spec.name}-{version}-py27.py3-none-any.whl' DISTINFO_FMT = '{spec.name}-{version}.dist-info' def wheel_name(dist, spec, version): filename = WHEEL_FMT.format(spec=spec, version=version) return path.join(dist, filename) def record_hash(data): digest = sha1(data).digest() return 'sha1=' + urlsafe_b64encode(digest) def entrypoints_11(spec): with open(spec.parser.get('gumby_elf', 'entry_points')) as fp: return fp.read() class WheelBuilder(object): def __init__(self, target): self.archive = ZipFile(target, 'w') self.record = [] def add_file(self, name, data): assert getattr(self, 'record', None) is not None self.record.append((name, record_hash(data))) self.archive.writestr(name, data) def finalize(self, record_filename): self.record.append((record_filename, '')) self.archive.writestr(record_filename, '\n'.join( ','.join(x) for x in self.record)) del self.record self.archive.close() def finalize_whl_metadata(builder, spec, version): distinfo_folder = DISTINFO_FMT.format( spec=spec, version=version) builder.add_file( path.join(distinfo_folder, 'METADATA'), metadata_11(spec, version), ) builder.add_file( path.join(distinfo_folder, 'entry_points.txt'), entrypoints_11(spec), ) builder.add_file( path.join(distinfo_folder, 'WHEEL'), str(WheelInfo.default()), ) builder.finalize(path.join(distinfo_folder, 'RECORD')) def write_src_to_whl(builder, spec): for folder, dirs, files in walk('src'): targetfolder = spec.package + folder[3:] for file_name in files: if file_name[-4:] in ('.pyc', '.pyo'): continue with open(path.join(folder, file_name)) as fp: content = fp.read() builder.add_file( name=path.join(targetfolder, file_name), data=content, ) def metadata_11(spec, version): # XXX: better pathhandling # XXX: incomplete assert spec.metadata from email.generator import Generator spec.metadata['Version'] = version from io import BytesIO io = BytesIO() Generator(io).flatten(spec.metadata) return io.getvalue() PK'\FXn!GumbyElf-0.0.2.dist-info/METADATAMetadata-Version: 2.0 Name: GumbyElf Summary: Developer faced Python Package Packager Home-page: http://bitbucket.org/RonnyPfannschmidt/gumby_elf Author: Ronny Pfannschmidt Author-email: opensource+gumby_elf@ronnypfannschmidt.de License: MIT Keywords: wheel,packaging Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Requires-Dist: click Requires-Dist: setuptools Requires-Dist: setuptools_scm Requires-Dist: wheel Requires-Dist: pip Requires-Dist: flake8 Requires-Dist: characteristic Requires-Dist: twine Provides-Extra: dev Requires-Dist: pytest; extra == 'dev' Requires-Dist: tox; extra == 'dev' Requires-Dist: bpython; extra == 'dev' Requires-Dist: pdbpp; extra == 'dev' Version: 0.0.2 PK'\Fޡ11)GumbyElf-0.0.2.dist-info/entry_points.txt[console_scripts] gumby_elf = gumby_elf.cli:main PK'\FllGumbyElf-0.0.2.dist-info/WHEELWheel-Version: 1.0 Generator: gumby_elf pre alpha Root-Is-Purelib: true Tag: py27-none-any Tag: py3-none-anyPK'\Flox~~GumbyElf-0.0.2.dist-info/RECORDgumby_elf/__init__.py,sha1=2jmj7l5rSw0yVb_vlWAYkK_YBwk= gumby_elf/cli.py,sha1=8ZOrwAGxPMZUp_S_E0A05ETGbbc= gumby_elf/config.py,sha1=vvrTBtTWfJzq4axcI1R-aOKMtog= gumby_elf/metadata.py,sha1=8Lb6mf7xbV4RRq6BSOiFxsQyYiE= gumby_elf/bootstrap_template.py.txt,sha1=zUMAp9EDQTyQcuBo_J2tkdVZQqE= gumby_elf/packing.py,sha1=cSmyRt4lKYA4-WQI0nVTRFV-gIw= gumby_elf/mkwheel.py,sha1=icFTNVnyIWMsC3JB9DpPy7267m0= GumbyElf-0.0.2.dist-info/METADATA,sha1=8yAMvhTDv56dSnZ4e0r0I6ecGTY= GumbyElf-0.0.2.dist-info/entry_points.txt,sha1=xyzjZgB5RBUGHO-HmOty5AU4sfM= GumbyElf-0.0.2.dist-info/WHEEL,sha1=0A5Ktoew09YMyQou9nlYR_1k7zs= GumbyElf-0.0.2.dist-info/RECORD,PK'\Fgumby_elf/__init__.pyPK'\F v v 3gumby_elf/cli.pyPK'\FkD|| gumby_elf/config.pyPK'\F2ogumby_elf/metadata.pyPK'\F0#gumby_elf/bootstrap_template.py.txtPK'\Fu-gumby_elf/packing.pyPK'\F gumby_elf/mkwheel.pyPK'\FXn!'GumbyElf-0.0.2.dist-info/METADATAPK'\Fޡ11)+GumbyElf-0.0.2.dist-info/entry_points.txtPK'\Flls,GumbyElf-0.0.2.dist-info/WHEELPK'\Flox~~-GumbyElf-0.0.2.dist-info/RECORDPK /