aboutsummaryrefslogtreecommitdiff
path: root/dodo.py
diff options
context:
space:
mode:
authorbozo.kopic <bozo.kopic@gmail.com>2020-04-11 02:42:27 +0200
committerbozo.kopic <bozo.kopic@gmail.com>2020-04-11 02:42:27 +0200
commit816d4add6f017775bc1f6607e392bfb71e393ffa (patch)
tree33a25a5b7420c9a1d4d606b312748a5a7426a0b8 /dodo.py
parentf8ab65b277c2eb7b9ed0e6d78f0302d388e0eff0 (diff)
repository refactoring
Diffstat (limited to 'dodo.py')
-rw-r--r--dodo.py175
1 files changed, 166 insertions, 9 deletions
diff --git a/dodo.py b/dodo.py
index a465808..f96c141 100644
--- a/dodo.py
+++ b/dodo.py
@@ -1,14 +1,171 @@
-import sys
+from pathlib import Path
+import datetime
import os
+import shutil
+import subprocess
+import sys
+
+import packaging.version
+
+
+DOIT_CONFIG = {'backend': 'sqlite3',
+ 'default_tasks': ['dist'],
+ 'verbosity': 2}
+
+
+pythonpath = os.environ.get('PYTHONPATH')
+src_py_path = str(Path('src_py').resolve())
+
+sys.path += [src_py_path]
+if pythonpath:
+ os.environ['PYTHONPATH'] = f'{src_py_path}{os.pathsep}{pythonpath}'
+else:
+ os.environ['PYTHONPATH'] = src_py_path
+
+
+build_dir = Path('build')
+dist_dir = Path('dist')
+py_build_dir = build_dir / 'py'
+js_build_dir = build_dir / 'js'
+
+
+def task_clean_all():
+ """Clean all"""
+ return {'actions': [f'rm -rf {build_dir}',
+ f'rm -rf {dist_dir}']}
+
+
+def task_check():
+ """Run linters"""
+ def flake8():
+ subprocess.run(['python', '-m', 'flake8', '.'],
+ cwd='src_py',
+ check=True)
+
+ return {'actions': [flake8,
+ 'yarn run --silent check_js',
+ 'yarn run --silent check_sass'],
+ 'task_dep': ['js_deps']}
+
+
+def task_js_deps():
+ """Install js dependencies"""
+ return {'actions': ['yarn install --silent']}
+
+
+def task_js_build():
+ """Build js"""
+ return {'actions': ['yarn run --silent build'],
+ 'task_dep': ['js_deps']}
+
+
+def task_js_watch():
+ """Build js on change"""
+
+ return {'actions': ['yarn run --silent watch'],
+ 'task_dep': ['js_deps']}
+
+
+def task_py_build():
+ """Build py"""
+ def mappings():
+ src_py_dir = Path('src_py')
+ for i in (src_py_dir / 'opcut').rglob('*.py'):
+ yield i, dst_dir / i.relative_to(src_py_dir)
+
+ src_json_dir = Path('schemas_json')
+ for i in src_json_dir.rglob('*.yaml'):
+ yield i, (dst_dir / 'opcut/schemas_json'
+ / i.relative_to(src_json_dir))
+
+ for i in js_build_dir.rglob('*'):
+ if i.is_dir():
+ continue
+ yield i, (dst_dir / 'opcut/ui'
+ / i.relative_to(js_build_dir))
+
+ dst_dir = py_build_dir
+ setup_path = dst_dir / 'setup.py'
+ manifest_path = dst_dir / 'MANIFEST.in'
+ src_paths = list(src_path for src_path, _ in mappings())
+ dst_paths = [setup_path, *(dst_path for _, dst_path in mappings())]
+ return {'actions': [(_copy_files, [mappings]),
+ (_create_manifest, [manifest_path, mappings]),
+ (_create_setup_py, [setup_path])],
+ 'file_dep': src_paths,
+ 'targets': dst_paths,
+ 'task_dep': ['js_build']}
+
+
+def task_dist():
+ """Create distribution"""
+ def dist():
+ dist_dir.mkdir(parents=True, exist_ok=True)
+ subprocess.run(['python', 'setup.py', '-q', 'bdist_wheel',
+ '--dist-dir', str(dist_dir.resolve())],
+ cwd=str(py_build_dir),
+ check=True)
+
+ return {'actions': [dist],
+ 'task_dep': ['py_build']}
+
+
+def _create_setup_py(path):
+ version = _get_version()
+ readme = _get_readme()
+ dependencies = ['aiohttp',
+ 'pycairo',
+ 'hat-util']
+ entry_points = {'console_scripts': ['opcut = opcut.main:main']}
+ options = {'bdist_wheel': {'python_tag': 'cp38',
+ 'py_limited_api': 'cp38',
+ 'plat_name': 'any'}}
+ classifiers = ['Programming Language :: Python :: 3',
+ 'License :: OSI Approved :: GPLv3 License']
+ with open(path, 'w', encoding='utf-8') as f:
+ f.write(f"from setuptools import setup\n\n\n"
+ f"readme = r\"\"\"\n{readme}\n\"\"\"\n\n"
+ f"setup(name='opcut',\n"
+ f" version={repr(version)},\n"
+ f" description='Cutting stock problem optimizer',\n"
+ f" long_description=readme,\n"
+ f" long_description_content_type='text/x-rst',\n"
+ f" url='https://github.com/bozokopic/opcut',\n"
+ f" author='Bozo Kopic',\n"
+ f" author_email='bozo.kopic@gmail.com',\n"
+ f" license='GPLv3',\n"
+ f" packages=['opcut'],\n"
+ f" include_package_data=True,\n"
+ f" install_requires={repr(dependencies)},\n"
+ f" python_requires='>=3.8',\n"
+ f" zip_safe=False,\n"
+ f" classifiers={repr(classifiers)},\n"
+ f" options={repr(options)},\n"
+ f" entry_points={repr(entry_points)})\n")
+
+
+def _copy_files(mappings):
+ for src_path, dst_path in mappings():
+ if not dst_path.parent.exists():
+ dst_path.parent.mkdir(parents=True, exist_ok=True)
+ shutil.copyfile(str(src_path), str(dst_path))
+
+
+def _create_manifest(path, mappings):
+ with open(path, 'w', encoding='utf-8') as f:
+ for _, i in mappings():
+ f.write(f"include {i.relative_to(path.parent)}\n")
-sys.path += ['src_py']
-os.environ['PYTHONPATH'] = os.pathsep.join(map(
- os.path.abspath, ['src_py']))
+def _get_version():
+ with open('VERSION', encoding='utf-8') as f:
+ version_str = f.read().strip()
+ if version_str.endswith('dev'):
+ version_str += datetime.datetime.now().strftime("%Y%m%d")
+ version = packaging.version.Version(version_str)
+ return version.public
-DOIT_CONFIG = {
- 'backend': 'sqlite3',
- 'default_tasks': ['dist_build'],
- 'verbosity': 2}
-from opcut.doit.main import * # NOQA
+def _get_readme():
+ with open('README.rst', encoding='utf-8') as f:
+ return f.read().strip()