Skip to content
Snippets Groups Projects
  • Sybren A. Stüvel's avatar
    533cf9ab
    Added 'EXR sequence to JPEG' command · 533cf9ab
    Sybren A. Stüvel authored
    This is used for generating JPEG previews of EXR files. It is assumed that
    the EXR files are named '######.exr', with any number of leading zeroes.
    
    Gaps in the frame range are supported, and will be rendered as black
    images.
    533cf9ab
    History
    Added 'EXR sequence to JPEG' command
    Sybren A. Stüvel authored
    This is used for generating JPEG previews of EXR files. It is assumed that
    the EXR files are named '######.exr', with any number of leading zeroes.
    
    Gaps in the frame range are supported, and will be rendered as black
    images.
setup.py 3.78 KiB
#!/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.3-dev0',
        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',
        ],
        entry_points={'console_scripts': [
            'flamenco-worker = flamenco_worker.cli:main',
        ]},
        zip_safe=False,  # due to the bundled merge-exr.blend file.
    )