From e20b7544984038d671eaf5d94acb184d50651cc3 Mon Sep 17 00:00:00 2001 From: Eeshan Garg Date: Mon, 8 Jan 2018 18:16:10 -0330 Subject: [PATCH] zulip_bots: Use package_data instead of MANIFEST.in. This commit removes generate_manifest.py and package data files are now included using the package_data kwarg to setup(). This is because, in certain situations, MANIFEST.in is a bit finicky. For instance installing a package using: python setup.py install doesn't include files specified in MANIFEST.in, while using pip install ./zulip_bots does. package_data doesn't pose this problem, ergo it's better for us. --- tools/provision | 2 - tools/release-packages | 4 - zulip_bots/README.md | 1 - zulip_bots/generate_manifest.py | 143 -------------------------------- zulip_bots/setup.py | 14 ++-- 5 files changed, 8 insertions(+), 156 deletions(-) delete mode 100755 zulip_bots/generate_manifest.py mode change 100644 => 100755 zulip_bots/setup.py diff --git a/tools/provision b/tools/provision index 66349d8..609cc71 100755 --- a/tools/provision +++ b/tools/provision @@ -11,8 +11,6 @@ CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) ZULIP_BOTS_DIR = os.path.join(CURRENT_DIR, '..', 'zulip_bots') sys.path.append(ZULIP_BOTS_DIR) -import generate_manifest - red = '\033[91m' green = '\033[92m' end_format = '\033[0m' diff --git a/tools/release-packages b/tools/release-packages index be31509..e1afac7 100755 --- a/tools/release-packages +++ b/tools/release-packages @@ -235,10 +235,6 @@ def main(): for setup_file in setup_py_files: package_name = os.path.basename(os.path.dirname(setup_file)) - if package_name == 'zulip_bots': - setuptools.sandbox.run_setup( - setup_file, ['gen_manifest', '--release'] - ) generate_sdist(setup_file, package_name) generate_bdist_wheel_universal(setup_file, package_name) diff --git a/zulip_bots/README.md b/zulip_bots/README.md index 34c0ce8..d1606af 100644 --- a/zulip_bots/README.md +++ b/zulip_bots/README.md @@ -21,6 +21,5 @@ zulip_bots # This directory │ ├───test_lib.py # Backbone for bot unit tests. │ ├───test_run.py # Unit tests for run.py │ └───terminal.py # Used to test bots in the command line. -├───generate_manifest.py # Helper-script for packaging. └───setup.py # Script for packaging. ``` diff --git a/zulip_bots/generate_manifest.py b/zulip_bots/generate_manifest.py deleted file mode 100755 index 617b440..0000000 --- a/zulip_bots/generate_manifest.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import os -import glob -import distutils.cmd -import distutils.log -if False: - from typing import IO, Iterator - -CURRENT_DIR = os.path.abspath(os.path.dirname(__file__)) -BOTS_DIR = os.path.normpath(os.path.join(CURRENT_DIR, 'zulip_bots', 'bots')) -MANIFEST_PATH = os.path.join(CURRENT_DIR, 'MANIFEST.in') - -class GenerateManifest(distutils.cmd.Command): - """ - A custom setup.py command to generate a MANIFEST.in - for the zulip_bots package. - """ - description = 'generate a MANIFEST.in for PyPA or for development' - user_options = [ - ('release', None, 'generate a MANIFEST for a PyPA release'), - ] - - def initialize_options(self): - # type: () -> None - self.release = False - - def finalize_options(self): - # type: () -> None - pass - - def run(self): - # type: () -> None - if self.release: - generate_release_manifest() - self.announce('Generating a MANIFEST for a PyPA release of zulip_bots.', - level=distutils.log.INFO) - else: - generate_dev_manifest() - self.announce('Generating a MANIFEST for zulip_bots\' development.', - level=distutils.log.INFO) - -def get_test_fixtures(): - # type: () -> Iterator[str] - glob_pattern = os.path.join(BOTS_DIR, '*', 'fixtures', '*.json') - fixtures_paths = map( - lambda fp: os.path.join(*fp.split(os.path.sep)[-5:]).replace(os.path.sep, '/'), - glob.glob(glob_pattern) - ) - return fixtures_paths - -def get_logos(): - # type: () -> Iterator[str] - glob_pattern = os.path.join(BOTS_DIR, '*', 'logo.*') - logo_paths = map( - lambda fp: os.path.join(*fp.split(os.path.sep)[-4:]).replace(os.path.sep, '/'), - glob.glob(glob_pattern) - ) - return logo_paths - -def get_docs(): - # type: () -> Iterator[str] - glob_pattern = os.path.join(BOTS_DIR, '*', 'doc.md') - doc_paths = map( - lambda fp: os.path.join(*fp.split(os.path.sep)[-4:]).replace(os.path.sep, '/'), - glob.glob(glob_pattern) - ) - return doc_paths - -def get_assets(): - # type: () -> Iterator[str] - glob_pattern = os.path.join(BOTS_DIR, '*', 'assets', '*') - assets_files = map( - lambda fp: os.path.join(*fp.split(os.path.sep)[-5:]).replace(os.path.sep, '/'), - glob.glob(glob_pattern) - ) - return assets_files - -def get_config_templates(): - # type: () -> Iterator[str] - glob_pattern = os.path.join(BOTS_DIR, '*', '*.conf',) - assets_files = map( - lambda fp: os.path.join(*fp.split(os.path.sep)[-4:]).replace(os.path.sep, '/'), - glob.glob(glob_pattern) - ) - return assets_files - -def generate_and_write(filepaths, file_obj): - # type: (Iterator[str], IO[str]) -> None - template = 'include {line}\n' - lines = map(lambda line: template.format(line=line), filepaths) - - file_obj.writelines(lines) - file_obj.write('\n') - -def generate_dev_manifest(): - # type: () -> None - with open(MANIFEST_PATH, 'w') as fp: - generate_and_write(get_test_fixtures(), fp) - generate_and_write(get_logos(), fp) - generate_and_write(get_docs(), fp) - generate_and_write(get_assets(), fp) - generate_and_write(get_config_templates(), fp) - -def generate_release_manifest(): - # type: () -> None - with open(MANIFEST_PATH, 'w') as fp: - generate_and_write(get_docs(), fp) - generate_and_write(get_assets(), fp) - generate_and_write(get_config_templates(), fp) - -def parse_args(): - # type: () -> argparse.Namespace - usage = """ -To generate a MANIFEST.in for a PyPA release, run: - -./generate_manifest.py --release - -To generate a MANIFEST.in for development, run without arguments: - -./generate_manifest.py -""" - parser = argparse.ArgumentParser(usage=usage) - - parser.add_argument('--release', '-r', - action='store_true', - default=False, - help='Generate MANIFEST.in for a PyPA release.') - - return parser.parse_args() - -def main(): - # type: () -> None - options = parse_args() - if options.release: - generate_release_manifest() - else: - generate_dev_manifest() - - -if __name__ == '__main__': - main() diff --git a/zulip_bots/setup.py b/zulip_bots/setup.py old mode 100644 new mode 100755 index b2aa5e2..0f86041 --- a/zulip_bots/setup.py +++ b/zulip_bots/setup.py @@ -10,15 +10,19 @@ import pip if False: from typing import Any, Dict, Optional -import generate_manifest - ZULIP_BOTS_VERSION = "0.4.0" IS_PYPA_PACKAGE = False + +package_data = { + '': ['doc.md', '*.conf', 'assets/*'] +} + # IS_PYPA_PACKAGE is set to True by tools/release-packages # before making a PyPA release. if not IS_PYPA_PACKAGE: - generate_manifest.generate_dev_manifest() + package_data[''].append('fixtures/*.json') + package_data[''].append('logo.*') # We should be installable with either setuptools or distutils. package_info = dict( @@ -42,9 +46,6 @@ package_info = dict( ], }, include_package_data=True, - cmdclass={ - 'gen_manifest': generate_manifest.GenerateManifest, - }, ) # type: Dict[str, Any] setuptools_info = dict( @@ -58,6 +59,7 @@ try: from setuptools import setup, find_packages package_info.update(setuptools_info) package_info['packages'] = find_packages() + package_info['package_data'] = package_data except ImportError: from distutils.core import setup