From de3b07e63399a478755cad496cf680bc7a20cd48 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 10 Apr 2024 15:55:23 +0200 Subject: [PATCH 1/7] Add basic test setup --- .gitignore | 10 +- MANIFEST.in | 5 + Makefile | 625 +++++++++++++++++++++++++++++++++++++++++ include.mk | 54 ++++ mx.ini | 2 + setup.cfg | 9 + setup.py | 6 +- tests/bin/build.py | 202 +++++++++++++ tests/bin/test.blend | Bin 0 -> 840140 bytes tests/conftest.py | 115 ++++++++ tests/test_fixtures.py | 19 ++ 11 files changed, 1045 insertions(+), 2 deletions(-) create mode 100644 MANIFEST.in create mode 100644 Makefile create mode 100644 include.mk create mode 100644 mx.ini create mode 100644 setup.cfg create mode 100644 tests/bin/build.py create mode 100644 tests/bin/test.blend create mode 100644 tests/conftest.py create mode 100644 tests/test_fixtures.py diff --git a/.gitignore b/.gitignore index 4be797b..5f40fa4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,11 @@ __pycache__ +*.egg-info +/.coverage +/.mxmake/ +/bin/ /build -*.egg-info \ No newline at end of file +/requirements-mxdev.txt +/tests/bin/3.6/ +/tests/bin/engine.license/ +/tests/bin/test +/tests/bin/lib/ diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..c6a3a0f --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,5 @@ +include *.md +recursive-include uplogic * +recursive-exclude src *.pyc *.pyo +prune tests +prune docs diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d358ff1 --- /dev/null +++ b/Makefile @@ -0,0 +1,625 @@ +############################################################################## +# THIS FILE IS GENERATED BY MXMAKE +# +# DOMAINS: +#: core.base +#: core.mxenv +#: core.mxfiles +#: core.packages +#: docs.sphinx +#: qa.coverage +#: qa.isort +#: qa.mypy +#: qa.ruff +#: 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?=./bin/3.6/python/bin + +## 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.10 + +# Minimum required Python version. +# Default: 3.7 +PYTHON_MIN_VERSION?=3.10 + +# 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?=false + +# 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?=false + +# 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 + +## qa.ruff + +# Source folder to scan for Python files to run ruff on. +# Default: src +RUFF_SRC?=src + +## qa.isort + +# Source folder to scan for Python files to run isort on. +# Default: src +ISORT_SRC?=src + +## docs.sphinx + +# Documentation source folder. +# Default: docs/source +DOCS_SOURCE_FOLDER?=docs/source + +# Documentation generation target folder. +# Default: docs/html +DOCS_TARGET_FOLDER?=docs/html + +# Documentation Python requirements to be installed (via pip). +# No default value. +DOCS_REQUIREMENTS?= + +## 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?= ./tests/bin/test + +# 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?=\ + COVERAGE_PROCESS_START=setup.cfg \ + ./tests/bin/test coverage && \ + coverage report && \ + coverage html + +## qa.mypy + +# Source folder for code analysis. +# Default: src +MYPY_SRC?=src + +# Mypy Python requirements to be installed (via pip). +# Default: types-setuptools +MYPY_REQUIREMENTS?=types-setuptools + +############################################################################## +# 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) + +############################################################################## +# mxenv +############################################################################## + +# 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 + +############################################################################## +# ruff +############################################################################## + +RUFF_TARGET:=$(SENTINEL_FOLDER)/ruff.sentinel +$(RUFF_TARGET): $(MXENV_TARGET) + @echo "Install Ruff" + @$(PYTHON_PACKAGE_COMMAND) install ruff + @touch $(RUFF_TARGET) + +.PHONY: ruff-check +ruff-check: $(RUFF_TARGET) + @echo "Run ruff check" + @ruff check $(RUFF_SRC) + +.PHONY: ruff-format +ruff-format: $(RUFF_TARGET) + @echo "Run ruff format" + @ruff format $(RUFF_SRC) + +.PHONY: ruff-dirty +ruff-dirty: + @rm -f $(RUFF_TARGET) + +.PHONY: ruff-clean +ruff-clean: ruff-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y ruff || : + @rm -rf .ruff_cache + +INSTALL_TARGETS+=$(RUFF_TARGET) +CHECK_TARGETS+=ruff-check +FORMAT_TARGETS+=ruff-format +DIRTY_TARGETS+=ruff-dirty +CLEAN_TARGETS+=ruff-clean + +############################################################################## +# isort +############################################################################## + +ISORT_TARGET:=$(SENTINEL_FOLDER)/isort.sentinel +$(ISORT_TARGET): $(MXENV_TARGET) + @echo "Install isort" + @$(PYTHON_PACKAGE_COMMAND) install isort + @touch $(ISORT_TARGET) + +.PHONY: isort-check +isort-check: $(ISORT_TARGET) + @echo "Run isort check" + @isort --check $(ISORT_SRC) + +.PHONY: isort-format +isort-format: $(ISORT_TARGET) + @echo "Run isort format" + @isort $(ISORT_SRC) + +.PHONY: isort-dirty +isort-dirty: + @rm -f $(ISORT_TARGET) + +.PHONY: isort-clean +isort-clean: isort-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y isort || : + +INSTALL_TARGETS+=$(ISORT_TARGET) +CHECK_TARGETS+=isort-check +FORMAT_TARGETS+=isort-format +DIRTY_TARGETS+=isort-dirty +CLEAN_TARGETS+=isort-clean + +############################################################################## +# sphinx +############################################################################## + +# additional targets required for building docs. +DOCS_TARGETS+= + +SPHINX_BIN=sphinx-build +SPHINX_AUTOBUILD_BIN=sphinx-autobuild + +DOCS_TARGET:=$(SENTINEL_FOLDER)/sphinx.sentinel +$(DOCS_TARGET): $(MXENV_TARGET) + @echo "Install Sphinx" + @$(PYTHON_PACKAGE_COMMAND) install -U sphinx sphinx-autobuild $(DOCS_REQUIREMENTS) + @touch $(DOCS_TARGET) + +.PHONY: docs +docs: $(DOCS_TARGET) $(DOCS_TARGETS) + @echo "Build sphinx docs" + @$(SPHINX_BIN) $(DOCS_SOURCE_FOLDER) $(DOCS_TARGET_FOLDER) + +.PHONY: docs-live +docs-live: $(DOCS_TARGET) $(DOCS_TARGETS) + @echo "Rebuild Sphinx documentation on changes, with live-reload in the browser" + @$(SPHINX_AUTOBUILD_BIN) $(DOCS_SOURCE_FOLDER) $(DOCS_TARGET_FOLDER) + +.PHONY: docs-dirty +docs-dirty: + @rm -f $(DOCS_TARGET) + +.PHONY: docs-clean +docs-clean: docs-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y \ + sphinx sphinx-autobuild $(DOCS_REQUIREMENTS) || : + @rm -rf $(DOCS_TARGET_FOLDER) + +INSTALL_TARGETS+=$(DOCS_TARGET) +DIRTY_TARGETS+=docs-dirty +CLEAN_TARGETS+=docs-clean + +############################################################################## +# 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 + +############################################################################## +# mypy +############################################################################## + +MYPY_TARGET:=$(SENTINEL_FOLDER)/mypy.sentinel +$(MYPY_TARGET): $(MXENV_TARGET) + @echo "Install mypy" + @$(PYTHON_PACKAGE_COMMAND) install mypy $(MYPY_REQUIREMENTS) + @touch $(MYPY_TARGET) + +.PHONY: mypy +mypy: $(PACKAGES_TARGET) $(MYPY_TARGET) + @echo "Run mypy" + @mypy $(MYPY_SRC) + +.PHONY: mypy-dirty +mypy-dirty: + @rm -f $(MYPY_TARGET) + +.PHONY: mypy-clean +mypy-clean: mypy-dirty + @test -e $(MXENV_PYTHON) && $(MXENV_PYTHON) -m pip uninstall -y mypy || : + @rm -rf .mypy_cache + +INSTALL_TARGETS+=$(MYPY_TARGET) +TYPECHECK_TARGETS+=mypy +CLEAN_TARGETS+=mypy-clean +DIRTY_TARGETS+=mypy-dirty + +-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/include.mk b/include.mk new file mode 100644 index 0000000..c7a2883 --- /dev/null +++ b/include.mk @@ -0,0 +1,54 @@ +############################################################################## +# upbge +############################################################################## + +UPBGE_VERSION=upbge-0.36.1-linux-x86_64 +UPBGE_TARBALL=$(UPBGE_VERSION).tar.xz +UPBGE_URL=https://github.com/UPBGE/upbge/releases/download/v0.36.1/$(UPBGE_TARBALL) +UPBGE_DONWLOAD_FOLDER?=$(MXMAKE_FOLDER)/downloads + +UPBGE_DOWNLOAD_TARGET:=$(SENTINEL_FOLDER)/upbge-download.sentinel +$(UPBGE_DOWNLOAD_TARGET): $(SENTINEL) + @echo "Download upbge tarball" + @mkdir -p $(UPBGE_DONWLOAD_FOLDER) + @pushd $(UPBGE_DONWLOAD_FOLDER) + @wget $(UPBGE_URL) + @popd + @touch $(UPBGE_DOWNLOAD_TARGET) + +UPBGE_EXTRACT_TARGET:=$(SENTINEL_FOLDER)/upbge-extract.sentinel +$(UPBGE_EXTRACT_TARGET): $(UPBGE_DOWNLOAD_TARGET) + @tar xf $(UPBGE_DONWLOAD_FOLDER)/$(UPBGE_TARBALL) -C . + @mv $(UPBGE_VERSION) bin + @touch $(UPBGE_EXTRACT_TARGET) + +UPBGE_TEST_TARGET:=$(SENTINEL_FOLDER)/upbge-test.sentinel +$(UPBGE_TEST_TARGET): + @./bin/blender -b ./tests/bin/test.blend -P ./tests/bin/build.py + @touch $(UPBGE_TEST_TARGET) + +.PHONY: upbge-install +upbge-install: $(UPBGE_EXTRACT_TARGET) + +.PHONY: upbge-test-clean +upbge-test-clean: + @rm -rf ./tests/bin/3.6 + @rm -rf ./tests/bin/engine.license + @rm -f ./tests/bin/test + @rm -f ./tests/bin/test.blend1 + @rm -rf ./tests/bin/lib/ + @rm -f $(UPBGE_TEST_TARGET) + +.PHONY: upbge-clean +upbge-clean: upbge-test-clean + @rm -rf $(UPBGE_DONWLOAD_FOLDER)/$(UPBGE_TARBALL) + @rm -f $(UPBGE_DOWNLOAD_TARGET) + @rm -rf bin + @rm -f $(UPBGE_EXTRACT_TARGET) + +############################################################################## +# default targets +############################################################################## + +INSTALL_TARGETS:=upbge-install $(INSTALL_TARGETS) $(UPBGE_TEST_TARGET) +CLEAN_TARGETS+=upbge-clean build-clean diff --git a/mx.ini b/mx.ini new file mode 100644 index 0000000..82a4ab4 --- /dev/null +++ b/mx.ini @@ -0,0 +1,2 @@ +[settings] +main-package = -e .[test,docs] diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..97d1b7c --- /dev/null +++ b/setup.cfg @@ -0,0 +1,9 @@ +[coverage:run] +branch = True +source = uplogic + +[coverage:report] +ignore_errors = True + +[coverage:html] +directory = coverage_html diff --git a/setup.py b/setup.py index 728fa16..6812b1e 100644 --- a/setup.py +++ b/setup.py @@ -59,5 +59,9 @@ def read_file(name): # 'uplogic\\nodes\\logictree.pyx' # ]), zip_safe=True, - install_requires=['setuptools'] + install_requires=['setuptools'], + extras_require=dict( + test=['pytest', 'coverage'], + docs=['sphinx'] + ) ) diff --git a/tests/bin/build.py b/tests/bin/build.py new file mode 100644 index 0000000..877a594 --- /dev/null +++ b/tests/bin/build.py @@ -0,0 +1,202 @@ +import bpy +import os +import shutil +import tempfile + + +def copytree(src, dst, symlinks=False, ignore=None): + """Custom copytree implementation to handle cases + """ + for item in os.listdir(src): + s = os.path.join(src, item) + d = os.path.join(dst, item) + if os.path.isdir(s): + shutil.copytree(s, d, symlinks, ignore, dirs_exist_ok=True) + else: + shutil.copy2(s, d) + + +def new_folder(path): + """Create a new folder if it doesn't exist yet + """ + try: + os.mkdir(path) + except FileExistsError: + pass + + +# Remove old build files +try: + os.remove(bpy.path.abspath('//test')) +except Exception: + pass +try: + shutil.rmtree(bpy.path.abspath('//3.6')) +except Exception: + pass +try: + shutil.rmtree(bpy.path.abspath('//license')) +except Exception: + pass + + +path = bpy.path.abspath('//') +OUTPUT_PATH = bpy.path.abspath('//test') + +def CopyPythonLibs(dst, overwrite_lib, report=print): + import platform + + # use python module to find python's libpath + src = os.path.dirname(platform.__file__) + + # dst points to lib/, but src points to current python's library path, eg: + # '/usr/lib/python3.2' vs '/usr/lib' + # append python's library dir name to destination, so only python's + # libraries would be copied + if os.name == 'posix': + dst = os.path.join(dst, os.path.basename(src)) + + if os.path.exists(src): + write = False + if os.path.exists(dst): + if overwrite_lib: + shutil.rmtree(dst) + write = True + else: + write = True + if write: + shutil.copytree(src, dst, ignore=lambda dir, contents: [i for i in contents if i == '__pycache__']) + else: + report({'WARNING'}, "Python not found in %r, skipping python copy" % src) + + +def WriteRuntime(): + import struct + + # Setup main folders + blender_dir = os.path.dirname(bpy.app.binary_path) + runtime_dir = os.path.dirname(OUTPUT_PATH) + + # Extract new version string. Only take first 3 digits (i.e 3.0) + string = bpy.app.version_string.split()[0] + version_string = string[:3] + + # Create temporal directory + tempdir = tempfile.mkdtemp() + blender_bin_path = bpy.app.binary_path + blender_bin_dir = os.path.dirname(blender_bin_path) + ext = os.path.splitext(blender_bin_path)[-1].lower() + blenderplayer_name = 'blenderplayer' + player_path_temp = os.path.join(blender_bin_dir, blenderplayer_name + ext) + + # Get the player's binary and the offset for the blend + file = open(player_path_temp, 'rb') + player_d = file.read() + offset = file.tell() + file.close() + + # Create a tmp blend file (Blenderplayer doesn't like compressed blends) + blend_path = os.path.join(tempdir, bpy.path.clean_name(OUTPUT_PATH)) + bpy.ops.wm.save_as_mainfile(filepath=blend_path, + relative_remap=False, + compress=False, + copy=True, + ) + + # Get the blend data + blend_file = open(blend_path, 'rb') + blend_d = blend_file.read() + blend_file.close() + + # Get rid of the tmp blend, we're done with it + os.remove(blend_path) + os.rmdir(tempdir) + + # Create a new file for the bundled runtime + output = open(OUTPUT_PATH, 'wb') + + # Write the player and blend data to the new runtime + print("Writing runtime...", end=" ") + output.write(player_d) + output.write(blend_d) + + # Store the offset (an int is 4 bytes, so we split it up into 4 bytes and save it) + output.write(struct.pack('B', (offset>>24)&0xFF)) + output.write(struct.pack('B', (offset>>16)&0xFF)) + output.write(struct.pack('B', (offset>>8)&0xFF)) + output.write(struct.pack('B', (offset>>0)&0xFF)) + + # Stuff for the runtime + output.write(b'BRUNTIME') + output.close() + + print("done") + + # Make the runtime executable on Linux + if os.name == 'posix': + os.chmod(OUTPUT_PATH, 0o755) + + print("Copying Python files...", end=" ") + py_folder = os.path.join(version_string, "python", "lib") + dst = os.path.join(runtime_dir, py_folder) + CopyPythonLibs(dst, True, print) + print("done") + + # Copy datafiles folder + print("Copying datafiles...", end=" ") + datafiles_folder = os.path.join(version_string, "datafiles", "gamecontroller") + src = os.path.join(blender_dir, datafiles_folder) + dst = os.path.join(runtime_dir, datafiles_folder) + if os.path.isdir(dst): + shutil.rmtree(dst) + shutil.copytree(src, dst) + datafiles_folder = os.path.join(version_string, "datafiles", "colormanagement") + src = os.path.join(blender_dir, datafiles_folder) + dst = os.path.join(runtime_dir, datafiles_folder) + if os.path.isdir(dst): + shutil.rmtree(dst) + shutil.copytree(src, dst) + datafiles_folder = os.path.join(version_string, "datafiles", "fonts") + src = os.path.join(blender_dir, datafiles_folder) + dst = os.path.join(runtime_dir, datafiles_folder) + if os.path.isdir(dst): + shutil.rmtree(dst) + shutil.copytree(src, dst) + datafiles_folder = os.path.join(version_string, "datafiles", "studiolights") + src = os.path.join(blender_dir, datafiles_folder) + dst = os.path.join(runtime_dir, datafiles_folder) + if os.path.isdir(dst): + shutil.rmtree(dst) + shutil.copytree(src, dst) + print("done") + + print("Copying scripts and modules...", end=" ") + scripts_folder = os.path.join(version_string, "scripts") + src = os.path.join(blender_dir, scripts_folder) + dst = os.path.join(runtime_dir, scripts_folder) + shutil.copytree(src, dst) + print("done") + + # Copy license folder + print("Copying UPBGE license folder...", end=" ") + src = os.path.join(blender_dir, "license") + dst = os.path.join(runtime_dir, "engine.license") + if os.path.isdir(dst): + shutil.rmtree(dst) + shutil.copytree(src, dst) + license_folder = os.path.join(runtime_dir, "engine.license") + src = os.path.join(blender_dir, "copyright.txt") + dst = os.path.join(license_folder, "copyright.txt") + shutil.copy2(src, dst) + print("done") + + +import time +print("Saving runtime to %r" % bpy.path.abspath('//')) +start_time = time.time() +WriteRuntime() +print("Finished in %.4fs" % (time.time() - start_time)) + +blpath = bpy.utils.resource_path(type='LOCAL') +new_folder(bpy.path.abspath('//lib')) +copytree(os.path.join(blpath, '..', 'lib'), bpy.path.abspath('//lib')) diff --git a/tests/bin/test.blend b/tests/bin/test.blend new file mode 100644 index 0000000000000000000000000000000000000000..e47bf8a11fb6d0fbeba049ab37fdc03e48fcccd1 GIT binary patch literal 840140 zcmeEv31Ah~)&C@cFd{0r5h+SsTBCId0uqe8mkoIOp(40YYYicJkZ2&71dZCtQ&AsU z*SdgJvua!YYT;{b#ZTHstJU^zE4G#V&zXCEZ{AF1-V&m~<6fBD zxijZ?=HB1A+uXVLzKW@n&a9d={rJnq6rVhuPD6%aOq+SprTGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O` zngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55 zpc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;4 z1DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y= zGoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#W zGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv#WGy|Fe&46Y=GoTsJ3}^;41DXNNfM!55pc&8%Xa+O`ngPv# zWGy|Fe%>XknW$IZK(*_vEw3!!O`kzIH@ibk_ zp`);H^ys~fqv-6!oP7El9sWw$NV;!+v{v~=DonSO+h2LDN4;IgXD1ccj4c^oTRi6E zk{WeK|J4j=2KH12&OgI29vw*a$KtUOu1CI>r|Ow>`8fZK^Bd-$Q8PbX`Ap=l&P3QH z8~yiPAx@8b+t%N3Gft{iSmCgJGQ z<1F6Ir<9LyOv1Qc(zgB-ey-b(g%u9Z-1g~mE4~QlQ9_4~$+6lFT+_a0U=L*=`06WD zbBxs+<&-fZ0d@sV7i8yeL`(yp@JmV67%tSgHyy?hO4dcqH#OGI)pHp5>7f|0_ z;8&0T`pc@m+2^H2iS-@&k9g2|4dKfRr`B8%ZpM|q`Q{Hhtoo=#{AjxhuMyvTScRjX z{M_olhPEjm{n~gM_xos2PEH=xxv06RouZrLsqOl=eaQ&DKKdJ0JvqZ!pRajqkQER3 zOQoI+J-5K(q5D~n5P0}ejY2RYzo3J&@pZy3i|r@%oDIOI#{1FmOZCk}GJK@R#5?%7wJ z@$-u46#4xDv0t~u6Y?cK`~nYo;0qpdmLu53%`@o;5Q2%dVzD>0eHv*k9r4sfs6V)AM(J%ZqSSPd*RoRFzUA- ziv3Z~K@a$I+tJM@%X8jZOQn@d-a!Y^h5g1_YI=I;IhTGA<@&GtvX`uSsYL2m__1%j zsOs5kly3pk_=7r$`5Z#>(Eoi&&j^G6DaSI85&+M7NMxdmJf0c(Yn4JxtFZiO6DK*s zD&YI~*L$m5W7wPZ4(W=O$9-wL`4+Vsc>@e%z+mHzy~kPy@ko66Io1n~-7>5Jj(gV3 zO=J*KPi?@ozgspaI9$D3zz3$Uev!0M_0OobDwUq1g(?rEl5^j0|Bia+fgNEt*fAt| z2lln_k;zUwcAf4FyC32TA1iIRWk=%$$_r%2xUc$P46*I_)x5C=AO3cHgKU^sR$Px1 zw7SYxJjxhg+@0fL$2<43-VqDLck9VCT;K842$#{KKhAda!Tj{ZB28(@x$&_(oOXoW zU`NQqz7kgD&@jqWc!88hgn{z*(e7FG#g-2#50LHPdzMFIzg()p=tx=~S?_aH-*K7j zC8AyGeXK4`yh1a+e15~cn%0J<`3C*( zS4T}jpIvOYdas1PRLU6qOca-iFuhX89hagWa`6jt!sTivo#VN)efTs#Q{%8z;W;%6 z8(ZCK(hl?U*#1aY*zbAr9)WnFu7Lex>-uW{%BFb>npzrK8|Ke7PAD!Oop#hy3Pw^& z_zQH)xB~o`*dM+>(*I6k6PwEZc&?xQqr=qq$o{fF(v`~oh?m>`7>~)k{GZWO7j9(Z z_q)4h2Q(Im{o!vD`@?suHb0f|wSOt!ecv5UWq&-^*Z%T-y1(p?bfvOC;syJ2{n1W| zL;7o^{)h=5NcZf84UJU9PiP4@hHG1^XE(LsPMW?0Z)A?AR-A{9qF+{hqv)mT`wrrd z_#*yMu_Mye&+$()(TQS1tw8iAkqBGmJ|=qoB7@FC=WHsS}lWbyOhxUPC`bJM~F(4M{@llZ|0(l36HOBTQLPMdW8 zn5yct&Z$l)g?)@4;*-h;fAM@v0CyT#2iy1Zd1sL|Yg(I{r^W5c_xj?@B4yup@u7p? zhZ7y*2YK-4#&P`4JgaJwi@iiupUXMohxj0Vco^c%@$1k07m{)cAJ22!4)KGWJAT0V z@Ym<^0llew#1HjOviS99{)--~@*jM}(~m#MC5xYD`Gw-o$w&V_w6U-K`|08Nb>U|2 z;LYvd?!9sC4x~AB?cLUUJN%+Y)OR2FeNoMM9FFar?EMbU_3Pi6Bm1|1k94K#-yvSe zr?7wYXMMH*jN0ag1=ibLf4&)0$MKKSiofA}-S{_y*t(%`ZSm&*QluAlv*hxV`i zk*-wsN4(tjkG;@$`!8(#eC)p%WcR^0uT$k8epKuaKNFScQ-CwZrm{bt>udkQ{{i8qctNqVCuW(YG8s6>4v0b*$jhPt9C0n#u)&KAd zex&+;@Ll3bgWwA701Kxo|9GyS{i9#$U;86nsqBw+1xM&|P8{Tb zD-j&@0T;}7#uIYD)e8>#Y@G9XkOOY1;GoaO9pFeG{l17Far_=8@=+Yb+U;6s9kUZme$4Q-N@%B(u`OurL z&*`z|R*N3YXN%t8rEf*0()+7&Lhev07ns64OkFlm9^XlPftP#a1?ecemg=S) zV~|1HJ`BjGvbZ&ukJROn>$7bhdKKD!NVcA_9k)^9P+xZw7h;a2NlqL~O)9w4ZgL&k zyB_VCXBaDz#EJRfb`$L++Rd1>n;~gW(O#nc_v?qF-anA?_S1Cmy7V67dltuDbxiDK zHI4`0yh*ihv75cxxg-gZTPUZ{gL3MrFLG<8g7rhYX^babyp{#Ndo4?5?dEdgjrnuC zJ+0k@-C#%X0sE@(YT~|Vz1$nG>f6B^IQ#(}T%YpxI1kXl4)yC^Di{whk+9QKcD#>l z!E2HXV~ADX-bA_jCKB|@(~M6n2M-X+?G)O5HT%L`9(g`K%J;iz*0&y%?H=T`gbQcX z@)zd5MR%659|7Yn5(TK`IcUmsXhVIC`Wf|g^fP(?ka{~N?=|lCJ-mNGANz-qO%A6= za(%;V?MLO_Ygx%FZ=1KubHtC{qU!1BT{~7^Ll4S%=r#|1UE``$yrsVG8srQoCd%WS z)5*?y&zW^6VR;Ry_@3`MqjE4tFINBrPw*!=eU*C&E5Jh+FjTUb~Nvh z{2}>dXD8AtPiG#dA$AGP9K1^-U`N;uc8uMr>)c2=zW z{#>){S?jxex*FJyD=5DM7ou~{r>!@ambrB-TXsmVYxk8$I%%~#9m<7r&gkH?tCyY_ zEcoO1JFb7_D_qVZJ)u*Aqh{S7m~_gaA{#mB2PNU)1OIv_!1vqM{k&uQ-klv6>SI?C!v?y3Xu*xQy|8f6pj;cmFA!xknt` zNwS@KX zrof2M)qxw^uUh?&iAOyCZeVc7@M*b$a|d(=o`3DhC%$~eLF+dS%&quV^o?}|n;z`C z?brhFC_& z@Rh;G{`gMdfpO2Uj=(MN-?KLMNM70I(AEypVd-QgqaJB2CmrQ+g;{>G_^F>*{3a$d z-D{k05^cYVI zV9B#vIzD*$u8zF--|KLRSmIo6XVOAxy!V_TSfX89bF4*Dc+6$%xP*4x3r!RZfo9+6R`tPFRrVpEuLLGt|mNoY+Z3($;l^= zsVyEmp|-9rJfV2@Nwwj+@!>h+#!aXmT|KV2xQ&hzE?zKq2OhZVLF0Q+Qu#=z^Q`id z5Vj&NVZQgp?L%4kryQd!IF!ooE41b0mNJS-LcCO5RCzD6;$@e8j^iubh9bUlZsA2X zF0s59-O#UdU_=eC%GQs?h z__F8NZFIZZ#{z!n9vQ#*uE%(kr6u_v^xvTe{daSzhrX`Moa0$rUUY_&Kgvoci&*1Z zUB6J{Tkx$qo9&snw^lHJ1hJ87e2e+ZC+?U(w^L|bb-rEWYBu<=BkTq{#+J#rh~yKM z)=(w&7}iU=>3al+&)eX~!;5kQ-y;xy!xO+Zj08=(r@lwz()Wm%@f+*#&eKrCdbu17 z^spmqupMc(16g$jJHl?TV^qpF?7OoQ?e{*-WfAq6mmQrYkjF)`)4`6g8|;YG!oIXC z`Z~k7HlaKstjgnj>f2vV2Y+=zdAp3l?D!fxgmIs*ZRuHbT2IfSMXIkHsyLl5Qjr{L z!pZDtYq0cY?H{(|G^&r#-j1S_dQ?xn($D+B?GDbp-*$h;8Dp>x zz0>mYXgZL?G0)cgNa;tRUxoD~=xR z)(^oCJs|z6l^*>dOH1-UDF4ud@^3!qp|9*@XFqBe>Q{k3cWU>zewEk_c8sl%ewE}C z#gC(3MVI(H@P+7SxhYirV7iKamDMk%@X5U-`GQx!YJ@SKX1P)a&huR%Q4QPiz{Cr3 z?re{_UzJYn=Amd8zl8D#yTOi8Dc_#uawnw8uRTV;Dm^Kny;Y8x)61AQpQUq)eexQ4L0s{W?vSMh78<^1d@x2<+5b$MiI8mP=d$9Cj? z71~?fugc8G=vN`XS?Fo`zWplnqtLIy(=cv@c~@BXf_bzUw}N~jWk;@y9P_aT@O&)q zHpsk7=3|K;`ku6#k9hQh@Q@@v%0Kj={F^`U(ARZ=t6z1UGo0i(eCsfIIn7``)&QE1 zMTa*RtP}kC&d0LQEXmH(t8)2BULLtj za($M19#8hq$AaBp$B@+1u&-qRW7nIHh5m7Rc69cSv$0-<-C##$HyX#1a*6QH^8M;n zw2$atxZ^iU`Wo)*yL#BH>f?MY!C^ku$QK{udd}fqyL6v2#{~-9lJA_4wfE~&t+_xu zI{#=g&0h-9oTbNUo)SGKGLGgl-A?nD+G)-bho7Z+O-IpOrsLH7rAV;4s(eh_kGoob z^+p+wVetH=f~mER`AaQ_{mwCe>6a&c7WA9HH2mm$1H%i7f}^e)xpw2%M?T(hO*55Mn{`F?wezo%m}-XCZDPTN;kBKzvKFI4;cY=++^`z6Ufd$C*<_InOD zV=}DmC*paX+p$8rgLq({uzHDCZ;*38I>-UHRB+G-ynDYr$N?7<9P|Na7@MsrK!_*g zfZHZG=mRb=$ccj-a7C@cuPdGI{q`US+)TkiAD$P?cRmktz(oZIeKziRNBSTK+#10_ zA8>&|P8{Tb>lPgJ0cRN2>p^^fILHB4Ao&mafD7h3agYNpBsk~;&b{9r~8RjWsb`~o@PAP0R22lH(l?_alB;)VU6%*&kR5Bb!c5BRx^hdl5l zf`?w@<07#W;sHG5fv*=l^y0bhd;vVSCV1#Y{G&echdl7x1P{I7 z&kqlI;EOJo@+x`|Z$CWbfuAXO=q-_QUm$jN^ACC8qk@NC@bAul;2-k9uMs@-;<kbC7x8cN;Sch_w+SA4@q9l#=QqWq-NtvgsNt+XU^jO@M!CTA%BWGt z{%^-oOQH6EE6C$Y&g)&(tds9>@PDkv=cA8$d^f{GlK7mTdH*+4^kAGZ_7g9CyYBvP zygM!P=XQJCJ~m=E*b(^x_I2~~MTfoebmno${{7!zH`oyzIm_kMv=2g)_1%r{_w-y{ z*|R8Uh5yN60evRl+5Gl@!+jBl$M2iFPxTBmF*UPtjhY{rBsKBA=Z=b^azgcs*#3@i668 zpLX+Awf~zbe&})euD#l;ol8iV&nenX=s`I(z4YzE`@eMvf9_=NY3(NL20MZe*jI(U z_J13?f$wFq|J!X)?(o(4pL_qe+bLJyPI7+jW@0&bo^0uM3hlm{ePJ$-y#E`@_q)`} zxa%mdRC`e7CARBb>zDoC;>n_^vNTD~WB)hQ W8K*=&UgCPs#(Njuf8tM|lZ@7J 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 L6 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 Date: Wed, 10 Apr 2024 16:21:59 +0200 Subject: [PATCH 2/7] Some minor fixes, add sphinx docs stub --- .gitignore | 1 + Makefile | 6 +++--- docs/Makefile | 20 ++++++++++++++++++++ docs/make.bat | 35 +++++++++++++++++++++++++++++++++++ docs/source/animation.rst | 6 ++++++ docs/source/conf.py | 28 ++++++++++++++++++++++++++++ docs/source/index.rst | 20 ++++++++++++++++++++ include.mk | 2 +- 8 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/source/animation.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/.gitignore b/.gitignore index 5f40fa4..47f340e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ __pycache__ /.mxmake/ /bin/ /build +/docs/html/ /requirements-mxdev.txt /tests/bin/3.6/ /tests/bin/engine.license/ diff --git a/Makefile b/Makefile index d358ff1..eaa9596 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ RUN_TARGET?= # Additional files and folders to remove when running clean target # No default value. -CLEAN_FS?= +CLEAN_FS?=coverage_html # Optional makefile to include before default targets. This can # be used to provide custom targets or hook up to existing targets. @@ -273,8 +273,8 @@ ifeq ("$(VENV_CREATE)", "true") @rm -rf $(VENV_FOLDER) endif else - @$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXDEV) - @$(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXMAKE) + @test -e $(MXENV_PYTHON) && $(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXDEV) || : + @test -e $(MXENV_PYTHON) && $(PYTHON_PACKAGE_COMMAND) uninstall -y $(MXMAKE) || : endif INSTALL_TARGETS+=mxenv diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..747ffb7 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/source/animation.rst b/docs/source/animation.rst new file mode 100644 index 0000000..967da35 --- /dev/null +++ b/docs/source/animation.rst @@ -0,0 +1,6 @@ +uplogic.animation +================= + +.. autoclass:: uplogic.animation.ULAction + +.. autoclass:: uplogic.animation.Action diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..c6ce977 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,28 @@ +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = 'uplogic' +copyright = '2024, Leopold Auersperg-Castell' +author = 'Leopold Auersperg-Castell' +release = '2.1' + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = ['sphinx.ext.autodoc'] + +templates_path = ['_templates'] +exclude_patterns = [] + + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_theme = 'alabaster' +html_static_path = ['_static'] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..3536502 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,20 @@ +.. uplogic documentation master file, created by + sphinx-quickstart on Wed Apr 10 16:04:15 2024. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to uplogic's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + Animation + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/include.mk b/include.mk index c7a2883..988795d 100644 --- a/include.mk +++ b/include.mk @@ -51,4 +51,4 @@ upbge-clean: upbge-test-clean ############################################################################## INSTALL_TARGETS:=upbge-install $(INSTALL_TARGETS) $(UPBGE_TEST_TARGET) -CLEAN_TARGETS+=upbge-clean build-clean +CLEAN_TARGETS+=upbge-clean From a2348370f2c6550edbac13ec4a31946243a25ad9 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 10 Apr 2024 16:55:11 +0200 Subject: [PATCH 3/7] one blender file for running tests and generating docs --- .gitignore | 9 ++++---- Makefile | 4 ++-- include.mk | 29 ++++++++++++------------ {tests/bin => utils}/build.py | 4 ++-- tests/bin/test.blend => utils/run.blend | Bin 840140 -> 841172 bytes 5 files changed, 24 insertions(+), 22 deletions(-) rename {tests/bin => utils}/build.py (98%) rename tests/bin/test.blend => utils/run.blend (63%) diff --git a/.gitignore b/.gitignore index 47f340e..5dae2ff 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,8 @@ __pycache__ /build /docs/html/ /requirements-mxdev.txt -/tests/bin/3.6/ -/tests/bin/engine.license/ -/tests/bin/test -/tests/bin/lib/ +/utils/3.6/ +/utils/engine.license/ +/utils/lib/ +/utils/run +/utils/run.blend1 \ No newline at end of file diff --git a/Makefile b/Makefile index eaa9596..ec696f4 100644 --- a/Makefile +++ b/Makefile @@ -137,7 +137,7 @@ PACKAGES_ALLOW_PRERELEASES?=false # 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?= ./tests/bin/test +TEST_COMMAND?= ./utils/run tests # Additional Python requirements for running tests to be # installed (via pip). @@ -155,7 +155,7 @@ TEST_DEPENDENCY_TARGETS?= # Default: .mxmake/files/run-coverage.sh COVERAGE_COMMAND?=\ COVERAGE_PROCESS_START=setup.cfg \ - ./tests/bin/test coverage && \ + ./utils/run tests && \ coverage report && \ coverage html diff --git a/include.mk b/include.mk index 988795d..4b1b343 100644 --- a/include.mk +++ b/include.mk @@ -22,25 +22,25 @@ $(UPBGE_EXTRACT_TARGET): $(UPBGE_DOWNLOAD_TARGET) @mv $(UPBGE_VERSION) bin @touch $(UPBGE_EXTRACT_TARGET) -UPBGE_TEST_TARGET:=$(SENTINEL_FOLDER)/upbge-test.sentinel -$(UPBGE_TEST_TARGET): - @./bin/blender -b ./tests/bin/test.blend -P ./tests/bin/build.py - @touch $(UPBGE_TEST_TARGET) +UPBGE_RUN_TARGET:=$(SENTINEL_FOLDER)/upbge-run.sentinel +$(UPBGE_RUN_TARGET): + @./bin/blender -b ./utils/run.blend -P ./utils/build.py + @touch $(UPBGE_RUN_TARGET) .PHONY: upbge-install upbge-install: $(UPBGE_EXTRACT_TARGET) -.PHONY: upbge-test-clean -upbge-test-clean: - @rm -rf ./tests/bin/3.6 - @rm -rf ./tests/bin/engine.license - @rm -f ./tests/bin/test - @rm -f ./tests/bin/test.blend1 - @rm -rf ./tests/bin/lib/ - @rm -f $(UPBGE_TEST_TARGET) +.PHONY: upbge-run-clean +upbge-run-clean: + @rm -rf ./utils/3.6 + @rm -rf ./utils/engine.license + @rm -f ./utils/run + @rm -f ./utils/run.blend1 + @rm -rf ./utils/lib/ + @rm -f $(UPBGE_RUN_TARGET) .PHONY: upbge-clean -upbge-clean: upbge-test-clean +upbge-clean: upbge-run-clean @rm -rf $(UPBGE_DONWLOAD_FOLDER)/$(UPBGE_TARBALL) @rm -f $(UPBGE_DOWNLOAD_TARGET) @rm -rf bin @@ -50,5 +50,6 @@ upbge-clean: upbge-test-clean # default targets ############################################################################## -INSTALL_TARGETS:=upbge-install $(INSTALL_TARGETS) $(UPBGE_TEST_TARGET) +SPHINX_BIN:=./utils/run sphinx +INSTALL_TARGETS:=upbge-install $(INSTALL_TARGETS) $(UPBGE_RUN_TARGET) CLEAN_TARGETS+=upbge-clean diff --git a/tests/bin/build.py b/utils/build.py similarity index 98% rename from tests/bin/build.py rename to utils/build.py index 877a594..069e18d 100644 --- a/tests/bin/build.py +++ b/utils/build.py @@ -27,7 +27,7 @@ def new_folder(path): # Remove old build files try: - os.remove(bpy.path.abspath('//test')) + os.remove(bpy.path.abspath('//run')) except Exception: pass try: @@ -41,7 +41,7 @@ def new_folder(path): path = bpy.path.abspath('//') -OUTPUT_PATH = bpy.path.abspath('//test') +OUTPUT_PATH = bpy.path.abspath('//run') def CopyPythonLibs(dst, overwrite_lib, report=print): import platform diff --git a/tests/bin/test.blend b/utils/run.blend similarity index 63% rename from tests/bin/test.blend rename to utils/run.blend index e47bf8a11fb6d0fbeba049ab37fdc03e48fcccd1..56e8c4a66e10d58a5825f60da9410932f53401c7 100644 GIT binary patch delta 64793 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 From 1275d0644f80f6c8816d612683a5eb34af256d88 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 10 Apr 2024 17:21:45 +0200 Subject: [PATCH 4/7] adopt sphinx theme to match UPBGE styles --- docs/source/_static/rtd_dark.css | 190 +++++++ docs/source/_static/theme_overrides.css | 497 +++++++++++++++++ .../_static/theme_overrides_blender.css | 508 ++++++++++++++++++ docs/source/_static/upbge_logo.png | Bin 0 -> 15397 bytes docs/source/conf.py | 16 +- setup.py | 2 +- 6 files changed, 1210 insertions(+), 3 deletions(-) create mode 100644 docs/source/_static/rtd_dark.css create mode 100644 docs/source/_static/theme_overrides.css create mode 100644 docs/source/_static/theme_overrides_blender.css create mode 100644 docs/source/_static/upbge_logo.png diff --git a/docs/source/_static/rtd_dark.css b/docs/source/_static/rtd_dark.css new file mode 100644 index 0000000..0b401a7 --- /dev/null +++ b/docs/source/_static/rtd_dark.css @@ -0,0 +1,190 @@ +/*! + * @name Readthedocs + * @namespace http://userstyles.org + * @description Styles the documentation pages hosted on Readthedocs.io + * @author Anthony Post + * @homepage https://userstyles.org/styles/142968 + * @version 0.20170529055029 + * + * Modified by Aloïs Dreyfus: 20200527-1037 + * Modified by Erik Kalkoken: 20220615 + */ + +/* aum added */ +@media (prefers-color-scheme: dark) { + + .caption-text { + color: rgb(200, 200, 200); + } + + a.reference.internal { + color: rgb(240, 240, 240) !important; + background-color: rgb(30, 30, 30) !important; + } + + a.reference.internal.current { + color: rgb(200, 200, 200) !important; + background-color: rgb(50, 50, 50) !important; + } + + .admonition { + background-color: #2d2d2d !important; + } + + .admonition-title { + color: rgb(40, 40, 40) !important; + } + + .important .admonition-title { + background-color: #FF5A00 !important; + } + + .warning .admonition-title { + background-color: #FF302A !important; + } + + .seealso .admonition-title { + background-color: rgb(100, 100, 100) !important; + } + + .nt, .nf { + color: lightblue !important; + } + +/* Draws a box around menuselection role. */ +/* Temporary fix for "theme(0.2.5b2)" bug: no box around 'kbd' role. */ + .menuselection, .kbd.docutils.literal { + font-size: 90%; + font-weight: normal; + background-color: rgba(50, 50, 50, 0.65) !important; + color: white !important; + border: solid #E1E4E5 1px; + white-space: nowrap; + padding: 2px 5px; + } + + /* 'kbd' role. */ + .kbd.docutils.literal { + font-family: "Lato", "proxima-nova", + "Helvetica Neue", Arial, sans-serif; + font-size: 85%; + font-weight: normal; + color: white !important; + } + + figcaption { + margin-top: 10px !important; + } + + figure { + margin-bottom: 5px !important; + } + + .wy-body-for-nav { + text-align: justify; + background-color: rgb(40, 40, 40) !important; + } + + h3 { + margin-top: 5px !important; + } + + /* aum added end*/ + + /* .wy-menu-vertical li code { */ + /* color: rgba(200, 200, 200, 1.0) !important; */ + /* } */ + + /* .wy-menu-vertical .xref { */ + /* color: #2980B9 !important; */ + /* } */ + + a:visited { + color: #bf84d8; + } + + .rst-content .refbox .admonition-title{ + background-color: rgb(255, 90, 00) !important; + color: yellow; + } + + pre, .gh, .docutils.literal.notranslate { + background-color: rgb(40, 40, 40) !important; + color: white !important; + } + + .wy-nav-content { + background-color: rgb(30, 30, 30) !important; + color: rgb(240, 240, 240) !important; + } + + .method dt, .class dt, .data dt, .attribute dt, .function dt, + .descclassname, .descname { + background-color: #525252 !important; + color: white !important; + } + + /* .toc-backref { */ + /* background-color: blue !important; */ + /* /* color: grey !important; */ + /* } */ + + code.literal { + background-color: #2d2d2d !important; + border: 1px solid #6d6d6d !important; + } + + /* .wy-nav-content-wrap { */ + /* background-color: rgba(0, 0, 0, 1.0) !important; */ + /* } */ + + /* .sidebar { */ + /* background-color: #191919 !important; */ + /* } */ + + /* .sidebar-title { */ + /* background-color: #2b2b2b !important; */ + /* } */ + + .xref, .py-meth { + color: #7ec3e6 !important; + } + + /* .wy-side-nav-search { */ + /* background-color: rgb(80, 80, 80) !important; */ + /* /* background-color: inherit; */ + /* /* border-bottom: 1px solid #fcfcfc; */ + /* } */ + + .wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead { + background-color: #b9b9b9; + } + + .wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + color: rgb(200, 200, 200); + border: solid 2px #e1e4e5; + } + + .wy-table thead p, .rst-content table.docutils thead p, .rst-content table.field-list thead p { + margin: 0; + } + + .wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { + background-color: #343131; + } + + .highlight .m { + color: inherit + } + + /* Literal.Number */ + .highlight .nv { + color: #3a7ca8 + } + + /* Name.Variable */ + .rst-content .section .admonition ul { + margin-bottom: 0; + } + +} diff --git a/docs/source/_static/theme_overrides.css b/docs/source/_static/theme_overrides.css new file mode 100644 index 0000000..85015c0 --- /dev/null +++ b/docs/source/_static/theme_overrides.css @@ -0,0 +1,497 @@ +/* + * This stylesheet is applied after the theme's default one, + * and thus any overrides or additions can be added here. + * + * More info: + * https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_css_file + */ +/* aum added */ +/* --- aum dark ------------------------------------------------------------- */ +@media (prefers-color-scheme: dark) { +/* Draws a box around menuselection & kbd & code & logic node role. */ + .socket { + line-height: 4em !important; + } + .center { text-align: center; } + .menuselection, + .kbd.docutils.literal.notranslate, + code.docutils.literal.notranslate, + .ln, + .py { + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif !important; + font-size: 90% !important; + font-weight: normal !important; + background-color: #101010 !important; + color: white !important; + white-space: normal !important; + /* white-space: nowrap !important; */ + padding: 2px 4px !important; + border: 1px solid #40a6e5 !important; + border-radius: 4px !important; + } + .kbd.docutils.literal.notranslate { + border: 1px solid #529952 !important; + box-shadow: none !important; + font-size: 90% !important; + } + .kbd.compound .docutils.notranslate { + border: none !important; + margin: -2px !important; + font-size: 100% !important; + } + code.docutils.literal.notranslate { + border: 1px solid #b97e4d !important; + font-size: 90% !important; + } +/* --- aum : custom '.. role:: ln' --------------------------------------- */ + .ln { + border: 1px solid #83314a !important; + background-color: transparent !important; + font-size: 90% !important; + } +/* --- aum : custom '.. role:: py' --------------------------------------- */ + .py { + border: 1px solid #ffcf3f !important; + background-color: transparent !important; + font-size: 90% !important; + } +/* --- aum : custom '.. role:: py' end ----------------------------------- */ + a.reference.internal:visited { + color: #999999 !important; + } + a.reference.internal:hover { + color: #40a6e5 !important; + } + code.xref.docutils.literal.notranslate:hover { + color: #40a6e5 !important; + } + a.reference.internal { + color: #9f61b9 !important; + background-color: #1e1e1e !important; + } + a.reference.internal.current { + color: rgb(200, 200, 200) !important; + background-color: rgb(50, 50, 50) !important; + } + .caption-text { + color: rgb(200, 200, 200); + } + .admonition { + background-color: #2d2d2d !important; + } + .admonition a.reference.internal { + background-color: transparent !important; + } + .admonition-title { + color: rgb(40, 40, 40) !important; + } + .important .admonition-title { + background-color: #FF5A00 !important; + } + .warning .admonition-title { + background-color: #FF302A !important; + } + .seealso .admonition-title { + background-color: rgb(100, 100, 100) !important; + } + .nt, .nf { + color: lightblue !important; + } + figcaption { + margin-bottom: -10px !important; + margin-top: 7px !important; + padding-left: 10px !important; + padding-right: 10px !important; + } + figure { + margin-bottom: -10px !important; + margin-top: 10px !important; + /*border: 1px solid #606060;*/ + /*padding: 5px;*/ + } + .wy-body-for-nav { + text-align: justify; + background-color: rgb(40, 40, 40) !important; + } + h3 { + margin-top: 5px !important; + } + .rst-content .refbox .admonition-title{ + background-color: rgb(255, 90, 00) !important; + color: yellow; + } + pre, .gh, .docutils.literal.notranslate { + background-color: rgb(40, 40, 40) !important; + color: white !important; + } + .wy-nav-content { + background-color: rgb(30, 30, 30) !important; + color: rgb(240, 240, 240) !important; + } + .method dt, .class dt, .data dt, .attribute dt, .function dt, + .descclassname, .descname { + background-color: #525252 !important; + color: white !important; + } + .xref, .py-meth { + color: #7ec3e6 !important; + } + .wy-table thead, .rst-content table.docutils thead, .rst-content table.field-list thead { + background-color: #b9b9b9; + } + .wy-table thead th, .rst-content table.docutils thead th, .rst-content table.field-list thead th { + color: #404040; + border: solid 2px #e1e4e5; + } + .wy-table thead p, .rst-content table.docutils thead p, .rst-content table.field-list thead p { + margin: 0; + } + .wy-table-odd td, .wy-table-striped tr:nth-child(2n-1) td, .rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td { + background-color: #343131; + } + td a.reference.internal { + background-color: transparent !important; + } + .highlight .m { + color: inherit + } + /* Literal.Number */ + .highlight .nv { + color: #3a7ca8 + } + /* Name.Variable */ + .rst-content .section .admonition ul { + margin-bottom: 0; + } +} +/* --- aum dark mode end --------------------------------------------------------------------------------- */ +h5 {margin-bottom: 5px} +/* Sidebar menu links. */ +.wy-menu-vertical li.toctree-l2.current li.toctree-l3 > a:hover {background: #c0c0c0} +.wy-menu-vertical li.toctree-l3.current li.toctree-l4 > a:hover {background: #b5b5b5} +.wy-menu-vertical li.toctree-l4 {font-size: 1em} +.wy-menu-vertical li.current a {border: 0} +.wy-side-nav-search > a:hover {background: none; opacity: 0.9} +.wy-side-nav-search > a.icon::before {content: none} +/* 'kbd' role. */ +.kbd.docutils.literal { + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + font-size: 85%; + font-weight: normal; + color: #404040; +} +/* Ensure background of input fields is light color even when a local theme wants it to be dark. */ +input[type="text"], +input[type="search"], +input[type="password"], +input[type="email"], +input[type="url"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="number"], +input[type="tel"], +input[type="color"] { + background-color:#FCFCFC; +} +/* Fixes overlay of "align-right" images on block. */ +/* aum : does not work as expected ; workaround - move admonitions to the bottom of text */ +.rst-content .admonition {overflow: auto} +/* Boxed paragraphs. */ +.rst-content .refbox .admonition-title {background-color: #bbb} +.rst-content .refbox { + -webkit-font-smoothing: antialiased; + background-color: #e3e3e3; + line-height: 24px; + margin-bottom: 24px; padding: 12px; +} +.rst-content .seealso .admonition-title {background-color: #7a87e6} +.rst-content .seealso {background-color: #e7ebfa} +.rst-content .important .admonition-title {background-color: #ddca3b} +.rst-content .important {background-color: #f6f3a5} +/* refbox =, seealso ( > ), note ( i ), tip i , hint (+), warn / ! \ */ +.refbox .admonition-title::before {content:"\f00b"} +.seealso .admonition-title::before{content:"\f138"} +.note .admonition-title::before{content:"\f05a"} +.tip .admonition-title::before{content:"\f129"; width: 0.75em; text-align: center} +.hint .admonition-title::before{content:"\f055"} +.warning .admonition-title::before{content:"\f071"} +/* 'refbox' field. */ +.refbox .field-list .field-name, .refbox .field-list .field-body { + padding: 0px; +} +.refbox dl dt {font-weight: normal} +/* Ugly 'red' literals. */ +.rst-content tt.literal, .rst-content tt.literal, .rst-content code.literal { + color:#606060; +} +/* Literal blocks that use too much padding, make them look like regular literals. */ +/* +.rst-content pre.literal-block { + font-size: 75%; + margin:0; + padding:2px 4px; + color:#404040; + background: #ffffff; + white-space: normal; + display: inline; +} */ +/* Fix definitions with different ids. */ +.rst-content dl.simple { + margin-bottom: 0px; +} +/* Fix nested block spacing. */ +.rst-content .document dl dt, +.rst-content dd dl, +.rst-content dl.field-list dd > p { + margin: 0; +} +/* Dont indent field lists */ +.rst-content dl.field-list dt { + padding-left: 0 !important; +} +/* Fix padding for normal definitions nested in field lists */ +.rst-content dl.field-list dd > dl.simple { + padding-top: 12px; +} +/* Without this, paragraphs in bullet points within definition lists have too much vertical padding. */ +.rst-content li > p { + margin-bottom: 0px !important; +} +/* TABLE & FIGURE */ +/* Moves captions to bottom. */ +table {caption-side: bottom} +/* captions text style */ +.rst-content .figure .caption, +.rst-content table.docutils caption, +.rst-content table.field-list caption { + font: italic 90%/18px Lato, proxima-nova, 'Helvetica Neue', Arial, sans-serif; + color: #808080; +} +/* Captions top padding. */ +.rst-content .figure .caption { margin: 4px; } +.rst-content table.docutils caption { padding: 0.5em; } +/* Text word wrap. */ +.wy-table-responsive table td, +.wy-table-responsive table th { white-space: normal; } +/* Cell's vertical align. */ +/* use "valign" class for middle align. */ +.rst-content table.docutils:not(.valign) td { vertical-align: baseline; } +/* Field list align. */ +.rst-content table.field-list td { padding-top: 8px; } +/* Perma-link to table, hide until hover. */ +.rst-content table.docutils caption .headerlink { visibility: hidden; } +.rst-content table.docutils caption:hover .headerlink { visibility: visible; } +/* Table header cells border color. */ +.rst-content table.docutils th { border-color: #e1e4e5; } +/* Figure in table margin. */ +.rst-content td div.figure { + margin-top: 4px; margin-bottom: 0; +} +/* Figure legend. */ +.legend { + font-size: 90%; + color: #484848; + margin-top: -20px; +} +.rst-content dl .legend { margin-top: -10px; } +@media screen and (max-width: 768px){ + .wy-table-responsive table:not(.footnote) { min-width: 520px; } + .rst-content table.docutils caption { text-align: left; } + img { width: auto; } +} +/* End TABLE & FIGURE. */ +/* Video center. */ +iframe { + display: block; + margin: 0 auto 24px auto; +} +/* Copyright font scale down. */ +footer p{ font-size: smaller} +.footer-contribute { + display: block; + font-size: smaller; + margin-top: -12px +} +.footer-contribute li { + display: inline; + list-style-type: none; + padding-right: 20px; +} +/* Breadcrumbs "Docs" to icon. */ +.wy-breadcrumbs-aside a { + position: absolute; + top: 2px; + right: 0; +} +.wy-breadcrumbs li:first-child a { + line-height: 0; + font-size: 0; +} +.wy-breadcrumbs li:first-child a::before { + content: "\f015"; + font: 16px/1 FontAwesome; +} +/* Spacing bugfix. */ +.wy-breadcrumbs li a:first-child{padding: 5px} +.wy-breadcrumbs li:first-child a{padding-left: 0} +.wy-breadcrumbs li:nth-last-child(2){padding-left: 5px} +/* Block-quote > dl bugfix. */ +.rst-content dl{line-height:normal} +/* multi-paragraph dl bugfix */ +.rst-content dl p{line-height:inherit} +/* Quotes for Fig. "link". */ +a[href^="#fig-"]::before {content: "\201c";} +a[href^="#fig-"]::after {content: "\201d";} +/* Intermediate headline. */ +.rubric {font-family: "Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} +/* ".. container::" lead, block text float around image. */ +.lead { + clear: both; width: 100%; +} +/* Mark external links. */ +a.external {color:#656AE0;} +/* List blender.org as internal. */ +.external[href^="https://www.blender.org"], .external[href^="https://docs.blender.org"], .external[href^="https://wiki.blender.org"] { + color:#2980B9; +} +/* Draws a box around menuselection role. */ +/* Temporary fix for "theme(0.2.5b2)" bug: no box around 'kbd' role. */ +.menuselection, .kbd.docutils.literal { + font-size: 90%; + font-weight: normal; + background-color: rgba(255, 255, 255, 0.65); + border: solid #E1E4E5 1px; + white-space: nowrap; + padding: 2px 5px; +} +@media screen and (max-width: 420px) { + .menuselection {white-space: normal} +} +.caption .menuselection { + background-color: transparent; + border: none; +} +.caption .kbd {background-color: transparent} +/* Remove indent on line break. */ +.rst-content .line-block {margin-left: 0px} +/* Applied on main index:sections. */ +/* Start section description. */ +@media screen and (min-width: 450px){ + .tocdescr { + display: flex; display: -webkit-flex; + flex-flow: row wrap; -webkit-flex-flow: row wrap; + justify-content: space-between; -webkit-justify-content: space-between; + align-items: flex-start; -webkit-align-items: flex-start; + align-content: flex-start; -webkit-align-content: flex-start; + list-style-type: none; + margin-bottom: 10px; + } + /* Dan Andreasson on Stack Overflow. */ + .tocdescr:after { + content: ""; + flex: 1 0 33.3%; -webkit-flex: 1 0 33.3%; + margin-left: 45px; + align-self: stretch; -webkit-align-self: stretch; + } +} +@media screen and (max-width: 450px) { + .tocdescr { + display: flex; display: -webkit-flex; + flex-flow: column wrap; -webkit-flex-flow: column wrap; + justify-content: space-between; -webkit-justify-content: space-between; + align-items: flex-start; -webkit-align-items: flex-start; + align-content: flex-start; -webkit-align-content: flex-start; + list-style-type: none; + margin-bottom: 10px; + } + .tocdescr:after { + content: ""; + flex: none; -webkit-flex: none; + } +} +.descr { + flex: 2 0 33.3%; -webkit-flex: 2 0 33.3%; + margin: 10px 15px; + border-radius: .3em; + user-select: none; +} +.descr div.figure { + margin-bottom: 0px; + display: block; +} +.descr img { + border-top-left-radius: .3em; + border-top-right-radius: .3em; +} +.descr dl {margin-bottom: 10px} +.descr dl dt > a { + display: block; + width: 100%; + margin-bottom: 10px; +} +.descr dl dt a em, .descr dl dt a span{ + font-weight: bold; + font-style: normal; + font-size: 1.3em; +} +.descr dl dt{padding: 18px 15px 0px!important} +.descr dl dd{ + padding: 0px 15px; + font-style: normal; + margin: 0px; + color: #808080; + font-size: 90%; +} +.descr { + box-shadow: + rgba(0,0,0,0.05) 0px 1px 4px 0px, + rgba(211,216,223,0.33) 0px 15px 20px -1px; +} +#getting-started .descr { + box-shadow: none; +} +/* End section description. */ +/* Start custom toctree. */ +.toctree-wrapper .toctree-l1 > a {margin-bottom: 0.15em} +/* Indent all lines following the first. */ +.toctree-wrapper * a { + display: block; + width: 90%; + text-indent: -1em; + margin-left: 1em;/*invert indent*/ + padding-top: 0.25em; + line-height: 1.25em; +} +/* Underline provided by nested ul (not li). */ +.toctree-wrapper * ul { + padding-left: 2em; + border-top: solid #ececec 1px; +} +.toctree-wrapper > ul {margin-left: 1em} +.rst-content .toctree-wrapper ul li ul { + margin-bottom: 0.75em; + padding-top: 0.5em; +} +.rst-content .toctree-wrapper ul li a:hover {color: #25afef} +.rst-content .toctree-wrapper ul li a:visited:hover {color: #C961DA} +.toctree-wrapper .toctree-l1 > a{font-size: 104%} +.toctree-wrapper .toctree-l2 > a{font-size: 102%} +.toctree-wrapper .toctree-l3 > a{font-size: 100%} +.toctree-wrapper .toctree-l1 > ul{border-color: #bfbfbf} +.toctree-wrapper .toctree-l2 > ul{border-color: #e1e0e0} +.toctree-wrapper .toctree-l3 > ul{border-color: #ececec} +/* Remove list styling, css rule hierarchy. */ +.rst-content .toctree-wrapper ul li, .rst-content .toctree-wrapper ul li li , .rst-content .toctree-wrapper ul li li li { + list-style-type: none; + margin-left: 0px; +} +/* End custom toctree. */ +/* Start genindex consistency. */ +.genindextable * strong {font-weight: normal} +.genindex-jumpbox {margin-bottom: 1.245em} +.indextable {margin-bottom: 1.245em} +/* End genindex consistency. */ diff --git a/docs/source/_static/theme_overrides_blender.css b/docs/source/_static/theme_overrides_blender.css new file mode 100644 index 0000000..563732e --- /dev/null +++ b/docs/source/_static/theme_overrides_blender.css @@ -0,0 +1,508 @@ +/* + * This stylesheet is applied after the theme's default one, + * and thus any overrides or additions can be added here. + * + * More info: + * https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx.application.Sphinx.add_css_file + */ + +h5 { + margin-bottom: 5px +} + +/* Sidebar menu links. */ +.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a:hover { + background: #c0c0c0 +} + +.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a:hover { + background: #b5b5b5 +} + +.wy-menu-vertical li.toctree-l4 { + font-size: 1em +} + +.wy-menu-vertical li.current a { + border: 0 +} + +.wy-side-nav-search>a:hover { + background: none; + opacity: 0.9 +} + +.wy-side-nav-search>a.icon::before { + content: none +} + +.wy-menu-vertical p.caption { + color: #e6e6e6; +} + +/* Ensure background of input fields is light color even when a local theme wants it to be dark. */ +input[type="text"], +input[type="search"], +input[type="password"], +input[type="email"], +input[type="url"], +input[type="date"], +input[type="month"], +input[type="week"], +input[type="time"], +input[type="datetime"], +input[type="datetime-local"], +input[type="number"], +input[type="tel"], +input[type="color"] { + background-color: #FCFCFC; +} + +/* Boxed paragraphs. */ +.rst-content .refbox .admonition-title { + background-color: #bbb +} + +.rst-content .refbox { + background-color: #e3e3e3 +} + +.rst-content .seealso .admonition-title { + background-color: #7a87e6 +} + +.rst-content .seealso { + background-color: #e7ebfa +} + +.rst-content .important .admonition-title { + background-color: #ddca3b +} + +.rst-content .important { + background-color: #f6f3a5 +} + +/* refbox =, seealso ( > ), note ( i ), tip i , hint (+), warn / ! \ */ +.refbox .admonition-title::before { + content: "\f00b" +} + +.seealso .admonition-title::before { + content: "\f138" +} + +.note .admonition-title::before { + content: "\f05a" +} + +.tip .admonition-title::before { + content: "\f129"; + width: 0.75em; + text-align: center +} + +.hint .admonition-title::before { + content: "\f055" +} + +.warning .admonition-title::before { + content: "\f071" +} + +/* 'refbox' field. */ +.refbox .field-list .field-name, +.refbox .field-list .field-body { + padding: 0px; +} + +.refbox dl dt { + font-weight: normal +} + +/* Ugly 'red' literals. */ +.rst-content tt.literal, +.rst-content tt.literal, +.rst-content code.literal { + color: #404040; + border-radius: .4em; +} + +/* Literal blocks that use too much padding, make them look like regular literals. */ +.rst-content pre.literal-block { + font-size: 75%; + margin: 0; + padding: 2px 4px; + color: #404040; + background: #ffffff; + white-space: normal; + display: inline; + border-radius: .4em; +} + +/* Fix definisions with different ids. */ +.rst-content dl.simple { + margin-bottom: 0px; +} + +/* Fix nested block spacing. */ +.rst-content .document dl dt, +.rst-content dd dl, +.rst-content dl.field-list dd>p { + margin: 0; +} + +/* Dont indent field lists */ +.rst-content dl.field-list dt { + padding-left: 0 !important; +} + +/* Fix padding for normal definitions nested in field lists */ +.rst-content dl.field-list dd>dl.simple { + padding-top: 12px; +} + +/* Without this, paragraphs in bullet points within definition lists have too much vertical padding. */ +.rst-content li>p { + margin-bottom: 0px !important; +} + +/* TABLE & FIGURE */ + +/* captions text style */ +.rst-content .figure .caption, +.rst-content figure figcaption>p, +.rst-content table.docutils caption, +.rst-content table.field-list caption { + font: italic 90%/18px Lato, proxima-nova, 'Helvetica Neue', Arial, sans-serif; + color: #808080; +} + +/* Captions top padding. */ +.rst-content .figure .caption, +.rst-content figure figcaption { + margin-top: 4px; +} + +.rst-content table.docutils caption { + padding: 0.5em; +} + +/* Text word wrap. */ +.wy-table-responsive table td, +.wy-table-responsive table th { + white-space: normal; +} + +/* Cell's vertical align. */ +/* use "valign" class for middle align. */ +.rst-content table.docutils:not(.valign) td { + vertical-align: baseline; +} + +/* Field list align. */ +.rst-content table.field-list td { + padding-top: 8px; +} + +/* Table header cells border color. */ +.rst-content table.docutils th { + border-color: #e1e4e5; +} + +/* Figure in table margin. */ +.rst-content td div.figure, +.rst-content td figure { + margin-top: 4px; + margin-bottom: 0; +} + +/* Figure legend. */ +.legend { + font-size: 90%; + color: #484848; + margin-top: -20px; +} + +.rst-content dl .legend { + margin-top: -10px; +} + +@media screen and (max-width: 768px) { + + .wy-table-responsive table:not(.footnote) { + min-width: 520px; + } + + .rst-content table.docutils caption { + text-align: left; + } + + img { + width: auto; + } + +} + +/* End TABLE & FIGURE. */ + +/* Video center. */ +iframe { + display: block; + margin: 0 auto 24px auto; + border: 0; + max-width: 100%; +} + +/* Copyright font scale down. */ +footer p { + font-size: smaller +} + +.footer-contribute { + display: block; + font-size: smaller; + margin-top: -12px +} + +.footer-contribute li { + display: inline; + list-style-type: none; + padding-right: 20px; +} + +/* Quotes for Fig. "link". */ +a[href^="#fig-"]::before { + content: "\201c"; +} + +a[href^="#fig-"]::after { + content: "\201d"; +} + +/* Intermediate headline. */ +.rubric { + font-family: "Roboto Slab", "ff-tisa-web-pro", "Georgia", Arial, sans-serif +} + +/* ".. container::" lead, block text float around image. */ +.lead { + clear: both; + width: 100%; +} + +/* Mark external links. */ +a.external { + color: #656AE0; +} + +/* List blender.org as internal. */ +.external[href^="https://www.blender.org"], +.external[href^="https://docs.blender.org"], +.external[href^="https://wiki.blender.org"] { + color: #2980B9; +} + +/* Draws a box around menuselection role. */ +.menuselection { + font-family: "Lato", "proxima-nova", "Helvetica Neue", Arial, sans-serif; + font-size: 90%; + font-weight: normal; + background-color: rgba(255, 255, 255, 0.65); + border: solid #E1E4E5 1px; + padding: 2px 5px; + border-radius: .4em; +} + +@media screen and (max-width: 420px) { + .menuselection { + white-space: normal + } +} + +.caption .menuselection { + background-color: transparent; + border: none; +} + +/* Remove indent on line break. */ +.rst-content .line-block { + margin-left: 0px +} + +/* Applied on main index:sections. */ + +.global-index-toc { + display: none; +} + +/* Start section cards. */ +.toc-cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(225px, 1fr)); + grid-gap: 20px; + list-style-type: none; + margin-bottom: 24px; +} + +.card { + border-radius: .3em; + user-select: none; +} + +.card div.figure, +.card figure { + margin-bottom: 0px; + display: block; +} + +.card img { + border-top-left-radius: .3em; + border-top-right-radius: .3em; +} + +.card dl { + margin-bottom: 10px +} + +.card dl dt>a { + display: block; + width: 100%; + margin-bottom: 10px; +} + +.card dl dt a em, +.card dl dt a span { + font-weight: bold; + font-style: normal; + font-size: 1.3em; +} + +.card dl dt { + padding: 18px 15px 0px !important +} + +.card dl dd { + padding: 0px 15px 5px 15px; + font-style: normal; + margin: 0px; + color: #808080; + font-size: 90%; +} + +.card { + box-shadow: rgba(0, 0, 0, 0.05) 0px 1px 4px 0px, + rgba(211, 216, 223, 0.33) 0px 15px 20px -1px; +} + +#getting-started .card { + box-shadow: none; +} + +/* End section cards. */ + +/* Start custom toctree. */ +.toctree-wrapper .toctree-l1>a { + margin-bottom: 0.15em +} + +/* Indent all lines following the first. */ +.toctree-wrapper * a { + display: block; + width: 90%; + text-indent: -1em; + margin-left: 1em; + /*invert indent*/ + padding-top: 0.25em; + line-height: 1.25em; +} + +/* Underline provided by nested ul (not li). */ +.toctree-wrapper * ul { + padding-left: 2em; + border-top: solid #ececec 1px; +} + +.toctree-wrapper>ul { + margin-left: 1em +} + +.rst-content .toctree-wrapper ul li ul { + margin-bottom: 0.75em; + padding-top: 0.5em; +} + +.rst-content .toctree-wrapper ul li a:hover { + color: #25afef +} + +.rst-content .toctree-wrapper ul li a:visited:hover { + color: #C961DA +} + +.toctree-wrapper .toctree-l1>a { + font-size: 104% +} + +.toctree-wrapper .toctree-l2>a { + font-size: 102% +} + +.toctree-wrapper .toctree-l3>a { + font-size: 100% +} + +.toctree-wrapper .toctree-l1>ul { + border-color: #bfbfbf +} + +.toctree-wrapper .toctree-l2>ul { + border-color: #e1e0e0 +} + +.toctree-wrapper .toctree-l3>ul { + border-color: #ececec +} + +/* Remove list styling, css rule hierarchy. */ +.rst-content .toctree-wrapper ul li, +.rst-content .toctree-wrapper ul li li, +.rst-content .toctree-wrapper ul li li li { + list-style-type: none; + margin-left: 0px; +} + +/* End custom toctree. */ + +/* Start genindex consistency. */ +.genindextable * strong { + font-weight: normal +} + +.genindex-jumpbox { + margin-bottom: 1.245em +} + +.indextable { + margin-bottom: 1.245em +} + +/* End genindex consistency. */ + +/* Correctly display keyboard shortcuts inside definition lists (theme.css explicitly excludes this case for some reason) */ +dt>kbd { + font-weight: normal; + font-size: 80%; + background-color: #fff; + border: 1px solid #a6a6a6; + border-radius: 4px; + box-shadow: 0 2px grey; + padding: 2.4px 6px; + margin: auto 0; +} + +/* Fixes to field list, see #104636 */ + +.field-list { + grid-template-columns: fit-content(24px) auto !important; +} \ No newline at end of file diff --git a/docs/source/_static/upbge_logo.png b/docs/source/_static/upbge_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..555896206700d2b03675e38afd3212a67b5df9c0 GIT binary patch literal 15397 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 HEkgef>eaLF literal 0 HcmV?d00001 diff --git a/docs/source/conf.py b/docs/source/conf.py index c6ce977..f0621f5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -14,7 +14,10 @@ # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration -extensions = ['sphinx.ext.autodoc'] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx_rtd_theme' +] templates_path = ['_templates'] exclude_patterns = [] @@ -24,5 +27,14 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = 'alabaster' +html_logo = '_static/upbge_logo.png' +html_title = 'UPLOGIC Manual' +html_theme = 'sphinx_rtd_theme' html_static_path = ['_static'] +html_theme_options = { + "navigation_with_keys": True, + # included in the title + "display_version": False, + "collapse_navigation": True, # slows build down; useful + "navigation_depth": 3, +} diff --git a/setup.py b/setup.py index 6812b1e..4421183 100644 --- a/setup.py +++ b/setup.py @@ -62,6 +62,6 @@ def read_file(name): install_requires=['setuptools'], extras_require=dict( test=['pytest', 'coverage'], - docs=['sphinx'] + docs=['sphinx', 'sphinx_rtd_theme'] ) ) From 25d1acb864e9b62b5517eae9d07d2fcc8929cc0b Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 10 Apr 2024 17:23:36 +0200 Subject: [PATCH 5/7] add isort and ruff configs --- .isort.cfg | 5 +++++ ruff.toml | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 .isort.cfg create mode 100644 ruff.toml diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..3757f91 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,5 @@ +[settings] +force_grid_wrap = 2 +multi_line_output = 3 +include_trailing_comma = false +force_alphabetical_sort = true diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..0154064 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,2 @@ +target-version = "py310" +quote-style = "singe" From 7683a5ce5678a38a817da2d7804c720c7e783c95 Mon Sep 17 00:00:00 2001 From: Robert Niederreiter Date: Wed, 10 Apr 2024 17:26:37 +0200 Subject: [PATCH 6/7] fix ruff config --- Makefile | 4 ++-- ruff.toml | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ec696f4..e166375 100644 --- a/Makefile +++ b/Makefile @@ -97,13 +97,13 @@ MXMAKE?=mxmake # Source folder to scan for Python files to run ruff on. # Default: src -RUFF_SRC?=src +RUFF_SRC?=uplogic ## qa.isort # Source folder to scan for Python files to run isort on. # Default: src -ISORT_SRC?=src +ISORT_SRC?=uplogic ## docs.sphinx diff --git a/ruff.toml b/ruff.toml index 0154064..5979882 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,2 +1,4 @@ target-version = "py310" -quote-style = "singe" + +[format] +quote-style = "single" From 9f24b61a293fd62dd5dc3d7c54e616ca7fe24ea9 Mon Sep 17 00:00:00 2001 From: IzaZed Date: Sat, 27 Apr 2024 14:28:51 +0200 Subject: [PATCH 7/7] make changes for windows --- Makefile | 8 ++++++++ include.mk | 13 ++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e166375..24d22a8 100644 --- a/Makefile +++ b/Makefile @@ -39,14 +39,22 @@ INCLUDE_MAKEFILE?=include.mk # `/path/to/dir/:/path/to/other/dir`. Gets inserted first, thus gets searched # first. # No default value. +ifeq ("$(OS)", "Windows_NT") +EXTRA_PATH?=./bin/3.6/python/bin:./bin/3.6/python/Scripts +else EXTRA_PATH?=./bin/3.6/python/bin +endif ## 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 +ifeq ("$(OS)", "Windows_NT") +PRIMARY_PYTHON?=python +else PRIMARY_PYTHON?=python3.10 +endif # Minimum required Python version. # Default: 3.7 diff --git a/include.mk b/include.mk index 4b1b343..38909cf 100644 --- a/include.mk +++ b/include.mk @@ -2,8 +2,13 @@ # upbge ############################################################################## +ifeq ("$(OS)", "Windows_NT") +UPBGE_VERSION=upbge-0.36.1-windows-x86_64 +UPBGE_TARBALL=$(UPBGE_VERSION).7z +else UPBGE_VERSION=upbge-0.36.1-linux-x86_64 UPBGE_TARBALL=$(UPBGE_VERSION).tar.xz +endif UPBGE_URL=https://github.com/UPBGE/upbge/releases/download/v0.36.1/$(UPBGE_TARBALL) UPBGE_DONWLOAD_FOLDER?=$(MXMAKE_FOLDER)/downloads @@ -11,14 +16,16 @@ UPBGE_DOWNLOAD_TARGET:=$(SENTINEL_FOLDER)/upbge-download.sentinel $(UPBGE_DOWNLOAD_TARGET): $(SENTINEL) @echo "Download upbge tarball" @mkdir -p $(UPBGE_DONWLOAD_FOLDER) - @pushd $(UPBGE_DONWLOAD_FOLDER) - @wget $(UPBGE_URL) - @popd + @wget -P $(UPBGE_DONWLOAD_FOLDER) $(UPBGE_URL) @touch $(UPBGE_DOWNLOAD_TARGET) UPBGE_EXTRACT_TARGET:=$(SENTINEL_FOLDER)/upbge-extract.sentinel $(UPBGE_EXTRACT_TARGET): $(UPBGE_DOWNLOAD_TARGET) +ifeq ("$(OS)", "Windows_NT") + @7z x $(UPBGE_DONWLOAD_FOLDER)/$(UPBGE_TARBALL) +else @tar xf $(UPBGE_DONWLOAD_FOLDER)/$(UPBGE_TARBALL) -C . +endif @mv $(UPBGE_VERSION) bin @touch $(UPBGE_EXTRACT_TARGET)