#!/usr/bin/env python from pathlib import Path import collections import hashlib import setuptools import sys import zipfile from distutils.cmd import Command from distutils.errors import DistutilsOptionError from distutils import dir_util, log sys.dont_write_bytecode = True # noinspection PyAttributeOutsideInit class ZipCommand(Command): """Ensures that 'setup.py dist' creates a zip file with a wheel and other useful stuff.""" description = "create a zip with a wheel and other useful files" user_options = [ ("dist-dir=", "d", "directory to put the archive in " "[default: dist]"), ] def initialize_options(self): self.dist_dir = None def finalize_options(self): if self.dist_dir is None: self.dist_dir = "dist" def run(self): self.run_command("bdist_wheel") if not self.distribution.dist_files: msg = "No dist file created, even though we ran 'bdist_wheel' ourselves." raise DistutilsOptionError(msg) base_dir = Path(self.distribution.get_fullname()) zip_base = Path(self.dist_dir) / base_dir zip_name = zip_base.with_name(zip_base.name + ".zip") log.info("Creating ZIP file %s", zip_name) with zipfile.ZipFile(str(zip_name), mode="w") as archive: def add_to_root(fname: Path): log.info(" adding %s", fname.name) archive.write(str(fname), fname.name) for command, pyversion, filename in self.distribution.dist_files: add_to_root(Path(filename)) add_to_root(Path("flamenco-worker.cfg")) add_to_root(Path("LICENSE.txt")) add_to_root(Path("README.md")) add_to_root(Path("CHANGELOG.md")) add_to_root(Path("flamenco_worker/resources/merge-exr.blend")) add_to_root(Path("flamenco_worker/resources/exr_sequence_to_jpeg.py")) paths = collections.deque([Path("system-integration")]) while paths: this_path = paths.popleft() if this_path.is_dir(): paths.extend(this_path.iterdir()) continue log.info(" adding %s", this_path) archive.write(str(this_path), str(this_path)) # Compute SHA256 checksum of the produced zip file. hasher = hashlib.sha256() blocksize = 65536 with zip_name.open(mode="rb") as infile: buf = infile.read(blocksize) while len(buf) > 0: hasher.update(buf) buf = infile.read(blocksize) checksum_path = zip_name.with_suffix(".sha256") log.info("Writing SHA256 checksum to %s", checksum_path) with checksum_path.open(mode="w") as shafile: print("%s %s" % (hasher.hexdigest(), zip_name.name), file=shafile) if __name__ == "__main__": setuptools.setup( cmdclass={"zip": ZipCommand}, name="flamenco-worker", version="2.6", description="Flamenco Worker implementation", author="Sybren A. Stüvel", author_email="sybren@blender.studio", packages=setuptools.find_packages(), data_files=[("flamenco_worker", ["README.md", "LICENSE.txt", "CHANGELOG.md"])], license="GPL", classifiers=[ "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.7", ], package_data={"flamenco_worker": ["merge-exr.blend"]}, install_requires=[ "attrs >=16.3.0", "requests>=2.12.4", "pyjwt>=1.7.1", ], entry_points={ "console_scripts": [ "flamenco-worker = flamenco_worker.cli:main", ] }, zip_safe=False, # due to the bundled merge-exr.blend file. )