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',
+ ],
+ },
+)