From 4f75eaabcde91251e593f221c23285a172803a48 Mon Sep 17 00:00:00 2001 From: Joe Rickerby Date: Sat, 25 Apr 2020 16:09:11 +0100 Subject: [PATCH] Inprogress refactor trying f-strings as template language --- .travis.yml | 26 ++++++------- test/template_projects/__init__.py | 0 test/template_projects/base.py | 18 +++++++++ test/template_projects/c.py | 60 ++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 13 deletions(-) create mode 100644 test/template_projects/__init__.py create mode 100644 test/template_projects/base.py create mode 100644 test/template_projects/c.py diff --git a/.travis.yml b/.travis.yml index 4bda329c..855b565c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,22 +6,22 @@ branches: jobs: include: - - name: Linux | x86_64 + i686 | Python 3.5 + - name: Linux | x86_64 + i686 | Python 3.6 language: python - python: 3.5 + python: 3.6 services: docker env: PYTHON=python - - name: Linux | arm64 | Python 3.5 + - name: Linux | arm64 | Python 3.6 language: python - python: 3.5 + python: 3.6 services: docker arch: arm64 env: PYTHON=python - - name: Linux | ppc64le | Python 3.5 + - name: Linux | ppc64le | Python 3.6 language: python - python: 3.5 + python: 3.6 services: docker arch: ppc64le env: PYTHON=python @@ -30,25 +30,25 @@ jobs: os: osx env: PYTHON=python3 - - name: Windows | x86_64 | Python 3.5 + - name: Windows | x86_64 | Python 3.6 os: windows language: shell before_install: - - choco install python3 --version 3.5.4 --no-progress -y + - choco install python3 --version 3.6.8 --no-progress -y env: - - PYTHON=C:\\Python35\\python + - PYTHON=C:\\Python36\\python - - &linux_s390x_35 - name: Linux | s390x | Python 3.5 + - &linux_s390x_36 + name: Linux | s390x | Python 3.6 language: python - python: 3.5 + python: 3.6 services: docker arch: s390x env: PYTHON=python allow_failures: # must repeat the s390x job above exactly to match - - *linux_s390x_35 + - *linux_s390x_36 install: $PYTHON -m pip install -r requirements-dev.txt diff --git a/test/template_projects/__init__.py b/test/template_projects/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/template_projects/base.py b/test/template_projects/base.py new file mode 100644 index 00000000..87e57b9a --- /dev/null +++ b/test/template_projects/base.py @@ -0,0 +1,18 @@ +import os +import io +from typing import List, Tuple + + +class TemplateProject: + files: List[Tuple[str, str]] + + def __init__(self, files): + self.files = files + + def generate(self, path): + for filename, content in self.files: + file_path = os.path.join(path, filename) + os.makedirs(os.path.dirname(file_path), exist_ok=True) + + with io.open(file_path, 'w', encoding='utf8') as f: + f.write(content) diff --git a/test/template_projects/c.py b/test/template_projects/c.py new file mode 100644 index 00000000..2f2af1b0 --- /dev/null +++ b/test/template_projects/c.py @@ -0,0 +1,60 @@ +import textwrap + +def indent(str, level): + return str + +def CTemplateProject(TemplateProject): + files = { + 'spam.c': textwrap.dedent(fr''' + #include + + {spam_c_top_level_add} + + static PyObject * + spam_system(PyObject *self, PyObject *args) + {{ + const char *command; + int sts; + if (!PyArg_ParseTuple(args, "s", &command)) + return NULL; + sts = system(command); + {indent(spam_c_function_add, 4)} + return PyLong_FromLong(sts); + }} + + /* Module initialization */ + + #if PY_MAJOR_VERSION >= 3 + #define MOD_INIT(name) PyMODINIT_FUNC PyInit_##name(void) + #define MOD_DEF(m, name, doc, methods, module_state_size) \ + static struct PyModuleDef moduledef = { \ + PyModuleDef_HEAD_INIT, name, doc, module_state_size, methods, }; \ + m = PyModule_Create(&moduledef); + #define MOD_RETURN(m) return m; + #else + #define MOD_INIT(name) PyMODINIT_FUNC init##name(void) + #define MOD_DEF(m, name, doc, methods, module_state_size) \ + m = Py_InitModule3(name, methods, doc); + #define MOD_RETURN(m) return; + #endif + + static PyMethodDef module_methods[] = { + {"system", (PyCFunction)spam_system, METH_VARARGS, + "Execute a shell command."}, + {NULL} /* Sentinel */ + }; + + MOD_INIT(spam) + { + PyObject* m; + + MOD_DEF(m, + "spam", + "Example module", + module_methods, + -1) + + MOD_RETURN(m) + } + ''') + }