diff --git a/.gitignore b/.gitignore index be6f58b..6a8ac99 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,25 @@ +.coverage +.python-version +*.egg-info *.pyc +*.pyo /.coverage +/.mxmake/ +/.project +/.venv/ +/.vscode/ +/constraints-mxdev.txt +/coverage/ /dist/ /htmlcov/ /node_modules/ /package-lock.json +/pnpm-lock.yaml /py2/ /py3/ +/requirements-mxdev.txt +/sources/ /src/cone.fileupload.egg-info/ +/var/ +/venv/ + diff --git a/CHANGES.rst b/CHANGES.rst index 464c58b..7206b63 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,11 @@ Changes 1.0a2 (unreleased) ------------------ -- Nothing changed yet. +- Setup Makefile. + [lenadax] + +- Run tests with pytest. + [lenadax] 1.0a1 (2023-05-15) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..abb8f3f --- /dev/null +++ b/Makefile @@ -0,0 +1,745 @@ +############################################################################## +# THIS FILE IS GENERATED BY MXMAKE +# +# DOMAINS: +#: applications.zest-releaser +#: core.base +#: core.mxenv +#: core.mxfiles +#: core.packages +#: core.sources +#: i18n.gettext +#: i18n.lingua +#: js.nodejs +#: js.rollup +#: qa.coverage +#: qa.test +# +# SETTINGS (ALL CHANGES MADE BELOW SETTINGS WILL BE LOST) +############################################################################## + +## core.base + +# `deploy` target dependencies. +# No default value. +DEPLOY_TARGETS?= + +# target to be executed when calling `make run` +# No default value. +RUN_TARGET?= + +# Additional files and folders to remove when running clean target +# No default value. +CLEAN_FS?= + +# Optional makefile to include before default targets. This can +# be used to provide custom targets or hook up to existing targets. +# Default: include.mk +INCLUDE_MAKEFILE?=include.mk + +# Optional additional directories to be added to PATH in format +# `/path/to/dir/:/path/to/other/dir`. Gets inserted first, thus gets searched +# first. +# No default value. +EXTRA_PATH?= + +## js.nodejs + +# The package manager to use. Defaults to `npm`. Possible values +# are `npm` and `pnpm` +# Default: npm +NODEJS_PACKAGE_MANAGER?=npm + +# Value for `--prefix` option when installing packages. +# Default: . +NODEJS_PREFIX?=. + +# Packages to install with `--no-save` option. +# No default value. +NODEJS_PACKAGES?= + +# Packages to install with `--save-dev` option. +# No default value. +NODEJS_DEV_PACKAGES?= + +# Packages to install with `--save-prod` option. +# No default value. +NODEJS_PROD_PACKAGES?= + +# Packages to install with `--save-optional` option. +# No default value. +NODEJS_OPT_PACKAGES?= + +# Additional install options. Possible values are `--save-exact` +# and `--save-bundle`. +# No default value. +NODEJS_INSTALL_OPTS?= + +## js.rollup + +# Rollup config file. +# Default: rollup.conf.js +ROLLUP_CONFIG?=js/rollup.conf.js + +## core.mxenv + +# Primary Python interpreter to use. It is used to create the +# virtual environment if `VENV_ENABLED` and `VENV_CREATE` are set to `true`. +# Default: python3 +PRIMARY_PYTHON?=python3 + +# Minimum required Python version. +# Default: 3.9 +PYTHON_MIN_VERSION?=3.9 + +# Install packages using the given package installer method. +# Supported are `pip` and `uv`. If uv is used, its global availability is +# checked. Otherwise, it is installed, either in the virtual environment or +# using the `PRIMARY_PYTHON`, dependent on the `VENV_ENABLED` setting. If +# `VENV_ENABLED` and uv is selected, uv is used to create the virtual +# environment. +# Default: pip +PYTHON_PACKAGE_INSTALLER?=pip + +# Flag whether to use a global installed 'uv' or install +# it in the virtual environment. +# Default: false +MXENV_UV_GLOBAL?=false + +# Flag whether to use virtual environment. If `false`, the +# interpreter according to `PRIMARY_PYTHON` found in `PATH` is used. +# Default: true +VENV_ENABLED?=true + +# Flag whether to create a virtual environment. If set to `false` +# and `VENV_ENABLED` is `true`, `VENV_FOLDER` is expected to point to an +# existing virtual environment. +# Default: true +VENV_CREATE?=true + +# The folder of the virtual environment. +# If `VENV_ENABLED` is `true` and `VENV_CREATE` is true it is used as the +# target folder for the virtual environment. If `VENV_ENABLED` is `true` and +# `VENV_CREATE` is false it is expected to point to an existing virtual +# environment. If `VENV_ENABLED` is `false` it is ignored. +# Default: .venv +VENV_FOLDER?=.venv + +# mxdev to install in virtual environment. +# Default: mxdev +MXDEV?=mxdev + +# mxmake to install in virtual environment. +# Default: mxmake +MXMAKE?=mxmake + +## core.mxfiles + +# The config file to use. +# Default: mx.ini +PROJECT_CONFIG?=mx.ini + +## core.packages + +# Allow prerelease and development versions. +# By default, the package installer only finds stable versions. +# Default: false +PACKAGES_ALLOW_PRERELEASES?=false + +## qa.test + +# The command which gets executed. Defaults to the location the +# :ref:`run-tests` template gets rendered to if configured. +# Default: .mxmake/files/run-tests.sh +TEST_COMMAND?=.mxmake/files/run-tests.sh + +# Additional Python requirements for running tests to be +# installed (via pip). +# Default: pytest +TEST_REQUIREMENTS?=pytest + +# Additional make targets the test target depends on. +# No default value. +TEST_DEPENDENCY_TARGETS?= + +## qa.coverage + +# The command which gets executed. Defaults to the location the +# :ref:`run-coverage` template gets rendered to if configured. +# Default: .mxmake/files/run-coverage.sh +COVERAGE_COMMAND?=.mxmake/files/run-coverage.sh + +## applications.zest-releaser + +# Options to pass to zest.releaser prerelease command. +# No default value. +ZEST_RELEASER_PRERELEASE_OPTIONS?= + +# Options to pass to zest.releaser release command. +# No default value. +ZEST_RELEASER_RELEASE_OPTIONS?= + +# Options to pass to zest.releaser postrelease command. +# No default value. +ZEST_RELEASER_POSTRELEASE_OPTIONS?= + +# Options to pass to zest.releaser fullrelease command. +# No default value. +ZEST_RELEASER_FULLRELEASE_OPTIONS?= + +## i18n.gettext + +# Path of directory containing the message catalogs. +# Default: locale +GETTEXT_LOCALES_PATH?=locale + +# Translation domain to use. +# No default value. +GETTEXT_DOMAIN?= + +# Space separated list of language identifiers. +# No default value. +GETTEXT_LANGUAGES?= + +## i18n.lingua + +# Path of directory to extract translatable texts from. +# Default: src +LINGUA_SEARCH_PATH?=src + +# Python packages containing lingua extensions. +# No default value. +LINGUA_PLUGINS?= + +# Command line options passed to `pot-create` +# No default value. +LINGUA_OPTIONS?= + +############################################################################## +# END SETTINGS - DO NOT EDIT BELOW THIS LINE +############################################################################## + +INSTALL_TARGETS?= +DIRTY_TARGETS?= +CLEAN_TARGETS?= +PURGE_TARGETS?= +CHECK_TARGETS?= +TYPECHECK_TARGETS?= +FORMAT_TARGETS?= + +export PATH:=$(if $(EXTRA_PATH),$(EXTRA_PATH):,)$(PATH) + +# Defensive settings for make: https://tech.davis-hansson.com/p/make/ +SHELL:=bash +.ONESHELL: +# for Makefile debugging purposes add -x to the .SHELLFLAGS +.SHELLFLAGS:=-eu -o pipefail -O inherit_errexit -c +.SILENT: +.DELETE_ON_ERROR: +MAKEFLAGS+=--warn-undefined-variables +MAKEFLAGS+=--no-builtin-rules + +# mxmake folder +MXMAKE_FOLDER?=.mxmake + +# Sentinel files +SENTINEL_FOLDER?=$(MXMAKE_FOLDER)/sentinels +SENTINEL?=$(SENTINEL_FOLDER)/about.txt +$(SENTINEL): $(firstword $(MAKEFILE_LIST)) + @mkdir -p $(SENTINEL_FOLDER) + @echo "Sentinels for the Makefile process." > $(SENTINEL) + +############################################################################## +# nodejs +############################################################################## + +export PATH:=$(shell pwd)/$(NODEJS_PREFIX)/node_modules/.bin:$(PATH) + + +NODEJS_TARGET:=$(SENTINEL_FOLDER)/nodejs.sentinel +$(NODEJS_TARGET): $(SENTINEL) + @echo "Install nodejs packages" + @test -z "$(NODEJS_DEV_PACKAGES)" \ + && echo "No dev packages to be installed" \ + || $(NODEJS_PACKAGE_MANAGER) --prefix $(NODEJS_PREFIX) install \ + --save-dev \ + $(NODEJS_INSTALL_OPTS) \ + $(NODEJS_DEV_PACKAGES) + @test -z "$(NODEJS_PROD_PACKAGES)" \ + && echo "No prod packages to be installed" \ + || $(NODEJS_PACKAGE_MANAGER) --prefix $(NODEJS_PREFIX) install \ + --save-prod \ + $(NODEJS_INSTALL_OPTS) \ + $(NODEJS_PROD_PACKAGES) + @test -z "$(NODEJS_OPT_PACKAGES)" \ + && echo "No opt packages to be installed" \ + || $(NODEJS_PACKAGE_MANAGER) --prefix $(NODEJS_PREFIX) install \ + --save-optional \ + $(NODEJS_INSTALL_OPTS) \ + $(NODEJS_OPT_PACKAGES) + @test -z "$(NODEJS_PACKAGES)" \ + && echo "No packages to be installed" \ + || $(NODEJS_PACKAGE_MANAGER) --prefix $(NODEJS_PREFIX) install \ + --no-save \ + $(NODEJS_PACKAGES) + @touch $(NODEJS_TARGET) + +.PHONY: nodejs +nodejs: $(NODEJS_TARGET) + +.PHONY: nodejs-dirty +nodejs-dirty: + @rm -f $(NODEJS_TARGET) + +.PHONY: nodejs-clean +nodejs-clean: nodejs-dirty + @rm -rf $(NODEJS_PREFIX)/node_modules + +INSTALL_TARGETS+=nodejs +DIRTY_TARGETS+=nodejs-dirty +CLEAN_TARGETS+=nodejs-clean + +############################################################################## +# rollup +############################################################################## + +NODEJS_DEV_PACKAGES+=\ + rollup \ + rollup-plugin-cleanup \ + @rollup/plugin-terser + +.PHONY: rollup +rollup: $(NODEJS_TARGET) + @rollup --config $(ROLLUP_CONFIG) + +############################################################################## +# mxenv +############################################################################## + +export OS:=$(OS) + +# Determine the executable path +ifeq ("$(VENV_ENABLED)", "true") +export VIRTUAL_ENV=$(abspath $(VENV_FOLDER)) +ifeq ("$(OS)", "Windows_NT") +VENV_EXECUTABLE_FOLDER=$(VIRTUAL_ENV)/Scripts +else +VENV_EXECUTABLE_FOLDER=$(VIRTUAL_ENV)/bin +endif +export PATH:=$(VENV_EXECUTABLE_FOLDER):$(PATH) +MXENV_PYTHON=python +else +MXENV_PYTHON=$(PRIMARY_PYTHON) +endif + +# Determine the package installer +ifeq ("$(PYTHON_PACKAGE_INSTALLER)","uv") +PYTHON_PACKAGE_COMMAND=uv pip +else +PYTHON_PACKAGE_COMMAND=$(MXENV_PYTHON) -m pip +endif + +MXENV_TARGET:=$(SENTINEL_FOLDER)/mxenv.sentinel +$(MXENV_TARGET): $(SENTINEL) + @$(PRIMARY_PYTHON) -c "import sys; vi = sys.version_info; sys.exit(1 if (int(vi[0]), int(vi[1])) >= tuple(map(int, '$(PYTHON_MIN_VERSION)'.split('.'))) else 0)" \ + && echo "Need Python >= $(PYTHON_MIN_VERSION)" && exit 1 || : + @[[ "$(VENV_ENABLED)" == "true" && "$(VENV_FOLDER)" == "" ]] \ + && echo "VENV_FOLDER must be configured if VENV_ENABLED is true" && exit 1 || : + @[[ "$(VENV_ENABLED)$(PYTHON_PACKAGE_INSTALLER)" == "falseuv" ]] \ + && echo "Package installer uv does not work with a global Python interpreter." && exit 1 || : +ifeq ("$(VENV_ENABLED)", "true") +ifeq ("$(VENV_CREATE)", "true") +ifeq ("$(PYTHON_PACKAGE_INSTALLER)$(MXENV_UV_GLOBAL)","uvtrue") + @echo "Setup Python Virtual Environment using package 'uv' at '$(VENV_FOLDER)'" + @uv venv -p $(PRIMARY_PYTHON) --seed $(VENV_FOLDER) +else + @echo "Setup Python Virtual Environment using module 'venv' at '$(VENV_FOLDER)'" + @$(PRIMARY_PYTHON) -m venv $(VENV_FOLDER) + @$(MXENV_PYTHON) -m ensurepip -U +endif +endif +else + @echo "Using system Python interpreter" +endif +ifeq ("$(PYTHON_PACKAGE_INSTALLER)$(MXENV_UV_GLOBAL)","uvfalse") + @echo "Install uv" + @$(MXENV_PYTHON) -m pip install uv +endif + @$(PYTHON_PACKAGE_COMMAND) install -U pip setuptools wheel + @echo "Install/Update MXStack Python packages" + @$(PYTHON_PACKAGE_COMMAND) install -U $(MXDEV) $(MXMAKE) + @touch $(MXENV_TARGET) + +.PHONY: mxenv +mxenv: $(MXENV_TARGET) + +.PHONY: mxenv-dirty +mxenv-dirty: + @rm -f $(MXENV_TARGET) + +.PHONY: mxenv-clean +mxenv-clean: mxenv-dirty +ifeq ("$(VENV_ENABLED)", "true") +ifeq ("$(VENV_CREATE)", "true") + @rm -rf $(VENV_FOLDER) +endif +else + @$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXDEV) + @$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXMAKE) +endif + +INSTALL_TARGETS+=mxenv +DIRTY_TARGETS+=mxenv-dirty +CLEAN_TARGETS+=mxenv-clean + +############################################################################## +# sources +############################################################################## + +SOURCES_TARGET:=$(SENTINEL_FOLDER)/sources.sentinel +$(SOURCES_TARGET): $(PROJECT_CONFIG) $(MXENV_TARGET) + @echo "Checkout project sources" + @mxdev -o -c $(PROJECT_CONFIG) + @touch $(SOURCES_TARGET) + +.PHONY: sources +sources: $(SOURCES_TARGET) + +.PHONY: sources-dirty +sources-dirty: + @rm -f $(SOURCES_TARGET) + +.PHONY: sources-purge +sources-purge: sources-dirty + @rm -rf sources + +INSTALL_TARGETS+=sources +DIRTY_TARGETS+=sources-dirty +PURGE_TARGETS+=sources-purge + +############################################################################## +# mxfiles +############################################################################## + +# case `core.sources` domain not included +SOURCES_TARGET?= + +# File generation target +MXMAKE_FILES?=$(MXMAKE_FOLDER)/files + +# set environment variables for mxmake +define set_mxfiles_env + @export MXMAKE_FILES=$(1) +endef + +# unset environment variables for mxmake +define unset_mxfiles_env + @unset MXMAKE_FILES +endef + +$(PROJECT_CONFIG): +ifneq ("$(wildcard $(PROJECT_CONFIG))","") + @touch $(PROJECT_CONFIG) +else + @echo "[settings]" > $(PROJECT_CONFIG) +endif + +LOCAL_PACKAGE_FILES:=$(wildcard pyproject.toml setup.cfg setup.py requirements.txt constraints.txt) + +FILES_TARGET:=requirements-mxdev.txt +$(FILES_TARGET): $(PROJECT_CONFIG) $(MXENV_TARGET) $(SOURCES_TARGET) $(LOCAL_PACKAGE_FILES) + @echo "Create project files" + @mkdir -p $(MXMAKE_FILES) + $(call set_mxfiles_env,$(MXMAKE_FILES)) + @mxdev -n -c $(PROJECT_CONFIG) + $(call unset_mxfiles_env) + @test -e $(MXMAKE_FILES)/pip.conf && cp $(MXMAKE_FILES)/pip.conf $(VENV_FOLDER)/pip.conf || : + @touch $(FILES_TARGET) + +.PHONY: mxfiles +mxfiles: $(FILES_TARGET) + +.PHONY: mxfiles-dirty +mxfiles-dirty: + @touch $(PROJECT_CONFIG) + +.PHONY: mxfiles-clean +mxfiles-clean: mxfiles-dirty + @rm -rf constraints-mxdev.txt requirements-mxdev.txt $(MXMAKE_FILES) + +INSTALL_TARGETS+=mxfiles +DIRTY_TARGETS+=mxfiles-dirty +CLEAN_TARGETS+=mxfiles-clean + +############################################################################## +# packages +############################################################################## + +# additional sources targets which requires package re-install on change +-include $(MXMAKE_FILES)/additional_sources_targets.mk +ADDITIONAL_SOURCES_TARGETS?= + +INSTALLED_PACKAGES=$(MXMAKE_FILES)/installed.txt + +ifeq ("$(PACKAGES_ALLOW_PRERELEASES)","true") +ifeq ("$(PYTHON_PACKAGE_INSTALLER)","uv") +PACKAGES_PRERELEASES=--prerelease=allow +else +PACKAGES_PRERELEASES=--pre +endif +else +PACKAGES_PRERELEASES= +endif + +PACKAGES_TARGET:=$(INSTALLED_PACKAGES) +$(PACKAGES_TARGET): $(FILES_TARGET) $(ADDITIONAL_SOURCES_TARGETS) + @echo "Install python packages" + @$(PYTHON_PACKAGE_COMMAND) install $(PACKAGES_PRERELEASES) -r $(FILES_TARGET) + @$(PYTHON_PACKAGE_COMMAND) freeze > $(INSTALLED_PACKAGES) + @touch $(PACKAGES_TARGET) + +.PHONY: packages +packages: $(PACKAGES_TARGET) + +.PHONY: packages-dirty +packages-dirty: + @rm -f $(PACKAGES_TARGET) + +.PHONY: packages-clean +packages-clean: + @test -e $(FILES_TARGET) \ + && test -e $(MXENV_PYTHON) \ + && $(MXENV_PYTHON) -m pip uninstall -y -r $(FILES_TARGET) \ + || : + @rm -f $(PACKAGES_TARGET) + +INSTALL_TARGETS+=packages +DIRTY_TARGETS+=packages-dirty +CLEAN_TARGETS+=packages-clean + +############################################################################## +# test +############################################################################## + +TEST_TARGET:=$(SENTINEL_FOLDER)/test.sentinel +$(TEST_TARGET): $(MXENV_TARGET) + @echo "Install $(TEST_REQUIREMENTS)" + @$(PYTHON_PACKAGE_COMMAND) install $(TEST_REQUIREMENTS) + @touch $(TEST_TARGET) + +.PHONY: test +test: $(FILES_TARGET) $(SOURCES_TARGET) $(PACKAGES_TARGET) $(TEST_TARGET) $(TEST_DEPENDENCY_TARGETS) + @test -z "$(TEST_COMMAND)" && echo "No test command defined" && exit 1 || : + @echo "Run tests using $(TEST_COMMAND)" + @/usr/bin/env bash -c "$(TEST_COMMAND)" + +.PHONY: test-dirty +test-dirty: + @rm -f $(TEST_TARGET) + +.PHONY: test-clean +test-clean: test-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y $(TEST_REQUIREMENTS) || : + @rm -rf .pytest_cache + +INSTALL_TARGETS+=$(TEST_TARGET) +CLEAN_TARGETS+=test-clean +DIRTY_TARGETS+=test-dirty + +############################################################################## +# coverage +############################################################################## + +COVERAGE_TARGET:=$(SENTINEL_FOLDER)/coverage.sentinel +$(COVERAGE_TARGET): $(TEST_TARGET) + @echo "Install Coverage" + @$(PYTHON_PACKAGE_COMMAND) install -U coverage + @touch $(COVERAGE_TARGET) + +.PHONY: coverage +coverage: $(FILES_TARGET) $(SOURCES_TARGET) $(PACKAGES_TARGET) $(COVERAGE_TARGET) + @test -z "$(COVERAGE_COMMAND)" && echo "No coverage command defined" && exit 1 || : + @echo "Run coverage using $(COVERAGE_COMMAND)" + @/usr/bin/env bash -c "$(COVERAGE_COMMAND)" + +.PHONY: coverage-dirty +coverage-dirty: + @rm -f $(COVERAGE_TARGET) + +.PHONY: coverage-clean +coverage-clean: coverage-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y coverage || : + @rm -rf .coverage htmlcov + +INSTALL_TARGETS+=$(COVERAGE_TARGET) +DIRTY_TARGETS+=coverage-dirty +CLEAN_TARGETS+=coverage-clean + +############################################################################## +# zest-releaser +############################################################################## + +ZEST_RELEASER_TARGET:=$(SENTINEL_FOLDER)/zest-releaser.sentinel +$(ZEST_RELEASER_TARGET): $(MXENV_TARGET) + @echo "Install zest.releaser" + @$(PYTHON_PACKAGE_COMMAND) install zest.releaser + @touch $(ZEST_RELEASER_TARGET) + +.PHONY: zest-releaser-prerelease +zest-releaser-prerelease: $(ZEST_RELEASER_TARGET) + @echo "Run prerelease" + @prerelease $(ZEST_RELEASER_PRERELEASE_OPTIONS) + +.PHONY: zest-releaser-release +zest-releaser-release: $(ZEST_RELEASER_TARGET) + @echo "Run release" + @release $(ZEST_RELEASER_RELEASE_OPTIONS) + +.PHONY: zest-releaser-postrelease +zest-releaser-postrelease: $(ZEST_RELEASER_TARGET) + @echo "Run postrelease" + @postrelease $(ZEST_RELEASER_POSTRELEASE_OPTIONS) + +.PHONY: zest-releaser-fullrelease +zest-releaser-fullrelease: $(ZEST_RELEASER_TARGET) + @echo "Run fullrelease" + @fullrelease $(ZEST_RELEASER_FULLRELEASE_OPTIONS) + +.PHONY: zest-releaser-dirty +zest-releaser-dirty: + @rm -f $(ZEST_RELEASER_TARGET) + +.PHONY: zest-releaser-clean +zest-releaser-clean: zest-releaser-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y zest.releaser || : + +INSTALL_TARGETS+=$(ZEST_RELEASER_TARGET) +DIRTY_TARGETS+=zest-releaser-dirty +CLEAN_TARGETS+=zest-releaser-clean + +############################################################################## +# gettext +############################################################################## + +# case `system.dependencies` domain is included +SYSTEM_DEPENDENCIES+=gettext + +.PHONY: gettext-create +gettext-create: + @if [ ! -e "$(GETTEXT_LOCALES_PATH)/$(GETTEXT_DOMAIN).pot" ]; then \ + echo "Create pot file"; \ + mkdir -p "$(GETTEXT_LOCALES_PATH)"; \ + touch "$(GETTEXT_LOCALES_PATH)/$(GETTEXT_DOMAIN).pot"; \ + fi + @for lang in $(GETTEXT_LANGUAGES); do \ + if [ ! -e "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES/$(GETTEXT_DOMAIN).po" ]; then \ + mkdir -p "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES"; \ + msginit \ + -i "$(GETTEXT_LOCALES_PATH)/$(GETTEXT_DOMAIN).pot" \ + -o "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES/$(GETTEXT_DOMAIN).po" \ + -l $$lang; \ + fi \ + done + +.PHONY: gettext-update +gettext-update: + @echo "Update translations" + @for lang in $(GETTEXT_LANGUAGES); do \ + msgmerge -o \ + "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES/$(GETTEXT_DOMAIN).po" \ + "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES/$(GETTEXT_DOMAIN).po" \ + "$(GETTEXT_LOCALES_PATH)/$(GETTEXT_DOMAIN).pot"; \ + done + +.PHONY: gettext-compile +gettext-compile: + @echo "Compile message catalogs" + @for lang in $(GETTEXT_LANGUAGES); do \ + msgfmt --statistics -o \ + "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES/$(GETTEXT_DOMAIN).mo" \ + "$(GETTEXT_LOCALES_PATH)/$$lang/LC_MESSAGES/$(GETTEXT_DOMAIN).po"; \ + done + +############################################################################## +# lingua +############################################################################## + +LINGUA_TARGET:=$(SENTINEL_FOLDER)/lingua.sentinel +$(LINGUA_TARGET): $(MXENV_TARGET) + @echo "Install Lingua" + @$(PYTHON_PACKAGE_COMMAND) install chameleon lingua $(LINGUA_PLUGINS) + @touch $(LINGUA_TARGET) + +PHONY: lingua-extract +lingua-extract: $(LINGUA_TARGET) + @echo "Extract messages" + @pot-create \ + "$(LINGUA_SEARCH_PATH)" $(LINGUA_OPTIONS) \ + -o "$(GETTEXT_LOCALES_PATH)/$(GETTEXT_DOMAIN).pot" + +PHONY: lingua +lingua: gettext-create lingua-extract gettext-update gettext-compile + +.PHONY: lingua-dirty +lingua-dirty: + @rm -f $(LINGUA_TARGET) + +.PHONY: lingua-clean +lingua-clean: lingua-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y \ + chameleon lingua $(LINGUA_PLUGINS) || : + +INSTALL_TARGETS+=$(LINGUA_TARGET) +DIRTY_TARGETS+=lingua-dirty +CLEAN_TARGETS+=lingua-clean + +############################################################################## +# Custom includes +############################################################################## + +-include $(INCLUDE_MAKEFILE) + +############################################################################## +# Default targets +############################################################################## + +INSTALL_TARGET:=$(SENTINEL_FOLDER)/install.sentinel +$(INSTALL_TARGET): $(INSTALL_TARGETS) + @touch $(INSTALL_TARGET) + +.PHONY: install +install: $(INSTALL_TARGET) + @touch $(INSTALL_TARGET) + +.PHONY: run +run: $(RUN_TARGET) + +.PHONY: deploy +deploy: $(DEPLOY_TARGETS) + +.PHONY: dirty +dirty: $(DIRTY_TARGETS) + @rm -f $(INSTALL_TARGET) + +.PHONY: clean +clean: dirty $(CLEAN_TARGETS) + @rm -rf $(CLEAN_TARGETS) $(MXMAKE_FOLDER) $(CLEAN_FS) + +.PHONY: purge +purge: clean $(PURGE_TARGETS) + +.PHONY: runtime-clean +runtime-clean: + @echo "Remove runtime artifacts, like byte-code and caches." + @find . -name '*.py[c|o]' -delete + @find . -name '*~' -exec rm -f {} + + @find . -name '__pycache__' -exec rm -fr {} + + +.PHONY: check +check: $(CHECK_TARGETS) + +.PHONY: typecheck +typecheck: $(TYPECHECK_TARGETS) + +.PHONY: format +format: $(FORMAT_TARGETS) diff --git a/js/rollup.conf.js b/js/rollup.conf.js index 9931ecc..377170c 100644 --- a/js/rollup.conf.js +++ b/js/rollup.conf.js @@ -1,7 +1,7 @@ import cleanup from 'rollup-plugin-cleanup'; -import {terser} from 'rollup-plugin-terser'; +import terser from '@rollup/plugin-terser'; -let out_path = 'src/cone/fileupload/browser/static/fileupload'; +const out_dir = 'src/cone/fileupload/browser/static/fileupload'; export default args => { let conf = { @@ -10,7 +10,7 @@ export default args => { cleanup() ], output: [{ - file: `${out_path}/cone.fileupload.js`, + file: `${out_dir}/cone.fileupload.js`, name: 'cone_fileupload', format: 'iife', globals: { @@ -25,7 +25,7 @@ export default args => { }; if (args.configDebug !== true) { conf.output.push({ - file: `${out_path}/cone.fileupload.min.js`, + file: `${out_dir}/cone.fileupload.min.js`, name: 'cone_fileupload', format: 'iife', plugins: [ diff --git a/mx.ini b/mx.ini new file mode 100644 index 0000000..aad48e4 --- /dev/null +++ b/mx.ini @@ -0,0 +1,98 @@ +[settings] +threads = 5 + +version-overrides = + pyramid==1.9.4 + repoze.zcml==1.1 + repoze.workflow==1.1 + +main-package = -e .[test] + +mxmake-templates = + run-tests + run-coverage + +mxmake-test-path = src +mxmake-source-path = src/cone/fileupload + +cs = https://github.com/conestack +cs_push = git@github.com:conestack +bda = https://github.com/bluedynamics +bda_push = git@github.com:bluedynamics + +[mxmake-env] +TESTRUN_MARKER = 1 + +[mxmake-run-tests] +environment = env + +[mxmake-run-coverage] +environment = env + +[odict] +url = ${settings:cs}/odict.git +pushurl = ${settings:cs_push}/odict.git +branch = master +mxmake-test-path = src +mxmake-source-path = src/odict + +[plumber] +url = ${settings:cs}/plumber.git +pushurl = ${settings:cs_push}/plumber.git +branch = master +mxmake-test-path = src +mxmake-source-path = src/plumber + +[node] +url = ${settings:cs}/node.git +pushurl = ${settings:cs_push}/node.git +branch = master +mxmake-test-path = src +mxmake-source-path = src/node + +[node.ext.ugm] +url = ${settings:cs}/node.ext.ugm.git +pushurl = ${settings:cs_push}/node.ext.ugm.git +branch = master +mxmake-test-path = src +mxmake-source-path = src/node/ext/ugm + +[webresource] +url = ${settings:cs}/webresource.git +pushurl = ${settings:cs_push}/webresource.git +branch = master +mxmake-test-path = . +mxmake-source-path = webresource + +; [treibstoff] +; url = ${settings:cs}/treibstoff.git +; pushurl = ${settings:cs_push}/treibstoff.git +; branch = master + +[cone.tile] +url = ${settings:cs}/cone.tile.git +pushurl = ${settings:cs_push}/cone.tile.git +branch = master +mxmake-test-path = src +mxmake-source-path = src/cone/tile + +[cone.app] +url = ${settings:cs}/cone.app.git +pushurl = ${settings:cs_push}/cone.app.git +branch = 2.0 +mxmake-test-path = src +mxmake-source-path = src/cone/app + +[yafowil] +url = ${settings:cs}/yafowil.git +pushurl = ${settings:cs_push}/yafowil.git +branch = master +mxmake-test-path = src +mxmake-source-path = src/yafowil + +[yafowil.bootstrap] +url = ${settings:cs}/yafowil.bootstrap.git +pushurl = ${settings:cs_push}/yafowil.bootstrap.git +branch = bs5 +mxmake-test-path = src +mxmake-source-path = src/yafowil/bootstrap diff --git a/package.json b/package.json new file mode 100644 index 0000000..a25ebe3 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "devDependencies": { + "@rollup/plugin-terser": "^0.4.4", + "rollup": "^2.79.2", + "rollup-plugin-cleanup": "^3.2.1" + }, + "packageManager": "pnpm@9.3.0+sha512.ee7b93e0c2bd11409c6424f92b866f31d3ea1bef5fbe47d3c7500cdc3c9668833d2e55681ad66df5b640c61fa9dc25d546efa54d76d7f8bf54b13614ac293631" +} diff --git a/setup.py b/setup.py index 61973dc..cdc07a0 100644 --- a/setup.py +++ b/setup.py @@ -17,14 +17,6 @@ def read_file(name): 'LICENSE.rst' ]]) - -class Test(test): - - def run_tests(self): - from cone.fileupload import tests - tests.run_tests() - - setup( name='cone.fileupload', version=version, @@ -47,9 +39,12 @@ def run_tests(self): zip_safe=False, install_requires=[ 'setuptools', - 'cone.app>=1.0.3', + 'cone.app[lxml]>=1.0.3', + 'yafowil.yaml' ], - extras_require=dict(test=['zope.testrunner']), - tests_require=['zope.testrunner'], - cmdclass=dict(test=Test) + extras_require=dict( + test=[ + 'pytest', + 'zope.pytestlayer' + ]) ) diff --git a/src/cone/fileupload/tests/__init__.py b/src/cone/fileupload/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/cone/fileupload/tests.py b/src/cone/fileupload/tests/test_package.py similarity index 97% rename from src/cone/fileupload/tests.py rename to src/cone/fileupload/tests/test_package.py index 05df4d2..e6427b1 100644 --- a/src/cone/fileupload/tests.py +++ b/src/cone/fileupload/tests/test_package.py @@ -175,8 +175,8 @@ def test_fileupload_handle(self): }]) self.checkOutput(""" - : container - : test.txt + : container + : test.txt body: 'I am the payload' """, container.treerepr()) @@ -201,7 +201,7 @@ def test_fileupload_handle(self): ) self.checkOutput(""" - : container + : container """, container.treerepr())