From b6003a281543a253a13526fc5dc90ae997db8f9c Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Sat, 2 Sep 2017 21:30:40 +0200 Subject: [PATCH] Close #327: Add initial setup.py (#443) --- MANIFEST.in | 1 + pmb/__init__.py | 51 +++++++++++++++++++++++++++++++ pmb/parse/deviceinfo.py | 5 ++++ pmbootstrap.py | 47 ++--------------------------- setup.cfg | 2 ++ setup.py | 66 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 127 insertions(+), 45 deletions(-) create mode 100644 MANIFEST.in create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..1aba38f6 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include LICENSE diff --git a/pmb/__init__.py b/pmb/__init__.py index 84978349..0a277685 100644 --- a/pmb/__init__.py +++ b/pmb/__init__.py @@ -16,3 +16,54 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with pmbootstrap. If not, see . """ + + +import sys +import logging +import os +import traceback + +from . import config +from . import parse +from .helpers import frontend +from .helpers import logging as pmb_logging +from .helpers import other + + +def main(): + # Parse arguments, set up logging + args = parse.arguments() + pmb_logging.init(args) + + # Wrap everything to display nice error messages + try: + # Sanity check + other.check_grsec(args) + + # Initialize or require config + if args.action == "init": + return config.init(args) + elif not os.path.exists(args.config): + logging.critical("Please specify a config file, or run" + " 'pmbootstrap init' to generate one.") + return 1 + + # Run the function with the action's name (in pmb/helpers/frontend.py) + if args.action: + getattr(frontend, args.action)(args) + else: + logging.info("Run pmbootstrap -h for usage information.") + + # Print finish timestamp + logging.info("Done") + + except Exception as e: + logging.info("ERROR: " + str(e)) + logging.info("Run 'pmbootstrap log' for details.") + logging.info("See also: ") + logging.debug(traceback.format_exc()) + return 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/pmb/parse/deviceinfo.py b/pmb/parse/deviceinfo.py index 9b7c3795..bc27eea7 100644 --- a/pmb/parse/deviceinfo.py +++ b/pmb/parse/deviceinfo.py @@ -28,6 +28,11 @@ def deviceinfo(args, device=None): if not device: device = args.device + if not os.path.exists(args.aports): + logging.fatal("Aports directory is missing") + logging.fatal("Please provide a path to the aports directory using the -p flag") + raise RuntimeError("Aports directory missing") + aport = args.aports + "/device/device-" + device if not os.path.exists(aport) or not os.path.exists(aport + "/deviceinfo"): logging.fatal("You will need to create a device-specific package") diff --git a/pmbootstrap.py b/pmbootstrap.py index 87e31431..ce82daab 100755 --- a/pmbootstrap.py +++ b/pmbootstrap.py @@ -20,50 +20,7 @@ along with pmbootstrap. If not, see . """ import sys -import logging -import os -import traceback -import pmb.config -import pmb.helpers.frontend -import pmb.helpers.logging -import pmb.helpers.other -import pmb.parse - - -def main(): - # Parse arguments, set up logging - args = pmb.parse.arguments() - pmb.helpers.logging.init(args) - - # Wrap everything to display nice error messages - try: - # Sanity check - pmb.helpers.other.check_grsec(args) - - # Initialize or require config - if args.action == "init": - return pmb.config.init(args) - elif not os.path.exists(args.config): - logging.critical("Please specify a config file, or run" - " 'pmbootstrap init' to generate one.") - return 1 - - # Run the function with the action's name (in pmb/helpers/frontend.py) - if args.action: - getattr(pmb.helpers.frontend, args.action)(args) - else: - logging.info("Run pmbootstrap -h for usage information.") - - # Print finish timestamp - logging.info("Done") - - except Exception as e: - logging.info("ERROR: " + str(e)) - logging.info("Run 'pmbootstrap log' for details.") - logging.info("See also: ") - logging.debug(traceback.format_exc()) - return 1 - +import pmb if __name__ == "__main__": - sys.exit(main()) + sys.exit(pmb.main()) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..aa76baec --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal=0 diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..7a522333 --- /dev/null +++ b/setup.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 + +import re +import ast +import sys + +from setuptools import setup, find_packages +from setuptools.command.test import test as TestCommand + +from codecs import open +from os import path + + +class PyTest(TestCommand): + user_options = [('pytest-args=', 'a', 'Arguments to pass to pytest')] + + def initialize_options(self): + TestCommand.initialize_options(self) + self.pytest_args = '' + + def run_tests(self): + import shlex + import pytest + errno = pytest.main(shlex.split(self.pytest_args)) + sys.exit(errno) + + +here = path.abspath(path.dirname(__file__)) +_version_re = re.compile(r'version\s+=\s+(.*)') + +with open(path.join(here, 'pmb/config/__init__.py'), 'rb') as f: + version = str(ast.literal_eval(_version_re.search(f.read().decode('utf-8')).group(1))) + +with open(path.join(here, 'README.md'), encoding='utf-8') as f: + long_description = f.read() + + +setup( + name='pmbootstrap', + version=version, + description='A sophisticated chroot / build / flash tool to develop and install postmarketOS', + long_description=long_description, + author='postmarketOS Developers', + author_email='info@postmarketos.org', + url='https://www.postmarketos.org', + license='GPLv3', + python_requires='>=3.4', + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + ], + keywords='postmarketos pmbootstrap', + packages=find_packages(exclude=['aports', 'keys', 'test']), + tests_require=['pytest'], + cmdclass={'test': PyTest}, + entry_points={ + 'console_scripts': [ + 'pmbootstrap=pmb:main', + ], + }, +)