From 34a98374b1878cb35f30b186604115465c5fddd2 Mon Sep 17 00:00:00 2001 From: Jonas Thiem Date: Sun, 16 Jun 2019 05:32:22 +0200 Subject: [PATCH 01/35] Fix debug build missing symbols and other related issues - fixes that a debug (non-`--release`) `.apk` build won't actually enable gdb debugging in the manifest - renames `build.py`'s `parse_args` to `parse_args_and_make_package` because that is what it appears to be actually doing :smile: - makes SDL2 and any standard `NDKRecipe` build with `NDK_DEBUG=1` when `--release` is not specified to add debugging symbols - fixes debugging symbols being stripped even when not using `--releaase` which makes using gdb a hassle --- .../bootstraps/common/build/build.py | 14 ++++++--- .../common/build/templates/build.tmpl.gradle | 6 ++++ pythonforandroid/bootstraps/sdl2/__init__.py | 3 +- .../build/templates/AndroidManifest.tmpl.xml | 1 + .../bootstraps/service_only/__init__.py | 3 +- .../bootstraps/webview/__init__.py | 3 +- pythonforandroid/build.py | 11 ++++--- pythonforandroid/recipe.py | 4 ++- pythonforandroid/recipes/sdl2/__init__.py | 7 ++++- pythonforandroid/toolchain.py | 20 +++++++++++-- tests/test_build.py | 29 +++++++++++++++++++ 11 files changed, 85 insertions(+), 16 deletions(-) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index ed5e708892..f32047d417 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -486,7 +486,8 @@ def make_package(args): "args": args, "service": service, "service_names": service_names, - "android_api": android_api + "android_api": android_api, + "debug": "debug" in args.build_mode, } if get_bootstrap_name() == "sdl2": render_args["url_scheme"] = url_scheme @@ -509,7 +510,8 @@ def make_package(args): aars=aars, jars=jars, android_api=android_api, - build_tools_version=build_tools_version + build_tools_version=build_tools_version, + debug_build="debug" in args.build_mode, ) # ant build templates @@ -574,7 +576,7 @@ def make_package(args): raise e -def parse_args(args=None): +def parse_args_and_make_package(args=None): global BLACKLIST_PATTERNS, WHITELIST_PATTERNS, PYTHON # Get the default minsdk, equal to the NDK API that this dist is built against @@ -674,6 +676,10 @@ def parse_args(args=None): default=join(curdir, 'whitelist.txt'), help=('Use a whitelist file to prevent blacklisting of ' 'file in the final APK')) + ap.add_argument('--release', dest='build_mode', action='store_const', + const='release', default='debug', + help='Build your app as a non-debug release build. ' + '(Disables gdb debugging among other things)') ap.add_argument('--add-jar', dest='add_jar', action='append', help=('Add a Java .jar to the libs, so you can access its ' 'classes with pyjnius. You can specify this ' @@ -817,4 +823,4 @@ def _read_configuration(): if __name__ == "__main__": - parse_args() + parse_args_and_make_package() diff --git a/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle b/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle index 32bd091b72..a77f4b22b9 100644 --- a/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle +++ b/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle @@ -31,6 +31,12 @@ android { versionName '{{ args.version }}' } + {% if debug_build -%} + packagingOptions { + doNotStrip '**/*.so' + } + {%- endif %} + {% if args.sign -%} signingConfigs { release { diff --git a/pythonforandroid/bootstraps/sdl2/__init__.py b/pythonforandroid/bootstraps/sdl2/__init__.py index dde5f7f79b..99b8779ffa 100644 --- a/pythonforandroid/bootstraps/sdl2/__init__.py +++ b/pythonforandroid/bootstraps/sdl2/__init__.py @@ -47,7 +47,8 @@ def run_distribute(self): with open('blacklist.txt', 'a') as fileh: fileh.write('\nsqlite3/*\nlib-dynload/_sqlite3.so\n') - self.strip_libraries(arch) + if not self.ctx.build_as_debuggable: + self.strip_libraries(arch) self.fry_eggs(site_packages_dir) super(SDL2GradleBootstrap, self).run_distribute() diff --git a/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml b/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml index 119a4daefd..95450fe1b8 100644 --- a/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml +++ b/pythonforandroid/bootstraps/sdl2/build/templates/AndroidManifest.tmpl.xml @@ -52,6 +52,7 @@ An example Java class can be found in README-android.txt --> Date: Mon, 30 Mar 2020 15:08:38 +0200 Subject: [PATCH 02/35] :fire: Drop Python 2 support (#2105) * :fire: Remove `hostpython2` recipe * :fire: Remove `python2` recipe * :fire: Remove python2 related from `ci/constants` * :fire: Remove python2 environ/tests from `tox` * :fire: Remove python2 code from `PythonUtil.java` * :fire: Remove python2 patch from `recipes/numpy` * :fire: Remove python2 code from `ci/rebuild_updated_recipes` * :fire: Remove `test_entrypoints_python2.py` * :fire: Remove python2 code from `start.c` * :fire: Remove python2 testapps * :fire: Remove python2 code from `bs/common/build/build.py` * :bento: Update shebang: from `python2` to `python` * :bento: Update requirements for `testlauncher_setup` * :fire: Remove python2 from class `Bootstrap.recipe_depends` * :fire: Remove python2 code from `recipe.py` * :fire: Remove `Dockerfile.py2` * :bento: Update docstring example for `ToolchainCL.recipes` `python2` it will not be a conflict anymore, since it doesn't exist. * :fire: Remove `note` about `python2` target * :bento: Update `android` recipe to avoid `python2` * :fire: Remove `python2` from recipes's `depends` * :fire: Remove `hostpython2` from recipes's `depends` * :fire: Remove `python2` from recipes's `conflicts` * :bento: Change `hostpython2` to `hostpython3` for `mysqldb` recipe * :fire: Remove python2 code from `python` module * :white_check_mark: Update tests to work without `python2` * :bento: Update `ndghttpsclient` recipe? This is strange...that recipe should be in a folder right? * :fire: Remove python2 tests from `Makefile`, `travis.yml` and `push.yml` * :fire: Remove `make_python_zip` Because we don't use it anymore. We used to package `python2` but our `python3` was never zipped with that function, so there is no point to maintain it now that we get rid of python2. * :pencil: Update docs * Clean up README for Python 2 changes * Update Python version support documentation * Removed Python 2 app build from release process This build was only there to check Python 2 support, so it's fine to skip it now. * Made note about python2 support more explicit * Changed a /usr/bin/env call to explicitly python3 I think being explicit is still best practice, correct me if I'm wrong. We don't really support calling this script directly any more anyway, but I guess may as well do it right! Co-authored-by: Alexander Taylor --- .github/workflows/push.yml | 2 +- .travis.yml | 10 +- Dockerfile.py2 | 94 ------- Makefile | 13 +- README.md | 18 +- ci/constants.py | 50 +--- ci/rebuild_updated_recipes.py | 17 +- doc/source/buildoptions.rst | 40 +-- doc/source/contribute.rst | 3 - doc/source/distutils.rst | 5 +- doc/source/quickstart.rst | 4 +- doc/source/recipes.rst | 28 +-- doc/source/troubleshooting.rst | 4 +- pythonforandroid/bootstrap.py | 2 +- .../bootstraps/common/build/build.py | 53 +--- .../common/build/jni/application/src/start.c | 18 +- .../java/org/kivy/android/PythonUtil.java | 1 - .../java/org/kivy/android/PythonUtil.java | 15 -- pythonforandroid/python.py | 15 +- pythonforandroid/recipe.py | 14 +- pythonforandroid/recipes/android/__init__.py | 3 +- pythonforandroid/recipes/apsw/__init__.py | 2 +- .../recipes/audiostream/__init__.py | 2 +- pythonforandroid/recipes/boost/__init__.py | 2 +- pythonforandroid/recipes/coverage/__init__.py | 2 +- .../recipes/ffpyplayer/__init__.py | 2 +- .../recipes/genericndkbuild/__init__.py | 2 +- .../recipes/hostpython2/__init__.py | 18 -- .../recipes/hostpython3/__init__.py | 1 - pythonforandroid/recipes/icu/__init__.py | 2 +- pythonforandroid/recipes/ifaddrs/__init__.py | 2 +- pythonforandroid/recipes/libglob/__init__.py | 2 +- pythonforandroid/recipes/libnacl/__init__.py | 2 +- .../recipes/matplotlib/__init__.py | 1 - pythonforandroid/recipes/mysqldb/__init__.py | 2 +- pythonforandroid/recipes/ndghttpsclient | 4 +- pythonforandroid/recipes/numpy/__init__.py | 5 - .../numpy/patches/fix-py2-numpy-import.patch | 15 -- pythonforandroid/recipes/pandas/__init__.py | 1 - pythonforandroid/recipes/pycrypto/__init__.py | 2 +- pythonforandroid/recipes/pynacl/__init__.py | 2 +- pythonforandroid/recipes/python2/__init__.py | 83 ------- .../python2/patches/enable-openssl.patch | 46 ---- .../patches/fix-api-minor-than-21.patch | 229 ------------------ .../fix-ctypes-util-find-library.patch | 19 -- .../fix-filesystem-default-encoding.patch | 11 - .../python2/patches/fix-gethostbyaddr.patch | 12 - .../patches/fix-interpreter-version.patch | 11 - .../patches/fix-missing-extensions.patch | 108 --------- .../patches/fix-posix-declarations.patch | 24 -- .../python2/patches/fix-pwd-gecos.patch | 89 ------- .../python2/patches/fix-zlib-version.patch | 12 - pythonforandroid/recipes/python3/__init__.py | 1 - .../recipes/secp256k1/__init__.py | 4 +- pythonforandroid/recipes/shapely/__init__.py | 5 - pythonforandroid/recommendations.py | 6 +- pythonforandroid/toolchain.py | 2 +- pythonforandroid/tools/liblink | 2 +- testapps/setup_testapp_python2.py | 32 --- .../setup_testapp_python2_sqlite_openssl.py | 25 -- testapps/testlauncher_setup/sdl2.py | 2 +- tests/test_bootstrap.py | 13 +- tests/test_entrypoints_python2.py | 38 --- tests/test_graph.py | 10 +- tox.ini | 9 +- 65 files changed, 84 insertions(+), 1189 deletions(-) delete mode 100644 Dockerfile.py2 delete mode 100644 pythonforandroid/recipes/hostpython2/__init__.py delete mode 100644 pythonforandroid/recipes/numpy/patches/fix-py2-numpy-import.patch delete mode 100644 pythonforandroid/recipes/python2/__init__.py delete mode 100644 pythonforandroid/recipes/python2/patches/enable-openssl.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-api-minor-than-21.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-ctypes-util-find-library.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-filesystem-default-encoding.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-gethostbyaddr.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-interpreter-version.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-missing-extensions.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-posix-declarations.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-pwd-gecos.patch delete mode 100644 pythonforandroid/recipes/python2/patches/fix-zlib-version.patch delete mode 100644 testapps/setup_testapp_python2.py delete mode 100644 testapps/setup_testapp_python2_sqlite_openssl.py delete mode 100644 tests/test_entrypoints_python2.py diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index b47dac8810..caafb4a073 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -57,7 +57,7 @@ jobs: - name: Build apk for Python 3 ${{ matrix.build-arch }} run: | mkdir -p apks - make docker/run/make/with-artifact/testapps/python3/${{ matrix.build-arch }} + make docker/run/make/with-artifact/testapps/${{ matrix.build-arch }} - uses: actions/upload-artifact@v1 with: name: bdisttest_python3_sqlite_openssl_googlendk__${{ matrix.build-arch }}-debug-1.1.apk diff --git a/.travis.yml b/.travis.yml index c8ad70c91f..7c82accebd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,9 +36,6 @@ jobs: - tox -- tests/ --ignore tests/test_pythonpackage.py name: "Tox Pep8" env: TOXENV=pep8 - - <<: *unittests - name: "Tox Python 2" - env: TOXENV=py27 - <<: *unittests name: "Tox Python 3 & Coverage" env: TOXENV=py3 @@ -48,7 +45,7 @@ jobs: name: Python 3 arm64-v8a (with numpy) stage: build testapps before_script: make docker/pull - script: make docker/run/make/testapps/python3/arm64-v8a + script: make docker/run/make/testapps/arm64-v8a - <<: *testapps name: Python 3 armeabi-v7a os: osx @@ -57,10 +54,7 @@ jobs: # installs java 1.8, android's SDK/NDK and p4a - make -f ci/makefiles/osx.mk - export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home - script: make testapps/python3/armeabi-v7a PYTHON_WITH_VERSION=python3 - - <<: *testapps - name: Python 2 armeabi-v7a - script: make docker/run/make/testapps/python2/armeabi-v7a + script: make testapps/armeabi-v7a PYTHON_WITH_VERSION=python3 - <<: *testapps name: Rebuild updated recipes script: travis_wait 30 make docker/run/make/rebuild_updated_recipes diff --git a/Dockerfile.py2 b/Dockerfile.py2 deleted file mode 100644 index 19418329ca..0000000000 --- a/Dockerfile.py2 +++ /dev/null @@ -1,94 +0,0 @@ -# Dockerfile with: -# - Android build environment -# - python-for-android dependencies -# -# Build with: -# docker build --tag=p4apy2 --file Dockerfile.py2 . -# -# Run with: -# docker run -it --rm p4apy2 /bin/sh -c '. venv/bin/activate && p4a apk --help' -# -# Or for interactive shell: -# docker run -it --rm p4apy2 -# -# Note: -# Use 'docker run' without '--rm' flag for keeping the container and use -# 'docker commit ' to extend the original image - -FROM ubuntu:18.04 - -ENV ANDROID_HOME="/opt/android" - -# configure locale -RUN apt update -qq > /dev/null && apt install -qq --yes --no-install-recommends \ - locales && \ - locale-gen en_US.UTF-8 -ENV LANG="en_US.UTF-8" \ - LANGUAGE="en_US.UTF-8" \ - LC_ALL="en_US.UTF-8" - -RUN apt -y update -qq \ - && apt -y install -qq --no-install-recommends curl unzip ca-certificates \ - && apt -y autoremove - -# retry helper script, refs: -# https://github.com/kivy/python-for-android/issues/1306 -ENV RETRY="retry -t 3 --" -RUN curl https://raw.githubusercontent.com/kadwanev/retry/1.0.1/retry \ - --output /usr/local/bin/retry && chmod +x /usr/local/bin/retry - -ENV USER="user" -ENV HOME_DIR="/home/${USER}" -ENV ANDROID_HOME="${HOME_DIR}/.android" -ENV WORK_DIR="${HOME_DIR}" \ - PATH="${HOME_DIR}/.local/bin:${PATH}" - -# install system dependencies -RUN ${RETRY} apt -y install -qq --no-install-recommends \ - python virtualenv python-pip wget lbzip2 patch sudo \ - && apt -y autoremove \ - && apt -y clean - -# build dependencies -# https://buildozer.readthedocs.io/en/latest/installation.html#android-on-ubuntu-16-04-64bit -RUN dpkg --add-architecture i386 \ - && ${RETRY} apt -y update -qq \ - && ${RETRY} apt -y install -qq --no-install-recommends \ - build-essential ccache git python2.7 python2.7-dev \ - libncurses5:i386 libstdc++6:i386 libgtk2.0-0:i386 \ - libpangox-1.0-0:i386 libpangoxft-1.0-0:i386 libidn11:i386 \ - zip zlib1g-dev zlib1g:i386 \ - && apt -y autoremove - -# specific recipes dependencies (e.g. libffi requires autoreconf binary) -RUN ${RETRY} apt -y install -qq --no-install-recommends \ - libffi-dev autoconf automake cmake gettext libltdl-dev libtool pkg-config \ - && apt -y autoremove \ - && apt -y clean - -# Install Java, set JAVA_HOME (to accept android's SDK licenses) and clean -RUN ${RETRY} apt -y install -qq --no-install-recommends openjdk-8-jdk \ - && apt -y autoremove && apt -y clean -ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 - -# prepare non root env -RUN useradd --create-home --shell /bin/bash ${USER} - -# with sudo access and no password -RUN usermod -append --groups sudo ${USER} -RUN echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers - - -WORKDIR ${WORK_DIR} -COPY --chown=user:user . ${WORK_DIR} -RUN mkdir ${ANDROID_HOME} && chown --recursive ${USER} ${ANDROID_HOME} -USER ${USER} - -# Download and install android's NDK/SDK -RUN make -f ci/makefiles/android.mk target_os=linux - -# install python-for-android from current branch -RUN virtualenv --python=python venv \ - && . venv/bin/activate \ - && pip install --upgrade cython==0.28.6 \ - && pip install -e . diff --git a/Makefile b/Makefile index f1783c9820..1e3566123d 100644 --- a/Makefile +++ b/Makefile @@ -35,18 +35,13 @@ rebuild_updated_recipes: virtualenv ANDROID_SDK_HOME=$(ANDROID_SDK_HOME) ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) \ $(PYTHON) ci/rebuild_updated_recipes.py -testapps/python2/armeabi-v7a: virtualenv - . $(ACTIVATE) && cd testapps/ && \ - python setup_testapp_python2_sqlite_openssl.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ - --requirements sdl2,pyjnius,kivy,python2,openssl,requests,sqlite3,setuptools - -testapps/python3/arm64-v8a: virtualenv +testapps/arm64-v8a: virtualenv . $(ACTIVATE) && cd testapps/ && \ python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ --requirements libffi,sdl2,pyjnius,kivy,python3,openssl,requests,sqlite3,setuptools,numpy \ --arch=arm64-v8a -testapps/python3/armeabi-v7a: virtualenv +testapps/armeabi-v7a: virtualenv . $(ACTIVATE) && cd testapps/ && \ python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ --arch=armeabi-v7a @@ -77,11 +72,7 @@ docker/run/make/%: docker/build docker run --rm --env-file=.env $(DOCKER_IMAGE) make $* docker/run/make/with-artifact/%: docker/build -ifeq (,$(findstring python3,$($*))) $(eval $@_APP_NAME := bdisttest_python3_sqlite_openssl_googlendk) -else - $(eval $@_APP_NAME := bdisttest_python2_sqlite_openssl) -endif $(eval $@_APP_ARCH := $(shell basename $*)) docker run --name p4a-latest --env-file=.env $(DOCKER_IMAGE) make $* docker cp p4a-latest:/home/user/app/testapps/$($@_APP_NAME)__$($@_APP_ARCH)-debug-1.1-.apk ./apks diff --git a/README.md b/README.md index bf108c3442..692007bdf3 100644 --- a/README.md +++ b/README.md @@ -102,23 +102,13 @@ new recipe for python3 (3.7.1) had a new build system which was applied to the ancient python recipe, allowing us to bump the python2 version number to 2.7.15. This change unified the build process for both python recipes, and probably solved various issues detected over the -years. It should also be mentioned that these **unified python recipes** -require a **minimum target api level of 21**, -*Android 5.0 - Lollipop*, so in the case that you need to build targeting an +years. These **unified python recipes** require a **minimum target api level of 21**, +*Android 5.0 - Lollipop*. If you need to build targeting an api level below 21, you should use an older version of python-for-android (<=0.7.1). -Be aware that this project is in constant development so, as per time of writing, -you should use a minimum on Android's NDK r19, and ``we recommend using NDK r19b``. -This is because the toolchains installed by -default with the NDK can be used *in-place* and the python-for-android project -has been adapted for that feature. Also be aware that more recent versions of the -Android's NDK may not work. - -Those mentioned changes has been done this way to make easier the transition -between python3 and python2. We will slowly phase out python2 support -towards 2020...so...if you are using python2 in your projects you should -consider migrating it into python3. +On March of 2020 we dropped support for creating apps that use Python 2. The latest +python-for-android release that supported building Python 2 was version 2019.10.6. ## Contributors diff --git a/ci/constants.py b/ci/constants.py index 427d1de4d4..8b79bb5e54 100644 --- a/ci/constants.py +++ b/ci/constants.py @@ -2,59 +2,12 @@ class TargetPython(Enum): - python2 = 0 python3 = 2 # recipes that currently break the build # a recipe could be broken for a target Python and not for the other, # hence we're maintaining one list per Python target -BROKEN_RECIPES_PYTHON2 = set([ - # pythonhelpers.h:12:18: fatal error: string: No such file or directory - 'atom', - # https://github.com/kivy/python-for-android/issues/550 - 'audiostream', - 'brokenrecipe', - 'evdev', - # distutils.errors.DistutilsError - # Could not find suitable distribution for Requirement.parse('cython') - 'ffpyplayer', - 'flask', - 'groestlcoin_hash', - # https://github.com/kivy/python-for-android/issues/1354 - 'kiwisolver', - 'libmysqlclient', - 'libsecp256k1', - 'libtribler', - 'ndghttpsclient', - 'm2crypto', - # ImportError: No module named setuptools - 'netifaces', - 'Pillow', - # depends on cffi that still seems to have compilation issues - 'protobuf_cpp', - 'xeddsa', - 'x3dh', - 'pynacl', - 'doubleratchet', - 'omemo', - # requires `libpq-dev` system dependency e.g. for `pg_config` binary - 'psycopg2', - # most likely some setup in the Docker container, because it works in host - 'pyjnius', 'pyopenal', - 'pyproj', - 'pysdl2', - 'pyzmq', - 'secp256k1', - 'shapely', - # mpmath package with a version >= 0.19 required - 'sympy', - 'twisted', - 'vlc', - 'websocket-client', - 'zeroconf', - 'zope', -]) BROKEN_RECIPES_PYTHON3 = set([ 'brokenrecipe', # enum34 is not compatible with Python 3.6 standard library @@ -76,11 +29,10 @@ class TargetPython(Enum): ]) BROKEN_RECIPES = { - TargetPython.python2: BROKEN_RECIPES_PYTHON2, TargetPython.python3: BROKEN_RECIPES_PYTHON3, } # recipes that were already built will be skipped CORE_RECIPES = set([ 'pyjnius', 'kivy', 'openssl', 'requests', 'sqlite3', 'setuptools', - 'numpy', 'android', 'hostpython2', 'hostpython3', 'python2', 'python3', + 'numpy', 'android', 'hostpython3', 'python3', ]) diff --git a/ci/rebuild_updated_recipes.py b/ci/rebuild_updated_recipes.py index 54f62ac768..d5ecc30cd7 100755 --- a/ci/rebuild_updated_recipes.py +++ b/ci/rebuild_updated_recipes.py @@ -19,15 +19,12 @@ [ERROR]: Didn't find any valid dependency graphs. [ERROR]: This means that some of your requirements pull in conflicting dependencies. - only rebuilds on sdl2 bootstrap -- supports mainly python3 with fallback to python2 """ import sh import os from pythonforandroid.build import Context from pythonforandroid import logger -from pythonforandroid.graph import get_recipe_order_and_bootstrap from pythonforandroid.toolchain import current_directory -from pythonforandroid.util import BuildInterruptingException from pythonforandroid.recipe import Recipe from ci.constants import TargetPython, CORE_RECIPES, BROKEN_RECIPES @@ -55,11 +52,9 @@ def build(target_python, requirements): """ if not requirements: return - testapp = 'setup_testapp_python2.py' + testapp = 'setup_testapp_python3_sqlite_openssl.py' android_sdk_home = os.environ['ANDROID_SDK_HOME'] android_ndk_home = os.environ['ANDROID_NDK_HOME'] - if target_python == TargetPython.python3: - testapp = 'setup_testapp_python3_sqlite_openssl.py' requirements.add(target_python.name) requirements = ','.join(requirements) logger.info('requirements: {}'.format(requirements)) @@ -91,16 +86,6 @@ def main(): 'removed {} from recipes because deleted'.format(recipe_name) ) - # forces the default target - recipes_and_target = recipes | set([target_python.name]) - try: - build_order, python_modules, bs = get_recipe_order_and_bootstrap( - context, recipes_and_target, None) - except BuildInterruptingException: - # fallback to python2 if default target is not compatible - logger.info('incompatible with {}'.format(target_python.name)) - target_python = TargetPython.python2 - logger.info('falling back to {}'.format(target_python.name)) # removing the known broken recipe for the given target broken_recipes = BROKEN_RECIPES[target_python] recipes -= broken_recipes diff --git a/doc/source/buildoptions.rst b/doc/source/buildoptions.rst index 5d80020728..19360ff2fa 100644 --- a/doc/source/buildoptions.rst +++ b/doc/source/buildoptions.rst @@ -8,38 +8,14 @@ This page contains instructions for using different build options. Python versions --------------- -python2 -~~~~~~~ - -Select this by adding it in your requirements, e.g. ``--requirements=python2``. - -This option builds Python 2.7.2 for your selected Android -architecture. There are no special requirements, all the building is -done locally. - - -python3 -~~~~~~~ - -Python3 is supported in two ways. The default method uses CPython 3.7+ -and works with any recent version of the Android NDK. - -Select Python 3 by adding it to your requirements, -e.g. ``--requirements=python3``. - -.. note:: ctypes is not included automatically, if you would like to use it - then add libffi to your requirements, - e.g. ``--requirements=kivy,libffi,python3``. - - -CrystaX python3 -~~~~~~~~~~~~~~~ +python-for-android supports using Python 3.7 or higher. To explicitly select a Python +version in your requirements, use e.g. ``--requirements=python3==3.7.1,hostpython3==3.7.1``. -python-for-android no longer supports building for Python 3 using the CrystaX -NDK. Instead, use the python3 recipe, which can be built using the normal -Google NDK. +The last python-for-android version supporting Python2 was `v2019.10.06 + `__ -.. note:: The last python-for-android version supporting CrystaX was `0.7.0. +Python-for-android no longer supports building for Python 3 using the CrystaX +NDK. The last python-for-android version supporting CrystaX was `0.7.0. `__ .. _bootstrap_build_options: @@ -60,7 +36,7 @@ sdl2 ~~~~ Use this with ``--bootstrap=sdl2``, or just include the -``sdl2`` recipe, e.g. ``--requirements=sdl2,python2``. +``sdl2`` recipe, e.g. ``--requirements=sdl2,python3``. SDL2 is a popular cross-platform depelopment library, particularly for games. It has its own Android project support, which @@ -120,7 +96,7 @@ webview ~~~~~~~ You can use this with ``--bootstrap=webview``, or include the -``webviewjni`` recipe, e.g. ``--requirements=webviewjni,python2``. +``webviewjni`` recipe, e.g. ``--requirements=webviewjni,python3``. The webview bootstrap gui is, per the name, a WebView displaying a webpage, but this page is hosted on the device via a Python diff --git a/doc/source/contribute.rst b/doc/source/contribute.rst index 1de0883c4c..4796c7e411 100644 --- a/doc/source/contribute.rst +++ b/doc/source/contribute.rst @@ -75,9 +75,6 @@ Release checklist - `python3 setup_testapp_python3_sqlite_openssl.py apk` - [ ] `armeabi-v7a` - [ ] `arm64-v8a` - - `python3 setup_testapp_python2.py apk` - - [ ] `armeabi-v7a` - - [ ] `arm64-v8a` - [ ] Check that the version number is correct diff --git a/doc/source/distutils.rst b/doc/source/distutils.rst index 2ee999ffef..74055d0f7a 100644 --- a/doc/source/distutils.rst +++ b/doc/source/distutils.rst @@ -25,9 +25,6 @@ This however has these caveats: or even cause build errors. (Sorry, our internal processing is just not smart enough to honor them properly at this point) -- If you don't use Python 3 per default, you still need to specify - ``--requirements python2`` (without any additional dependencies) - - The dependency analysis at the start may be quite slow and delay your build @@ -117,7 +114,7 @@ store them in setup.py by passing the ``options`` parameter to from setuptools import find_packages options = {'apk': {'debug': None, # use None for arguments that don't pass a value - 'requirements': 'sdl2,pyjnius,kivy,python2', + 'requirements': 'sdl2,pyjnius,kivy,python3', 'android-api': 19, 'ndk-dir': '/path/to/ndk', 'dist-name': 'bdisttest', diff --git a/doc/source/quickstart.rst b/doc/source/quickstart.rst index 07a3fc6523..425a7ea2c2 100644 --- a/doc/source/quickstart.rst +++ b/doc/source/quickstart.rst @@ -185,9 +185,7 @@ an `.apk` file. *Compatibility notes:* -- While python2 is still supported by python-for-android, - it will possibly no longer receive patches by the python creators - themselves in 2020. Migration to Python 3 is recommended! +- Python 2 is no longer supported by python-for-android. The last release supporting Python 2 was v2019.10.06. Build a WebView application diff --git a/doc/source/recipes.rst b/doc/source/recipes.rst index 8702c8d259..c3a97aab4f 100644 --- a/doc/source/recipes.rst +++ b/doc/source/recipes.rst @@ -41,7 +41,7 @@ The basic declaration of a recipe is as follows:: patches = ['some_fix.patch'] # Paths relative to the recipe dir depends = ['kivy', 'sdl2'] # These are just examples - conflicts = ['python2'] + conflicts = ['generickndkbuild'] recipe = YourRecipe() @@ -61,15 +61,15 @@ when the recipe is imported. The actual build process takes place via three core methods:: def prebuild_arch(self, arch): - super(YourRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) # Do any pre-initialisation def build_arch(self, arch): - super(YourRecipe, self).build_arch(arch) + super().build_arch(arch) # Do the main recipe build def postbuild_arch(self, arch): - super(YourRecipe, self).build_arch(arch) + super().build_arch(arch) # Do any clearing up These methods are always run in the listed order; prebuild, then @@ -86,7 +86,7 @@ context manager defined in toolchain.py:: from pythonforandroid.toolchain import current_directory def build_arch(self, arch): - super(YourRecipe, self).build_arch(arch) + super().build_arch(arch) with current_directory(self.get_build_dir(arch.arch)): with open('example_file.txt', 'w') as fileh: fileh.write('This is written to a file within the build dir') @@ -178,7 +178,7 @@ environment for any processes that you call. It is convenient to do this using the ``sh`` module as follows:: def build_arch(self, arch): - super(YourRecipe, self).build_arch(arch) + super().build_arch(arch) env = self.get_recipe_env(arch) sh.echo('$PATH', _env=env) # Will print the PATH entry from the # env dict @@ -196,7 +196,7 @@ the following when compiling for SDL2, in order to tell Kivy what backend to use:: def get_recipe_env(self, arch): - env = super(KivySDL2Recipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['USE_SDL2'] = '1' env['KIVY_SDL2_PATH'] = ':'.join([ @@ -256,7 +256,7 @@ for the Vispy module:: version = 'master' url = 'https://github.com/vispy/vispy/archive/{version}.zip' - depends = ['python2', 'numpy'] + depends = ['python3', 'numpy'] site_packages_name = 'vispy' @@ -272,7 +272,7 @@ Python installation. For reference, the code that accomplishes this is the following:: def build_arch(self, arch): - super(PythonRecipe, self).build_arch(arch) + super().build_arch(arch) self.install_python_package() def install_python_package(self): @@ -426,7 +426,7 @@ overrides if you do not use them:: url = 'http://example.com/example-{version}.tar.gz' # {version} will be replaced with self.version when downloading - depends = ['python2', 'numpy'] # A list of any other recipe names + depends = ['python3', 'numpy'] # A list of any other recipe names # that must be built before this # one @@ -434,7 +434,7 @@ overrides if you do not use them:: # alongside this one def get_recipe_env(self, arch): - env = super(YourRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) # Manipulate the env here if you want return env @@ -444,19 +444,19 @@ overrides if you do not use them:: return True def prebuild_arch(self, arch): - super(YourRecipe, self).prebuild_arch(self) + super().prebuild_arch(self) # Do any extra prebuilding you want, e.g.: self.apply_patch('path/to/patch.patch') def build_arch(self, arch): - super(YourRecipe, self).build_arch(self) + super().build_arch(self) # Build the code. Make sure to use the right build dir, e.g. with current_directory(self.get_build_dir(arch.arch)): sh.ls('-lathr') # Or run some commands that actually do # something def postbuild_arch(self, arch): - super(YourRecipe, self).prebuild_arch(self) + super().prebuild_arch(self) # Do anything you want after the build, e.g. deleting # unnecessary files such as documentation diff --git a/doc/source/troubleshooting.rst b/doc/source/troubleshooting.rst index 4277d51bbf..5974718308 100644 --- a/doc/source/troubleshooting.rst +++ b/doc/source/troubleshooting.rst @@ -132,8 +132,8 @@ AttributeError: 'Context' object has no attribute 'hostpython' This is a known bug in some releases. To work around it, add your python requirement explicitly, -e.g. :code:`--requirements=python2,kivy`. This also applies when using -buildozer, in which case add python2 to your buildozer.spec requirements. +e.g. :code:`--requirements=python3,kivy`. This also applies when using +buildozer, in which case add python3 to your buildozer.spec requirements. linkname too long ~~~~~~~~~~~~~~~~~ diff --git a/pythonforandroid/bootstrap.py b/pythonforandroid/bootstrap.py index 03925a3e01..e85dc74732 100755 --- a/pythonforandroid/bootstrap.py +++ b/pythonforandroid/bootstrap.py @@ -78,7 +78,7 @@ class Bootstrap(object): distribution = None # All bootstraps should include Python in some way: - recipe_depends = [("python2", "python3"), 'android'] + recipe_depends = ['python3', 'android'] can_be_chosen_automatically = True '''Determines whether the bootstrap can be chosen as one that diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 07a5be01d8..fea791db8d 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.7 +#!/usr/bin/env python3 from __future__ import print_function @@ -16,7 +16,6 @@ import tarfile import tempfile import time -from zipfile import ZipFile from distutils.version import LooseVersion from fnmatch import fnmatch @@ -78,10 +77,6 @@ def get_bootstrap_name(): # pyc/py if PYTHON is not None: BLACKLIST_PATTERNS.append('*.py') - if PYTHON_VERSION and int(PYTHON_VERSION[0]) == 2: - # we only blacklist `.pyc` for python2 because in python3 the compiled - # extension is `.pyc` (.pyo files not exists for python >= 3.6) - BLACKLIST_PATTERNS.append('*.pyc') WHITELIST_PATTERNS = [] if get_bootstrap_name() in ('sdl2', 'webview', 'service_only'): @@ -156,48 +151,6 @@ def listfiles(d): yield fn -def make_python_zip(): - ''' - Search for all the python related files, and construct the pythonXX.zip - According to - # http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html - site-packages, config and lib-dynload will be not included. - ''' - - if not exists('private'): - print('No compiled python is present to zip, skipping.') - return - - global python_files - d = realpath(join('private', 'lib', 'python2.7')) - - def select(fn): - if is_blacklist(fn): - return False - fn = realpath(fn) - assert(fn.startswith(d)) - fn = fn[len(d):] - if (fn.startswith('/site-packages/') - or fn.startswith('/config/') - or fn.startswith('/lib-dynload/') - or fn.startswith('/libpymodules.so')): - return False - return fn - - # get a list of all python file - python_files = [x for x in listfiles(d) if select(x)] - - # create the final zipfile - zfn = join('private', 'lib', 'python27.zip') - zf = ZipFile(zfn, 'w') - - # put all the python files in it - for fn in python_files: - afn = fn[len(d):] - zf.write(fn, afn) - zf.close() - - def make_tar(tfn, source_dirs, ignore_path=[], optimize_python=True): ''' Make a zip file `fn` from the contents of source_dis. @@ -292,10 +245,6 @@ def make_package(args): try_unlink(join(assets_dir, 'private.mp3')) ensure_dir(assets_dir) - # In order to speedup import and initial depack, - # construct a python27.zip - make_python_zip() - # Add extra environment variable file into tar-able directory: env_vars_tarpath = tempfile.mkdtemp(prefix="p4a-extra-env-") with open(os.path.join(env_vars_tarpath, "p4a_env_vars.txt"), "w") as f: diff --git a/pythonforandroid/bootstraps/common/build/jni/application/src/start.c b/pythonforandroid/bootstraps/common/build/jni/application/src/start.c index 24297accdb..f57098069f 100644 --- a/pythonforandroid/bootstraps/common/build/jni/application/src/start.c +++ b/pythonforandroid/bootstraps/common/build/jni/application/src/start.c @@ -189,17 +189,6 @@ int main(int argc, char *argv[]) { } Py_Initialize(); - -#if PY_MAJOR_VERSION < 3 - // Can't Py_SetPath in python2 but we can set PySys_SetPath, which must - // be applied after Py_Initialize rather than before like Py_SetPath - #if PY_MICRO_VERSION >= 15 - // Only for python native-build - PySys_SetPath(paths); - #endif - PySys_SetArgv(argc, argv); -#endif - LOGP("Initialized python"); /* ensure threads will work. @@ -285,7 +274,7 @@ int main(int argc, char *argv[]) { entrypoint[strlen(env_entrypoint) - 1] = '\0'; LOGP(entrypoint); if (!file_exists(entrypoint)) { - LOGP("Entrypoint not found (.pyc/.pyo, fallback on .py), abort"); + LOGP("Entrypoint not found (.pyc, fallback on .py), abort"); return -1; } } else { @@ -309,7 +298,7 @@ int main(int argc, char *argv[]) { strcpy(entrypoint, env_entrypoint); } } else { - LOGP("Entrypoint have an invalid extension (must be .py or .pyc/.pyo), abort."); + LOGP("Entrypoint have an invalid extension (must be .py or .pyc), abort."); return -1; } // LOGP("Entrypoint is:"); @@ -330,8 +319,7 @@ int main(int argc, char *argv[]) { ret = 1; PyErr_Print(); /* This exits with the right code if SystemExit. */ PyObject *f = PySys_GetObject("stdout"); - if (PyFile_WriteString( - "\n", f)) /* python2 used Py_FlushLine, but this no longer exists */ + if (PyFile_WriteString("\n", f)) PyErr_Clear(); } diff --git a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java index 2bb1cf3607..6a546a7eb1 100644 --- a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java +++ b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java @@ -36,7 +36,6 @@ protected static ArrayList getLibraries(File libsDir) { addLibraryIfExists(libsList, "ffi", libsDir); addLibraryIfExists(libsList, "ssl.*", libsDir); addLibraryIfExists(libsList, "crypto.*", libsDir); - libsList.add("python2.7"); libsList.add("python3.5m"); libsList.add("python3.6m"); libsList.add("python3.7m"); diff --git a/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java b/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java index 460f704190..84540f55a8 100644 --- a/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java +++ b/pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonUtil.java @@ -40,7 +40,6 @@ protected static ArrayList getLibraries(File libsDir) { libsList.add("SDL2_ttf"); addLibraryIfExists(libsList, "ssl.*", libsDir); addLibraryIfExists(libsList, "crypto.*", libsDir); - libsList.add("python2.7"); libsList.add("python3.5m"); libsList.add("python3.6m"); libsList.add("python3.7m"); @@ -76,20 +75,6 @@ public static void loadLibraries(File filesDir, File libsDir) { } } - try { - System.load(filesDirPath + "/lib/python2.7/lib-dynload/_io.so"); - System.load(filesDirPath + "/lib/python2.7/lib-dynload/unicodedata.so"); - } catch(UnsatisfiedLinkError e) { - Log.v(TAG, "Failed to load _io.so or unicodedata.so...but that's okay."); - } - - try { - // System.loadLibrary("ctypes"); - System.load(filesDirPath + "/lib/python2.7/lib-dynload/_ctypes.so"); - } catch(UnsatisfiedLinkError e) { - Log.v(TAG, "Unsatisfied linker when loading ctypes"); - } - Log.v(TAG, "Loaded everything!"); } } diff --git a/pythonforandroid/python.py b/pythonforandroid/python.py index 9c8b2439a2..9d180ca7e7 100755 --- a/pythonforandroid/python.py +++ b/pythonforandroid/python.py @@ -1,6 +1,6 @@ ''' This module is kind of special because it contains the base classes used to -build our python3 and python2 recipes and his corresponding hostpython recipes. +build our python3 and his corresponding hostpython recipes. ''' from os.path import dirname, exists, join, isfile @@ -26,8 +26,7 @@ class GuestPythonRecipe(TargetPythonRecipe): Class for target python recipes. Sets ctx.python_recipe to point to itself, so as to know later what kind of Python was built or used. - This base class is used for our main python recipes (python2 and python3) - which shares most of the build process. + This base class is used for our main python3 recipe. .. versionadded:: 0.6.0 Refactored from the inclement's python3 recipe with a few changes: @@ -280,10 +279,7 @@ def compile_python_files(self, dir): longer used...uses .pyc (https://www.python.org/dev/peps/pep-0488) ''' args = [self.ctx.hostpython] - if self.ctx.python_recipe.name == 'python3': - args += ['-OO', '-m', 'compileall', '-b', '-f', dir] - else: - args += ['-OO', '-m', 'compileall', '-f', dir] + args += ['-OO', '-m', 'compileall', '-b', '-f', dir] subprocess.call(args) def create_python_bundle(self, dirn, arch): @@ -363,7 +359,7 @@ def create_python_bundle(self, dirn, arch): class HostPythonRecipe(Recipe): ''' - This is the base class for hostpython3 and hostpython2 recipes. This class + This is the base class for hostpython3 recipe. This class will take care to do all the work to build a hostpython recipe but, be careful, it is intended to be subclassed because some of the vars needs to be set: @@ -376,8 +372,7 @@ class HostPythonRecipe(Recipe): ''' name = '' - '''The hostpython's recipe name. This should be ``hostpython2`` or - ``hostpython3`` + '''The hostpython's recipe name. This should be ``hostpython3`` .. warning:: This must be set in inherited class.''' diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index 3d814d5c4e..c9d721a7d4 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -843,7 +843,7 @@ class PythonRecipe(Recipe): setup_extra_args = [] '''List of extra arguments to pass to setup.py''' - depends = [('python2', 'python3')] + depends = ['python3'] ''' .. note:: it's important to keep this depends as a class attribute outside `__init__` because sometimes we only initialize the class, so the @@ -857,19 +857,13 @@ class PythonRecipe(Recipe): def __init__(self, *args, **kwargs): super(PythonRecipe, self).__init__(*args, **kwargs) - if not any( - [ - d - for d in {'python2', 'python3', ('python2', 'python3')} - if d in self.depends - ] - ): + if 'python3' not in self.depends: # We ensure here that the recipe depends on python even it overrode # `depends`. We only do this if it doesn't already depend on any # python, since some recipes intentionally don't depend on/work # with all python variants depends = self.depends - depends.append(('python2', 'python3')) + depends.append('python3') depends = list(set(depends)) self.depends = depends @@ -889,7 +883,7 @@ def clean_build(self, arch=None): @property def real_hostpython_location(self): host_name = 'host{}'.format(self.ctx.python_recipe.name) - if host_name in ['hostpython2', 'hostpython3']: + if host_name == 'hostpython3': python_recipe = Recipe.get_recipe(host_name, self.ctx) return python_recipe.python_exe else: diff --git a/pythonforandroid/recipes/android/__init__.py b/pythonforandroid/recipes/android/__init__.py index 3658c772ba..b2563f7301 100644 --- a/pythonforandroid/recipes/android/__init__.py +++ b/pythonforandroid/recipes/android/__init__.py @@ -1,7 +1,6 @@ from __future__ import unicode_literals from pythonforandroid.recipe import CythonRecipe, IncludedFilesBehaviour from pythonforandroid.util import current_directory -from pythonforandroid.patching import will_build from pythonforandroid import logger from os.path import join @@ -56,7 +55,7 @@ def prebuild_arch(self, arch): config = { 'BOOTSTRAP': bootstrap, 'IS_SDL2': int(is_sdl2), - 'PY2': int(will_build('python2')(self)), + 'PY2': 0, 'JAVA_NAMESPACE': java_ns, 'JNI_NAMESPACE': jni_ns, } diff --git a/pythonforandroid/recipes/apsw/__init__.py b/pythonforandroid/recipes/apsw/__init__.py index 6098e4b98c..542bdef81b 100644 --- a/pythonforandroid/recipes/apsw/__init__.py +++ b/pythonforandroid/recipes/apsw/__init__.py @@ -6,7 +6,7 @@ class ApswRecipe(PythonRecipe): version = '3.15.0-r1' url = 'https://github.com/rogerbinns/apsw/archive/{version}.tar.gz' - depends = ['sqlite3', ('python2', 'python3'), 'setuptools'] + depends = ['sqlite3', 'setuptools'] call_hostpython_via_targetpython = False site_packages_name = 'apsw' diff --git a/pythonforandroid/recipes/audiostream/__init__.py b/pythonforandroid/recipes/audiostream/__init__.py index 518d1dda8e..1e9d388ebc 100644 --- a/pythonforandroid/recipes/audiostream/__init__.py +++ b/pythonforandroid/recipes/audiostream/__init__.py @@ -7,7 +7,7 @@ class AudiostreamRecipe(CythonRecipe): version = 'master' url = 'https://github.com/kivy/audiostream/archive/{version}.zip' name = 'audiostream' - depends = [('python2', 'python3'), 'sdl2', 'pyjnius'] + depends = ['python3', 'sdl2', 'pyjnius'] def get_recipe_env(self, arch): env = super(AudiostreamRecipe, self).get_recipe_env(arch) diff --git a/pythonforandroid/recipes/boost/__init__.py b/pythonforandroid/recipes/boost/__init__.py index 978ab6f5b0..921ed21eb0 100644 --- a/pythonforandroid/recipes/boost/__init__.py +++ b/pythonforandroid/recipes/boost/__init__.py @@ -39,7 +39,7 @@ class BoostRecipe(Recipe): 'http://downloads.sourceforge.net/project/boost/' 'boost/{version}/boost_{version_underscore}.tar.bz2' ) - depends = [('python2', 'python3')] + depends = ['python3'] patches = [ 'disable-so-version.patch', 'use-android-libs.patch', diff --git a/pythonforandroid/recipes/coverage/__init__.py b/pythonforandroid/recipes/coverage/__init__.py index 95f08f1f4a..2ee2d059c8 100644 --- a/pythonforandroid/recipes/coverage/__init__.py +++ b/pythonforandroid/recipes/coverage/__init__.py @@ -7,7 +7,7 @@ class CoverageRecipe(PythonRecipe): url = 'https://pypi.python.org/packages/2d/10/6136c8e10644c16906edf4d9f7c782c0f2e7ed47ff2f41f067384e432088/coverage-{version}.tar.gz' - depends = [('hostpython2', 'hostpython3'), 'setuptools'] + depends = ['hostpython3', 'setuptools'] patches = ['fallback-utf8.patch'] diff --git a/pythonforandroid/recipes/ffpyplayer/__init__.py b/pythonforandroid/recipes/ffpyplayer/__init__.py index cb9e7071e7..d8fd6ce77d 100644 --- a/pythonforandroid/recipes/ffpyplayer/__init__.py +++ b/pythonforandroid/recipes/ffpyplayer/__init__.py @@ -6,7 +6,7 @@ class FFPyPlayerRecipe(CythonRecipe): version = 'c99913f2317bf3840eeacf1c1c3db3b3d1f78007' url = 'https://github.com/matham/ffpyplayer/archive/{version}.zip' - depends = [('python2', 'python3'), 'sdl2', 'ffmpeg'] + depends = ['python3', 'sdl2', 'ffmpeg'] opt_depends = ['openssl', 'ffpyplayer_codecs'] def get_recipe_env(self, arch, with_flags_in_cc=True): diff --git a/pythonforandroid/recipes/genericndkbuild/__init__.py b/pythonforandroid/recipes/genericndkbuild/__init__.py index e6cccb6e8d..be08098db1 100644 --- a/pythonforandroid/recipes/genericndkbuild/__init__.py +++ b/pythonforandroid/recipes/genericndkbuild/__init__.py @@ -7,7 +7,7 @@ class GenericNDKBuildRecipe(BootstrapNDKRecipe): version = None url = None - depends = [('python2', 'python3')] + depends = ['python3'] conflicts = ['sdl2'] def should_build(self, arch): diff --git a/pythonforandroid/recipes/hostpython2/__init__.py b/pythonforandroid/recipes/hostpython2/__init__.py deleted file mode 100644 index 36eb178d8a..0000000000 --- a/pythonforandroid/recipes/hostpython2/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -from pythonforandroid.python import HostPythonRecipe - - -class Hostpython2Recipe(HostPythonRecipe): - ''' - The hostpython2's recipe. - - .. versionchanged:: 0.6.0 - Updated to version 2.7.15 and the build process has been changed in - favour of the recently added class - :class:`~pythonforandroid.python.HostPythonRecipe` - ''' - version = '2.7.15' - name = 'hostpython2' - conflicts = ['hostpython3'] - - -recipe = Hostpython2Recipe() diff --git a/pythonforandroid/recipes/hostpython3/__init__.py b/pythonforandroid/recipes/hostpython3/__init__.py index 3068b85da4..82619c64c7 100644 --- a/pythonforandroid/recipes/hostpython3/__init__.py +++ b/pythonforandroid/recipes/hostpython3/__init__.py @@ -11,7 +11,6 @@ class Hostpython3Recipe(HostPythonRecipe): ''' version = '3.8.1' name = 'hostpython3' - conflicts = ['hostpython2'] recipe = Hostpython3Recipe() diff --git a/pythonforandroid/recipes/icu/__init__.py b/pythonforandroid/recipes/icu/__init__.py index 43c5ac9eb8..b147455b05 100644 --- a/pythonforandroid/recipes/icu/__init__.py +++ b/pythonforandroid/recipes/icu/__init__.py @@ -14,7 +14,7 @@ class ICURecipe(Recipe): url = ('http://download.icu-project.org/files/icu4c/' '{version}/icu4c-{version_underscore}-src.tgz') - depends = [('hostpython2', 'hostpython3')] # installs in python + depends = ['hostpython3'] # installs in python patches = ['disable-libs-version.patch'] built_libraries = { diff --git a/pythonforandroid/recipes/ifaddrs/__init__.py b/pythonforandroid/recipes/ifaddrs/__init__.py index 47c0008fa5..7d44f9cd72 100644 --- a/pythonforandroid/recipes/ifaddrs/__init__.py +++ b/pythonforandroid/recipes/ifaddrs/__init__.py @@ -10,7 +10,7 @@ class IFAddrRecipe(CompiledComponentsPythonRecipe): version = '8f9a87c' url = 'https://github.com/morristech/android-ifaddrs/archive/{version}.zip' - depends = [('hostpython2', 'hostpython3')] + depends = ['hostpython3'] call_hostpython_via_targetpython = False site_packages_name = 'ifaddrs' diff --git a/pythonforandroid/recipes/libglob/__init__.py b/pythonforandroid/recipes/libglob/__init__.py index 4c69657c87..f63db42628 100644 --- a/pythonforandroid/recipes/libglob/__init__.py +++ b/pythonforandroid/recipes/libglob/__init__.py @@ -22,7 +22,7 @@ class LibGlobRecipe(Recipe): name = 'libglob' built_libraries = {'libglob.so': '.'} - depends = [('hostpython2', 'hostpython3')] + depends = ['hostpython3'] patches = ['glob.patch'] def should_build(self, arch): diff --git a/pythonforandroid/recipes/libnacl/__init__.py b/pythonforandroid/recipes/libnacl/__init__.py index 3fc5da82f0..50689feb5d 100644 --- a/pythonforandroid/recipes/libnacl/__init__.py +++ b/pythonforandroid/recipes/libnacl/__init__.py @@ -4,7 +4,7 @@ class LibNaClRecipe(PythonRecipe): version = '1.4.4' url = 'https://github.com/saltstack/libnacl/archive/v{version}.tar.gz' - depends = [('hostpython2', 'hostpython3'), 'setuptools', 'libsodium'] + depends = ['hostpython3', 'setuptools', 'libsodium'] site_packages_name = 'libnacl' call_hostpython_via_targetpython = False diff --git a/pythonforandroid/recipes/matplotlib/__init__.py b/pythonforandroid/recipes/matplotlib/__init__.py index 05fa5c424b..277dada75f 100644 --- a/pythonforandroid/recipes/matplotlib/__init__.py +++ b/pythonforandroid/recipes/matplotlib/__init__.py @@ -12,7 +12,6 @@ class MatplotlibRecipe(CppCompiledComponentsPythonRecipe): url = 'https://github.com/matplotlib/matplotlib/archive/v{version}.zip' depends = ['numpy', 'png', 'setuptools', 'freetype', 'kiwisolver'] - conflicts = ['python2'] python_depends = ['pyparsing', 'cycler', 'python-dateutil'] diff --git a/pythonforandroid/recipes/mysqldb/__init__.py b/pythonforandroid/recipes/mysqldb/__init__.py index f08458567b..0559782cff 100644 --- a/pythonforandroid/recipes/mysqldb/__init__.py +++ b/pythonforandroid/recipes/mysqldb/__init__.py @@ -31,7 +31,7 @@ def prebuild_arch(self, arch): def get_recipe_env(self, arch=None): env = super(MysqldbRecipe, self).get_recipe_env(arch) - hostpython = self.get_recipe('hostpython2', self.ctx) + hostpython = self.get_recipe('hostpython3', self.ctx) # TODO: fix hardcoded path env['PYTHONPATH'] = (join(hostpython.get_build_dir(arch.arch), 'build', 'lib.linux-x86_64-2.7') + diff --git a/pythonforandroid/recipes/ndghttpsclient b/pythonforandroid/recipes/ndghttpsclient index 35e996f0d6..bfe581a119 100644 --- a/pythonforandroid/recipes/ndghttpsclient +++ b/pythonforandroid/recipes/ndghttpsclient @@ -1,9 +1,9 @@ from pythonforandroid.recipe import PythonRecipe class NdgHttpsClientRecipe(PythonRecipe): - version = '0.4.0' + version = '0.5.1' url = 'https://pypi.python.org/packages/source/n/ndg-httpsclient/ndg_httpsclient-{version}.tar.gz' - depends = ['python2', 'pyopenssl', 'cryptography'] + depends = ['python3', 'pyopenssl', 'cryptography'] call_hostpython_via_targetpython = False recipe = NdgHttpsClientRecipe() diff --git a/pythonforandroid/recipes/numpy/__init__.py b/pythonforandroid/recipes/numpy/__init__.py index 1d78e6c083..334886f792 100644 --- a/pythonforandroid/recipes/numpy/__init__.py +++ b/pythonforandroid/recipes/numpy/__init__.py @@ -18,11 +18,6 @@ class NumpyRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False - def apply_patches(self, arch, build_dir=None): - if 'python2' in self.ctx.recipe_build_order: - self.patches.append(join('patches', 'fix-py2-numpy-import.patch')) - super().apply_patches(arch, build_dir=build_dir) - def build_compiled_components(self, arch): self.setup_extra_args = ['-j', str(cpu_count())] super().build_compiled_components(arch) diff --git a/pythonforandroid/recipes/numpy/patches/fix-py2-numpy-import.patch b/pythonforandroid/recipes/numpy/patches/fix-py2-numpy-import.patch deleted file mode 100644 index e75bd37dfd..0000000000 --- a/pythonforandroid/recipes/numpy/patches/fix-py2-numpy-import.patch +++ /dev/null @@ -1,15 +0,0 @@ -There is an open issue at numpy talking about the import error with numpy: - https://github.com/numpy/numpy/issues/13248 -The solution applied here is mentioned there and it seems to only affect our -python2 version. ---- numpy-1.16.4/numpy/core/overrides.py.orig 2019-05-27 12:41:06.000000000 +0200 -+++ numpy-1.16.4/numpy/core/overrides.py 2019-10-13 18:51:06.387037239 +0200 -@@ -140,6 +140,8 @@ def array_function_dispatch(dispatcher, - ------- - Function suitable for decorating the implementation of a NumPy function. - """ -+ if dispatcher.__doc__ is None: -+ dispatcher.__doc__ = "" - - if not ENABLE_ARRAY_FUNCTION: - # __array_function__ requires an explicit opt-in for now diff --git a/pythonforandroid/recipes/pandas/__init__.py b/pythonforandroid/recipes/pandas/__init__.py index 7999d02402..1432f81f5f 100644 --- a/pythonforandroid/recipes/pandas/__init__.py +++ b/pythonforandroid/recipes/pandas/__init__.py @@ -8,7 +8,6 @@ class PandasRecipe(CppCompiledComponentsPythonRecipe): url = 'https://github.com/pandas-dev/pandas/releases/download/v{version}/pandas-{version}.tar.gz' # noqa depends = ['cython', 'numpy', 'pytz', 'libbz2', 'liblzma'] - conflicts = ['python2'] python_depends = ['python-dateutil'] patches = ['fix_numpy_includes.patch'] diff --git a/pythonforandroid/recipes/pycrypto/__init__.py b/pythonforandroid/recipes/pycrypto/__init__.py index 8f70df28e9..479eca44c9 100644 --- a/pythonforandroid/recipes/pycrypto/__init__.py +++ b/pythonforandroid/recipes/pycrypto/__init__.py @@ -10,7 +10,7 @@ class PyCryptoRecipe(CompiledComponentsPythonRecipe): version = '2.7a1' url = 'https://github.com/dlitz/pycrypto/archive/v{version}.zip' - depends = ['openssl', ('python2', 'python3')] + depends = ['openssl', 'python3'] site_packages_name = 'Crypto' call_hostpython_via_targetpython = False patches = ['add_length.patch'] diff --git a/pythonforandroid/recipes/pynacl/__init__.py b/pythonforandroid/recipes/pynacl/__init__.py index eb9ca2df50..4170368f9b 100644 --- a/pythonforandroid/recipes/pynacl/__init__.py +++ b/pythonforandroid/recipes/pynacl/__init__.py @@ -7,7 +7,7 @@ class PyNaCLRecipe(CompiledComponentsPythonRecipe): version = '1.3.0' url = 'https://pypi.python.org/packages/source/P/PyNaCl/PyNaCl-{version}.tar.gz' - depends = [('hostpython2', 'hostpython3'), 'six', 'setuptools', 'cffi', 'libsodium'] + depends = ['hostpython3', 'six', 'setuptools', 'cffi', 'libsodium'] call_hostpython_via_targetpython = False def get_recipe_env(self, arch): diff --git a/pythonforandroid/recipes/python2/__init__.py b/pythonforandroid/recipes/python2/__init__.py deleted file mode 100644 index 0f14e5e617..0000000000 --- a/pythonforandroid/recipes/python2/__init__.py +++ /dev/null @@ -1,83 +0,0 @@ -from os.path import join, exists -from pythonforandroid.recipe import Recipe -from pythonforandroid.python import GuestPythonRecipe -from pythonforandroid.logger import shprint, warning -import sh - - -class Python2Recipe(GuestPythonRecipe): - ''' - The python2's recipe. - - .. note:: This recipe can be built only against API 21+ - - .. versionchanged:: 0.6.0 - Updated to version 2.7.15 and the build process has been changed in - favour of the recently added class - :class:`~pythonforandroid.python.GuestPythonRecipe` - ''' - version = "2.7.15" - url = 'https://www.python.org/ftp/python/{version}/Python-{version}.tgz' - name = 'python2' - - depends = ['hostpython2', 'libffi'] - conflicts = ['python3'] - - patches = [ - # new 2.7.15 patches - # ('patches/fix-api-minor-than-21.patch', - # is_api_lt(21)), # Todo: this should be tested - 'patches/fix-missing-extensions.patch', - 'patches/fix-filesystem-default-encoding.patch', - 'patches/fix-gethostbyaddr.patch', - 'patches/fix-posix-declarations.patch', - 'patches/fix-pwd-gecos.patch', - 'patches/fix-ctypes-util-find-library.patch', - 'patches/fix-interpreter-version.patch', - 'patches/fix-zlib-version.patch', - ] - - configure_args = ('--host={android_host}', - '--build={android_build}', - '--enable-shared', - '--disable-ipv6', - '--disable-toolbox-glue', - '--disable-framework', - 'ac_cv_file__dev_ptmx=yes', - 'ac_cv_file__dev_ptc=no', - '--without-ensurepip', - 'ac_cv_little_endian_double=yes', - 'ac_cv_header_langinfo_h=no', - '--prefix={prefix}', - '--exec-prefix={exec_prefix}') - - compiled_extension = '.pyo' - - def prebuild_arch(self, arch): - super(Python2Recipe, self).prebuild_arch(arch) - patch_mark = join(self.get_build_dir(arch.arch), '.openssl-patched') - if 'openssl' in self.ctx.recipe_build_order and not exists(patch_mark): - self.apply_patch(join('patches', 'enable-openssl.patch'), arch.arch) - shprint(sh.touch, patch_mark) - - def build_arch(self, arch): - warning('DEPRECATION: Support for the Python 2 recipe will be ' - 'removed in 2020, please upgrade to Python 3.') - super().build_arch(arch) - - def set_libs_flags(self, env, arch): - env = super(Python2Recipe, self).set_libs_flags(env, arch) - if 'libffi' in self.ctx.recipe_build_order: - # For python2 we need to tell configure that we want to use our - # compiled libffi, this step is not necessary for python3. - self.configure_args += ('--with-system-ffi',) - - if 'openssl' in self.ctx.recipe_build_order: - recipe = Recipe.get_recipe('openssl', self.ctx) - openssl_build = recipe.get_build_dir(arch.arch) - env['OPENSSL_BUILD'] = openssl_build - env['OPENSSL_VERSION'] = recipe.version - return env - - -recipe = Python2Recipe() diff --git a/pythonforandroid/recipes/python2/patches/enable-openssl.patch b/pythonforandroid/recipes/python2/patches/enable-openssl.patch deleted file mode 100644 index 490e065c5f..0000000000 --- a/pythonforandroid/recipes/python2/patches/enable-openssl.patch +++ /dev/null @@ -1,46 +0,0 @@ ---- Python-2.7.15.orig/setup.py 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/setup.py 2018-07-05 11:08:57.305125432 +0200 -@@ -812,18 +840,15 @@ class PyBuildExt(build_ext): - '/usr/local/ssl/include', - '/usr/contrib/ssl/include/' - ] -- ssl_incs = find_file('openssl/ssl.h', inc_dirs, -- search_for_ssl_incs_in -- ) -+ ssl_incs = [ -+ os.path.join(os.environ["OPENSSL_BUILD"], 'include'), -+ os.path.join(os.environ["OPENSSL_BUILD"], 'include', 'openssl')] - if ssl_incs is not None: - krb5_h = find_file('krb5.h', inc_dirs, - ['/usr/kerberos/include']) - if krb5_h: - ssl_incs += krb5_h -- ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs, -- ['/usr/local/ssl/lib', -- '/usr/contrib/ssl/lib/' -- ] ) -+ ssl_libs = [os.environ["OPENSSL_BUILD"]] - - if (ssl_incs is not None and - ssl_libs is not None): -@@ -841,8 +866,8 @@ class PyBuildExt(build_ext): - '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' ) - - # look for the openssl version header on the compiler search path. -- opensslv_h = find_file('openssl/opensslv.h', [], -- inc_dirs + search_for_ssl_incs_in) -+ opensslv_h = [os.path.join(os.environ["OPENSSL_BUILD"], 'include'), -+ os.path.join(os.environ["OPENSSL_BUILD"], 'include', 'openssl')] - if opensslv_h: - name = os.path.join(opensslv_h[0], 'openssl/opensslv.h') - if host_platform == 'darwin' and is_macosx_sdk_path(name): -@@ -859,8 +884,7 @@ class PyBuildExt(build_ext): - - min_openssl_ver = 0x00907000 - have_any_openssl = ssl_incs is not None and ssl_libs is not None -- have_usable_openssl = (have_any_openssl and -- openssl_ver >= min_openssl_ver) -+ have_usable_openssl = (have_any_openssl and True) - - if have_any_openssl: - if have_usable_openssl: diff --git a/pythonforandroid/recipes/python2/patches/fix-api-minor-than-21.patch b/pythonforandroid/recipes/python2/patches/fix-api-minor-than-21.patch deleted file mode 100644 index 73dfc981ec..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-api-minor-than-21.patch +++ /dev/null @@ -1,229 +0,0 @@ -diff -Naurp Python-2.7.15.orig/configure.ac Python-2.7.15/configure.ac ---- Python-2.7.15.orig/configure.ac 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/configure.ac 2018-07-05 17:44:50.500985727 +0200 -@@ -1790,7 +1790,7 @@ fi - # structures (such as rlimit64) without declaring them. As a - # work-around, disable LFS on such configurations - --use_lfs=yes -+use_lfs=no - AC_MSG_CHECKING(Solaris LFS bug) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #define _LARGEFILE_SOURCE 1 -diff -Naurp Python-2.7.15.orig/Modules/mmapmodule.c Python-2.7.15/Modules/mmapmodule.c ---- Python-2.7.15.orig/Modules/mmapmodule.c 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/mmapmodule.c 2018-07-05 16:18:40.953035027 +0200 -@@ -78,6 +78,12 @@ my_getpagesize(void) - # define MAP_ANONYMOUS MAP_ANON - #endif - -+//PMPP API<21 -+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21 -+ extern void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); -+#endif -+//PMPP API<21 -+ - static PyObject *mmap_module_error; - - typedef enum -diff -Naurp Python-2.7.15.orig/Modules/posixmodule.c Python-2.7.15/Modules/posixmodule.c ---- Python-2.7.15.orig/Modules/posixmodule.c 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/posixmodule.c 2018-07-05 16:20:48.933033807 +0200 -@@ -9477,6 +9477,12 @@ all_ins(PyObject *d) - #define MODNAME "posix" - #endif - -+//PMPP API<21 -+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21 -+ extern ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); -+#endif -+//PMPP API<21 -+ - PyMODINIT_FUNC - INITFUNC(void) - { -diff -Naurp Python-2.7.15.orig/Modules/signalmodule.c Python-2.7.15/Modules/signalmodule.c ---- Python-2.7.15.orig/Modules/signalmodule.c 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/signalmodule.c 2018-07-05 16:40:46.601022385 +0200 -@@ -32,6 +32,13 @@ - #include - #endif - -+//PMPP API<21 -+#if defined(__ANDROID_API__) && __ANDROID_API__ < 21 -+ #define SIGRTMIN 32 -+ #define SIGRTMAX _NSIG -+#endif -+//PMPP API<21 -+ - #ifndef NSIG - # if defined(_NSIG) - # define NSIG _NSIG /* For BSD/SysV */ -diff -Naurp Python-2.7.15.orig/Modules/termios.c Python-2.7.15/Modules/termios.c ---- Python-2.7.15.orig/Modules/termios.c 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/termios.c 2018-07-05 16:43:16.457020956 +0200 -@@ -357,7 +357,11 @@ static struct constant { - #endif - - /* tcsetattr() constants */ -+#if defined(__ANDROID_API__) && __ANDROID_API__ > 0 -+ {"TCSANOW", TCSETS}, // https://github.com/android-ndk/ndk/issues/441 -+#else - {"TCSANOW", TCSANOW}, -+#endif - {"TCSADRAIN", TCSADRAIN}, - {"TCSAFLUSH", TCSAFLUSH}, - #ifdef TCSASOFT -diff -Naurp Python-2.7.15.orig/Objects/obmalloc.c Python-2.7.15/Objects/obmalloc.c ---- Python-2.7.15.orig/Objects/obmalloc.c 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Objects/obmalloc.c 2018-07-05 16:52:27.577015700 +0200 -@@ -1,5 +1,11 @@ - #include "Python.h" - -+//PMPP API<21 -+#if __ANDROID_API__ < 21 -+ extern void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); -+#endif -+//PMPP API<21 -+ - #if defined(__has_feature) /* Clang */ - #if __has_feature(address_sanitizer) /* is ASAN enabled? */ - #define ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS \ -############################################################### -######### ANDROID LOCALE PATCHES FOR ANDROID API < 21 ######### -############################################################### ---- Python-2.7.15.orig/Modules/_localemodule.c 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/_localemodule.c 2018-07-05 16:39:08.241023323 +0200 -@@ -170,6 +170,12 @@ PyLocale_setlocale(PyObject* self, PyObj - PyErr_SetString(Error, "invalid locale category"); - return NULL; - } -+#else -+ #ifdef __ANDROID__ -+ #if defined(__ANDROID_API__) && __ANDROID_API__ < 20 -+ return PyUnicode_FromFormat("%s", "C"); -+ #endif -+ #endif - #endif - - if (locale) { -@@ -215,7 +221,15 @@ PyLocale_localeconv(PyObject* self) - return NULL; - - /* if LC_NUMERIC is different in the C library, use saved value */ -- l = localeconv(); -+ //PMPP API<21 -+ #if defined(__ANDROID_API__) && __ANDROID_API__ < 21 -+ /* Don't even try on Android's broken locale.h. */ -+ goto failed; -+ #else -+ /* if LC_NUMERIC is different in the C library, use saved value */ -+ l = localeconv(); //PATCHED -+ #endif -+ //PMPP API<21 - - /* hopefully, the localeconv result survives the C library calls - involved herein */ -@@ -215,7 +215,11 @@ PyLocale_localeconv(PyObject* self) - return NULL; - - /* if LC_NUMERIC is different in the C library, use saved value */ -+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21 - l = localeconv(); -+#else -+ decimal_point = "."; -+#endif - - /* hopefully, the localeconv result survives the C library calls - involved herein */ ---- Python-2.7.15/Objects/stringlib/formatter.h.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Objects/stringlib/formatter.h 2018-12-26 11:37:08.771315390 +0100 -@@ -640,11 +640,17 @@ get_locale_info(int type, LocaleInfo *lo - { - switch (type) { - case LT_CURRENT_LOCALE: { -+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21 -+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in -+ the STL. locale.h header has stubs for localeconv() method, but the library -+ doesn't implement it. The closest Android SDK that implement localeconv() -+ is SDK 21*/ - struct lconv *locale_data = localeconv(); - locale_info->decimal_point = locale_data->decimal_point; - locale_info->thousands_sep = locale_data->thousands_sep; - locale_info->grouping = locale_data->grouping; - break; -+#endif - } - case LT_DEFAULT_LOCALE: - locale_info->decimal_point = "."; ---- Python-2.7.15/Objects/stringlib/localeutil.h.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Objects/stringlib/localeutil.h 2018-12-26 11:38:10.003314806 +0100 -@@ -202,9 +202,18 @@ _Py_InsertThousandsGroupingLocale(STRING - Py_ssize_t n_digits, - Py_ssize_t min_width) - { -+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21 -+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in -+ the STL. locale.h header has stubs for localeconv() method, but the library -+ doesn't implement it. The closest Android SDK that implement localeconv() -+ is SDK 21*/ - struct lconv *locale_data = localeconv(); - const char *grouping = locale_data->grouping; - const char *thousands_sep = locale_data->thousands_sep; -+#else -+ const char *grouping = "\3\0"; -+ const char *thousands_sep = ","; -+#endif - - return _Py_InsertThousandsGrouping(buffer, n_buffer, digits, n_digits, - min_width, grouping, thousands_sep); ---- Python-2.7.15/Python/pystrtod.c.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Python/pystrtod.c 2018-12-26 11:47:54.723309229 +0100 -@@ -126,7 +126,13 @@ _PyOS_ascii_strtod(const char *nptr, cha - { - char *fail_pos; - double val = -1.0; -+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21 -+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in -+ the STL. locale.h header has stubs for localeconv() method, but the library -+ doesn't implement it. The closest Android SDK that implement localeconv() -+ is SDK 21*/ - struct lconv *locale_data; -+#endif - const char *decimal_point; - size_t decimal_point_len; - const char *p, *decimal_point_pos; -@@ -138,8 +144,16 @@ _PyOS_ascii_strtod(const char *nptr, cha - - fail_pos = NULL; - -+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21 -+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in -+ the STL. locale.h header has stubs for localeconv() method, but the library -+ doesn't implement it. The closest Android SDK that implement localeconv() -+ is SDK 21*/ - locale_data = localeconv(); - decimal_point = locale_data->decimal_point; -+#else -+ decimal_point = "."; -+#endif - decimal_point_len = strlen(decimal_point); - - assert(decimal_point_len != 0); -@@ -375,8 +389,16 @@ PyOS_string_to_double(const char *s, - Py_LOCAL_INLINE(void) - change_decimal_from_locale_to_dot(char* buffer) - { -+#if defined(__ANDROID_API__) && __ANDROID_API__ >= 21 -+/* NDK version for SDK below 21 doesn't implement the whole C++11 standard in -+ the STL. locale.h header has stubs for localeconv() method, but the library -+ doesn't implement it. The closest Android SDK that implement localeconv() -+ is SDK 21*/ - struct lconv *locale_data = localeconv(); - const char *decimal_point = locale_data->decimal_point; -+#else -+ decimal_point = "."; -+#endif - - if (decimal_point[0] != '.' || decimal_point[1] != 0) { - size_t decimal_point_len = strlen(decimal_point); diff --git a/pythonforandroid/recipes/python2/patches/fix-ctypes-util-find-library.patch b/pythonforandroid/recipes/python2/patches/fix-ctypes-util-find-library.patch deleted file mode 100644 index 4f29b047ad..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-ctypes-util-find-library.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff -u a/Lib/ctypes/util.py b/Lib/ctypes/util.py ---- a/Lib/ctypes/util.py 2019-06-20 18:52:01.372205226 +0200 -+++ b/Lib/ctypes/util.py 2019-06-20 18:51:39.612970779 +0200 -@@ -70,7 +70,14 @@ - def find_library(name): - return name - --if os.name == "posix" and sys.platform == "darwin": -+# This patch overrides the find_library to look in the right places on -+# Android -+if True: -+ from android._ctypes_library_finder import find_library as _find_lib -+ def find_library(name): -+ return _find_lib(name) -+ -+elif os.name == "posix" and sys.platform == "darwin": - from ctypes.macholib.dyld import dyld_find as _dyld_find - def find_library(name): - possible = ['lib%s.dylib' % name, diff --git a/pythonforandroid/recipes/python2/patches/fix-filesystem-default-encoding.patch b/pythonforandroid/recipes/python2/patches/fix-filesystem-default-encoding.patch deleted file mode 100644 index 7cf1a8f860..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-filesystem-default-encoding.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- Python-2.7.15.orig/Python/bltinmodule.c 2017-12-29 01:44:57.018079845 +0200 -+++ Python-2.7.15/Python/bltinmodule.c 2017-12-29 01:45:02.650079649 +0200 -@@ -22,7 +22,7 @@ - #elif defined(__APPLE__) - const char *Py_FileSystemDefaultEncoding = "utf-8"; - #else --const char *Py_FileSystemDefaultEncoding = NULL; /* use default */ -+const char *Py_FileSystemDefaultEncoding = "utf-8"; /* use default */ - #endif - - /* Forward */ diff --git a/pythonforandroid/recipes/python2/patches/fix-gethostbyaddr.patch b/pythonforandroid/recipes/python2/patches/fix-gethostbyaddr.patch deleted file mode 100644 index a3824f4348..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-gethostbyaddr.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- Python-2.7.15/Modules/socketmodule.c.orig 2017-12-29 01:40:09.915694810 +0100 -+++ Python-2.7.15/Modules/socketmodule.c 2017-12-29 01:40:36.967694486 +0100 -@@ -156,6 +156,9 @@ - On the other hand, not all Linux versions agree, so there the settings - computed by the configure script are needed! */ - -+/* Android hack, same reason are what is described above */ -+#undef HAVE_GETHOSTBYNAME_R -+ - #ifndef linux - # undef HAVE_GETHOSTBYNAME_R_3_ARG - # undef HAVE_GETHOSTBYNAME_R_5_ARG diff --git a/pythonforandroid/recipes/python2/patches/fix-interpreter-version.patch b/pythonforandroid/recipes/python2/patches/fix-interpreter-version.patch deleted file mode 100644 index a1828bf582..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-interpreter-version.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- Python-2.7.15/configure.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/configure 2019-08-16 14:09:48.696030207 +0200 -@@ -2903,7 +2903,7 @@ case $host_os in *\ *) host_os=`echo "$h - # pybuilddir.txt will be created by --generate-posix-vars in the Makefile - rm -f pybuilddir.txt - --for ac_prog in python$PACKAGE_VERSION python3 python -+for ac_prog in python$PACKAGE_VERSION python2 python - do - # Extract the first word of "$ac_prog", so it can be a program name with args. - set dummy $ac_prog; ac_word=$2 diff --git a/pythonforandroid/recipes/python2/patches/fix-missing-extensions.patch b/pythonforandroid/recipes/python2/patches/fix-missing-extensions.patch deleted file mode 100644 index cb777d3b1f..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-missing-extensions.patch +++ /dev/null @@ -1,108 +0,0 @@ -diff -Naurp Python-2.7.15.orig/Makefile.pre.in Python-2.7.15/Makefile.pre.in ---- Python-2.7.15.orig/Makefile.pre.in 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Makefile.pre.in 2018-11-18 00:43:58.777379280 +0100 -@@ -20,6 +20,7 @@ - - # === Variables set by makesetup === - -+MODNAMES= _MODNAMES_ - MODOBJS= _MODOBJS_ - MODLIBS= _MODLIBS_ - -diff -Naurp Python-2.7.15.orig/Modules/_ctypes/libffi/src/arm/sysv.S Python-2.7.15/Modules/_ctypes/libffi/src/arm/sysv.S ---- Python-2.7.15.orig/Modules/_ctypes/libffi/src/arm/sysv.S 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/_ctypes/libffi/src/arm/sysv.S 2018-11-17 22:28:50.925456603 +0100 -@@ -396,7 +396,7 @@ LSYM(Lbase_args): - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_SINT64 -- stmeqia r2, {r0, r1} -+ stmiaeq r2, {r0, r1} - beq LSYM(Lepilogue_vfp) - - cmp r3, #FFI_TYPE_FLOAT -diff -Naurp Python-2.7.15.orig/Modules/makesetup Python-2.7.15/Modules/makesetup ---- Python-2.7.15.orig/Modules/makesetup 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/makesetup 2018-11-18 00:43:10.289379743 +0100 -@@ -110,6 +110,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | - # Rules appended by makedepend - " >$rulesf - DEFS= -+ NAMES= - MODS= - SHAREDMODS= - OBJS= -@@ -181,7 +182,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | - *.*) echo 1>&2 "bad word $arg in $line" - exit 1;; - -u) skip=libs; libs="$libs -u";; -- [a-zA-Z_]*) mods="$mods $arg";; -+ [a-zA-Z_]*) NAMES="$NAMES $arg"; mods="$mods $arg";; - *) echo 1>&2 "bad word $arg in $line" - exit 1;; - esac -@@ -284,6 +285,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | - echo "1i\\" >$sedf - str="# Generated automatically from $makepre by makesetup." - echo "$str" >>$sedf -+ echo "s%_MODNAMES_%$NAMES%" >>$sedf - echo "s%_MODOBJS_%$OBJS%" >>$sedf - echo "s%_MODLIBS_%$LIBS%" >>$sedf - echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf -diff -Naurp Python-2.7.15.orig/setup.py Python-2.7.15/setup.py ---- Python-2.7.15.orig/setup.py 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/setup.py 2018-11-18 00:40:50.021381080 +0100 -@@ -217,7 +217,11 @@ class PyBuildExt(build_ext): - # Python header files - headers = [sysconfig.get_config_h_filename()] - headers += glob(os.path.join(sysconfig.get_path('include'), "*.h")) -- for ext in self.extensions[:]: -+ # The sysconfig variable built by makesetup, listing the already -+ # built modules as configured by the Setup files. -+ modnames = sysconfig.get_config_var('MODNAMES').split() -+ removed_modules = [] -+ for ext in self.extensions: - ext.sources = [ find_module_file(filename, moddirlist) - for filename in ext.sources ] - if ext.depends is not None: -@@ -231,10 +235,10 @@ class PyBuildExt(build_ext): - # platform specific include directories - ext.include_dirs.extend(incdirlist) - -- # If a module has already been built statically, -- # don't build it here -- if ext.name in sys.builtin_module_names: -- self.extensions.remove(ext) -+ # If a module has already been built by the Makefile, -+ # don't build it here. -+ if ext.name in modnames: -+ removed_modules.append(ext) - - # Parse Modules/Setup and Modules/Setup.local to figure out which - # modules are turned on in the file. -@@ -249,8 +253,9 @@ class PyBuildExt(build_ext): - input.close() - - for ext in self.extensions[:]: -- if ext.name in remove_modules: -- self.extensions.remove(ext) -+ if removed_modules: -+ self.extensions = [x for x in self.extensions if x not in -+ removed_modules] - - # When you run "make CC=altcc" or something similar, you really want - # those environment variables passed into the setup.py phase. Here's -@@ -290,6 +295,13 @@ class PyBuildExt(build_ext): - " detect_modules() for the module's name.") - print - -+ if removed_modules: -+ print("The following modules found by detect_modules() in" -+ " setup.py, have been") -+ print("built by the Makefile instead, as configured by the" -+ " Setup files:") -+ print_three_column([ext.name for ext in removed_modules]) -+ - if self.failed: - failed = self.failed[:] - print diff --git a/pythonforandroid/recipes/python2/patches/fix-posix-declarations.patch b/pythonforandroid/recipes/python2/patches/fix-posix-declarations.patch deleted file mode 100644 index c2a80499b9..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-posix-declarations.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- Python-2.7.15/Modules/posixmodule.c.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/posixmodule.c 2018-12-26 13:46:37.307241303 +0100 -@@ -35,6 +35,12 @@ - # include - #endif /* defined(__VMS) */ - -+/* On android API level 21, 'AT_EACCESS' is not declared although -+ * HAVE_FACCESSAT is defined. */ -+#ifdef __ANDROID__ -+#undef HAVE_FACCESSAT -+#endif -+ - #ifdef __cplusplus - extern "C" { - #endif -@@ -3991,7 +3997,7 @@ posix_openpty(PyObject *self, PyObject * - slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */ - if (slave_fd < 0) - return posix_error(); --#if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC) -+#if !defined(__CYGWIN__) && !defined(__ANDROID__) && !defined(HAVE_DEV_PTC) - ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */ - ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */ - #ifndef __hpux diff --git a/pythonforandroid/recipes/python2/patches/fix-pwd-gecos.patch b/pythonforandroid/recipes/python2/patches/fix-pwd-gecos.patch deleted file mode 100644 index cdc06fd4ad..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-pwd-gecos.patch +++ /dev/null @@ -1,89 +0,0 @@ ---- Python-2.7.15/configure.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/configure 2018-12-26 12:46:08.163275913 +0100 -@@ -12177,6 +12177,32 @@ _ACEOF - - fi - -+ac_fn_c_check_member "$LINENO" "struct passwd" "pw_gecos" "ac_cv_member_struct_passwd_pw_gecos" " -+ #include -+ #include -+ -+" -+if test "x$ac_cv_member_struct_passwd_pw_gecos" = xyes; then : -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_STRUCT_PASSWD_PW_GECOS 1 -+_ACEOF -+ -+ -+fi -+ac_fn_c_check_member "$LINENO" "struct passwd" "pw_passwd" "ac_cv_member_struct_passwd_pw_passwd" " -+ #include -+ #include -+ -+" -+if test "x$ac_cv_member_struct_passwd_pw_passwd" = xyes; then : -+ -+cat >>confdefs.h <<_ACEOF -+#define HAVE_STRUCT_PASSWD_PW_PASSWD 1 -+_ACEOF -+ -+ -+fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for time.h that defines altzone" >&5 - $as_echo_n "checking for time.h that defines altzone... " >&6; } ---- Python-2.7.15/configure.ac.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/configure.ac 2018-12-26 12:50:20.679273505 +0100 -@@ -3562,6 +3562,10 @@ AC_CHECK_MEMBERS([struct stat.st_flags]) - AC_CHECK_MEMBERS([struct stat.st_gen]) - AC_CHECK_MEMBERS([struct stat.st_birthtime]) - AC_CHECK_MEMBERS([struct stat.st_blocks]) -+AC_CHECK_MEMBERS([struct passwd.pw_gecos, struct passwd.pw_passwd], [], [], [[ -+ #include -+ #include -+]]) - - AC_MSG_CHECKING(for time.h that defines altzone) - AC_CACHE_VAL(ac_cv_header_time_altzone,[ ---- Python-2.7.15/pyconfig.h.in.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/pyconfig.h.in 2018-12-26 12:52:13.247272432 +0100 -@@ -737,6 +737,12 @@ - /* Define to 1 if you have the header file. */ - #undef HAVE_STROPTS_H - -+/* Define to 1 if `pw_gecos' is a member of `struct passwd'. */ -+#undef HAVE_STRUCT_PASSWD_PW_GECOS -+ -+/* Define to 1 if `pw_passwd' is a member of `struct passwd'. */ -+#undef HAVE_STRUCT_PASSWD_PW_PASSWD -+ - /* Define to 1 if `st_birthtime' is a member of `struct stat'. */ - #undef HAVE_STRUCT_STAT_ST_BIRTHTIME - ---- Python-2.7.15/Modules/pwdmodule.c.orig 2018-04-30 00:47:33.000000000 +0200 -+++ Python-2.7.15/Modules/pwdmodule.c 2018-12-26 12:38:47.611280115 +0100 -@@ -68,17 +68,17 @@ mkpwent(struct passwd *p) - #define SETS(i,val) sets(v, i, val) - - SETS(setIndex++, p->pw_name); --#ifdef __VMS -- SETS(setIndex++, ""); --#else -+#if defined(HAVE_STRUCT_PASSWD_PW_PASSWD) - SETS(setIndex++, p->pw_passwd); -+#else -+ SETS(setIndex++, ""); - #endif - PyStructSequence_SET_ITEM(v, setIndex++, _PyInt_FromUid(p->pw_uid)); - PyStructSequence_SET_ITEM(v, setIndex++, _PyInt_FromGid(p->pw_gid)); --#ifdef __VMS -- SETS(setIndex++, ""); --#else -+#if defined(HAVE_STRUCT_PASSWD_PW_GECOS) - SETS(setIndex++, p->pw_gecos); -+#else -+ SETS(setIndex++, ""); - #endif - SETS(setIndex++, p->pw_dir); - SETS(setIndex++, p->pw_shell); diff --git a/pythonforandroid/recipes/python2/patches/fix-zlib-version.patch b/pythonforandroid/recipes/python2/patches/fix-zlib-version.patch deleted file mode 100644 index b7c14dbf80..0000000000 --- a/pythonforandroid/recipes/python2/patches/fix-zlib-version.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- Python-3.7.1/setup.py.orig 2018-10-20 08:04:19.000000000 +0200 -+++ Python-3.7.1/setup.py 2019-02-17 00:24:30.715904412 +0100 -@@ -1416,7 +1416,8 @@ class PyBuildExt(build_ext): - if zlib_inc is not None: - zlib_h = zlib_inc[0] + '/zlib.h' - version = '"0.0.0"' -- version_req = '"1.1.3"' -+ version_req = '"{}"'.format( -+ os.environ.get('ZLIB_VERSION', '1.1.3')) - if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h): - zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:]) - with open(zlib_h) as fp: diff --git a/pythonforandroid/recipes/python3/__init__.py b/pythonforandroid/recipes/python3/__init__.py index c80875ccc3..8a84d510f0 100644 --- a/pythonforandroid/recipes/python3/__init__.py +++ b/pythonforandroid/recipes/python3/__init__.py @@ -58,7 +58,6 @@ class Python3Recipe(GuestPythonRecipe): # - _bz2.so # - _lzma.so opt_depends = ['libbz2', 'liblzma'] - conflicts = ['python2'] configure_args = ( '--host={android_host}', diff --git a/pythonforandroid/recipes/secp256k1/__init__.py b/pythonforandroid/recipes/secp256k1/__init__.py index 338c7b90c3..fc7c7050cd 100644 --- a/pythonforandroid/recipes/secp256k1/__init__.py +++ b/pythonforandroid/recipes/secp256k1/__init__.py @@ -11,8 +11,8 @@ class Secp256k1Recipe(CppCompiledComponentsPythonRecipe): depends = [ 'openssl', - ('hostpython3', 'hostpython2'), - ('python2', 'python3'), + 'hostpython3', + 'python3', 'setuptools', 'libffi', 'cffi', diff --git a/pythonforandroid/recipes/shapely/__init__.py b/pythonforandroid/recipes/shapely/__init__.py index f70876132e..7e44d40db2 100644 --- a/pythonforandroid/recipes/shapely/__init__.py +++ b/pythonforandroid/recipes/shapely/__init__.py @@ -7,11 +7,6 @@ class ShapelyRecipe(CythonRecipe): url = 'https://github.com/Toblerity/Shapely/archive/{version}.tar.gz' depends = ['setuptools', 'libgeos'] - # Actually, this recipe seems to compile/install fine for python2, but it - # fails at runtime when importing module with: - # `[Errno 2] No such file or directory` - conflicts = ['python2'] - call_hostpython_via_targetpython = False # Patch to avoid libgeos check (because it fails), insert environment diff --git a/pythonforandroid/recommendations.py b/pythonforandroid/recommendations.py index 163e4ae6d5..9f5cd36dc2 100644 --- a/pythonforandroid/recommendations.py +++ b/pythonforandroid/recommendations.py @@ -194,10 +194,8 @@ def check_ndk_api(ndk_api, android_api): minor=MIN_PYTHON_MINOR_VERSION)) PY2_ERROR_TEXT = ( 'python-for-android no longer supports running under Python 2. Either upgrade to ' - 'Python {min_version} or higher (recommended), or revert to python-for-android 2019.07.08. ' - 'Note that you *can* still target Python 2 on Android by including python2 in your ' - 'requirements.').format( - min_version=MIN_PYTHON_VERSION) + 'Python {min_version} or higher (recommended), or revert to python-for-android 2019.07.08.' +).format(min_version=MIN_PYTHON_VERSION) PY_VERSION_ERROR_TEXT = ( 'Your Python version {user_major}.{user_minor} is not supported by python-for-android, ' diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index adb46acdf0..b4236d8860 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -749,7 +749,7 @@ def recipes(self, args): .. code-block:: bash python3 3.7.1 depends: ['hostpython3', 'sqlite3', 'openssl', 'libffi'] - conflicts: ['python2'] + conflicts: [] optional depends: ['sqlite3', 'libffi', 'openssl'] """ ctx = self.ctx diff --git a/pythonforandroid/tools/liblink b/pythonforandroid/tools/liblink index 69f8ef23af..182eff7a6c 100755 --- a/pythonforandroid/tools/liblink +++ b/pythonforandroid/tools/liblink @@ -1,4 +1,4 @@ -#!/usr/bin/env python2.7 +#!/usr/bin/env python from __future__ import print_function import sys diff --git a/testapps/setup_testapp_python2.py b/testapps/setup_testapp_python2.py deleted file mode 100644 index 9499c80c73..0000000000 --- a/testapps/setup_testapp_python2.py +++ /dev/null @@ -1,32 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'sdl2,numpy,pyjnius,kivy,python2', - 'android-api': 27, - 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/android-ndk-r17c', - 'dist-name': 'bdisttest_python2', - 'ndk-version': '10.3.2', - 'permission': 'VIBRATE', - 'arch': 'armeabi-v7a', - 'window': None, - }} - -package_data = {'': ['*.py', - '*.png'] - } - -packages = find_packages() -print('packages are', packages) - -setup( - name='testapp_python2', - version='1.1', - description='p4a setup.py test', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp': ['*.py', '*.png']} -) diff --git a/testapps/setup_testapp_python2_sqlite_openssl.py b/testapps/setup_testapp_python2_sqlite_openssl.py deleted file mode 100644 index c1dcf53efc..0000000000 --- a/testapps/setup_testapp_python2_sqlite_openssl.py +++ /dev/null @@ -1,25 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'sdl2,pyjnius,kivy,python2,openssl,requests,peewee,sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'ndk-dir': '/home/sandy/android/android-ndk-r17c', - 'dist-name': 'bdisttest_python2_sqlite_openssl', - 'ndk-version': '10.3.2', - 'permissions': ['INTERNET', 'VIBRATE'], - 'arch': 'armeabi-v7a', - 'window': None, - }} - -setup( - name='testapp_python2_sqlite_openssl', - version='1.1', - description='p4a setup.py test', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp_sqlite_openssl': ['*.py', '*.png']} -) diff --git a/testapps/testlauncher_setup/sdl2.py b/testapps/testlauncher_setup/sdl2.py index 9db55dc497..11f1a3785a 100644 --- a/testapps/testlauncher_setup/sdl2.py +++ b/testapps/testlauncher_setup/sdl2.py @@ -5,7 +5,7 @@ 'bootstrap': 'sdl2', 'launcher': None, 'requirements': ( - 'python2,sdl2,android,' + 'python3,sdl2,android,' 'sqlite3,docutils,pygments,kivy,pyjnius,plyer,' 'cymunk,lxml,pil,openssl,pyopenssl,' 'twisted'), # audiostream, ffmpeg, numpy diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index aa84fba446..ca0db9aee5 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -76,7 +76,7 @@ def test_attributes(self): bs = Bootstrap().get_bootstrap("sdl2", self.ctx) self.assertEqual(bs.name, "sdl2") self.assertEqual(bs.jni_dir, "sdl2/jni") - self.assertEqual(bs.get_build_dir_name(), "sdl2-python3") + self.assertEqual(bs.get_build_dir_name(), "sdl2") # bs.dist_dir should raise an error if there is no distribution to query bs.distribution = None @@ -100,7 +100,7 @@ def test_build_dist_dirs(self): bs = Bootstrap.get_bootstrap("sdl2", self.ctx) self.assertTrue( - bs.get_build_dir().endswith("build/bootstrap_builds/sdl2-python3") + bs.get_build_dir().endswith("build/bootstrap_builds/sdl2") ) self.assertTrue(bs.get_dist_dir("test_prj").endswith("dists/test_prj")) self.assertTrue( @@ -181,8 +181,8 @@ def test_expand_dependencies_with_pure_python_package(self): expanded_result = expand_dependencies( ["python3", "kivy", "peewee"], self.ctx ) - # we expect to have two results (one for python2 and one for python3) - self.assertEqual(len(expanded_result), 2) + # we expect to one results for python3 + self.assertEqual(len(expanded_result), 1) self.assertIsInstance(expanded_result, list) for i in expanded_result: self.assertIsInstance(i, list) @@ -244,11 +244,6 @@ def _add_sdl2_conflicting_recipe(name, ctx): ) self.assertEqual(bs.name, "service_only") - # Test wrong recipes - wrong_recipes = {"python2", "python3", "pyjnius"} - bs = Bootstrap.get_bootstrap_from_recipes(wrong_recipes, self.ctx) - self.assertIsNone(bs) - @mock.patch("pythonforandroid.bootstrap.ensure_dir") def test_prepare_dist_dir(self, mock_ensure_dir): """A test which will initialize a bootstrap and will check if the diff --git a/tests/test_entrypoints_python2.py b/tests/test_entrypoints_python2.py deleted file mode 100644 index 0a2f6ebb4f..0000000000 --- a/tests/test_entrypoints_python2.py +++ /dev/null @@ -1,38 +0,0 @@ - -# This test is a special case that we expect to run under Python 2, so -# include the necessary compatibility imports: -try: # Python 3 - from unittest import mock -except ImportError: # Python 2 - import mock - -from pythonforandroid.recommendations import PY2_ERROR_TEXT -from pythonforandroid import entrypoints - - -def test_main_python2(): - """Test that running under Python 2 leads to the build failing, while - running under a suitable version works fine. - - Note that this test must be run *using* Python 2 to truly test - that p4a can reach the Python version check before importing some - Python-3-only syntax and crashing. - """ - - # Under Python 2, we should get a normal control flow exception - # that is handled properly, not any other type of crash - handle_exception_path = 'pythonforandroid.entrypoints.handle_build_exception' - with mock.patch('sys.version_info') as fake_version_info, \ - mock.patch(handle_exception_path) as handle_build_exception: # noqa: E127 - - fake_version_info.major = 2 - fake_version_info.minor = 7 - - def check_python2_exception(exc): - """Check that the exception message is Python 2 specific.""" - assert exc.message == PY2_ERROR_TEXT - handle_build_exception.side_effect = check_python2_exception - - entrypoints.main() - - handle_build_exception.assert_called_once() diff --git a/tests/test_graph.py b/tests/test_graph.py index ebe9fb400d..9cc44fc041 100644 --- a/tests/test_graph.py +++ b/tests/test_graph.py @@ -13,7 +13,7 @@ ctx = Context() -name_sets = [['python2'], +name_sets = [['python3'], ['kivy']] bootstraps = [None, Bootstrap.get_bootstrap('sdl2', ctx)] @@ -26,7 +26,7 @@ ] ) invalid_combinations = [ - [['python2', 'python3'], None], + [['pil', 'pillow'], None], [['pysdl2', 'genericndkbuild'], None], ] invalid_combinations_simple = list(invalid_combinations) @@ -211,7 +211,7 @@ def test_multichoice_obvious_conflict_checker(monkeypatch): def test_bootstrap_dependency_addition(): build_order, python_modules, bs = get_recipe_order_and_bootstrap( ctx, ['kivy'], None) - assert (('hostpython2' in build_order) or ('hostpython3' in build_order)) + assert ('hostpython3' in build_order) def test_graph_deplist_transformation(): @@ -227,8 +227,8 @@ def test_graph_deplist_transformation(): def test_bootstrap_dependency_addition2(): build_order, python_modules, bs = get_recipe_order_and_bootstrap( - ctx, ['kivy', 'python2'], None) - assert 'hostpython2' in build_order + ctx, ['kivy', 'python3'], None) + assert 'hostpython3' in build_order if __name__ == "__main__": diff --git a/tox.ini b/tox.ini index 6a90ef435d..9ded48b328 100644 --- a/tox.ini +++ b/tox.ini @@ -1,10 +1,9 @@ [tox] -envlist = pep8,py27,py3 +envlist = pep8,py3 basepython = python3 [testenv] deps = - py27: mock pytest virtualenv py3: coveralls @@ -16,12 +15,6 @@ passenv = TRAVIS TRAVIS_* setenv = PYTHONPATH={toxinidir} -[testenv:py27] -# Note that the set of tests is not posargs-configurable here: we only -# check a minimal set of Python 2 tests for the remaining Python 2 -# functionality that we support -commands = pytest tests/test_androidmodule_ctypes_finder.py tests/test_entrypoints_python2.py - [testenv:py3] # for py3 env we will get code coverage commands = From e02541fff57960a51f2c8f76f0eafdf23e48d032 Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Mon, 30 Mar 2020 16:08:40 +0200 Subject: [PATCH 03/35] :fire: Move to python3 `super` calls (#2106) Co-authored-by: Alexander Taylor --- pythonforandroid/archs.py | 4 ++-- pythonforandroid/bootstraps/sdl2/__init__.py | 2 +- .../bootstraps/service_only/__init__.py | 2 +- .../bootstraps/webview/__init__.py | 2 +- pythonforandroid/build.py | 2 +- pythonforandroid/logger.py | 2 +- pythonforandroid/python.py | 4 ++-- pythonforandroid/recipe.py | 24 +++++++++---------- pythonforandroid/recipes/Pillow/__init__.py | 2 +- pythonforandroid/recipes/android/__init__.py | 4 ++-- .../android/src/android/_android_billing.pyx | 2 +- .../recipes/android/src/android/activity.py | 4 ++-- .../recipes/android/src/android/broadcast.py | 2 +- .../recipes/android/src/android/runnable.py | 2 +- pythonforandroid/recipes/apsw/__init__.py | 4 ++-- .../recipes/audiostream/__init__.py | 2 +- pythonforandroid/recipes/bcrypt/__init__.py | 2 +- pythonforandroid/recipes/boost/__init__.py | 4 ++-- pythonforandroid/recipes/cdecimal/__init__.py | 2 +- pythonforandroid/recipes/cffi/__init__.py | 4 ++-- .../recipes/cryptography/__init__.py | 2 +- pythonforandroid/recipes/enum34/__init__.py | 2 +- pythonforandroid/recipes/evdev/__init__.py | 2 +- pythonforandroid/recipes/ffmpeg/__init__.py | 2 +- .../recipes/ffpyplayer/__init__.py | 2 +- pythonforandroid/recipes/freetype/__init__.py | 2 +- .../recipes/genericndkbuild/__init__.py | 6 +++-- pythonforandroid/recipes/harfbuzz/__init__.py | 2 +- pythonforandroid/recipes/icu/__init__.py | 2 +- pythonforandroid/recipes/kivy/__init__.py | 6 ++--- .../recipes/libmysqlclient/__init__.py | 2 +- .../recipes/libsodium/__init__.py | 2 +- .../recipes/libtorrent/__init__.py | 4 ++-- .../recipes/libvorbis/__init__.py | 2 +- pythonforandroid/recipes/libxml2/__init__.py | 2 +- pythonforandroid/recipes/libxslt/__init__.py | 2 +- pythonforandroid/recipes/libzbar/__init__.py | 2 +- pythonforandroid/recipes/lxml/__init__.py | 4 ++-- pythonforandroid/recipes/m2crypto/__init__.py | 2 +- pythonforandroid/recipes/mysqldb/__init__.py | 4 ++-- pythonforandroid/recipes/opencv/__init__.py | 2 +- pythonforandroid/recipes/openssl/__init__.py | 2 +- pythonforandroid/recipes/pandas/__init__.py | 2 +- pythonforandroid/recipes/pil/__init__.py | 2 +- .../recipes/protobuf_cpp/__init__.py | 4 ++-- pythonforandroid/recipes/psycopg2/__init__.py | 2 +- pythonforandroid/recipes/pycrypto/__init__.py | 4 ++-- pythonforandroid/recipes/pyicu/__init__.py | 2 +- pythonforandroid/recipes/pyjnius/__init__.py | 2 +- .../recipes/pyleveldb/__init__.py | 2 +- pythonforandroid/recipes/pymunk/__init__.py | 2 +- pythonforandroid/recipes/pynacl/__init__.py | 2 +- pythonforandroid/recipes/pysha3/__init__.py | 2 +- pythonforandroid/recipes/python3/__init__.py | 2 +- pythonforandroid/recipes/pyzbar/__init__.py | 2 +- pythonforandroid/recipes/pyzmq/__init__.py | 4 ++-- .../recipes/reportlab/__init__.py | 2 +- pythonforandroid/recipes/scrypt/__init__.py | 2 +- pythonforandroid/recipes/sdl2/__init__.py | 2 +- .../recipes/secp256k1/__init__.py | 2 +- pythonforandroid/recipes/shapely/__init__.py | 2 +- pythonforandroid/recipes/sqlite3/__init__.py | 6 ++--- pythonforandroid/recipes/twisted/__init__.py | 4 ++-- pythonforandroid/recipes/vlc/__init__.py | 4 ++-- pythonforandroid/recipes/zbar/__init__.py | 2 +- .../recipes/zbarlight/__init__.py | 2 +- pythonforandroid/recipes/zope/__init__.py | 4 ++-- .../recipes/zope_interface/__init__.py | 4 ++-- pythonforandroid/util.py | 2 +- tests/test_recipe.py | 4 ++-- 70 files changed, 106 insertions(+), 104 deletions(-) diff --git a/pythonforandroid/archs.py b/pythonforandroid/archs.py index 50dce55cb9..fb991eacf0 100644 --- a/pythonforandroid/archs.py +++ b/pythonforandroid/archs.py @@ -46,7 +46,7 @@ class Arch(object): ] def __init__(self, ctx): - super(Arch, self).__init__() + super().__init__() self.ctx = ctx # Allows injecting additional linker paths used by any recipe. @@ -309,6 +309,6 @@ class ArchAarch_64(Arch): # NDK r19 build system, because it seems that we don't need it anymore, # do we need them? # def get_env(self, with_flags_in_cc=True): - # env = super(ArchAarch_64, self).get_env(with_flags_in_cc) + # env = super().get_env(with_flags_in_cc) # env['EXTRA_CFLAGS'] = self.arch_cflags[-1] # return env diff --git a/pythonforandroid/bootstraps/sdl2/__init__.py b/pythonforandroid/bootstraps/sdl2/__init__.py index dde5f7f79b..fec0fd5da9 100644 --- a/pythonforandroid/bootstraps/sdl2/__init__.py +++ b/pythonforandroid/bootstraps/sdl2/__init__.py @@ -49,7 +49,7 @@ def run_distribute(self): self.strip_libraries(arch) self.fry_eggs(site_packages_dir) - super(SDL2GradleBootstrap, self).run_distribute() + super().run_distribute() bootstrap = SDL2GradleBootstrap() diff --git a/pythonforandroid/bootstraps/service_only/__init__.py b/pythonforandroid/bootstraps/service_only/__init__.py index 2175f8b61f..cc9def0cb7 100644 --- a/pythonforandroid/bootstraps/service_only/__init__.py +++ b/pythonforandroid/bootstraps/service_only/__init__.py @@ -47,7 +47,7 @@ def run_distribute(self): self.strip_libraries(arch) self.fry_eggs(site_packages_dir) - super(ServiceOnlyBootstrap, self).run_distribute() + super().run_distribute() bootstrap = ServiceOnlyBootstrap() diff --git a/pythonforandroid/bootstraps/webview/__init__.py b/pythonforandroid/bootstraps/webview/__init__.py index c59c158356..ba3ffbe673 100644 --- a/pythonforandroid/bootstraps/webview/__init__.py +++ b/pythonforandroid/bootstraps/webview/__init__.py @@ -44,7 +44,7 @@ def run_distribute(self): self.strip_libraries(arch) self.fry_eggs(site_packages_dir) - super(WebViewBootstrap, self).run_distribute() + super().run_distribute() bootstrap = WebViewBootstrap() diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index 8f0ac40a82..f19ddc9e96 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -435,7 +435,7 @@ def prepare_build_environment(self, 'python-for-android cannot continue due to the missing executables above') def __init__(self): - super(Context, self).__init__() + super().__init__() self.include_dirs = [] self._build_env_prepared = False diff --git a/pythonforandroid/logger.py b/pythonforandroid/logger.py index 77cb9da323..193356a2a8 100644 --- a/pythonforandroid/logger.py +++ b/pythonforandroid/logger.py @@ -42,7 +42,7 @@ def format(self, record): record.msg = '{}{}[DEBUG]{}{}: '.format( Err_Style.BRIGHT, Err_Fore.LIGHTBLACK_EX, Err_Fore.RESET, Err_Style.RESET_ALL) + record.msg - return super(LevelDifferentiatingFormatter, self).format(record) + return super().format(record) logger = logging.getLogger('p4a') diff --git a/pythonforandroid/python.py b/pythonforandroid/python.py index 9d180ca7e7..44fa319ed4 100755 --- a/pythonforandroid/python.py +++ b/pythonforandroid/python.py @@ -103,7 +103,7 @@ class GuestPythonRecipe(TargetPythonRecipe): def __init__(self, *args, **kwargs): self._ctx = None - super(GuestPythonRecipe, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def get_recipe_env(self, arch=None, with_flags_in_cc=True): env = environ.copy() @@ -216,7 +216,7 @@ def should_build(self, arch): return not isfile(join(self.link_root(arch.arch), self._libpython)) def prebuild_arch(self, arch): - super(TargetPythonRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) self.ctx.python_recipe = self def build_arch(self, arch): diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index c9d721a7d4..2723cda3f1 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -52,7 +52,7 @@ def __new__(cls, name, bases, dct): if 'version' in dct: dct['_version'] = dct.pop('version') - return super(RecipeMeta, cls).__new__(cls, name, bases, dct) + return super().__new__(cls, name, bases, dct) class Recipe(with_metaclass(RecipeMeta)): @@ -769,8 +769,7 @@ def get_jni_dir(self): return join(self.ctx.bootstrap.build_dir, 'jni') def get_recipe_env(self, arch=None, with_flags_in_cc=True, with_python=False): - env = super(BootstrapNDKRecipe, self).get_recipe_env( - arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) if not with_python: return env @@ -804,7 +803,7 @@ def get_jni_dir(self, arch): return join(self.get_build_dir(arch.arch), 'jni') def build_arch(self, arch, *extra_args): - super(NDKRecipe, self).build_arch(arch) + super().build_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): @@ -856,7 +855,8 @@ class PythonRecipe(Recipe): ''' def __init__(self, *args, **kwargs): - super(PythonRecipe, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) + if 'python3' not in self.depends: # We ensure here that the recipe depends on python even it overrode # `depends`. We only do this if it doesn't already depend on any @@ -868,7 +868,7 @@ def __init__(self, *args, **kwargs): self.depends = depends def clean_build(self, arch=None): - super(PythonRecipe, self).clean_build(arch=arch) + super().clean_build(arch=arch) name = self.folder_name python_install_dirs = glob.glob(join(self.ctx.python_installs_dir, '*')) for python_install in python_install_dirs: @@ -905,7 +905,7 @@ def folder_name(self): return name def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(PythonRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) env['PYTHONNOUSERSITE'] = '1' @@ -950,7 +950,7 @@ def should_build(self, arch): def build_arch(self, arch): '''Install the Python module by calling setup.py install with the target Python dir.''' - super(PythonRecipe, self).build_arch(arch) + super().build_arch(arch) self.install_python_package(arch) def install_python_package(self, arch, name=None, env=None, is_dir=True): @@ -1020,7 +1020,7 @@ def build_compiled_components(self, arch): def install_hostpython_package(self, arch): env = self.get_hostrecipe_env(arch) self.rebuild_compiled_components(arch, env) - super(CompiledComponentsPythonRecipe, self).install_hostpython_package(arch) + super().install_hostpython_package(arch) def rebuild_compiled_components(self, arch, env): info('Rebuilding compiled components in {}'.format(self.name)) @@ -1122,7 +1122,7 @@ def cythonize_build(self, env, build_dir="."): self.cythonize_file(env, build_dir, join(root, filename)) def get_recipe_env(self, arch, with_flags_in_cc=True): - env = super(CythonRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) env['LDFLAGS'] = env['LDFLAGS'] + ' -L{} '.format( self.ctx.get_libs_dir(arch.arch) + ' -L{} '.format(self.ctx.libs_dir) + @@ -1152,10 +1152,10 @@ class TargetPythonRecipe(Recipe): def __init__(self, *args, **kwargs): self._ctx = None - super(TargetPythonRecipe, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def prebuild_arch(self, arch): - super(TargetPythonRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) self.ctx.python_recipe = self def include_root(self, arch): diff --git a/pythonforandroid/recipes/Pillow/__init__.py b/pythonforandroid/recipes/Pillow/__init__.py index 22289463a1..dbf4b01909 100644 --- a/pythonforandroid/recipes/Pillow/__init__.py +++ b/pythonforandroid/recipes/Pillow/__init__.py @@ -13,7 +13,7 @@ class PillowRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(PillowRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) env['ANDROID_ROOT'] = join(self.ctx.ndk_platform, 'usr') ndk_lib_dir = join(self.ctx.ndk_platform, 'usr', 'lib') diff --git a/pythonforandroid/recipes/android/__init__.py b/pythonforandroid/recipes/android/__init__.py index b2563f7301..7fe3e3517d 100644 --- a/pythonforandroid/recipes/android/__init__.py +++ b/pythonforandroid/recipes/android/__init__.py @@ -18,12 +18,12 @@ class AndroidRecipe(IncludedFilesBehaviour, CythonRecipe): config_env = {} def get_recipe_env(self, arch): - env = super(AndroidRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env.update(self.config_env) return env def prebuild_arch(self, arch): - super(AndroidRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) ctx_bootstrap = self.ctx.bootstrap.name # define macros for Cython, C, Python diff --git a/pythonforandroid/recipes/android/src/android/_android_billing.pyx b/pythonforandroid/recipes/android/src/android/_android_billing.pyx index bd6bb2ef7f..d5ed2a00d0 100644 --- a/pythonforandroid/recipes/android/src/android/_android_billing.pyx +++ b/pythonforandroid/recipes/android/src/android/_android_billing.pyx @@ -15,7 +15,7 @@ class BillingService(object): BILLING_TYPE_SUBSCRIPTION = 'subs' def __init__(self, callback): - super(BillingService, self).__init__() + super().__init__() self.callback = callback self.purchased_items = None android_billing_service_start() diff --git a/pythonforandroid/recipes/android/src/android/activity.py b/pythonforandroid/recipes/android/src/android/activity.py index cafbbdab70..9c215075c6 100644 --- a/pythonforandroid/recipes/android/src/android/activity.py +++ b/pythonforandroid/recipes/android/src/android/activity.py @@ -14,7 +14,7 @@ class NewIntentListener(PythonJavaClass): __javacontext__ = 'app' def __init__(self, callback, **kwargs): - super(NewIntentListener, self).__init__(**kwargs) + super().__init__(**kwargs) self.callback = callback @java_method('(Landroid/content/Intent;)V') @@ -27,7 +27,7 @@ class ActivityResultListener(PythonJavaClass): __javacontext__ = 'app' def __init__(self, callback): - super(ActivityResultListener, self).__init__() + super().__init__() self.callback = callback @java_method('(IILandroid/content/Intent;)V') diff --git a/pythonforandroid/recipes/android/src/android/broadcast.py b/pythonforandroid/recipes/android/src/android/broadcast.py index cb34cd9d19..aa454b7c13 100644 --- a/pythonforandroid/recipes/android/src/android/broadcast.py +++ b/pythonforandroid/recipes/android/src/android/broadcast.py @@ -20,7 +20,7 @@ def onReceive(self, context, intent): self.callback(context, intent) def __init__(self, callback, actions=None, categories=None): - super(BroadcastReceiver, self).__init__() + super().__init__() self.callback = callback if not actions and not categories: diff --git a/pythonforandroid/recipes/android/src/android/runnable.py b/pythonforandroid/recipes/android/src/android/runnable.py index 8d2d1161d1..aa5756d43a 100644 --- a/pythonforandroid/recipes/android/src/android/runnable.py +++ b/pythonforandroid/recipes/android/src/android/runnable.py @@ -20,7 +20,7 @@ class Runnable(PythonJavaClass): __runnables__ = [] def __init__(self, func): - super(Runnable, self).__init__() + super().__init__() self.func = func def __call__(self, *args, **kwargs): diff --git a/pythonforandroid/recipes/apsw/__init__.py b/pythonforandroid/recipes/apsw/__init__.py index 542bdef81b..42ad3ba337 100644 --- a/pythonforandroid/recipes/apsw/__init__.py +++ b/pythonforandroid/recipes/apsw/__init__.py @@ -20,10 +20,10 @@ def build_arch(self, arch): 'build_ext', '--enable=fts4', _env=env) # Install python bindings - super(ApswRecipe, self).build_arch(arch) + super().build_arch(arch) def get_recipe_env(self, arch): - env = super(ApswRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) sqlite_recipe = self.get_recipe('sqlite3', self.ctx) env['CFLAGS'] += ' -I' + sqlite_recipe.get_build_dir(arch.arch) env['LDFLAGS'] += ' -L' + sqlite_recipe.get_lib_dir(arch) diff --git a/pythonforandroid/recipes/audiostream/__init__.py b/pythonforandroid/recipes/audiostream/__init__.py index 1e9d388ebc..66fd42f081 100644 --- a/pythonforandroid/recipes/audiostream/__init__.py +++ b/pythonforandroid/recipes/audiostream/__init__.py @@ -10,7 +10,7 @@ class AudiostreamRecipe(CythonRecipe): depends = ['python3', 'sdl2', 'pyjnius'] def get_recipe_env(self, arch): - env = super(AudiostreamRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) sdl_include = 'SDL2' sdl_mixer_include = 'SDL2_mixer' env['USE_SDL2'] = 'True' diff --git a/pythonforandroid/recipes/bcrypt/__init__.py b/pythonforandroid/recipes/bcrypt/__init__.py index e7a5659b8f..da220ff30d 100644 --- a/pythonforandroid/recipes/bcrypt/__init__.py +++ b/pythonforandroid/recipes/bcrypt/__init__.py @@ -9,7 +9,7 @@ class BCryptRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch): - env = super(BCryptRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) openssl_recipe = Recipe.get_recipe('openssl', self.ctx) env['CFLAGS'] += openssl_recipe.include_flags(arch) diff --git a/pythonforandroid/recipes/boost/__init__.py b/pythonforandroid/recipes/boost/__init__.py index 921ed21eb0..195b4d5b96 100644 --- a/pythonforandroid/recipes/boost/__init__.py +++ b/pythonforandroid/recipes/boost/__init__.py @@ -60,7 +60,7 @@ def should_build(self, arch): return not exists(join(self.get_build_dir(arch.arch), 'b2')) def prebuild_arch(self, arch): - super(BoostRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): # Set custom configuration @@ -70,7 +70,7 @@ def prebuild_arch(self, arch): ) def build_arch(self, arch): - super(BoostRecipe, self).build_arch(arch) + super().build_arch(arch) env = self.get_recipe_env(arch) env['PYTHON_HOST'] = self.ctx.hostpython with current_directory(self.get_build_dir(arch.arch)): diff --git a/pythonforandroid/recipes/cdecimal/__init__.py b/pythonforandroid/recipes/cdecimal/__init__.py index 94929c7807..a444eb1b25 100644 --- a/pythonforandroid/recipes/cdecimal/__init__.py +++ b/pythonforandroid/recipes/cdecimal/__init__.py @@ -13,7 +13,7 @@ class CdecimalRecipe(CompiledComponentsPythonRecipe): 'cross-compile.patch'] def prebuild_arch(self, arch): - super(CdecimalRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) if not is_darwin(): if '64' in arch.arch: machine = 'ansi64' diff --git a/pythonforandroid/recipes/cffi/__init__.py b/pythonforandroid/recipes/cffi/__init__.py index aa291dca46..e2a3b57f45 100644 --- a/pythonforandroid/recipes/cffi/__init__.py +++ b/pythonforandroid/recipes/cffi/__init__.py @@ -19,14 +19,14 @@ class CffiRecipe(CompiledComponentsPythonRecipe): def get_hostrecipe_env(self, arch=None): # fixes missing ffi.h on some host systems (e.g. gentoo) - env = super(CffiRecipe, self).get_hostrecipe_env(arch) + env = super().get_hostrecipe_env(arch) libffi = self.get_recipe('libffi', self.ctx) includes = libffi.get_include_dirs(arch) env['FFI_INC'] = ",".join(includes) return env def get_recipe_env(self, arch=None): - env = super(CffiRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) libffi = self.get_recipe('libffi', self.ctx) includes = libffi.get_include_dirs(arch) env['CFLAGS'] = ' -I'.join([env.get('CFLAGS', '')] + includes) diff --git a/pythonforandroid/recipes/cryptography/__init__.py b/pythonforandroid/recipes/cryptography/__init__.py index 1b7babafca..19c8f0d645 100644 --- a/pythonforandroid/recipes/cryptography/__init__.py +++ b/pythonforandroid/recipes/cryptography/__init__.py @@ -10,7 +10,7 @@ class CryptographyRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch): - env = super(CryptographyRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) openssl_recipe = Recipe.get_recipe('openssl', self.ctx) env['CFLAGS'] += openssl_recipe.include_flags(arch) diff --git a/pythonforandroid/recipes/enum34/__init__.py b/pythonforandroid/recipes/enum34/__init__.py index 9a438c5503..35dcda9a9f 100644 --- a/pythonforandroid/recipes/enum34/__init__.py +++ b/pythonforandroid/recipes/enum34/__init__.py @@ -16,7 +16,7 @@ def should_build(self, arch): # attribute `depends` because otherwise we will not be able to # build the cryptography recipe. return False - return super(Enum34Recipe, self).should_build(arch) + return super().should_build(arch) recipe = Enum34Recipe() diff --git a/pythonforandroid/recipes/evdev/__init__.py b/pythonforandroid/recipes/evdev/__init__.py index afd542e2a0..2d53f9b0b8 100644 --- a/pythonforandroid/recipes/evdev/__init__.py +++ b/pythonforandroid/recipes/evdev/__init__.py @@ -17,7 +17,7 @@ class EvdevRecipe(CompiledComponentsPythonRecipe): 'evdev-permissions.patch'] def get_recipe_env(self, arch=None): - env = super(EvdevRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['NDKPLATFORM'] = self.ctx.ndk_platform return env diff --git a/pythonforandroid/recipes/ffmpeg/__init__.py b/pythonforandroid/recipes/ffmpeg/__init__.py index 3418ed1a90..b5e5605a1d 100644 --- a/pythonforandroid/recipes/ffmpeg/__init__.py +++ b/pythonforandroid/recipes/ffmpeg/__init__.py @@ -19,7 +19,7 @@ def prebuild_arch(self, arch): self.apply_patches(arch) def get_recipe_env(self, arch): - env = super(FFMpegRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['NDK'] = self.ctx.ndk_dir return env diff --git a/pythonforandroid/recipes/ffpyplayer/__init__.py b/pythonforandroid/recipes/ffpyplayer/__init__.py index d8fd6ce77d..831e4a8b15 100644 --- a/pythonforandroid/recipes/ffpyplayer/__init__.py +++ b/pythonforandroid/recipes/ffpyplayer/__init__.py @@ -10,7 +10,7 @@ class FFPyPlayerRecipe(CythonRecipe): opt_depends = ['openssl', 'ffpyplayer_codecs'] def get_recipe_env(self, arch, with_flags_in_cc=True): - env = super(FFPyPlayerRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) build_dir = Recipe.get_recipe('ffmpeg', self.ctx).get_build_dir(arch.arch) env["FFMPEG_INCLUDE_DIR"] = join(build_dir, "include") diff --git a/pythonforandroid/recipes/freetype/__init__.py b/pythonforandroid/recipes/freetype/__init__.py index cf8de5ee85..4075ac8a33 100644 --- a/pythonforandroid/recipes/freetype/__init__.py +++ b/pythonforandroid/recipes/freetype/__init__.py @@ -29,7 +29,7 @@ class FreetypeRecipe(Recipe): built_libraries = {'libfreetype.so': 'objs/.libs'} def get_recipe_env(self, arch=None, with_harfbuzz=False): - env = super(FreetypeRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) if with_harfbuzz: harfbuzz_build = self.get_recipe( 'harfbuzz', self.ctx diff --git a/pythonforandroid/recipes/genericndkbuild/__init__.py b/pythonforandroid/recipes/genericndkbuild/__init__.py index be08098db1..0e6354958f 100644 --- a/pythonforandroid/recipes/genericndkbuild/__init__.py +++ b/pythonforandroid/recipes/genericndkbuild/__init__.py @@ -14,8 +14,10 @@ def should_build(self, arch): return True def get_recipe_env(self, arch=None, with_flags_in_cc=True, with_python=True): - env = super(GenericNDKBuildRecipe, self).get_recipe_env( - arch=arch, with_flags_in_cc=with_flags_in_cc, with_python=with_python) + env = super().get_recipe_env( + arch=arch, with_flags_in_cc=with_flags_in_cc, + with_python=with_python, + ) env['APP_ALLOW_MISSING_DEPS'] = 'true' return env diff --git a/pythonforandroid/recipes/harfbuzz/__init__.py b/pythonforandroid/recipes/harfbuzz/__init__.py index 17c72a27e2..9f1a25de6a 100644 --- a/pythonforandroid/recipes/harfbuzz/__init__.py +++ b/pythonforandroid/recipes/harfbuzz/__init__.py @@ -26,7 +26,7 @@ class HarfbuzzRecipe(Recipe): built_libraries = {'libharfbuzz.so': 'src/.libs'} def get_recipe_env(self, arch=None): - env = super(HarfbuzzRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) if 'freetype' in self.ctx.recipe_build_order: freetype = self.get_recipe('freetype', self.ctx) freetype_install = join( diff --git a/pythonforandroid/recipes/icu/__init__.py b/pythonforandroid/recipes/icu/__init__.py index b147455b05..56e2d49798 100644 --- a/pythonforandroid/recipes/icu/__init__.py +++ b/pythonforandroid/recipes/icu/__init__.py @@ -109,7 +109,7 @@ def make_build_dest(dest): shprint(sh.make, "install", _env=env) def install_libraries(self, arch): - super(ICURecipe, self).install_libraries(arch) + super().install_libraries(arch) src_include = join( self.get_build_dir(arch.arch), "icu_build", "include") diff --git a/pythonforandroid/recipes/kivy/__init__.py b/pythonforandroid/recipes/kivy/__init__.py index a93627a021..0e01a91d6a 100644 --- a/pythonforandroid/recipes/kivy/__init__.py +++ b/pythonforandroid/recipes/kivy/__init__.py @@ -14,7 +14,7 @@ class KivyRecipe(CythonRecipe): python_depends = ['certifi'] def cythonize_build(self, env, build_dir='.'): - super(KivyRecipe, self).cythonize_build(env, build_dir=build_dir) + super().cythonize_build(env, build_dir=build_dir) if not exists(join(build_dir, 'kivy', 'include')): return @@ -35,10 +35,10 @@ def cythonize_file(self, env, build_dir, filename): do_not_cythonize = ['window_x11.pyx', ] if basename(filename) in do_not_cythonize: return - super(KivyRecipe, self).cythonize_file(env, build_dir, filename) + super().cythonize_file(env, build_dir, filename) def get_recipe_env(self, arch): - env = super(KivyRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) if 'sdl2' in self.ctx.recipe_build_order: env['USE_SDL2'] = '1' env['KIVY_SPLIT_EXAMPLES'] = '1' diff --git a/pythonforandroid/recipes/libmysqlclient/__init__.py b/pythonforandroid/recipes/libmysqlclient/__init__.py index 9235ad4325..31ebd3c540 100644 --- a/pythonforandroid/recipes/libmysqlclient/__init__.py +++ b/pythonforandroid/recipes/libmysqlclient/__init__.py @@ -38,7 +38,7 @@ def build_arch(self, arch): self.install_libs(arch, join('libmysql', 'libmysql.so')) # def get_recipe_env(self, arch=None): - # env = super(LibmysqlclientRecipe, self).get_recipe_env(arch) + # env = super().get_recipe_env(arch) # env['WITHOUT_SERVER'] = 'ON' # ncurses = self.get_recipe('ncurses', self) # # env['CFLAGS'] += ' -I' + join(ncurses.get_build_dir(arch.arch), diff --git a/pythonforandroid/recipes/libsodium/__init__.py b/pythonforandroid/recipes/libsodium/__init__.py index 8165ebc57e..f66fc18e7f 100644 --- a/pythonforandroid/recipes/libsodium/__init__.py +++ b/pythonforandroid/recipes/libsodium/__init__.py @@ -27,7 +27,7 @@ def build_arch(self, arch): shprint(sh.make, '-j', str(cpu_count()), _env=env) def get_recipe_env(self, arch): - env = super(LibsodiumRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['CFLAGS'] += ' -Os' return env diff --git a/pythonforandroid/recipes/libtorrent/__init__.py b/pythonforandroid/recipes/libtorrent/__init__.py index 0eb50672b7..b9debc2175 100644 --- a/pythonforandroid/recipes/libtorrent/__init__.py +++ b/pythonforandroid/recipes/libtorrent/__init__.py @@ -61,14 +61,14 @@ def should_build(self, arch): self.ctx.has_package('libtorrent', arch.arch)) def prebuild_arch(self, arch): - super(LibtorrentRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) if 'openssl' in recipe.ctx.recipe_build_order: # Patch boost user-config.jam to use openssl self.get_recipe('boost', self.ctx).apply_patch( join(self.get_recipe_dir(), 'user-config-openssl.patch'), arch.arch) def build_arch(self, arch): - super(LibtorrentRecipe, self).build_arch(arch) + super().build_arch(arch) env = self.get_recipe_env(arch) env['PYTHON_HOST'] = self.ctx.hostpython diff --git a/pythonforandroid/recipes/libvorbis/__init__.py b/pythonforandroid/recipes/libvorbis/__init__.py index 87c7a449db..5f1e3254c1 100644 --- a/pythonforandroid/recipes/libvorbis/__init__.py +++ b/pythonforandroid/recipes/libvorbis/__init__.py @@ -12,7 +12,7 @@ class VorbisRecipe(NDKRecipe): generated_libraries = ['libvorbis.so', 'libvorbisfile.so', 'libvorbisenc.so'] def get_recipe_env(self, arch=None): - env = super(VorbisRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) ogg = self.get_recipe('libogg', self.ctx) env['CFLAGS'] += ' -I{}'.format(join(ogg.get_build_dir(arch.arch), 'include')) return env diff --git a/pythonforandroid/recipes/libxml2/__init__.py b/pythonforandroid/recipes/libxml2/__init__.py index bcccc4ebd8..c8788d9d78 100644 --- a/pythonforandroid/recipes/libxml2/__init__.py +++ b/pythonforandroid/recipes/libxml2/__init__.py @@ -43,7 +43,7 @@ def build_arch(self, arch): shprint(sh.make, "libxml2.la", _env=env) def get_recipe_env(self, arch): - env = super(Libxml2Recipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['CONFIG_SHELL'] = '/bin/bash' env['SHELL'] = '/bin/bash' env['CC'] += ' -I' + self.get_build_dir(arch.arch) diff --git a/pythonforandroid/recipes/libxslt/__init__.py b/pythonforandroid/recipes/libxslt/__init__.py index b22e2b328a..ca65fbb9d8 100644 --- a/pythonforandroid/recipes/libxslt/__init__.py +++ b/pythonforandroid/recipes/libxslt/__init__.py @@ -45,7 +45,7 @@ def build_arch(self, arch): shprint(sh.make, "V=1", _env=env) def get_recipe_env(self, arch): - env = super(LibxsltRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['CONFIG_SHELL'] = '/bin/bash' env['SHELL'] = '/bin/bash' diff --git a/pythonforandroid/recipes/libzbar/__init__.py b/pythonforandroid/recipes/libzbar/__init__.py index 5b1b62d8c1..7a9c15650d 100644 --- a/pythonforandroid/recipes/libzbar/__init__.py +++ b/pythonforandroid/recipes/libzbar/__init__.py @@ -19,7 +19,7 @@ class LibZBarRecipe(Recipe): built_libraries = {'libzbar.so': 'zbar/.libs'} def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(LibZBarRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) libiconv = self.get_recipe('libiconv', self.ctx) libiconv_dir = libiconv.get_build_dir(arch.arch) env['CFLAGS'] += ' -I' + os.path.join(libiconv_dir, 'include') diff --git a/pythonforandroid/recipes/lxml/__init__.py b/pythonforandroid/recipes/lxml/__init__.py index 6d4b91c25b..75e7fcd9f7 100644 --- a/pythonforandroid/recipes/lxml/__init__.py +++ b/pythonforandroid/recipes/lxml/__init__.py @@ -12,7 +12,7 @@ class LXMLRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False # Due to setuptools def should_build(self, arch): - super(LXMLRecipe, self).should_build(arch) + super().should_build(arch) py_ver = self.ctx.python_recipe.major_minor_version_string build_platform = '{system}-{machine}'.format( @@ -24,7 +24,7 @@ def should_build(self, arch): return not all([exists(join(build_dir, lib)) for lib in py_libs]) def get_recipe_env(self, arch): - env = super(LXMLRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) # libxslt flags libxslt_recipe = Recipe.get_recipe('libxslt', self.ctx) diff --git a/pythonforandroid/recipes/m2crypto/__init__.py b/pythonforandroid/recipes/m2crypto/__init__.py index 653eeca85c..57860493e2 100644 --- a/pythonforandroid/recipes/m2crypto/__init__.py +++ b/pythonforandroid/recipes/m2crypto/__init__.py @@ -32,7 +32,7 @@ def build_compiled_components(self, arch): env['STRIP'], '{}', ';', _env=env) def get_recipe_env(self, arch): - env = super(M2CryptoRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['OPENSSL_BUILD_PATH'] = self.get_recipe('openssl', self.ctx).get_build_dir(arch.arch) return env diff --git a/pythonforandroid/recipes/mysqldb/__init__.py b/pythonforandroid/recipes/mysqldb/__init__.py index 0559782cff..768cb72af2 100644 --- a/pythonforandroid/recipes/mysqldb/__init__.py +++ b/pythonforandroid/recipes/mysqldb/__init__.py @@ -23,13 +23,13 @@ def convert_newlines(self, filename): f.write(data.replace(b'\r\n', b'\n').replace(b'\r', b'\n')) def prebuild_arch(self, arch): - super(MysqldbRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) setupbase = join(self.get_build_dir(arch.arch), 'setup') self.convert_newlines(setupbase + '.py') self.convert_newlines(setupbase + '_posix.py') def get_recipe_env(self, arch=None): - env = super(MysqldbRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) hostpython = self.get_recipe('hostpython3', self.ctx) # TODO: fix hardcoded path diff --git a/pythonforandroid/recipes/opencv/__init__.py b/pythonforandroid/recipes/opencv/__init__.py index e52c20de28..a57089920f 100644 --- a/pythonforandroid/recipes/opencv/__init__.py +++ b/pythonforandroid/recipes/opencv/__init__.py @@ -38,7 +38,7 @@ def get_lib_dir(self, arch): return join(self.get_build_dir(arch.arch), 'build', 'lib', arch.arch) def get_recipe_env(self, arch): - env = super(OpenCVRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['ANDROID_NDK'] = self.ctx.ndk_dir env['ANDROID_SDK'] = self.ctx.sdk_dir return env diff --git a/pythonforandroid/recipes/openssl/__init__.py b/pythonforandroid/recipes/openssl/__init__.py index a2ecb2c549..0f9f08314b 100644 --- a/pythonforandroid/recipes/openssl/__init__.py +++ b/pythonforandroid/recipes/openssl/__init__.py @@ -93,7 +93,7 @@ def link_flags(self, arch): return self.link_dirs_flags(arch) + self.link_libs_flags() def get_recipe_env(self, arch=None): - env = super(OpenSSLRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['OPENSSL_VERSION'] = self.version env['MAKE'] = 'make' # This removes the '-j5', which isn't safe env['ANDROID_NDK'] = self.ctx.ndk_dir diff --git a/pythonforandroid/recipes/pandas/__init__.py b/pythonforandroid/recipes/pandas/__init__.py index 1432f81f5f..e165b9db74 100644 --- a/pythonforandroid/recipes/pandas/__init__.py +++ b/pythonforandroid/recipes/pandas/__init__.py @@ -15,7 +15,7 @@ class PandasRecipe(CppCompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch): - env = super(PandasRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) # we need the includes from our installed numpy at site packages # because we need some includes generated at numpy's compile time env['NUMPY_INCLUDES'] = join( diff --git a/pythonforandroid/recipes/pil/__init__.py b/pythonforandroid/recipes/pil/__init__.py index 92f633714f..46bace12b7 100644 --- a/pythonforandroid/recipes/pil/__init__.py +++ b/pythonforandroid/recipes/pil/__init__.py @@ -17,7 +17,7 @@ def build_arch(self, arch): 'This should be a drop-in replacement.') warning('It is recommended to change "pil" to "pillow" in your requirements, ' 'to ensure future compatibility') - super(PilRecipe, self).build_arch(arch) + super().build_arch(arch) recipe = PilRecipe() diff --git a/pythonforandroid/recipes/protobuf_cpp/__init__.py b/pythonforandroid/recipes/protobuf_cpp/__init__.py index 36f73def13..9bde198376 100644 --- a/pythonforandroid/recipes/protobuf_cpp/__init__.py +++ b/pythonforandroid/recipes/protobuf_cpp/__init__.py @@ -25,7 +25,7 @@ class ProtobufCppRecipe(CppCompiledComponentsPythonRecipe): protoc_dir = None def prebuild_arch(self, arch): - super(ProtobufCppRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) patch_mark = join(self.get_build_dir(arch.arch), '.protobuf-patched') if self.ctx.python_recipe.name == 'python3' and not exists(patch_mark): @@ -129,7 +129,7 @@ def install_python_package(self, arch): ).close() def get_recipe_env(self, arch): - env = super(ProtobufCppRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) if self.protoc_dir is not None: # we need protoc with binary for host platform env['PROTOC'] = join(self.protoc_dir, 'bin', 'protoc') diff --git a/pythonforandroid/recipes/psycopg2/__init__.py b/pythonforandroid/recipes/psycopg2/__init__.py index fd15790f96..20187ead47 100644 --- a/pythonforandroid/recipes/psycopg2/__init__.py +++ b/pythonforandroid/recipes/psycopg2/__init__.py @@ -26,7 +26,7 @@ def prebuild_arch(self, arch): 'setup.py') def get_recipe_env(self, arch): - env = super(Psycopg2Recipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['LDFLAGS'] = "{} -L{}".format(env['LDFLAGS'], self.ctx.get_libs_dir(arch.arch)) env['EXTRA_CFLAGS'] = "--host linux-armv" return env diff --git a/pythonforandroid/recipes/pycrypto/__init__.py b/pythonforandroid/recipes/pycrypto/__init__.py index 479eca44c9..ae2a375df4 100644 --- a/pythonforandroid/recipes/pycrypto/__init__.py +++ b/pythonforandroid/recipes/pycrypto/__init__.py @@ -16,7 +16,7 @@ class PyCryptoRecipe(CompiledComponentsPythonRecipe): patches = ['add_length.patch'] def get_recipe_env(self, arch=None): - env = super(PyCryptoRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) openssl_recipe = Recipe.get_recipe('openssl', self.ctx) env['CC'] = env['CC'] + openssl_recipe.include_flags(arch) @@ -38,7 +38,7 @@ def build_compiled_components(self, arch): shprint(configure, '--host=arm-eabi', '--prefix={}'.format(self.ctx.get_python_install_dir()), '--enable-shared', _env=env) - super(PyCryptoRecipe, self).build_compiled_components(arch) + super().build_compiled_components(arch) recipe = PyCryptoRecipe() diff --git a/pythonforandroid/recipes/pyicu/__init__.py b/pythonforandroid/recipes/pyicu/__init__.py index 37969079f8..17b7c619b3 100644 --- a/pythonforandroid/recipes/pyicu/__init__.py +++ b/pythonforandroid/recipes/pyicu/__init__.py @@ -10,7 +10,7 @@ class PyICURecipe(CppCompiledComponentsPythonRecipe): patches = ['locale.patch'] def get_recipe_env(self, arch): - env = super(PyICURecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) icu_include = join( self.ctx.get_python_install_dir(), "include", "icu") diff --git a/pythonforandroid/recipes/pyjnius/__init__.py b/pythonforandroid/recipes/pyjnius/__init__.py index 12f3717872..206d851a7f 100644 --- a/pythonforandroid/recipes/pyjnius/__init__.py +++ b/pythonforandroid/recipes/pyjnius/__init__.py @@ -18,7 +18,7 @@ class PyjniusRecipe(CythonRecipe): ('genericndkbuild_jnienv_getter.patch', will_build('genericndkbuild'))] def postbuild_arch(self, arch): - super(PyjniusRecipe, self).postbuild_arch(arch) + super().postbuild_arch(arch) info('Copying pyjnius java class to classes build dir') with current_directory(self.get_build_dir(arch.arch)): shprint(sh.cp, '-a', join('jnius', 'src', 'org'), self.ctx.javaclass_dir) diff --git a/pythonforandroid/recipes/pyleveldb/__init__.py b/pythonforandroid/recipes/pyleveldb/__init__.py index 60b86bb18b..54dfb64657 100644 --- a/pythonforandroid/recipes/pyleveldb/__init__.py +++ b/pythonforandroid/recipes/pyleveldb/__init__.py @@ -10,7 +10,7 @@ class PyLevelDBRecipe(CppCompiledComponentsPythonRecipe): site_packages_name = 'leveldb' def get_recipe_env(self, arch): - env = super(PyLevelDBRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) snappy_recipe = self.get_recipe('snappy', self.ctx) leveldb_recipe = self.get_recipe('leveldb', self.ctx) diff --git a/pythonforandroid/recipes/pymunk/__init__.py b/pythonforandroid/recipes/pymunk/__init__.py index 5f027ab0fb..391ae9b743 100644 --- a/pythonforandroid/recipes/pymunk/__init__.py +++ b/pythonforandroid/recipes/pymunk/__init__.py @@ -10,7 +10,7 @@ class PymunkRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch): - env = super(PymunkRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['PYTHON_ROOT'] = self.ctx.get_python_install_dir() env['LDFLAGS'] += " -shared -llog" env['LDFLAGS'] += ' -L{}'.format(join(self.ctx.ndk_platform, 'usr', 'lib')) diff --git a/pythonforandroid/recipes/pynacl/__init__.py b/pythonforandroid/recipes/pynacl/__init__.py index 4170368f9b..0ab9352eeb 100644 --- a/pythonforandroid/recipes/pynacl/__init__.py +++ b/pythonforandroid/recipes/pynacl/__init__.py @@ -11,7 +11,7 @@ class PyNaCLRecipe(CompiledComponentsPythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch): - env = super(PyNaCLRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['SODIUM_INSTALL'] = 'system' libsodium_build_dir = self.get_recipe( diff --git a/pythonforandroid/recipes/pysha3/__init__.py b/pythonforandroid/recipes/pysha3/__init__.py index c171c3f662..af389460ff 100644 --- a/pythonforandroid/recipes/pysha3/__init__.py +++ b/pythonforandroid/recipes/pysha3/__init__.py @@ -10,7 +10,7 @@ class Pysha3Recipe(PythonRecipe): call_hostpython_via_targetpython = False def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(Pysha3Recipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) # CFLAGS may only be used to specify C compiler flags, for macro definitions use CPPFLAGS env['CPPFLAGS'] = env['CFLAGS'] env['CFLAGS'] = '' diff --git a/pythonforandroid/recipes/python3/__init__.py b/pythonforandroid/recipes/python3/__init__.py index 8a84d510f0..c5792c58c8 100644 --- a/pythonforandroid/recipes/python3/__init__.py +++ b/pythonforandroid/recipes/python3/__init__.py @@ -72,7 +72,7 @@ class Python3Recipe(GuestPythonRecipe): '--exec-prefix={exec_prefix}') def set_libs_flags(self, env, arch): - env = super(Python3Recipe, self).set_libs_flags(env, arch) + env = super().set_libs_flags(env, arch) if 'openssl' in self.ctx.recipe_build_order: recipe = Recipe.get_recipe('openssl', self.ctx) self.configure_args += \ diff --git a/pythonforandroid/recipes/pyzbar/__init__.py b/pythonforandroid/recipes/pyzbar/__init__.py index ccfcd9b2ea..32aaf89185 100644 --- a/pythonforandroid/recipes/pyzbar/__init__.py +++ b/pythonforandroid/recipes/pyzbar/__init__.py @@ -13,7 +13,7 @@ class PyZBarRecipe(PythonRecipe): depends = ['setuptools', 'libzbar'] def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(PyZBarRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) libzbar = self.get_recipe('libzbar', self.ctx) libzbar_dir = libzbar.get_build_dir(arch.arch) env['PYTHON_ROOT'] = self.ctx.get_python_install_dir() diff --git a/pythonforandroid/recipes/pyzmq/__init__.py b/pythonforandroid/recipes/pyzmq/__init__.py index 02b2a406a9..d113840aff 100644 --- a/pythonforandroid/recipes/pyzmq/__init__.py +++ b/pythonforandroid/recipes/pyzmq/__init__.py @@ -19,7 +19,7 @@ class PyZMQRecipe(CythonRecipe): '-Izmq/devices'] def get_recipe_env(self, arch=None): - env = super(PyZMQRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) # TODO: fix hardcoded path # This is required to prevent issue with _io.so import. # hostpython = self.get_recipe('hostpython2', self.ctx) @@ -45,7 +45,7 @@ def build_cython_components(self, arch): skip_check_zmq = True """.format(libzmq_prefix).encode()) - return super(PyZMQRecipe, self).build_cython_components(arch) + return super().build_cython_components(arch) with current_directory(self.get_build_dir(arch.arch)): hostpython = sh.Command(self.hostpython_location) diff --git a/pythonforandroid/recipes/reportlab/__init__.py b/pythonforandroid/recipes/reportlab/__init__.py index d5e8001e46..574f26c67b 100644 --- a/pythonforandroid/recipes/reportlab/__init__.py +++ b/pythonforandroid/recipes/reportlab/__init__.py @@ -13,7 +13,7 @@ class ReportLabRecipe(CompiledComponentsPythonRecipe): def prebuild_arch(self, arch): if not self.is_patched(arch): - super(ReportLabRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) recipe_dir = self.get_build_dir(arch.arch) # Some versions of reportlab ship with a GPL-licensed font. diff --git a/pythonforandroid/recipes/scrypt/__init__.py b/pythonforandroid/recipes/scrypt/__init__.py index 26b8048a05..7f235396a0 100644 --- a/pythonforandroid/recipes/scrypt/__init__.py +++ b/pythonforandroid/recipes/scrypt/__init__.py @@ -13,7 +13,7 @@ def get_recipe_env(self, arch, with_flags_in_cc=True): """ Adds openssl recipe to include and library path. """ - env = super(ScryptRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) openssl_recipe = self.get_recipe('openssl', self.ctx) env['CFLAGS'] += openssl_recipe.include_flags(arch) env['LDFLAGS'] += ' -L{}'.format(self.ctx.get_libs_dir(arch.arch)) diff --git a/pythonforandroid/recipes/sdl2/__init__.py b/pythonforandroid/recipes/sdl2/__init__.py index 00345e89a5..b39f62547c 100644 --- a/pythonforandroid/recipes/sdl2/__init__.py +++ b/pythonforandroid/recipes/sdl2/__init__.py @@ -13,7 +13,7 @@ class LibSDL2Recipe(BootstrapNDKRecipe): depends = ['sdl2_image', 'sdl2_mixer', 'sdl2_ttf'] def get_recipe_env(self, arch=None, with_flags_in_cc=True, with_python=True): - env = super(LibSDL2Recipe, self).get_recipe_env( + env = super().get_recipe_env( arch=arch, with_flags_in_cc=with_flags_in_cc, with_python=with_python) env['APP_ALLOW_MISSING_DEPS'] = 'true' return env diff --git a/pythonforandroid/recipes/secp256k1/__init__.py b/pythonforandroid/recipes/secp256k1/__init__.py index fc7c7050cd..1b30642312 100644 --- a/pythonforandroid/recipes/secp256k1/__init__.py +++ b/pythonforandroid/recipes/secp256k1/__init__.py @@ -24,7 +24,7 @@ class Secp256k1Recipe(CppCompiledComponentsPythonRecipe): "pkg-config.patch", "find_lib.patch", "no-download.patch"] def get_recipe_env(self, arch=None): - env = super(Secp256k1Recipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) libsecp256k1 = self.get_recipe('libsecp256k1', self.ctx) libsecp256k1_dir = libsecp256k1.get_build_dir(arch.arch) env['CFLAGS'] += ' -I' + os.path.join(libsecp256k1_dir, 'include') diff --git a/pythonforandroid/recipes/shapely/__init__.py b/pythonforandroid/recipes/shapely/__init__.py index 7e44d40db2..fb3da7caac 100644 --- a/pythonforandroid/recipes/shapely/__init__.py +++ b/pythonforandroid/recipes/shapely/__init__.py @@ -18,7 +18,7 @@ class ShapelyRecipe(CythonRecipe): # setup_extra_args = ['sdist'] def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(ShapelyRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) libgeos_install = join(self.get_recipe( 'libgeos', self.ctx).get_build_dir(arch.arch), 'install_target') diff --git a/pythonforandroid/recipes/sqlite3/__init__.py b/pythonforandroid/recipes/sqlite3/__init__.py index cfdcb0f6ab..e1324f3e9c 100644 --- a/pythonforandroid/recipes/sqlite3/__init__.py +++ b/pythonforandroid/recipes/sqlite3/__init__.py @@ -14,20 +14,20 @@ def should_build(self, arch): return not self.has_libs(arch, 'libsqlite3.so') def prebuild_arch(self, arch): - super(Sqlite3Recipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) # Copy the Android make file sh.mkdir('-p', join(self.get_build_dir(arch.arch), 'jni')) shutil.copyfile(join(self.get_recipe_dir(), 'Android.mk'), join(self.get_build_dir(arch.arch), 'jni/Android.mk')) def build_arch(self, arch, *extra_args): - super(Sqlite3Recipe, self).build_arch(arch) + super().build_arch(arch) # Copy the shared library shutil.copyfile(join(self.get_build_dir(arch.arch), 'libs', arch.arch, 'libsqlite3.so'), join(self.ctx.get_libs_dir(arch.arch), 'libsqlite3.so')) def get_recipe_env(self, arch): - env = super(Sqlite3Recipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) env['NDK_PROJECT_PATH'] = self.get_build_dir(arch.arch) return env diff --git a/pythonforandroid/recipes/twisted/__init__.py b/pythonforandroid/recipes/twisted/__init__.py index 11da3094d5..0350ed7949 100644 --- a/pythonforandroid/recipes/twisted/__init__.py +++ b/pythonforandroid/recipes/twisted/__init__.py @@ -12,12 +12,12 @@ class TwistedRecipe(CythonRecipe): install_in_hostpython = False def prebuild_arch(self, arch): - super(TwistedRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) # TODO Need to whitelist tty.pyo and termios.so here print('Should remove twisted tests etc. here, but skipping for now') def get_recipe_env(self, arch): - env = super(TwistedRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) # We add BUILDLIB_PATH to PYTHONPATH so twisted can find _io.so env['PYTHONPATH'] = ':'.join([ self.ctx.get_site_packages_dir(), diff --git a/pythonforandroid/recipes/vlc/__init__.py b/pythonforandroid/recipes/vlc/__init__.py index 66f51b96a1..490c4f2a18 100644 --- a/pythonforandroid/recipes/vlc/__init__.py +++ b/pythonforandroid/recipes/vlc/__init__.py @@ -18,7 +18,7 @@ class VlcRecipe(Recipe): aars = {} # for future use of multiple arch def prebuild_arch(self, arch): - super(VlcRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) build_dir = self.get_build_dir(arch.arch) port_dir = join(build_dir, 'vlc-port-android') if self.ENV_LIBVLC_AAR in environ: @@ -50,7 +50,7 @@ def prebuild_arch(self, arch): # _tail=20, _critical=True) def build_arch(self, arch): - super(VlcRecipe, self).build_arch(arch) + super().build_arch(arch) build_dir = self.get_build_dir(arch.arch) port_dir = join(build_dir, 'vlc-port-android') aar = self.aars[arch] diff --git a/pythonforandroid/recipes/zbar/__init__.py b/pythonforandroid/recipes/zbar/__init__.py index 62aa85bbe7..1656895795 100644 --- a/pythonforandroid/recipes/zbar/__init__.py +++ b/pythonforandroid/recipes/zbar/__init__.py @@ -20,7 +20,7 @@ class ZBarRecipe(PythonRecipe): patches = ["zbar-0.10-python-crash.patch"] def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(ZBarRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) libzbar = self.get_recipe('libzbar', self.ctx) libzbar_dir = libzbar.get_build_dir(arch.arch) env['PYTHON_ROOT'] = self.ctx.get_python_install_dir() diff --git a/pythonforandroid/recipes/zbarlight/__init__.py b/pythonforandroid/recipes/zbarlight/__init__.py index 966c7fb241..0f1d718835 100644 --- a/pythonforandroid/recipes/zbarlight/__init__.py +++ b/pythonforandroid/recipes/zbarlight/__init__.py @@ -13,7 +13,7 @@ class ZBarLightRecipe(PythonRecipe): depends = ['setuptools', 'libzbar'] def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(ZBarLightRecipe, self).get_recipe_env(arch, with_flags_in_cc) + env = super().get_recipe_env(arch, with_flags_in_cc) libzbar = self.get_recipe('libzbar', self.ctx) libzbar_dir = libzbar.get_build_dir(arch.arch) env['PYTHON_ROOT'] = self.ctx.get_python_install_dir() diff --git a/pythonforandroid/recipes/zope/__init__.py b/pythonforandroid/recipes/zope/__init__.py index 579a7600c5..9d439cccde 100644 --- a/pythonforandroid/recipes/zope/__init__.py +++ b/pythonforandroid/recipes/zope/__init__.py @@ -11,7 +11,7 @@ class ZopeRecipe(PythonRecipe): depends = [] def get_recipe_env(self, arch): - env = super(ZopeRecipe, self).get_recipe_env(arch) + env = super().get_recipe_env(arch) # These are in the old zope recipe but seem like they shouldn't actually be necessary env['LDFLAGS'] = env['LDFLAGS'] + ' -L{}'.format( @@ -19,7 +19,7 @@ def get_recipe_env(self, arch): env['LDSHARED'] = join(self.ctx.root_dir, 'tools', 'liblink') def postbuild_arch(self, arch): - super(ZopeRecipe, self).postbuild_arch(arch) + super().postbuild_arch(arch) # Should do some deleting here diff --git a/pythonforandroid/recipes/zope_interface/__init__.py b/pythonforandroid/recipes/zope_interface/__init__.py index 245ebc8082..f4142a5b00 100644 --- a/pythonforandroid/recipes/zope_interface/__init__.py +++ b/pythonforandroid/recipes/zope_interface/__init__.py @@ -14,7 +14,7 @@ class ZopeInterfaceRecipe(PythonRecipe): patches = ['no_tests.patch'] def build_arch(self, arch): - super(ZopeInterfaceRecipe, self).build_arch(arch) + super().build_arch(arch) # The zope.interface module lacks of the __init__.py file in one of his # folders (once is installed), that leads into an ImportError. # Here we intentionally apply a patch to solve that, so, in case that @@ -23,7 +23,7 @@ def build_arch(self, arch): self.apply_patch('fix-init.patch', arch.arch, build_dir=zope_install) def prebuild_arch(self, arch): - super(ZopeInterfaceRecipe, self).prebuild_arch(arch) + super().prebuild_arch(arch) with current_directory(self.get_build_dir(arch.arch)): sh.rm( '-rf', diff --git a/pythonforandroid/util.py b/pythonforandroid/util.py index 839858cb1e..d4719ba160 100644 --- a/pythonforandroid/util.py +++ b/pythonforandroid/util.py @@ -102,7 +102,7 @@ def walk_valid_filens(base_dir, invalid_dir_names, invalid_file_patterns): class BuildInterruptingException(Exception): def __init__(self, message, instructions=None): - super(BuildInterruptingException, self).__init__(message, instructions) + super().__init__(message, instructions) self.message = message self.instructions = instructions diff --git a/tests/test_recipe.py b/tests/test_recipe.py index 9ff1713c95..18a1849ab6 100644 --- a/tests/test_recipe.py +++ b/tests/test_recipe.py @@ -189,7 +189,7 @@ def setUp(self): Initialize a Context with a Bootstrap and a Distribution to properly test an library recipe, to do so we reuse `BaseClassSetupBootstrap` """ - super(TestLibraryRecipe, self).setUp() + super().setUp() self.ctx.bootstrap = Bootstrap().get_bootstrap('sdl2', self.ctx) self.setUp_distribution_with_bootstrap(self.ctx.bootstrap) @@ -242,7 +242,7 @@ def setUp(self): test a recipe which depends on android's STL library, to do so we reuse `BaseClassSetupBootstrap` """ - super(TesSTLRecipe, self).setUp() + super().setUp() self.ctx.bootstrap = Bootstrap().get_bootstrap('sdl2', self.ctx) self.setUp_distribution_with_bootstrap(self.ctx.bootstrap) self.ctx.python_recipe = Recipe.get_recipe('python3', self.ctx) From d59b910019f0aba76c26f61fa8bd2a2fe6877189 Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Mon, 30 Mar 2020 17:03:27 +0200 Subject: [PATCH 04/35] [recipes] Update freetype & add zlib support (#2068) --- pythonforandroid/recipes/freetype/__init__.py | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/pythonforandroid/recipes/freetype/__init__.py b/pythonforandroid/recipes/freetype/__init__.py index 4075ac8a33..00dbeec6a1 100644 --- a/pythonforandroid/recipes/freetype/__init__.py +++ b/pythonforandroid/recipes/freetype/__init__.py @@ -24,7 +24,7 @@ class FreetypeRecipe(Recipe): https://sourceforge.net/projects/freetype/files/freetype2/2.5.3/ """ - version = '2.5.5' + version = '2.10.1' url = 'http://download.savannah.gnu.org/releases/freetype/freetype-{version}.tar.gz' # noqa built_libraries = {'libfreetype.so': 'objs/.libs'} @@ -35,9 +35,6 @@ def get_recipe_env(self, arch=None, with_harfbuzz=False): 'harfbuzz', self.ctx ).get_build_dir(arch.arch) freetype_install = join(self.get_build_dir(arch.arch), 'install') - env['CFLAGS'] = ' '.join( - [env['CFLAGS'], '-DFT_CONFIG_OPTION_USE_HARFBUZZ'] - ) env['HARFBUZZ_CFLAGS'] = '-I{harfbuzz} -I{harfbuzz}/src'.format( harfbuzz=harfbuzz_build @@ -48,6 +45,19 @@ def get_recipe_env(self, arch=None, with_harfbuzz=False): freetype=freetype_install, harfbuzz=harfbuzz_build ) ) + + # android's zlib support + zlib_lib_path = join(self.ctx.ndk_platform, 'usr', 'lib') + zlib_includes = join(self.ctx.ndk_dir, 'sysroot', 'usr', 'include') + + def add_flag_if_not_added(flag, env_key): + if flag not in env[env_key]: + env[env_key] += flag + + add_flag_if_not_added(' -I' + zlib_includes, 'CFLAGS') + add_flag_if_not_added(' -L' + zlib_lib_path, 'LDFLAGS') + add_flag_if_not_added(' -lz', 'LDLIBS') + return env def build_arch(self, arch, with_harfbuzz=False): @@ -66,14 +76,17 @@ def build_arch(self, arch, with_harfbuzz=False): config_args = { '--host={}'.format(arch.command_prefix), '--prefix={}'.format(prefix_path), - '--without-zlib', '--without-bzip2', '--with-png=no', } if not harfbuzz_in_recipes: info('Build freetype (without harfbuzz)') config_args = config_args.union( - {'--disable-static', '--enable-shared', '--with-harfbuzz=no'} + {'--disable-static', + '--enable-shared', + '--with-harfbuzz=no', + '--with-zlib=yes', + } ) elif not with_harfbuzz: info('Build freetype for First time (without harfbuzz)') @@ -82,12 +95,16 @@ def build_arch(self, arch, with_harfbuzz=False): # symbols/functions, so we avoid to have two freetype shared # libraries which will be confusing and harder to link with them config_args = config_args.union( - {'--disable-shared', '--with-harfbuzz=no'} + {'--disable-shared', '--with-harfbuzz=no', '--with-zlib=no'} ) else: info('Build freetype for Second time (with harfbuzz)') config_args = config_args.union( - {'--disable-static', '--enable-shared', '--with-harfbuzz=yes'} + {'--disable-static', + '--enable-shared', + '--with-harfbuzz=yes', + '--with-zlib=yes', + } ) info('Configure args are:\n\t-{}'.format('\n\t-'.join(config_args))) From 92790480fc34d7013c976bb6b7f47f02c56d5270 Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Mon, 30 Mar 2020 17:03:56 +0200 Subject: [PATCH 05/35] [recipes] Update harfbuzz to v2.6.4 (#2069) --- pythonforandroid/recipes/harfbuzz/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pythonforandroid/recipes/harfbuzz/__init__.py b/pythonforandroid/recipes/harfbuzz/__init__.py index 9f1a25de6a..fd1dbe9de7 100644 --- a/pythonforandroid/recipes/harfbuzz/__init__.py +++ b/pythonforandroid/recipes/harfbuzz/__init__.py @@ -20,8 +20,8 @@ class HarfbuzzRecipe(Recipe): https://sourceforge.net/projects/freetype/files/freetype2/2.5.3/ """ - version = '0.9.40' - url = 'http://www.freedesktop.org/software/harfbuzz/release/harfbuzz-{version}.tar.bz2' # noqa + version = '2.6.4' + url = 'http://www.freedesktop.org/software/harfbuzz/release/harfbuzz-{version}.tar.xz' # noqa opt_depends = ['freetype'] built_libraries = {'libharfbuzz.so': 'src/.libs'} @@ -50,7 +50,6 @@ def build_arch(self, arch): configure = sh.Command('./configure') shprint( configure, - '--without-icu', '--host={}'.format(arch.command_prefix), '--prefix={}'.format(self.get_build_dir(arch.arch)), '--with-freetype={}'.format( @@ -58,7 +57,10 @@ def build_arch(self, arch): if 'freetype' in self.ctx.recipe_build_order else 'no' ), - '--without-glib', + '--with-icu=no', + '--with-cairo=no', + '--with-fontconfig=no', + '--with-glib=no', _env=env, ) shprint(sh.make, '-j', str(cpu_count()), _env=env) From 7c11148b5502d20a8b4a21a68e556a4cce7056c9 Mon Sep 17 00:00:00 2001 From: oukiar Date: Mon, 30 Mar 2020 10:03:09 -0600 Subject: [PATCH 06/35] =?UTF-8?q?fix=20for=20the=20problem=20with=20decora?= =?UTF-8?q?tor=20run=5Fon=5Fui=5Fthread=20and=20the=20local=20ref=E2=80=A6?= =?UTF-8?q?=20(#1830)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix for the problem with decorator run_on_ui_thread and the local reference table overflow * Added comment about why we cache function references Co-authored-by: Alexander Taylor --- .../recipes/android/src/android/runnable.py | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/pythonforandroid/recipes/android/src/android/runnable.py b/pythonforandroid/recipes/android/src/android/runnable.py index aa5756d43a..9ed419eeaf 100644 --- a/pythonforandroid/recipes/android/src/android/runnable.py +++ b/pythonforandroid/recipes/android/src/android/runnable.py @@ -7,9 +7,12 @@ from jnius import PythonJavaClass, java_method, autoclass from android.config import JAVA_NAMESPACE -# reference to the activity +# Reference to the activity _PythonActivity = autoclass(JAVA_NAMESPACE + '.PythonActivity') +# Cache of functions table. In older Android versions the number of JNI references +# is limited, so by caching them we avoid running out. +__functionstable__ = {} class Runnable(PythonJavaClass): '''Wrapper around Java Runnable class. This class can be used to schedule a @@ -27,6 +30,7 @@ def __call__(self, *args, **kwargs): self.args = args self.kwargs = kwargs Runnable.__runnables__.append(self) + _PythonActivity.mActivity.runOnUiThread(self) @java_method('()V') @@ -38,12 +42,24 @@ def run(self): traceback.print_exc() Runnable.__runnables__.remove(self) + + def run_on_ui_thread(f): '''Decorator to create automatically a :class:`Runnable` object with the function. The function will be delayed and call into the Activity thread. ''' + + if f not in __functionstable__: + + rfunction = Runnable(f) #store the runnable function + + __functionstable__[f] = {"rfunction":rfunction} + + rfunction = __functionstable__[f]["rfunction"] + def f2(*args, **kwargs): - Runnable(f)(*args, **kwargs) + rfunction(*args, **kwargs) + return f2 From 0af0ffa1450bf998e678ba50267fd38b89ed4d1a Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Mon, 30 Mar 2020 19:32:11 +0200 Subject: [PATCH 07/35] :package: Refactor python module into hostpython3/python3 recipes (#2108) * :package: Refactor `pythonforandroid.python` recipes into his own recipe As it was done originally because with only one python recipe, there is no need to have a subclass. * :white_check_mark: Update tests to work with refactored `python3` recipe --- pythonforandroid/python.py | 471 ------------------ .../recipes/hostpython3/__init__.py | 108 +++- pythonforandroid/recipes/python3/__init__.py | 329 +++++++++++- tests/test_bootstrap.py | 16 +- 4 files changed, 440 insertions(+), 484 deletions(-) delete mode 100755 pythonforandroid/python.py diff --git a/pythonforandroid/python.py b/pythonforandroid/python.py deleted file mode 100755 index 44fa319ed4..0000000000 --- a/pythonforandroid/python.py +++ /dev/null @@ -1,471 +0,0 @@ -''' -This module is kind of special because it contains the base classes used to -build our python3 and his corresponding hostpython recipes. -''' - -from os.path import dirname, exists, join, isfile -from multiprocessing import cpu_count -from shutil import copy2 -from os import environ -import subprocess -import glob -import sh - -from pythonforandroid.recipe import Recipe, TargetPythonRecipe -from pythonforandroid.logger import info, warning, shprint -from pythonforandroid.util import ( - current_directory, - ensure_dir, - walk_valid_filens, - BuildInterruptingException, -) - - -class GuestPythonRecipe(TargetPythonRecipe): - ''' - Class for target python recipes. Sets ctx.python_recipe to point to itself, - so as to know later what kind of Python was built or used. - - This base class is used for our main python3 recipe. - - .. versionadded:: 0.6.0 - Refactored from the inclement's python3 recipe with a few changes: - - - Splits the python's build process several methods: :meth:`build_arch` - and :meth:`get_recipe_env`. - - Adds the attribute :attr:`configure_args`, which has been moved from - the method :meth:`build_arch` into a static class variable. - - Adds some static class variables used to create the python bundle and - modifies the method :meth:`create_python_bundle`, to adapt to the new - situation. The added static class variables are: - :attr:`stdlib_dir_blacklist`, :attr:`stdlib_filen_blacklist`, - :attr:`site_packages_dir_blacklist`and - :attr:`site_packages_filen_blacklist`. - ''' - - MIN_NDK_API = 21 - '''Sets the minimal ndk api number needed to use the recipe. - - .. warning:: This recipe can be built only against API 21+, so it means - that any class which inherits from class:`GuestPythonRecipe` will have - this limitation. - ''' - - configure_args = () - '''The configure arguments needed to build the python recipe. Those are - used in method :meth:`build_arch` (if not overwritten like python3's - recipe does). - - .. note:: This variable should be properly set in subclass. - ''' - - stdlib_dir_blacklist = { - '__pycache__', - 'test', - 'tests', - 'lib2to3', - 'ensurepip', - 'idlelib', - 'tkinter', - } - '''The directories that we want to omit for our python bundle''' - - stdlib_filen_blacklist = [ - '*.py', - '*.exe', - '*.whl', - ] - '''The file extensions that we want to blacklist for our python bundle''' - - site_packages_dir_blacklist = { - '__pycache__', - 'tests' - } - '''The directories from site packages dir that we don't want to be included - in our python bundle.''' - - site_packages_filen_blacklist = [ - '*.py' - ] - '''The file extensions from site packages dir that we don't want to be - included in our python bundle.''' - - opt_depends = ['sqlite3', 'libffi', 'openssl'] - '''The optional libraries which we would like to get our python linked''' - - compiled_extension = '.pyc' - '''the default extension for compiled python files. - - .. note:: the default extension for compiled python files has been .pyo for - python 2.x-3.4 but as of Python 3.5, the .pyo filename extension is no - longer used and has been removed in favour of extension .pyc - ''' - - def __init__(self, *args, **kwargs): - self._ctx = None - super().__init__(*args, **kwargs) - - def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = environ.copy() - env['HOSTARCH'] = arch.command_prefix - - env['CC'] = arch.get_clang_exe(with_target=True) - - env['PATH'] = ( - '{hostpython_dir}:{old_path}').format( - hostpython_dir=self.get_recipe( - 'host' + self.name, self.ctx).get_path_to_python(), - old_path=env['PATH']) - - env['CFLAGS'] = ' '.join( - [ - '-fPIC', - '-DANDROID', - '-D__ANDROID_API__={}'.format(self.ctx.ndk_api), - ] - ) - - env['LDFLAGS'] = env.get('LDFLAGS', '') - if sh.which('lld') is not None: - # Note: The -L. is to fix a bug in python 3.7. - # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234409 - env['LDFLAGS'] += ' -L. -fuse-ld=lld' - else: - warning('lld not found, linking without it. ' - 'Consider installing lld if linker errors occur.') - - return env - - def set_libs_flags(self, env, arch): - '''Takes care to properly link libraries with python depending on our - requirements and the attribute :attr:`opt_depends`. - ''' - def add_flags(include_flags, link_dirs, link_libs): - env['CPPFLAGS'] = env.get('CPPFLAGS', '') + include_flags - env['LDFLAGS'] = env.get('LDFLAGS', '') + link_dirs - env['LIBS'] = env.get('LIBS', '') + link_libs - - if 'sqlite3' in self.ctx.recipe_build_order: - info('Activating flags for sqlite3') - recipe = Recipe.get_recipe('sqlite3', self.ctx) - add_flags(' -I' + recipe.get_build_dir(arch.arch), - ' -L' + recipe.get_lib_dir(arch), ' -lsqlite3') - - if 'libffi' in self.ctx.recipe_build_order: - info('Activating flags for libffi') - recipe = Recipe.get_recipe('libffi', self.ctx) - # In order to force the correct linkage for our libffi library, we - # set the following variable to point where is our libffi.pc file, - # because the python build system uses pkg-config to configure it. - env['PKG_CONFIG_PATH'] = recipe.get_build_dir(arch.arch) - add_flags(' -I' + ' -I'.join(recipe.get_include_dirs(arch)), - ' -L' + join(recipe.get_build_dir(arch.arch), '.libs'), - ' -lffi') - - if 'openssl' in self.ctx.recipe_build_order: - info('Activating flags for openssl') - recipe = Recipe.get_recipe('openssl', self.ctx) - add_flags(recipe.include_flags(arch), - recipe.link_dirs_flags(arch), recipe.link_libs_flags()) - - for library_name in {'libbz2', 'liblzma'}: - if library_name in self.ctx.recipe_build_order: - info(f'Activating flags for {library_name}') - recipe = Recipe.get_recipe(library_name, self.ctx) - add_flags(recipe.get_library_includes(arch), - recipe.get_library_ldflags(arch), - recipe.get_library_libs_flag()) - - # python build system contains hardcoded zlib version which prevents - # the build of zlib module, here we search for android's zlib version - # and sets the right flags, so python can be build with android's zlib - info("Activating flags for android's zlib") - zlib_lib_path = join(self.ctx.ndk_platform, 'usr', 'lib') - zlib_includes = join(self.ctx.ndk_dir, 'sysroot', 'usr', 'include') - zlib_h = join(zlib_includes, 'zlib.h') - try: - with open(zlib_h) as fileh: - zlib_data = fileh.read() - except IOError: - raise BuildInterruptingException( - "Could not determine android's zlib version, no zlib.h ({}) in" - " the NDK dir includes".format(zlib_h) - ) - for line in zlib_data.split('\n'): - if line.startswith('#define ZLIB_VERSION '): - break - else: - raise BuildInterruptingException( - 'Could not parse zlib.h...so we cannot find zlib version,' - 'required by python build,' - ) - env['ZLIB_VERSION'] = line.replace('#define ZLIB_VERSION ', '') - add_flags(' -I' + zlib_includes, ' -L' + zlib_lib_path, ' -lz') - - return env - - @property - def _libpython(self): - '''return the python's library name (with extension)''' - py_version = self.major_minor_version_string - if self.major_minor_version_string[0] == '3': - py_version += 'm' - return 'libpython{version}.so'.format(version=py_version) - - def should_build(self, arch): - return not isfile(join(self.link_root(arch.arch), self._libpython)) - - def prebuild_arch(self, arch): - super().prebuild_arch(arch) - self.ctx.python_recipe = self - - def build_arch(self, arch): - if self.ctx.ndk_api < self.MIN_NDK_API: - raise BuildInterruptingException( - 'Target ndk-api is {}, but the python3 recipe supports only' - ' {}+'.format(self.ctx.ndk_api, self.MIN_NDK_API)) - - recipe_build_dir = self.get_build_dir(arch.arch) - - # Create a subdirectory to actually perform the build - build_dir = join(recipe_build_dir, 'android-build') - ensure_dir(build_dir) - - # TODO: Get these dynamically, like bpo-30386 does - sys_prefix = '/usr/local' - sys_exec_prefix = '/usr/local' - - with current_directory(build_dir): - env = self.get_recipe_env(arch) - env = self.set_libs_flags(env, arch) - - android_build = sh.Command( - join(recipe_build_dir, - 'config.guess'))().stdout.strip().decode('utf-8') - - if not exists('config.status'): - shprint( - sh.Command(join(recipe_build_dir, 'configure')), - *(' '.join(self.configure_args).format( - android_host=env['HOSTARCH'], - android_build=android_build, - prefix=sys_prefix, - exec_prefix=sys_exec_prefix)).split(' '), - _env=env) - - shprint( - sh.make, 'all', '-j', str(cpu_count()), - 'INSTSONAME={lib_name}'.format(lib_name=self._libpython), - _env=env - ) - - # TODO: Look into passing the path to pyconfig.h in a - # better way, although this is probably acceptable - sh.cp('pyconfig.h', join(recipe_build_dir, 'Include')) - - def include_root(self, arch_name): - return join(self.get_build_dir(arch_name), 'Include') - - def link_root(self, arch_name): - return join(self.get_build_dir(arch_name), 'android-build') - - def compile_python_files(self, dir): - ''' - Compile the python files (recursively) for the python files inside - a given folder. - - .. note:: python2 compiles the files into extension .pyo, but in - python3, and as of Python 3.5, the .pyo filename extension is no - longer used...uses .pyc (https://www.python.org/dev/peps/pep-0488) - ''' - args = [self.ctx.hostpython] - args += ['-OO', '-m', 'compileall', '-b', '-f', dir] - subprocess.call(args) - - def create_python_bundle(self, dirn, arch): - """ - Create a packaged python bundle in the target directory, by - copying all the modules and standard library to the right - place. - """ - # Todo: find a better way to find the build libs folder - modules_build_dir = join( - self.get_build_dir(arch.arch), - 'android-build', - 'build', - 'lib.linux{}-{}-{}'.format( - '2' if self.version[0] == '2' else '', - arch.command_prefix.split('-')[0], - self.major_minor_version_string - )) - - # Compile to *.pyc/*.pyo the python modules - self.compile_python_files(modules_build_dir) - # Compile to *.pyc/*.pyo the standard python library - self.compile_python_files(join(self.get_build_dir(arch.arch), 'Lib')) - # Compile to *.pyc/*.pyo the other python packages (site-packages) - self.compile_python_files(self.ctx.get_python_install_dir()) - - # Bundle compiled python modules to a folder - modules_dir = join(dirn, 'modules') - c_ext = self.compiled_extension - ensure_dir(modules_dir) - module_filens = (glob.glob(join(modules_build_dir, '*.so')) + - glob.glob(join(modules_build_dir, '*' + c_ext))) - info("Copy {} files into the bundle".format(len(module_filens))) - for filen in module_filens: - info(" - copy {}".format(filen)) - copy2(filen, modules_dir) - - # zip up the standard library - stdlib_zip = join(dirn, 'stdlib.zip') - with current_directory(join(self.get_build_dir(arch.arch), 'Lib')): - stdlib_filens = list(walk_valid_filens( - '.', self.stdlib_dir_blacklist, self.stdlib_filen_blacklist)) - info("Zip {} files into the bundle".format(len(stdlib_filens))) - shprint(sh.zip, stdlib_zip, *stdlib_filens) - - # copy the site-packages into place - ensure_dir(join(dirn, 'site-packages')) - ensure_dir(self.ctx.get_python_install_dir()) - # TODO: Improve the API around walking and copying the files - with current_directory(self.ctx.get_python_install_dir()): - filens = list(walk_valid_filens( - '.', self.site_packages_dir_blacklist, - self.site_packages_filen_blacklist)) - info("Copy {} files into the site-packages".format(len(filens))) - for filen in filens: - info(" - copy {}".format(filen)) - ensure_dir(join(dirn, 'site-packages', dirname(filen))) - copy2(filen, join(dirn, 'site-packages', filen)) - - # copy the python .so files into place - python_build_dir = join(self.get_build_dir(arch.arch), - 'android-build') - python_lib_name = 'libpython' + self.major_minor_version_string - if self.major_minor_version_string[0] == '3': - python_lib_name += 'm' - shprint( - sh.cp, - join(python_build_dir, python_lib_name + '.so'), - join(self.ctx.bootstrap.dist_dir, 'libs', arch.arch) - ) - - info('Renaming .so files to reflect cross-compile') - self.reduce_object_file_names(join(dirn, 'site-packages')) - - return join(dirn, 'site-packages') - - -class HostPythonRecipe(Recipe): - ''' - This is the base class for hostpython3 recipe. This class - will take care to do all the work to build a hostpython recipe but, be - careful, it is intended to be subclassed because some of the vars needs to - be set: - - - :attr:`name` - - :attr:`version` - - .. versionadded:: 0.6.0 - Refactored from the hostpython3's recipe by inclement - ''' - - name = '' - '''The hostpython's recipe name. This should be ``hostpython3`` - - .. warning:: This must be set in inherited class.''' - - version = '' - '''The hostpython's recipe version. - - .. warning:: This must be set in inherited class.''' - - build_subdir = 'native-build' - '''Specify the sub build directory for the hostpython recipe. Defaults - to ``native-build``.''' - - url = 'https://www.python.org/ftp/python/{version}/Python-{version}.tgz' - '''The default url to download our host python recipe. This url will - change depending on the python version set in attribute :attr:`version`.''' - - @property - def _exe_name(self): - ''' - Returns the name of the python executable depending on the version. - ''' - if not self.version: - raise BuildInterruptingException( - 'The hostpython recipe must have set version' - ) - version = self.version.split('.')[0] - return 'python{major_version}'.format(major_version=version) - - @property - def python_exe(self): - '''Returns the full path of the hostpython executable.''' - return join(self.get_path_to_python(), self._exe_name) - - def should_build(self, arch): - if exists(self.python_exe): - # no need to build, but we must set hostpython for our Context - self.ctx.hostpython = self.python_exe - return False - return True - - def get_build_container_dir(self, arch=None): - choices = self.check_recipe_choices() - dir_name = '-'.join([self.name] + choices) - return join(self.ctx.build_dir, 'other_builds', dir_name, 'desktop') - - def get_build_dir(self, arch=None): - ''' - .. note:: Unlike other recipes, the hostpython build dir doesn't - depend on the target arch - ''' - return join(self.get_build_container_dir(), self.name) - - def get_path_to_python(self): - return join(self.get_build_dir(), self.build_subdir) - - def build_arch(self, arch): - recipe_build_dir = self.get_build_dir(arch.arch) - - # Create a subdirectory to actually perform the build - build_dir = join(recipe_build_dir, self.build_subdir) - ensure_dir(build_dir) - - with current_directory(recipe_build_dir): - # Configure the build - with current_directory(build_dir): - if not exists('config.status'): - shprint(sh.Command(join(recipe_build_dir, 'configure'))) - - # Create the Setup file. This copying from Setup.dist is - # the normal and expected procedure before Python 3.8, but - # after this the file with default options is already named "Setup" - setup_dist_location = join('Modules', 'Setup.dist') - if exists(setup_dist_location): - shprint(sh.cp, setup_dist_location, - join(build_dir, 'Modules', 'Setup')) - else: - # Check the expected file does exist - setup_location = join('Modules', 'Setup') - if not exists(setup_location): - raise BuildInterruptingException( - "Could not find Setup.dist or Setup in Python build") - - shprint(sh.make, '-j', str(cpu_count()), '-C', build_dir) - - # make a copy of the python executable giving it the name we want, - # because we got different python's executable names depending on - # the fs being case-insensitive (Mac OS X, Cygwin...) or - # case-sensitive (linux)...so this way we will have an unique name - # for our hostpython, regarding the used fs - for exe_name in ['python.exe', 'python']: - exe = join(self.get_path_to_python(), exe_name) - if isfile(exe): - shprint(sh.cp, exe, self.python_exe) - break - - self.ctx.hostpython = self.python_exe diff --git a/pythonforandroid/recipes/hostpython3/__init__.py b/pythonforandroid/recipes/hostpython3/__init__.py index 82619c64c7..651fb019aa 100644 --- a/pythonforandroid/recipes/hostpython3/__init__.py +++ b/pythonforandroid/recipes/hostpython3/__init__.py @@ -1,16 +1,120 @@ -from pythonforandroid.python import HostPythonRecipe +import sh +from multiprocessing import cpu_count +from os.path import exists, join, isfile -class Hostpython3Recipe(HostPythonRecipe): +from pythonforandroid.logger import shprint +from pythonforandroid.recipe import Recipe +from pythonforandroid.util import ( + BuildInterruptingException, + current_directory, + ensure_dir, +) + + +class Hostpython3Recipe(Recipe): ''' The hostpython3's recipe. + .. versionchanged:: 2019.10.06.post0 + Refactored from deleted class ``python.HostPythonRecipe`` into here. + .. versionchanged:: 0.6.0 Refactored into the new class :class:`~pythonforandroid.python.HostPythonRecipe` ''' + version = '3.8.1' name = 'hostpython3' + build_subdir = 'native-build' + '''Specify the sub build directory for the hostpython3 recipe. Defaults + to ``native-build``.''' + + url = 'https://www.python.org/ftp/python/{version}/Python-{version}.tgz' + '''The default url to download our host python recipe. This url will + change depending on the python version set in attribute :attr:`version`.''' + + @property + def _exe_name(self): + ''' + Returns the name of the python executable depending on the version. + ''' + if not self.version: + raise BuildInterruptingException( + 'The hostpython recipe must have set version' + ) + version = self.version.split('.')[0] + return 'python{major_version}'.format(major_version=version) + + @property + def python_exe(self): + '''Returns the full path of the hostpython executable.''' + return join(self.get_path_to_python(), self._exe_name) + + def should_build(self, arch): + if exists(self.python_exe): + # no need to build, but we must set hostpython for our Context + self.ctx.hostpython = self.python_exe + return False + return True + + def get_build_container_dir(self, arch=None): + choices = self.check_recipe_choices() + dir_name = '-'.join([self.name] + choices) + return join(self.ctx.build_dir, 'other_builds', dir_name, 'desktop') + + def get_build_dir(self, arch=None): + ''' + .. note:: Unlike other recipes, the hostpython build dir doesn't + depend on the target arch + ''' + return join(self.get_build_container_dir(), self.name) + + def get_path_to_python(self): + return join(self.get_build_dir(), self.build_subdir) + + def build_arch(self, arch): + recipe_build_dir = self.get_build_dir(arch.arch) + + # Create a subdirectory to actually perform the build + build_dir = join(recipe_build_dir, self.build_subdir) + ensure_dir(build_dir) + + with current_directory(recipe_build_dir): + # Configure the build + with current_directory(build_dir): + if not exists('config.status'): + shprint(sh.Command(join(recipe_build_dir, 'configure'))) + + # Create the Setup file. This copying from Setup.dist is + # the normal and expected procedure before Python 3.8, but + # after this the file with default options is already named "Setup" + setup_dist_location = join('Modules', 'Setup.dist') + if exists(setup_dist_location): + shprint(sh.cp, setup_dist_location, + join(build_dir, 'Modules', 'Setup')) + else: + # Check the expected file does exist + setup_location = join('Modules', 'Setup') + if not exists(setup_location): + raise BuildInterruptingException( + "Could not find Setup.dist or Setup in Python build") + + shprint(sh.make, '-j', str(cpu_count()), '-C', build_dir) + + # make a copy of the python executable giving it the name we want, + # because we got different python's executable names depending on + # the fs being case-insensitive (Mac OS X, Cygwin...) or + # case-sensitive (linux)...so this way we will have an unique name + # for our hostpython, regarding the used fs + for exe_name in ['python.exe', 'python']: + exe = join(self.get_path_to_python(), exe_name) + if isfile(exe): + shprint(sh.cp, exe, self.python_exe) + break + + self.ctx.hostpython = self.python_exe + recipe = Hostpython3Recipe() diff --git a/pythonforandroid/recipes/python3/__init__.py b/pythonforandroid/recipes/python3/__init__.py index c5792c58c8..2da78f59ac 100644 --- a/pythonforandroid/recipes/python3/__init__.py +++ b/pythonforandroid/recipes/python3/__init__.py @@ -1,10 +1,24 @@ +import glob import sh -from pythonforandroid.python import GuestPythonRecipe -from pythonforandroid.recipe import Recipe +import subprocess + +from multiprocessing import cpu_count +from os import environ +from os.path import dirname, exists, join, isfile +from shutil import copy2 + +from pythonforandroid.logger import info, warning, shprint from pythonforandroid.patching import version_starts_with +from pythonforandroid.recipe import Recipe, TargetPythonRecipe +from pythonforandroid.util import ( + current_directory, + ensure_dir, + walk_valid_filens, + BuildInterruptingException, +) -class Python3Recipe(GuestPythonRecipe): +class Python3Recipe(TargetPythonRecipe): ''' The python3's recipe ^^^^^^^^^^^^^^^^^^^^ @@ -27,8 +41,10 @@ class Python3Recipe(GuestPythonRecipe): .. note:: This recipe can be built only against API 21+. .. versionchanged:: 2019.10.06.post0 - Added optional dependencies: :mod:`~pythonforandroid.recipes.libbz2` - and :mod:`~pythonforandroid.recipes.liblzma` + - Refactored from deleted class ``python.GuestPythonRecipe`` into here + - Added optional dependencies: :mod:`~pythonforandroid.recipes.libbz2` + and :mod:`~pythonforandroid.recipes.liblzma` + .. versionchanged:: 0.6.0 Refactored into class :class:`~pythonforandroid.python.GuestPythonRecipe` @@ -58,6 +74,7 @@ class Python3Recipe(GuestPythonRecipe): # - _bz2.so # - _lzma.so opt_depends = ['libbz2', 'liblzma'] + '''The optional libraries which we would like to get our python linked''' configure_args = ( '--host={android_host}', @@ -70,14 +87,314 @@ class Python3Recipe(GuestPythonRecipe): 'ac_cv_little_endian_double=yes', '--prefix={prefix}', '--exec-prefix={exec_prefix}') + '''The configure arguments needed to build the python recipe. Those are + used in method :meth:`build_arch` (if not overwritten like python3's + recipe does). + ''' + + MIN_NDK_API = 21 + '''Sets the minimal ndk api number needed to use the recipe. + + .. warning:: This recipe can be built only against API 21+, so it means + that any class which inherits from class:`GuestPythonRecipe` will have + this limitation. + ''' + + stdlib_dir_blacklist = { + '__pycache__', + 'test', + 'tests', + 'lib2to3', + 'ensurepip', + 'idlelib', + 'tkinter', + } + '''The directories that we want to omit for our python bundle''' + + stdlib_filen_blacklist = [ + '*.py', + '*.exe', + '*.whl', + ] + '''The file extensions that we want to blacklist for our python bundle''' + + site_packages_dir_blacklist = { + '__pycache__', + 'tests' + } + '''The directories from site packages dir that we don't want to be included + in our python bundle.''' + + site_packages_filen_blacklist = [ + '*.py' + ] + '''The file extensions from site packages dir that we don't want to be + included in our python bundle.''' + + compiled_extension = '.pyc' + '''the default extension for compiled python files. + + .. note:: the default extension for compiled python files has been .pyo for + python 2.x-3.4 but as of Python 3.5, the .pyo filename extension is no + longer used and has been removed in favour of extension .pyc + ''' + + def __init__(self, *args, **kwargs): + self._ctx = None + super().__init__(*args, **kwargs) + + @property + def _libpython(self): + '''return the python's library name (with extension)''' + py_version = self.major_minor_version_string + if self.major_minor_version_string[0] == '3': + py_version += 'm' + return 'libpython{version}.so'.format(version=py_version) + + def include_root(self, arch_name): + return join(self.get_build_dir(arch_name), 'Include') + + def link_root(self, arch_name): + return join(self.get_build_dir(arch_name), 'android-build') + + def should_build(self, arch): + return not isfile(join(self.link_root(arch.arch), self._libpython)) + + def prebuild_arch(self, arch): + super().prebuild_arch(arch) + self.ctx.python_recipe = self + + def get_recipe_env(self, arch=None, with_flags_in_cc=True): + env = environ.copy() + env['HOSTARCH'] = arch.command_prefix + + env['CC'] = arch.get_clang_exe(with_target=True) + + env['PATH'] = ( + '{hostpython_dir}:{old_path}').format( + hostpython_dir=self.get_recipe( + 'host' + self.name, self.ctx).get_path_to_python(), + old_path=env['PATH']) + + env['CFLAGS'] = ' '.join( + [ + '-fPIC', + '-DANDROID', + '-D__ANDROID_API__={}'.format(self.ctx.ndk_api), + ] + ) + + env['LDFLAGS'] = env.get('LDFLAGS', '') + if sh.which('lld') is not None: + # Note: The -L. is to fix a bug in python 3.7. + # https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=234409 + env['LDFLAGS'] += ' -L. -fuse-ld=lld' + else: + warning('lld not found, linking without it. ' + 'Consider installing lld if linker errors occur.') + + return env def set_libs_flags(self, env, arch): - env = super().set_libs_flags(env, arch) + '''Takes care to properly link libraries with python depending on our + requirements and the attribute :attr:`opt_depends`. + ''' + def add_flags(include_flags, link_dirs, link_libs): + env['CPPFLAGS'] = env.get('CPPFLAGS', '') + include_flags + env['LDFLAGS'] = env.get('LDFLAGS', '') + link_dirs + env['LIBS'] = env.get('LIBS', '') + link_libs + + if 'sqlite3' in self.ctx.recipe_build_order: + info('Activating flags for sqlite3') + recipe = Recipe.get_recipe('sqlite3', self.ctx) + add_flags(' -I' + recipe.get_build_dir(arch.arch), + ' -L' + recipe.get_lib_dir(arch), ' -lsqlite3') + + if 'libffi' in self.ctx.recipe_build_order: + info('Activating flags for libffi') + recipe = Recipe.get_recipe('libffi', self.ctx) + # In order to force the correct linkage for our libffi library, we + # set the following variable to point where is our libffi.pc file, + # because the python build system uses pkg-config to configure it. + env['PKG_CONFIG_PATH'] = recipe.get_build_dir(arch.arch) + add_flags(' -I' + ' -I'.join(recipe.get_include_dirs(arch)), + ' -L' + join(recipe.get_build_dir(arch.arch), '.libs'), + ' -lffi') + if 'openssl' in self.ctx.recipe_build_order: + info('Activating flags for openssl') recipe = Recipe.get_recipe('openssl', self.ctx) self.configure_args += \ ('--with-openssl=' + recipe.get_build_dir(arch.arch),) + add_flags(recipe.include_flags(arch), + recipe.link_dirs_flags(arch), recipe.link_libs_flags()) + + for library_name in {'libbz2', 'liblzma'}: + if library_name in self.ctx.recipe_build_order: + info(f'Activating flags for {library_name}') + recipe = Recipe.get_recipe(library_name, self.ctx) + add_flags(recipe.get_library_includes(arch), + recipe.get_library_ldflags(arch), + recipe.get_library_libs_flag()) + + # python build system contains hardcoded zlib version which prevents + # the build of zlib module, here we search for android's zlib version + # and sets the right flags, so python can be build with android's zlib + info("Activating flags for android's zlib") + zlib_lib_path = join(self.ctx.ndk_platform, 'usr', 'lib') + zlib_includes = join(self.ctx.ndk_dir, 'sysroot', 'usr', 'include') + zlib_h = join(zlib_includes, 'zlib.h') + try: + with open(zlib_h) as fileh: + zlib_data = fileh.read() + except IOError: + raise BuildInterruptingException( + "Could not determine android's zlib version, no zlib.h ({}) in" + " the NDK dir includes".format(zlib_h) + ) + for line in zlib_data.split('\n'): + if line.startswith('#define ZLIB_VERSION '): + break + else: + raise BuildInterruptingException( + 'Could not parse zlib.h...so we cannot find zlib version,' + 'required by python build,' + ) + env['ZLIB_VERSION'] = line.replace('#define ZLIB_VERSION ', '') + add_flags(' -I' + zlib_includes, ' -L' + zlib_lib_path, ' -lz') + return env + def build_arch(self, arch): + if self.ctx.ndk_api < self.MIN_NDK_API: + raise BuildInterruptingException( + 'Target ndk-api is {}, but the python3 recipe supports only' + ' {}+'.format(self.ctx.ndk_api, self.MIN_NDK_API)) + + recipe_build_dir = self.get_build_dir(arch.arch) + + # Create a subdirectory to actually perform the build + build_dir = join(recipe_build_dir, 'android-build') + ensure_dir(build_dir) + + # TODO: Get these dynamically, like bpo-30386 does + sys_prefix = '/usr/local' + sys_exec_prefix = '/usr/local' + + with current_directory(build_dir): + env = self.get_recipe_env(arch) + env = self.set_libs_flags(env, arch) + + android_build = sh.Command( + join(recipe_build_dir, + 'config.guess'))().stdout.strip().decode('utf-8') + + if not exists('config.status'): + shprint( + sh.Command(join(recipe_build_dir, 'configure')), + *(' '.join(self.configure_args).format( + android_host=env['HOSTARCH'], + android_build=android_build, + prefix=sys_prefix, + exec_prefix=sys_exec_prefix)).split(' '), + _env=env) + + shprint( + sh.make, 'all', '-j', str(cpu_count()), + 'INSTSONAME={lib_name}'.format(lib_name=self._libpython), + _env=env + ) + + # TODO: Look into passing the path to pyconfig.h in a + # better way, although this is probably acceptable + sh.cp('pyconfig.h', join(recipe_build_dir, 'Include')) + + def compile_python_files(self, dir): + ''' + Compile the python files (recursively) for the python files inside + a given folder. + + .. note:: python2 compiles the files into extension .pyo, but in + python3, and as of Python 3.5, the .pyo filename extension is no + longer used...uses .pyc (https://www.python.org/dev/peps/pep-0488) + ''' + args = [self.ctx.hostpython] + args += ['-OO', '-m', 'compileall', '-b', '-f', dir] + subprocess.call(args) + + def create_python_bundle(self, dirn, arch): + """ + Create a packaged python bundle in the target directory, by + copying all the modules and standard library to the right + place. + """ + # Todo: find a better way to find the build libs folder + modules_build_dir = join( + self.get_build_dir(arch.arch), + 'android-build', + 'build', + 'lib.linux{}-{}-{}'.format( + '2' if self.version[0] == '2' else '', + arch.command_prefix.split('-')[0], + self.major_minor_version_string + )) + + # Compile to *.pyc/*.pyo the python modules + self.compile_python_files(modules_build_dir) + # Compile to *.pyc/*.pyo the standard python library + self.compile_python_files(join(self.get_build_dir(arch.arch), 'Lib')) + # Compile to *.pyc/*.pyo the other python packages (site-packages) + self.compile_python_files(self.ctx.get_python_install_dir()) + + # Bundle compiled python modules to a folder + modules_dir = join(dirn, 'modules') + c_ext = self.compiled_extension + ensure_dir(modules_dir) + module_filens = (glob.glob(join(modules_build_dir, '*.so')) + + glob.glob(join(modules_build_dir, '*' + c_ext))) + info("Copy {} files into the bundle".format(len(module_filens))) + for filen in module_filens: + info(" - copy {}".format(filen)) + copy2(filen, modules_dir) + + # zip up the standard library + stdlib_zip = join(dirn, 'stdlib.zip') + with current_directory(join(self.get_build_dir(arch.arch), 'Lib')): + stdlib_filens = list(walk_valid_filens( + '.', self.stdlib_dir_blacklist, self.stdlib_filen_blacklist)) + info("Zip {} files into the bundle".format(len(stdlib_filens))) + shprint(sh.zip, stdlib_zip, *stdlib_filens) + + # copy the site-packages into place + ensure_dir(join(dirn, 'site-packages')) + ensure_dir(self.ctx.get_python_install_dir()) + # TODO: Improve the API around walking and copying the files + with current_directory(self.ctx.get_python_install_dir()): + filens = list(walk_valid_filens( + '.', self.site_packages_dir_blacklist, + self.site_packages_filen_blacklist)) + info("Copy {} files into the site-packages".format(len(filens))) + for filen in filens: + info(" - copy {}".format(filen)) + ensure_dir(join(dirn, 'site-packages', dirname(filen))) + copy2(filen, join(dirn, 'site-packages', filen)) + + # copy the python .so files into place + python_build_dir = join(self.get_build_dir(arch.arch), + 'android-build') + python_lib_name = 'libpython' + self.major_minor_version_string + if self.major_minor_version_string[0] == '3': + python_lib_name += 'm' + shprint( + sh.cp, + join(python_build_dir, python_lib_name + '.so'), + join(self.ctx.bootstrap.dist_dir, 'libs', arch.arch) + ) + + info('Renaming .so files to reflect cross-compile') + self.reduce_object_file_names(join(dirn, 'site-packages')) + + return join(dirn, 'site-packages') + recipe = Python3Recipe() diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index ca0db9aee5..d3bc9a19d4 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -366,9 +366,6 @@ def bootstrap_name(self): @mock.patch("pythonforandroid.bootstraps.webview.open", create=True) @mock.patch("pythonforandroid.bootstraps.sdl2.open", create=True) @mock.patch("pythonforandroid.distribution.open", create=True) - @mock.patch( - "pythonforandroid.python.GuestPythonRecipe.create_python_bundle" - ) @mock.patch("pythonforandroid.bootstrap.Bootstrap.strip_libraries") @mock.patch("pythonforandroid.util.exists") @mock.patch("pythonforandroid.util.chdir") @@ -383,7 +380,6 @@ def test_run_distribute( mock_chdir, mock_ensure_dir, mock_strip_libraries, - mock_create_python_bundle, mock_open_dist_files, mock_open_sdl2_files, mock_open_webview_files, @@ -415,6 +411,7 @@ def test_run_distribute( self.ctx.hostpython = "/some/fake/hostpython3" self.ctx.python_recipe = Recipe.get_recipe("python3", self.ctx) + self.ctx.python_recipe.create_python_bundle = mock.MagicMock() self.ctx.python_modules = ["requests"] self.ctx.archs = [ArchARMv7_a(self.ctx)] @@ -457,7 +454,16 @@ def test_run_distribute( mock_chdir.assert_called() mock_listdir.assert_called() mock_strip_libraries.assert_called() - mock_create_python_bundle.assert_called() + expected__python_bundle = os.path.join( + self.ctx.dist_dir, + f"{self.ctx.bootstrap.distribution.name}__{self.TEST_ARCH}", + "_python_bundle", + "_python_bundle", + ) + self.assertIn( + mock.call(expected__python_bundle, self.ctx.archs[0]), + self.ctx.python_recipe.create_python_bundle.call_args_list, + ) @mock.patch("pythonforandroid.bootstrap.shprint") @mock.patch("pythonforandroid.bootstrap.glob.glob") From 2e16e67cde056fd350ac5f6517d80c2422bc51ae Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 30 Mar 2020 23:17:31 +0200 Subject: [PATCH 08/35] Fixes linting errors in runnable.py https://travis-ci.org/github/kivy/python-for-android/jobs/668867999 ``` runnable.py:17:1: E302 expected 2 blank lines, found 1 runnable.py:33:1: W293 blank line contains whitespace runnable.py:45:1: W293 blank line contains whitespace runnable.py:46:1: W293 blank line contains whitespace runnable.py:49:1: E303 too many blank lines (4) runnable.py:53:1: W293 blank line contains whitespace runnable.py:55:1: W293 blank line contains whitespace runnable.py:56:32: E261 at least two spaces before inline comment runnable.py:56:33: E262 inline comment should start with '# ' runnable.py:57:1: W293 blank line contains whitespace runnable.py:58:45: E231 missing whitespace after ':' runnable.py:59:1: W293 blank line contains whitespace runnable.py:61:1: W293 blank line contains whitespace runnable.py:64:1: W293 blank line contains whitespace ``` --- .../recipes/android/src/android/runnable.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/pythonforandroid/recipes/android/src/android/runnable.py b/pythonforandroid/recipes/android/src/android/runnable.py index 9ed419eeaf..74268c803f 100644 --- a/pythonforandroid/recipes/android/src/android/runnable.py +++ b/pythonforandroid/recipes/android/src/android/runnable.py @@ -1,7 +1,6 @@ ''' Runnable ======== - ''' from jnius import PythonJavaClass, java_method, autoclass @@ -14,6 +13,7 @@ # is limited, so by caching them we avoid running out. __functionstable__ = {} + class Runnable(PythonJavaClass): '''Wrapper around Java Runnable class. This class can be used to schedule a call of a Python function into the PythonActivity thread. @@ -30,7 +30,6 @@ def __call__(self, *args, **kwargs): self.args = args self.kwargs = kwargs Runnable.__runnables__.append(self) - _PythonActivity.mActivity.runOnUiThread(self) @java_method('()V') @@ -42,24 +41,18 @@ def run(self): traceback.print_exc() Runnable.__runnables__.remove(self) - - def run_on_ui_thread(f): '''Decorator to create automatically a :class:`Runnable` object with the function. The function will be delayed and call into the Activity thread. ''' - if f not in __functionstable__: - - rfunction = Runnable(f) #store the runnable function - - __functionstable__[f] = {"rfunction":rfunction} - + rfunction = Runnable(f) # store the runnable function + __functionstable__[f] = {"rfunction": rfunction} rfunction = __functionstable__[f]["rfunction"] - + def f2(*args, **kwargs): rfunction(*args, **kwargs) - + return f2 From 22b7dfee1ddc5f435f8bf016cbf83980a45b4374 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Mon, 30 Mar 2020 23:10:49 +0200 Subject: [PATCH 09/35] Minor fixes and cleanup - remove `object` inheritance - remove `__future__` imports - remove `six` checks and conditional imports - flat out a few for loops - fix `dir` is a reserved keyword - few more nitpick fixes --- pythonforandroid/archs.py | 3 +- pythonforandroid/bdistapk.py | 1 - pythonforandroid/bootstrap.py | 13 ++-- .../bootstraps/common/build/build.py | 2 - pythonforandroid/build.py | 61 ++++++++----------- pythonforandroid/distribution.py | 2 +- pythonforandroid/graph.py | 2 +- pythonforandroid/logger.py | 21 ++----- pythonforandroid/recipe.py | 31 ++++------ pythonforandroid/recipes/android/__init__.py | 1 - pythonforandroid/toolchain.py | 3 +- pythonforandroid/tools/biglink | 1 - pythonforandroid/tools/liblink | 26 +------- pythonforandroid/util.py | 6 +- tests/test_bootstrap.py | 11 ++-- 15 files changed, 58 insertions(+), 126 deletions(-) diff --git a/pythonforandroid/archs.py b/pythonforandroid/archs.py index fb991eacf0..f1c8e1121b 100644 --- a/pythonforandroid/archs.py +++ b/pythonforandroid/archs.py @@ -8,7 +8,7 @@ from pythonforandroid.util import BuildInterruptingException, build_platform -class Arch(object): +class Arch: toolchain_prefix = None '''The prefix for the toolchain dir in the NDK.''' @@ -46,7 +46,6 @@ class Arch(object): ] def __init__(self, ctx): - super().__init__() self.ctx = ctx # Allows injecting additional linker paths used by any recipe. diff --git a/pythonforandroid/bdistapk.py b/pythonforandroid/bdistapk.py index ea1b78ca2f..d22c9947a4 100644 --- a/pythonforandroid/bdistapk.py +++ b/pythonforandroid/bdistapk.py @@ -1,4 +1,3 @@ -from __future__ import print_function from setuptools import Command import sys diff --git a/pythonforandroid/bootstrap.py b/pythonforandroid/bootstrap.py index e85dc74732..75b82e555f 100755 --- a/pythonforandroid/bootstrap.py +++ b/pythonforandroid/bootstrap.py @@ -63,7 +63,7 @@ def rank_bootstrap(bootstrap): return 1 -class Bootstrap(object): +class Bootstrap: '''An Android project template, containing recipe stuff for compilation and templated fields for APK info. ''' @@ -294,15 +294,15 @@ def distribute_libs(self, arch, src_dirs, wildcard='*', dest_dir="libs"): tgt_dir = join(dest_dir, arch.arch) ensure_dir(tgt_dir) for src_dir in src_dirs: - for lib in glob.glob(join(src_dir, wildcard)): - shprint(sh.cp, '-a', lib, tgt_dir) + libs = glob.glob(join(src_dir, wildcard)) + shprint(sh.cp, '-a', *libs, tgt_dir) def distribute_javaclasses(self, javaclass_dir, dest_dir="src"): '''Copy existing javaclasses from build dir to current dist dir.''' info('Copying java files') ensure_dir(dest_dir) - for filename in glob.glob(javaclass_dir): - shprint(sh.cp, '-a', filename, dest_dir) + filenames = glob.glob(javaclass_dir) + shprint(sh.cp, '-a', *filenames, dest_dir) def distribute_aars(self, arch): '''Process existing .aar bundles and copy to current dist dir.''' @@ -335,8 +335,7 @@ def _unpack_aar(self, aar, arch): debug(" to {}".format(so_tgt_dir)) ensure_dir(so_tgt_dir) so_files = glob.glob(join(so_src_dir, '*.so')) - for f in so_files: - shprint(sh.cp, '-a', f, so_tgt_dir) + shprint(sh.cp, '-a', *so_files, so_tgt_dir) def strip_libraries(self, arch): info('Stripping libraries') diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index fea791db8d..cb859cf832 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -1,7 +1,5 @@ #!/usr/bin/env python3 -from __future__ import print_function - import json from os.path import ( dirname, join, isfile, realpath, diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index f19ddc9e96..6558e29c56 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -1,5 +1,3 @@ -from __future__ import print_function - from os.path import ( abspath, join, realpath, dirname, expanduser, exists, split, isdir @@ -79,7 +77,7 @@ def get_available_apis(sdk_dir): return apis -class Context(object): +class Context: '''A build context. If anything will be built, an instance this class will be instantiated and used to hold all the build state.''' @@ -132,34 +130,33 @@ def templates_dir(self): @property def libs_dir(self): # Was previously hardcoded as self.build_dir/libs - dir = join(self.build_dir, 'libs_collections', - self.bootstrap.distribution.name) - ensure_dir(dir) - return dir + directory = join(self.build_dir, 'libs_collections', + self.bootstrap.distribution.name) + ensure_dir(directory) + return directory @property def javaclass_dir(self): # Was previously hardcoded as self.build_dir/java - dir = join(self.build_dir, 'javaclasses', - self.bootstrap.distribution.name) - ensure_dir(dir) - return dir + directory = join(self.build_dir, 'javaclasses', + self.bootstrap.distribution.name) + ensure_dir(directory) + return directory @property def aars_dir(self): - dir = join(self.build_dir, 'aars', self.bootstrap.distribution.name) - ensure_dir(dir) - return dir + directory = join(self.build_dir, 'aars', self.bootstrap.distribution.name) + ensure_dir(directory) + return directory @property def python_installs_dir(self): - dir = join(self.build_dir, 'python-installs') - ensure_dir(dir) - return dir + directory = join(self.build_dir, 'python-installs') + ensure_dir(directory) + return directory def get_python_install_dir(self): - dir = join(self.python_installs_dir, self.bootstrap.distribution.name) - return dir + return join(self.python_installs_dir, self.bootstrap.distribution.name) def setup_dirs(self, storage_dir): '''Calculates all the storage and build dirs, and makes sure @@ -264,7 +261,7 @@ def prepare_build_environment(self, possible_dirs = glob.glob(expanduser(join( '~', '.buildozer', 'android', 'platform', 'android-sdk-*'))) possible_dirs = [d for d in possible_dirs if not - (d.endswith('.bz2') or d.endswith('.gz'))] + d.endswith(('.bz2', '.gz'))] if possible_dirs: info('Found possible SDK dirs in buildozer dir: {}'.format( ', '.join([d.split(os.sep)[-1] for d in possible_dirs]))) @@ -427,15 +424,13 @@ def prepare_build_environment(self, for executable in ("pkg-config", "autoconf", "automake", "libtoolize", "tar", "bzip2", "unzip", "make", "gcc", "g++"): if not sh.which(executable): - warning("Missing executable: {} is not installed".format( - executable)) + warning(f"Missing executable: {executable} is not installed") if not ok: raise BuildInterruptingException( 'python-for-android cannot continue due to the missing executables above') def __init__(self): - super().__init__() self.include_dirs = [] self._build_env_prepared = False @@ -605,23 +600,16 @@ def build_recipes(build_order, python_modules, ctx, project_dir, ignore_setup_py=ignore_project_setup_py ) - return - def project_has_setup_py(project_dir): - if project_dir is not None and \ - (os.path.exists(os.path.join(project_dir, - "setup.py")) or - os.path.exists(os.path.join(project_dir, - "pyproject.toml")) - ): - return True - return False + return (project_dir is not None and + (exists(join(project_dir, "setup.py")) or + exists(join(project_dir, "pyproject.toml")) + )) def run_setuppy_install(ctx, project_dir, env=None): - if env is None: - env = dict() + env = env or {} with current_directory(project_dir): info('got setup.py or similar, running project install. ' + @@ -1076,5 +1064,4 @@ def copylibs_function(soname, objs_paths, extra_link_dirs=[], env=None): '\n\t'.join(needed_libs)) print('Copying libraries') - for lib in sofiles: - shprint(sh.cp, lib, dest) + shprint(sh.cp, *sofiles, dest) diff --git a/pythonforandroid/distribution.py b/pythonforandroid/distribution.py index 379cd90852..8607766eba 100644 --- a/pythonforandroid/distribution.py +++ b/pythonforandroid/distribution.py @@ -7,7 +7,7 @@ from shutil import rmtree -class Distribution(object): +class Distribution: '''State container for information about a distribution (i.e. an Android project). diff --git a/pythonforandroid/graph.py b/pythonforandroid/graph.py index 2e98e8ccda..567c77fa3b 100644 --- a/pythonforandroid/graph.py +++ b/pythonforandroid/graph.py @@ -160,7 +160,7 @@ def obvious_conflict_checker(ctx, name_tuples, blacklist=None): current_to_be_added = list(to_be_added) to_be_added = [] for (added_tuple, adding_recipe) in current_to_be_added: - assert(type(added_tuple) == tuple) + assert type(added_tuple) == tuple if len(added_tuple) > 1: # No obvious commitment in what to add, don't check it itself # but throw it into deps for later comparing against diff --git a/pythonforandroid/logger.py b/pythonforandroid/logger.py index 193356a2a8..8f0b15ca31 100644 --- a/pythonforandroid/logger.py +++ b/pythonforandroid/logger.py @@ -7,19 +7,6 @@ from collections import defaultdict from colorama import Style as Colo_Style, Fore as Colo_Fore -# six import left for Python 2 compatibility during initial Python version check -import six - -# This codecs change fixes a bug with log output, but crashes under python3 -if not six.PY3: - import codecs - stdout = codecs.getwriter('utf8')(stdout) - stderr = codecs.getwriter('utf8')(stderr) - -if six.PY2: - unistr = unicode # noqa F821 -else: - unistr = str # monkey patch to show full output sh.ErrorReturnCode.truncate_cap = 999999 @@ -61,7 +48,7 @@ def format(self, record): error = logger.error -class colorama_shim(object): +class colorama_shim: def __init__(self, real): self._dict = defaultdict(str) @@ -114,12 +101,12 @@ def shorten_string(string, max_width): return string visible = max_width - 16 - int(log10(string_len)) # expected suffix len "...(and XXXXX more)" - if not isinstance(string, unistr): - visstring = unistr(string[:visible], errors='ignore') + if not isinstance(string, str): + visstring = str(string[:visible], errors='ignore') else: visstring = string[:visible] return u''.join((visstring, u'...(and ', - unistr(string_len - visible), u' more)')) + str(string_len - visible), u' more)')) def get_console_width(): diff --git a/pythonforandroid/recipe.py b/pythonforandroid/recipe.py index 2723cda3f1..7a429de6ca 100644 --- a/pythonforandroid/recipe.py +++ b/pythonforandroid/recipe.py @@ -1,7 +1,7 @@ from os.path import basename, dirname, exists, isdir, isfile, join, realpath, split import glob from shutil import rmtree -from six import PY2, with_metaclass +from six import with_metaclass import hashlib from re import match @@ -22,26 +22,17 @@ def import_recipe(module, filename): - if PY2: - import imp - import warnings - with warnings.catch_warnings(): - # ignores warnings raised by hierarchical module names - # (names containing dots) on Python 2 - warnings.simplefilter("ignore", RuntimeWarning) - return imp.load_source(module, filename) + # Python 3.5+ + import importlib.util + if hasattr(importlib.util, 'module_from_spec'): + spec = importlib.util.spec_from_file_location(module, filename) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod else: - # Python 3.5+ - import importlib.util - if hasattr(importlib.util, 'module_from_spec'): - spec = importlib.util.spec_from_file_location(module, filename) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - else: - # Python 3.3 and 3.4: - from importlib.machinery import SourceFileLoader - return SourceFileLoader(module, filename).load_module() + # Python 3.3 and 3.4: + from importlib.machinery import SourceFileLoader + return SourceFileLoader(module, filename).load_module() class RecipeMeta(type): diff --git a/pythonforandroid/recipes/android/__init__.py b/pythonforandroid/recipes/android/__init__.py index 7fe3e3517d..6d196fe321 100644 --- a/pythonforandroid/recipes/android/__init__.py +++ b/pythonforandroid/recipes/android/__init__.py @@ -1,4 +1,3 @@ -from __future__ import unicode_literals from pythonforandroid.recipe import CythonRecipe, IncludedFilesBehaviour from pythonforandroid.util import current_directory from pythonforandroid import logger diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index b4236d8860..592bf1cc3b 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -6,7 +6,6 @@ This module defines the entry point for command line and programmatic use. """ -from __future__ import print_function from os import environ from pythonforandroid import __version__ from pythonforandroid.pythonpackage import get_dep_names_of_package @@ -235,7 +234,7 @@ def _get_option_tuples(self, option_string): return [] -class ToolchainCL(object): +class ToolchainCL: def __init__(self): diff --git a/pythonforandroid/tools/biglink b/pythonforandroid/tools/biglink index e2652d52c9..8a8e561fba 100755 --- a/pythonforandroid/tools/biglink +++ b/pythonforandroid/tools/biglink @@ -1,6 +1,5 @@ #!/usr/bin/env python -from __future__ import print_function import os import sys import subprocess diff --git a/pythonforandroid/tools/liblink b/pythonforandroid/tools/liblink index 182eff7a6c..de837e6ca5 100755 --- a/pythonforandroid/tools/liblink +++ b/pythonforandroid/tools/liblink @@ -1,6 +1,5 @@ #!/usr/bin/env python -from __future__ import print_function import sys import subprocess from os import environ @@ -22,7 +21,7 @@ while i < len(sys.argv): i += 1 continue - if opt.startswith("-l") or opt.startswith("-L"): + if opt.startswith(("-l", "-L")): libs.append(opt) continue @@ -34,27 +33,8 @@ while i < len(sys.argv): i += 1 continue - if opt.startswith("-I") or opt.startswith('-isystem'): - continue - - if opt.startswith("-m"): - continue - - if opt.startswith("-f"): - continue - - if opt.startswith("-O"): - continue - - if opt.startswith("-g"): - continue - - if opt.startswith("-D"): - continue - - if opt.startswith("-R"): - # for -rpath, not implemented yet. - continue + if opt.startswith( + ("-I", "-isystem", "-m", "-f", "-O", "-g", "-D", "-R")): if opt.startswith("-"): print(sys.argv) diff --git a/pythonforandroid/util.py b/pythonforandroid/util.py index d4719ba160..80a607f5fe 100644 --- a/pythonforandroid/util.py +++ b/pythonforandroid/util.py @@ -6,11 +6,7 @@ from fnmatch import fnmatch from tempfile import mkdtemp -# This Python version workaround left for compatibility during initial version check -try: # Python 3 - from urllib.request import FancyURLopener -except ImportError: # Python 2 - from urllib import FancyURLopener +from urllib.request import FancyURLopener from pythonforandroid.logger import (logger, Err_Fore, error, info) diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index d3bc9a19d4..583cefb81c 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -493,12 +493,11 @@ def reset_mocks(): libs_dir = os.path.join("libs", arch.arch) # we expect two calls to glob/copy command via shprint self.assertEqual(len(mock_glob.call_args_list), 2) - self.assertEqual(len(mock_shprint.call_args_list), 2) - for i, lib in enumerate(mock_glob.return_value): - self.assertEqual( - mock_shprint.call_args_list[i], - mock.call(sh.cp, "-a", lib, libs_dir), - ) + self.assertEqual(len(mock_shprint.call_args_list), 1) + self.assertEqual( + mock_shprint.call_args_list, + [mock.call(sh.cp, "-a", *mock_glob.return_value, libs_dir)] + ) mock_build_dir.assert_called() mock_bs_dir.assert_called_once_with(libs_dir) reset_mocks() From 16155c084e106334bf95e2395d818362ed678fce Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Tue, 31 Mar 2020 18:57:25 +0200 Subject: [PATCH 10/35] Unify most of the test apps into `on device unit test app` (#2046) * :package: Refactor (move) `PythonTestMixIn` into `tests.mixin` * :package: Unify most of the test apps into one app So depending on the supplied recipes, a different test app will be ran. The supported test apps are: - kivy - flask - no-gui * :building_construction: Make test app `on_device_unit_tests` the default... for our CI providers and `rebuild_updated_recipes.py` because we recently removed the old test app that we made use of. * :pencil: Update docs * :white_check_mark: Create a `x86_64` testapp for gh-actions * :pencil: Fix typo errors and... Remove sentence regarding python2 compatibility... because python2 it's almost at the end of his life * :white_check_mark: Make a `flask` testapp... So we can get an apk via gh-actions Notes: - this way the reviewers can install the flask apk without making the build - these changes will be reverted in the next commit...since we want a kivy app as our default) * :white_check_mark: Revert "Make a `flask` testapp..." This reverts commit 0ed4d707bf1bcf760175823112faea4dd0cd28c2. * :fire: Remove `orientation` kwarg... in case that we detect that p4a will build an `service_only` app. Note: if we don't do this we wil get errors once we try to create our apk with the target distribution * :white_check_mark: Create a `x86` testapp for gh-actions and change gh-actions job title (because it looks better) * :building_construction: Rename test app Because it looks better and is more readable. * :pencil: Fix a syntactical error at docstring * :truck: Rename `setup_test_app.py` to `setup.py` Because reducing filename to `setup.py` will make our cli arguments shorter and source code cleaner * :wrench: Disable gh-actions `fail-fast` So our matrix gh-actions builds will not be cancelled if some arch fails which is very useful to fix specific arch issues. See also: #2073 * :green_heart: Add `testapps-with-numpy/%` & ... make `testapps/%` support multiple archs Notes: this completes the job started at 9ea53fcd & afd44132 --- .github/workflows/push.yml | 13 +- .travis.yml | 2 +- Makefile | 21 +- ci/rebuild_updated_recipes.py | 5 +- doc/source/testing_pull_requests.rst | 28 +- testapps/on_device_unit_tests/README.rst | 34 +- testapps/on_device_unit_tests/buildozer.spec | 6 +- testapps/on_device_unit_tests/setup.py | 92 ++++ .../test_app/app_flask.py | 138 ++++++ .../on_device_unit_tests/test_app/app_kivy.py | 163 +++++++ .../test_app/app_service.py | 30 ++ .../test_app/constants.py | 9 + .../on_device_unit_tests/test_app/main.py | 115 +++-- .../test_app/screen_keyboard.kv | 109 +++++ .../test_app/screen_orientation.kv | 74 ++++ .../test_app/screen_service.kv | 67 +++ .../test_app/screen_unittests.kv | 155 +++++++ .../test_app/static/Blanka-Regular.otf | Bin 0 -> 9664 bytes .../test_app/static}/colours.png | Bin .../test_app}/static/coloursinv.png | Bin .../test_app/static/flask.css | 133 ++++++ .../test_app/templates/base.html | 35 ++ .../test_app/templates/index.html | 97 ++++ .../test_app/templates/page2.html | 22 + .../test_app/templates/unittests.html | 20 + .../test_app/tests/mixin.py | 30 ++ .../test_app/tests/test_requirements.py | 192 +++++++- .../on_device_unit_tests/test_app/tools.py | 162 +++++++ .../on_device_unit_tests/test_app/widgets.kv | 84 ++++ .../on_device_unit_tests/test_app/widgets.py | 29 ++ testapps/setup_keyboard.py | 32 -- testapps/setup_testapp_flask.py | 37 -- testapps/setup_testapp_python3.py | 30 -- testapps/setup_testapp_python3_matplotlib.py | 30 -- testapps/setup_testapp_python3_pillow.py | 27 -- testapps/setup_testapp_python_encryption.py | 30 -- testapps/setup_testapp_service.py | 34 -- testapps/testapp/main.py | 166 ------- testapps/testapp_encryption/colours.png | Bin 191254 -> 0 bytes testapps/testapp_encryption/main.py | 360 --------------- testapps/testapp_flask/main.py | 104 ----- testapps/testapp_flask/static/colours.png | Bin 191254 -> 0 bytes testapps/testapp_flask/templates/base.html | 26 -- testapps/testapp_flask/templates/index.html | 63 --- testapps/testapp_flask/templates/page2.html | 15 - testapps/testapp_keyboard/colours.png | Bin 191254 -> 0 bytes testapps/testapp_keyboard/main.py | 163 ------- testapps/testapp_matplotlib/main.py | 75 ---- testapps/testapp_nogui/main.py | 73 --- testapps/testapp_pillow/colours.png | Bin 191254 -> 0 bytes testapps/testapp_pillow/main.py | 416 ------------------ testapps/testapp_service/main.py | 19 - testapps/testapp_service/p4atime.py | 19 - 53 files changed, 1785 insertions(+), 1799 deletions(-) create mode 100644 testapps/on_device_unit_tests/setup.py create mode 100644 testapps/on_device_unit_tests/test_app/app_flask.py create mode 100644 testapps/on_device_unit_tests/test_app/app_kivy.py create mode 100644 testapps/on_device_unit_tests/test_app/app_service.py create mode 100644 testapps/on_device_unit_tests/test_app/constants.py create mode 100644 testapps/on_device_unit_tests/test_app/screen_keyboard.kv create mode 100644 testapps/on_device_unit_tests/test_app/screen_orientation.kv create mode 100644 testapps/on_device_unit_tests/test_app/screen_service.kv create mode 100644 testapps/on_device_unit_tests/test_app/screen_unittests.kv create mode 100644 testapps/on_device_unit_tests/test_app/static/Blanka-Regular.otf rename testapps/{testapp => on_device_unit_tests/test_app/static}/colours.png (100%) rename testapps/{testapp_flask => on_device_unit_tests/test_app}/static/coloursinv.png (100%) create mode 100644 testapps/on_device_unit_tests/test_app/static/flask.css create mode 100644 testapps/on_device_unit_tests/test_app/templates/base.html create mode 100644 testapps/on_device_unit_tests/test_app/templates/index.html create mode 100644 testapps/on_device_unit_tests/test_app/templates/page2.html create mode 100644 testapps/on_device_unit_tests/test_app/templates/unittests.html create mode 100644 testapps/on_device_unit_tests/test_app/tests/mixin.py create mode 100644 testapps/on_device_unit_tests/test_app/tools.py create mode 100644 testapps/on_device_unit_tests/test_app/widgets.kv create mode 100644 testapps/on_device_unit_tests/test_app/widgets.py delete mode 100644 testapps/setup_keyboard.py delete mode 100644 testapps/setup_testapp_flask.py delete mode 100644 testapps/setup_testapp_python3.py delete mode 100644 testapps/setup_testapp_python3_matplotlib.py delete mode 100644 testapps/setup_testapp_python3_pillow.py delete mode 100644 testapps/setup_testapp_python_encryption.py delete mode 100644 testapps/setup_testapp_service.py delete mode 100644 testapps/testapp/main.py delete mode 100644 testapps/testapp_encryption/colours.png delete mode 100644 testapps/testapp_encryption/main.py delete mode 100644 testapps/testapp_flask/main.py delete mode 100644 testapps/testapp_flask/static/colours.png delete mode 100644 testapps/testapp_flask/templates/base.html delete mode 100644 testapps/testapp_flask/templates/index.html delete mode 100644 testapps/testapp_flask/templates/page2.html delete mode 100644 testapps/testapp_keyboard/colours.png delete mode 100644 testapps/testapp_keyboard/main.py delete mode 100644 testapps/testapp_matplotlib/main.py delete mode 100644 testapps/testapp_nogui/main.py delete mode 100644 testapps/testapp_pillow/colours.png delete mode 100644 testapps/testapp_pillow/main.py delete mode 100644 testapps/testapp_service/main.py delete mode 100644 testapps/testapp_service/p4atime.py diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index caafb4a073..1333844c0c 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -1,4 +1,4 @@ -name: Unit tests & Build Testapp +name: Unit tests & build apps on: ['push', 'pull_request'] @@ -42,25 +42,26 @@ jobs: make test build: - name: Build testapp + name: Unit test apk needs: [flake8] runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - build-arch: ['arm64-v8a', 'armeabi-v7a'] + build-arch: ['arm64-v8a', 'armeabi-v7a', 'x86_64', 'x86'] steps: - name: Checkout python-for-android uses: actions/checkout@v2 - name: Pull docker image run: | make docker/pull - - name: Build apk for Python 3 ${{ matrix.build-arch }} + - name: Build apk Python 3 ${{ matrix.build-arch }} run: | mkdir -p apks - make docker/run/make/with-artifact/testapps/${{ matrix.build-arch }} + make docker/run/make/with-artifact/testapps-with-numpy/${{ matrix.build-arch }} - uses: actions/upload-artifact@v1 with: - name: bdisttest_python3_sqlite_openssl_googlendk__${{ matrix.build-arch }}-debug-1.1.apk + name: bdist_test_app_unittests__${{ matrix.build-arch }}-debug-1.1.apk path: apks rebuild_updated_recipes: diff --git a/.travis.yml b/.travis.yml index 7c82accebd..69acc4f8cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ jobs: name: Python 3 arm64-v8a (with numpy) stage: build testapps before_script: make docker/pull - script: make docker/run/make/testapps/arm64-v8a + script: make docker/run/make/testapps-with-numpy/arm64-v8a - <<: *testapps name: Python 3 armeabi-v7a os: osx diff --git a/Makefile b/Makefile index 1e3566123d..e939408a63 100644 --- a/Makefile +++ b/Makefile @@ -35,16 +35,18 @@ rebuild_updated_recipes: virtualenv ANDROID_SDK_HOME=$(ANDROID_SDK_HOME) ANDROID_NDK_HOME=$(ANDROID_NDK_HOME) \ $(PYTHON) ci/rebuild_updated_recipes.py -testapps/arm64-v8a: virtualenv - . $(ACTIVATE) && cd testapps/ && \ - python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ +testapps-with-numpy/%: virtualenv + $(eval $@_APP_ARCH := $(shell basename $*)) + . $(ACTIVATE) && cd testapps/on_device_unit_tests/ && \ + python setup.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ --requirements libffi,sdl2,pyjnius,kivy,python3,openssl,requests,sqlite3,setuptools,numpy \ - --arch=arm64-v8a + --arch=$($@_APP_ARCH) -testapps/armeabi-v7a: virtualenv - . $(ACTIVATE) && cd testapps/ && \ - python setup_testapp_python3_sqlite_openssl.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ - --arch=armeabi-v7a +testapps/%: virtualenv + $(eval $@_APP_ARCH := $(shell basename $*)) + . $(ACTIVATE) && cd testapps/on_device_unit_tests/ && \ + python setup.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ + --arch=$($@_APP_ARCH) clean: find . -type d -name "__pycache__" -exec rm -r {} + @@ -72,10 +74,9 @@ docker/run/make/%: docker/build docker run --rm --env-file=.env $(DOCKER_IMAGE) make $* docker/run/make/with-artifact/%: docker/build - $(eval $@_APP_NAME := bdisttest_python3_sqlite_openssl_googlendk) $(eval $@_APP_ARCH := $(shell basename $*)) docker run --name p4a-latest --env-file=.env $(DOCKER_IMAGE) make $* - docker cp p4a-latest:/home/user/app/testapps/$($@_APP_NAME)__$($@_APP_ARCH)-debug-1.1-.apk ./apks + docker cp p4a-latest:/home/user/app/testapps/on_device_unit_tests/bdist_unit_tests_app__$($@_APP_ARCH)-debug-1.1-.apk ./apks docker rm -fv p4a-latest docker/run/shell: docker/build diff --git a/ci/rebuild_updated_recipes.py b/ci/rebuild_updated_recipes.py index d5ecc30cd7..cacc328776 100755 --- a/ci/rebuild_updated_recipes.py +++ b/ci/rebuild_updated_recipes.py @@ -52,16 +52,15 @@ def build(target_python, requirements): """ if not requirements: return - testapp = 'setup_testapp_python3_sqlite_openssl.py' android_sdk_home = os.environ['ANDROID_SDK_HOME'] android_ndk_home = os.environ['ANDROID_NDK_HOME'] requirements.add(target_python.name) requirements = ','.join(requirements) logger.info('requirements: {}'.format(requirements)) - with current_directory('testapps/'): + with current_directory('testapps/on_device_unit_tests/'): # iterates to stream the output for line in sh.python( - testapp, 'apk', '--sdk-dir', android_sdk_home, + 'setup.py', 'apk', '--sdk-dir', android_sdk_home, '--ndk-dir', android_ndk_home, '--requirements', requirements, _err_to_out=True, _iter=True): print(line) diff --git a/doc/source/testing_pull_requests.rst b/doc/source/testing_pull_requests.rst index 603828db77..a133cb15be 100644 --- a/doc/source/testing_pull_requests.rst +++ b/doc/source/testing_pull_requests.rst @@ -103,30 +103,31 @@ Using python-for-android commands directly from the pull request files ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Enter inside the directory of the cloned repository in the above - step and run p4a command with proper args, eg:: + step and run p4a command with proper args, eg (to test an modified + `pycryptodome` recipe):: .. codeblock:: bash cd p4a-feature-fix-numpy PYTHONPATH=. python3 -m pythonforandroid.toolchain apk \ - --private=testapps/testapp_sqlite_openssl \ - --dist-name=dist_test_app_python3_libs \ + --private=testapps/on_device_unit_tests/test_app \ + --dist-name=dist_unit_tests_app_pycryptodome \ --package=org.kivy \ - --name=test_app_python3_sqlite_openssl \ + --name=unit_tests_app_pycryptodome \ --version=0.1 \ - --requirements=requests,peewee,sdl2,pyjnius,kivy,python3 \ + --requirements=sdl2,pyjnius,kivy,python3,pycryptodome \ --ndk-dir=/media/DEVEL/Android/android-ndk-r20 \ --sdk-dir=/media/DEVEL/Android/android-sdk-linux \ --android-api=27 \ --arch=arm64-v8a \ - --permission=INTERNET \ + --permission=VIBRATE \ --debug Things that you should know: - - The example above will build an testapp we will make use of the files of - the testapp named `testapp_sqlite_openssl.py` but we don't use the setup + - The example above will build an test app we will make use of the files of + the `on device unit tests` test app but we don't use the setup file to build it so we must tell python-for-android what we want via arguments - be sure to at least edit the following arguments when running the above @@ -159,19 +160,19 @@ Installing python-for-android using the github's branch of the pull request cd p4a-feature-fix-numpy pip3 install . --upgrade --user -- Now, go inside the `testapps` directory (we assume that you still are inside - the cloned repository):: +- Now, go inside the `testapps/on_device_unit_tests` directory (we assume that + you still are inside the cloned repository):: .. codeblock:: bash - cd testapps + cd testapps/on_device_unit_tests - Run the build of the apk via the freshly installed copy of python-for-android by running a similar command than below:: .. code-block:: bash - python3 setup_testapp_python3_sqlite_openssl.py apk \ + python3 setup.py apk \ --ndk-dir=/media/DEVEL/Android/android-ndk-r20 \ --sdk-dir=/media/DEVEL/Android/android-sdk-linux \ --android-api=27 \ @@ -182,8 +183,7 @@ Installing python-for-android using the github's branch of the pull request Things that you should know: - In the example above, we override some variables that are set in - `setup_testapp_python3_sqlite_openssl.py`, you could also override them - by editing this file + `setup.py`, you could also override them by editing this file - be sure to at least edit the following arguments when running the above command, since the default set in there it's unlikely that match your installation: diff --git a/testapps/on_device_unit_tests/README.rst b/testapps/on_device_unit_tests/README.rst index 1415fbb6a4..6c0eb9626e 100644 --- a/testapps/on_device_unit_tests/README.rst +++ b/testapps/on_device_unit_tests/README.rst @@ -4,18 +4,38 @@ On device unit tests This test app runs a set of unit tests, to help confirm that the python-for-android build is actually working properly. +Also it's dynamic, because it will run one app or another depending on the +supplied recipes at build time. + +It currently supports three app `modes`: + - `kivy app` (with sdl2 bootstrap): if kivy in recipes + - `flask app` (with webview bootstrap): if flask in recipes + - `no gui`: if neither of above cases is taken + The main tests are for the recipes built in the apk. Each module (or other tool) is at least imported and subject to some basic check. -This app is experimental, it doesn't yet support things like testing -only the requirements you ask for (so if you build with requirements -other than those specified, the tests may fail). It also has no gui -yet, the results must be checked via logcat. +This test app can be build via `setup.py` or via buildozer. In both +cases it will build a basic kivy app with a set of tests defined via the +`requirements` keyword (specified at build time). + +In case that you build the `test app with no-gui`, the unittests results must +be checked via command `adb logcat` or some logging apk (you may need root +permissions in your device to use such app). + +Building the app with python-for-android +======================================== + +You can use the provided file `setup.py`. Check our `Makefile +`__ to guess +how to build the test app, or also you can look at `testing pull requests documentation +`__, +which describes some of the methods that you can use to build the test app. -Building the app -================ +Building the app with buildozer +=============================== -This app should be built using buildozer, which it also serves as a +This app can be built using buildozer, which it also serves as a test for:: $ buildozer android debug diff --git a/testapps/on_device_unit_tests/buildozer.spec b/testapps/on_device_unit_tests/buildozer.spec index a2b55302c8..b372d5faa5 100644 --- a/testapps/on_device_unit_tests/buildozer.spec +++ b/testapps/on_device_unit_tests/buildozer.spec @@ -13,7 +13,7 @@ package.domain = org.kivy source.dir = test_app # (list) Source files to include (let empty to include all the files) -source.include_exts = py,png,jpg,kv,atlas +source.include_exts = py,png,jpg,kv,atlas,html,css,otf,txt # (list) List of inclusions using pattern matching #source.include_patterns = assets/*,images/*.png @@ -36,7 +36,7 @@ version = 0.1 # (list) Application requirements # comma separated e.g. requirements = sqlite3,kivy -requirements = python3,kivy,openssl,numpy,sqlite3 +requirements = python3,kivy,libffi,openssl,numpy,sqlite3 # (str) Custom source folders for requirements # Sets custom source for any requirements with recipes @@ -52,7 +52,7 @@ requirements = python3,kivy,openssl,numpy,sqlite3 #icon.filename = %(source.dir)s/data/icon.png # (str) Supported orientation (one of landscape, sensorLandscape, portrait or all) -orientation = portrait +orientation = all # (list) List of service to declare #services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY diff --git a/testapps/on_device_unit_tests/setup.py b/testapps/on_device_unit_tests/setup.py new file mode 100644 index 0000000000..0df67e3f94 --- /dev/null +++ b/testapps/on_device_unit_tests/setup.py @@ -0,0 +1,92 @@ +""" +This is the `setup.py` file for the `on device unit test app`. + +In this module we can control how will be built our test app. Depending on +our requirements we can build an kivy, flask or a non-gui app. We default to an +kivy app, since the python-for-android project its a sister project of kivy. + +The parameter `requirements` is crucial to determine the unit tests we will +perform with our app, so we must explicitly name the recipe we want to test +and, of course, we should have the proper test for the given recipe at +`tests.test_requirements.py` or nothing will be tested. We control our default +app requirements via the dictionary `options`. Here you have some examples +to build the supported app modes:: + + - kivy *basic*: `sqlite3,libffi,openssl,pyjnius,kivy,python3,requests` + - kivy *images/graphs*: `kivy,python3,numpy,matplotlib,Pillow` + - kivy *encryption*: `kivy,python3,cryptography,pycryptodome,scrypt, + m2crypto,pysha3` + - flask (with webview bootstrap): `sqlite3,libffi,openssl,pyjnius,flask, + python3,genericndkbuild` + + +.. note:: just noting that, for the `kivy basic` app, we add the requirements: + `sqlite3,libffi,openssl` so this way we will trigger the unit tests + that we have for such recipes. + +.. tip:: to force `python-for-android` generate an `flask` app without using + the kwarg `bootstrap`, we add the recipe `genericndkbuild`, which will + trigger the `webview bootstrap` at build time. +""" + +import os +import sys +from distutils.core import setup +from setuptools import find_packages + +# define a basic test app, which can be override passing the proper args to cli +options = { + 'apk': + { + 'requirements': + 'sqlite3,libffi,openssl,pyjnius,kivy,python3,requests', + 'android-api': 27, + 'ndk-api': 21, + 'dist-name': 'bdist_unit_tests_app', + 'arch': 'armeabi-v7a', + 'permissions': ['INTERNET', 'VIBRATE'], + 'orientation': 'sensor', + 'service': 'P4a_test_service:app_service.py', + } +} + +# check if we overwrote the default test_app requirements via `cli` +requirements = options['apk']['requirements'].rsplit(',') +for n, arg in enumerate(sys.argv): + if arg == '--requirements': + print('found requirements') + requirements = sys.argv[n + 1].rsplit(',') + break + +# remove `orientation` in case that we don't detect a kivy or flask app, +# since the `service_only` bootstrap does not support such argument +if not ({'kivy', 'flask'} & set(requirements)): + options['apk'].pop('orientation') + +# write a file to let the test_app know which requirements we want to test +# Note: later, when running the app, we will guess if we have the right test. +app_requirements_txt = os.path.join( + os.path.split(__file__)[0], + 'test_app', + 'app_requirements.txt', +) +with open(app_requirements_txt, 'w') as requirements_file: + for req in requirements: + requirements_file.write(f'{req.split("==")[0]}\n') + +# run the install +setup( + name='unit_tests_app', + version='1.1', + description='p4a on device unit test app', + author='Alexander Taylor, Pol Canelles', + author_email='alexanderjohntaylor@gmail.com, canellestudi@gmail.com', + packages=find_packages(), + options=options, + package_data={ + 'test_app': ['*.py', '*.kv', '*.txt'], + 'test_app/static': ['*.png', '*.css', '*.otf'], + 'test_app/templates': ['*.html'], + 'test_app/tests': ['*.py'], + } +) diff --git a/testapps/on_device_unit_tests/test_app/app_flask.py b/testapps/on_device_unit_tests/test_app/app_flask.py new file mode 100644 index 0000000000..ee23532035 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/app_flask.py @@ -0,0 +1,138 @@ +print('main.py was successfully called') +print('this is the new main.py') + +import sys +print('python version is: ' + sys.version) +print('python path is', sys.path) + +import os +print('imported os') +print('contents of this dir', os.listdir('./')) + +from flask import ( + Flask, + render_template, + request, + Markup +) + +print('imported flask etc') + +from constants import RUNNING_ON_ANDROID +from tools import ( + run_test_suites_into_buffer, + get_failed_unittests_from, + vibrate_with_pyjnius, + get_android_python_activity, + set_device_orientation, +) + + +app = Flask(__name__) +TESTS_TO_PERFORM = dict() +NON_ANDROID_DEVICE_MSG = 'Not running from Android device' + + +def get_html_for_tested_modules(tested_modules, failed_tests): + modules_text = '' + for n, module in enumerate(sorted(tested_modules)): + print(module) + base_text = '' + if TESTS_TO_PERFORM[module] in failed_tests: + color = 'text-red' + else: + color = 'text-green' + if n != len(tested_modules) - 1: + base_text += ', ' + + modules_text += base_text.format(color=color, module=module) + + return Markup(modules_text) + + +@app.route('/') +def index(): + return render_template( + 'index.html', + platform='Android' if RUNNING_ON_ANDROID else 'Desktop', + ) + + +@app.route('/unittests') +def unittests(): + import unittest + print('Imported unittest') + + print("loading tests...") + suites = unittest.TestLoader().loadTestsFromNames( + list(TESTS_TO_PERFORM.values()), + ) + + print("running unittest...") + terminal_output = run_test_suites_into_buffer(suites) + + print("unittest result is:") + unittest_error_text = terminal_output.split('\n') + print(terminal_output) + + # get a nice colored `html` output for our tested recipes + failed_tests = get_failed_unittests_from( + terminal_output, TESTS_TO_PERFORM.values(), + ) + colored_tested_recipes = get_html_for_tested_modules( + TESTS_TO_PERFORM.keys(), failed_tests, + ) + + return render_template( + 'unittests.html', + tested_recipes=colored_tested_recipes, + unittests_output=unittest_error_text, + platform='Android' if RUNNING_ON_ANDROID else 'Desktop', + ) + + +@app.route('/page2') +def page2(): + return render_template( + 'page2.html', + platform='Android' if RUNNING_ON_ANDROID else 'Desktop', + ) + + +@app.route('/loadUrl') +def loadUrl(): + if not RUNNING_ON_ANDROID: + print(NON_ANDROID_DEVICE_MSG, '...cancelled loadUrl.') + return NON_ANDROID_DEVICE_MSG + args = request.args + if 'url' not in args: + print('ERROR: asked to open an url but without url argument') + print('asked to open url', args['url']) + activity = get_android_python_activity() + activity.loadUrl(args['url']) + + +@app.route('/vibrate') +def vibrate(): + if not RUNNING_ON_ANDROID: + print(NON_ANDROID_DEVICE_MSG, '...cancelled vibrate.') + return NON_ANDROID_DEVICE_MSG + + args = request.args + if 'time' not in args: + print('ERROR: asked to vibrate but without time argument') + print('asked to vibrate', args['time']) + return vibrate_with_pyjnius(int(float(args['time']) * 1000)) + + +@app.route('/orientation') +def orientation(): + if not RUNNING_ON_ANDROID: + print(NON_ANDROID_DEVICE_MSG, '...cancelled orientation.') + return NON_ANDROID_DEVICE_MSG + args = request.args + if 'dir' not in args: + print('ERROR: asked to orient but no dir specified') + return 'No direction specified ' + direction = args['dir'] + return set_device_orientation(direction) diff --git a/testapps/on_device_unit_tests/test_app/app_kivy.py b/testapps/on_device_unit_tests/test_app/app_kivy.py new file mode 100644 index 0000000000..8095998819 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/app_kivy.py @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- + +import subprocess + +from os.path import split + +from kivy.app import App +from kivy.clock import Clock +from kivy.properties import ( + BooleanProperty, + DictProperty, + ListProperty, + StringProperty, +) +from kivy.lang import Builder + +from constants import RUNNING_ON_ANDROID +from tools import ( + get_android_python_activity, + get_failed_unittests_from, + get_images_with_extension, + load_kv_from, + raise_error, + run_test_suites_into_buffer, + vibrate_with_pyjnius, +) +from widgets import TestImage + +# define our app's screen manager and load the screen templates +screen_manager_app = ''' +ScreenManager: + ScreenUnittests: + ScreenKeyboard: + ScreenOrientation: + ScreenService: +''' +load_kv_from('screen_unittests.kv') +load_kv_from('screen_keyboard.kv') +load_kv_from('screen_orientation.kv') +load_kv_from('screen_service.kv') + + +class TestKivyApp(App): + + tests_to_perform = DictProperty() + unittest_error_text = StringProperty('Running unittests...') + test_packages = StringProperty('Unittest recipes:') + generated_images = ListProperty() + service_running = BooleanProperty(False) + + def build(self): + self.reset_unittests_results() + self.sm = Builder.load_string(screen_manager_app) + return self.sm + + def reset_unittests_results(self, refresh_ui=False): + for img in get_images_with_extension(): + subprocess.call(["rm", "-r", img]) + print('removed image: ', img) + if refresh_ui: + self.set_color_for_tested_modules(restart=True) + self.unittest_error_text = '' + screen_unittests = self.sm.get_screen('unittests') + images_box = screen_unittests.ids.test_images_box + images_box.clear_widgets() + self.generated_images = [] + + def on_tests_to_perform(self, *args): + """ + Check `test_to_perform` so we can build some special tests in our ui. + Also will schedule the run of our tests. + """ + print('on_tests_to_perform: ', self.tests_to_perform.keys()) + self.set_color_for_tested_modules(restart=True) + Clock.schedule_once(self.run_unittests, 3) + + def run_unittests(self, *args): + import unittest + print('Imported unittest') + + print("loading tests...") + suites = unittest.TestLoader().loadTestsFromNames( + list(self.tests_to_perform.values()), + ) + self.test_packages = ', '.join(self.tests_to_perform.keys()) + + print("running unittest...") + self.unittest_error_text = run_test_suites_into_buffer(suites) + + print("unittest result is:") + print(self.unittest_error_text) + print('Ran tests') + + self.set_color_for_tested_modules() + + # check generated images by unittests + self.generated_images = get_images_with_extension() + + def set_color_for_tested_modules(self, restart=False): + tests_made = sorted(list(self.tests_to_perform.keys())) + failed_tests = get_failed_unittests_from( + self.unittest_error_text, + self.tests_to_perform.values(), + ) + + modules_text = 'Unittest recipes: ' + for n, module in enumerate(tests_made): + base_text = '[color={color}]{module}[/color]' + if restart: + color = '#838383' # grey + elif self.tests_to_perform[module] in failed_tests: + color = '#ff0000' # red + else: + color = '#5d8000' # green + if n != len(tests_made) - 1: + base_text += ', ' + + modules_text += base_text.format(color=color, module=module) + + self.test_packages = modules_text + + def on_generated_images(self, *args): + screen_unittests = self.sm.get_screen('unittests') + images_box = screen_unittests.ids.test_images_box + for i in self.generated_images: + img = TestImage( + text='Generated image by unittests: {}'.format(split(i)[1]), + source=i, + ) + images_box.add_widget(img) + + def test_vibration_with_pyjnius(self, *args): + vibrate_with_pyjnius() + + @property + def service_time(self): + from jnius import autoclass + + return autoclass('org.test.unit_tests_app.ServiceP4a_test_service') + + def on_service_running(self, *args): + if RUNNING_ON_ANDROID: + if self.service_running: + print('Starting service') + self.start_service() + else: + print('Stopping service') + self.stop_service() + else: + raise_error('Service test not supported on desktop') + + def start_service(self): + activity = get_android_python_activity() + service = self.service_time + try: + service.start(activity, 'Some argument') + except Exception as err: + raise_error(str(err)) + + def stop_service(self): + service = self.service_time + activity = get_android_python_activity() + service.stop(activity) diff --git a/testapps/on_device_unit_tests/test_app/app_service.py b/testapps/on_device_unit_tests/test_app/app_service.py new file mode 100644 index 0000000000..953d865632 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/app_service.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import datetime +import threading +import time + +from os import environ + +argument = environ.get('PYTHON_SERVICE_ARGUMENT', '') +print( + 'app_service.py was successfully called with argument: "{}"'.format( + argument, + ), +) + +next_call = time.time() +next_call_in = 5 # seconds + + +def service_timer(): + global next_call + print('P4a test service: {}'.format(datetime.datetime.now())) + + next_call += next_call_in + threading.Timer(next_call - time.time(), service_timer).start() + + +print('Starting the test service timer...') +service_timer() diff --git a/testapps/on_device_unit_tests/test_app/constants.py b/testapps/on_device_unit_tests/test_app/constants.py new file mode 100644 index 0000000000..55b61d48b5 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/constants.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +from os import environ + +RUNNING_ON_ANDROID = "ANDROID_APP_PATH" in environ + +FONT_SIZE_TITLE = 32 if RUNNING_ON_ANDROID else 60 +FONT_SIZE_SUBTITLE = 16 if RUNNING_ON_ANDROID else 32 +FONT_SIZE_TEXT = 8 if RUNNING_ON_ANDROID else 16 diff --git a/testapps/on_device_unit_tests/test_app/main.py b/testapps/on_device_unit_tests/test_app/main.py index e0cd9c527d..349890d4ce 100644 --- a/testapps/on_device_unit_tests/test_app/main.py +++ b/testapps/on_device_unit_tests/test_app/main.py @@ -1,45 +1,96 @@ -import sys -if sys.version_info.major < 3: - print(('Running under Python {} but these tests ' - 'require Python 3+').format(sys.version_info.major)) - -import unittest -import importlib +#!/usr/bin/env python +# -*- coding: utf-8 -*- -print('Imported unittest') +""" +On device unit test app +======================= +This is a dynamic test app, which means that depending on the requirements +supplied at build time, will perform some tests or others. Also, this app will +have an ui, or not, depending on requirements as well. -class PythonTestMixIn(object): +For now, we contemplate three possibilities: + - A kivy unittest app (sdl2 bootstrap) + - A unittest app (webview bootstrap) + - A non-gui unittests app - module_import = None +If you install/build this app via the `setup.py` file, a file named +`app_requirements.txt` will be generated which will contain the requirements +that we passed to the `setup.py` via arguments, which will determine +the unittests that this app will run. - def test_import_module(self): - """Test importing the specified Python module name. This import test - is common to all Python modules, it does not test any further - functionality. - """ - self.assertIsNotNone( - self.module_import, - 'module_import is not set (was default None)') +.. note:: This app is made to be working on desktop and on an android device. + Be aware that some of the functionality of this app will only work on + an android device. - importlib.import_module(self.module_import) +.. tip:: you can write more unit tests at `tests/test_requirements.py` and test + these on desktop just by editing the file `app_requirements.txt`, + which should be located at the same location than this file. This + `app_requirements.txt` file, it's autogenerated when the + `setup.py` is ran, so in certain circumstances, you may need + to create it. Also be aware that each `python-for-android` recipe + that you want to test should be in a new line, taking into account the + case of the recipe. - def test_run_module(self): - """Import the specified module and do something with it as a minimal - check that it actually works. +.. warning:: If you use buildozer you only will get the basic `kivy unittest + app`, with a basic set of tests: sqlite3, libffi, openssl and + pyjnius. +""" - This test fails by default, it must be overridden by every - child test class. - """ +import sys +import unittest - self.fail('This test must be overridden by {}'.format(self)) +from os import curdir +from os.path import isfile, realpath -print('Defined test case') +print('Imported unittest') -import sys sys.path.append('./') -from tests import test_requirements -suite = unittest.TestLoader().loadTestsFromModule(test_requirements) -unittest.TextTestRunner().run(suite) -print('Ran tests') +# read `app_requirements.txt` and find out which tests to perform +tests_to_perform = {} +requirements = None +if isfile('app_requirements.txt'): + with open('app_requirements.txt', 'r') as requirements_file: + requirements = set(requirements_file.read().splitlines()) +if not requirements: + # we will test a basic set of recipes + requirements = {'sqlite3', 'libffi', 'openssl', 'pyjnius'} +print('App requirements are: ', requirements) + +for recipe in requirements: + test_name = 'tests.test_requirements.{recipe}TestCase'.format( + recipe=recipe.capitalize() + ) + try: + exist_test = unittest.TestLoader().loadTestsFromName(test_name) + except AttributeError: + # python2 case + pass + else: + if '_exception' not in exist_test._tests[0].__dict__: + print('Adding Testcase: ', test_name) + tests_to_perform[recipe] = test_name +print('Tests to perform are: ', tests_to_perform) + +# Find out which app we want to run +if 'kivy' in requirements: + from app_kivy import TestKivyApp + + test_app = TestKivyApp() + test_app.tests_to_perform = tests_to_perform + test_app.run() +elif 'flask' in requirements: + import app_flask + app_flask.TESTS_TO_PERFORM = tests_to_perform + + print('Current directory is ', realpath(curdir)) + if realpath(curdir).startswith('/data'): + app_flask.app.run(debug=False) + else: + app_flask.app.run(debug=True) +else: + # we don't have kivy or flask in our + # requirements, so we run unittests in terminal + suite = unittest.TestLoader().loadTestsFromNames(list(tests_to_perform)) + unittest.TextTestRunner().run(suite) diff --git a/testapps/on_device_unit_tests/test_app/screen_keyboard.kv b/testapps/on_device_unit_tests/test_app/screen_keyboard.kv new file mode 100644 index 0000000000..d0b08bbd67 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/screen_keyboard.kv @@ -0,0 +1,109 @@ +#:import Window kivy.core.window.Window + +#:import FONT_SIZE_SUBTITLE constants.FONT_SIZE_SUBTITLE +#:import FONT_SIZE_TEXT constants.FONT_SIZE_TEXT +#:import FONT_SIZE_TITLE constants.FONT_SIZE_TITLE +#:import Spacer20 widgets.Spacer20 + +: + name: 'keyboard' + BoxLayout: + orientation: 'vertical' + Button: + text: 'Back to unittests' + font_size: sp(FONT_SIZE_SUBTITLE) + size_hint_y: None + height: dp(60) + on_press: root.parent.current = 'unittests' + Image: + keep_ratio: False + allow_stretch: True + source: 'static/coloursinv.png' + size_hint_y: None + height: dp(100) + Label: + text: + '[color=#999999]Test[/color] kivy ' \ + '[color=#999999]keyboard[/color] modes' + height: self.texture_size[1] + size_hint_y: None + padding: 0, 20 + font_size: sp(FONT_SIZE_TITLE) + font_name: 'static/Blanka-Regular.otf' + text_size: root.width, None + markup: True + halign: 'center' + Label: + text: + 'Specifies the behavior of window contents on display ' \ + 'of the soft keyboard on Android.\n\n\n\n' \ + '[color=#ff5900]WARNING:[/color] ' \ + 'these tests only works on an Android device' + markup: True + padding: 0, 20 + size_hint_y: None + text_size: root.width, None + font_size: sp(FONT_SIZE_TEXT) + height: self.texture_size[1] + halign: 'center' + Spacer20: + Spacer20: + RelativeLayout: + size_hint_y: None + height: dp(50) + BoxLayout: + size_hint_x: None + width: min(dp(500), root.width) + orientation: 'horizontal' + pos_hint: {'center_x': .5} + ToggleButton: + text: 'None' + group: 'keyboard_modes' + state: 'down' + on_press: Window.softinput_mode = '' + ToggleButton: + text: 'pan' + group: 'keyboard_modes' + on_press: Window.softinput_mode = 'pan' + ToggleButton: + text: 'below_target' + group: 'keyboard_modes' + on_press: Window.softinput_mode = 'below_target' + ToggleButton: + text: 'resize' + group: 'keyboard_modes' + on_press: Window.softinput_mode = 'resize' + Widget: + Scatter: + id: scatter + size_hint: None, None + size: dp(300), dp(80) + on_parent: self.pos = (300, 100) + BoxLayout: + size: scatter.size + orientation: 'horizontal' + canvas: + Color: + rgba: 1, 0, 1, .25 + Rectangle: + pos: 0, 0 + size: self.size + Label: + size_hint_x: None + width: dp(30) + text: 'drag me' + canvas.before: + Color: + rgb: 1, 1, 1 + PushMatrix + Translate: + xy: self.center_x, self.center_y + Rotate: + angle: 90 + axis: 0, 0, 1 + Translate: + xy: -self.center_x, -self.center_y + canvas.after: + PopMatrix + TextInput: + text: 'type in me' diff --git a/testapps/on_device_unit_tests/test_app/screen_orientation.kv b/testapps/on_device_unit_tests/test_app/screen_orientation.kv new file mode 100644 index 0000000000..aa0bdfb56e --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/screen_orientation.kv @@ -0,0 +1,74 @@ +#:import FONT_SIZE_SUBTITLE constants.FONT_SIZE_SUBTITLE +#:import FONT_SIZE_TEXT constants.FONT_SIZE_TEXT +#:import FONT_SIZE_TITLE constants.FONT_SIZE_TITLE + +#:import set_device_orientation tools.set_device_orientation +#:import Spacer20 widgets.Spacer20 + +: + name: 'orientation' + ScrollView: + BoxLayout: + orientation: 'vertical' + size_hint_y: None + height: self.minimum_height + Button: + text: 'Back to unittests' + font_size: sp(FONT_SIZE_SUBTITLE) + size_hint_y: None + height: dp(60) + on_press: root.parent.current = 'unittests' + Image: + keep_ratio: False + allow_stretch: True + source: 'static/coloursinv.png' + size_hint_y: None + height: dp(100) + Label: + text: + '[color=#999999]Test[/color] device ' \ + '[color=#999999]orientation[/color]' + height: self.texture_size[1] + size_hint_y: None + padding: 0, 20 + font_size: sp(FONT_SIZE_TITLE) + font_name: 'static/Blanka-Regular.otf' + text_size: root.width, None + markup: True + halign: 'center' + Spacer20: + Spacer20: + RelativeLayout: + size_hint_y: None + height: dp(50) + BoxLayout: + size_hint_x: None + width: min(dp(500), root.width) + pos_hint: {'center_x': .5} + orientation: 'horizontal' + ToggleButton: + text: 'Sensor' + group: 'device_orientations' + state: 'down' + on_press: set_device_orientation('sensor') + ToggleButton: + text: 'Horizontal' + group: 'device_orientations' + on_press: set_device_orientation('horizontal') + ToggleButton: + text: 'Vertical' + group: 'device_orientations' + on_press: set_device_orientation('vertical') + Spacer20: + Spacer20: + Label: + text: + '[color=#ff5900]WARNING:[/color] ' \ + 'these tests only works on an Android device' + markup: True + padding: 20, 20 + size_hint_y: None + text_size: root.width, None + font_size: sp(FONT_SIZE_TEXT) + height: self.texture_size[1] + halign: 'center' diff --git a/testapps/on_device_unit_tests/test_app/screen_service.kv b/testapps/on_device_unit_tests/test_app/screen_service.kv new file mode 100644 index 0000000000..8e5398f13e --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/screen_service.kv @@ -0,0 +1,67 @@ +#:import FONT_SIZE_SUBTITLE constants.FONT_SIZE_SUBTITLE +#:import FONT_SIZE_TEXT constants.FONT_SIZE_TEXT +#:import FONT_SIZE_TITLE constants.FONT_SIZE_TITLE + +#:import set_device_orientation tools.set_device_orientation +#:import Spacer20 widgets.Spacer20 +#:import CircularButton widgets.CircularButton + +#:set green_color (0.3, 0.5, 0, 1) +#:set red_color (1.0, 0, 0, 1) + +: + name: 'service' + ScrollView: + BoxLayout: + orientation: 'vertical' + size_hint_y: None + height: self.minimum_height + Button: + text: 'Back to unittests' + font_size: sp(FONT_SIZE_SUBTITLE) + size_hint_y: None + height: dp(60) + on_press: root.parent.current = 'unittests' + Image: + keep_ratio: False + allow_stretch: True + source: 'static/coloursinv.png' + size_hint_y: None + height: dp(100) + Label: + text: + '[color=#999999]Test[/color] P4A ' \ + '[color=#999999]service[/color]' + size_hint_y: None + padding: 0, 20 + height: self.texture_size[1] + halign: 'center' + font_size: sp(FONT_SIZE_TITLE) + font_name: 'static/Blanka-Regular.otf' + text_size: root.width, None + markup: True + Spacer20: + Spacer20: + RelativeLayout: + size_hint_y: None + height: dp(100) + CircularButton: + text: 'Start service' if not app.service_running else 'Stop Service' + pos_hint: {'center_x': .5} + background_color: red_color + on_press: + app.service_running = not app.service_running; + self.background_color = green_color \ + if app.service_running else red_color + Spacer20: + Spacer20: + Label: + text: + '[color=#ff5900]WARNING:[/color] ' \ + 'this test only works on an Android device' + markup: True + size_hint_y: None + height: self.texture_size[1] + halign: 'center' + text_size: root.width, None + font_size: sp(FONT_SIZE_TEXT) diff --git a/testapps/on_device_unit_tests/test_app/screen_unittests.kv b/testapps/on_device_unit_tests/test_app/screen_unittests.kv new file mode 100644 index 0000000000..b04d98fd41 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/screen_unittests.kv @@ -0,0 +1,155 @@ +#:import sys sys + +#:import Clock kivy.clock.Clock +#:import Metrics kivy.metrics.Metrics + +#:import FONT_SIZE_SUBTITLE constants.FONT_SIZE_SUBTITLE +#:import FONT_SIZE_TEXT constants.FONT_SIZE_TEXT +#:import FONT_SIZE_TITLE constants.FONT_SIZE_TITLE +#:import Spacer20 widgets.Spacer20 + +: + name: 'unittests' + ScrollView: + id: scroll_view + GridLayout: + id: grid + cols: 1 + size_hint_y: None + height: self.minimum_height + BoxLayout: + id: header_box + orientation: 'vertical' + size_hint_y: None + height: self.minimum_height + GridLayout: + rows: 1 if root.width > root.height else 2 + size_hint_y: None + height: dp(60) * self.rows + Button: + text: 'Test vibration' + font_size: sp(FONT_SIZE_SUBTITLE) + on_press: app.test_vibration_with_pyjnius() + Button: + text: 'Test Keyboard' + font_size: sp(FONT_SIZE_SUBTITLE) + on_press: root.parent.current = 'keyboard' + Button: + text: 'Test Orientation' + font_size: sp(FONT_SIZE_SUBTITLE) + on_press: root.parent.current = 'orientation' + Button: + text: 'Test Service' + font_size: sp(FONT_SIZE_SUBTITLE) + on_press: root.parent.current = 'service' + Image: + keep_ratio: False + allow_stretch: True + source: 'static/colours.png' + size_hint_y: None + height: dp(100) + Label: + height: self.texture_size[1] + size_hint_y: None + padding: 0, 20 + font_name: 'static/Blanka-Regular.otf' + font_size: sp(FONT_SIZE_TITLE) + text_size: self.size[0], None + markup: True + text: + '[color=#999999]Kivy[/color] on ' \ + '[color=#999999]SDL2[/color] on ' \ + '[color=#999999]Android[/color] !' + halign: 'center' + Label: + height: self.texture_size[1] + size_hint_y: None + text_size: self.size[0], None + font_size: sp(FONT_SIZE_TEXT) + markup: True + text: sys.version + halign: 'center' + padding_y: dp(10) + Spacer20: + Label: + height: self.texture_size[1] + size_hint_y: None + font_size: sp(FONT_SIZE_SUBTITLE) + text_size: self.size[0], None + markup: True + text: + 'Dpi: {}\nDensity: {}\nFontscale: {}'.format( + Metrics.dpi, Metrics.density, Metrics.fontscale) + halign: 'center' + Spacer20: + BoxLayout: + id: output_box + orientation: 'vertical' + size_hint_y: None + height: self.minimum_height + canvas.before: + Color: + rgba: 1, 0, 1, .25 + Rectangle: + pos: self.pos + size: self.size + Spacer20: + Label: + id: test_packages_text + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + font_size: sp(FONT_SIZE_SUBTITLE) + padding: 40, 20 + markup: True + text: app.test_packages + canvas.before: + Color: + rgba: 0, 0, 0, .65 + Rectangle: + pos: self.x + 20, self.y + size: self.width - 40, self.height + Label: + id: output_text + height: self.texture_size[1] + size_hint: None, None + pos_hint: {'center_x': .5 } + width: output_box.width - 40 + padding: 20, 20 + font_size: sp(FONT_SIZE_TEXT) + text_size: self.size[0], None + markup: True + text: app.unittest_error_text + halign: 'justify' + canvas.before: + Color: + rgba: 0, 0, 0, .35 + Rectangle: + pos: self.pos + size: self.size + Widget: + id: fill_space + size_hint_y: None + height: + max(20, root.height - header_box.height - output_box.height + 20) + canvas.before: + Color: + rgba: 1, 0, 1, .25 + Rectangle: + pos: self.pos + size: self.size + BoxLayout: + id: test_images_box + orientation: 'vertical' + size_hint_y: None + height: self.minimum_height if self.children else 0 + padding: 0, 20 + Button: + size_hint_y: None + height: dp(60) + text: 'Restart unittests' + font_size: sp(FONT_SIZE_SUBTITLE) + on_press: + app.reset_unittests_results(refresh_ui=True); + root.ids.scroll_view.scroll_y = 1; + Clock.schedule_once(app.run_unittests, 2) diff --git a/testapps/on_device_unit_tests/test_app/static/Blanka-Regular.otf b/testapps/on_device_unit_tests/test_app/static/Blanka-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..60b18d7816c9ea5635f8c276851970e575b5f953 GIT binary patch literal 9664 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 literal 0 HcmV?d00001 diff --git a/testapps/testapp/colours.png b/testapps/on_device_unit_tests/test_app/static/colours.png similarity index 100% rename from testapps/testapp/colours.png rename to testapps/on_device_unit_tests/test_app/static/colours.png diff --git a/testapps/testapp_flask/static/coloursinv.png b/testapps/on_device_unit_tests/test_app/static/coloursinv.png similarity index 100% rename from testapps/testapp_flask/static/coloursinv.png rename to testapps/on_device_unit_tests/test_app/static/coloursinv.png diff --git a/testapps/on_device_unit_tests/test_app/static/flask.css b/testapps/on_device_unit_tests/test_app/static/flask.css new file mode 100644 index 0000000000..80a9e88807 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/static/flask.css @@ -0,0 +1,133 @@ + +@font-face{ + font-family: Blanka; + src: url('Blanka-Regular.otf'); + font-weight: normal; +} + +body { + margin: 0; + padding: 0; + font-family: "Roboto Slab", Roboto, sans-serif; + color: #444; +} + +/* + * Formatting the header area + */ +header { + background-color: #6600b8; + height: 90px; + width: 100%; + opacity: .9; + margin-bottom: 10px; +} +header h1.logo { + margin-top: 4px; + font-size: 1.4em; + font-family: Blanka, sans-serif; + color: #fff; + text-transform: uppercase; + float: left; + text-align: center; + width: 100%; +} +header h1.logo:hover { + color: #000000; + text-decoration: none; +} + +/* + * Navbar + */ +.menu { + float: right; + margin-top: 0px; + width: 100%; + text-align: center; + font-family: Blanka, sans-serif; +} +.menu li { + display: inline-block; +} +.menu li + li { + margin-left: 35px; +} +.menu li a { + color: #999999; + text-decoration: none; + text-transform: uppercase; +} + +/* + * Centering the body content + */ +.container { + width: auto; + margin: 0 8px; + text-align: center; +} + +h2.page-title { + text-align: center; + text-transform: uppercase; + font-family: Blanka, sans-serif; +} + +.text-underline { + border-bottom: 0px solid #333; + font-family: Blanka, sans-serif; + width: 100%; + display: block; +} + +.center { + margin: auto; + width: 50%; +} + +/* + * Unittests page + */ +.text-green { + color: #5d8000; +} + +.text-red { + color: #ff0000; +} + +.terminal-box { + background-color: #333; +} + +.terminal-content { + color: #fff; + margin: 8px; + padding-top: 8px; +} + +/* + * Adapt header to bigger screens + */ +@media only screen and (min-width: 530px) { + header { + height: 45px; + } + + header h1.logo { + width: auto; + text-align: left; + } + + .menu { + width: auto; + margin-top: 12px; + } + .container { + text-align: left; + } + .text-underline { + border-bottom: 1px solid #333; + } +} \ No newline at end of file diff --git a/testapps/on_device_unit_tests/test_app/templates/base.html b/testapps/on_device_unit_tests/test_app/templates/base.html new file mode 100644 index 0000000000..50d3383e56 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/templates/base.html @@ -0,0 +1,35 @@ + + + + + + + + {% block title %} + Flask on {{ platform }} + {% endblock %} + + + + +
+
+

Flask on {{ platform }}!

+ + + +
+
+ +
+ {% block body %} + {% endblock %} +
+ + + diff --git a/testapps/on_device_unit_tests/test_app/templates/index.html b/testapps/on_device_unit_tests/test_app/templates/index.html new file mode 100644 index 0000000000..797724e541 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/templates/index.html @@ -0,0 +1,97 @@ +{% extends "base.html" %} + + +{% block body %} + +

Main Page

+ + + +
+

Perform unittests

+
+ + +
+
+ +
+

Test navigation

+
+ +
+
+ +
+

Android tests

+ +
+ + + +
+ +
+ + + + +
+ +
+ + + + + + + +
+
+
+
+ +{% endblock %} diff --git a/testapps/on_device_unit_tests/test_app/templates/page2.html b/testapps/on_device_unit_tests/test_app/templates/page2.html new file mode 100644 index 0000000000..f2fd122b78 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/templates/page2.html @@ -0,0 +1,22 @@ + +{% extends "base.html" %} + + +{% block body %} + +

Page two

+ + + +
+
+ Yeah, it seems to work, I would suggest to go to: +
+
+ +
+
+ ...far more interesting ;) +
+ +{% endblock %} diff --git a/testapps/on_device_unit_tests/test_app/templates/unittests.html b/testapps/on_device_unit_tests/test_app/templates/unittests.html new file mode 100644 index 0000000000..95b23995e8 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/templates/unittests.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + + +{% block body %} + +

Unittests Page

+ +
+Unittest recipes: {{ tested_recipes }} +
+ +
+
+ {% for line in unittests_output %} + {{ line }}
+ {% endfor %} +
+
+ +{% endblock %} \ No newline at end of file diff --git a/testapps/on_device_unit_tests/test_app/tests/mixin.py b/testapps/on_device_unit_tests/test_app/tests/mixin.py new file mode 100644 index 0000000000..af10dae693 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/tests/mixin.py @@ -0,0 +1,30 @@ +import importlib + + +class PythonTestMixIn(object): + + module_import = None + + def test_import_module(self): + """Test importing the specified Python module name. This import test + is common to all Python modules, it does not test any further + functionality. + """ + self.assertIsNotNone( + self.module_import, + 'module_import is not set (was default None)') + + importlib.import_module(self.module_import) + + def test_run_module(self): + """Import the specified module and do something with it as a minimal + check that it actually works. + + This test fails by default, it must be overridden by every + child test class. + """ + + self.fail('This test must be overridden by {}'.format(self)) + + +print('Defined test case') diff --git a/testapps/on_device_unit_tests/test_app/tests/test_requirements.py b/testapps/on_device_unit_tests/test_app/tests/test_requirements.py index 625a99e5db..cffb404409 100644 --- a/testapps/on_device_unit_tests/test_app/tests/test_requirements.py +++ b/testapps/on_device_unit_tests/test_app/tests/test_requirements.py @@ -1,6 +1,6 @@ -from main import PythonTestMixIn from unittest import TestCase +from .mixin import PythonTestMixIn class NumpyTestCase(PythonTestMixIn, TestCase): @@ -21,9 +21,9 @@ def test_run_module(self): ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ctx.options &= ~ssl.OP_NO_SSLv3 - -class SqliteTestCase(PythonTestMixIn, TestCase): + +class Sqlite3TestCase(PythonTestMixIn, TestCase): module_import = 'sqlite3' def test_run_module(self): @@ -31,7 +31,7 @@ def test_run_module(self): conn = sqlite3.connect('example.db') conn.cursor() - + class KivyTestCase(PythonTestMixIn, TestCase): module_import = 'kivy' @@ -47,4 +47,188 @@ class PyjniusTestCase(PythonTestMixIn, TestCase): def test_run_module(self): from jnius import autoclass + autoclass('org.kivy.android.PythonActivity') + + +class LibffiTestCase(PythonTestMixIn, TestCase): + module_import = 'ctypes' + + def test_run_module(self): + from os import environ + from ctypes import cdll + + if "ANDROID_APP_PATH" in environ: + libc = cdll.LoadLibrary("libc.so") + else: + from ctypes.util import find_library + path_libc = find_library("c") + libc = cdll.LoadLibrary(path_libc) + libc.printf(b"%s\n", b"Using the C printf function from Python ... ") + + +class RequestsTestCase(PythonTestMixIn, TestCase): + module_import = 'requests' + + def test_run_module(self): + import requests + + requests.get('https://kivy.org/') + + +class PillowTestCase(PythonTestMixIn, TestCase): + module_import = 'PIL' + + def test_run_module(self): + import os + from PIL import ( + Image as PilImage, + ImageOps, + ImageFont, + ImageDraw, + ImageFilter, + ImageChops, + ) + + text_to_draw = "Kivy" + img_target = "pillow_text_draw.png" + image_width = 200 + image_height = 100 + + img = PilImage.open("static/colours.png") + img = img.resize((image_width, image_height), PilImage.ANTIALIAS) + font = ImageFont.truetype("static/Blanka-Regular.otf", 55) + + draw = ImageDraw.Draw(img) + for n in range(2, image_width, 2): + draw.rectangle( + (n, n, image_width - n, image_height - n), outline="black" + ) + img.filter(ImageFilter.GaussianBlur(radius=1.5)) + + text_pos = (image_width / 2.0 - 55, 5) + halo = PilImage.new("RGBA", img.size, (0, 0, 0, 0)) + ImageDraw.Draw(halo).text( + text_pos, text_to_draw, font=font, fill="black" + ) + blurred_halo = halo.filter(ImageFilter.BLUR) + ImageDraw.Draw(blurred_halo).text( + text_pos, text_to_draw, font=font, fill="white" + ) + img = PilImage.composite( + img, blurred_halo, ImageChops.invert(blurred_halo) + ) + + img.save(img_target, "PNG") + self.assertTrue(os.path.isfile(img_target)) + + +class MatplotlibTestCase(PythonTestMixIn, TestCase): + module_import = 'matplotlib' + + def test_run_module(self): + import os + import numpy as np + from matplotlib import pyplot as plt + + fig, ax = plt.subplots() + ax.set_xlabel('test xlabel') + ax.set_ylabel('test ylabel') + ax.plot(np.random.random(50)) + ax.plot(np.sin(np.linspace(0, 3 * np.pi, 30))) + + ax.legend(['random numbers', 'sin']) + + fig.set_size_inches((5, 4)) + fig.tight_layout() + + fig.savefig('matplotlib_test.png', dpi=150) + self.assertTrue(os.path.isfile("matplotlib_test.png")) + + +class CryptographyTestCase(PythonTestMixIn, TestCase): + module_import = 'cryptography' + + def test_run_module(self): + from cryptography.fernet import Fernet + + key = Fernet.generate_key() + f = Fernet(key) + cryptography_encrypted = f.encrypt( + b'A really secret message. Not for prying eyes.') + cryptography_decrypted = f.decrypt(cryptography_encrypted) + + +class PycryptoTestCase(PythonTestMixIn, TestCase): + module_import = 'Crypto' + + def test_run_module(self): + from Crypto.Hash import SHA256 + + crypto_hash_message = 'A secret message' + hash = SHA256.new() + hash.update(crypto_hash_message) + crypto_hash_hexdigest = hash.hexdigest() + + +class PycryptodomeTestCase(PythonTestMixIn, TestCase): + module_import = 'Crypto' + + def test_run_module(self): + import os + from Crypto.PublicKey import RSA + + print('Ok imported pycryptodome, testing some basic operations...') + secret_code = "Unguessable" + key = RSA.generate(2048) + encrypted_key = key.export_key(passphrase=secret_code, pkcs=8, + protection="scryptAndAES128-CBC") + print('\t -> Testing key for secret code "Unguessable": {}'.format( + encrypted_key)) + + file_out = open("rsa_key.bin", "wb") + file_out.write(encrypted_key) + print('\t -> Testing key write: {}'.format( + 'ok' if os.path.exists("rsa_key.bin") else 'fail')) + self.assertTrue(os.path.exists("rsa_key.bin")) + + print('\t -> Testing Public key:'.format(key.publickey().export_key())) + + +class ScryptTestCase(PythonTestMixIn, TestCase): + module_import = 'scrypt' + + def test_run_module(self): + import scrypt + h1 = scrypt.hash('password', 'random salt') + # The hash should be 64 bytes (default value) + self.assertEqual(64, len(h1)) + + +class M2CryptoTestCase(PythonTestMixIn, TestCase): + module_import = 'M2Crypto' + + def test_run_module(self): + from M2Crypto import SSL + ctx = SSL.Context('sslv23') + + +class Pysha3TestCase(PythonTestMixIn, TestCase): + module_import = 'sha3' + + def test_run_module(self): + import sha3 + + print('Ok imported pysha3, testing some basic operations...') + k = sha3.keccak_512() + k.update(b"data") + print('Test pysha3 operation (keccak_512): {}'.format(k.hexdigest())) + + +class LibtorrentTestCase(PythonTestMixIn, TestCase): + module_import = 'libtorrent' + + def test_run_module(self): + import libtorrent as lt + + print('Imported libtorrent version {}'.format(lt.version)) diff --git a/testapps/on_device_unit_tests/test_app/tools.py b/testapps/on_device_unit_tests/test_app/tools.py new file mode 100644 index 0000000000..16dac01022 --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/tools.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- + +import glob +import unittest + +try: + # python2 case + from StringIO import StringIO +except ImportError: + # python3 case + from io import StringIO +from os.path import abspath, split, join + +from constants import RUNNING_ON_ANDROID + +APP_PATH = split(abspath(__file__))[0] + + +def run_test_suites_into_buffer(suites): + """Run a suite of unittests but into a buffer so we can read the result.""" + terminal_output = StringIO() + unittest.TextTestRunner(stream=terminal_output).run(suites) + return terminal_output.getvalue() + + +def get_images_with_extension(path=APP_PATH, extension='*.png'): + """ + Return a list of image files given a path and an file extension. + + .. note:: those image files are supposed to be created by our unittests + inside the app's root folder. + """ + return glob.glob(join(path, extension)) + + +def load_kv_from(kv_name): + """ + Load a kivy's kv file givel a kv filename. + + .. note:: requires `.kv` extension. + """ + from kivy.lang import Builder + + kv_file = join(APP_PATH, kv_name) + return Builder.load_file(kv_file) + + +def raise_error(error): + """ + A function to notify an error without raising an exception. + + .. warning:: we will try to notify via an kivy's Popup, but if kivy is not + installed, it will only print an error message. + """ + try: + from widgets import ErrorPopup + except ImportError: + print('raise_error:', error) + return + ErrorPopup(error_text=error).open() + + +def get_failed_unittests_from(unittests_output, set_of_tests): + """Parse unittests output trying to find the failed tests""" + failed_tests = set() + for test in set_of_tests: + if test in unittests_output: + failed_tests.add(test) + return failed_tests + + +def skip_if_not_running_from_android_device(func): + """ + Skip run of the function in case that we are running the app form android. + + .. note:: this is useful for some kind of tests that are supposed to be run + from an android device and relies on `pyjnius`. + """ + + def wrapper(*arg, **kwarg): + if RUNNING_ON_ANDROID: + return func(*arg, **kwarg) + raise_error( + 'Function `{func_name}` only available for android devices'.format( + func_name=func.__name__, + ), + ) + return None + + return wrapper + + +@skip_if_not_running_from_android_device +def get_android_python_activity(): + """ + Return the `PythonActivity.mActivity` using `pyjnius`. + + .. warning:: This function will only be ran if executed from android""" + from jnius import autoclass + + PythonActivity = autoclass('org.kivy.android.PythonActivity') + return PythonActivity.mActivity + + +@skip_if_not_running_from_android_device +def vibrate_with_pyjnius(time=1000): + """ + Vibrate an android device using `pyjnius`. + + .. warning:: This function will only be ran if executed from android.""" + from jnius import autoclass, cast + + print('Attempting to vibrate with pyjnius') + ANDROID_VERSION = autoclass('android.os.Build$VERSION') + SDK_INT = ANDROID_VERSION.SDK_INT + + Context = autoclass("android.content.Context") + activity = get_android_python_activity() + + vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) + vibrator = cast("android.os.Vibrator", vibrator_service) + + if vibrator and SDK_INT >= 26: + print("Using android's `VibrationEffect` (SDK >= 26)") + VibrationEffect = autoclass("android.os.VibrationEffect") + vibrator.vibrate( + VibrationEffect.createOneShot( + time, VibrationEffect.DEFAULT_AMPLITUDE, + ), + ) + elif vibrator: + print("Using deprecated android's vibrate (SDK < 26)") + vibrator.vibrate(time) + else: + print('Something happened...vibrator service disabled?') + + +@skip_if_not_running_from_android_device +def set_device_orientation(direction): + """ + Modifies the app orientation for an android device. + + .. warning:: This function will only be ran if executed from android.""" + if direction not in ('sensor', 'horizontal', 'vertical'): + print( + 'ERROR: asked to orient to `{direction}`, but we only support: ' + 'sensor, horizontal or vertical'.format(direction=direction) + ) + from jnius import autoclass + + activity = get_android_python_activity() + ActivityInfo = autoclass('android.content.pm.ActivityInfo') + + if direction == 'sensor': + activity.setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + elif direction == 'horizontal': + activity.setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) + else: + activity.setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) diff --git a/testapps/on_device_unit_tests/test_app/widgets.kv b/testapps/on_device_unit_tests/test_app/widgets.kv new file mode 100644 index 0000000000..997e81000e --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/widgets.kv @@ -0,0 +1,84 @@ +#:import get_color_from_hex kivy.utils.get_color_from_hex +#:import FONT_SIZE_SUBTITLE constants.FONT_SIZE_SUBTITLE + +: + size_hint_y: None + height: dp(20) + + +: + text: '' + source: '' + size_hint_y: None + height: self.minimum_height + orientation: 'vertical' + canvas.before: + Color: + rgba: 1, 0, 1, .25 + Rectangle: + pos: self.pos + size: self.size + Spacer20: + Label: + text: root.text + size_hint_y: None + height: dp(60) + font_size: sp(FONT_SIZE_SUBTITLE) + canvas.before: + Color: + rgba: 0, 0, 0, .65 + Rectangle: + pos: self.x + 20, self.y + size: self.width - 40, self.height + BoxLayout: + size_hint_y: None + height: self.minimum_height + orientation: 'vertical' + canvas.before: + Color: + rgba: 0, 0, 0, .35 + Rectangle: + pos: self.x + 20, self.y + size: self.width - 40, self.height + Spacer20: + Image: + source: root.source + allow_stretch: True + size_hint_y: None + height: dp(120) + Spacer20: + Spacer20: + + +: + size_hint: None, None + size: dp(120), dp(120) + text: '' + background_color: None + canvas.before: + Color: + rgba: .34, .34, .34, 1 + Ellipse: + pos: self.pos + size: self.size + canvas: + Color: + rgba: + root.background_color \ + if root.background_color \ + else (1., 0., 1., .65) # purple + Ellipse: + pos: self.x + dp(2), self.y + dp(2) + size: self.width - dp(4), self.height - dp(4) + Label: + text: root.text + pos: root.pos + size_hint: None, None + size: root.size + + +: + title: 'Error' + size_hint: 0.75, 0.75 + Label: + text: root.error_text \ No newline at end of file diff --git a/testapps/on_device_unit_tests/test_app/widgets.py b/testapps/on_device_unit_tests/test_app/widgets.py new file mode 100644 index 0000000000..eab93405ae --- /dev/null +++ b/testapps/on_device_unit_tests/test_app/widgets.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- + +from kivy.properties import StringProperty +from kivy.uix.boxlayout import BoxLayout +from kivy.uix.popup import Popup +from kivy.uix.behaviors.button import ButtonBehavior +from kivy.uix.widget import Widget +from kivy.vector import Vector +from tools import load_kv_from + +load_kv_from('widgets.kv') + + +class Spacer20(Widget): + pass + + +class TestImage(BoxLayout): + text = StringProperty() + source = StringProperty() + + +class CircularButton(ButtonBehavior, Widget): + def collide_point(self, x, y): + return Vector(x, y).distance(self.center) <= self.width / 2 + + +class ErrorPopup(Popup): + error_text = StringProperty('') diff --git a/testapps/setup_keyboard.py b/testapps/setup_keyboard.py deleted file mode 100644 index 26499a639a..0000000000 --- a/testapps/setup_keyboard.py +++ /dev/null @@ -1,32 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'debug': None, - 'requirements': 'sdl2,pyjnius,kivy,python3', - 'blacklist-requirements': 'openssl,sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/android-ndk-r17c', - 'dist-name': 'bdisttest', - 'ndk-version': '10.3.2', - 'permission': 'VIBRATE', - }} - -package_data = {'': ['*.py', - '*.png'] - } - -packages = find_packages() -print('packages are', packages) - -setup( - name='testapp_keyboard', - version='1.1', - description='p4a setup.py test', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'setup_keyboard': ['*.py', '*.png']} -) diff --git a/testapps/setup_testapp_flask.py b/testapps/setup_testapp_flask.py deleted file mode 100644 index 3b2536e579..0000000000 --- a/testapps/setup_testapp_flask.py +++ /dev/null @@ -1,37 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'debug': None, - 'requirements': 'python3,flask,pyjnius', - 'blacklist-requirements': 'openssl,sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'ndk-dir': '/home/asandy/android/android-ndk-r17c', - 'dist-name': 'testapp_flask', - 'ndk-version': '10.3.2', - 'bootstrap': 'webview', - 'permissions': ['INTERNET', 'VIBRATE'], - 'arch': 'armeabi-v7a', - 'window': None, - }} - -package_data = {'': ['*.py', - '*.png'] - } - -packages = find_packages() -print('packages are', packages) - -setup( - name='testapp_flask', - version='1.0', - description='p4a flask testapp', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp_flask': ['*.py', '*.png'], - 'testapp_flask/static': ['*.png', '*.css'], - 'testapp_flask/templates': ['*.html']} -) diff --git a/testapps/setup_testapp_python3.py b/testapps/setup_testapp_python3.py deleted file mode 100644 index 57065941cf..0000000000 --- a/testapps/setup_testapp_python3.py +++ /dev/null @@ -1,30 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'sdl2,numpy,pyjnius,kivy,python3', - 'blacklist-requirements': 'openssl,sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'dist-name': 'bdisttest_python3_googlendk', - 'ndk-version': '10.3.2', - 'permission': 'VIBRATE', - }} - -package_data = {'': ['*.py', - '*.png'] - } - -packages = find_packages() -print('packages are', packages) - -setup( - name='python3_googlendk', - version='1.1', - description='p4a setup.py test', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp': ['*.py', '*.png']} -) diff --git a/testapps/setup_testapp_python3_matplotlib.py b/testapps/setup_testapp_python3_matplotlib.py deleted file mode 100644 index 014f4492b2..0000000000 --- a/testapps/setup_testapp_python3_matplotlib.py +++ /dev/null @@ -1,30 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'sdl2,python3,matplotlib,pyparsing,cycler,python-dateutil,numpy,kiwisolver,kivy', - 'blacklist-requirements': 'openssl,sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'dist-name': 'matplotlib_testapp', - 'ndk-version': '10.3.2', - 'permission': 'VIBRATE', - }} - -package_data = {'': ['*.py', - '*.png'] - } - -packages = find_packages() -print('packages are', packages) - -setup( - name='matplotlib_testapp', - version='0.1', - description='p4a setup.py test', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp_matplotlib': ['*.py', '*.png']} -) diff --git a/testapps/setup_testapp_python3_pillow.py b/testapps/setup_testapp_python3_pillow.py deleted file mode 100644 index a13c6af7e8..0000000000 --- a/testapps/setup_testapp_python3_pillow.py +++ /dev/null @@ -1,27 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'harfbuzz,sdl2,pillow,kivy,python3', - 'blacklist-requirements': 'sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'dist-name': 'pillow_testapp', - 'arch': 'armeabi-v7a', - 'permissions': ['VIBRATE'], - }} - -package_data = {'': ['*.py', - '*.png'] - } - -setup( - name='testapp_pillow', - version='1.0', - description='p4a setup.py test', - author='Pol Canelles', - author_email='canellestudi@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp_pillow': ['*.py', '*.png', '*.ttf']} -) diff --git a/testapps/setup_testapp_python_encryption.py b/testapps/setup_testapp_python_encryption.py deleted file mode 100644 index 2a468ade86..0000000000 --- a/testapps/setup_testapp_python_encryption.py +++ /dev/null @@ -1,30 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'requirements': 'sdl2,pyjnius,kivy,python3,cryptography,' - 'pycrypto,scrypt,m2crypto,pysha3,' - 'pycryptodome,libtorrent', - 'blacklist-requirements': 'sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'dist-name': 'bdisttest_encryption', - 'ndk-version': '10.3.2', - 'arch': 'armeabi-v7a', - 'permissions': ['INTERNET', 'VIBRATE'], - }} - -package_data = {'': ['*.py', - '*.png'] - } - -setup( - name='testapp_encryption', - version='1.0', - description='p4a setup.py test', - author='Pol Canelles', - author_email='canellestudi@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp_encryption': ['*.py', '*.png']} -) diff --git a/testapps/setup_testapp_service.py b/testapps/setup_testapp_service.py deleted file mode 100644 index a3342d43a6..0000000000 --- a/testapps/setup_testapp_service.py +++ /dev/null @@ -1,34 +0,0 @@ - -from distutils.core import setup -from setuptools import find_packages - -options = {'apk': {'debug': None, - 'requirements': 'python3,genericndkbuild,pyjnius', - 'blacklist-requirements': 'openssl,sqlite3', - 'android-api': 27, - 'ndk-api': 21, - 'sdk-dir':'/opt/android/android-sdk/', - 'ndk-dir':'/opt/android/android-ndk-r17c/', - 'dist-name': 'testapp_service', - 'ndk-version': '10.3.2', - 'bootstrap': 'service_only', - 'permissions': ['INTERNET', 'VIBRATE'], - 'arch': 'armeabi-v7a', - 'service': 'time:p4atime.py', - }} - -package_data = {'': ['*.py']} - -packages = find_packages() -print('packages are', packages) - -setup( - name='testapp_service', - version='1.1', - description='p4a service testapp', - author='Alexander Taylor', - author_email='alexanderjohntaylor@gmail.com', - packages=find_packages(), - options=options, - package_data={'testapp_service': ['*.py']} -) diff --git a/testapps/testapp/main.py b/testapps/testapp/main.py deleted file mode 100644 index 2148e7c68a..0000000000 --- a/testapps/testapp/main.py +++ /dev/null @@ -1,166 +0,0 @@ -print('main.py was successfully called') - -import os -print('imported os') - - -print('this dir is', os.path.abspath(os.curdir)) - -print('contents of this dir', os.listdir('./')) - -import sys -print('pythonpath is', sys.path) - -import kivy -print('imported kivy') -print('file is', kivy.__file__) - -from kivy.app import App - -from kivy.lang import Builder -from kivy.properties import StringProperty - -from kivy.uix.popup import Popup -from kivy.clock import Clock - -print('Imported kivy') -from kivy.utils import platform -print('platform is', platform) - -kv = ''' -#:import Metrics kivy.metrics.Metrics -#:import sys sys - -: - size_hint_y: None - height: dp(60) - - -ScrollView: - GridLayout: - cols: 1 - size_hint_y: None - height: self.minimum_height - FixedSizeButton: - text: 'test pyjnius' - on_press: app.test_pyjnius() - Image: - keep_ratio: False - allow_stretch: True - source: 'colours.png' - size_hint_y: None - height: dp(100) - Label: - height: self.texture_size[1] - size_hint_y: None - font_size: 100 - text_size: self.size[0], None - markup: True - text: '[b]Kivy[/b] on [b]SDL2[/b] on [b]Android[/b]!' - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: sys.version - halign: 'center' - padding_y: dp(10) - Widget: - size_hint_y: None - height: 20 - Label: - height: self.texture_size[1] - size_hint_y: None - font_size: 50 - text_size: self.size[0], None - markup: True - text: 'dpi: {}\\ndensity: {}\\nfontscale: {}'.format(Metrics.dpi, Metrics.density, Metrics.fontscale) - halign: 'center' - FixedSizeButton: - text: 'test ctypes' - on_press: app.test_ctypes() - FixedSizeButton: - text: 'test numpy' - on_press: app.test_numpy() - Widget: - size_hint_y: None - height: 1000 - on_touch_down: print('touched at', args[-1].pos) - -: - title: 'Error' - size_hint: 0.75, 0.75 - Label: - text: root.error_text -''' - - -class ErrorPopup(Popup): - error_text = StringProperty('') - -def raise_error(error): - print('ERROR:', error) - ErrorPopup(error_text=error).open() - -class TestApp(App): - def build(self): - root = Builder.load_string(kv) - Clock.schedule_interval(self.print_something, 2) - # Clock.schedule_interval(self.test_pyjnius, 5) - print('testing metrics') - from kivy.metrics import Metrics - print('dpi is', Metrics.dpi) - print('density is', Metrics.density) - print('fontscale is', Metrics.fontscale) - return root - - def print_something(self, *args): - print('App print tick', Clock.get_boottime()) - - def on_pause(self): - return True - - def test_pyjnius(self, *args): - try: - from jnius import autoclass, cast - except ImportError: - raise_error('Could not import pyjnius') - return - print('Attempting to vibrate with pyjnius') - ANDROID_VERSION = autoclass('android.os.Build$VERSION') - SDK_INT = ANDROID_VERSION.SDK_INT - - Context = autoclass("android.content.Context") - PythonActivity = autoclass('org.kivy.android.PythonActivity') - activity = PythonActivity.mActivity - - vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator = cast("android.os.Vibrator", vibrator_service) - - if vibrator and SDK_INT >= 26: - print("Using android's `VibrationEffect` (SDK >= 26)") - VibrationEffect = autoclass("android.os.VibrationEffect") - vibrator.vibrate( - VibrationEffect.createOneShot( - 1000, VibrationEffect.DEFAULT_AMPLITUDE, - ), - ) - elif vibrator: - print("Using deprecated android's vibrate (SDK < 26)") - vibrator.vibrate(1000) - else: - print('Something happened...vibrator service disabled?') - - def test_ctypes(self, *args): - import ctypes - - def test_numpy(self, *args): - import numpy - - print(numpy.zeros(5)) - print(numpy.arange(5)) - print(numpy.random.random((3, 3))) - - -TestApp().run() diff --git a/testapps/testapp_encryption/colours.png b/testapps/testapp_encryption/colours.png deleted file mode 100644 index 30b685e32bf52c6e97726095fc8337775554c8a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191254 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

gVODxKx#t(>zBw}Jtvq)$2@kX(fId)-; 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

  • d>?L-Gt38?I=(%p9~CH%?GjHJIafGZ zGWGGz;bBu&PxrfE9V0%Wr!%9fz$8^rl+nbAS+r> zB2_%CB#^ChPxi84FHc(p2W7Y)+Fq@VcjGdT7e8h!Ly@-g)ybXYx0(U8B&%N&lX@XV z&3eiSiPOrE;XgCv*|+?mQmQeDG!UiRyV^ad((3HuYmbaA3V`Aj01kS-aBBWwgFoz!j(jQI+@1>1l9>h)ZhVA0k*h{Tp z)~A{MbVGH_gvnJQ6R`+^{B}p>9xsGd&fVMhGeTwOmL`v~X=Q5}Y(uFJk6W_&`dS(w zF%t_vq-kTl81i;T9K3bChTnm+1t1AUkrMM@GG3L#xi;o#~D8bMbbkzo}PjM{I&+_NX%t0sf!b6E)y%|D(Af7X# zkeYiPPR`^(w|8&s@@^XQe5=!7ZBSVs53V*jcPR`l85deW%>|HXshzPT*N zwyc$fFEHfWg%FmXOJfstw(WpzrBzl=%75TN(3Fu;nvtc;L=U*`PgpDt|BO-w*`HYxzp6hp(~LqU-zT z$8!u&2h2M#qtFwXcDVg#%d!X;+Dd(N4D2?#<(}!d`!lDN5##UX24_;g6#os*wB)feTa=`?O5-^fHf4RLenk94>IkFGWh!!&qcnwzu@3sW2zNIp#&U~-w~xG! zAI6})SO=h8eDb*4VjC4mpu^QsnG>H6`yAwBhWPn(nIu9E3Z(L`%VWzv#PLo+Nxr_C z5nut4b4z$^^iri~oow3@u2K&pwKX2x>Gh2#TjL0rZBPiK4upjl>GqXC|B}765=A9o zWfbjNFOu%{h z`9Bv=9jbWvtRGp3;M2y+!uvW2O&X4h8&lmey0x`g07q|H4Ty<(&fSJv0I!(I*W}pD z7^MU6o8Hyww*mIzOmd|9#3W(^ZLprbSEwxVuxj*(zP?dK1K$VK>KNPfMV_I0RV3Ls z1(oMJ4+naR5fMx|Aq$^{c{Fb&JY<7R9p0;SboRYB@uOeV)b~0dW5|&$4^!maZWP}_ z8hqeV5emiYm+dH`gI0D+qVA?~ljO}>ejm4WL}2Xvf*EM=bg4J-QeLBFmRnwLt}7ii z(#N*jEzfNvR@IA_GYzBCkZzDqlW^If$AluX+JTgcw?bm8P=Sw}o9qXhJ<1d(SmQ!z z(r?NdmOPA2)L{K~L-?|4F@REuEU2$1+>aC7Chhg0!pPp#T-Zjf*(vE8tbiMCX~@~Z z3XdVAvc|9UFu5Ez@$pXmN367A|rW$6x0biX2|$Iwgb!s|$11##KkgCeL+Hr5rCvWt;UDwYkL z$c@^3O4W0x9+h6I@3m{LcQ~>_4x^QqsY^;ZGZ_|!qs?KWV&w>apzpwo`?MKz za>(_K3g^H(l+hz^U46&?09MS7u)=>Q9|e<5zi+n{Eq{A$p2mL3W;K1nYGjW5f4Vdp zJVw$M7?QKq&`5YBw~9+Wd8;&i`aTSon9ZXozrVc3${x2mF?4g71LW=O-Me|<2h&tr zCCZd#QQ}vj?*)Tg0nbeT&JYl{N*6we&!k43>MD{5)h01V&6n)?3w;v4Y<-6oc5 zm&>F=q*+Z`<{Ls~VaX|do75|7CAoxB!3stALYEZ=v!-t;VU-%AqiVaVk=9Q&lB|#x zH-scFpS=&Tq-7Tw_W8rQmrz4L4g~WCLZu;GV)j{lfcX9h8>6@Mqz zt^60$H)t|d^%m~?nImZ5>jNX%T{VH%)p;xxR<2 za;ZK&gZ%rm7XF zXX*6gkZ5a^Q8NN8qj-+NP(wNZP4?{)Y+J3#g6P+y7!q}C5j(2#&<<_wam2QpZz_K=n{li$++AbEFEUYp9TdE z=3~D>iu=S*&1H}TWfhWc-NNZ)A#bRI0$eMlUATN)0h%A={#@U0WH#5v21t=1$MF~14n zhkvhJY8E!)fh*3Cilw3{fX5OhDx1wcU9C@{g0M>R2M)&cJ<`e$(Vjf;!|))&!E5<) zNL^1K8r%{-|2LLekN~IFpu#$5AVu$1hw_$yPS27d{d{L69$9CEIx^|29yV(?NQMvk zchB?Y`J`Qk2C(@I^|c^&bN~rx0CQRmCA-N|#X{{%48}0K2Zcexx<<0IjActjcvU)T zK``l4EL>LW@+@==HG{=N184~-al9f%rO^C&?$Ikr@#4oJx?bY|prCST^bLl5$q;$Z zpL&8-MusjVL0U#`Zi4UNI254opJmKnp9J5~Di-Ob)9Ey;L9sqSn2eesj;+?EEVe8K z&s%b~;9Y^kcG{=8Q&s<2h0WjpIA5@JFqaCghn>#ir3`IWS5^c+?$U|Y(ZCC(t7~vN z41i^`msa4+PsLhBqr%r)NXAPID+jOm<|xY%Y?U}2dnnM&nP_B z?mV5sq_b~;CyD0{Z-2`84rTNCKsJE+1MDhL#+aKs`GNG(XP&SBG3MwXQo2pNotHq) zpY{IP5+tEmAym#zW#fMK5c}m?lpZY2-*rSy{Z+Ac2gkc|gW$Dt7^|fLAX>Q z{=v>0{(WZ#3f}K=ptw?%NB4Wb>{=WYU<)H01^BD-UoK5jf-$GUTQ|X)OTUmQv;W{* z+Zk#wuNwkHVgZUZD_2foynk!Ro^h^2*0aE-*&cF^b6yE6coLjWn{DhE`=s{Bl07Dq zRt)fDSKY@|30KCrAyod$Ks_+UMT+cz22J*5+Wh_kCECaLfyt`Di|jIU)dF1q5uapE z!NS)xl>NIQln>*%(HKmc@6aCuBe87w?z1p>5eRwB_tzWwVNc0@$`i%pUK%%EEAet) zIZFG}()=GM^G$W_Iu*n!Mwu6qk&yF;rY_>_qjQ-GF;Qo~gLID&Xg~l4WSY$bQ9BNZ z{zCQkY>ODdkc|@Q+wRXjJ#0)>B)9Kzi0}oL$rx_s+AiZ;I?%piv)nsp)jsy~V1O(A zeg?#-1?jTiT`1@&Vp zqiGbqfHe};1JAGUz@FRu1IZPs9^&JXGIEWq+48)hL9c5!n> zp)?~Q8z1|}D2fm9+yvtL&*;^IKc31Om(s#&@#Sd^OxE7$bA*C8%;!7;FOd|M_xk7u zn;`;bVBu4~4f+K~e3I~$kFkdhs%($fPq)5!<8%z|282i#a|JiMXRoK(XdnzxYCXF( z8kkWSI+eiM&v>Q6d_DcOg|a5`Jn*aVExd<*;>Ike*8s~0FG)?h^k^W6$sk4OU~I3p z_m-p7IM}d|DPQQO9Q0zaYRTr-_<0H@QQO1T#SeNUf*a=Qi8lRActJJa4TDR?Jy;_d zJYScs!0?7?ery>c!fMxt_=rQw>#NCak)PL5l}JU`oc{ApNCohd1?A%PB686MCi%WY zN4d3ttg$~#`yIz+-Uy|PslfLSd*$N>7%<$~h{Q6yhmted%dgX%O9L=10j{ZCr^kVQ z%{2(o-og4QRd;GwXY4S09t(DO2x=i{rxTvSddcI;GG@Yja;dy+a_ygFF0vS*+q%C` z=g#mF#cK^EB6xxhZ`>EPlgPBx?wM!5x#_E3LXl>(jQPG*=j(AC1=Ej_RW@*4MU>}T zYha~f4P@NWMfzRC7Zu%cpFG|Rb0!jmCsP-;@WYTgBivwKDgI;LE&PbJFn`tFL#Aw7 z6F_QR3SZp~WWTqTe!psuTk%!KjDKG(0YjhLm8P@E`J14Iy+@n@l^>KJQXU`4SFCtN zYjZ$P@NW2Q$eXj>+2+?+!Suk880gnu7%36lhsOVv=iHoT%b+9k)iqu5w zabO$CU+uR0E#3Oc$JGo`F5Mb)j9F2`xYMaNmMLKnYhNEl0%j(W8H&~P>9t*&v~D)$+G&|jFfP^MN5Db*#E^z&{UG3ecg9r7Hswoo@&*V5cyJHxlw`P zW5_5W3*c}5?F$MofGg4Z`}5-AkHQR!jIWPMx~VKZkk;FOr@PDhxhl&Cti67E&pPr> z^?MmJRN__3g5hlXW`rv2-Q^CLs$?nSB~t0-z4w=WV6v+l&Axy4v&p#sE9}d%BuA1Q z1)6>TBNP4MMil@ejGFg)swy+W-BuEcbrHM*Y?2MGayoESxTqJ;9tLfB#1f<qB za(m_N9b7Z8)RxX%{+VA9^tP`rJ{rj^%_ z&?F*f;L1&Z!8xIM4ncs&$@%#O6g-&znHAQjV$ zU&Pwc*R?6-CGIuCtH1X`Z*uwbW{pc85ICmh%D05E=9H{wQq%f5(QSrOxv^FaiTzwz7&s;kneLD zQZ?oElC9uJevdGJZ-9nt#ZIkTy;;DGX{fqCH$yuw`}hZ(U-pPgJ_NUG&S%BS6SyVG z5e<9PrWWgsXW4K4U<-3E*Q}}7V-_>Z3ky?dUw_uE=x47FDv~~iMlov0nBesIrOAei zQ{g6B!`JxfXwa0fuAz{Vt<`V&?_kT7(cR8DoEBEKJ)ptz-Jqxe^tylSlxO6`;zCy(Nu38%4hDb=2c$6Y?U~3ymW?MLb~TX%%qJ<-xn@F zpKeUMUPnZb5XxRvNqV(CzOZYZTq%sy(EU=$%ef&XcL-g^+_R)Z-3%lv=B?ny1n1&*w-FWhrWv2r5C*Y}cjSy8UL#J{hh zCxq#45obut%lU^C%ka&?01no>#dKODP3o8NQZQI!)AucyuEp%$5=j6kDRDNh+}v4k zKbSp6@nt=jt0I+*9c!n`=oKz1f0r|-e_;}s{LQe;Rb`TszrHV>pbOBeJyQ`0Cd2it zGOl#O09!qY%xb}9^a0vOCe)dqz1JWpPm@s`L}4j#PSO+F9Y=h!h3zxM{jgFQ0Lueu z_^GU_q~Jk8O@+>yjg2ndBO4fI9evGd>DfR%Lh5uv(g5A4e8DbH7aHVcXW5eYS62ra zp_GtS&);K3Uvd`2!FAM|$|2Muq1%uNs<`I*O3=UU}LrZ4ejD31g`YGwXv`2G?E zi-jgxPU}dVu~j>&-`DXhzeiCT%bmdS9kFX8KU1t4ltM7`*P|QT+`azBk-YzVjvNXA zusCwm^B0d(UlY8ukkQMBt()})s8Vum$0!31Ds@Ng%~p0Tb9Mf){}E{#!mx^!*AHiV zwh&M!4hSxFF-KWN4`3XfL3!oXR~7_pQtn6u`cz7|u+@>V$@?;S5I_ening=anSmI6 z-nNH4!X3~c(Fnv`fSPx|2Q#P;fGNAg?yZb81`n8wm73via&?%n1bi%ezgGYv*RS{7 zF0S1ZrLD zgQe{n0PI+yS(}zXpxD#8 zBaATWry4}v+7%v`D7Du^6^?wo#-v5KCjEPibg}&J_tA1}fJs4eohU>r?>s z95NOJB|R)RVE~qbv>oi2R2$bxEc(Lr^~ymF4LZ4a|BN)14Pwjt&L*3G20!jP%Ioun zm;1ke@aT*gvJX!_pB?O=v3R|pAyTe*7mt({YT)FAWP47@?3(-k4ytgrWsovopt6Cr zO~=vyT*dP}%XabYD*SzD4*Z_068hUSc<@T$KOjq1dN5&K5}fkv(}_gLss^mC#c%3l zY|@q{h3Qr-lZ{0_mYq#3JHIq~K_?R1+5ou#!>%}Sq{-DMSIl|1Fd(9AQ}o?8RuK9L*687h z`Cc&qwz(w@R4Z!%B*oBDtg}sGw+KkAQ*G)Qq=kJdRzAvl@_at7WMem^X~XlaC_Iqo z3%Ixtemt@yrdK}Yc0F5epcx)PV5z)WioGy5WXr-nxDxbM6#e%dK0}wX7FqfP+>l(& z{}sj9V*Obf&c# zuglM#W~K}DhwYNg-$U7Yk7ESblC;9?X1D^91cq3mc>g(tv5OsWt%?J!e3t|4?Xn&f z2)+!Wmf!2zQ+=)1L4Lnu9qG5L`r$1DMd@z%Z?TYS=UpxT+&puP#O^Yk)~|;yfW%q| z%Y!N}SOnJHU9XpcPtHM?JiKhRf2S~!5_(bL#oosOq#>gR5b#HrFsILdvOWSj?j^Rh z8e_S#N6^gEKk)ea(Goy4a8vN9j57RpY|`}wdBRjZFR)~aY4LbDUKTByPG1>Dkzpij zsWWV}Lf?}9Kwl7tttNLT>wi4*~u|X@D8fb5ETG-?Ly%*^2!oO>F_z8*O9~}F| zM2&L}Ht@p*l=2M=i1Zxt?`DlY;vuwiA6*K@xZ%lRu;t~PbWQdW62|C?nhFb0SY{&0 zJnC?^4ZHA3>VYw88f)ek5zoOVzW~(#*#umGKkWrHpd@P`DvMq)MtVZlz>%kJ4?OVE z?>}5lMFLE;b@vUL)b#wd6ia6~$v;++ija9fbdaf(6JOQ$F&_!BSOWMxSRAR9dA|@Q zlXB@GOQ{al!#Dq~JF{JOq_Kp9`Fg}f#NNX#P3B%hx`Qb@vTP|}P5!>-+`+6NdI@RI z;d%)zC^Lj>r+=O`-Y7mok+q!`5f)V0Q@C8L@4>Tmuh4q^Y)@m@AJxAF%h#&yLjjro z8Gf1u%A4*jurNI{MK1ktF7q*_%f-d>_xb>l;}HnT$yl=X2=geW&SF=&`VRs&t7JZY zgGukd2l%{mgu4?%7*blFTX(_s>vW|T(i~VE5?4j=#Nd-!QS=t-bazu zW1(OybQp8j6MH?LBhpgL3|?O#XfkqEyqL`Sr>zLUDg#uO+AZI`zE0~q0T&ZwpYvrW z{A*F;!e+P9Ty&og&L2PmtaO>N%<<0AQGylZ)*V!yhQw>g;H`0? zEP)6Z1`!3)6?HIqFkRMKbk=JtY_5=mwL4QU5=S34hc&`eyIOe9@b7X4;i96&=j5PE zdI9FTZb@M-+sZYlvle!Py#z?B8$Re zWSkZT`x+>Yz2zzGPR5F}X7J;`x2%^px7>A3moY}9kD=W&*ssY{Mp9`MS=X|A$Emg> z8C3{-)aLKaEA!`9YtXh$Q1`ux7d`Vn$K)4Fl7`&n`MK3LeSD~T$Q_6a==2O3yaE)$ z|H*YgFFiCCqyPD%>>`)X)9WJ?R{nwSG_u@_sB&-5lMQ!wSFcE4ABR+W4EQu)tEvGu zYfr%be0kuJ9=x^%01nJ%<%`oV;69h&z_do1SA7{51Ory-0^9u^blN>kYXD{R7;>4~ z)9{CG%vJ|tSnky z+f9y5n@Ld)B=5(NmpR2?kIUp(^%OdDkKxVs><1<6#%$Sf`6&ygkqm3UDJPdJ)Io5T zTf_V3{woP^Ea_bZaV^Kv7CtP1!r08MmR<*QC??0tEWRbx=3c;LHedOd3^_YzS%My#a!y91*qV=7s84eK>KjiT+ z>StIB-!ERrDN)Dwk|8D1Yd;jcVT4Yc#Y1e1QC2dtI!A*v5c79`FIjlJL*F0!u6-pT z%Amh!R4>All~Zr+J?UPlzIZ)G@ag;Rr(S+sX4Ff@pwez9ANie=l?OZ)If(k_lse|t zERpP!`qQxWlG~qw(%glybgVZro4?}jzciL4ZosHa)b`HmX#2c>kKu`lH!JO}r9v|$H~E}B>8AuI5FM2uXJ}Mk6KZOd>epW;$Ow}-%|91~ z&s(Xq-Z?2ICPs&!u3zx$amokRz_ivcWxdL_p?mjtm5n_1T9L;){TLoc;NzrsBF@^M zWh|x9f1vt!X|;iB^=-x`F}-%kl=7t}Xr3!unq-D4FECZDz~>8Z(}pB!xiD0@?>oYH zqo-%}bllc1m zbQ%xS-*_e8o}cN`?C^@@%0=9jUKbFaoQ{$`)n_6MvbJUTE?kzRwv|4=f2NyU9jHCR z_&u>ik&pi=LnC){c=IPJb0-odKT@LzDKTF{$m^nez%NsWhyJ~+S{Xxz^sJzhA98(D zSE#jPQEf_Bdhqh%rN`OU0r?g3K+RMy0yu?Ik4R-Y8KvH|^qAo~#zvh;l#JRsMAaH> z$3raimBg#2vin^N%L=LL+2ow4Bh?gDzH4w{-K*ZV8DZB2YV|>U;!v+G$2HeuFXKI zw0Q5`^n1F#?to|m7@oV4zd8$Em!H)^>zEvc_9R5gPQm4I!GGH>Rv>uSM6#z4tUdb& zx550d5Jf)j*Zof|y}^w0`yg8RGRpjXS7JqkE3Ry+3m`r}ZPhJ+Ei1MU5Oa4=mPCpr zD_05m0t#)doW;xA`oHj^G6U7l4ee!mf{r>J64J zoM`amaS87RPvSM!Y8a~jGUQ`uU|;}NmUUIlw`2NX3QM43H``k#G>S`?#mJcoAD&9_ zOZsIidx^Xk60;aNU-tVQcv&4y_1cx$qB~K_>})HSxS=a$!XBj$GTskYX0TjevB>S5 z6T>?9rYvO~+o=*+u)zcjT-}>6xB_dRJI4H6#b3&aKYkItx2)U?pdSkdNjbcPH}Kn< zWy-y;#|?cq_zOB5mlnfMSkQJm43_EzGn{R^y^%`=mdAZ!1}cxQZ1702{Mow)@8`N@ zQ%xB2YwctKn(bgdwWfImRBztLn__;e)~vX5`WrdIDUn1^W7qAMJr4LG3GUH@4VQ&Y zO0L-U#c-e~ag$~8%(@eZin3Xc^K!$Cu1!Ek^EkfYxAy1ZL}d%Y&n&E`FPfDFdg|kl z%D6Hj)7Ij@93+ES?@s&PqH89}b42KyHJP;w#&Uj*!XmOIUkiZ98pjJVSqm5yd6o@2 zOT3G3nB+dD=q>l%;)NlUDE5(anmrauN*TgpqMs{mb5=tK!Nds-_Da6YP26#pt&oc4 zB%MnlPwfr7dB30+hhiy~9(Q!od-;?>tC+kJZ(jo85qfzzC3Is7mu@?geHV)DW4AbK zZYTh>ek>xT?Ad}mUjP%+2;6g7@fZ`IvoA8x7W?cdLx6mGHa7-hRuPz?VrU^S%4N4& zvNfrKd&R{f({hvgm`xaSCn;-$C%!GQUVU@|qejSRbN1=L6mv>OhfUL!!{ z*hqY;wc)Vhl4}+N=n4ZCFtlCkYJL=)K*e$mSD&`962{Uw$kfU&4>hZAkruQY(s_8) zyai}(hkNH7eKkdQmtV2Ji=TfV3oU5YuW>MJM_4cI3#{B0KDyEYOYZ1D*YE}it88f* z7!E!~R)!b{ZrzOS7H?}Oo5UQoG3CJcAi4-uLYC%qa04Fke@}-UY;D12#;W&%AKhzG znG){TQ#R{0b1!V#Hg(p!y$gNw)BtRr?9lonE|YEkjYNbqzIBM;CGUFM7s0Gfo1#XBWr;UHF$4iE+xb%UvEUK zpIoYTK;QVT@Hhq2rm{WtLN1KSlxC%O&uV_;R{K@UQa+v5&r3>!iQ&Oyn3y;|KUzAy z_1noFY<(0e$D{#=zw8$tp*Yp);3uxgA{UoSn}8LrYseubUygCrV~6e87+hgvs1*Q~ z?CYWeJWAO$HI>Wx+SVc|GnP}poZOprHCGx&g+#BE!0}!{dP3Ws(os=_4%OY1H@KM3 zQDX_9JXk!y6M`(T*eyq9X7kJGbsg%TQ$G(NOCXqLDAJZTl+eeK>-JF=P{KF5fex+) ze}u@=UmwhbAK*!2OsVJp4z>7fPWd zY9YQneVwd-%XcTRlVGB(0V>FZ_ue6nVS)f?{BT zHHw@}8}2ax*_&A_nEu;F?Lzggwn6NqdU!^|8n!wSyStkY?*bzBVh0SYoh1({>>h+E z`!V=;J2#WX7wAk{$m@1GovSq}v+pnhAIdC-KUhEHnnbquCD^tEXJv<_pB80>+VcJ5 zl$ss1mIQE)CyYm5VV*Iij5xnHutzg}ZTOI=LcV<42N0GB2%B?RfA!TV&den4$D+nN zBj*mkSyFxduW5r}MMqrw1sM~x{gp)7M)Go2^2gpDKaCKNeneplkFHd7(7^%H3!Lr@ zi#j+6V*)SedS~5K8ipozrzQAA`nCaGhcZq`)Q9heFg?T)%pwZ)-zbXKUO-_Mwck)$ z!)?=8&b3-&Gh9e-7~_#!V$QTZ{4sPnmdZ3HT%>bLj9Jn*Rk1Uc8X!iYvmL&k7wkpO zp7WJYA4dRkY0vAE|o6+zI))-#|p2+q0A2Y1*IPk z$DnD0<$k>K=W)urJ{%mUoStd?Oj5fq(*royCKy(b;S`&`0*sI01iX^!=dDU&lmaCm{)#na8m z!sf(!!G!l_Ahn@!Q}+uL_f+k(#3-T$t#>w9OyDXf!)VfNw{`Z(>6 z{dis9#4iOv622o&+aAUT;|c37>@^$T4-VnrZf8@&4mqEt?@^qE*E{0dxp#lB*k~Xw z-hBBYTm|c_3q#9^b&eZ+YBuxl@WuIdEn$mw#_oDZ<)ERhBw9DKbwwlC$0Z~J_yGr} ztX`*n0oP*zj!f*npoX0CZpr4HpJPhT7)LyMRc|U6o_tZV{HBa)wJo-4n1Ky-Er2mg zM+c_Fc#cO5+R9Yk^U+Nk)1I^WAggByslGPpXTam^7H@Kw2ADWaXiJfEnYRVX&Rv!d zzV};8*WaZY=)SRJ0fV8;RgpWsb^S3yDLh>ID0t=Cw~G*?pD(TgaPOY|9ZR?MdjLw2 zi2D3qFXJ=AtIAyB;o|!fFdbC^s`7Cuf@9KF_j$yr`t^cHOaAo*iX7`%8ZZ84g%3pE zFZO1|+~~z5KNt3qH(7_J*O`4IpiDen_HU+9&BG^K!kdI!$=Y2o6+W5w2|^joW-A#Z zomzzcL1V<%k@H{#HD$xzYFNEbAA&r%k1ubRQEx*Hkn<8Pm^8;OQK0ZtM z0Dr;)=N*s7y>=OgWdE7|ES|FU50=liMWG^AR?WR~M5J)xiC#ZwMQ_DFL1F;Cw_XJ$ zL5s7qYRf{&^neBlyIsCGo+R6APt$Rh~L`<^E@4n@ofm&08(??5T zvohvV^4-*$4wM%g>j5jPSWww|5L0JIW!t5<6dY?zBY8aLN_bUEjgmkDP@_gkX6WAf zEvNBPrKs{D%0>1b2j*}tk1}K50;aS%XywE%0uxK8=5_5puo$bG>)<7a3; zAB-tHD*ql&RqOVyGj6k(`78?}1IWHfW8DJQ$L1B6n}~41A0*8@+LtW#OVhV3jVWv$ zBaD$Iu=10RLQE^BjYapNwfgdn0)men7T{#e3V@Xsl~ZBq`=B?FlAm< zF6^)X9iK+J&9;7R*$JOha_%kUB&C%x-4bXScGEKm+T`u+`?2(4A6rCz$LHyk0Ry8W z91zeQVT#J25Y0xBlim96V5~CuXBz396lq62xP(7HN?D`AB2m?dp=b&r?jtf9D zU+N1o^?%<4F#d|BU(X{r+L|7El9NNeJ;P^ds~nJ(jO$Z8w_fF4&Hx3l!OTKJC+NL3 zSt)GYA#vwLYz0SH3X)Qm$E|4Q4RP@8z*9Y3mjD1D07*naRQpK&ashn0wW}2_ciJt& zQLNd0xa}Fge;+8>QO5B4z5m^pPcpm{zeB+FJ>N-7F>2{!d!=7PbR0k>Y?fo=7V2@6 z9=0fv8knx)8s(WI?17LMd+X=rpk}dhX9%3Y?Q1tA9H8oGNiv$^nM7JxHd|x@z4wZM ztXZc46v$@#vH3M+?&R;>BIMt@pdEm{&;eWgK=}Rc*9^VrQSZ;z^2ZDIXgz}E0Dnxa zU7*HaU}Ge8W0Eck+Lw`^`+l2EnHc9e=!s+Rl5jUDJB8deF_=5KPg!_m1zy6yIdL|< zfFNh3%PS*=RQf*GG-=&LvPr}xU{^kqPeph|E`fr2Q4{QPOCYnx<0)ZXA)%PN-+T9g zVb%gZ?(op=KV1&7lN)Q@Umod8w&zR}uXEQ`F7BMn3ccxRNEnQ~L=u&DZVq$*iq~?Y zOk@PA)Cu`_B1v+RE2;+NSe3H zmT{T1IUv)~>6@5!d#y;g?a6C^25As)In2j@G^o-5b57ae_5>aUqZVWlh7WqFVS_&T z0BHWAugZ1nTi$9C1jxA2_^;X(m6D6$)|Tt?BcY0?ykqW(o6*y(VS~3NKWTk_bN~19 zKbp9$SoP5O;G0nXv3Yp8el*M?W%`NXVV*gr!x*|PD<|EO zEnH*Du=NdMA4j)~b%swknBq*qZ6eQhOje+V@seXSP&6o{Ux>ACCzr4w+rV0flC?DO zpP`E%S}9Z+?4SeiQTEGTmw9TtMBsxRep{tbSt;awWa_V@GuN4R!f_B7>lf-Hqq0x> z_pP3!Y%ZWoo;=}!l)95x;pqDqM4{SOKOzkf4*%E_R_Pggk@I_Zd2h_HG}VbZn!P(w zLmMes=e!|)oq_Zlxk=E|p|8L1NKdISuUaRwdETPQK)+ll?+7$9@Sq6uo*RS}I&p4&Jyn@TUMIrDtP{ft&5fv^&DbpucIbba|4-{n^b1E$Y167s z!e(IU-Jp>MTPHWrZK)&f+S#vn86$ZOe90q(x&bEDgGdQ%%+_25){ISIu&ieWmJpqZ zVgvR9pp*1P3|aDPiC1UKkaFEF&w7%R0&;@>k_(DeP(b~Kad3gpp0TDBO1(%iOOXTE zm5-&Eg;J$fle%^4D#8}f`kU`rI@XK^GaN}(ouu_--1H=_y@zINz+%>BRDU@Aa3$fF zIi6XsTluNn0WWjNU|9Wea&e9`J-a#i7p#w3R<_5X>{1amHoPvI4+m4hq zOXQ@~;9pfw;Z`lIWiW`FS8ywnz8<)F8G!*Zcq(7~koGOZa`u4g^LzY#h?!@-)fg|N!6wy-Zx6~R25-s@t zk>G_CJRZP&iN|{X+$ZP^)eJl2`$Fm20|PUvE1fRo-ux(MgB(qAO*+H(c{?==FRs0b z-WqHqmsJvs>9(4kdk>7gc$2n}-*p-L&%$hu^m9tKmddRSgip5a_9#A8d@y8l(7$M2 z`pgzJOS(=ji0R8(UBS>$z^`6_!(#d80v_b%#7ksd^W$#5h1m>DaK9zQPZbuNtPd&PK|m(%9VUtt)O{DR8(dE<3NE{Wj2 zR@;1?dw}`^b?vx>56>j{vxXw9yTUpvSGn#HOy&ihaCr)n;=Gs(j{TMj{^aw#JWJ9dtJRRoCHr^KnDl|_)5%d z{~V;A$vOpb2I%BRccKPRN;(+HP6b~dJ!W?yH2gs?l?K%r&!}tZ-Py7Ps!Fte&o$;_ zDamjUBwHtMlJ;o8P5Si&Y$B>@5Db`Kni1YT7+At0+h%&%z7og3C-*8Jqc%XS93d)o zbmntg`v9T{8rxu!JjH$!PJ8fr((HQZ;L97QCMYv-h8~I8y2KSgT@v5=`p_(%el~s{ z#iE1NLi8$Xm?L(7aXp+OXA{m0{w^XeO-Dg?OvE`+wp4|@DZfYkbCAjt+%U+zqQgCP zu?3~cSD4fPhl(DQ)}gp%e&698l_&fFW9l2U&?IZq%3$?AbC=e=ja-dN9BUmMU4|as zcweLbd5E4tN;;ZP6kKPw2g_bTW;`wSj=31^jJ@M~ftm^Jxn9TUb!wx$B}@fK;w!yM zoj7|LYGx#MrW%%D$-HQ*+!*~^!IC4^FtUhQS8NcQ$n8z!!cg{ifgjIb5h)dU#yX2l z7sv21kv`CpAPNIOyGN7qnch}hGFMdTaSH$4wgU4&X61zSW4UKh>tUF)ZdFoU-c}5=f~7^HtWLlDmDKJO}ijO0^-gYFTuaIcuNZ%hsWE zJD1+KXF-o9n$JBcHA|?B-+5EYa=1JK6t`sX(PXoQT{>j)zW)R8Dv%ZC57P|gK?2VF z;k|U&6`w6%R-}YOV9HQP>Td zNEFP#2bahD$TwEz-WHGBrT4^|Y#ssV+yVJQ(jI`kxL4kkib}UyDu? zj>~{EWT8cUYdPpQrq&kXlw(>vJZsE+TMhFaLjE94-XXnb8{(I%U<83#-28WA-KLaa z@|d5fIsI}qmry!XQd0sS@2`}hBlm*GN@ABQ52k_A!_EwN9jD1zWk;5|}+>~uAd6OlDjbwAQg%9|Yo!G?rkDIDAAy*s|rv-g`%JJKVh z3EwwNVr-z8;k9jBlfQ%E(?t*kvv5a8?*I$qS^fKtd=M@DOgS69&w+@03#KP;VbqYN z#9RhHcFIV=jih-WdT-f7t4%?$USL^SGU z^RhZ8C24=HX~2&o__Dp0?Z5m@#y!ps%_Wk^^`$pZ!587`Y5JxlJzG%eg8yTtEDDEX z8IHjgj#90f5^*m-p!i`vL=2t)^DqL_#~~7UEfaH&qDi?>a+8+5^ty88Bp7G~gVY(s z3&`YMk(vhbU%pFm+Tdeajt;<(K$6qvSCRTPKOQ`Zn?UY?4ARt35|(uJ@aql6J;0h3 z%0hsrE?MZ-xB?p7$2+MGVc!%Op{q$cjB)ISb(bsXbuHd|cdU}dm^eu7jLNU!^;5?> zH}4>H3Bq63X5HrYu`{B_0xUy@W-W5AE`5}H86{AHNc$={R`!-6u@4Z8^2e%s!Z=g& zgx3q9qPSanC`Y~_dQGudZ>==?Xu)$&S(X-*Zz~y?1xa#ex$Na>Vn1{63Y7@8!W(QX0Ij+S&%n{c3D!t*&?} zzoYAFN8bMFhJUlnr!jq0i}05JYN8daeeGf}UbLj*-Gt?4M1lo5%yTF62$$l1N|Lw; z#*qVy@h4ekF|`#?$C5}&*g8Xo460=K=KUQ{_pcegq~26nIxz31`8SULK7P8?#+uCF zy(n{}&bUAn^?-SM4u(`|{?yrQ6VkTq+eU)O*sJ^cawd(+7fomv-g3Dl<=kMoi1hox zRxtA6rwi|umici?PtcThYYQq9Lt|oG&9l&&IwM!_X9_Xhr#?+ad9(*j5@aSVG0sq+ zc@jz7MDY9Fx|JsEIwMUu8yIy$K9|MbLj&4x4EMmT*S7 z|LqN0NKK0YDe%&Zx2{D~#Dt;SgUoPk;e0&{_iWqI^JN4~bZ=N0zboScBOwfX{#ZH> zD+-vsq*(7F?Lq7C0Ck0cP9Ina@l#_P7)-WtVGyq*y>uPR5(Bw`Q2AL;fADU)^{tNi zdFHxL*)>rLD5NEiF)D8^#0lAzBFoMhHZN^{>u->{`}jLsS$566;EF=%khlZ)4M}4Q zNSJ37a0ERHs?wtcE0m+kodHOY%&`&-;$5{f1J{p`NuIogt4sL8%;0P}ELd8LbG#`_ zmA?moW3Z?WY@WEFy-8+eHNA!=B{@c|#s&nvI0i%A^DljuBn3l{T;50!5@}nop3Ut5 zXKfjU%ogOhxhRz}T^h0(Lb`NM*;4)cT1W?j%z({mn(+Vq55JyIz>VhD(w@6ffg@~} zg>bkhl$rAF0$i!zM<#>#y%K`#(9754Z4BnIf;11MRL$aOWn!zWCW__#gYsGe#~EMx z%-eOdBVLC)=LbKD4O>O_^TF7?X3}8n`2D6JzLtY!dl@)CtlErP<$wtoA#0p9m`If5`0<`BQWMDQO*HI;xbXr6T~?=M%7lA964v_-J?ry)#f)BX~T)g8|jP#)Xb^b9Tj+vZVy+_mq;t zTk46sJju+RjINMXC#ajej-PMXHz&krVX%LQ9Z>;fNJew=u^w`P_$0fe^%2J>rIO?B z{X&59nEX9xZ@Hi=6q1j?Ts6KtNo^?H7Ok1gOipO-Z_7O})JDY%w? z$dZ+l(9nd9&(6BjhqweP(&oXih#_lKPN&eZg&}tQ?bkz-IsHEsw5{#-1Lq^`IlsH} zfz70KP{XYesRWxnMXt4-`K5$_XiX?3@;AaKsa<9GIFkB`3T3{QYb~En@4nZT|1&TY z?3=B1h>UB!fF>E&=+^U|LHYS?+V)66dod-tVNy*)bZ*SkD8@>IX$tarV=F#3m4B85|c?_wXfit4^yx1&| zFo1tmJsQ%W#6DqOuqF*Tn7{Z~gg=iCf`avXe?Mi*m}q&Odg0L<%e!`x>kvT^j%5<2 z;hM%U8OaNHC|4tB_2@J%kurhqiZa3sZg*sU^@t&fKcy=k6iWa{$Yuk*BQ%1ruLz?wLLA`@ zZ1AJT9+56n7o*>OoF$99x=E?+CFC2d;3-?%7>uHaHy{C$Ug8j+BYSD#O)_VV%Db&w z^0=dMwm})C;w5UM+&g$S3dpADsCU7&j>or&Z32!004ZC^u%_D)bgEa)IT{30kQAUz z{5AxqbhM^OhslPPL{wi{ZvJ8%ySHV7xsgi? zH@bii{;ri|xIYL$tbKp1zVu6|)y(&*s&p@V{q z;wQ^z;Sw}>WCKYS4MZ!;t^IJ;6-R8AduPqwYJ__l9fMl}g6Gr>G17_=0FegAXY_892l2ZC1_N- z^~CTGC?Yak&>dqKReh9sloN%4QcM0o=IZ+SGkxg~ypOJwRYUqb=X;gQAp&?vHtQ%X zpl`0eC0?-uRXtyOX#4-o6_9dmk_h&pXfNER29!%Q9Q={9D);DMpaHcUA zRuTgI{_1uZOz85wOaA>0wS??jCFWc$G1il&6P)@XSH_XRcq-7|ud1=sQ05xjVsBn$ z3Tzvt`m)PFy?7F-{+{)*@b3GXcM0{u#KA%`Rl&+C@0-CCtu8bsQ##euM>T>5T}h;D zB8N-!4m3IwI=a1CU*j#P8auqobn5H=jIe{SAQ`%`(r}uOv&QGeQ^i&21VLEtCw?4n5U3^dTEq@~OSH(Kj7qZ#-q4GI@7x^aqC9#4@hfevSo?UHK9PBq^-C|`Gj5Kk z3g2O~Q+iY5m586wX{fLFvAH%k_c-`(Iqga!ksM=`N_81Sp05_1a{V-CIgsKm*@$|02SIU*Ojg4Uhf8JESK+;LHuR>Bol2;Dc>+N=Zd z-_;mSP8$uldA49OEo1vES)ySl;zTtBdkh{+5W~v3;ip-8=*8Cz6c{m=_5zrN0d7gy z&CR6rHA+FQ+%QzBwt$ZMwBq&Wbbg!LH=KP2c}WMt+Gx$j_w_X2A&*eg=gPtU=W1sv zsh&hnK$8mg7>QM{N#TZ%;JfSNBd`&^+G{5v(AT%-zC5j&!ps9&x>%FRFzXEsgb4$< zc>TUggRH?B?#X`rjvN3@10Zu%rR8JJJz`~7gK^Y-?*RyxfZ#bco1N?!1%&+>4iCH^ zuLB|K|AVJzUmxK6vn`7x<3X5fB>mO>0a9vZ=aifKeDfAW^G@4UMdG=-So&yMxO7Pb z`GE5!A}ZO_Sf z*SI{6(PpNey;5Km30je_DU~wc)h*5d!d^#RCMg5j4stUn<2JS4Os#lkv{^HTr)mN{ z1!(+d!d15Q%5pD}p1hnF_{nTFtA(MTVd8xcGW??&(j^Ga!)C$cGp zfzu8`L_z?vK@2+MSCrpnyTLm%$(*38pvu^(S_k#V_I)>ysgrWxpx#zi5=(&^BWX*uolkVDK7T}>dNHG%9Wp67)-1gF@$Y|%FY#&#%n2d^cw!Du^f`8ZQllq_j>WP zBpOBO5TpU9cr9A~ja2cG&EXEC#BxX}+qlcaC;W@HAskB0W_KrDrD=&j>JZovTLhKb4~K10?YJPbc2Q}PWH&}FNURTKY^xHU*q(^FTA z!vZEJ4bpsqR5nX6>f&X>dt6ycm+w*ceA+8{F}e#`P~UEASM6+31&$|K~y$i!rmqpfV+Ogq-s&5bA??wF2 zy86n>nJn&S+AgcV?=OJsBnVo*0MDyRvvhA@iQnwctsx9!_y`r?GiVRui~x_OTD_FZi;dM&d*|Pz z3I*J}aAkoF;#i2{l`bz3{eiuTYve2+6KVGP2!H=4hcu#UuK8ei@+xQrE?s;;yW@%c z`(=B*-ehqksjIBri38|g8v0!Wp?Mn4eV!J=!I`hM1YEk7WTTS8s|LRgSF8{@lg7E7 zhPGg>;R((yZ!JD1>l1|5xbA9sEi9z6EyJuk-H4=9@ZA5bWqnZqK*g+_E`e0}!pFZtJO=t&HZ*4N!H^vJwf>%-*PHs~kYh72fxBW* z3)|;6)@@k?52j1Y_IY0>67d|D4nDek{Z2_i!S9%co7FL0But+v)7RlyhLq`&u}Q#L z(VN#4N-Fvh;0FKuUa~7QULO%q+ppj*^=dG{fg3BM6j};A01)Q%uQkor?mL9x=-!M} zQ?&nC#8-iyqQwH7<3-UXA$wg=X28B(d1-USwj7OW>99ztPYe+fp=Q%P=tKM67;Q>?y}7bG3%1bBtUZD5^wwQJ z>ZOo2+FZU`x-ahRo6ek-*Sn-fcFpYEShozC9G7d^p^yvMBhi5BPzZqfN)&TVJ!2+; zZ}Is|{kr!T3zK>bXydN2bjPPE98j6p46|Ct6CO!@?;=X8BMa`8i$Zn8l>(d1WZBZS zsW>$r{+`FtB=OP#h^;*c?spajKFU;v1gvv!n|E*Y1j5Vg3HYHf{YFbju0I-!!%*6r zO-;x2DxrKsnfL(i0?JNBy7wRp{G~GwnF#g@meIWqoqv)#FXX_i!mnp1G`!FBk*Z;|~hkOQo*B47-*;iNgE+uhDs6Y-k5m{_iOJg|ZGnlU@sdfr`tbc}Mx%aRcJM;HO<9?aLGP)e515Nz})o zNtrSCR_&Y9;>-7g2xLGcS4;Z2A1#y=xpK%((J|C==lkFF-oSZ`c-haVtSpyQ#wftc zTXg);0~1dghFqrO)BlXRODw-r`vtH6P;%JeO_WDWx89kxAh*eX(QiD66DCJ%#sB#p4Sl)MT=D z{l(9Z=YKtUuk?D$!ZlQqCl1WD6PeCrE_N{LaS)GLV@OhE!_6m%g{^!ydf#P|Skma- z-aa{Ny%i9iT?tyK47r_8q1PB;tYQzyn=LVMsQxU(mB%Une!f-%S!Go$C{90j+IFC4 zU||oJ@Y&kc7jFp``I-hOv4>_P{00HxnrRq5N9*?cWk@VIQM1aWWObvb(-dsMJO5a+ z+n8({z_i?X(D^DI(It@SwrqvFLYLh<+bDRXsE_flig0~bKt1JhHU z1`Ev#lnqg`@UUl<+7iS>+4oWt*17q!@!gBugtV zwq7vKgeo*MtaUhB!@TiXG2OICv+28I_|M?7pES;xtcLKc<>j9uWAqlXfD3zuK78*9 zSYcxjOy7O{v^oUJ_lHYwR|@XAkxQ8={C4DU4PG!ke2h*&0rK}V#QC#2#VyaP7Hctd zDWq>8584A*)^mpVdZx^IMtEtaT_yRw{EYf-?3S!kSTM>yH!p}emr*M_bS;Y&IP1|q z?fuXWz0#h*xhGts7a|u)uz+E`d9`P+R{x<&)agLi42t>^9i*yEZzKbDNjd{D2m=|+ zbK?it)F2H&M=BQ)&~PdB7v_-Kl^f`geoqa3{NYpa44zFSz)~xNAz9yVBpCMxxW_M- zNM1(gcrA@r6y?hgC*7vqJZu^2ne<-NZ6nzMWz3?gQXq^fLrVUC54rwy4@8p!00000 LNkvXXu0mjfN7 Testing key for secret code "Unguessable": {}'.format( - encrypted_key)) - - file_out = open("rsa_key.bin", "wb") - file_out.write(encrypted_key) - print('\t -> Testing key write: {}'.format( - 'ok' if os.path.exists(file_out) else 'fail')) - - print('\t -> Testing Public key:'.format(key.publickey().export_key())) - status_import_pycryptodome = 'Success (import and doing simple operations)' -except ImportError as e6: - print('**************************') - print('Unable to import/operate with pycryptodome:\n{}'.format(e6)) - print('**************************') - status_import_pycryptodome = 'Error' - -# Test libtorrent -try: - import libtorrent as lt - - print('Imported libtorrent version {}'.format(lt.version)) - status_import_libtorrent = 'Success (version is: {})'.format(lt.version) -except Exception as e4: - print('**************************') - print('Unable to import libtorrent:\n{}'.format(e4)) - print('**************************') - status_import_libtorrent = 'Error' - -kv = ''' -#:import Metrics kivy.metrics.Metrics -#:import sys sys - -: - size_hint_y: None - height: dp(60) - -: - orientation: 'vertical' - size_hint_y: None - height: self.minimum_height - test_module: '' - test_result: '' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: '[b]*** TEST {} MODULE ***[/b]'.format(self.parent.test_module) - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: - 'Import {}: [color=a0a0a0]{}[/color]'.format( - self.parent.test_module, self.parent.test_result) - halign: 'left' - Widget: - size_hint_y: None - height: 20 - - -ScrollView: - GridLayout: - cols: 1 - size_hint_y: None - height: self.minimum_height - FixedSizeButton: - text: 'test pyjnius' - on_press: app.test_pyjnius() - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: '[b]*** TEST CRYPTOGRAPHY MODULE ***[/b]' - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: - 'Cryptography decrypted:\\n[color=a0a0a0]%s[/color]\\n' \\ - 'Cryptography encrypted:\\n[color=a0a0a0]%s[/color]' % ( - app.cryptography_decrypted, app.cryptography_encrypted) - halign: 'left' - Widget: - size_hint_y: None - height: 20 - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: '[b]*** TEST CRYPTO MODULE ***[/b]' - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: - 'Crypto message: \\n[color=a0a0a0]%s[/color]\\n'\\ - 'Crypto hex: \\n[color=a0a0a0]%s[/color]' % ( - app.crypto_hash_message, app.crypto_hash_hexdigest) - halign: 'left' - Widget: - size_hint_y: None - height: 20 - TestImport: - test_module: 'scrypt' - test_result: app.status_import_scrypt - TestImport: - test_module: 'm2crypto' - test_result: app.status_import_m2crypto - TestImport: - test_module: 'pysha3' - test_result: app.status_import_pysha3 - TestImport: - test_module: 'pycryptodome' - test_result: app.status_import_pycryptodome - TestImport: - test_module: 'libtorrent' - test_result: app.status_import_libtorrent - Image: - keep_ratio: False - allow_stretch: True - source: 'colours.png' - size_hint_y: None - height: dp(100) - Label: - height: self.texture_size[1] - size_hint_y: None - font_size: 100 - text_size: self.size[0], None - markup: True - text: '[b]Kivy[/b] on [b]SDL2[/b] on [b]Android[/b]!' - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - markup: True - text: sys.version - halign: 'center' - padding_y: dp(10) - Widget: - size_hint_y: None - height: 20 - Label: - height: self.texture_size[1] - size_hint_y: None - font_size: 50 - text_size: self.size[0], None - markup: True - text: - 'dpi: [color=a0a0a0]%s[/color]\\n'\\ - 'density: [color=a0a0a0]%s[/color]\\n'\\ - 'fontscale: [color=a0a0a0]%s[/color]' % ( - Metrics.dpi, Metrics.density, Metrics.fontscale) - halign: 'center' - FixedSizeButton: - text: 'test ctypes' - on_press: app.test_ctypes() - Widget: - size_hint_y: None - height: 1000 - on_touch_down: print('touched at', args[-1].pos) - -: - title: 'Error' - size_hint: 0.75, 0.75 - Label: - text: root.error_text -''' - - -class ErrorPopup(Popup): - error_text = StringProperty('') - - -def raise_error(error): - print('ERROR:', error) - ErrorPopup(error_text=error).open() - - -class TestApp(App): - cryptography_encrypted = cryptography_encrypted - cryptography_decrypted = cryptography_decrypted - crypto_hash_message = crypto_hash_message - crypto_hash_hexdigest = crypto_hash_hexdigest - status_import_scrypt = status_import_scrypt - status_import_m2crypto = status_import_m2crypto - status_import_pysha3 = status_import_pysha3 - status_import_pycryptodome = status_import_pycryptodome - status_import_libtorrent = status_import_libtorrent - - def build(self): - root = Builder.load_string(kv) - Clock.schedule_interval(self.print_something, 2) - # Clock.schedule_interval(self.test_pyjnius, 5) - print('testing metrics') - from kivy.metrics import Metrics - print('dpi is', Metrics.dpi) - print('density is', Metrics.density) - print('fontscale is', Metrics.fontscale) - return root - - def print_something(self, *args): - print('App print tick', Clock.get_boottime()) - - def on_pause(self): - return True - - def test_pyjnius(self, *args): - try: - from jnius import autoclass, cast - except ImportError: - raise_error('Could not import pyjnius') - return - print('Attempting to vibrate with pyjnius') - ANDROID_VERSION = autoclass('android.os.Build$VERSION') - SDK_INT = ANDROID_VERSION.SDK_INT - - Context = autoclass("android.content.Context") - PythonActivity = autoclass('org.kivy.android.PythonActivity') - activity = PythonActivity.mActivity - - vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator = cast("android.os.Vibrator", vibrator_service) - - if vibrator and SDK_INT >= 26: - print("Using android's `VibrationEffect` (SDK >= 26)") - VibrationEffect = autoclass("android.os.VibrationEffect") - vibrator.vibrate( - VibrationEffect.createOneShot( - 1000, VibrationEffect.DEFAULT_AMPLITUDE, - ), - ) - elif vibrator: - print("Using deprecated android's vibrate (SDK < 26)") - vibrator.vibrate(1000) - else: - print('Something happened...vibrator service disabled?') - - def test_ctypes(self, *args): - import ctypes - - -TestApp().run() diff --git a/testapps/testapp_flask/main.py b/testapps/testapp_flask/main.py deleted file mode 100644 index 1f74d1e9e6..0000000000 --- a/testapps/testapp_flask/main.py +++ /dev/null @@ -1,104 +0,0 @@ -print('main.py was successfully called') -print('this is the new main.py') - -import sys -print('python version is: ' + sys.version) -print('python path is', sys.path) - -import os -print('imported os') - -import flask -print('flask1???') - -print('contents of this dir', os.listdir('./')) - -import flask -print('flask???') - - -from flask import Flask -app = Flask(__name__) - -from flask import (Flask, url_for, render_template, request, redirect, - flash) - -print('imported flask etc') -print('importing pyjnius') - -from jnius import autoclass, cast - -ANDROID_VERSION = autoclass('android.os.Build$VERSION') -SDK_INT = ANDROID_VERSION.SDK_INT -Context = autoclass('android.content.Context') -PythonActivity = autoclass('org.kivy.android.PythonActivity') -activity = PythonActivity.mActivity - -vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) -vibrator = cast("android.os.Vibrator", vibrator_service) - -ActivityInfo = autoclass('android.content.pm.ActivityInfo') - -@app.route('/') -def page1(): - return render_template('index.html') - -@app.route('/page2') -def page2(): - return render_template('page2.html') - -@app.route('/vibrate') -def vibrate(): - args = request.args - if 'time' not in args: - print('ERROR: asked to vibrate but without time argument') - print('asked to vibrate', args['time']) - - if vibrator and SDK_INT >= 26: - print("Using android's `VibrationEffect` (SDK >= 26)") - VibrationEffect = autoclass("android.os.VibrationEffect") - vibrator.vibrate( - VibrationEffect.createOneShot( - int(float(args['time']) * 1000), - VibrationEffect.DEFAULT_AMPLITUDE, - ), - ) - elif vibrator: - print("Using deprecated android's vibrate (SDK < 26)") - vibrator.vibrate(int(float(args['time']) * 1000)) - else: - print('Something happened...vibrator service disabled?') - print('vibrated') - -@app.route('/loadUrl') -def loadUrl(): - args = request.args - if 'url' not in args: - print('ERROR: asked to open an url but without url argument') - print('asked to open url', args['url']) - activity.loadUrl(args['url']) - -@app.route('/orientation') -def orientation(): - args = request.args - if 'dir' not in args: - print('ERROR: asked to orient but no dir specified') - direction = args['dir'] - if direction not in ('horizontal', 'vertical'): - print('ERROR: asked to orient to neither horizontal nor vertical') - - if direction == 'horizontal': - activity.setRequestedOrientation( - ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) - else: - activity.setRequestedOrientation( - ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - - -from os import curdir -from os.path import realpath -print('curdir', realpath(curdir)) -if realpath(curdir).startswith('/data'): - app.run(debug=False) -else: - app.run(debug=True) diff --git a/testapps/testapp_flask/static/colours.png b/testapps/testapp_flask/static/colours.png deleted file mode 100644 index 30b685e32bf52c6e97726095fc8337775554c8a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191254 zcmV)1K+V62P)WFU8GbZ8()Nlj2>E@cM*03ZNKL_t(|+Jt>un&e1t zE1~g=m*V~JPdE>y2m&Cp&+l(M(_LAaN?j2kF8JU7`yZmJSgaxnV6p!GrhxkUAFJy7 zZ&VfjUQ2v`i@#U&>(1};{@Q(^{2lA>W%BM-_WAW~lYU0c_o#0}$h%EEpI>#q$Nir7 z!%AM?+u7eqf1h_7@Kmu-IDdz-_dI`hH{m(^OZF*vKZv00qqC3CkN=Lz`Qh0Yg(`ge z=I=Y83M}03dVa5}p8k0sN8IlT=x&1l8Swp5f1mO9x#&$kzx%}D*8Lyv+pppGJ?~fR z|0l=8w%PU*WS{i56nKvAvP0zAa#GB*xwhufA#N5_lNCU-0KG4Uqa3;fb|sW zzwh^-s`~Hyj0bi9`R_a452~K?v#NT4`tSS9|M2(c=lk=6zt{cu{rBJBRsC1^eplY_ z{JHw?{yXo5`Fp6pKjZm+r_Odke*U-b|NHi#ZZ`mbKj?dW+ra(~=QDt1+kpbl_wVoi zU*-Fv9-!(u~z4G_`e((DiUfe%}ReZmH^SjU9 z|NcIA{BvH%zqgUs@%_$geV_CG72l)IHrKbkfA3k}UB6^I|9)p~!})LMe&XNzozJ6f zU;TZ?xnaKjJ*n?+`-bu!=X2%vzU{lO|DIRm-?1QBc;#_LIgTv{Oksn1vVXMP8pfW1$}p#}7k!+odoImNkedmF#~b)KJw zT=so=Kl?i#{GPin`klRaDy@1?;;Fse0yt6&!fB&M- zyLLB18ZGJcObFtu@*5LPYE>{UFF&xY9uji-%@go2lgD;XE)edQm3tGWQmzJY*OJ!I$Y&v7~1ba#>d&NxKhIdRVo*tv6olO6~G zgbuD~#|(12f^7cjw8b zKGom#`SvjmFg#%CfWKP6*0&`O`q%<6;DiITE{O7dZ~;^czPc7;i(B6m*fb_mce|Y|FGYw4fpilZ=_9>_jH(p?& zPY?=t0^^oV{T|0Cd)mL=l%5_JpkI@$<4F+7Y1QIQ#c+v5>XJZl4AEx1wZi_VB&tTJdY`N9~_1y5DAi* zitikR)z~4B8wN?)KhEIcGJBAVjD8^?R&po@2XZDiLrHLX4?MMTOxwxl?``rDc`5Bak+tiD;~g)i+-^LZ+Z?NfKr9|@K!(% z0gWsHkZcAMd0D`Y9qqiMvx?uoJ^y>;SUmOjka{juf&;_*dA!?&4+uWX@(2ms3LjwW z&nN{@$lZnu`C3XC-m$6k)ItV z6ypxc57^;?4P2HCvLJ$?A{YZG%vDhqx_v&O4nwA_8x6GlZ3`x&RSEj~abe(w@&Fd_ zcAivJMy`a}RMVh0<=-}!;c~7m(=~$Mnxv;5`^1Yq$+?pz|9pKMQz4I!u=-eVXDf9Cr*_EB<+dcB|tA94qz6o6)cjZQ2HY5natXOd}`kb_fWQ4erLFK+7GOA$*JJINVW z7n6l)Rtuy7zB?wRKZunf=<_jFCjo-SRrQ@*MZY-ijvOQCM#K001KcuBc^H!asgd&K$V{Fi=PPdl@0>$q(536qnUod^hNg8VlGDmW7Hgb9r^%O~3-50Ddvr z=U~_GMd$ELx9$02}=Oq_W)Lw?Xa`Y0g;$2+Jgq^gL%~BgEH2v0TeC}>~SpYSY9Si zqzL`9W*POpE}(^er?am)zK@N9%UQ?=eeOV*KqGMD-bTGspRwyV0=|oz_q)fvwDHs6 zb0}A%fS7w$ZLHo#bI1!0n6ydAdswt@Ir~`5`o_=x zocQ}Y2D1oVxF4pH{U9{%jN9z4x3{+)vL2ErSWV;88+6&=+-ocr?V3vtyD9^K&Ny;d_dY;9IZB^jhluL}HbB(0; z%WwaV5C1!k1Z|Z0oB8a&eG7gJ4KV5U<1+69d?4vU+IvC()&yR(F>e9i<$!^u;?XOt zo&JMa44aB>WP?{*~^*goF7K_K-dcnj@4&U_jYsC|joNrk-x#-1Qde&`#`ZAV+EHsa!0VT3cAqD)z0>953*Vj=h-&?Ae!xS1sK&>moJ|L z#7D~aL^FG;1FcPaD3=l;3!2y`_Z$u;Tlcr_5??#;13As+C5u+FXgXl<5p7%Pdwr|v zhdwgC0PljgzjN%rF%m{-_2zgSF%o`coLw91r~vXTdgx#o)c3^I3_<|q-#@f%RaW!? zF90*v@&Mtp>b+o!&6Hint87G;APsU^--+wd1AaO?zDLuBtNFV>qdsdtu=ys77W72C z7Y`$OrzLc`jr@L(7g?L=1=QJUgFt;8_=p#O$BZ=nm(wY`zEQ8cyQF$k`zPP|8~q*t z*Q0Y@hE~VI209UX&I>f=WXLry?D4AMdXd!#Am=(Z3hn|rpPuq0W3cXM5CR5MPZ(@r z;AXloMgZQ_KDIm@4eSTo)Y@nJCVF3iJ44j`{s{HOIs9zAq|8_J329 z1FA4YaTs9ztd@0b$OBj|5~Yo|#{EI=6A*-roNZ$2!W_+u2A~#(ZDYLP+P^zhM^N>u zQ8Nm5(YRHNr?1Fzf?r;f1wNXYa{VJ54lxeFxO?;k6H-W+$kN|;XI@hW0%uF^19Ve@ zV90+`ub+b9+WePHX@~gyTc+DDztPombJ|&u+J!CD0#o@gVr)0 zlLqM9^oU94x!cvp?5UP=JcALRW8VvKc|KG2kpapWpzO1mzwLeT0T4FmqCdx*eZr5` z;K!ET@gtp$m+P%Z#}gx*&(_iO9WfJ06&Uqki);b7Sf)ED*C`$iBg=s%WdV!|a3iB! zV`i@Q5hjhJSIDBeI%03t3+=>QgqXXw)!iXQOq7-5(xs0&Hb%m}%kiCPDj z*I+OPT9_-0i%sN$K1}SljSO?i5ObFTbY3v9KA6w>2TYm6xEIU!$pyf9_I(!yYci>M zsMQQpbnwa*@~Bit&MVvZjM1%{MHV0!&m2PZa>2N~bk>!Dm5vsWq7O{etA>wDU{Ut1 z+~~|KbS9aXITSr%eCAo;?!X*XeExLY2KMO6RCCT!9H&a3Utq>iJo&@hSR^^^hr@_+ zF^48hb#iAVSOz9J#F4+4C>RCrEZy98ag8Z~x@81!zBE4@-JwJVgf(OGe(cq5lz%60z)F2^- z3>(o3$WvD@#3%s+Yp%Cb-QIHm@&`0aoyPD5!+*z}F2`9%%18eOF|nNOsMucrjxur< zXY$w=qLnPs7aoua{CeVWWl{LK1;^k{UA75EmVp(hBoLc@)Xzs6F=TXVbW^pn^$qRe z3v;~Q`{V0tNNjVatJRtc^K(`>YpUBKCYXuidQULM?bkG8w$AzaG3GUi1@kz5AnoUw3HO6xq2Jq+i9AjF_WO0mn1?bqS{9BX&mgE5iRV9*+_}JtEah+B1#;km7MSV`yZKGpfslrX(C8rUy)uiW(S1 zghgxy4q^0$K}XF#8z@XB7t?$pV2c=r^A#=W?i zBKunt7DF000~p07pzw0g7`9QU(^J9JRE*7H+;M> zM)JxH4x{$n8z8zobD+n#=8S%YYH(IgHL*JWOfrgGm_i4sih^jyfO5w1)nN($Ma9JA zG@@QAz_3sy5TJ|zG6uw;*ijNE;z?$k%AP*mD4O~~s@>-XL{FYTFz+}Y19=!f*hIaJ zEKA%AFwGinUgBT?l^M!WDpwsOT>+SECLJWRelOlv%^(+3DqO=xni_Jf;Vy`>=drA} z=u{+K=(C=ZPS(-nVXj@YWmkI-T#przG!gTH&ZaxZ>m7Q_EdoYmg=@+M0;`+#Rwn@ypI{2`)jO#6QqXO1;RMu zu1>`ylb}i%DA@RWzgcjI41)!95rBY6nnqOtF7v!R3l8XdS29c@hY?|XNa-!OoDX{a zfDXK5`>sg>J^D4RotZ`G*@QAOR_E(|4~CQY7)H{i3U~9K)6K@wX7q61)79*y34?Cj z@Nqas3et0;aFAL+J+IXi6W>D|*O$j5N7f&Ls%q22aRQe)acSU?o-rq20WmUOvKzu} zLCGS7jU?T1{4KiDfT4g&sIf@0Ux$)OC_pgn+-{sq@TEGy^hKlE;BaFea4ChIz6LB>>JKp0iST@aA zmFF7H8L2Sx@q%P(iNQ#LsMUN5#e+O)do|i9CT1h5?VuG|Mt- zEeb})sZ}-O9po75vxzjHr|L~J6@&S{SmZ+H@b-bOjzq8fS!H9gz<<@~AtU%f!Y~PZ zA$HJ)&Ou0llh9Xq0eSYLjWomX&W=`j)xxqlqrWL2xiEjFfXzX;>PP!>rGs%f&M)FT z;GgF2j}UsU&hW7Za@r!nX!r<_cXpuW#Qh94oGie zjVOb{JH{B$BRsH-mgQokR#H^ie{Z479u6JiaMS{6QSQ(~T<6mWk$S-4l7Nm6^zZ2! zuL^x1Tx$q1vgE@obx_GRritUQIwk*(xvvX!Eq4-jiydPJ&hd1G`}TepszAKtT)@@# znX_3MVp^w&YqDy_O+%MIfKnR#%#Jk)fQ0<}3RX?ryU%xRJ+eB!;EZfG4OlV+WdU-S zw#z7;Q{*sk&;4%t*^dsp1UxzeC@WHS@bzQkTv{BDW&Xvr^(=bE`+$DsAt^H&UftnP z+2{E#ZAwsv@w5s`ph^@>m-t;M;(7}xC>aE$q0J69y~&g5NTC@BGcN(RAOSq775 z`uiGk1H#YS&4BdxnkSBR$MHNiL&Of&hFDTWkoXZTa0Qw^QynoOJ~3d8rCMkwJY=~M z^Tq1eY;>`jGOgUEXMnjq#|aOWonQuU4u(n&OlB-fON6^_XTu{1ri~1iQGRD6 z+$uIQ&=whVM-hx7ph!XTk2+sM%%Rb%SZpf7U;6QFPeh;p!R8<}?Wh^yE4jE5D} zhM8svM&Qp(LdJZ+WLuZR;m;;mjM>)S;peTIXR=KK)2V!=N-@z2X_h_n)Euc?j7Z3` zE^pJ`WjJ%81_)Alj)hli1~B2H>0mjDGUkxhqTv(0#vXgZF5vFO z!4NZ~{H=_FQJ1OY>k4h~RICKtFrmT9VO%hHv49L9a_QQR3@q&*H#&n$n4F6`BlmoV zpV%8tY{~~uF6K>W?^Vg@L$U`&vX*pCdZDgUYp3p~`wNe*pq7xlYOSOS>fONxBXjL0 zh8gC9ym$l@mJo-@yyVEVL>GA1C(j(YPVI${rS&t@nRi{{+N*1 z)j5t^H@(vNu%!ni3Wcx5c@~t6MXRRcS2#dB`#J$o19!~#NY}4v2+KNnt2~qMspod_ znh686>NpJM5hI4CK8EudBV&xP>8Df@fR1*#-4W^O(bhqIK&zAUm7G$^%G*Tpq_87bv*?4599y?5R$aWf?Iuts>}@#lu3yy$nroS& z!%{nCHj@bW>;=I0d&|E11GqlJLm-9|8w2fCUh@Tiv$wRdKSr${r6q%2G}T%$!q=uJ z;wj`zcVPfoFm4XfB~w-{X;8;P#5|f|T3obATAg!ZxY`duM4w-3+Hlzr%X@(#`m}7w z2`yoUiK`Sy_BA$BNMd_kv_v;Ysol(xTTb;ic36;tiDkUqJ}+szd-4M)ubo(p$Z zF?ST%Ad%a${m0~&*t{q)w-|t7dE2OcWN4@qwNUD9u<8MY*^BHp8_ft<)ras93&*I< zLDn|9_C^hY0T?lyz!2@sDjgLDh)J)-K2&hukt~{}S8+puxDl&MzC};f%<)!^wb9YQfRI*9Ltl< z^n|>v6Ap-A?$>tj3i^1Z0e(1x9kA8fbz37F57ri<<6{kchR5KJ zlNM`azGAjR5Ka)VmcZk7iZnx3zw!usM?!ND#yFV<9)a0nlh02@pR50pn+EW=iJ>$y z1sOe;MvX9#%JYo$oIOrTDBQp_R?S&F$m=o2y;fl=Y@dywFZ(Azj*fi@)gi_$h^`s5 zK0$ihr z3J;11I#HWtK*0c&F+;2-(Kq(osTon@CMMdLckd^LFS2a~%QaV#kx7UQAKnZzYFNqdmuXzBv)UaV^QT>>ph2D`tl0Xy{ z8o~tH-|LUYPt6(6Qc>0}T}tlX%td@;+-WQvHA|3Y7I~y;MI1 z^dlyWhilxU$Docx!R&D&Q*#cs}hI z-*G05MY62BqGx-^^Ye@r&$-Zyq<8b$e61EH#Ol{-F`z6al=1g;Ae#H@b;c3ePfS@5 zgvO9#j2vJRuraZ>kf_+{cWg|_xDF=ors z<^8~04=*#WA+i^LToM*XcDDTm!t~=;hjscQUG5mzJs1sOCiwj1Kt9#lhT3wPFN0x`i}kpqB17b4*W0ko|<`9FS)ON_s@H1w<|LX4nyyXnJet zXp-JZX;r@CT)|)p#|pM)$TTeTPXH)5?~`Dt8FbAC2fkrkVV*OUOdRcRpbv=z+!E=c zqsR-s5FiX5)pKb1ZnWs}=p*qt+If3lPaXfn{~4eQ25|Xr&%$nydx0b?LZ|(_eQv{v zem@Qd(QD$$9L5NC^btq2xt_%ZtW0Tl!0OVOGbY5ebljHPwGo04fO8-4uPjPa(Ly+v zq#*H_Yi?Z}4J*R!h_-zS-jKO}c9|ibFpSYQf4YKg-<(C6jOJKn^>9?z@+++7OTYBZ z3H`VITzY`r077x@yHNu%`_<>vH9s)Hz_;+DjOmEbrE&8$_Jf(OJ=yZcx2aSN&3vQ> zXL=^B1_S%RK1MY*O42PhJZ<-FgrQ)NxPceSqji{!77-bVgA;YBB05s#YVJn$HfO9S zIr_eHd$k0>iKjG7thLkwcii(`m?;Bq2=)#Nlv@VyLMjUboL2o}O(|j7hwb~8{i*|` zw$4{Q485NsK$ z{E>Z$rJ4-uG=R!5 zDmZ>r3t2V0jxF=hyMK+1)OaLI0yU2S03ZNKL_t&mmXBx{l>yV}l0`0bV=qofagNs* z28AsrPc>=UZ%hGAG*F2!OZW|vq4mSN0NBb2u8H-ms~BA7M-js8fzL6{`@w=|LmK{7o* zY9OgHvjs!9&ZS448>?q+3Y??FLF}O!ze^@yOnH_@K4)32fY+Ns^gCF!tj5*cGKp

    d9TrAT!RoadbHL2?-UrLMSmn#;IH|MW>W!Yx+j(@q}sZ%J(>yWsh$*jth9VI#AsXRsj8e z&I!6rY1@vavM{mUvoM9jo06s7S_sy~u z)|XC~#Wa~OUj9IFaE%txrAVlB7a$EOmUFisYB{m~1SX>r9-SHW)yem2x%4filap z@%|nrpyLVW>z2$u&c0jnx<3npWcL1hPMPSo1(e1U2tKY?t46G=i_@3`~vk}Gxh}y=lM#Vx4 zHn;5yjEGHOI&eNA!|K+rIUt~`7~%;;?Nf4a&)$`WQ|gBI30{vPy}IRmC6tojJ{jy- zSV8qhCYN!<`*@@mQSa#Xu?f?T2}K|4#q@7cs#*H~ZwZ!{Wm7hAtw}LoTXi_%T?#?& zxh9LFo5IOOedW&r1Q9+o2cXhxNtf)9{=!RD1O*g;@1BNP;*AXtAj<N4~y^Yk2XxeN_Bw^W1q^LiWY>KK>grnv!RBKenHh9?Z}uW0f!e z?xgF^UT60#tc7D9LjAo=psC$-QGs%AGVJa5qW0g_kU&cqw_C}=T*pXhw-)yA^$VJu zdJN=Q&CO@)`1W~2H=FZuWgb0LPC$M>#?z(J|BuAne~;7aC|0l2?{!p|^JC{X8#y%3 zfCY~cj^jS8e2|U1Qi6F;F(@lsa33E;7S4(lnw$eGvdq^7Q|-tDx+ZmnrqUE^3G<{^ z5;dVW>j2xO{Z2=BwEb-9S|zrX8O$C(-nEbuvhA@1trC$b1;clEJ@e8(k3OcOY#S1o zWph+o4|2&vLmyOTlkt5jeRC|G6ntIAOP}NGu}z?TGG6qDUGTxuq8>!)@ny#z_4m1j z%{FM)P)6Qh4{vU-o_oenXny%g*!SlA$~bwJo&3|S;3jEs68+H z_Eow(8|coUiT=*;P3E270x1F|7F5venye9huMzz^1Lsnm?vv!-Q6H^{nv*8bx(3em2 zw1y=_vq=X86UW>i2mF0W(fFwHy{Ah1}D!69nVkOzF$7XJhy;4&-Z;Z>kv!p*Eau74J)WcV zZ(&S4`UWv!u|jS`lyk}{Uo~C*)z^CmW$3y%`ovkq#$8YzPT0JFoD*p$y7SKP6V^x! zUpW|8M}cn@D?DCEtG!Y9^JI*@~snamd5 z(V-dqb%}#0QLDL+fK183!B$O0L^pj)7(B{FZzhCMw$jAVbeO;}XWkq9VM)A(HPC*a zme{tRAz#O(h&qENRGFE($F? z0*0)~aO>0N5zQ#2hrcgNiIrw6fE0eSoQ@DHLr?>}36l6xFy z@vR>m(!U8~q~a^mAuL;WFG)Eq**>0qJzeERRMURHS(WzmmP`>5E-m?HIi8m6m&T5sVPO-MyoE z?4=n!@##lVTX)kmC}=o=c#mW5lT#N^&h-xJ;+f$XJ0N~L)lu`z8EjQ0+!bl}&{kFb z?>pUf7t^wo0ggV^kpx4H9zHEJg(ORE>N`6A{1=EcD~9F!_K}NAR>wHyse|e9e1=Uy zK4y$wKRR%mel`jS(=5?$4gHd_C)Pdg$NAg;EnngIn7(6doiLD6#%<0KmPyYR;IMu` zP7sJJwubc{+FA)|Q*)oMF`1exc_aLj;$>6g&GqQj65#lxVfD``aCus4)QXM|Br(d7 zvH9pkg6$c$u$m{^7PD+swe|w?vWL8j6~<7Gt*_kmrSDw77h631Az5>7%`!ph_nM+# z%SaRR^^uhHtl<( zJpDecXurmkrazk6I`*&y-L+HC3H&1JiInzTJAu~nNPCpYQRlwb9szy@MxnI(#zqKa zxp7e>Rw!#YwI-VryNOt~pAO>X1YMF;*LqLE3RnS*`D?IsMygc{jZt%_m$xggu8)u$ z(*+I;nI6XTzDJJv5XlZ$z>pNA?nXb?Z=H)tx@F!#UDoM&MX%4nSJlH~GkKe5lL|0x zm*9-B2Edq;t7)weY(}i2$ZQ>jCYbpGK#LeJRjP|DVnxnr-xJiDCvimemro{Ayn#N! zb%E*iOGgRd0!E!Wpg-Q%4+1SSrF&Zsys&x9m{sjFY4pB7ShpSx6k*86k|t&>Yp`Wl zTiB@H@AZzqnDWlDNRwb`Qmo0ZNJmPIN|!4?pYRzPYZ)I8M8KqA)gv}yD}V>gnfeHJ zM>5!fR|CwiAMYl~7#T2chV?K>dc+=jfpP_4i^l@(^P~H<(#z*Pe{R>%-Cc;kl^@f2 zfuX;ySwF-0I?9}2r}8LF(-&mvjzN@rG(BE`=oER&vIV?a_#>?V__f$8wQ__>tyGq7 z@&DP4!ilcI0&;L({bxlbV9nXL+4sibEW|%U5)B056K{YAY(D1VUDAjPcG~;~=vD*$ zSJOrA61u&v-)G5Evn*Rov1vMG;Y8}U3J*%aBWu19A9$VW3IO^t`_%s(EZ>8)bf88R zCnTuB_Q-S0Z1w+m)XoUHRGmPOb0e102f-{b<`;mGP|)3-)%ukZb~`t!s#(MDXUXCV zbYoW+FDguw;(}w8A8Yjr0ZZ*t>sY7&bQ)$+x))r&w1JuoC^ojU>t(Dr(8{KdsF?aV zm4)lq^GgN8?;fN2#-1cA89fPe!|K18=%FuEH{ zd75{4?g|d_q{onQL)tOGAmJcf*z}*| zE-t8Vby!o3v=ByzMM@-I_$D$V=wSpsM)2<^qpAWtDZx7!Xw$l}oPO))>)u9LIvzVA z-{0PrA2kU7-oNh8Oy8+CWo)4$(w9ckHATD&CDTJWmOSbRSlacbQn{5Fpu!onGv2?{ z0%=IsUC6r>RxAS%wrOi2ic=L~iA!(rd!3IcDiZz}QuXm`m(=6jUF7Q%KiBIylF}b= zrB1HJVhEMtOmOa>|WemWoOCs2qgZn+2WcGpJBk9@R z{-rQx5`ZA0>u(O$9O*_p;??_1vD?OPsh>_k6QW+Fe7Qr5n>$pZ{zD)AIr5w{wQI9? zcTh*qb&-zF)N%Ec9fDVOfQ}2wxM^uy^@@fEm^cxm0)>=Y0n@M5z}0qZ_4i+p=03f- z&=3KY!TLGC;`JT&#-sTcL-sYv_A}wzbfWefb+3ef*ILFf6U@~7?XBaKY5_s=dl%$GJ;0bZia$Jb zbSYEosWeO?93V)!=Wgp9?Kd>872}xR9b>~v+(fU#}J~rz0G0Wdz&TJ zW!WzEW%S_@lSTc2`xD!|Lq?ZQIcY4C|Aw$;aIYbMJpRHGI@(qx5?m;|bOx(emNb=Q z?ov$xt74JLmtYG)PwDDbFs-PpVxJgN$0Cxn&H~1ugzw_|JCeu^Uj@ylrE_E-;AAH+ z(@77RTn6<8fsTikp1{RVS<>NX!4vxK@s@p1={6r)*Vxgnc?bm*100H%t6Em1c=IKC z-NBCb+HEJg@Q?uEENBn|RHT&rVvXhZ$Bal^dm6BTZFpqxs1`s&XhsSqDK#!tV~xU+ zx`kl&Vy^9*NwcXml}*2zO&F_(1Yqbz3M>m6Ya0}5lJ8~^MT6H`lF14L6)4J$@MG;N zm_vPilnMR*Mm{wsA(dLJJ~G#atWFXC-7h>aJa*Q(NBMq^ja$PJq!lYS@X|Gqz9U>f zBYk%Id1Z75BI;b`99+eG!h73%)UpoWBNl1{PlrL?&I&KC=JGy@vSx6(%P&CsWBe5C zwHHw0#*deCqm5q3t1cew4O{vnK*k*P&6Pc|neav*G;48}g`)tPa%hVW0B#T9d# zU7P4v!_oPDEg0-WHS;9CbPQIMBX>`?$JYBD4fcN%6C`+G#rvCvE##cK;%xROpBS65) zyvz-u7kx86oE_x;y21h>SF)2+O0QJ-62`>)v~(|^S)sQF4m(peI`)JWJms6aKqroG zc!Omi^9b`|-Gn6_d*9Ed{O$~(*vy=49_x%8mRW8srG5_#wi_&nz`cnunw;J~`y<7x zlIzmonxP3XMdN}Zct}A*B@}Oo7~p43(z_F_vK-SMfnYR**?O>lxGUB&^f_Jwc3)(! zZzfXGUdYSKyiIoTWdWafjCmn>XmfPNY}xD2E|31vJ&20*HNCdUYiU%}OD;~6stBJL zELF+@mtNU(slsz$w)Ns^prgx)TLzQz4B;iw>kGQ4AW>{QKFD*76 zo4U<@vpW1ka@g)FZ&(z6R(@3~F46s<;TXsVm_Ov>F~v>Ym5uieQR-0me%T|R56w2& zOr7A12fi#pDGl$!=T^0bix1ve$Td*9c`qRRF*!H7{9ai+C1^Bj37qTAgL?e3ZYA$vko!$0 z{aI0_U1K>U_mVNzCgg87=55r^s{;#C4*y+{k1HO&xI{N3BjV|{57 zdO=p)UpN2)k7dXQkr{b#-aNzC$X0?V?A%g~uV*Aqs6RN!otboBX( zhJrAWPi>(C=H2Vn5ADxWTE5KV*Psv{Jb^DR-tW2P(dk2M=~=gLvufshJV)0~bPxD_ z^Wb|U)v_$|{t*vC?$*i~WwpOLkP#dZHc6!4;WHc3qf|^>nU!u{4z|wNv*_}pRnx#L zmh|7z+~3Pdl_J4%&aD~ZfOy7YD(?HDXRONOFyu9!Kj;Hkpvw93Gafde|hS{-cn|jfq_5D2ODuNxF9e>Ny>0CErdDoH((AH z$kT>=3{@SwREtQw6W)Ed{uaLnf7j7p>m9cF%f7Csq)K=GiRUjq8wRkWSh?X z_4!e2Kq{N0{=Q%5?1t}jKZgKbTH-Mw-Bw7*1MUd zPv78A7AsaNEScMknP?CO>}UU%<%4}$vfMDopu%jhV|vmu)?{EC+=OpTv87t7;TY>s)c|2BjxX4($e=Ows&?Q0yc z@I%YOvBz6J@%FJ}2Pz}u?)7%zG^Kh5(F<74_Q`wTvUyoR4NVchUwdMm15y=J0(cn` zv%TkNU5H<2p{1KeRz9fl?||7coHt24b(uT&2_a{74Z!HkU(2t0Bb4yPFZL`pa5MSH zkdaC3()8A&TpE<%D1gT3wvdfn*YV^dILoS0H5fvOxfv1~vgL(2mtc4EYi^D-a|JeS zu&kjETH4mXPl6)AOxGgn<gj|K3Swp3YJ{&C5 z&}n@IrXLVnMI@)>JOVS6E<+Jk7ZtHRZ(M&?Rd@{H`s`2U4#9l!hwKg7&qAI7YuO~0 z-}_+kERuJ9W0qmhZD#-bNqIaPyb?3f`^Z`4S;){EP{~rp>LA4G>63qd4+4w=XOWQ^ zGibRk0<}V^tov1H;mm0?`p=T?iMjV%UZ6|%blXB_buo06`3gOrxEbTpB!(!JRw*2M zXLZk|gkX9r`IMK{D`3p$;rQt9I)7w=rQGv~iohGqUre~$Q`tPE-wD&*mLFVNkk&u< z2XRJjz1YJPu+?^#Y7quB3LwlqVJ#=5EppJ(z=*Vq5s<*Z;ZZgsM2VzNz-A>1*6+Jg?Qz`i~!M>-!5HL9d#~ zEh-C`JG5K_)!WwY=q5*5sV;S^w{+Xr!y_umS8%HO+EPHTuRl0od*nT|v78nBGCzdm3r|7D?Id+`^2bVHHp>V zNbA$v(#~hR2E@XO^0fbti;N8KJ9H1nF+gh!=#_+z6-)Q~_V@uAy7&C9l0bcxCxTIZ z9Rc(`Anhc2v;Xc~sz^lTkpoRpJuy|)&wg<1Z)4_Pn2AuOUf2g7W_I32ia+`Y`oz?i zRF$qUGg@;Lh9{6L+rI;%hKBoG`jtWlkb&X*BPGnIn&DKY_*nf*+E^oOVU7vJHgS6S z(7wDI*3bknqtd1Kfpg|gnZpzNng^`<6>fh|4=0@-Y|z+B%&#+?dm!D{H}ArIzd!>M zab#1+ zKI9LNUzV1{MQyYMg-KgMhRw#Y)|HA`r?SP3Q5-=QXWtk$4x&b<8n;{@Fj8x__p4F8q%Na&V%wqim_CtSa)`I7>on*+y$4e8ul%h!mflq!EAZ63?u>3p+ z&m;iB;P#Z9cF0Nb+bbJZ02~KPSIPOVVJ4%avYa^+y8M?!tlf5Zsx4;a)Z>Req3lNc zrPP_J%E4?|{un1C*wdh2G4$6Rcow^W%h}_(T9;py?*yLV9Q(Vh@S5w*%S)^8^R(14yIb&AUm;*a;pR643a32{`gm00J@A9f+3tL`$(_x% zO>;S}hs`A8?}PgAvMI{$eQe|SY4p2YN|?~4kej~UQoDM$Vl!rP*g@QxXcR`XfQZdu zkhjZlV@fgPrdrs~GR+pK(xeYb&2rs6dCz%)$%;H#jaXt=$w z%J(lz8Bvi}zW-iKf_iKP)4B-T-rXI0^d7zM&`aM7`85k&;`yO?KKpsPcbdry{sWv2 zAQ$#jNWBn4P97;^EWxJDdlVA1^*QQ3`#5X(os8S#zCJpdw~HDofpkS~Z`INj5t{km zSV1P(gl)pGgyA*`FrGi6P9>Kv_&Zq&o3Ml3%&j_w(|=d78sfDy$YBP4Ir@jb+C9GNuj2 zj4d{A2Xcy1t8C0&djdUCQ&kqOfO`-v^+qeWwij3^)RAb7qGlKi_sy_DfMO(Xt9t{_ z3$nT_npPxjQfXGgz~y24C_|XL%iztDYD6!e0o@De5cx7l0kkZ2$ZLLmedG*(U^Gq5 zY8-7*QBPiROs3_unE36pzR~&$lDIF>T%rs4>Co1sRWLGHoeK^Q8^? zU>CDM^wcglXa1&d4g+L_I0RupA7cf0etwy^_`Y70n|{zk31YuwefB0sHHlV~5dTPh zR!+(-dlXpwWOo->C-kt4A}ha=5cF*}ZY^!kRSZ$^!GM09L$A4AA+pb;Ap4 z?=9br4NI5Efh9e+-;JLk`zFZma&j`{$FbeJfIsb65T@_p3vzJ83qJ!Mv`%b1-Am=#GjllGBJ>k)jdsURva0~vuU}r9RSU^D~TP;^Uy}zp< z&%RGPk~Z&LSZt@|7Bfh)c=`@tYaPvEqUNNxfHeuL)L`luy?zvL9fT-Wu>QVAM7)l) za1Vl}xF2DgcJR})CrB$cbUo>6vf>8@qstE5N@pX8q7w9-R>SbnG1Du=Tsx>_51m;= zgfrGkn+#}333NNpE0WUj+TKEJsf*CD*3kaE*RMBq`@+h}mX^xVBE?hQGf=OUry+c` zp~iK9y7#LxYfXQbraAqF7XG*Vdx5S@!hy<0nnLQY2pE_H9HMRYAj6cG=4lAkt2fK7 zjQlR3=mWs^}LbSWi(7X0_m67gl1SSWsu>Hz6x#F>89 zr7FkSzP=V{A0q_$SzX>;=MWr|pZ`KId`^}FF2Tc!Z5f1FTk(!Xk_{};svm|c2dLx? zEj6omw3KsEmNKU5F4ve?7E!~nBqh@bkza(eUV!KYCqDq0&6j;k3z~j?flk#@4y_p} zD)UEU$&_KNl#>zXKVT4{{ht%Nx-I!C*gXYjIJJr;nc-!wZY!g{OC#froafg*`=y63 zS3a7!o2I1M>0qEF=d6aMFd;7zYCk0lDl3OxAKk$F1CP zKN`k$ajuxKldDz++syJ{{Z#7xuGi>)Kw&2R??scS$7EbYp4Z13XA>IerG-FwM+qQB z&f-tMb9fkq)K>;q~`#J3Sf}wWGp4!CBCoM&(}xn$)>T%1WVbz|D3v=Tj#I5 z`7$eBSwcw=*E(+&U`h_v;JiZ?&tNz;v1~s>em1$((cnzbs@_J37m~4UtiS-en>=Zi zlw|SkCVv2!5;S2A`F3@-bDd=?!wgnu^JV(lxEx@8qk?=tl zK0r)KG}qFoBn8z99JQrfdm_DDOKvK$wDA=$k4EUlO<&PPDKhXF2)Ljvwi#H(heexP zt9XoIwp!-2wBY)iTtk#I8!~!6y^0Q|#ItANjgeB(<&f|9^8S8h4fspri**Xb&jzt9 zt|%}-0CBlSGsk?`r_oyci*b0*EjV$AzlU61}jiUX8(VpXQ>zW0Slz+2y+f?CqrHsrP9 zd|lw7kH6&YSL4E0{>-x@Bn{c}qxAsVVNUuDbNxl@Uu>?6<*Owef0rzg);YhPXgijC z&ji^%rS4zIjmL{o1siLpe{OTm^B&>M%7Qm#y_l8-Z2bu_- za@Mol=c3(&5V=`Osg;qVmiotGuoJrh?Bw|qQMetQh0QF_Nx6|cw$DWbHNH=(V3f+3 z7bYGQREur z-@ORc^RdG!Sd-$9DI-YDDaEF%{HK;uho&idD_-84Pog;_Q~bW zJiWd>n@L+r-5AMWa0iI1Lp~{}Ol;&l*7eZQ0FSe8D4!5W*_3)Y91=L6zIj2Uye>cU z@@d${v8-;h0iM^l(Cc5)PDnHCNp((a0)Nb50CHsvXIGuySk2!?1xmDi55j>XY6}!F zci`;8s@4;&hM7~!*kZq{hRCVw&bJpT4jfVu6V)dAc(b6Ik&*=wQmV3WbZOMU7)Sr3 z^>Y-$PybfWX6Lm|IGxCwoewcT&;Vy)uP$&iko5LM3?E=wC!qCDpgRF^d+^+!m`tbo z{5U*}WeMF!k0-0O{KcB?JmiXPE;%GQQbjv3M;{jG!@*oQuc=~RB4#hY#(r8Q)%@#+6RaW9+@nWN%FM!QN_e>`}ts4Nl{d$GxH{0$+(Er>l?3r zv)PvGNJh2HOovkC!wWtb2j2Ehw%<*r=aw9dp0IKeL-HYhL6!<8E(OU{8%+7%iU==S zAwV^PiQ)7-F&M0Tdj|X7;8Ow-^nl*o23~?CT_F>)y_6vnS=)m6d2FWceII1mvsvYa z)EgkUob^#)cY`F=h0p|j;xCG$>t!u}Cx6e9!Y%72ZJW$7wh3Pc;G3v56_VSG8fI9l zyf(%vWl(8wa-Uzy#~&;I1yZykMx@#fh0J|pj!lubJ_SvyLS<$AP6=}{$!VR9%|$>8 zQL&w&i4_b-DWk-FVdzR)m+ znB>h5se8dU4ePz+1GrHq+sgfeOH%k?d47<`iB9aEYsTkX7?Ff@k( zMLrDizMQ5SS9G8D>oL4=waKnT-kV|;4&J3~_jeSYg_+uFU?c#75sBpN{Zn~U!Vv4! zT5cNKoxNpXJT-a=Bc`~lalj;IBoijGBXSb&*}-{d6xc~$VgHyiyI!wF;ds)hKb2?) z+K|@#sAO5aR_wKv8uDxU@MylOm~xiTk_XPHp2YGgD*jl}xS&4%!W2srcPa_tsk zM$y17X6Q;~eJCS1WnX8wr5ySNKB@9pDwrMqARY5KP|e3Kqk>41;9K+H%hYLQO9V^8 zzqeg(D9OqOew_Zm2pQ?#a)ZUaipH2GNZ4YTbWu4*|)ziy_CZ z6RjAX--+i>=G7iRIYF62M8mW;r-iDezmF8#)Wwt@PV=@sO6EZ)yX3$1n((cH{9zHw z?3zfYr}B~&ck6KZp=zqp?&BeS;iD{qU8A_zq8o7k%jUhoQba}Qwyyf?5R6#+`V`b0 zpzBUh5p=<h=Rhz4Yb&z+TC4phWxr zNNE_$_@fE6o_wV@yQRrh@_chXoC9`Zk`XNje+jPCrE5Sah7M6=C zmEJ<=wS|KirJWS}CYPy8M=$iQvjNz!+}yFD!{NIAIdjGhCd4*yEwVSH8xOVCHRyx7 zY;d+~AT?_ZSVWBtY9u4)^U{t!icE|ouETSv%?wqRgJ=={So4}hxV}e0Q5%kCMd4iqlCA1*gZ&uB^8g$N#5!?WL-y0<|ti}zG`R1;a zdKtCTuY(0ZN=lOb5JgQe$BGDZ*5&p9o(PFJJDIgAcR@p#xa-AZ8vTzHL;H+@fz?vr zeIxaWI^%BVMySwWS)*V(gJ;mJM0ir5p$);?v;?%Y5d^uJYeri8P0dlDB^|v& zoiyLsHSp-92yAKu$Q@v`Y>M=+bahJU7WB(JP@Ar^j(&ta5I@5Jwg5r-I%VuKX-f@X z$YyUviSZ3^AZFHD68!=lC;W2y_2wi%GiRsfmas~zC6w(E+1oB1HWwFO%Nr(nC2-sQ zh0S80@--EuoT1ZkRk4t=%;qK7csNdipifqzu=f7tjgiBuiVNNl{=cvDkBZcuMd}n& zIbs7B+w4FjU@^M)(0zlI$zP7|Z>CUcXFeu-E6#?pbF`El@8SuE&7zG@`w9cI(&ha* zR)1qXBv?BQXDtS90Aur5+1>k-faxWt83I#4z-R~9I5YfWcB;J3PNlKUuYhF&OxI6- zP<9uP5MjId0gsBSf*QSl(20N^GNo-gmmex<RVSn5I5vDm9?i|&4|wf?2@RRxGH!*CRzJCzOQ|zzNde25k2Q;`i6JAGNY?uD zeOt$M7fT$(pPIu$C8gQxoi$`o2FSXhhpOz6_;nYEnc@O@ zv=cQyX2QIUHR^A?Q%<~%p*3=!XAt(%S37jeSpN)2iq3x4*H0+G^@+owCXLy0`a0zW zM9#M;?`UVD zcwhZ}E#?$lF-i!~U4s|=vmP+sOEBMR3l3`f_pUui+463&Y6?x+L-_RWXa57i=+Fm+dRgmU zMx*XB2^Y&9pCqh{9}q7ibm~pI1UWQ8x4m7Z1N6n47k7=4^2kf9;(%@fCv|s8JNnl| z&;h9WU;m+oGJES^Q5F9l?$@h0Aozjsp6ar)#U8M{Eu6`#*6k%tqyE94JvxMyB$qH& z%F114jZWFxxrW~&27E4!6=D0jOD3!5@GV-_)b5Eg>SO(d2{f1P^~*A@)7-bhrZkMvSvwZzZtai%z^Z7_oq4sS zR#`)$ElD>bd}X@>t=2s-EWnT|buWI(>pOfz2ER6Y`HVe`H1I?w$P@r-Zv2j1#I7onLJSpk18&A>Q)?5Ypxb0K9zJs;vHz zNg9(*#Nvx%X&;*Itt)8iCK-90=pMsL(z;(E<@>f5_O%{BlFF2>wWVsGdy2Y!o6~`5 zA75(69`rKahkokrE}b1EJ!rI4@2H%i%PS95miL2&*^1xqe}sY|1U!ahd-MH>b&D)J z{^U%3-vZXxh-zONHl{;YLrP>@DV+XxbFZyKf*D!jjFEtKCJ^SQ%mt5g4+H$i(#hYW zI-Mwn2W4oFrIWuIMf?DvZvyvo9HrGj9GoTf%e_2WStd#q4l)&vZXH?D9Pd+9>s^0% zsFQ9lUZ4_bfOrC783~;73CZ%RCaZ^e-?Jxk7;2_fb`1=G_rtGOV+ADs+=&pQ%dwwe zvfkVloT5)$C29dos0b~vy?LKcZ{4o#5Csm#hA--G8AP{*q5i=PSIDABRiu2&2X36P z)JY|bj7)D4)4YO5Cfsg?h)U=dC{b@9ho{kej+9xrcstmnBDc`O^yb~o*$7prA7y3D z3`B-oN9$UiWbtC6tO5)^E>BmvWUDgV?Bc8L`+Lf!yhaQ$J%o|m)t%N^vRt$B<^xk% z>7uV|PS&v}>Mk_<03{tCY1NBT^CN{ygfETPPv}RJkV(?428gH6^1K!jfYpgmXF~)m zNjO0y^!U?FZ`rc84!!niubB0ErKc^lA!v#=Woh38-WEC-Aq=VnqP=j!7U}GoZxp25 zEGc4eY&VmOef7%wtY{dzCDMAxXV|G28jvP%^Pj8q+x?7ny?M|39(>Zjhh#Sy>x$gH zije(b^%<(PjVUV{7_*K#mvMESgCpQ^8W%9r%cPrU`O4QZ8N6(k_hAZ zZNZGu}s6L3tgn1qQXy6D0uiNWy%Z*?{e0b(rO}Cz5Ys zS#uHgQK#(*dwmj{DNNDi3x3>>wI66~4fG$DZE4%bHad4ore3YRobqC$g2zd_VnSTheK%Nojbz5kmH3=dj5RT8;0m?7Zj zgk;-(KE$#h?(g!X>=(AckejvAv;&ahbGwd?(g`h=SGh4sJ7V zRex#ZT1f2BZdd=H0^olHUcB!RQU}vsP2Kp#BAHW**wkM+^9nEE3u&=@MZx66Wm}lz z^z7YQWzB#Zx?lzoJwCVK@S0t*<}e%u%HNHW@?4k|EXxsfbUC=IwK-%pLel??mwlN& z2XJCdO%U%c!405#$dA!m#+3P~p`MnyA$^TmW^EEIy+HX6>?jbOZ{ruh(b+(9x;3`C z7r+X>yDEmBHw!=Olb4gyu1g1B2|zgX8UJr=l_uzAqv6T3lx$4BxtYgKIIz#1gh~Y9 z?0!ASb>i6f!)D{^2jh1vL}L2U^&lSk_xk%bfObp(w=^_5(m7eZy4}RJKIcqWpD?1r z`}|7Qc=^yO`bi-AKl_~v;T*|d!cTwE0PdVRX#NiiS#Ni8Y;U{|3 zl=9L?XC=`pA1+o=t9?Xz}R-${GTD$*@>*M1Od>>pMm&6P5Fd(ehDAOL@ zuDQyKSxH&^;g-no1~M{Y@=@O-Q;wRzxUBC_lFL>e4l7rFg3TP~K={|kIE@_Iu!OTV z={(pincsT~)_tdJF*KxsABj>%kRf{mBl_tQ=dnAhdoR%afwwCVwhB^K5p#m=n)h?c zib{aK1nPWgD&)s%k?(_@US}R*s*eNXMj-zU?9PtkkHwO`(DLTL^5iP7glV~zr8%f6gQETmM(=(-f3yZ!V5Dni zzEtk{vBCQ>4;Oqz7vYi1aqckdCa?iDE9WkkwX?ul05e{Yokh|o+2Iis;FTGNMRN-? zSR$3qFfCzBJt3+E4coFuPR>;)Y^mkTB?}mak`TcQ+D)TRppuq-_(QVp!fEaDQw9-3 zg5D%uUJ!;@UNE1YK5+rHc)D6fnVZ_yQ*?{?W5I-d%-}$W#xnm20}|A_AbA2@{c|0* zz}J|MxKToG@T|q_hEW4UOR>U1PZTWDhIy2 z^wFs;z|2bx`Y6_h+Q8efB`F33z-pP zuRGCV=_{x9V=yltVBc?Ey^wwH?>m)^NYbmPbv0V}7(lgr!}tE)Z%di=qt8%NSo+$@ z0ttPJ&VB}I4Ch#)$^cP7uD^R6vqZV)e_*97c^>!}`C4F^gF8Rm zSVyITL2yT`rd;GM=|7}cJ@_EGLIfM+6#N5Wjqg=a3#kah7wYW*KHDCo;Tdhf>Bh zy7e?H5-C@tzfFOb*fCK1<|?6eIqpqlFo4|t*kgk?y?STy4Ngl0WCPi!d%WY&*ig<8 z4D|Oxg9h)<`9SMnZmWDBL&h)4!#!1){h-)13qR0i(?*G8>mn@uv!%-C$LPZGz|zA# zdh#I3?m+^k(d&#QzyX`AV0ynXy?uQeW;Djg3I0dOWBMM1Az40thuTf|0Td3;+gJ3Q zsbA{^WTgeP>PpD4UcUC|(GtEHqBwGzIoJsnjs6WYa+bP?@@JPJ5O@kN-yB8sNmN8 zYKT;2J1bd!aV%5SG8{qUHz-@#W_MQAm7=M$m4uz;iqIS<` z-{3G4x5%(Z*^aSGzp%e?`tP#zTWf8SE%on_N*G~Kbl%MZMYgbU>~FOtU#T@DBMA)q zSvvojz{?7%zdKX-)qv>Eiy~!y^(QxFtJi38x5KMi#Mm!~5m>#A7_R)i#@rEhUmy_s zx;hc}qwM*!q1oRg_kK-*IDW9EO5x`PiRC~uOQ|!!!7mKPz?G0HM8>%ic2OP;9~?D> zZD&G&PCZ*%ehaRsUvg*#SXX-pn7EL{erwn)^ogT9LYnI|h^`2<1SQSz0 zEO+0cZa8o9v~B%vB!b=NF3iOx1FF07V)!RY`~E+clPeh(#{_)w@R_{-D9nmlfUGsdI0yz zmu4{u8s+s=ZsW!-ab#kh42MmbZE4j4ttN!POzGq~4E?vh9@bix9>Vv7ke{Zrj+WX* zL4xG|GoN2I51LFRWX270Mq>PLWxnR6qiQxmKJ~AF4!V|Q4CpN&e@VbumxP$z(sTg3=|-ihtCxJ;sY%g{f6O($P}U#JJ4w>Az_h$_1^Gqb@mQ%GTc!;*V? z0mbuUK}{aY|Ezg>m9rES;oAksn1%aTMWzoA7WlsvH75Q3Nqi@Eom=W< zd--G;<$Q8Fy)#f%{|3KgeG%0#?n9#&nSS1;6j_YXgGj;+ z7P2noW8QSN!|v85WB+xIA=u~<9tj|PGXvT`^^cCf`OkdQS0&{8vkV}|rm&VNU$E-` zK3&TwmyuOEh6cFd0MWNv_IeFUVo00xvlW7=AfiTdGc#=*lS{IfQIC8+e@)3Pqmn~5 z)7R)(xw3|m8i?>*bCgY^4U=&I=X|D6zed0#Z36!GrBf zxwv9$*@7m&=Gees@uQ=-s3Y|;$doe;kt5Z{w$!11`vrhD@uGjR)iiFQQ z{B85zyCcsGcG#Ujii+zv(6K^e0Z8lOg%nT^hEI!=|pYffO&HU#z`Q+032t zm=T?!A3&oei#u5IF^HdkuW&33!dMK+P|{#;x%VN0ie(Xu8~Z3FVOE&6A^Mc_^`Yd5 zh_M1&M6$}R9WZH$GM~?P z#{5{wn<~x#Ot}|Py?+PMIXKTleU@UMmQDnsSie}U7$@pv-`!?%nxIPB)0Lq51Giw;jaMRcY^Jn$Mn;)Y1gcpn)%6Ybj zfQtl~34~HGUDe%w7&0WW^q~Q(#Vzj$zx-@-dl+pgSw#y)y7S0+*`(-~vuYVs1UTx3 z0xalJzZ@)(={$t=8wP$%sTRs0uuG7qAWN&6s5~?L;QwG{jftI)P=rUSOLouh~RPy~U_D>Mv z4}3{Ok^b>+h0v=5%SB4}go;~#y(n}|;M416yKRF*ItW0}0 zTaJ#2sU-wBW8{)T2F+{t2=n(*@egCNZG=P+ArVNu1&5q$^K#{Lb6p=q-&!sKrYH$P zd{6UKmLuQi`eXS*U;q30y$t4wbqN8>JR{Xg15_@pLf-p!O+w1WDs>+xT;#v6yejEX zX5~#jzAU9S%Dp9hutpl%QOlXZj=OU5`Xp_tt!3r94Hn`bTs!~5=ZE7vsRdai+o>`h zF^~97*7^V`QgLBP;1A0ieI8DNAJh}QdAK-s(_@?UBa7zrS~G4-$achuBf%1tCMC-v z(?ks0p}m0<_6dpcI%wL!(!-@adQ#DXt?oqr-Sz%K{Ee9F7g~gD-GTa=pMEJ-Z=escHbXvt&EQ@f1r|v<3>y1u#_>pU;6dY zWFO3TYMh$xlJMhT5DD!jDsQKkSTqWf=7qgAoz(9C?UgK={_PWkov*Y)CC_(Q3Z6?# zA7A#cx+7`ta`ynruMTy49Hf!xnoz#=HjMBJTsk+F@%?+Yj}hZFJN$dSJK4&~nnle> zG^=?z!q3nGCEURw=U#tX1)CxXT4^@AWyaSH#<;=vQD49sXN?W3M(@}KiITp1oB_=@ zJ#rFm4NnM|R?pw(Em>bX4SjHIw3;OTyf?n*C(^SnM&#pmnn+HyGod)J41Er*B;i`d za?w0)-gB^&M2|w_EE|{J#t#r_y~R40>_C&`5*Y73#FY(RE`jT;b;TyKRAVd?(pJ1& zQUY7y6~vN^E&3Wq4eM!0)C}1+cvQQA=J$w|;bBRd`g{9%xWnE9@mwyOm@{RT6s_p+ zqfN$r76RW;9tMH|I6JT*?{@`E8gdu_>9`b2uRsBsq2jN89bK;wfX92yJKjqwAuZ6s z8}%*+@5>`!JxoCv&H#$h-{$@~<^ir#v{1k-iDH%1Ij1iSuu|qx{m`Qa_!HfLlL6G4 zAkqUN2?+C0g$RMKYdNBBmU{KFXS(X=wJj2QLXx7D(xp+wZF4l+!@&%GFLPg9b!4bq zaB73Go_Yy1o2wemM$#8Uv=Ts@ZR;k2?WIGCYTOEw$$ zeAO+quhpJ8^{KJkkOhfwcJ2Yq&S)~WCNRP$cYeOSteJ^qF2d*cF&)@Ebt1ibPaS2Y zgncvG9P8iDcsTC%S~G`77`!o|7oiOce|#xA{{Fhc=v{=Qr!OpHOo5R)tI5j9{>I%ldfGiMHh`O?4bq)$kksC{1U5i21RYDd-pey-w-Q zERJ~_#{$WAKzqxg5uVvjOvPNq`}=&V?Z}wuU!6=a0A=+t)c9sKNTv5q(8`>r zPm;oHLA;j;Mm0;I&7WB=1v4rX0gglB$KG}834L{J=Ez3s7lHjDwu@~{gUH8FOI|_< zwW}Bcm7o)Hp+$^wBekjJc^II(5>HSeV`CjP>ty-E$Vl_%d36bHa##0mPnHRZ$h{Y2~4~;C|zx!=Zbql|xAG z4GhKWR+H6hOe8=NEboPz&ufP1_7z|Hgi=KYd*-rU@NKh=Ly-}n9Iu0|lZ>mf8|(ir z70UG0^iH|Qug<5?>gVIFcX7nZoG;TT4B>shpSH5pUZ7mH^dLq7 ze33ishzy$fhcLjt%; zLeb9*!=3=~6>1K5bO5eCYO#F0Uw<}r)_@)rNH{ZPpe)_q`c`1R->?=ub5Md99e|e^ zH18iQX?woP5?SU@8T25!|Fq1w!n+y!!5AHW)zv8SnsnEmhd!$Cx6Dy4^?u3X^Ubl* zmsBu(p8ESBkMli!*xCs_RlEgbAaZ#yr5O+@PA2aDN0YAN9rDVO@RG$Eyp<6{Y}53O zP+$0Pu*SPG(g6*}J6ka`7EdF)Vnr7L7!vKnA704*aPZ25vyaauVqfD>CmlEg58Q$o zTg42u5}Cc3%$Q?)1T0rCo?yu3qFN#U!`)_Dmq*B=7JLP>@(Sij4OYpKSOIvw?Z_5ZJ_=b3_FP!ALqZG>sE z#F^m}qMxv6OzmE;^SyDNntw}zB76U983Y!Rd6H#j+(6-u5l`%v^k8~w*oF!OI5_L1 z$K+F9NOlA`M5@;8CRMqffmo$LPMSsFL>bAC`Qw#{v4Sz0pYT|kn7PvqSPhMDADwBWxk|ILlYK*Yb1#h+lqp*far?!Q-*YU?!$<+=yc=cmw$iF* zTfK8SaVWjf_H_M!kR>xyM)=OoAtWd)*V*sjA$rSEE)`)jMaG3;2$RTYbjk7(W|~D` z5JHN(`@!2<%MW%@jfPo>TwhW(Llw|)Lo<43#KL_BPODFj0;K4_Q<=ERcXF}Hzg?1j z!yUJKPfVgx+MM++5VlVxS!FtpK2N0l9N@LQdgg+^!zhL3^u3SHJ1;}NK0L$m< zwC)pwC%3SeE~{_hjm1~l^0TC{$9hSQsWPN^jtke2&6claghHtvPi@NKthIIUHrF&< zQe=2K1E|2OGe|CgYw9upZD%?M+1i6A*FN!^%@XS@@TIl)TabZTWbHew%s0>gjIlDp zTKtVL=8(T!M~Kc&J^M*QxYjI_Ca_`Qh4%5Klm)BH85N_#HXD-&zj5oF*=N6?bk^$M z?2$J&3Ag29Y3Q}8nlcGk?-DFXjaGTmbg7PUNzwy8%&xu&vS}UTuXYBxRN5x$08)`5?BM5p1far0-UEbpLfdj;=h=LFHko_iW3!V;U}@F%?lnH{PmZ(++A7NMx!kv+ zpyC60px=|QjXRFugRDf&ecRSrx9$`3_z7$f=JEcXXWu98suxagqb6|)3v<9-@=m03Vs!#G z`PIg0TB`F`ZcKZr{qo4&lVUS@ep0wkO^Iifnm=L=&QfPomn>;NBrV-p2V%hm^5 z;slk@R^(rpnb0pX@S)?>z_TL;qG{W&=3ridx*i3nOeqwp)xMO5lVD+v8h$+W%1Ot% zhDos0zPw-mA1Htkv(_cU93z~8SxS8?9{TmWppW=bE`Uh(ihPaP4|o9SFod&x?*%M_ z^R<-~vt`1$dgF^8kP4HOV42^)6cl3%TyYJhrtB zrP$JU2WKv83yfgUFWGa*^bf9gFD;7h@Cjdwg8uu;6Rcc7`Bdx~*Nhe19xHY*fEnPJ zY#Qyv=ZC@-xNt@q@?r}6NmHim$-k;SHC)mCjquNK1Qz@yXIu~ITe4>2_b$G?zXdED zp$TRCI12eW122_zI>9I~^%`^v}^fcGwX#FeP68c1;K%oMFm_zXWCa+maa%8neGr=&|p0AX3}*wVBVACEDh zh)Sy)T2b)n<;VSZdi{T_7p$EQV{n_J!&ux%ucMYnSM(Elnf6(MAfvLS51)&po!IWi z7Ou*Qsjrg9ORC-O(w`klAgpU!Xp~ypvno`Rd3L~$Fo^du@)us#&-Qrv={A&)T%s^> z4Ah$QM@-`%g5BEm>{|40nPr;oFOanhmkzRAxdLqWVg^Dob%1tIR`X)viY+m#(z1bJ zb~xkq{wP?K-wWFBI9tk^6-*+ognc4`T*%IJf1IU^9cc4!z$Q{e?_r_-`v9W+E=JO| zO>FVuFxhd*BtBAL903r@&%R-YCC$6^a9ohaYPPMtbg<%Mhz>h_ZE~tJzhIX@+gC2DfR1QXmBLr~{RxbiDcPE79flWhd0j5Y zsZ}W4**TM)In>`~nUO5&zR9jD55=rx@xNTIag25%sMnF>_5GN_XTkAfjpOq_S}*|@ z)M=`?#Q&F-K(r}Ay3{KyAI-bw<;;^2tMa7_QP?P~S}dK|_Ah-sbd7pS|PwafCB13F<>~qAsK-t~S7Lq*rQ3gw$gEnP zoKtDwvaW$~Mkxtpl(3}7YHP}?U!=ECOPx!W6K{9}zSFD4&IPZCQCa*T6TeFi48CD_ zy@XOnLy=VNFC~&~Y4WmsXOTyZ3zX^@35s}Ow7bP2Ms(2S zSCu)3*KA|tG@wAPoo_P4Ogiqz2U}lZ^cw zdbzAy^okX5g2vmFuLkElRLZr=%WA8%VgE4+ng(2l{Hj-Z{-}fz5JzPMUiQlV#*toT zO>h_noQ%);<4wS>;Rx0)0S{knr$wVd#yo8^d1DeK_ND?<`7PZu8 zdUALHnUs|JQ_D1Y32;O%MK99v2bL@xf%vPb^m{BB3uV}#hrE3fZ8Co+evenj0E<`d z13pNncl3-f7&2xk1I9L{#9eW4<43a)F&hZkH;&!nzMI9}DN&Mi3?d(6Nq1pJZRPF< z-zWZx`6=rkc$+}(;pjA&Ldd_4fmoAb52*q<8K*2Ay6)x5l#QjJDCb6MD(AOj$9!Z>=D5q-;yVBaq4#D}CM=vn&c$ zU_#@HM5dNh#Rn`wt8Jl3#TE#$VcxP6_t-TSA`a^yDMi}dr`ojlQ0cu1$TKDILoPK` zfkE?+9bJ|IL`^g^s+}mlJH~qyoZEHBs``08k%YR>v}O6S zL8XtO95Wl=DS!6k0YCl@IUEWue) z&}JbDZy?S8h5t+}hg3g|N^I$mRB|85H<#sG-5uFx$h8%8qj?GysMBM~GyVue*|3XW zfH;PPNoNJWuBI;la-_KV0xOBzt5?qLp&TXAfcxjJ2a)deJHlf62u%~?MNbebKs}(Z zG+w`+?(_QoG18w1N%mG&)4XNZOfO_p!VO(otROP1lOwf854c8;~g$pq2KPnEL zDYbsGFnnVDqNG#%L%fJO6N^Jb{cT=>GAyDs&L;vsDz^j&P%dKFFes(A z{&sLVS4ZkuajpKbRFIV-r9jZS{IrA{0uT{(ELu|&fsjhZ7Q$J!oX@Zm*~*7Z*17d5 zpXZ4+2^b@Y`!yot5`N`ncgm3%{zH>$Rr*E59B-GY_T44(h2L{@5Rk)`WWh-10#Xz8 z$Fs06*TdI$?g80;&&OsVH;os@G^%Uv_vPXWFqSzu=Gqv; z7H-gX)pJ|@ph?LDjULP(ii1CPAK}3`ORi>sKkALv=`uty4dhAdh1okg^Toh6 zed#x!3!;QhrTjcIEHZ#iZ{~hS{$q`j>_E;fM2$0zO20(c!RYJEx&TV0)}xee z!4kn|RI*@^d9@!f(!}DB$TEp=iM&9V^X#fDDE_A1E(neq8*W~+XO~^6)fx;p$}lLw zeM(YC0=Z!!7cNNYx63}gE=C4>@`leZ=5hx;Kqi^zFzD?#99Bp=&Z1U0bb+;PAP)~? zEH-@11l^xFJcI%G_(00G#bB=6#*Bog{@ulUGIn%1F{A^PE>gbiigX2f?;YYbKn<*s z@}sUw(DlrFQMLM<2?5o+=NI}uv7&zX7wrWY?b^otK_4T_H(Xah;|yV|A$lWY^ouS3 zhj_g(?Fk&eFMNH&pNNHpm0n5oNc~9GY8V5d5@89vR9VGK9!8$=+#?B$42Zyb8B-GO z9g|?n#G?k|=d?=Y>&SD{enC^R=iU<-L58w}6l_Wj!_j}tr^W&Hj)!-)G_9;_;CsBR zF&993UCr?5mK0D&*I%dO&pS_tQRy^Yzg}r`)43NIo!;ElqG&5{uKRU0?v!w8f9Xn` zxdpnX54n;;W59izoU!B=-V2QE_+9?+9bs%QeSZSh>j(YX%^M!*D!O@b?~8?|Xi2}o z0%|byDk>y`)(?cxkN(0e?b7Id-g7BS%`VA0$MxhX+c$=HN|V%pSEU&Ek?_L@7RzK| z2!PY)Eh*lQ;bR9vNxsDvZr(aY~MIZ|2)Bi=fl94&^d) zTKAEjJx$^oErr{I$n+(a`xWc5k5b`cvlbl7B2fQdY3PKpUNUJu7=5}EGytW{Du%2(<#-A+$N*;B z)HS>U=nL;~%Qk75c+Uwc8~NDHcVn)%MRxV@g-?#>vTNW3Nz{PJT2Z2M<;iyPE2%=g zhL~yLzt+>0xiNQGU%X4}GxS5X;G>oDZF z%ZvPch6fV4P0R?_Ai^0cVSd*=(C-d8mn%1H4_RToPIAz0F!StMiG^i(7s}d4N5XAu z=r2Ed%C%>pa>PZFao$2qj%^(@BN3AYmu2Z0McjQ2r-Uy?dyz@8cL9W%c>S0*25@?J zam9j~<;^AE--{UZ>Xh*EDG2o$I0U1YU4-HNGZ`8_9cTT6;pvl9*(ivPS-GRKwVp_x z3Zu<*c;hv{gX!bTU<0G{lU}zXj2hp<7fJY5vkVdWLKhyY+r2D^xl#w6Nu0Wa$ z>HB~gS;)RG385)y07qK(-W-PKg(F?Zczwwzo>u$I7!vN&`G{})@cB@dIf#lISfd;d zB1pB$_9wh-D(v7r+LvTez}V^qY(hPi$iUAG#8lj_p7H|gN)T8+ALuJKewer)H^d=8 zfQcr5N#6plAjan&F#EmqzIe}@K7Ncrak-Q}z}W~DaPT4%WR$XE*wV)_X?G-E(FmL$ zka?RprjO3M_%e}z|3(JNIi`>G^kKl(~Q<9nf7{2rVdpfxEDa??S zk={WGK;#)nRhKeu1(+Klia&@1IDUU8vk0fj0^J z&7;ZI?rYKg3vI;gin3t`zv^K`_WdpiFKbuH3i3XHs{Ba9WAvmA}8=VL_S^m4*S+ zd*T%tO^c3APD3p_u&?J#t|=sHiMR^W8y+!o-;R5!umW}aICCzLP=zShx ziG<}XeD)2-n%iMI<{s=Gq@d4=qKSQCd8(Q#AxwPv!dP<(YDyMo_3uj z+Ox;(0i4w^7U+na)OjV+qu~$gMy^-66ubvf&vPfkBeDc?;ty=BARPc7Syee{y+t%g zsh2PdsNr*PT3r2Kq@+E%=li?7@}(CPYh6m032y_Z*~O)7AFO`!miS7$F(b>+Y)962 z1c+4m`O!m%0LPa)z@wNi*f(;3ufcZy@b>k>yljy^4rD3ps@_rgs4o)M>DSYCE!lLP zjqD+h0yt-eKw<9KY*QDQqUK&g_0BQS1-;^v+v`0T(mj3kVRH%m3-VCQm6cs^xqkyS zwKx;j{E60u7+Y9B)5^7Y*orEsCJV}OBl>^~7D>9FKAmODH6<)TZ(;84`$M))zaru7 zHK;h(P)cqQ;O?P5Haa&#_Rgzr1Iq;8T0CHec0^yGzC-&}?phcOw$MTvmGf`A3`*&& zBb+hQFo;i|RaF!nb6pe>kcV@ZLZB0@_Tpa+YxLhCeit+}!j!tpm`i6pF#;eQyJj*W z$0%Wg1~p22cL7=%92(LaD8U@gqUbhlRc%{goE|h$z!i*%QgQcr`7@21H=V?e+~(q- zDQ*RQA}!YfIu$cfNg>5%eE@S%NvWmclR(Y#`*}g|!<$d;T*Ga(sP& znf#Sr_bAQg>-!V=mmWs>)(j9I%Rd$gHQQw)?E0l`nRO&|qrFPME6tL#W^{S$iO_}o z-g?+wedWNYcXG;DulBm3{deC*@^N|k`c3G~SAV}ZY!lS3JIZsP-o2!Hv|^^G+@wf$ zd+DC4xg^B9WWrg5w#v=-rjNd8jHQto=@KcBBKOFJlvP`%)@_}iT*MJrcF`Cz*C(qC zU}RM39yklI^-V*HYeXU({16ZL@c4@3{{HglFYtzgB1Q zk^Q5ZWRxt!uPO8j6b^y#Oi!J3lOiP1>r!foj;S^-t$qYg7sDQ#Ww3EY~X>x+aah@H^=^PNy+p8y5*k1@8_NJFar~?L@46}OW^LWlFg;|AVpf0 zVj$K8t*>JQn;88VP_waY3Y(1l1yEv3m*xd~nFxv(%yyw*Q*)L^{x14Y-P#R~Kzvorj=a%E6rF~EIY3H-MOsIr><2j`@>tkl>o-RL%?3Ho zuh*y`6{8sbzmdw-g9whNO8<|rD_fEzIc|5jbz< z30uC^om%QnZ-t!9V@vU+a`CM#lj<@%2%)##odSsODzu01jJlTe_3gew-5>VS=)29^ z?0W-s+ZX;d&$gCp>w6-v=Vcd>e!nBktODq&u|6VFB`l7sousq`>H9Y)Ep3|a`o{pq z7UX!>*BT@BTqI*`fo#oZJ}+RTfR!1!Nxjf~mHp!5#%CJ108iycF+eKZtha6%eIwK?;emo&rNZE7cwB*LLn(mDPGb}`N zN^0jT+Se_NbB8Mys^Giq@zF4bN~jsU`LfHO1<3hV1kU2g%%I*7S0D`cJnBkHCZjnD zqa}6AUnR=tdFrTc1!w4Q1^B_s{hj*eIngo^nm-#5GF;6=L0~ zu5Uqkhv6-Ze$3h?SwCDZ(y&&{;KcVO$0ZsZ6Y!8%_3kf!dJ?NDwKzmSp)$6tn&rX> zYZV8R3BfKN9HIRz>#|fFWwVtSKEr{jmH_p>8!YiNz|zuK4$`Ojw-Ar$bS4BfKsu!$ zcNAL-LCy3@ZL)`U`uC0c6fBT%62Mrga#NX>h!t5gcW(X9iT@4B{z;pc)wZA~;Q%YR zeXEALvJu|D6VIbTA?2~si?QSJ9?Yb&OWO3=y!09-&>pj7CEHD2z0U}DaABy{r0J7U zW%a{5M&{P={ThCxg5uMQAKzv8ISvw0Msh4^jcr_}S&RX-x4IGe&LomS(m#XAY!;JT zql;p(;0h#hJ%aTAK7EHYfX^)J#u31tWa$hn%q1<+h3(l)M;NB?iQW%wG)0wG9`pstHf9?8Q!C^E_`VeLmo)rO9ybT!bGQjMV^^55!63%!#D$eGX@la&I_9?XpLvmIu`< zOfurb;r>8a0L2$jobA--cu$m|j2t zLp=&weE)af+kJrz4UfR(VrS|Qcfn+H_rhro#usaCsCW8JVED1Z?dTC4myu+K{4~17zAq06ZB&OZVip;TV0n#xkIZ@-~~d?9_G-N+YE>(C}rRgtp`#fnrf=j zK%8vvZnjJNeyh?!Q%@U_l}m2xHp*N*Jz<0ITPx@Qt}r? z(kjd9$CjmiUL0taR>UkdFY2j7Nh0@K_yu)-`y^P&%9c`K*lQhHK5Sdq z=1&W-6p|{n@c2_+?eeLqnd%Lmny_pC+v-J>Kl9ix0Yb_UA_1dTp9sL>M_T4mW?lV| zHJK2?y3UYwEz}@R+(Ov_i^^&q3x0$F55kIKJ~yiDE36Yu4iUCZ>Qqt=%9}RKhXwIS z#m#*mt{7~qR}xEoP37qo%Vb)F83rT7AAm1=%O!D2f3vYLQnj6<7-0nTXM-DsS5c1c z(<=QMRm>9x^St%@&0ptk?Ggs}Q|hndIvePKtwxRXtk*;UKW74|-omsFBA9#~QkBDy^*y7%B<8q&d6Qqgi{R;y3>vZau8wt*LDWlNd-`<6bqEYnlu zXSU=Dt}gp$yLq)R>b*ewRyCdcx=7KWQM9g3j1!qc`x1U|TY!X4R2p{*&L#e_KB68- zR9vhP6K&U4a+w<0<2@|f{>5TCL0?%fiwO9EEBp*{fG$fE`!ugu=W13p60y{cW&op; z#_HzehtZS4VYD>UuJt9A>?u|xQSfG^+_)KaCEz$09SvWg>s9P+XE1ui2u1+Dw0Nq` zvw-;W&`jY`$@l>*zR$`j-!6V%J;>A>%E6fazKZ1vCcx|1`B6snhD$*2E`+%#T;?T3 z;>PPM91i)~ui$)Jy!13+%8kscY^-IWt4zRYSf~C4_0kD@_!zvq0V@ClsRhU5c@pTo zu}JS3)L8YSg986(n>DfX*PMY#tDK%k`#ZkBOp(q}7>Q7Q>FnQq`ZMM<90uWvcz@IH z$IX%dE;9Z)aKKg$Lm-!{CJb`Yy~x2nd*z8-q#=I*@;ZJKsx_Wd#rU<{%rwYCua2JF zRwtTAUCY=P=E|`a**-*Y52;)hN+<%Y@Tt5`ub|F9YH{le(H|bVFv+wktGz9#P*@0T z+2^IKa(rL&&o()ndU-5>sJFqSW!7MBN&t#YtclTwOZrv)V9;na-N&}|IM9Hm%}tc9 zbRg#1vUBhD3Ub@}h1aL_dCf~?b&2G5p{B3zl|@6nh~gQ&eo1^KW@YU}a#o+B7l0q{ zG=w+b_WROO@bv!~trC?x*NSmo&*$@pz6y-*t9^9Qq{>#&zQF9Mm{caMYHXhd_%g=* z-t-O|ZygPSlzrc@jBIoVAVs1U$$EsM<0yU}w(|U~O+Zy^$(lYHUPS#|ai&&i=0vO) z%&5Q=z}D}>k=Jz8v)B%B?&@Yu42*?4!N@)E6lv`vteP@y#sqGK%hf>fgiqitn1J&0 zwjM)~s#&7l$0CZz=v5U|vbRB*w6FbeUS|sRb<-GVAOsw2$y-MG98Q^)ZR!3)J6lem)JPlmIv?<4R9cYZ4%O7E6<_ z#_}y5%JuKKKQjTtOn+hpiWFM}xpmB8Knc5nM9&MuyJiVQE?zWDdgn1iS$@ql`%|QI zhb(5bq>zVV>`d6k#WOaV`YSKu;X53OOSZ3yPG-)I%C=G@P;$9cdj809Q>iG@sq)S| z1&I_XH(QOm06_Rr`m#nvNM;QARM)ulS;!wSmw-=yBxs+>*&ykaFJ2GyqnGcdOJ7aO zF`#1w=0KE#l@v2;AKi%*>~XIl=9X`d3(StYJ_ctZRv1p}=c~}`N+XP7T@v3NB$V;O zDgCApa04cc(iuJu+%jg$!ReMpqrH4!?p!5YR+>v%N?MAeXaG*7Ly<`ILpV4zP?Nr}|F8Q9Et~ZJrQs6};+Ra3goK z1qm3sbZL|)LesQeOst!~wfOO%sa-4p?}9GUeQs#)paJr@2p$89SX+ir2>F#((tH+a z_;5b;V@{9;f=6WcF@uN9qkWk`DtKn}7{U|K7cet5F6p@oMXSOu#|S<#z}}ERKe6Xp z+@;d&+G18n$Yos8$J@|_CtW?90@m)4TP4;X-a2JmvX@XMDg4Ls-Mmrpx()eQLnbuM z4EEZzgpQ1fhM(~P$-51S4UchwM&;d#`nW~t6k11hjDu#C)Q==0P9`&gY5l$*jMOj#Y<_*1To^2D6U3?{l*o)+%qd$i zqw=sP|9yrN+|zfxd`myGtFj2DpHDu2dJfoO-5?_m6$~AW5C+lB97 zq>}#1ali9u`gMSl-xSqK-GU{)ckf0im%eX-V|2yP2#jSz(Xn` zh3ljI2&grNj?0&6{`gS<{i!>oYJNrvSiT-J1IZ|x=u&4F^J0d%0n8|?nyd@^Wz$o1 zE&gruenoH$9#nxXi_A%9 z180~=UV>IL;snJ+OlSQUA0h<$dSXWQSU*!`AAtV#kW_pth!k`*67*%P)cCS z3(J)F*WN$vKjb1;|70Fp_T-={MOq1uAYwHI#ojNj9|0Tn%(3?5bhh4GHyO=X&X9$) z=kKv69GB2AQmb#vwPcs}dM@lK3*79J_`${{Yo}f)j&kHR?C>iDq9KjVKNyQ6ohC$t zMHU%TEd`bmp0ZJ8n?gmSO-kMA_tSl6PJibp<@x^35B#RAfg2zgJmqe&{oKi>GJz%K zbA~(RMk|*tk)dm;ccFYqsO{l(mVUTR8ZMu5s}6st9I3mqbpc3v>C6w{N!#{Up8mUn zR&(E#OBWt>hE2q%a$BY(J=0&@Mnw<(jgWHBzV zWcm=R`<%1l#$;t3U^Suu03ZNKL_t)@(zHgQwHpNGokG@hohM*xneY8k$S;MOQZG

    ooyHLy8O`7llUeuypk%bRm|KVjaxj3baR0#l0@lom>m|jq} zJdcpzZvf^iqvJzc?J!Nuj8vGiaDp3^u}!MY-4D9inO#;owr6YK#=RF}BD)78HsYz2 zxY?_;9&LQApPy?E4_^(Y%l2b|;a^mClE3T&Nqdpea>zB^%r^VD02@JJZc$?#^ngctJ@ym|Da<(pOOt^xf z(?o_omhVBG@pGOpk63j<0X>Hd1zW7jy|0sBJ`7LRQAF%TqHP(*G7r+n*G5@5WCqpgh zB1Pze2*rdcKmU};73ZG94m`p81v{n0Gg2a!&N~5uXU^=&#G4cQCjg}dcFbcaKvZYd zf_WT8&-Z6bYHBQTpudpE7)|}z2v)Mwzjc9R)Ztu)&m?h9A&N`!aC+Wen4>0GKuV9{ z(P~nvzp#zr!ecj@@N+a|Nz>}@_I{OBHig}BFui9>tA;)gD2V+8@ZzLoH0S%e?_Sto z>p#h)ad<5Y^Dz!~4|BhlQVSzc-n+bPN3}>M)50Fd zfZhy$i04tgbXh=sCFCWfLSrSXW~p}Rohj!Eq~k9DAx>@GgEbaP&UnB7RiNyqiETT& zrD6S~aIkc;d?ubebiGJ~X%VYytY1rb=Et+!7cF0L50Yb)Z5ib_3@;3R7#X#EF!%2u z2@o)OfC?5-&jNfseFy;KYZ)^kY}>ovlh^saBN`Mr8N|@FkEQFc-xP`jOb?#KdvG=d z$w~g$HI|whlfF9$b6@IXq9-hobTkRXnM6L(I&MP(-@7^%io}z1ebazkwP&beIM7Ab zyj3K8jA>Qc4LFLHi$3SZkV%=9Gn*0WTe^H1Gk&GtD*=m>TzrRd(9^Bl`-(8I9^-j{ z#%eOy(B~&+t-%>8s~6!0t>i)a4l{rgQvTjV!-2B)ty_%Qvj#v@1ku;!y#_j4$FxWX zPbT3Mu1D>iX{=!TvO?Kr!Zx#7cms|3kX!I&GMPTru+VrY#M7@P^$IxKRyAzN*s zzaN!PR8XWh!juj-DO9CYc9lqp+^u1cu5CFM#DLb9pyoWBfHn&-yla}r3i&VjmfEkE z;T1hhjJs-p%LRond~x`-dV(PZ4k@popo{9!k(V+?V zCQ4;jJRH<6*LwGP2RtCs+Dp(^c}OEvkuf}DiIDEdv}-9O00uGj1etppjq>?84BZ00 z*K6pL#%g3&%~pM&T|fU}_T8z!&I^uFCnVhGAC#WPmV_}`^MxXN5=+E)WBA~%owQ`WWUp6;jPT?ic7IYZ*D-9_$|kfajVnS0N-UOI|hIrtb5*=NA)7{AD6H@bj-w>7IOMtsw z7hj!F24T{M2s}?K?Piz5bn4TCdt9SS@A~*YQs-?SOZBLgbSMe~tSqwb^s<~C_B}@U zpBGZ;V0W&EG|10X-2aEUNhmxw5esbYHoTjf{D# ze=%#FtY?)^*M&?6q5t0WuE;Q2rcLvdDXW?@WK~%aJ+eD$ZAiMBi?438Y$-@&1>f0j zBmG#U-lC^^&W*Q{b4?#UfYE_B0BeRoR<9uSjgT7$;zmsOLB+>lEN)QRAS#mGa;Ugr z{Erxpe3uvPuSC!DU2mW!qirtFItViyF?R5rUCKVa3;3y~pc?feD!F3FzTyK^a}j3k z3%|2x8n(LsyVOR-4d5N~RBkhD_w)0>Dw|#GdqFdUUPE&{QA^nTSqWHXCb7f+#~%r5 zb?9rNST}@87;BlS-}Dz+AcQrlcq~aB1rB)Xz{Piz-gjpJpEV>~2<$5@UdnsHI~5(u zE<@vlx5YCw1CQa%dEhA>1hbm*&J|4Ac}3-+T0=DqcXLnKMWb z173_QJ~vJ1KHnYbA2VI>sNTT6or329P4C5PX%^8TC}P3))$Cne?*w!iSUdUpb$tH5 z??rId&`6mzFbQ_Ba3uAsQ+a@uT-yfrlNN)9AtjC36)G&1@G$mjH{V{>-%J{r%tXtY zOhcL8t3M86$KPj$98fvxYH;U%`7dKvi&_8U^)(m3Rb~0Lv!P`DES+vS*K|y;q7ft0 z>ty_>=kI%y{fK|Dq=;L=UHTej+Kx+-a5UHR2ga628@0q6*nuKD#rqBvr0?wJB$9$~ zAgqkJsDU460hs|C*Cu2VM%)Q>NV%N!XI-JcSX#`?5gL&|!m|5&>!7&k$dLIcXZlbX zgJDSZYGlplfEDP|WnJXQDK};jArKEr{B;I;6To|q7!@_(8XBS~6*dJ2M$Ly_3b@Gk zeb@VAhZZ2A^800(@NL7z1|(0{$XKd(DUR0n+Cm9O)QlzJN^K21GPDpeKzQl$@bW)- z_++8j_fMSm1j_V8gH-jg{|d}x#L?GFbbhYA#|?&&zXRKAQsz%=M)5d+hFSppvy5$p z?cg!{z>FhtY6hd$(CUR?9JL={w{AcEuARI##0gt^+>l=6I5_D?mihZ$)n0DJ0%Ik_!zHp!tO1Cew8)M7Ps^0WEU?s%GiS%0 zFdA2;G{!M&XShkR&hB+(j4o~n;Q0iTcqP$KFo|x*5T8&q+{NB-zi!`G;^QOP`sKFI ztbl=Dosa;D$+diD{nAu&Nz%7y+rIc{0HeHfF{EI!#zjZVlc5`)lk*GK4dzjyK`OZ! z)Aw8pGk~%GC&tNlW@yt3R?nZ=CCcOS>i`TfeZ^QT;`SP7*W1p$slQCio?C`3V-&=b7)#M%u840$y!^>fcyPAX^S~m4TK-B%$N7amchVh zOUHhh?@2jN3m+}1wmO&w0~YqcT?nbtDv}2{FBlcpv9v52z7TTM52*Hpg*mj>2Q{~S z^&)D$d35GTK%DLUelUeX(E!_1=V1qCvUM22{ALa=a&aY{8DiMSRXX)kmlFesLULEPcOHp!irG@NKFT!T!BY!;ofcti<_E@Q#PC!n77X zqHo|o6S!3W9xceR@^^^UUtQ-2gV?XaW|;Xo|9eG8q>ipjGFF0D9vmqDtpOsO$i@!m zBoowinH<5HZC&7b=(N8~0QOej^C!d7ym=MimxvpU5+~L6Qe)ieN4Ghgdgt=BcB?^z zMAWD+=a-Lsrg|4eSHxf-mJ!(T^$6=j7(U6F;!_rDk&qXUAFH9I zwy^7b!R_(Xudr#lj05-qcT^2rpk~3>k}wG7+x75Im%97fhyR>$9gE&RK2~11gybaG!w>%i3;QO>MyuT*6$X-y#@+Y zJ{Xt{tRI_m?pw53HG0yNTY6e6M(D{!yBi{qumdjA zM?PV9v$NLL=uacEen#ZnC83K_IlNi7zY3SH=?oo?Au=%2ht%RWb5{mhS>8j~UdTIT z*Q+03yibJqI!_09sB?SE@Qxl@g{3n!U6{XjkA>r&W?FpdMthB0(yn0^#LV`%>bjgY z{JALT6L5L2x+Vo<084*3c-FI~E-mrcwT<8AU@MG#zk=SI^Ji3a&JhOWbiU2I{SLOX zRRAUP!)53LBFDl&7qkQCE@_l3Y9#CS7DFiBJy{Sbk$$n9)38}!%N9wRrKC&E(hWHC zUg*@bbr53g1=p#uet{8+7-p{yVtls1M2*DPEE1ODWFd*ElMX^(SnW)Jn8&O=A79@% z-3vIMYi%3BEV-~O#bV_XbR$smKp0wk3JnU;=VxB6t&1?yzW4%H>+*^@xv8%q+s;P2 z%m_~`5^F`J>_mD?Rcjr53KAi~ioVT)6vbOqtU;F;s#e`T zhuXk|bziK^M*7`khhBrz) zcejU+WwNbWaK>^sJNTFh#qe0?h{m?={Ptq*_v?}`7g(aj0RovTG0!(XR z49kdp1Oo_vy;KsH&BHe%_bM~A$^8pl2IGg(`B%CVyRu_kQoAl$K4$A9x5SSCs}JVS zDF;sA+^98K)Y1X8#fS`K4CZ}nGA^!QD!qyZ7UUOQwg`;Cf=VHurLWKSeiN+162IQ- zw^Y3>{fSmyT4A->svA&aUsX?wBfKzNzQQC@D>~>^jo9Y)mMJ&*0*7CHmXhrZCM`wN zOLWif286zpJAmY3V}QN|WO$LXO2u3JV=K^DH&zYm?t^7t*^NkI`h*vn7iEJN!-3eO zGEEgKmdkrKT_(M3vSVu>-||GUZ|Iiz&txHl8&io9Akyzlv%6j`q9A5AwAM)eQaS*= z^bK*ZoS+U`lcJy0FN+Rkaw37to&FdA^aW2Sh155FeA!m<&moJd0{}npxlmNydDvs5 z4`{^<8&Z4IvTJ=`xWA_D{ad`i{PQ9*Ur!kdr(U<=o;z%EEf^Ug>J#&n_=~ z`3Rko!{RnbX*n**VLD_4Lui(T?2#E(nJlX)*8lnVoJW@J`uLS@2`}=k`1dxH^^HU8 zV#bw9OF&<#*H1oH=We0GYfug(v=PATsP7NT3c^dLky0rYxfWJW^a{)cF1kjcH>{2~75|e+R9{xl4beekG;eZPHF}{P|ke@>&)<-0{h7 zznMBUkUk8G=pe@RJgO0z;X&he*?{%#ZB0Jyje`?N5&}UoRS{-@PSznMWd|dS4eD2( zr|)HW*&qPI;VQbCCOY^qHhz6Gl-%%ecje(5asanP@O=z0i%j+tdTJWukvL1_5;^s7 zRP*)H#{>v?`#!GE_ir^I{Q3&vY+Nsrge1%j+<)0SIy-3nZwQtTu3vvrhDMDPa!ZmG zD;IA1gidkvyk zGRDGpkiJa94|J(_lr-^s0FVoZ)VfeRmIp{h-}mn~R9G%7XL5{d6I-3=2=Lz&oDtFR zQDW?`)Pj(aY`96GmJd?!r_P2~?Sl6IW#9un@1}Jx)~z>WSu9H#i1kBS&}3G6dJ0!1 zXxk60TombgnFCr#eSMx}q zewyh`$#Zvw2gzWJqK=57^?o=h!iOp}&z zOSC@~cdunZrQk*jwwIBcOkESeLIN&^j}T@sEJY&WYopLdFwmJ^u-zM=V>y=&%P{EQkdY!mDX? z=l7%EC!}P0Oj5+Mr=*f^4K^(bmaiX--3Q1p_#hWG6!d6dff5~rvYvV<5cwItWz>&bKZl-IvyW!cIqdtr6X$<^2>4h9n4%{RLe<8|bzpA&V1Jv`PsTMK*V zHWOG$b48@BUNOYji*;2#38Un=9 zh=9)LyOXZK_SZESJyK?E$z$w;I9BWOn9Uk2o-UX4@(EYz`8eA>wSS;D$H2&Si2#T@k=Q*y>cIsn2TeH;L5YS zcax8A6R*Y$P20+>kFKLM01m44b7%29lkYxFxdG;WGk*=Ds`rX^!OOY1PpL1K0&(p`h5a72k4px)M0(5O(jJEJC3D-aSEb=y7&yvj zxrDv8em;)t=IC40?z#lD@`11$mW5}M5%j39Z{l*w*A>ehBgt4}*VoFgizX*g5|({_ zqX#q${LL)4hDlro=X5^k+6eAsoF@S80V6kW8FzJDIdMzFqN$5sm#E1SE+B|H<)$InGpFAxEXh7ia6h#bYt=X;4dF2yE_P$m`rxugA^GuY7nKGk3g z*Ii#tJaYlm*i#a}cX??NDJnol9->LI0x|5UuSqYo*`iH`PH^aJquV%0d@6b%#Gpi2lL21%OzR;u`;2P>Y8;swfGyS{`erAJ_hTBD!aIk zR`;rLGcRH47HklM>U;-BO~26+b~z%Q{ont zB(e?VX6UI_O(4P(u9DKdlJhS%^9jhBa1k$MvJX!_h9{iUxJ3EVKA?69yvG=Og7&TR zC_|?#oEGgCg`K)GFGgp(z0xv6_k-O3UWPCNINehiGm?m+W(2^pyWuf;(IilM6%6?s zs0jb$5-(m3gENFC{%CRs8OP515wc9kVbpcwU zdOJbr3FF8`rU5J;pqwi%PPrX_@6@LWSjra29D?`#aU8i6pfc)~Ci@QcGlxeELBr9G zz1$_*%&H(tui&P3?jOJ92a3{TbH1Lb*yk(s1sUVu@*?S0u=H)|wy%2LPHBRb!mJ7F zX08kx`*l;f`r02jD`;E2RsXD7DV1prUBkN|A2av|G|t!Pd7^@5vYhac2f8=#sN9>r zzxy22WBBz;9ohf0&0n;{UaS92m^R($l|AQNr|^r20~NQiiP?XZiRp<~jW&MSMjA_3 zudi=BmPq7ks+X0a7Vas7C^Mt&?b5*Qh=^v0CIAH~LiDd~-leSh*4EtjWmLN8FQQ7& z?9F7`U=1>Fc`&R+mbMv|J*e?mPK56hSqm2pgX)ReZW|g<;3CE%4j0NpVm%*7hpEcp zQed3SnEAR8zudFFm^lrT@;a1~Ok^ndQaRzi%DxfC@#7shDUu%Tdl`pxy=n3i;Jw;1 zz9PVS58$|^$t;_NF=`Ftw8t=(VbK0Xilnb^!^eQPU!Iu7!lpxc`E!FFS(Z>RrHos8 z&UC>7UQL3Mja$r4KB&wYEZ7b*&k|y(IM^Qph<#T%we5d#u>Nun2bMc9me)~Oxq(c4 zPZ&I6B|GB3Eld7#p>EtHRh6?FR`oOXz*C+4{>Smdk^Q+bghBiMsb{Y*`rp=u2Rfwd z_=F8ZF5hmMqj>xHfDO-fmE>wiNx9k&Mc)9#JuIR_s@+%}CC0iWu~;i(B97)UIRg~Y zH+*e&jVn{8tlIf9aA#rGPNZ)k#n4BX$phHqI4?BeAF;a-Vt}*4J$Ety>rBxR{kI9nQax&rB z!2{V=Z!oAphN>a*<4q=$g2OR!InqbO$zIXVG|&=pWnWS2)SCif?chT$3e;BE&QWDa z0c^yU+%5ArU2teCAhyDSv0lM^UeRCp31EKZ@%WUSxboonCPt4eW~jcS3FL** zlbVwLEFWXrUdoos_7$WC2D;;YtPH!PlvxiP)ID1PJtLi*3>eSz^NmH1EUn&TY>LDS zy^Ci;`s{I5ME{`xcxv5FK6c{m6MM+TLF22r;Vr`UV5Q?w_5t>;c|5P3-i*8A zeJ#{shP*&T8Gxe_Dd5v-4-_FRw9dvI(ZPE^x6&eO|JytGq&F{RR7@GVTavIAOapvX zBssnIpIV95001BWNklnS4r>U#-#QSskW z28?Zc(&Z=VmgtyM07oeYjye+zri;c>fbI2z1vNsJ&i^4Z1veal&rCNnk*>0d3jVZ1 z?=G0g_ub>6+m;#4Q<;g_zWAq?uwq|WN`5cD^HDZQ_!sdv+B!?ff41xry>Lh%5FS0E zqCmBNmN#1|JhEH_BTLJuwINamkG)hsY-Kkz$f&ByTr8-C|`jYh89GkS5EX@mTyox-5EV z0L*G|ELQqLcF*Kx-<>lJaiy)AlA_kdcz*gnO z%9S3$vAluU%7q6r1S~c4=CvzIV9)us24%I$$MBVsQkgru1c5iS?LCnZ91%aCv4hN7 z8oXpthC`-KMoB*UB9`5NS&N6t0~1hLRmCM?_0q+$_1v|+3ikU+8hFD<$zr5-L5xUb z?-|b^hd$POlOTH)1WPiP7ERTF3Jv@+`bjQG=0^cC7b_gPcv@M+u`UApGj=G{v2aYr zj$0zGyxLv8VQSjKm@f(zP7})YvzcHk=L!AeJZg6}4$P^}~;u{QU z8(iG|Ic3J^4zwNHvZ890t8dBkon)J=%#r(tz#poK>O`vB)5VBcI{O@lV}GuFz-IWy z9G&jUzqIukhBoRpn1I#mMYPUChV+ZLP6WVvpJTwMYh^(Q>ixqsJEQz2ZWsyLr^@-e zupKr%f3Ot=`$LEuV9nxiUv|@)jb1tNBIwk|6}^r!Mct3YNSSmOplIOV4cjg{rU1WA z2=|nlFnq}Zt^tp%pA`9*o(R@JNJ-lG{`Ye!<%+#v!fI=L?oGfaeMQ7m${6!*N4_x5 zCU&6Z96YIfb!1#X{tusPl=kA)x zXoy`BFs!S&XhLK3%DM$FNQ|F>JfKMb-}O}G@1iG#wQCPKxn^6uXC#4bjYC5r^!~m~ zLHm{J%ba0J1M`d>Thr*PXV0=ihQa(5hV(=@<%kC{y?fe|3F{~v-G;-# z+g?dBc9C%=O~xT9Ru&ZXoMEz{T_=O}VqJbA&obOm0RuTdf1kt2;%D|@b5zDu&qwBg z5FCMw*p!`i)jZU{V2G_Dc%SK5FM*Lv_B*9AtAoDdBFK>{9cWMdMdrV|ppVi47*lY{ zezklVQ)rlTa6l~^yv-V(D0i+Tu^)p+4{OLxWyr@hXY5)uSRNBJfYPa(6Kq~<@MWPE zXAh<5`8^Iyw$MMPqZY*i1@)CoKa;hAv^r;X%=>73>g|$3K^}L%9+n+o?Xg4LWjP%G z9u?J03&L-KkXL)UDGXP7GpAIdEFMRdGBEswlxR-Z#BpK^8v{vZ{l5D8s0}B8gdN#t%QF z>X{^s&EKC;S3Gx|c^n{Y3rlL5H9e@b5%p&5IV9&@ruO9*nEbyjrI60%sUOr>K1l_C zw3bDxejLOtDP6H2vzDL* zd{wp$$`WdU^k`qu9qJ>mmIILH@*VMF!LnMwTHVce zxMw%A_KHFV$Ghg`@+C_$j-3&Y3B&Fugx;|n-Xo!gVS1`H7&_3aZ2=8DJ?|QwA#+9# zqkd(wfRU`dfeYEbJvl@Zy?ifWymENdlgP>V`B1VL?&)dR z2y7D-{!N{8(tDH8aH@+MUhV=?R7)EKCuq9Uc*-mdS?ZUJ>};FM#(Z;>Zmz}vwGa48 zGdasYdmOFStOy_5TVS>u`0%`bhYDpKe_r%#$bu7?=9dUGI1n&iJY^8e3W4a6PtTe*?t9!T{=E5esLs51S!4pSWS4?fxW8}L!G3#jzfG@}_kfPaJ}T`pagF^7No0?N~}G4tB- ztCA)BvL(mCR{$+iu@BHtO6RF$uY3ns@X~=nv|1b!y)Asa1QfIMFs%`Y)el{v*s2_# zN3T<|r60*;5Cz!0SvN$LiDMnmihzrG3$aN zUMNNPeSN}?rCsZlj9?UMPv(pw!Ola-*!cZKvyU)zHeSUVDPD>P@JYpb2mN#ih#w*O z>1kDbk}}z6-mJ=|u(OL}iUK;BAfc1{&mqrYd3`)0JJv8R0?5Y#>E?p@)I|QR28O0y ze6k=~+$Ntj5GFTC3Of<;i;=!{(7~nr8YbULxi#lOkrt4^2!PnVXI-86)#4|YOuFas zXQ}h^sEUUfn^Y^1Cp|@3323q>$05623*z_NIt^0-(v^o?)X1A!Z7V6TkP9m(?}Dh; zvx|736x4j?*-x0g^k`DES-Y1LY32P@!4skbw$`MmO;J$6KIlBp+_qAIE!YJEuFtck zTKkh|WxN#d+82C#{j>wG3lv}F40amI^!#KSb*Tf4Fa`fLZ}+_m1%gn&Bz42rbg&9J z_^iN{nFN#5z+;J@YH((vSi?6~9xw9!M#?3Ng^B~{bW?bFGVEoCtaIp6*z;?@Qf5Zy zAjMxQzbCLT!nU&7Oj6R8*~a{1zt&F-Czbas-`{&W;DM#>RjiIw&DmS;5fWwsl%o=? zuv=9kX`;gzr?TYuR;nPRS@GW$OKNz8!NshMK`wms@BU8;rcHJgD%mIH%EV>`l_y@0 z=j}OimLwz2uFo?oXcSmu_|0T?K^Qtso91qA*1pIEMS>aG8_23T1*eAV*yg3Bf91gR zBN>}01y_3hU@T#9&`%1iH0~+AfcJUOv1Kg@>boF<4^0Ntc|3mR^Hd5adzlcgEgxG^ z3+*w(AJoboVZ|Wc7Vd66xnZ~u^apudV-*uVQ??~&-K>o97H62OSs)C_vI6`O8t|CA zM1y^j;Kw#+mY^=>YNP%YE&>kpYW6^O#ZCBzf;QBH6zhkq{`_-HMRE1NGE6_tsL^EK ziqdLj^gd5+@5k{`=1W#(R8nTDM)ZR5l;t;O?^9)4!HiFtw-hKy*y>8k4<%fJ2nr;F z1#{c~CbO3N=G2!s7B99#(p>hyr44k-u8ZY*p(Kz17iatme9;@gfWMAg4U3<4!c!^t zuV3;m*mXDvV9OhJkyLa8=ki4Mbel-)5|t2r%7OM4+xI9AbBGfwwbJQGkSu-2QaQur zj-;rSvg6xpB@)QN^z$Wnygo(DzXsYWarYy=zyg-=#4@AC3h>V-9jjN68*`U)OQm%*oVLMXdh%rK zlp5Jpye3CW`nlY@$N`Bu0o-^kfh`PVLQ=ZQ20}cDe@q>X?JP|L3p0r?z%=HE949$! zAr)_U*ntifd)~uledQd5yu-idLZ-5X3Ea4V5H5Zg7KdMZRrN#$sfB;zV%S5?r0LEr zQhhV7LX%#73Vj^AvwznvlS(R2#54F7sqodq;DN z*`-?{)FB;#wR{FqzT;a)yhkatmzW!Pr&n>fJs07f%j9o47`*Hm=32+!wehdGn8Z&O z&6zmuy(^JntA7TUzyqazC1mSl+urI5qih+y=rQ+*VIUJs#_>MK_}z=&jTw58kE8?K zGgw*L^VowWzGemUnhyD~{Dux@e;Q;Xmyg}ED+iXDwECr3bJn=%)kgr_OA$lo+x(hq z_8UM_f^;U);Rh}gZ&bQbR6=iN-5-*3Di!w`jW8Cfu_61=1rH&*#v>A4kqsD-k}thI$U;B4gLP zASp<9uc7-JPc1!ra)-yz1~o_^{d-KNnSLQn&s@mBBdx1N$KO?p7hIs4%Y$b6IP29R zld@WsJfl3(*#ND31=TxuOOsW$M*8~(OiYhHjbWq$wK{kvj z(laATJkM=hdI$pnf^p1bqzMwJHCpKYJdQmPtNJh*bn&n$Ac)EuC!`@>N381-RdaFV zhBb7vwpPDvn$1g>z?L9}_ddSOUa?{jmgEUV*^U0m&i2;{R-e<$9CWjzy+$nynp|#^ zY?uQ*lukj!9NbvwNMO)_F4uuLY`3zKOt>5j$fW=#;S;)C5z^peo=$nXw>^CZ3o%zG zl5u;121(q~hO=~)LSBEhi`21yuYaFkMhzRADdo^GNp=Z;5M$HZLK4zG@Sd~Hs7W%N z?ty&uI;LNq@E1xX5{MZ{cqg8H!#q)}tSuHVBxQrzZnRZiN>7@-!samb6(kH8VThkx z@`73IP}TIAwxjd`6*;4c=~L``8QKSEem%^Zo2uEqQ0Y^?%rTd1UYB1Vl`4=&zL;I` zCMhdFKH{3KUuOs5S4V$bp zuha(%HK(;1+lI0i2|G&%-zc)TfAs6P>{#$~ZImf9opSK*I4#_U$QsRfF_@;<%}v>4 zsjK-w{FixgHl-wn=|>z6gOMB3X?W7e*pMAbR(OEsO7L5kpM-GQdzV!=;=!ydC-Xjc4zDJ~8%+B=()uJHI={1J zJi8gnl&fIxet7}k2ete6wrRGXKL=4s!yEj#&uy|`OrIV)O`Yj8I7$Mo>#=1d{6JQQuTaxc3|M=n-ASb*`_M zQHcUyL(*SQ_22q)7etyrx z>s5|S)SZ}_OE&KP+53D>nUC)X3wna~Ms5DaABpAnnTBh6HkQHRL4$trZNa1V$X)z< zSPAm#qyL-6`?6QaKl3Sja zJT8_`y&8;`@HiR*CrwhMCEOqP(888l93uAfN4G z795UZ>T4dS$i{i#8L^M_ip7O~luCOY4AEY`mWKacoKH%#XS=)-_}Aa%uhSxf zBWB_he6Ga<8=zOeT-3gdLgwRjH|m#w_|GaQ%FV|?3x>+uVAm(94bIfH?Zo)!*@vr-v`N-iSDY#xjr_^$2o?Rh3(5ggH^^XGtg%toKprp zuX9g(0>3-H;uWk&UBTM26+ki`XK(#BHjcC3t!J_F#dtpS8k}j2C0UDxRN2G~`@X*Lglyu@T9Yhdj!+Tu8zmxhSaF9ZRGu@38w17~f50dGx+L8` z!VfSLzPbKUS>U{fj3%?BUk^3l)L_pnBr$sDmL#xv*sS{w8{m#zUu%Tz${0{ek!7;1 zeP9t-xeQ$;W9>#FexG{>2qOG}S{TYRWa{)6{!QT3BJ-Y+EO!556-GkWlgc!Eh59A+ z{XQadhm8GwU9|B1eJiDN&(A%KUFHr%U~jOAGZV)WNC#6G9}R(9SSB9R!dL-}v-ny4 z+3fB@RXAn<2J%`^f-j9}N+)_H5!^-4b~C84Ly2gX?t>?#mV^TM7_1d#=NFo9lEklk z>@W)XU*NTV7P9yPTkRWckgBtD&Jb#-&>0x9}oJh3P2 ztf%@a>0Z{ckf#I_ zV)q+msb%vu7Uy}d&B&8|h5tcvhEWP&I2}^tCLN zr!^F@03HJ!uPaKx;79yAwXc70%AFoVlFY*wK#X5b=DIf5=a zr3Ot-MkUMad5-MmN56CIL2~Z?ye?Jc8pmx0HOlKg$wFSw5W=z~N?VI3uvR z49VFLRMGcG<>*nf$oekE=q~Ax7)@3DM=T=_JuD9bm5U!57I9yqvmKKlui76k<@J65 zln`5jzhOEnI1V#+#tayhBP2RCWXKt_3s{GreveHY9v?_eE#|RN)}XP zt5)}Yc^5Xk2IiJRmwNRo63Qm^!%M8OluYX#iAPx4Pot_-STZi)QJ48vcPdw7=e=M{C8`Ud#<0h=)rDi7| zQWfW7>6pyo!0-Bhr^a5ff>t_l?cfi03mAy0zBG*ojfwt{K50`@bjRup7}G2r=I~Nw z39?JQ%E2NFTUyvHrONibCCH^9x+J*Lpq1leer$Tp*-1oN7hHSa+v}*H@q2=JYa_V_ zjPOFr!G8^Tgxr`PY}V}FgO%1{a~p^v*{3@#IUeg9T>d`k;VgoZYgu z0fA32EQEUu+5QOK?nRb07w4*p22!euA3UE}ZU^TRr>35zG6um`(Ic3Zu`@(7zz8cC zo|#-3BdB6rpL`(3vPPT&D28TA;K{*)_%p}c8s#NJPbbwTcs=|Ww-M?4@vgBxvN6Klxu}3G z7&v3W7>rx}D6|fS)n?l=WD?hgI17FR@PCx(rvO2QhwcXxX4_Y6(1U8`uc{XBU{qqunM}hRH)d*Xi zee>Yg!oD&69^>G2BlrpmXufag?lCaB#LyD37zJ0`NlO zq?lm-fiS{5{}jnSFH^Y(kG?>188BzznguLG6-@dC)sLtZIT9jKw%vyB%dj%|Q85Ke5^b@BpH- zEoEyjF4unh_V}xIrfZr$fXllo$tsv5ZK91)0?mPXmq1JO3-&9aa#qZ<#m|`jzS>i| z5Xlxg)1ben%!5}yz|bh8XUMGlA$ta^e*Jy35ISEUt);2K%%#Lk^+HlYfWp4xO4JeX zuo|7zv1B@qxpNGJXD_=8GyHgrLF_}Llut|gwS*uVURhbRxd2h8(t4tDW?QVO3bK!^ zV}?l2UtVK(Vjia^W0b(qq+w4onMC5XZ%>?kLYC=UeeMHsVeBIO#3 zHG&*?%|UWL`1CC?t&zQCx6PVYiO5@4rr&s_ajSv4#L(Gngx!i?G^Hig-Y^^-%F zrT>c#zoXBwN_>hCrihP8J>f5>qY48r))Dt9nM?~C!FSc-$u!kWRr>R4kxOfg*YCIGA2B>-r)dkb=ykMw&{{nW1w;_er`!141<9^V=q2g$I^}eswm|&(D7LfP=G+T=e6SjY8U~f*-ZmzXk|xHXlvZyYYY85ogHet=$S3L4 zt-X!Yd-)AObU5M=4j9Wz{a;`L5D@80AlV&$y?`nWpJ2+4_7I9U@K7F;dIygNTjs=@ zO2E0qkxL&Mf~lJ2&{GT$zohsBPy8NIK^jN>NC!{5t8NsGv$CQ;{5c}MvE6>ieX!4J z60+~g?am{;{MvSOSwE{&_!v)E0K@8MtZ&dIS05Q|0GH*^N|`td3i14P{R6{LV705>i2CR~hJ{P2Kbp;GMrHWW3@hc)U$Uwvz#iG^aIjzmhj|n&Qop0%a8)=FSw!4>Ulx59G1{CZqIj! zJ?LRzFAo+XnbW4@;J!WvFcU`W@4IuVr^m$G2j9}djt0!);C6~7Q1QJ^jG7vD6%3Xh zK~4Em0~Fp|8_?hkxfkYL6yV9@L5#Kh`UIPIl=G55Q(d!@ZNscm6Bi_PP0qPIXt;wv zfH5(fWGY5*w;kL^0C}Ke+fDbM3bDoEmE2>bGx!%PU?G7TbnNo_-U6=CxN=4l60{Hu1UG7{=GU=nhG*?Z&Oiu3_-{(#Xm|O<0P!>3uGjt9hJv}6nc5R(|&MI(8 z&8l0SBfjShR4#H*Ce-*=DCoU?wWJJ8y`*%Tae_u}Mz);>(O$XH`6v37+9*g#XvLG{ zwvi@l8|`tV(wIAF)iUX~?s0*mOWf4iIIFN(VzvUJ-;KZm-@Ro?dg(#cd}%4emCVx7 zz@d6`OG7*DWJ|vp9UiUfur0I~3%UAYoKmA8o5<;Z@|=m8o~9y4?hXi=Z> z!-A{!9kP0=D!L7>`@}z* zd*%6`$u{bTCDOQ1mG~Ajr}YAPJrTm*)qg8THokCl9^cO#zn~Cy&(7cT4wh2No?7#} zqCxkZ>E-S6l+smT*I_uQ!L@2=UL$>y(OG`5j*GTlrt+!!{<6{}M|IxEnRCwbohvB8 z4UvBjAk0|FS6)IDBQRg1pU=)*@GioXSkvus;J_592&MD}@=fmAM_oX?EswJ3EOv2UyY64`L56L-53$c z;-s*;qps&p(d!5bg2xsw+aIYuMY?U5I;%FiF0|PA3mGVqyQEQ5HfBgRFYLmK8)C1w z%|seT7}`zkF&PvA9X}DG#)6A(QQ8ZD(pEn&r^HN5%oe9#lu zdzj+hc$-mWNU8v&r!YWj)Gd_+Cf;Xrg?4x#E1CGQD1x@!jC-v;rZ#(DpDbe*ic6S8 z8N5%xaz9tWs&16^`;1nAzkf!!;h?w4ydFtVt9D$9zmV&k(vU-8Fqc9}B4zXZsidrjl^h$LU=#_*tteihfi%oL%vSYvl6Den& z>v;p~2;v^$dka`J!)H@+wIpm41U}iA=0&Vv;vUeH58x4L`fvleElqm>L;x^6Ec4jC z`pIXei6^zxJp^x@~fm&9)v8pMbYUsu9i0_81L7kz=QCPwV!oIZe z#_07jhk3jZEEBp!@NMD>%abzW8gvXQF=giaYcdG^evj$ZS_}n~T@?fGGs{;0${sIDh=xDz0;ti2$qcL3uHD{4l8lkK%$(rr``16= zqf3xgs|>59z5Y2e;@(>n=e=F3aC(J;lK#dhfi|bc_g{Tb4hHVj7aa&=)c{X3T(<3n znBm)J+j65$ptEoBck@tANiKVzAQwNUS34f_FDf`dcj_Ht zde*9$^PFufcyiWL!Mc=z7r3aZNXCkk8sM_$*%*r)?k_wQb851>(M8n$?{&@&MWLXj zs-+f5n-uns{yOo`sQISAH8}H?81wV!ez`F3f7H`O?^%00j#p+x_{~H{TNu3D7N-3( zv~(GAs@A>SrHf6POuE5Y5%}7Nf-dA%RI_^5Z`gi52~aS!#teOYboC1+2M?yxLN9Jw zMC>A$OwNr|r@oH&rur$XZWxjwGhylNDdy*kRIL_N8>?o0aUyHpIv2yJh|?)YO$xIJ zJQ$>$F?>nZE9)$COrv;Os}3}@fjtQFUONe>Seh5|II3%FY%)*F$S-?%-`nA7!>D30 zsgr%oDoZ58%aFBC(3oH0{#5qD^nm_>XpVC4PrUvXcu|=NUZ0~DgilRxqOOD7RgpZz zs7J6DT<*`}%BD5Lbs{M`H>40LRP_#aKqLx|iOIV2I15Q-?q=Ad64-fk&_LevXd5$l z1~Umk7O>O95pb#=NcA6f`7}4SG&YO5X@mlLZ^1PO4N}(WS3eTj)Ud}3jvPzf=Am@1 zynH{vXDMKQO(kOU&^_K-3Dh{uzzy+HiPy<=$~Z<@B@GH06PDz%FZ-aPwEu(!Ml@_> z8Fb~+N?%9S^UEK=PXe~m+Xop`rqYgOfTcl_r*aRLfCyZ&MFOrbfcmd|dshP$`E%dn zB5a5Ek=)K*d)o zW!$av9!e{e78`?WnbDqw@ss<>Q^@%_cu-XtVAerKg!%O+P+^0fnfW}e1 zqcomWT*TwUuvudSXfz#r9|w46rlPJO7;7fjrh~7vxcck)cNO}WM-RbDGG4&W_Sr-yx+mF6{x7eA2O%Nj|{JtFk`UdunY7e3JqE6sNXd$kkqg-Ksa`j-MaR) z*Fr-ZwEr&e#ofj9hwY>pi%Bbo*yCeYiw2#cz^eMZD=5>t06D^LSF!RG`faG zuIJDel`B7E3U-)vD79?mRQu2(t6iw2<`WZS%rQGaiG8qw?kh!iT&6YHk#m!hD`%hr*>2F*`8rpVAGMYsVxhmTLbub=Y0W%7s8z#$DI3~U@rC$OSj z$x9k2=zeV4OU48$FF_os2$}lh05yF>*EBCP6Zw-$^8u&Rv!XOSn0fzkkqqap)-NeWXxP=$-`cVLtueo$8H$LXbRU6(pYhOoM zlxFw&T}F@Ju0U30(Km$oEMF1n$0-Mha&KSbZejbPKJ%r1c~*etBcBR>V17IxLNCT} zWrfP(sk?y)C_wAy_-a$E+fNd*_|Y3Ecelscz&eh;fb7)2XsecP-BSqd`_m3ZJMhf) z6lPDN{GNVuJ#eD&Pgd+G|4Ra9xzv6AluAMkNmq#(t-YbywMNTQ1Sx8W$IEXEJyGy&qvc^*SO$6)IuB&lmT;Z+XqmYCs+AT_k5s>Z~Os z;Wpi;brZAH5XvSlRVi8+9iG22%XYNN#U-!5paw<*_*OZS!3}5hIQtJXy?p(EEZGdk ztj$rI0jthYKwXtRdtjmu&Jt%y!;VJSm06UKg7xqz8<-t-G;pSVAG__#&w0hr%Dxzg zrSGy15X;qr$Zt|v7fKXpa(DfZ5D?&kP5a3kSz~sd=^ka zx%pNsMW`eh^Jyi9eM5Z9;0V>&OxcUh-CL8!Xr7gnm02!pmH=wsgyoR99{@)HX1O4D zuNKGe?25vyjd96^(d5tAZJOgYm;gFiJw_`Z7vf~3qb0fVJe!fOw;^|z`eDGz=N

    gVODxKx#t(>zBw}Jtvq)$2@kX(fId)-; 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

  • d>?L-Gt38?I=(%p9~CH%?GjHJIafGZ zGWGGz;bBu&PxrfE9V0%Wr!%9fz$8^rl+nbAS+r> zB2_%CB#^ChPxi84FHc(p2W7Y)+Fq@VcjGdT7e8h!Ly@-g)ybXYx0(U8B&%N&lX@XV z&3eiSiPOrE;XgCv*|+?mQmQeDG!UiRyV^ad((3HuYmbaA3V`Aj01kS-aBBWwgFoz!j(jQI+@1>1l9>h)ZhVA0k*h{Tp z)~A{MbVGH_gvnJQ6R`+^{B}p>9xsGd&fVMhGeTwOmL`v~X=Q5}Y(uFJk6W_&`dS(w zF%t_vq-kTl81i;T9K3bChTnm+1t1AUkrMM@GG3L#xi;o#~D8bMbbkzo}PjM{I&+_NX%t0sf!b6E)y%|D(Af7X# zkeYiPPR`^(w|8&s@@^XQe5=!7ZBSVs53V*jcPR`l85deW%>|HXshzPT*N zwyc$fFEHfWg%FmXOJfstw(WpzrBzl=%75TN(3Fu;nvtc;L=U*`PgpDt|BO-w*`HYxzp6hp(~LqU-zT z$8!u&2h2M#qtFwXcDVg#%d!X;+Dd(N4D2?#<(}!d`!lDN5##UX24_;g6#os*wB)feTa=`?O5-^fHf4RLenk94>IkFGWh!!&qcnwzu@3sW2zNIp#&U~-w~xG! zAI6})SO=h8eDb*4VjC4mpu^QsnG>H6`yAwBhWPn(nIu9E3Z(L`%VWzv#PLo+Nxr_C z5nut4b4z$^^iri~oow3@u2K&pwKX2x>Gh2#TjL0rZBPiK4upjl>GqXC|B}765=A9o zWfbjNFOu%{h z`9Bv=9jbWvtRGp3;M2y+!uvW2O&X4h8&lmey0x`g07q|H4Ty<(&fSJv0I!(I*W}pD z7^MU6o8Hyww*mIzOmd|9#3W(^ZLprbSEwxVuxj*(zP?dK1K$VK>KNPfMV_I0RV3Ls z1(oMJ4+naR5fMx|Aq$^{c{Fb&JY<7R9p0;SboRYB@uOeV)b~0dW5|&$4^!maZWP}_ z8hqeV5emiYm+dH`gI0D+qVA?~ljO}>ejm4WL}2Xvf*EM=bg4J-QeLBFmRnwLt}7ii z(#N*jEzfNvR@IA_GYzBCkZzDqlW^If$AluX+JTgcw?bm8P=Sw}o9qXhJ<1d(SmQ!z z(r?NdmOPA2)L{K~L-?|4F@REuEU2$1+>aC7Chhg0!pPp#T-Zjf*(vE8tbiMCX~@~Z z3XdVAvc|9UFu5Ez@$pXmN367A|rW$6x0biX2|$Iwgb!s|$11##KkgCeL+Hr5rCvWt;UDwYkL z$c@^3O4W0x9+h6I@3m{LcQ~>_4x^QqsY^;ZGZ_|!qs?KWV&w>apzpwo`?MKz za>(_K3g^H(l+hz^U46&?09MS7u)=>Q9|e<5zi+n{Eq{A$p2mL3W;K1nYGjW5f4Vdp zJVw$M7?QKq&`5YBw~9+Wd8;&i`aTSon9ZXozrVc3${x2mF?4g71LW=O-Me|<2h&tr zCCZd#QQ}vj?*)Tg0nbeT&JYl{N*6we&!k43>MD{5)h01V&6n)?3w;v4Y<-6oc5 zm&>F=q*+Z`<{Ls~VaX|do75|7CAoxB!3stALYEZ=v!-t;VU-%AqiVaVk=9Q&lB|#x zH-scFpS=&Tq-7Tw_W8rQmrz4L4g~WCLZu;GV)j{lfcX9h8>6@Mqz zt^60$H)t|d^%m~?nImZ5>jNX%T{VH%)p;xxR<2 za;ZK&gZ%rm7XF zXX*6gkZ5a^Q8NN8qj-+NP(wNZP4?{)Y+J3#g6P+y7!q}C5j(2#&<<_wam2QpZz_K=n{li$++AbEFEUYp9TdE z=3~D>iu=S*&1H}TWfhWc-NNZ)A#bRI0$eMlUATN)0h%A={#@U0WH#5v21t=1$MF~14n zhkvhJY8E!)fh*3Cilw3{fX5OhDx1wcU9C@{g0M>R2M)&cJ<`e$(Vjf;!|))&!E5<) zNL^1K8r%{-|2LLekN~IFpu#$5AVu$1hw_$yPS27d{d{L69$9CEIx^|29yV(?NQMvk zchB?Y`J`Qk2C(@I^|c^&bN~rx0CQRmCA-N|#X{{%48}0K2Zcexx<<0IjActjcvU)T zK``l4EL>LW@+@==HG{=N184~-al9f%rO^C&?$Ikr@#4oJx?bY|prCST^bLl5$q;$Z zpL&8-MusjVL0U#`Zi4UNI254opJmKnp9J5~Di-Ob)9Ey;L9sqSn2eesj;+?EEVe8K z&s%b~;9Y^kcG{=8Q&s<2h0WjpIA5@JFqaCghn>#ir3`IWS5^c+?$U|Y(ZCC(t7~vN z41i^`msa4+PsLhBqr%r)NXAPID+jOm<|xY%Y?U}2dnnM&nP_B z?mV5sq_b~;CyD0{Z-2`84rTNCKsJE+1MDhL#+aKs`GNG(XP&SBG3MwXQo2pNotHq) zpY{IP5+tEmAym#zW#fMK5c}m?lpZY2-*rSy{Z+Ac2gkc|gW$Dt7^|fLAX>Q z{=v>0{(WZ#3f}K=ptw?%NB4Wb>{=WYU<)H01^BD-UoK5jf-$GUTQ|X)OTUmQv;W{* z+Zk#wuNwkHVgZUZD_2foynk!Ro^h^2*0aE-*&cF^b6yE6coLjWn{DhE`=s{Bl07Dq zRt)fDSKY@|30KCrAyod$Ks_+UMT+cz22J*5+Wh_kCECaLfyt`Di|jIU)dF1q5uapE z!NS)xl>NIQln>*%(HKmc@6aCuBe87w?z1p>5eRwB_tzWwVNc0@$`i%pUK%%EEAet) zIZFG}()=GM^G$W_Iu*n!Mwu6qk&yF;rY_>_qjQ-GF;Qo~gLID&Xg~l4WSY$bQ9BNZ z{zCQkY>ODdkc|@Q+wRXjJ#0)>B)9Kzi0}oL$rx_s+AiZ;I?%piv)nsp)jsy~V1O(A zeg?#-1?jTiT`1@&Vp zqiGbqfHe};1JAGUz@FRu1IZPs9^&JXGIEWq+48)hL9c5!n> zp)?~Q8z1|}D2fm9+yvtL&*;^IKc31Om(s#&@#Sd^OxE7$bA*C8%;!7;FOd|M_xk7u zn;`;bVBu4~4f+K~e3I~$kFkdhs%($fPq)5!<8%z|282i#a|JiMXRoK(XdnzxYCXF( z8kkWSI+eiM&v>Q6d_DcOg|a5`Jn*aVExd<*;>Ike*8s~0FG)?h^k^W6$sk4OU~I3p z_m-p7IM}d|DPQQO9Q0zaYRTr-_<0H@QQO1T#SeNUf*a=Qi8lRActJJa4TDR?Jy;_d zJYScs!0?7?ery>c!fMxt_=rQw>#NCak)PL5l}JU`oc{ApNCohd1?A%PB686MCi%WY zN4d3ttg$~#`yIz+-Uy|PslfLSd*$N>7%<$~h{Q6yhmted%dgX%O9L=10j{ZCr^kVQ z%{2(o-og4QRd;GwXY4S09t(DO2x=i{rxTvSddcI;GG@Yja;dy+a_ygFF0vS*+q%C` z=g#mF#cK^EB6xxhZ`>EPlgPBx?wM!5x#_E3LXl>(jQPG*=j(AC1=Ej_RW@*4MU>}T zYha~f4P@NWMfzRC7Zu%cpFG|Rb0!jmCsP-;@WYTgBivwKDgI;LE&PbJFn`tFL#Aw7 z6F_QR3SZp~WWTqTe!psuTk%!KjDKG(0YjhLm8P@E`J14Iy+@n@l^>KJQXU`4SFCtN zYjZ$P@NW2Q$eXj>+2+?+!Suk880gnu7%36lhsOVv=iHoT%b+9k)iqu5w zabO$CU+uR0E#3Oc$JGo`F5Mb)j9F2`xYMaNmMLKnYhNEl0%j(W8H&~P>9t*&v~D)$+G&|jFfP^MN5Db*#E^z&{UG3ecg9r7Hswoo@&*V5cyJHxlw`P zW5_5W3*c}5?F$MofGg4Z`}5-AkHQR!jIWPMx~VKZkk;FOr@PDhxhl&Cti67E&pPr> z^?MmJRN__3g5hlXW`rv2-Q^CLs$?nSB~t0-z4w=WV6v+l&Axy4v&p#sE9}d%BuA1Q z1)6>TBNP4MMil@ejGFg)swy+W-BuEcbrHM*Y?2MGayoESxTqJ;9tLfB#1f<qB za(m_N9b7Z8)RxX%{+VA9^tP`rJ{rj^%_ z&?F*f;L1&Z!8xIM4ncs&$@%#O6g-&znHAQjV$ zU&Pwc*R?6-CGIuCtH1X`Z*uwbW{pc85ICmh%D05E=9H{wQq%f5(QSrOxv^FaiTzwz7&s;kneLD zQZ?oElC9uJevdGJZ-9nt#ZIkTy;;DGX{fqCH$yuw`}hZ(U-pPgJ_NUG&S%BS6SyVG z5e<9PrWWgsXW4K4U<-3E*Q}}7V-_>Z3ky?dUw_uE=x47FDv~~iMlov0nBesIrOAei zQ{g6B!`JxfXwa0fuAz{Vt<`V&?_kT7(cR8DoEBEKJ)ptz-Jqxe^tylSlxO6`;zCy(Nu38%4hDb=2c$6Y?U~3ymW?MLb~TX%%qJ<-xn@F zpKeUMUPnZb5XxRvNqV(CzOZYZTq%sy(EU=$%ef&XcL-g^+_R)Z-3%lv=B?ny1n1&*w-FWhrWv2r5C*Y}cjSy8UL#J{hh zCxq#45obut%lU^C%ka&?01no>#dKODP3o8NQZQI!)AucyuEp%$5=j6kDRDNh+}v4k zKbSp6@nt=jt0I+*9c!n`=oKz1f0r|-e_;}s{LQe;Rb`TszrHV>pbOBeJyQ`0Cd2it zGOl#O09!qY%xb}9^a0vOCe)dqz1JWpPm@s`L}4j#PSO+F9Y=h!h3zxM{jgFQ0Lueu z_^GU_q~Jk8O@+>yjg2ndBO4fI9evGd>DfR%Lh5uv(g5A4e8DbH7aHVcXW5eYS62ra zp_GtS&);K3Uvd`2!FAM|$|2Muq1%uNs<`I*O3=UU}LrZ4ejD31g`YGwXv`2G?E zi-jgxPU}dVu~j>&-`DXhzeiCT%bmdS9kFX8KU1t4ltM7`*P|QT+`azBk-YzVjvNXA zusCwm^B0d(UlY8ukkQMBt()})s8Vum$0!31Ds@Ng%~p0Tb9Mf){}E{#!mx^!*AHiV zwh&M!4hSxFF-KWN4`3XfL3!oXR~7_pQtn6u`cz7|u+@>V$@?;S5I_ening=anSmI6 z-nNH4!X3~c(Fnv`fSPx|2Q#P;fGNAg?yZb81`n8wm73via&?%n1bi%ezgGYv*RS{7 zF0S1ZrLD zgQe{n0PI+yS(}zXpxD#8 zBaATWry4}v+7%v`D7Du^6^?wo#-v5KCjEPibg}&J_tA1}fJs4eohU>r?>s z95NOJB|R)RVE~qbv>oi2R2$bxEc(Lr^~ymF4LZ4a|BN)14Pwjt&L*3G20!jP%Ioun zm;1ke@aT*gvJX!_pB?O=v3R|pAyTe*7mt({YT)FAWP47@?3(-k4ytgrWsovopt6Cr zO~=vyT*dP}%XabYD*SzD4*Z_068hUSc<@T$KOjq1dN5&K5}fkv(}_gLss^mC#c%3l zY|@q{h3Qr-lZ{0_mYq#3JHIq~K_?R1+5ou#!>%}Sq{-DMSIl|1Fd(9AQ}o?8RuK9L*687h z`Cc&qwz(w@R4Z!%B*oBDtg}sGw+KkAQ*G)Qq=kJdRzAvl@_at7WMem^X~XlaC_Iqo z3%Ixtemt@yrdK}Yc0F5epcx)PV5z)WioGy5WXr-nxDxbM6#e%dK0}wX7FqfP+>l(& z{}sj9V*Obf&c# zuglM#W~K}DhwYNg-$U7Yk7ESblC;9?X1D^91cq3mc>g(tv5OsWt%?J!e3t|4?Xn&f z2)+!Wmf!2zQ+=)1L4Lnu9qG5L`r$1DMd@z%Z?TYS=UpxT+&puP#O^Yk)~|;yfW%q| z%Y!N}SOnJHU9XpcPtHM?JiKhRf2S~!5_(bL#oosOq#>gR5b#HrFsILdvOWSj?j^Rh z8e_S#N6^gEKk)ea(Goy4a8vN9j57RpY|`}wdBRjZFR)~aY4LbDUKTByPG1>Dkzpij zsWWV}Lf?}9Kwl7tttNLT>wi4*~u|X@D8fb5ETG-?Ly%*^2!oO>F_z8*O9~}F| zM2&L}Ht@p*l=2M=i1Zxt?`DlY;vuwiA6*K@xZ%lRu;t~PbWQdW62|C?nhFb0SY{&0 zJnC?^4ZHA3>VYw88f)ek5zoOVzW~(#*#umGKkWrHpd@P`DvMq)MtVZlz>%kJ4?OVE z?>}5lMFLE;b@vUL)b#wd6ia6~$v;++ija9fbdaf(6JOQ$F&_!BSOWMxSRAR9dA|@Q zlXB@GOQ{al!#Dq~JF{JOq_Kp9`Fg}f#NNX#P3B%hx`Qb@vTP|}P5!>-+`+6NdI@RI z;d%)zC^Lj>r+=O`-Y7mok+q!`5f)V0Q@C8L@4>Tmuh4q^Y)@m@AJxAF%h#&yLjjro z8Gf1u%A4*jurNI{MK1ktF7q*_%f-d>_xb>l;}HnT$yl=X2=geW&SF=&`VRs&t7JZY zgGukd2l%{mgu4?%7*blFTX(_s>vW|T(i~VE5?4j=#Nd-!QS=t-bazu zW1(OybQp8j6MH?LBhpgL3|?O#XfkqEyqL`Sr>zLUDg#uO+AZI`zE0~q0T&ZwpYvrW z{A*F;!e+P9Ty&og&L2PmtaO>N%<<0AQGylZ)*V!yhQw>g;H`0? zEP)6Z1`!3)6?HIqFkRMKbk=JtY_5=mwL4QU5=S34hc&`eyIOe9@b7X4;i96&=j5PE zdI9FTZb@M-+sZYlvle!Py#z?B8$Re zWSkZT`x+>Yz2zzGPR5F}X7J;`x2%^px7>A3moY}9kD=W&*ssY{Mp9`MS=X|A$Emg> z8C3{-)aLKaEA!`9YtXh$Q1`ux7d`Vn$K)4Fl7`&n`MK3LeSD~T$Q_6a==2O3yaE)$ z|H*YgFFiCCqyPD%>>`)X)9WJ?R{nwSG_u@_sB&-5lMQ!wSFcE4ABR+W4EQu)tEvGu zYfr%be0kuJ9=x^%01nJ%<%`oV;69h&z_do1SA7{51Ory-0^9u^blN>kYXD{R7;>4~ z)9{CG%vJ|tSnky z+f9y5n@Ld)B=5(NmpR2?kIUp(^%OdDkKxVs><1<6#%$Sf`6&ygkqm3UDJPdJ)Io5T zTf_V3{woP^Ea_bZaV^Kv7CtP1!r08MmR<*QC??0tEWRbx=3c;LHedOd3^_YzS%My#a!y91*qV=7s84eK>KjiT+ z>StIB-!ERrDN)Dwk|8D1Yd;jcVT4Yc#Y1e1QC2dtI!A*v5c79`FIjlJL*F0!u6-pT z%Amh!R4>All~Zr+J?UPlzIZ)G@ag;Rr(S+sX4Ff@pwez9ANie=l?OZ)If(k_lse|t zERpP!`qQxWlG~qw(%glybgVZro4?}jzciL4ZosHa)b`HmX#2c>kKu`lH!JO}r9v|$H~E}B>8AuI5FM2uXJ}Mk6KZOd>epW;$Ow}-%|91~ z&s(Xq-Z?2ICPs&!u3zx$amokRz_ivcWxdL_p?mjtm5n_1T9L;){TLoc;NzrsBF@^M zWh|x9f1vt!X|;iB^=-x`F}-%kl=7t}Xr3!unq-D4FECZDz~>8Z(}pB!xiD0@?>oYH zqo-%}bllc1m zbQ%xS-*_e8o}cN`?C^@@%0=9jUKbFaoQ{$`)n_6MvbJUTE?kzRwv|4=f2NyU9jHCR z_&u>ik&pi=LnC){c=IPJb0-odKT@LzDKTF{$m^nez%NsWhyJ~+S{Xxz^sJzhA98(D zSE#jPQEf_Bdhqh%rN`OU0r?g3K+RMy0yu?Ik4R-Y8KvH|^qAo~#zvh;l#JRsMAaH> z$3raimBg#2vin^N%L=LL+2ow4Bh?gDzH4w{-K*ZV8DZB2YV|>U;!v+G$2HeuFXKI zw0Q5`^n1F#?to|m7@oV4zd8$Em!H)^>zEvc_9R5gPQm4I!GGH>Rv>uSM6#z4tUdb& zx550d5Jf)j*Zof|y}^w0`yg8RGRpjXS7JqkE3Ry+3m`r}ZPhJ+Ei1MU5Oa4=mPCpr zD_05m0t#)doW;xA`oHj^G6U7l4ee!mf{r>J64J zoM`amaS87RPvSM!Y8a~jGUQ`uU|;}NmUUIlw`2NX3QM43H``k#G>S`?#mJcoAD&9_ zOZsIidx^Xk60;aNU-tVQcv&4y_1cx$qB~K_>})HSxS=a$!XBj$GTskYX0TjevB>S5 z6T>?9rYvO~+o=*+u)zcjT-}>6xB_dRJI4H6#b3&aKYkItx2)U?pdSkdNjbcPH}Kn< zWy-y;#|?cq_zOB5mlnfMSkQJm43_EzGn{R^y^%`=mdAZ!1}cxQZ1702{Mow)@8`N@ zQ%xB2YwctKn(bgdwWfImRBztLn__;e)~vX5`WrdIDUn1^W7qAMJr4LG3GUH@4VQ&Y zO0L-U#c-e~ag$~8%(@eZin3Xc^K!$Cu1!Ek^EkfYxAy1ZL}d%Y&n&E`FPfDFdg|kl z%D6Hj)7Ij@93+ES?@s&PqH89}b42KyHJP;w#&Uj*!XmOIUkiZ98pjJVSqm5yd6o@2 zOT3G3nB+dD=q>l%;)NlUDE5(anmrauN*TgpqMs{mb5=tK!Nds-_Da6YP26#pt&oc4 zB%MnlPwfr7dB30+hhiy~9(Q!od-;?>tC+kJZ(jo85qfzzC3Is7mu@?geHV)DW4AbK zZYTh>ek>xT?Ad}mUjP%+2;6g7@fZ`IvoA8x7W?cdLx6mGHa7-hRuPz?VrU^S%4N4& zvNfrKd&R{f({hvgm`xaSCn;-$C%!GQUVU@|qejSRbN1=L6mv>OhfUL!!{ z*hqY;wc)Vhl4}+N=n4ZCFtlCkYJL=)K*e$mSD&`962{Uw$kfU&4>hZAkruQY(s_8) zyai}(hkNH7eKkdQmtV2Ji=TfV3oU5YuW>MJM_4cI3#{B0KDyEYOYZ1D*YE}it88f* z7!E!~R)!b{ZrzOS7H?}Oo5UQoG3CJcAi4-uLYC%qa04Fke@}-UY;D12#;W&%AKhzG znG){TQ#R{0b1!V#Hg(p!y$gNw)BtRr?9lonE|YEkjYNbqzIBM;CGUFM7s0Gfo1#XBWr;UHF$4iE+xb%UvEUK zpIoYTK;QVT@Hhq2rm{WtLN1KSlxC%O&uV_;R{K@UQa+v5&r3>!iQ&Oyn3y;|KUzAy z_1noFY<(0e$D{#=zw8$tp*Yp);3uxgA{UoSn}8LrYseubUygCrV~6e87+hgvs1*Q~ z?CYWeJWAO$HI>Wx+SVc|GnP}poZOprHCGx&g+#BE!0}!{dP3Ws(os=_4%OY1H@KM3 zQDX_9JXk!y6M`(T*eyq9X7kJGbsg%TQ$G(NOCXqLDAJZTl+eeK>-JF=P{KF5fex+) ze}u@=UmwhbAK*!2OsVJp4z>7fPWd zY9YQneVwd-%XcTRlVGB(0V>FZ_ue6nVS)f?{BT zHHw@}8}2ax*_&A_nEu;F?Lzggwn6NqdU!^|8n!wSyStkY?*bzBVh0SYoh1({>>h+E z`!V=;J2#WX7wAk{$m@1GovSq}v+pnhAIdC-KUhEHnnbquCD^tEXJv<_pB80>+VcJ5 zl$ss1mIQE)CyYm5VV*Iij5xnHutzg}ZTOI=LcV<42N0GB2%B?RfA!TV&den4$D+nN zBj*mkSyFxduW5r}MMqrw1sM~x{gp)7M)Go2^2gpDKaCKNeneplkFHd7(7^%H3!Lr@ zi#j+6V*)SedS~5K8ipozrzQAA`nCaGhcZq`)Q9heFg?T)%pwZ)-zbXKUO-_Mwck)$ z!)?=8&b3-&Gh9e-7~_#!V$QTZ{4sPnmdZ3HT%>bLj9Jn*Rk1Uc8X!iYvmL&k7wkpO zp7WJYA4dRkY0vAE|o6+zI))-#|p2+q0A2Y1*IPk z$DnD0<$k>K=W)urJ{%mUoStd?Oj5fq(*royCKy(b;S`&`0*sI01iX^!=dDU&lmaCm{)#na8m z!sf(!!G!l_Ahn@!Q}+uL_f+k(#3-T$t#>w9OyDXf!)VfNw{`Z(>6 z{dis9#4iOv622o&+aAUT;|c37>@^$T4-VnrZf8@&4mqEt?@^qE*E{0dxp#lB*k~Xw z-hBBYTm|c_3q#9^b&eZ+YBuxl@WuIdEn$mw#_oDZ<)ERhBw9DKbwwlC$0Z~J_yGr} ztX`*n0oP*zj!f*npoX0CZpr4HpJPhT7)LyMRc|U6o_tZV{HBa)wJo-4n1Ky-Er2mg zM+c_Fc#cO5+R9Yk^U+Nk)1I^WAggByslGPpXTam^7H@Kw2ADWaXiJfEnYRVX&Rv!d zzV};8*WaZY=)SRJ0fV8;RgpWsb^S3yDLh>ID0t=Cw~G*?pD(TgaPOY|9ZR?MdjLw2 zi2D3qFXJ=AtIAyB;o|!fFdbC^s`7Cuf@9KF_j$yr`t^cHOaAo*iX7`%8ZZ84g%3pE zFZO1|+~~z5KNt3qH(7_J*O`4IpiDen_HU+9&BG^K!kdI!$=Y2o6+W5w2|^joW-A#Z zomzzcL1V<%k@H{#HD$xzYFNEbAA&r%k1ubRQEx*Hkn<8Pm^8;OQK0ZtM z0Dr;)=N*s7y>=OgWdE7|ES|FU50=liMWG^AR?WR~M5J)xiC#ZwMQ_DFL1F;Cw_XJ$ zL5s7qYRf{&^neBlyIsCGo+R6APt$Rh~L`<^E@4n@ofm&08(??5T zvohvV^4-*$4wM%g>j5jPSWww|5L0JIW!t5<6dY?zBY8aLN_bUEjgmkDP@_gkX6WAf zEvNBPrKs{D%0>1b2j*}tk1}K50;aS%XywE%0uxK8=5_5puo$bG>)<7a3; zAB-tHD*ql&RqOVyGj6k(`78?}1IWHfW8DJQ$L1B6n}~41A0*8@+LtW#OVhV3jVWv$ zBaD$Iu=10RLQE^BjYapNwfgdn0)men7T{#e3V@Xsl~ZBq`=B?FlAm< zF6^)X9iK+J&9;7R*$JOha_%kUB&C%x-4bXScGEKm+T`u+`?2(4A6rCz$LHyk0Ry8W z91zeQVT#J25Y0xBlim96V5~CuXBz396lq62xP(7HN?D`AB2m?dp=b&r?jtf9D zU+N1o^?%<4F#d|BU(X{r+L|7El9NNeJ;P^ds~nJ(jO$Z8w_fF4&Hx3l!OTKJC+NL3 zSt)GYA#vwLYz0SH3X)Qm$E|4Q4RP@8z*9Y3mjD1D07*naRQpK&ashn0wW}2_ciJt& zQLNd0xa}Fge;+8>QO5B4z5m^pPcpm{zeB+FJ>N-7F>2{!d!=7PbR0k>Y?fo=7V2@6 z9=0fv8knx)8s(WI?17LMd+X=rpk}dhX9%3Y?Q1tA9H8oGNiv$^nM7JxHd|x@z4wZM ztXZc46v$@#vH3M+?&R;>BIMt@pdEm{&;eWgK=}Rc*9^VrQSZ;z^2ZDIXgz}E0Dnxa zU7*HaU}Ge8W0Eck+Lw`^`+l2EnHc9e=!s+Rl5jUDJB8deF_=5KPg!_m1zy6yIdL|< zfFNh3%PS*=RQf*GG-=&LvPr}xU{^kqPeph|E`fr2Q4{QPOCYnx<0)ZXA)%PN-+T9g zVb%gZ?(op=KV1&7lN)Q@Umod8w&zR}uXEQ`F7BMn3ccxRNEnQ~L=u&DZVq$*iq~?Y zOk@PA)Cu`_B1v+RE2;+NSe3H zmT{T1IUv)~>6@5!d#y;g?a6C^25As)In2j@G^o-5b57ae_5>aUqZVWlh7WqFVS_&T z0BHWAugZ1nTi$9C1jxA2_^;X(m6D6$)|Tt?BcY0?ykqW(o6*y(VS~3NKWTk_bN~19 zKbp9$SoP5O;G0nXv3Yp8el*M?W%`NXVV*gr!x*|PD<|EO zEnH*Du=NdMA4j)~b%swknBq*qZ6eQhOje+V@seXSP&6o{Ux>ACCzr4w+rV0flC?DO zpP`E%S}9Z+?4SeiQTEGTmw9TtMBsxRep{tbSt;awWa_V@GuN4R!f_B7>lf-Hqq0x> z_pP3!Y%ZWoo;=}!l)95x;pqDqM4{SOKOzkf4*%E_R_Pggk@I_Zd2h_HG}VbZn!P(w zLmMes=e!|)oq_Zlxk=E|p|8L1NKdISuUaRwdETPQK)+ll?+7$9@Sq6uo*RS}I&p4&Jyn@TUMIrDtP{ft&5fv^&DbpucIbba|4-{n^b1E$Y167s z!e(IU-Jp>MTPHWrZK)&f+S#vn86$ZOe90q(x&bEDgGdQ%%+_25){ISIu&ieWmJpqZ zVgvR9pp*1P3|aDPiC1UKkaFEF&w7%R0&;@>k_(DeP(b~Kad3gpp0TDBO1(%iOOXTE zm5-&Eg;J$fle%^4D#8}f`kU`rI@XK^GaN}(ouu_--1H=_y@zINz+%>BRDU@Aa3$fF zIi6XsTluNn0WWjNU|9Wea&e9`J-a#i7p#w3R<_5X>{1amHoPvI4+m4hq zOXQ@~;9pfw;Z`lIWiW`FS8ywnz8<)F8G!*Zcq(7~koGOZa`u4g^LzY#h?!@-)fg|N!6wy-Zx6~R25-s@t zk>G_CJRZP&iN|{X+$ZP^)eJl2`$Fm20|PUvE1fRo-ux(MgB(qAO*+H(c{?==FRs0b z-WqHqmsJvs>9(4kdk>7gc$2n}-*p-L&%$hu^m9tKmddRSgip5a_9#A8d@y8l(7$M2 z`pgzJOS(=ji0R8(UBS>$z^`6_!(#d80v_b%#7ksd^W$#5h1m>DaK9zQPZbuNtPd&PK|m(%9VUtt)O{DR8(dE<3NE{Wj2 zR@;1?dw}`^b?vx>56>j{vxXw9yTUpvSGn#HOy&ihaCr)n;=Gs(j{TMj{^aw#JWJ9dtJRRoCHr^KnDl|_)5%d z{~V;A$vOpb2I%BRccKPRN;(+HP6b~dJ!W?yH2gs?l?K%r&!}tZ-Py7Ps!Fte&o$;_ zDamjUBwHtMlJ;o8P5Si&Y$B>@5Db`Kni1YT7+At0+h%&%z7og3C-*8Jqc%XS93d)o zbmntg`v9T{8rxu!JjH$!PJ8fr((HQZ;L97QCMYv-h8~I8y2KSgT@v5=`p_(%el~s{ z#iE1NLi8$Xm?L(7aXp+OXA{m0{w^XeO-Dg?OvE`+wp4|@DZfYkbCAjt+%U+zqQgCP zu?3~cSD4fPhl(DQ)}gp%e&698l_&fFW9l2U&?IZq%3$?AbC=e=ja-dN9BUmMU4|as zcweLbd5E4tN;;ZP6kKPw2g_bTW;`wSj=31^jJ@M~ftm^Jxn9TUb!wx$B}@fK;w!yM zoj7|LYGx#MrW%%D$-HQ*+!*~^!IC4^FtUhQS8NcQ$n8z!!cg{ifgjIb5h)dU#yX2l z7sv21kv`CpAPNIOyGN7qnch}hGFMdTaSH$4wgU4&X61zSW4UKh>tUF)ZdFoU-c}5=f~7^HtWLlDmDKJO}ijO0^-gYFTuaIcuNZ%hsWE zJD1+KXF-o9n$JBcHA|?B-+5EYa=1JK6t`sX(PXoQT{>j)zW)R8Dv%ZC57P|gK?2VF z;k|U&6`w6%R-}YOV9HQP>Td zNEFP#2bahD$TwEz-WHGBrT4^|Y#ssV+yVJQ(jI`kxL4kkib}UyDu? zj>~{EWT8cUYdPpQrq&kXlw(>vJZsE+TMhFaLjE94-XXnb8{(I%U<83#-28WA-KLaa z@|d5fIsI}qmry!XQd0sS@2`}hBlm*GN@ABQ52k_A!_EwN9jD1zWk;5|}+>~uAd6OlDjbwAQg%9|Yo!G?rkDIDAAy*s|rv-g`%JJKVh z3EwwNVr-z8;k9jBlfQ%E(?t*kvv5a8?*I$qS^fKtd=M@DOgS69&w+@03#KP;VbqYN z#9RhHcFIV=jih-WdT-f7t4%?$USL^SGU z^RhZ8C24=HX~2&o__Dp0?Z5m@#y!ps%_Wk^^`$pZ!587`Y5JxlJzG%eg8yTtEDDEX z8IHjgj#90f5^*m-p!i`vL=2t)^DqL_#~~7UEfaH&qDi?>a+8+5^ty88Bp7G~gVY(s z3&`YMk(vhbU%pFm+Tdeajt;<(K$6qvSCRTPKOQ`Zn?UY?4ARt35|(uJ@aql6J;0h3 z%0hsrE?MZ-xB?p7$2+MGVc!%Op{q$cjB)ISb(bsXbuHd|cdU}dm^eu7jLNU!^;5?> zH}4>H3Bq63X5HrYu`{B_0xUy@W-W5AE`5}H86{AHNc$={R`!-6u@4Z8^2e%s!Z=g& zgx3q9qPSanC`Y~_dQGudZ>==?Xu)$&S(X-*Zz~y?1xa#ex$Na>Vn1{63Y7@8!W(QX0Ij+S&%n{c3D!t*&?} zzoYAFN8bMFhJUlnr!jq0i}05JYN8daeeGf}UbLj*-Gt?4M1lo5%yTF62$$l1N|Lw; z#*qVy@h4ekF|`#?$C5}&*g8Xo460=K=KUQ{_pcegq~26nIxz31`8SULK7P8?#+uCF zy(n{}&bUAn^?-SM4u(`|{?yrQ6VkTq+eU)O*sJ^cawd(+7fomv-g3Dl<=kMoi1hox zRxtA6rwi|umici?PtcThYYQq9Lt|oG&9l&&IwM!_X9_Xhr#?+ad9(*j5@aSVG0sq+ zc@jz7MDY9Fx|JsEIwMUu8yIy$K9|MbLj&4x4EMmT*S7 z|LqN0NKK0YDe%&Zx2{D~#Dt;SgUoPk;e0&{_iWqI^JN4~bZ=N0zboScBOwfX{#ZH> zD+-vsq*(7F?Lq7C0Ck0cP9Ina@l#_P7)-WtVGyq*y>uPR5(Bw`Q2AL;fADU)^{tNi zdFHxL*)>rLD5NEiF)D8^#0lAzBFoMhHZN^{>u->{`}jLsS$566;EF=%khlZ)4M}4Q zNSJ37a0ERHs?wtcE0m+kodHOY%&`&-;$5{f1J{p`NuIogt4sL8%;0P}ELd8LbG#`_ zmA?moW3Z?WY@WEFy-8+eHNA!=B{@c|#s&nvI0i%A^DljuBn3l{T;50!5@}nop3Ut5 zXKfjU%ogOhxhRz}T^h0(Lb`NM*;4)cT1W?j%z({mn(+Vq55JyIz>VhD(w@6ffg@~} zg>bkhl$rAF0$i!zM<#>#y%K`#(9754Z4BnIf;11MRL$aOWn!zWCW__#gYsGe#~EMx z%-eOdBVLC)=LbKD4O>O_^TF7?X3}8n`2D6JzLtY!dl@)CtlErP<$wtoA#0p9m`If5`0<`BQWMDQO*HI;xbXr6T~?=M%7lA964v_-J?ry)#f)BX~T)g8|jP#)Xb^b9Tj+vZVy+_mq;t zTk46sJju+RjINMXC#ajej-PMXHz&krVX%LQ9Z>;fNJew=u^w`P_$0fe^%2J>rIO?B z{X&59nEX9xZ@Hi=6q1j?Ts6KtNo^?H7Ok1gOipO-Z_7O})JDY%w? z$dZ+l(9nd9&(6BjhqweP(&oXih#_lKPN&eZg&}tQ?bkz-IsHEsw5{#-1Lq^`IlsH} zfz70KP{XYesRWxnMXt4-`K5$_XiX?3@;AaKsa<9GIFkB`3T3{QYb~En@4nZT|1&TY z?3=B1h>UB!fF>E&=+^U|LHYS?+V)66dod-tVNy*)bZ*SkD8@>IX$tarV=F#3m4B85|c?_wXfit4^yx1&| zFo1tmJsQ%W#6DqOuqF*Tn7{Z~gg=iCf`avXe?Mi*m}q&Odg0L<%e!`x>kvT^j%5<2 z;hM%U8OaNHC|4tB_2@J%kurhqiZa3sZg*sU^@t&fKcy=k6iWa{$Yuk*BQ%1ruLz?wLLA`@ zZ1AJT9+56n7o*>OoF$99x=E?+CFC2d;3-?%7>uHaHy{C$Ug8j+BYSD#O)_VV%Db&w z^0=dMwm})C;w5UM+&g$S3dpADsCU7&j>or&Z32!004ZC^u%_D)bgEa)IT{30kQAUz z{5AxqbhM^OhslPPL{wi{ZvJ8%ySHV7xsgi? zH@bii{;ri|xIYL$tbKp1zVu6|)y(&*s&p@V{q z;wQ^z;Sw}>WCKYS4MZ!;t^IJ;6-R8AduPqwYJ__l9fMl}g6Gr>G17_=0FegAXY_892l2ZC1_N- z^~CTGC?Yak&>dqKReh9sloN%4QcM0o=IZ+SGkxg~ypOJwRYUqb=X;gQAp&?vHtQ%X zpl`0eC0?-uRXtyOX#4-o6_9dmk_h&pXfNER29!%Q9Q={9D);DMpaHcUA zRuTgI{_1uZOz85wOaA>0wS??jCFWc$G1il&6P)@XSH_XRcq-7|ud1=sQ05xjVsBn$ z3Tzvt`m)PFy?7F-{+{)*@b3GXcM0{u#KA%`Rl&+C@0-CCtu8bsQ##euM>T>5T}h;D zB8N-!4m3IwI=a1CU*j#P8auqobn5H=jIe{SAQ`%`(r}uOv&QGeQ^i&21VLEtCw?4n5U3^dTEq@~OSH(Kj7qZ#-q4GI@7x^aqC9#4@hfevSo?UHK9PBq^-C|`Gj5Kk z3g2O~Q+iY5m586wX{fLFvAH%k_c-`(Iqga!ksM=`N_81Sp05_1a{V-CIgsKm*@$|02SIU*Ojg4Uhf8JESK+;LHuR>Bol2;Dc>+N=Zd z-_;mSP8$uldA49OEo1vES)ySl;zTtBdkh{+5W~v3;ip-8=*8Cz6c{m=_5zrN0d7gy z&CR6rHA+FQ+%QzBwt$ZMwBq&Wbbg!LH=KP2c}WMt+Gx$j_w_X2A&*eg=gPtU=W1sv zsh&hnK$8mg7>QM{N#TZ%;JfSNBd`&^+G{5v(AT%-zC5j&!ps9&x>%FRFzXEsgb4$< zc>TUggRH?B?#X`rjvN3@10Zu%rR8JJJz`~7gK^Y-?*RyxfZ#bco1N?!1%&+>4iCH^ zuLB|K|AVJzUmxK6vn`7x<3X5fB>mO>0a9vZ=aifKeDfAW^G@4UMdG=-So&yMxO7Pb z`GE5!A}ZO_Sf z*SI{6(PpNey;5Km30je_DU~wc)h*5d!d^#RCMg5j4stUn<2JS4Os#lkv{^HTr)mN{ z1!(+d!d15Q%5pD}p1hnF_{nTFtA(MTVd8xcGW??&(j^Ga!)C$cGp zfzu8`L_z?vK@2+MSCrpnyTLm%$(*38pvu^(S_k#V_I)>ysgrWxpx#zi5=(&^BWX*uolkVDK7T}>dNHG%9Wp67)-1gF@$Y|%FY#&#%n2d^cw!Du^f`8ZQllq_j>WP zBpOBO5TpU9cr9A~ja2cG&EXEC#BxX}+qlcaC;W@HAskB0W_KrDrD=&j>JZovTLhKb4~K10?YJPbc2Q}PWH&}FNURTKY^xHU*q(^FTA z!vZEJ4bpsqR5nX6>f&X>dt6ycm+w*ceA+8{F}e#`P~UEASM6+31&$|K~y$i!rmqpfV+Ogq-s&5bA??wF2 zy86n>nJn&S+AgcV?=OJsBnVo*0MDyRvvhA@iQnwctsx9!_y`r?GiVRui~x_OTD_FZi;dM&d*|Pz z3I*J}aAkoF;#i2{l`bz3{eiuTYve2+6KVGP2!H=4hcu#UuK8ei@+xQrE?s;;yW@%c z`(=B*-ehqksjIBri38|g8v0!Wp?Mn4eV!J=!I`hM1YEk7WTTS8s|LRgSF8{@lg7E7 zhPGg>;R((yZ!JD1>l1|5xbA9sEi9z6EyJuk-H4=9@ZA5bWqnZqK*g+_E`e0}!pFZtJO=t&HZ*4N!H^vJwf>%-*PHs~kYh72fxBW* z3)|;6)@@k?52j1Y_IY0>67d|D4nDek{Z2_i!S9%co7FL0But+v)7RlyhLq`&u}Q#L z(VN#4N-Fvh;0FKuUa~7QULO%q+ppj*^=dG{fg3BM6j};A01)Q%uQkor?mL9x=-!M} zQ?&nC#8-iyqQwH7<3-UXA$wg=X28B(d1-USwj7OW>99ztPYe+fp=Q%P=tKM67;Q>?y}7bG3%1bBtUZD5^wwQJ z>ZOo2+FZU`x-ahRo6ek-*Sn-fcFpYEShozC9G7d^p^yvMBhi5BPzZqfN)&TVJ!2+; zZ}Is|{kr!T3zK>bXydN2bjPPE98j6p46|Ct6CO!@?;=X8BMa`8i$Zn8l>(d1WZBZS zsW>$r{+`FtB=OP#h^;*c?spajKFU;v1gvv!n|E*Y1j5Vg3HYHf{YFbju0I-!!%*6r zO-;x2DxrKsnfL(i0?JNBy7wRp{G~GwnF#g@meIWqoqv)#FXX_i!mnp1G`!FBk*Z;|~hkOQo*B47-*;iNgE+uhDs6Y-k5m{_iOJg|ZGnlU@sdfr`tbc}Mx%aRcJM;HO<9?aLGP)e515Nz})o zNtrSCR_&Y9;>-7g2xLGcS4;Z2A1#y=xpK%((J|C==lkFF-oSZ`c-haVtSpyQ#wftc zTXg);0~1dghFqrO)BlXRODw-r`vtH6P;%JeO_WDWx89kxAh*eX(QiD66DCJ%#sB#p4Sl)MT=D z{l(9Z=YKtUuk?D$!ZlQqCl1WD6PeCrE_N{LaS)GLV@OhE!_6m%g{^!ydf#P|Skma- z-aa{Ny%i9iT?tyK47r_8q1PB;tYQzyn=LVMsQxU(mB%Une!f-%S!Go$C{90j+IFC4 zU||oJ@Y&kc7jFp``I-hOv4>_P{00HxnrRq5N9*?cWk@VIQM1aWWObvb(-dsMJO5a+ z+n8({z_i?X(D^DI(It@SwrqvFLYLh<+bDRXsE_flig0~bKt1JhHU z1`Ev#lnqg`@UUl<+7iS>+4oWt*17q!@!gBugtV zwq7vKgeo*MtaUhB!@TiXG2OICv+28I_|M?7pES;xtcLKc<>j9uWAqlXfD3zuK78*9 zSYcxjOy7O{v^oUJ_lHYwR|@XAkxQ8={C4DU4PG!ke2h*&0rK}V#QC#2#VyaP7Hctd zDWq>8584A*)^mpVdZx^IMtEtaT_yRw{EYf-?3S!kSTM>yH!p}emr*M_bS;Y&IP1|q z?fuXWz0#h*xhGts7a|u)uz+E`d9`P+R{x<&)agLi42t>^9i*yEZzKbDNjd{D2m=|+ zbK?it)F2H&M=BQ)&~PdB7v_-Kl^f`geoqa3{NYpa44zFSz)~xNAz9yVBpCMxxW_M- zNM1(gcrA@r6y?hgC*7vqJZu^2ne<-NZ6nzMWz3?gQXq^fLrVUC54rwy4@8p!00000 LNkvXXu0mjfN7 - - - - - - - {% block title %} - Flask on Android - {% endblock %} - - - - - - -

    - Flask on Android! -

    - - {% block body %} - {% endblock %} - - - - diff --git a/testapps/testapp_flask/templates/index.html b/testapps/testapp_flask/templates/index.html deleted file mode 100644 index 78c38b3eaa..0000000000 --- a/testapps/testapp_flask/templates/index.html +++ /dev/null @@ -1,63 +0,0 @@ -{% extends "base.html" %} - - -{% block body %} - -

    Page one

    - - - -
    - -
    - - - - - - - - - - - - - - - - - -{% endblock %} diff --git a/testapps/testapp_flask/templates/page2.html b/testapps/testapp_flask/templates/page2.html deleted file mode 100644 index 70fca15f03..0000000000 --- a/testapps/testapp_flask/templates/page2.html +++ /dev/null @@ -1,15 +0,0 @@ - -{% extends "base.html" %} - - -{% block body %} - -

    Page two

    - - - -
    - -
    - -{% endblock %} diff --git a/testapps/testapp_keyboard/colours.png b/testapps/testapp_keyboard/colours.png deleted file mode 100644 index 30b685e32bf52c6e97726095fc8337775554c8a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191254 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

    gVODxKx#t(>zBw}Jtvq)$2@kX(fId)-; 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

  • d>?L-Gt38?I=(%p9~CH%?GjHJIafGZ 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 LNkvXXu0mjfN7: - size_hint_y: None - height: dp(60) - - -BoxLayout: - orientation: 'vertical' - BoxLayout: - size_hint_y: None - height: dp(50) - orientation: 'horizontal' - Button: - text: 'None' - on_press: Window.softinput_mode = '' - Button: - text: 'pan' - on_press: Window.softinput_mode = 'pan' - Button: - text: 'below_target' - on_press: Window.softinput_mode = 'below_target' - Button: - text: 'resize' - on_press: Window.softinput_mode = 'resize' - Widget: - Scatter: - id: scatter - size_hint: None, None - size: dp(300), dp(80) - on_parent: self.pos = (300, 100) - BoxLayout: - size: scatter.size - orientation: 'horizontal' - canvas: - Color: - rgba: 1, 0, 0, 1 - Rectangle: - pos: 0, 0 - size: self.size - Widget: - size_hint_x: None - width: dp(30) - TextInput: - text: 'type in me' -''' - - -class ErrorPopup(Popup): - error_text = StringProperty('') - -def raise_error(error): - print('ERROR:', error) - ErrorPopup(error_text=error).open() - -class TestApp(App): - def build(self): - root = Builder.load_string(kv) - Clock.schedule_interval(self.print_something, 2) - # Clock.schedule_interval(self.test_pyjnius, 5) - print('testing metrics') - from kivy.metrics import Metrics - print('dpi is', Metrics.dpi) - print('density is', Metrics.density) - print('fontscale is', Metrics.fontscale) - return root - - def print_something(self, *args): - print('App print tick', Clock.get_boottime()) - - def on_pause(self): - return True - - def test_pyjnius(self, *args): - try: - from jnius import autoclass, cast - except ImportError: - raise_error('Could not import pyjnius') - return - print('Attempting to vibrate with pyjnius') - ANDROID_VERSION = autoclass('android.os.Build$VERSION') - SDK_INT = ANDROID_VERSION.SDK_INT - - Context = autoclass("android.content.Context") - PythonActivity = autoclass('org.kivy.android.PythonActivity') - activity = PythonActivity.mActivity - - vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator = cast("android.os.Vibrator", vibrator_service) - - if vibrator and SDK_INT >= 26: - print("Using android's `VibrationEffect` (SDK >= 26)") - VibrationEffect = autoclass("android.os.VibrationEffect") - vibrator.vibrate( - VibrationEffect.createOneShot( - 1000, VibrationEffect.DEFAULT_AMPLITUDE, - ), - ) - elif vibrator: - print("Using deprecated android's vibrate (SDK < 26)") - vibrator.vibrate(1000) - else: - print('Something happened...vibrator service disabled?') - - def test_ctypes(self, *args): - import ctypes - - def test_numpy(self, *args): - import numpy - - print(numpy.zeros(5)) - print(numpy.arange(5)) - print(numpy.random.random((3, 3))) - -TestApp().run() diff --git a/testapps/testapp_matplotlib/main.py b/testapps/testapp_matplotlib/main.py deleted file mode 100644 index 2c2d9d00e7..0000000000 --- a/testapps/testapp_matplotlib/main.py +++ /dev/null @@ -1,75 +0,0 @@ -print('importing numpy') -import numpy as np -print('imported numpy') - -print('importing matplotlib') - -import matplotlib -print('imported matplotlib') - -print('importing pyplot') - -from matplotlib import pyplot as plt - -print('imported pyplot') - -fig, ax = plt.subplots() - -print('created fig and ax') - -ax.plot(np.random.random(50)) - -print('plotted something') - -ax.set_xlabel('test label') - -print('set a label') - -fig.set_size_inches((5, 4)) -fig.savefig('test.png') - -print('saved fig') - -from kivy.app import App -from kivy.base import runTouchApp -from kivy.uix.image import Image -from kivy.lang import Builder - -class MatplotlibApp(App): - def build(self): - root = Builder.load_string(""" -BoxLayout: - orientation: 'vertical' - Image: - id: the_image - source: 'test.png' - allow_stretch: True - Button: - size_hint_y: None - height: dp(40) - text: 'new plot' - on_release: app.generate_new_plot() - """) - return root - - def generate_new_plot(self): - fig, ax = plt.subplots() - ax.set_xlabel('test xlabel') - ax.set_ylabel('test ylabel') - ax.plot(np.random.random(50)) - ax.plot(np.sin(np.linspace(0, 3*np.pi, 30))) - - ax.legend(['random numbers', 'sin']) - - fig.set_size_inches((5, 4)) - fig.tight_layout() - - fig.savefig('test.png', dpi=150) - - self.root.ids.the_image.reload() - - - - -MatplotlibApp().run() -runTouchApp(Image(source='test.png', allow_stretch=True)) diff --git a/testapps/testapp_nogui/main.py b/testapps/testapp_nogui/main.py deleted file mode 100644 index bb7506fb48..0000000000 --- a/testapps/testapp_nogui/main.py +++ /dev/null @@ -1,73 +0,0 @@ - -from math import sqrt -print('import math worked') - -import sys - -print('sys.path is', sys.path) - -for i in range(45, 50): - print(i, sqrt(i)) - -print('trying to import six') -try: - import six -except ImportError: - print('import failed') - - -print('trying to import six again') -try: - import six -except ImportError: - print('import failed (again?)') -print('import six worked!') - -print('Just printing stuff apparently worked, trying pyjnius') - -import jnius - -print('Importing jnius worked') - -print('trying to import stuff') - -try: - from jnius import cast -except ImportError: - print('cast failed') - -try: - from jnius import ensureclass -except ImportError: - print('ensureclass failed') - -try: - from jnius import JavaClass -except ImportError: - print('JavaClass failed') - -try: - from jnius import jnius -except ImportError: - print('jnius failed') - -try: - from jnius import reflect -except ImportError: - print('reflect failed') - -try: - from jnius import find_javaclass -except ImportError: - print('find_javaclass failed') - -print('Trying to autoclass activity') - -from jnius import autoclass - -print('Imported autoclass') - -PythonActivity = autoclass('org.kivy.android.PythonActivity') - -print(':o the autoclass worked!') - diff --git a/testapps/testapp_pillow/colours.png b/testapps/testapp_pillow/colours.png deleted file mode 100644 index 30b685e32bf52c6e97726095fc8337775554c8a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191254 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

    gVODxKx#t(>zBw}Jtvq)$2@kX(fId)-; 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

  • d>?L-Gt38?I=(%p9~CH%?GjHJIafGZ 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 LNkvXXu0mjfN7: - size_hint_y: None - height: dp(100) - -ScrollView: - BoxLayout: - orientation: 'vertical' - size_hint_y: None - height: self.minimum_height - spacing: dp(10) - Image: - keep_ratio: False - allow_stretch: True - source: 'colours.png' - size_hint_y: None - height: dp(100) - Label: - height: self.texture_size[1] - size_hint_y: None - font_size: 100 - text_size: self.size[0], None - markup: True - text: '[b]Kivy[/b] on [b]SDL2[/b] on [b]Android[/b]!' - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - font_size: 50 - markup: True - text: '[color=a0a0a0]{}[/color]'.format(sys.version) - halign: 'center' - padding_y: dp(10) - Label: - height: self.texture_size[1] - size_hint_y: None - font_size: 50 - text_size: self.size[0], None - markup: True - text: - 'dpi: [color=a0a0a0]{}[/color]\\n'\\ - 'density: [color=a0a0a0]{}[/color]\\n'\\ - 'fontscale: [color=a0a0a0]{}[/color]'.format( - Metrics.dpi, Metrics.density, Metrics.fontscale) - halign: 'center' - Label: - height: self.texture_size[1] - size_hint_y: None - text_size: self.size[0], None - text_color: "0c8916" if "Succeed" in self.text else "bc1607" - font_size: 50 - markup: True - text: - 'Import PIL module: [color={}]{}[/color]'.format( - self.text_color, app.status_import_pil) - halign: 'center' - FixedSizeButton: - text: 'test ctypes' - on_press: app.test_ctypes() - height: dp(60) - FixedSizeButton: - text: 'test pyjnius' - on_press: app.test_pyjnius() - height: dp(60) - BoxLayout: - orientation: 'horizontal' - size_hint_y: None - height: dp(430) - BoxLayout: - orientation: 'vertical' - spacing: dp(10) - FixedSizeButton: - text: 'test Pil draw text' - disabled: - ("Error" in app.status_import_pil or app.processed_draw) - on_release: app.test_pil_draw() - FixedSizeButton: - text: 'test Pil gaussian filter' - disabled: (not app.processed_draw or app.processed_filter) - on_release: app.test_pil_filter() - FixedSizeButton: - text: 'test Pil mirror' - disabled: (not app.processed_filter or app.processed_mirror) - on_release: app.test_pil_mirror() - FixedSizeButton: - text: 'test Pil rotate 180' - disabled: (not app.processed_mirror or app.processed_rotate) - on_release: app.test_pil_rotate() - Widget: - size_hint_x: None - width: dp(10) - BoxLayout: - id: images_container - orientation: 'vertical' - spacing: dp(10) - Widget: - size_hint_y: None - height: dp(430 - 110 * (len(self.parent.children) - 1)) - canvas.before: - Color: - rgba: - (.1, .1, .1, - 1 if len(self.parent.children) < 5 - else 0) - Rectangle: - pos: self.pos[0], self.pos[1] + dp(2) - size: self.size - Widget: - size_hint_y: None - height: dp(10) - -: - title: 'Error' - size_hint: 0.75, 0.75 - Label: - text: root.error_text -""" - - -class ErrorPopup(Popup): - """A pop intended to be used to display error messages""" - error_text = StringProperty("") - - -def raise_error(error): - """Method that will take a message as an argument and will display it in a - a Popup :class:`ErrorPopup`.""" - print("ERROR:", error) - ErrorPopup(error_text=error).open() - - -class TestApp(App): - status_import_pil = status_import_pil - processed_draw = BooleanProperty(False) - processed_filter = BooleanProperty(False) - processed_rotate = BooleanProperty(False) - processed_mirror = BooleanProperty(False) - processed_images = ListProperty() - - def build(self): - return Builder.load_string(kv) - - def on_pause(self): - return True - - def on_stop(self): - print("Removing generated test images...") - for w in self.root.ids.images_container.children[:]: - if hasattr(w, "source"): - self.root.ids.images_container.remove_widget(w) - remove_test_file_if_exist(w.source) - - def test_pyjnius(self, *args): - try: - from jnius import autoclass, cast - except ImportError: - raise_error('Could not import pyjnius') - return - print('Attempting to vibrate with pyjnius') - ANDROID_VERSION = autoclass('android.os.Build$VERSION') - SDK_INT = ANDROID_VERSION.SDK_INT - - Context = autoclass("android.content.Context") - PythonActivity = autoclass('org.kivy.android.PythonActivity') - activity = PythonActivity.mActivity - - vibrator_service = activity.getSystemService(Context.VIBRATOR_SERVICE) - vibrator = cast("android.os.Vibrator", vibrator_service) - - if vibrator and SDK_INT >= 26: - print("Using android's `VibrationEffect` (SDK >= 26)") - VibrationEffect = autoclass("android.os.VibrationEffect") - vibrator.vibrate( - VibrationEffect.createOneShot( - 1000, VibrationEffect.DEFAULT_AMPLITUDE, - ), - ) - elif vibrator: - print("Using deprecated android's vibrate (SDK < 26)") - vibrator.vibrate(1000) - else: - print('Something happened...vibrator service disabled?') - - def test_ctypes(self, *args): - try: - import ctypes - except ImportError: - raise_error("Could not import ctypes") - return - - def test_pil_draw(self, *args): - self.processed_draw = True - start_func_thread( - test_pil_draw, - image_width=int(self.root.width / 2.0), - image_height=int(dp(100)), - ) - - def test_pil_filter(self, *args): - self.processed_filter = True - start_func_thread(test_pil_filter) - - def test_pil_mirror(self, *args): - self.processed_mirror = True - start_func_thread(test_pil_mirror) - - def test_pil_rotate(self, *args): - self.processed_rotate = True - start_func_thread(test_pil_rotate) - - def on_processed_images(self, *args): - print( - "New processed images detected [{} image/s]".format( - len(self.processed_images) - ) - ) - # Display the processed images - while self.processed_images: - img_path = self.processed_images.pop(-1) - print("Building image widget for: {}".format(img_path)) - im = Image( - source=img_path, - size_hint=(1.0, None), - height=dp(100), - keep_ratio=True, - allow_stretch=True, - ) - self.root.ids.images_container.add_widget(im, index=1) - - -TestApp().run() diff --git a/testapps/testapp_service/main.py b/testapps/testapp_service/main.py deleted file mode 100644 index dc781cd3bd..0000000000 --- a/testapps/testapp_service/main.py +++ /dev/null @@ -1,19 +0,0 @@ -print('Service Test App main.py was successfully called') - -import sys -print('python version is: ', sys.version) -print('python sys.path is: ', sys.path) - -from math import sqrt -print('import math worked') - -for i in range(45, 50): - print(i, sqrt(i)) - -print('Just printing stuff apparently worked, trying a simple service') - -from jnius import autoclass -service = autoclass('org.test.testapp_service.ServiceTime') -mActivity = autoclass('org.kivy.android.PythonActivity').mActivity -argument = 'test argument ok' -service.start(mActivity, argument) diff --git a/testapps/testapp_service/p4atime.py b/testapps/testapp_service/p4atime.py deleted file mode 100644 index 75a1d76e0f..0000000000 --- a/testapps/testapp_service/p4atime.py +++ /dev/null @@ -1,19 +0,0 @@ -import datetime -import threading -import time -from os import environ -argument = environ.get('PYTHON_SERVICE_ARGUMENT', '') -print('p4atime.py was successfully called with argument: "{}"'.format(argument)) - -next_call = time.time() - - -def service_timer(): - global next_call - print('P4a datetime service: {}'.format(datetime.datetime.now())) - next_call = next_call + 1 - threading.Timer(next_call - time.time(), service_timer).start() - - -print('Starting the service timer...') -service_timer() From f5dbf219aac1f11389b8322c42ab3397397a75b3 Mon Sep 17 00:00:00 2001 From: Alexander Taylor Date: Tue, 31 Mar 2020 18:57:09 +0100 Subject: [PATCH 11/35] Update recommended NDK version to 19c (#2116) Probably newer versions are also fine, but making this change in particular because the buildozer download url for 19b no longer exists. I think the 19c one should work fine though. --- pythonforandroid/recommendations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/recommendations.py b/pythonforandroid/recommendations.py index 9f5cd36dc2..00caad1484 100644 --- a/pythonforandroid/recommendations.py +++ b/pythonforandroid/recommendations.py @@ -12,7 +12,7 @@ MAX_NDK_VERSION = 20 # DO NOT CHANGE LINE FORMAT: buildozer parses the existence of a RECOMMENDED_NDK_VERSION -RECOMMENDED_NDK_VERSION = "19b" +RECOMMENDED_NDK_VERSION = "19c" NDK_DOWNLOAD_URL = "https://developer.android.com/ndk/downloads/" From 6fae684dbd77d0a0d32064f9d74f0d41f1dc383d Mon Sep 17 00:00:00 2001 From: Alexander Taylor Date: Wed, 1 Apr 2020 23:06:20 +0100 Subject: [PATCH 12/35] Merge master into develop (#2123) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Release 2019.10.06 (#1998) * [recipes] Fix compilation for regex recipe The error was: build/other_builds/hostpython3/desktop/hostpython3/Include/Python.h:39:19: fatal error: crypt.h: No such file or directory * [recipes] Update regex's recipe * put the sdk manager command in a code block (#1956) to avoid quotes being replaced by fancy ones * Updated version number for develop branch following 2019.08.09 release (#1960) * Fix build for case-insensitive FS and add CI test for OSX (#1951) * [python] Fix build for case-insensitive FS :apple: It turns out that the generated python binary for some builds are named `python.exe` instead of `python`. This depends on the File System where the build happens. It will be named `python.exe` when the FS is case-insensitive (Mac OSX and Cygwin), but it will be named `python` when the FS is case-sensitive (most GNU Linux distributions). The proposed solution consists in make a copy of the generated python binary with a given name (python3 or python2) so this way To achieve this goal we refactor a little our `HostPythonRecipe`:   - add private property `HostPythonRecipe._exe_name` (the name of the python executable based on major version)   - add public property `HostPythonRecipe.python_exe` (the full path of the python executable)   - implement `HostPythonRecipe.should_build` And also it's affected the `GuestPythonRecipe`, because we need to use the generated python executable by `HostPythonRecipe`:   - add private property `GuestPythonRecipe._libpython` (python's library name with extension...hardcoded for now...)   - implement `GuestPythonRecipe.should_build`... to check the library instead of the executable so we avoid conflicts with case-insensitive FS We also need: - fix `PythonRecipe.real_hostpython_location` because the name of our host python executable will depend on major version   - fix python2 interpreter (fix-interpreter-version.patch) Note: the variation of the name of the python's executable is mentioned at python's build docs (https://github.com/python/cpython/blob/3.7/README.rst#build-instructions) Note: @TheSin- , ¡¡¡thanks for your debugging sessions!!! * [ci] Add Mac OSX CI's test & refactor android's NDK/SDK installation To do so we:   - create a makefile to install the necessary dependencies for Mac OS X: `ci/makefiles/osx.mk`   - create a makefile to install android's SDK/NDK: `ci/makefiles/android.mk`   - refactor docker files: make use of android's makefile - change OS, from `linux` to `osx`, for CI test `Python 3 armeabi-v7a`, so we don't increase the overall build time and jobs   - rename the `Python 2` test to `Python 2 armeabi-v7a (with numpy)` to reflect the build arch and numpy's build. * customizability (#1869) * customizability options - added compile-options * apptheme option for all bootstraps * Initial migration to NDK r19 (Part I - The core) (#1722) * [ndk19] Rework of the arch environment to work with ndk r19+ Things done here: - Modifies target so we can use the toolchains `in-place` (as if we were using a standalone toolchain) - Removes some cflags that we don't need anymore - Move `macros` and `includes` from `CFLAGS` to `CPPFLAGS` (because this is the way it's supposed to be) - Move libraries from `LDFLAGS` to `LDLIBS` (again, the same as above) - Refactor `Arch`'s variables into class attributes, to make `get_env` smaller and to be more readable/maintainable: + class attributes for flags: * common_cflags * common_cppflags * common_ldflags * common_ldlibs * common_ldshared * arch_cflags + class attributes for compiler: * clang_path * clang_exe * clang_exe_cxx - Remove hardcoded cpu count in `MAKE` - Remove `gcc` of environment (because it has been partially removed in ndk r18) - Shorten long line to be pep8 friendly (line where we define env['BUILDLIB_PATH']) - Commented lines for `ArchAarch_64` that it seems tha we don't need anymore (not removed because I'm not sure if we need them) Note: This will force us to use a minimal ndk version of 19 See also: https://developer.android.com/ndk/guides/other_build_systems * [ndk19] Update `test_archs` to ndk's r19+ build system Also add some more tests. Now we check if some of the functions we mock, `glob` and `find_executable`, are called with the expected arguments * [ndk19] Update `test_bootstrap` to ndk's r19+ build system Because `clang` is the new default compiler and the affected tests were made thinking in `gcc` compiler * [ndk19] Remove `clang` of `get_recipe_env` Because as per ndk r19 the default compiler is clang and gcc has been partially removed * [ndk19] Adapt python recipes to ndk's r19+ build system We move python recipe to use a minimal ndk version of 19 because it will simplify the python's cross compilation (this way we can remove some environment variables that we don't need anymore). The only side effect detected is that the python's `zlib` module isn't built anymore. This is caused because python3 and python2 build systems contains libz's hardcoded version, which does not match the version used in ndk 19 (may be this the cause of some `zip/unzip` errors reported in python-for-android's issues?). We will take care later of this zlib problem, or we will get a runtime crash...so it seems that zlib is an `essential module` to successfully run a python-for-android app * [ndk19] Update libffi to version post `v3.3RC0` and adapt it to be ndk r19+ compatible * [ndk19] Fix build of python's zlib module Because python has a hardcoded zlib version which does not match android's ndk r19, and that prevents the build of zlib's module Note: it seems that we have to point to the right lib and headers, otherwise we won't succeed in building python's zlib module * [ndk19] Fix build of python2's _ctypes module for ndk r19+ * [ndk19] Fix numpy for ndk r19+ Note: because of the new build system recently introduced, we can safely remove some of the patches that we needed because it seems that it builds and runs fine without them * [ndk19] Update docs with the new ndk requirements * [ndk19] Set min/max/recommended android's NDK * [ndk19] Make CI tests with android's NDK `r19b` Because it's our minimum supported android NDK * [ndk19] Fix png recipe for NDK r19+ We remove `get_recipe_env` because we don't need anymore to specify the flags set in there. Note: As per new NDK r19+ build system implemented in p4a, the removed `flags` should be automatically set by the android's NDK * [ndk19] Add `-fPIC` to `armeabi-v7a`'s arch cflags... ...force `Position-Independent Code` To solve the kivy's build error detected in travis `OSX` test (https://travis-ci.org/kivy/python-for-android/jobs/576204088#L1105). But also detected the same error in my local tests (linux os in this case) for `freetype` and `harfbuzz` recipes...so I have the feeling that this is better to set as global :crossed_fingers:..is it? * [LIBS - PART I] Initial refactor of library recipes (#1944) This commit will introduce a new cls attribute: `built_libraries`. This `built_libraries` attribute must be a dictionary. The keys are the full library name, e.g.: `libffi.so`. And the values must be the relative path of the library, e.g: `.libs`. So the this cls attribute for libffi recipe it would look like: ```built_libraries = {'libffi.so': '.libs'}``` This new cls attribute will allow us to detect library recipes and to refactor common operations that we do for those kind of recipes: - copy library into right location - implement `should_build` for library recipes Those two things will make that our rebuilds to be more consistent and I hope that it will be easier to maintain. **So, once explained a little this PR, in here we do:** - [x] Add attribute `built_libraries` - [x] Add methods to refactor common library operations: - [x] install_libraries - [x] get_libraries - [x] implement `should_build` for library recipes - [x] implement basic tests for the newly introduced `Recipe` methods - [x] Make use of those Library attributes/methods for some basic set of recipes: - [x] libffi - [x] openssl - [x] png - [x] jpeg - [x] freetype - [x] harfbuzz - [x] libcurl - [x] libzbar - [x] libiconv - [x] libexpat - [x] libogg - [x] libxml2 - [x] libxslt - [x] libshine - [x] libx264 - [x] libglob - [x] libsodium - [x] libsecp256k1 **Things to do in separate PRs**, to be easy to review and because those points will start to conflict with the `NDK r19 migration` thing just merged: - Make use of Library attributes/methods introduced in this PR for un covered library recipes in here. Here we have two situations: - library recipes that depends on android's STL library (almost all the work done in here will depend of the `NDK r19 migration` thing) - all remaining library recipes, which are not STL lib dependent and that are not implemented in here (because I was unable to perform a successful build with them using arch `arm64-v8a`...so I think it would be better to deal with those recipes in separate PRs and later...with the `NDK r19 migration` thing merged) **Notes about changed recipes:** all the recipes touched in here almost have the same changes: - remove `should_build` method (to make use of the one implemented in base class for library recipes) - remove the copy of the library (because that will be done automatically by the method `install_libraries` implemented in base class) - fixed the imports due to refactoring * [recipe-lib] Add attribute Recipe.built_libraries so we can refactor some essential operations performed for library recipes (like copy the library into the right location, or decide if we should build the library recipe again) * [recipe-lib] Add method Recipe.get_libraries This function will allows us to get a list of the built/context libraries. This will be useful to check if we have to built a library recipe or which library should be rebuild * [recipe-lib] Make `Recipe.should_build` decide the library build In case that the attribute built_libraries has been set, we will check the need of the recipe build, otherwise we will act as usual, forcing the build unless overwrote in subclass * [recipe-lib] Add method `Recipe.install_libraries` So we can: - control the copy of the library recipe - refactor the install of the lib for all library recipes * [recipe-lib] Make libffi a library recipe * [recipe-lib] Make openssl a library recipe and ... also make the imports from the right module * [recipe-lib] Make png a library recipe * [recipe-lib] Make jpeg a library recipe * [recipe-lib] Make freetype a library recipe and ... also make the imports from the right module * [recipe-lib] Make harfbuzz a library recipe and ... also make the imports from the right module * [recipe-lib] Make libcurl a library recipe and ... also make the imports from the right module * [recipe-lib] Make libzbar a library recipe and ... also make the imports from the right module * [recipe-lib] Make libiconv a library recipe and ... also make the imports from the right module * [recipe-lib] Make libexpat a library recipe and ... also: - make the imports from the right module - remove hardcoded arch * [recipe-lib] Make libogg a library recipe * [recipe-lib] Make libxml2 a library recipe and ... also make the imports from the right module * [recipe-lib] Make libxslt a library recipe and ... also make the imports from the right module * [recipe-lib] Make libshine a library recipe and ... also: - make the imports from the right module - remove the hardcoded cpu count when compiling * [recipe-lib] Make libx264 a library recipe and ... also:   - make the imports from the right module   - remove the hardcoded cpu count when compiling * [recipe-lib] Make libglob a library recipe * [recipe-lib] Make libsodium a library recipe and ... also:   - make the imports from the right module   - fix hardcoded arch   - enable cpu count when compiling * [recipe-lib] Make libsecp256k1 a library recipe and ... also make the imports from the right module * [tests] Add tests for library recipe * [NDK19] Fix libglob for android NDK r19 - change the `ARG_MAX` define, because it's already defined at `sysroot/usr/include/linux/limits.h` - Replaced `size_t` by Including the header. Because found the solution at stackoverflow: As per C99, §7.17, size_t is not a builtin type but defined in See also: - https://travis-ci.org/kivy/python-for-android/jobs/576392711#L5992-L6013 - https://stackoverflow.com/questions/26410466/gcc-linaro-compiler-throws-error-unknown-type-name-size-t * [NDK19] Remove `--sysroot` from LDFLAGS for cffi and pymunk (#1965) Because `--sysroot` flag is not needed anymore and make it fails the build since we migrated to new android's build system (implemented in NDK r19) See also: - https://developer.android.com/ndk/guides/other_build_systems * Added libffi headers troubleshooting note to doc (#1972) * [LIBS - PART II] Part II of NDK r19 migration - Initial STL lib migration (#1947) * [recipe-stl] Add android's STL lib support to `Recipe` To allow us to refactor some common operations that we use in our recipes that depends on android's STL library. Note: This commit will allow us to begin the migration to `c++_shared`. This is a must when we move to android's NDK r19+, because as for android NDK >= 18 is the only one supported STL library. * [recipe-stl] Make CppCompiledComponentsPythonRecipe use Recipe's STL support * [recipe-stl] Make icu a library recipe with STL support (rework) Also done here:   - Remove hardcoded version in url   - Disable versioned shared libraries   - Make it to be build as a shared libraries (instead of static)   - Disable the build of static libraries (because we build them as shared ones, so we avoid to link with them without our consents)   - Shorten long lines to be pep8's friendly   - Remove icu from ci/constants   - Remove `RuntimeError` about the need to use NDK api <= 19 (because that is not the case anymore)   - consider host's number of cpu to perform the build * [recipe-stl] Rework pyicu recipe to match latest icu changes Also done here:   - Remove icu.patch because now we don't have the version in our icu libraries   - Shorten long lines to be pep8's friendly * [tests] Add tests for recipe with STL support * [tests] Add tests for icu recipe * [tests] Add tests for pyicu recipe * [WIP][LIBS - PART III] Rework of pyleveldb, leveldb and snappy (#1966) * [recipe-lib] Make snappy a library recipe * [recipe-stl] Make leveldb a library recipe and... make it work with the reworked snappy recipe * [recipe-stl] Fix pyleveldb for reworked leveldb/snappy * [WIP][LIBS - PART IV] Rework of shapely and libgeos (#1967) * [recipe-stl] Make libgeos a library recipe * [recipe-stl] Fix shapely for reworked libgeos * [recipe-stl] Make libzmq a library recipe (#1968) * [recipe-stl] Rework of libtorrent and boost (#1971) which: - fix build for android's NDK r19+ - allow us to build `boost+libtorrent` for any arch - Update boost to version `1.69.0` - update libtorrent to version `1.2.1` The build method needs to be changed because one of the scripts used in `boost+libtorrent` build (make-standalone-toolchain.sh), has been removed from android's NDK. [This is because](https://developer.android.com/ndk/guides/standalone_toolchain): `As of r19, the NDK's default toolchains are standalone toolchains, which renders this process unnecessary.` Note: since 3887d2b, `python-for-android` uses android's NDK r19 as the minimum supported and also changed the build method used by p4a as [described in here](https://developer.android.com/ndk/guides/other_build_systems) * Also copy the service/main.py when building with setup.py (#1936) * [recipe-stl] Rework of protobuf_cpp recipe (#1969) In here we do: - inherit from CppCompiledComponentsPythonRecipe Because depends on android's STL library - make use of the base class methods for library recipes - Split build_arch into proper methods - Shorten some long lines (to be PEP8 friendly) - make generated library shared - remove recipe from CI/constants * [CI] Fix CI's test for `arm64-v8a` (#1977) * Updated README.md to clarify NDK versions (#1981) * :books: Updated README.dm to clarify NDK versions * :wrench: Change back to r19b * A bunch of tests for library recipes (#1982) The main idea is to test as many recipes as we can with the less code possible and without creating any file/directory so our tests can be performed as fast as possible (all this tests will only add between 2 and 3 seconds to our CI tests and will cover almost 100% of the code for each tested recipe) To do so, we create a couple of modules: tests.recipe_ctx: allow us to create a proper Context to test our recipes tests.recipe_lib_test: which holds some base classes to be used to test a recipe depending on the build method used. For starters we introduce two kind of base classes: BaseTestForMakeRecipe: To test an standard library build (this will iinclude the recipes which requires the classical build commandsconfigure/make) BaseTestForCmakeRecipe: To test an library recipe which is compiled with cmake We also refactor the existing recipes tests, so we can remove some lines in there...the ones that creates a Context. * [test] Add module `tests.recipe_ctx` A helper module to test recipes. Here we will initialize a `Context` to test recipes. * [test] Refactor `setUp/tearDown` for `test_icu` * [test] Refactor `setUp/tearDown` for `test_pyicu` * [test] Refactor `setUp` for `test_reportlab` * [test] Refactor `setUp` for `test_gevent` * [test] Add module `tests.recipe_lib_test` A helper module to test recipes which will allow to test any recipe using `configure/make` commands. * [test] Add test for `libffi` * [test] Add test for `libexpat` * [test] Add test for `libcurl` * [test] Add test for `libiconv` * [test] Add test for `libogg` * [test] Add test for `libpq` * [test] Add test for `libsecp256k1` * [test] Add test for `libshine` * [test] Add test for `libvorbis` * [test] Add test for `libx264` * [test] Add test for `libxml2` * [test] Add test for `libxslt` * [test] Add test for `png` * [test] Add test for `freetype` * [test] Add test for `harfbuzz` * [test] Add test for `openssl` * [test] Add `BaseTestForCmakeRecipe` * [test] Add test for `jpeg` and clean code We can remove the `get_recipe_env` because the environment that we use is already using a clang as default compiler (not the case when we migrated the jpeg recipe to use `cmake`)...so we can do a little refactor :) * [test] Add test for `snappy` * [test] Add test for `leveldb` * [test] Add test for `libgeos` * [test] Add test for `libmysqlclient` * [test] Add test for `openal` * [test] Make the `super` calls Python3 style * [test] Move mock tests outside context manager... Because there is no need to do it there. Also rewrote the inline comments. * Recipes tests enhancements (#1984) This is a follow up of #1982 In here we do: - Move from `__new__` to `__init__` for `BaseTestForMakeRecipe` ([discussed at here](https://github.com/kivy/python-for-android/pull/1982#discussion_r324419892)) - Convert cls attributes to instance attributes ([discussed at here](https://github.com/kivy/python-for-android/pull/1982#discussion_r324419973)) - Remove `mock` dependency for py3 tests (Because, as per Python 3.3+, `mock` it's a built-in-module). (Unfortunately we still will have a couple of `import mock` entries that we cannot remove until we completely remove python2 from our tests) * [test] From `__new__` to `__init__` for `BaseTestForMakeRecipe` * [test] Remove mock dependency for py3 tests Because, as per Python 3.3+, `mock` it's a built-in-module * [test] Convert cls attributes to instance attributes Because we may have some side effects without willing, considering that cls attributes are shared between instances. * Fixes test_virtualenv and test_venv failing, closes #1994 (#1995) Recent pep517 release seems to break tests. * Made p4a use per-arch dist build dirs (#1986) * Made p4a use per-arch dist build dirs * Fixed up check on existing folder when overwriting distributions * Improved Distribution.get_distribution api * Fixed test_archs.py * Fixed test_bootstrap.py * Fixed test_distribution.py * Fixed recipes tests * Fixed formatting * Made sure whole build process accesses dist_dir correctly * Fixed apk output name formatting by moving version to end of string * Further test fixes following dist_dir changes * Removed unnecessary variable * Fixes libiconv & libzbar configure host Having `--host=x86` was making the configure script fail at enabling shared library build on `x86`. This was resulting in failing to copy `libiconv.so` and `libzbar.so` on `x86` arch. * Updates Java version troubleshooting (#1991) Adds the NoClassDefFoundError XmlSchema case and groups related cases together. Gives instructions for both Ubuntu and macOS to fix. * Made on-device unit tests app use the develop branch by default (#1985) * Updated version to 2019.10.06 Co-authored-by: Pol Canelles Co-authored-by: Gabriel Pettier Co-authored-by: Philipp Auersperg-Castell Co-authored-by: Richard Larkin Co-authored-by: Andre Miras * Bumps openssl to 1.1.1f * Updated version to 2019.10.06.post0 Co-authored-by: Pol Canelles Co-authored-by: Gabriel Pettier Co-authored-by: Philipp Auersperg-Castell Co-authored-by: Richard Larkin Co-authored-by: Andre Miras Co-authored-by: Andre Miras --- README.md | 2 +- pythonforandroid/recipes/openssl/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 692007bdf3..c3d421873e 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,7 @@ years. These **unified python recipes** require a **minimum target api level of api level below 21, you should use an older version of python-for-android (<=0.7.1). -On March of 2020 we dropped support for creating apps that use Python 2. The latest +On March of 2020 we dropped support for creating apps that use Python 2. The latest python-for-android release that supported building Python 2 was version 2019.10.6. ## Contributors diff --git a/pythonforandroid/recipes/openssl/__init__.py b/pythonforandroid/recipes/openssl/__init__.py index 0f9f08314b..8efe4f8e0f 100644 --- a/pythonforandroid/recipes/openssl/__init__.py +++ b/pythonforandroid/recipes/openssl/__init__.py @@ -47,7 +47,7 @@ class OpenSSLRecipe(Recipe): version = '1.1' '''the major minor version used to link our recipes''' - url_version = '1.1.1' + url_version = '1.1.1f' '''the version used to download our libraries''' url = 'https://www.openssl.org/source/openssl-{url_version}.tar.gz' From 266cfc3855c324da11a0c6dab2800597be6f34f9 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Wed, 1 Apr 2020 23:19:40 +0200 Subject: [PATCH 13/35] Auto deploys to PyPI using Travis on tags Uses PyPI `__token__` and Travis auto deployment to publish to PyPI upon tagging. https://pypi.org/help/#apitoken Travis uses the not so well documented `PYPI_PASSWORD` environment variable to store the password. https://github.com/travis-ci/dpl/blob/v1.10.15/lib/dpl/provider/pypi.rb#L12 The variable was set with a valid token prior this change. https://travis-ci.org/github/kivy/python-for-android/settings This is more secure than user and password as tokens are generated with uploaded only permissions and can be scoped to a given project. --- .gitignore | 1 + .travis.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/.gitignore b/.gitignore index 05196a8acb..f36a2f3572 100644 --- a/.gitignore +++ b/.gitignore @@ -18,6 +18,7 @@ python_for_android.egg-info /build/ doc/build __pycache__/ +venv/ #idea/pycharm .idea/ diff --git a/.travis.yml b/.travis.yml index 69acc4f8cb..27680224fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,3 +58,15 @@ jobs: - <<: *testapps name: Rebuild updated recipes script: travis_wait 30 make docker/run/make/rebuild_updated_recipes + +# Deploy to PyPI using token set in `PYPI_PASSWORD` environment variable +# https://pypi.org/manage/account/token/ +# https://travis-ci.org/github/kivy/python-for-android/settings +deploy: + provider: pypi + distributions: sdist bdist_wheel + user: "__token__" + on: + tags: true + repo: kivy/python-for-android + python: 3.7 From a69a2c476507f6c73ca3edeeeff2617164f5c1b0 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Fri, 3 Apr 2020 00:12:53 +0200 Subject: [PATCH 14/35] Fixes code block directives - s/codeblock/code-block/ - fixes code block being nested because of previous literal block `::` --- doc/source/testing_pull_requests.rst | 90 ++++++++++++++-------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/doc/source/testing_pull_requests.rst b/doc/source/testing_pull_requests.rst index a133cb15be..f77748e336 100644 --- a/doc/source/testing_pull_requests.rst +++ b/doc/source/testing_pull_requests.rst @@ -43,11 +43,11 @@ Fetch the pull request by number For the example, we will use `1901` for the example) and the pull request branch that we will use is `feature-fix-numpy`, then you will use a variation of the following git command: -`git fetch origin pull/<#>/head:`, eg.:: +`git fetch origin pull/<#>/head:`, e.g.: - .. codeblock:: bash +.. code-block:: bash - git fetch upstream pull/1901/head:feature-fix-numpy + git fetch upstream pull/1901/head:feature-fix-numpy .. note:: Notice that we fetch from `upstream`, since that is the original project, where the pull request is supposed to be @@ -55,16 +55,16 @@ of the following git command: .. tip:: The amount of work of some users maybe worth it to add his remote to your fork's git configuration, to do so with the imaginary github user `Obi-Wan Kenobi` which nickname is `obiwankenobi`, you - will do:: + will do: - .. codeblock:: bash + .. code-block:: bash git remote add obiwankenobi https://github.com/obiwankenobi/python-for-android.git And to fetch the pull request branch that we put as example, you - would do:: + would do: - .. codeblock:: bash + .. code-block:: bash git fetch obiwankenobi git checkout obiwankenobi/feature-fix-numpy @@ -74,9 +74,9 @@ Clone the pull request branch from the user's fork -------------------------------------------------- Sometimes you may prefer to use directly the fork of the user, so you will get the nickname of the user who created the pull request, let's take the same -imaginary user than before `obiwankenobi`:: +imaginary user than before `obiwankenobi`: - .. codeblock:: bash + .. code-block:: bash git clone -b feature-fix-numpy \ --single-branch \ @@ -103,25 +103,25 @@ Using python-for-android commands directly from the pull request files ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Enter inside the directory of the cloned repository in the above - step and run p4a command with proper args, eg (to test an modified - `pycryptodome` recipe):: - - .. codeblock:: bash - - cd p4a-feature-fix-numpy - PYTHONPATH=. python3 -m pythonforandroid.toolchain apk \ - --private=testapps/on_device_unit_tests/test_app \ - --dist-name=dist_unit_tests_app_pycryptodome \ - --package=org.kivy \ - --name=unit_tests_app_pycryptodome \ - --version=0.1 \ - --requirements=sdl2,pyjnius,kivy,python3,pycryptodome \ - --ndk-dir=/media/DEVEL/Android/android-ndk-r20 \ - --sdk-dir=/media/DEVEL/Android/android-sdk-linux \ - --android-api=27 \ - --arch=arm64-v8a \ - --permission=VIBRATE \ - --debug + step and run p4a command with proper args, e.g. (to test an modified + `pycryptodome` recipe) + +.. code-block:: bash + + cd p4a-feature-fix-numpy + PYTHONPATH=. python3 -m pythonforandroid.toolchain apk \ + --private=testapps/on_device_unit_tests/test_app \ + --dist-name=dist_unit_tests_app_pycryptodome \ + --package=org.kivy \ + --name=unit_tests_app_pycryptodome \ + --version=0.1 \ + --requirements=sdl2,pyjnius,kivy,python3,pycryptodome \ + --ndk-dir=/media/DEVEL/Android/android-ndk-r20 \ + --sdk-dir=/media/DEVEL/Android/android-sdk-linux \ + --android-api=27 \ + --arch=arm64-v8a \ + --permission=VIBRATE \ + --debug Things that you should know: @@ -153,31 +153,31 @@ Installing python-for-android using the github's branch of the pull request ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Enter inside the directory of the cloned repository mentioned in - `Common steps` and install it via pip, eg.:: + `Common steps` and install it via pip, e.g.: - .. codeblock:: bash +.. code-block:: bash - cd p4a-feature-fix-numpy - pip3 install . --upgrade --user + cd p4a-feature-fix-numpy + pip3 install . --upgrade --user - Now, go inside the `testapps/on_device_unit_tests` directory (we assume that - you still are inside the cloned repository):: + you still are inside the cloned repository) - .. codeblock:: bash +.. code-block:: bash - cd testapps/on_device_unit_tests + cd testapps/on_device_unit_tests - Run the build of the apk via the freshly installed copy of python-for-android - by running a similar command than below:: + by running a similar command than below - .. code-block:: bash +.. code-block:: bash - python3 setup.py apk \ - --ndk-dir=/media/DEVEL/Android/android-ndk-r20 \ - --sdk-dir=/media/DEVEL/Android/android-sdk-linux \ - --android-api=27 \ - --arch=arm64-v8a \ - --debug + python3 setup.py apk \ + --ndk-dir=/media/DEVEL/Android/android-ndk-r20 \ + --sdk-dir=/media/DEVEL/Android/android-sdk-linux \ + --android-api=27 \ + --arch=arm64-v8a \ + --debug Things that you should know: @@ -207,7 +207,7 @@ Using buildozer with a custom app p4a.source_dir = /home/user/p4a_pull_requests/p4a-feature-fix-numpy -- Run you buildozer command as usual, eg.:: +- Run you buildozer command as usual, e.g.:: buildozer android debug p4a --dist-name=dist-test-feature-fix-numpy @@ -223,4 +223,4 @@ Using buildozer with a custom app .. tip:: this method it's useful for developing pull requests since you can edit `p4a.source_dir` to point to your python-for-android fork and you can test any branch you want only switching branches with: - `git checkout ` from inside your python-for-android fork \ No newline at end of file + `git checkout ` from inside your python-for-android fork From cf4a2f035b6ccc5269cbd1f604f66ae02a44292e Mon Sep 17 00:00:00 2001 From: Robert Pfeiffer Date: Fri, 3 Apr 2020 09:38:58 +0200 Subject: [PATCH 15/35] fixes #2056, fixes #2045, actually fixes #2051 and #1142 --- pythonforandroid/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index e5c1f280b6..3d4428573a 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -576,10 +576,10 @@ def build_recipes(build_order, python_modules, ctx, project_dir, info_main('Building {} for {}'.format(recipe.name, arch.arch)) if recipe.should_build(arch): recipe.build_arch(arch) - recipe.install_libraries(arch) else: info('{} said it is already built, skipping' .format(recipe.name)) + recipe.install_libraries(arch) # 4) biglink everything info_main('# Biglinking object files') From a2420ecbe92f156ef650f1224be8d005eec46e97 Mon Sep 17 00:00:00 2001 From: mikevlz Date: Fri, 3 Apr 2020 20:35:15 +0400 Subject: [PATCH 16/35] bump zeroconf version to 0.24.5, fix depends python-zeroconf bumped to 0.24.5(latest version via pip) package depends only on 'ifaddr' and 'typing'. Special recipes not required --- pythonforandroid/recipes/zeroconf/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pythonforandroid/recipes/zeroconf/__init__.py b/pythonforandroid/recipes/zeroconf/__init__.py index 5ca57084a1..a23bd6e25c 100644 --- a/pythonforandroid/recipes/zeroconf/__init__.py +++ b/pythonforandroid/recipes/zeroconf/__init__.py @@ -3,9 +3,9 @@ class ZeroconfRecipe(PythonRecipe): name = 'zeroconf' - version = '0.17.4' + version = '0.24.5' url = 'https://pypi.python.org/packages/source/z/zeroconf/zeroconf-{version}.tar.gz' - depends = ['setuptools', 'enum34', 'six'] + depends = ['setuptools', 'ifaddr', 'typing;python_version<"3.5"'] call_hostpython_via_targetpython = False From b0e63103e9e141d2c3142366e7fc4ff6df700321 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Fri, 3 Apr 2020 19:59:46 +0200 Subject: [PATCH 17/35] Fix coveralls error on GitHub Actions Coveralls started failing suddenly in GitHub Actions Worflows. This feels like a bug on their side (at least their documentation) because the `CI` environment variable is not supposed to be set refs: https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables Disabling the `coveralls` conditional run from the `Makefile` fixes it. It wasn't needed as Travis already calls it explicitly without going through the `test` target. Error was: ``` /bin/sh: 1: .tox/py36/bin/coveralls: not found Makefile:30: recipe for target 'test' failed make: *** [test] Error 127 ``` --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index e939408a63..4b5b1f4414 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,6 @@ virtualenv: $(VIRTUAL_ENV) # ignores test_pythonpackage.py since it runs for too long test: $(TOX) -- tests/ --ignore tests/test_pythonpackage.py - @if test -n "$$CI"; then .tox/py$(PYTHON_MAJOR_MINOR)/bin/coveralls; fi; \ rebuild_updated_recipes: virtualenv . $(ACTIVATE) && \ From 10cf15868c08acc755d421a26309ffcdb6c0aeac Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 4 Apr 2020 13:48:17 +0200 Subject: [PATCH 18/35] Bumps cffi==1.13.2 fixes under Python 3.8 https://bitbucket.org/cffi/cffi/issues/403/build-fails-on-38-dev-pyinterpreterstate https://github.com/kivy/python-for-android/pull/2130#issuecomment-608988477 The error was: ``` c/call_python.c:20:30: error: incomplete definition of type 'struct _is' ``` --- pythonforandroid/recipes/cffi/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/recipes/cffi/__init__.py b/pythonforandroid/recipes/cffi/__init__.py index e2a3b57f45..3416fec620 100644 --- a/pythonforandroid/recipes/cffi/__init__.py +++ b/pythonforandroid/recipes/cffi/__init__.py @@ -7,7 +7,7 @@ class CffiRecipe(CompiledComponentsPythonRecipe): Extra system dependencies: autoconf, automake and libtool. """ name = 'cffi' - version = '1.11.5' + version = '1.13.2' url = 'https://pypi.python.org/packages/source/c/cffi/cffi-{version}.tar.gz' depends = ['setuptools', 'pycparser', 'libffi'] From 187f859b19f8606d73dbd2e0dccfe7f0c2b0723d Mon Sep 17 00:00:00 2001 From: SomberNight Date: Sat, 4 Apr 2020 00:00:25 +0200 Subject: [PATCH 19/35] recipe: update 'cryptography' and rm unnecessary dependencies - 'idna' no longer needed since version 2.5 - 'asn1crypto' no longer needed since version 2.8 - 'enum34' is just a backport of python 3.4+ functionality - 'ipaddress' is just a backport of python 3.3+ functionality --- pythonforandroid/recipes/cryptography/__init__.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pythonforandroid/recipes/cryptography/__init__.py b/pythonforandroid/recipes/cryptography/__init__.py index 19c8f0d645..182c745996 100644 --- a/pythonforandroid/recipes/cryptography/__init__.py +++ b/pythonforandroid/recipes/cryptography/__init__.py @@ -3,10 +3,9 @@ class CryptographyRecipe(CompiledComponentsPythonRecipe): name = 'cryptography' - version = '2.6.1' + version = '2.8' url = 'https://github.com/pyca/cryptography/archive/{version}.tar.gz' - depends = ['openssl', 'idna', 'asn1crypto', 'six', 'setuptools', - 'enum34', 'ipaddress', 'cffi'] + depends = ['openssl', 'six', 'setuptools', 'cffi'] call_hostpython_via_targetpython = False def get_recipe_env(self, arch): From 47c9c33f522d0ec6fa4a654ac661bdbce7bc79b5 Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Wed, 8 Apr 2020 12:15:09 +0200 Subject: [PATCH 20/35] :lock: Bump twisted version to `20.3.0` (#2135) Because of a detected vulnerability with prior versions of twisted: **See also**: https://github.com/advisories/GHSA-h96w-mmrf-2h6v --- pythonforandroid/recipes/twisted/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/recipes/twisted/__init__.py b/pythonforandroid/recipes/twisted/__init__.py index 0350ed7949..02d532a07c 100644 --- a/pythonforandroid/recipes/twisted/__init__.py +++ b/pythonforandroid/recipes/twisted/__init__.py @@ -2,7 +2,7 @@ class TwistedRecipe(CythonRecipe): - version = '19.7.0' + version = '20.3.0' url = 'https://github.com/twisted/twisted/archive/twisted-{version}.tar.gz' depends = ['setuptools', 'zope_interface', 'incremental', 'constantly'] From 0b81c78f59d033027a88dd68f6952877b492b983 Mon Sep 17 00:00:00 2001 From: Philipp Auersperg-Castell Date: Wed, 1 Apr 2020 11:56:17 +0200 Subject: [PATCH 21/35] p4a support for creating aar libraries * ported @xuhcc's PR 1063 to recent p4a master * bootstraps dirs are cumulatively copied based on their inheritance, can be arbitrarily deep * add symlink param to copy_files, when set the copy target are symlinked * support for the aar directive in buildozer * create a 'p4a aar' command, so that lots of cluttering conditionals can be moved away from toolchain.apk() * began to remove ant support (@inclement allowed me to do so) * renamed library bootstrap to service_library, because that describe it better * test setup setup_testlib_service.py * renamed symlink_java_src to symlink_bootstrap_files * None is not allowed as bootstrap parameter * switched tests to use the sdl2 bootstrap --- .../bootstraps/service_library/__init__.py | 9 + .../jni/application/src/bootstrap_name.h | 6 + .../java/org/kivy/android/PythonActivity.java | 9 + .../java/org/renpy/android/AssetExtract.java | 115 +++++++ .../build/templates/AndroidManifest.tmpl.xml | 18 ++ .../build/templates/Service.tmpl.java | 126 ++++++++ pythonforandroid/recipes/android/__init__.py | 10 +- pythonforandroid/toolchain.py | 289 ++++++++++-------- testapps/on_device_unit_tests/setup.py | 1 + 9 files changed, 440 insertions(+), 143 deletions(-) create mode 100644 pythonforandroid/bootstraps/service_library/__init__.py create mode 100644 pythonforandroid/bootstraps/service_library/build/jni/application/src/bootstrap_name.h create mode 100644 pythonforandroid/bootstraps/service_library/build/src/main/java/org/kivy/android/PythonActivity.java create mode 100644 pythonforandroid/bootstraps/service_library/build/src/main/java/org/renpy/android/AssetExtract.java create mode 100644 pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml create mode 100644 pythonforandroid/bootstraps/service_library/build/templates/Service.tmpl.java diff --git a/pythonforandroid/bootstraps/service_library/__init__.py b/pythonforandroid/bootstraps/service_library/__init__.py new file mode 100644 index 0000000000..0b41be87f2 --- /dev/null +++ b/pythonforandroid/bootstraps/service_library/__init__.py @@ -0,0 +1,9 @@ +from pythonforandroid.bootstraps.service_only import ServiceOnlyBootstrap + + +class ServiceLibraryBootstrap(ServiceOnlyBootstrap): + + name = 'service_library' + + +bootstrap = ServiceLibraryBootstrap() diff --git a/pythonforandroid/bootstraps/service_library/build/jni/application/src/bootstrap_name.h b/pythonforandroid/bootstraps/service_library/build/jni/application/src/bootstrap_name.h new file mode 100644 index 0000000000..01fd122890 --- /dev/null +++ b/pythonforandroid/bootstraps/service_library/build/jni/application/src/bootstrap_name.h @@ -0,0 +1,6 @@ + +#define BOOTSTRAP_NAME_LIBRARY +#define BOOTSTRAP_USES_NO_SDL_HEADERS + +const char bootstrap_name[] = "service_library"; + diff --git a/pythonforandroid/bootstraps/service_library/build/src/main/java/org/kivy/android/PythonActivity.java b/pythonforandroid/bootstraps/service_library/build/src/main/java/org/kivy/android/PythonActivity.java new file mode 100644 index 0000000000..c54c19b982 --- /dev/null +++ b/pythonforandroid/bootstraps/service_library/build/src/main/java/org/kivy/android/PythonActivity.java @@ -0,0 +1,9 @@ +package org.kivy.android; + +import android.app.Activity; + +// Required by PythonService class +public class PythonActivity extends Activity { + +} + diff --git a/pythonforandroid/bootstraps/service_library/build/src/main/java/org/renpy/android/AssetExtract.java b/pythonforandroid/bootstraps/service_library/build/src/main/java/org/renpy/android/AssetExtract.java new file mode 100644 index 0000000000..092730dfe1 --- /dev/null +++ b/pythonforandroid/bootstraps/service_library/build/src/main/java/org/renpy/android/AssetExtract.java @@ -0,0 +1,115 @@ +// This string is autogenerated by ChangeAppSettings.sh, do not change +// spaces amount +package org.renpy.android; + +import java.io.*; + +import android.content.Context; +import android.util.Log; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.File; + +import java.util.zip.GZIPInputStream; + +import android.content.res.AssetManager; + +import org.kamranzafar.jtar.*; + +public class AssetExtract { + + private AssetManager mAssetManager = null; + private Context ctx = null; + + public AssetExtract(Context context) { + ctx = context; + mAssetManager = ctx.getAssets(); + } + + public boolean extractTar(String asset, String target) { + + byte buf[] = new byte[1024 * 1024]; + + InputStream assetStream = null; + TarInputStream tis = null; + + try { + assetStream = mAssetManager.open(asset, AssetManager.ACCESS_STREAMING); + tis = new TarInputStream(new BufferedInputStream(new GZIPInputStream(new BufferedInputStream(assetStream, 8192)), 8192)); + } catch (IOException e) { + Log.e("python", "opening up extract tar", e); + return false; + } + + while (true) { + TarEntry entry = null; + + try { + entry = tis.getNextEntry(); + } catch ( java.io.IOException e ) { + Log.e("python", "extracting tar", e); + return false; + } + + if ( entry == null ) { + break; + } + + Log.v("python", "extracting " + entry.getName()); + + if (entry.isDirectory()) { + + try { + new File(target +"/" + entry.getName()).mkdirs(); + } catch ( SecurityException e ) { }; + + continue; + } + + OutputStream out = null; + String path = target + "/" + entry.getName(); + + try { + out = new BufferedOutputStream(new FileOutputStream(path), 8192); + } catch ( FileNotFoundException e ) { + } catch ( SecurityException e ) { }; + + if ( out == null ) { + Log.e("python", "could not open " + path); + return false; + } + + try { + while (true) { + int len = tis.read(buf); + + if (len == -1) { + break; + } + + out.write(buf, 0, len); + } + + out.flush(); + out.close(); + } catch ( java.io.IOException e ) { + Log.e("python", "extracting zip", e); + return false; + } + } + + try { + tis.close(); + assetStream.close(); + } catch (IOException e) { + // pass + } + + return true; + } +} diff --git a/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml b/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml new file mode 100644 index 0000000000..f9b5afe3a5 --- /dev/null +++ b/pythonforandroid/bootstraps/service_library/build/templates/AndroidManifest.tmpl.xml @@ -0,0 +1,18 @@ + + + + + + + + {% for name in service_names %} + + {% endfor %} + + + diff --git a/pythonforandroid/bootstraps/service_library/build/templates/Service.tmpl.java b/pythonforandroid/bootstraps/service_library/build/templates/Service.tmpl.java new file mode 100644 index 0000000000..4f6f7d1e26 --- /dev/null +++ b/pythonforandroid/bootstraps/service_library/build/templates/Service.tmpl.java @@ -0,0 +1,126 @@ +package {{ args.package }}; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; + +import android.os.Build; +import android.content.Intent; +import android.content.Context; +import android.content.res.Resources; +import android.util.Log; + +import org.renpy.android.AssetExtract; +import org.kivy.android.PythonService; + +public class Service{{ name|capitalize }} extends PythonService { + + private static final String TAG = "PythonService"; + + public static void prepare(Context ctx) { + String appRoot = getAppRoot(ctx); + Log.v(TAG, "Ready to unpack"); + File app_root_file = new File(appRoot); + unpackData(ctx, "private", app_root_file); + } + + public static void start(Context ctx, String pythonServiceArgument) { + String appRoot = getAppRoot(ctx); + Intent intent = new Intent(ctx, Service{{ name|capitalize }}.class); + intent.putExtra("androidPrivate", appRoot); + intent.putExtra("androidArgument", appRoot); + intent.putExtra("serviceEntrypoint", "{{ entrypoint }}"); + intent.putExtra("serviceTitle", "{{ name|capitalize }}"); + intent.putExtra("serviceDescription", ""); + intent.putExtra("pythonName", "{{ name }}"); + intent.putExtra("serviceStartAsForeground", "{{ foreground|lower }}"); + intent.putExtra("pythonHome", appRoot); + intent.putExtra("androidUnpack", appRoot); + intent.putExtra("pythonPath", appRoot + ":" + appRoot + "/lib"); + intent.putExtra("pythonServiceArgument", pythonServiceArgument); + + //foreground: {{foreground}} + {% if foreground %} + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + ctx.startForegroundService(intent); + } else { + ctx.startService(intent); + } + {% else %} + ctx.startService(intent); + {% endif %} + } + + public static String getAppRoot(Context ctx) { + String app_root = ctx.getFilesDir().getAbsolutePath() + "/app"; + return app_root; + } + + public static String getResourceString(Context ctx, String name) { + // Taken from org.renpy.android.ResourceManager + Resources res = ctx.getResources(); + int id = res.getIdentifier(name, "string", ctx.getPackageName()); + return res.getString(id); + } + + public static void unpackData(Context ctx, final String resource, File target) { + // Taken from PythonActivity class + + Log.v(TAG, "UNPACKING!!! " + resource + " " + target.getName()); + + // The version of data in memory and on disk. + String data_version = getResourceString(ctx, resource + "_version"); + String disk_version = null; + + Log.v(TAG, "Data version is " + data_version); + + // If no version, no unpacking is necessary. + if (data_version == null) { + return; + } + + // Check the current disk version, if any. + String filesDir = target.getAbsolutePath(); + String disk_version_fn = filesDir + "/" + resource + ".version"; + + try { + byte buf[] = new byte[64]; + InputStream is = new FileInputStream(disk_version_fn); + int len = is.read(buf); + disk_version = new String(buf, 0, len); + is.close(); + } catch (Exception e) { + disk_version = ""; + } + + // If the disk data is out of date, extract it and write the + // version file. + // if (! data_version.equals(disk_version)) { + if (! data_version.equals(disk_version)) { + Log.v(TAG, "Extracting " + resource + " assets."); + + // Don't delete existing files + // recursiveDelete(target); + target.mkdirs(); + + AssetExtract ae = new AssetExtract(ctx); + if (!ae.extractTar(resource + ".mp3", target.getAbsolutePath())) { + Log.v(TAG, "Could not extract " + resource + " data."); + } + + try { + // Write .nomedia. + new File(target, ".nomedia").createNewFile(); + + // Write version file. + FileOutputStream os = new FileOutputStream(disk_version_fn); + os.write(data_version.getBytes()); + os.close(); + } catch (Exception e) { + Log.w("python", e); + } + } + } + +} diff --git a/pythonforandroid/recipes/android/__init__.py b/pythonforandroid/recipes/android/__init__.py index 6d196fe321..ba45fe95b1 100644 --- a/pythonforandroid/recipes/android/__init__.py +++ b/pythonforandroid/recipes/android/__init__.py @@ -34,14 +34,8 @@ def prebuild_arch(self, arch): if isinstance(ctx_bootstrap, bytes): ctx_bootstrap = ctx_bootstrap.decode('utf-8') bootstrap = bootstrap_name = ctx_bootstrap - - is_sdl2 = bootstrap_name in ('sdl2', 'sdl2python3', 'sdl2_gradle') - is_webview = bootstrap_name == 'webview' - is_service_only = bootstrap_name == 'service_only' - - if is_sdl2 or is_webview or is_service_only: - if is_sdl2: - bootstrap = 'sdl2' + is_sdl2 = (bootstrap_name == "sdl2") + if bootstrap_name in ["sdl2", "webview", "service_only", "service_library"]: java_ns = u'org.kivy.android' jni_ns = u'org/kivy/android' else: diff --git a/pythonforandroid/toolchain.py b/pythonforandroid/toolchain.py index 955d8a8a52..bc427f6d35 100644 --- a/pythonforandroid/toolchain.py +++ b/pythonforandroid/toolchain.py @@ -138,7 +138,7 @@ def require_prebuilt_dist(func): """ @wraps(func) - def wrapper_func(self, args): + def wrapper_func(self, args, **kw): ctx = self.ctx ctx.set_archs(self._archs) ctx.prepare_build_environment(user_sdk_dir=self.sdk_dir, @@ -152,7 +152,7 @@ def wrapper_func(self, args): info_notify('No dist exists that meets your requirements, ' 'so one will be built.') build_dist_from_args(ctx, dist, args) - func(self, args) + func(self, args, **kw) return wrapper_func @@ -196,10 +196,6 @@ def build_dist_from_args(ctx, dist, args): ctx.recipe_build_order)) info('Dist will also contain modules ({}) installed from pip'.format( ', '.join(ctx.python_modules))) - if hasattr(args, "build_mode") and args.build_mode == "debug": - info('Building WITH debugging symbols (no --release option used)') - else: - info('Building WITHOUT debugging symbols (--release option used)') ctx.distribution = dist ctx.prepare_bootstrap(bs) @@ -293,11 +289,11 @@ def __init__(self): '*minimal supported* API, not normally the same as your --android-api. ' 'Defaults to min(ANDROID_API, {}) if not specified.').format(RECOMMENDED_NDK_API)) generic_parser.add_argument( - '--symlink-java-src', '--symlink_java_src', + '--symlink-bootstrap-files', '--ssymlink_bootstrap_files', action='store_true', - dest='symlink_java_src', + dest='symlink_bootstrap_files', default=False, - help=('If True, symlinks the java src folder during build and dist ' + help=('If True, symlinks the bootstrap files ' 'creation. This is useful for development only, it could also' ' cause weird problems.')) @@ -485,31 +481,27 @@ def add_parser(subparsers, *args, **kwargs): action='store_true', help='Symlink the dist instead of copying') - parser_apk = add_parser( - subparsers, - 'apk', help='Build an APK', - parents=[generic_parser]) + parser_packaging = argparse.ArgumentParser( + parents=[generic_parser], + add_help=False, + description='common options for packaging (apk, aar)') + # This is actually an internal argument of the build.py # (see pythonforandroid/bootstraps/common/build/build.py). # However, it is also needed before the distribution is finally # assembled for locating the setup.py / other build systems, which # is why we also add it here: - parser_apk.add_argument( + parser_packaging.add_argument( '--private', dest='private', help='the directory with the app source code files' + ' (containing your main.py entrypoint)', required=False, default=None) - parser_apk.add_argument( - '--release', dest='build_mode', action='store_const', - const='release', default='debug', - help='Build your app as a non-debug release build. ' - '(Disables gdb debugging among other things)') - parser_apk.add_argument( + parser_packaging.add_argument( '--use-setup-py', dest="use_setup_py", action='store_true', default=False, help="Process the setup.py of a project if present. " + "(Experimental!") - parser_apk.add_argument( + parser_packaging.add_argument( '--ignore-setup-py', dest="ignore_setup_py", action='store_true', default=False, help="Don't run the setup.py of a project if present. " + @@ -517,20 +509,35 @@ def add_parser(subparsers, *args, **kwargs): "designed to work inside p4a (e.g. by installing " + "dependencies that won't work or aren't desired " + "on Android") - parser_apk.add_argument( + parser_packaging.add_argument( + '--release', dest='build_mode', action='store_const', + const='release', default='debug', + help='Build your app as a non-debug release build. ' + '(Disables gdb debugging among other things)') + parser_packaging.add_argument( '--keystore', dest='keystore', action='store', default=None, help=('Keystore for JAR signing key, will use jarsigner ' 'default if not specified (release build only)')) - parser_apk.add_argument( + parser_packaging.add_argument( '--signkey', dest='signkey', action='store', default=None, help='Key alias to sign PARSER_APK. with (release build only)') - parser_apk.add_argument( + parser_packaging.add_argument( '--keystorepw', dest='keystorepw', action='store', default=None, help='Password for keystore') - parser_apk.add_argument( + parser_packaging.add_argument( '--signkeypw', dest='signkeypw', action='store', default=None, help='Password for key alias') + add_parser( + subparsers, + 'aar', help='Build an AAR', + parents=[parser_packaging]) + + add_parser( + subparsers, + 'apk', help='Build an APK', + parents=[parser_packaging]) + add_parser( subparsers, 'create', help='Compile a set of requirements into a dist', @@ -668,7 +675,7 @@ def add_parser(subparsers, *args, **kwargs): self.ndk_dir = args.ndk_dir self.android_api = args.android_api self.ndk_api = args.ndk_api - self.ctx.symlink_java_src = args.symlink_java_src + self.ctx.symlink_bootstrap_files = args.symlink_bootstrap_files self.ctx.java_build_tool = args.java_build_tool self._archs = split_argument_list(args.arch) @@ -677,7 +684,8 @@ def add_parser(subparsers, *args, **kwargs): self.ctx.copy_libs = args.copy_libs # Each subparser corresponds to a method - getattr(self, args.subparser_name.replace('-', '_'))(args) + command = args.subparser_name.replace('-', '_') + getattr(self, command)(args) @staticmethod def warn_on_carriage_return_args(args): @@ -927,17 +935,17 @@ def _dist(self): ctx.distribution = dist return dist - @require_prebuilt_dist - def apk(self, args): - """Create an APK using the given distribution.""" - - ctx = self.ctx - dist = self._dist + @staticmethod + def _fix_args(args): + """ + Manually fixing these arguments at the string stage is + unsatisfactory and should probably be changed somehow, but + we can't leave it until later as the build.py scripts assume + they are in the current directory. + works in-place + :param args: parser args + """ - # Manually fixing these arguments at the string stage is - # unsatisfactory and should probably be changed somehow, but - # we can't leave it until later as the build.py scripts assume - # they are in the current directory. fix_args = ('--dir', '--private', '--add-jar', '--add-source', '--whitelist', '--blacklist', '--presplash', '--icon') unknown_args = args.unknown_args @@ -950,6 +958,12 @@ def apk(self, args): elif i + 1 < len(unknown_args): unknown_args[i+1] = realpath(expanduser(unknown_args[i+1])) + @staticmethod + def _prepare_release_env(args): + """ + prepares envitonment dict with the necessary flags for signing an apk + :param args: parser args + """ env = os.environ.copy() if args.build_mode == 'release': if args.keystore: @@ -963,129 +977,134 @@ def apk(self, args): elif args.keystorepw and 'P4A_RELEASE_KEYALIAS_PASSWD' not in env: env['P4A_RELEASE_KEYALIAS_PASSWD'] = args.keystorepw - build = imp.load_source('build', join(dist.dist_dir, 'build.py')) + return env + + def _build_package(self, args, package_type): + """ + Creates an android package using gradle + :param args: parser args + :param package_type: one of 'apk', 'aar' + :return (gradle output, build_args) + """ + ctx = self.ctx + dist = self._dist + bs = Bootstrap.get_bootstrap(args.bootstrap, ctx) + ctx.prepare_bootstrap(bs) + self._fix_args(args) + env = self._prepare_release_env(args) + with current_directory(dist.dist_dir): self.hook("before_apk_build") os.environ["ANDROID_API"] = str(self.ctx.android_api) + build = imp.load_source('build', join(dist.dist_dir, 'build.py')) build_args = build.parse_args_and_make_package( args.unknown_args ) + self.hook("after_apk_build") self.hook("before_apk_assemble") + build_tools_versions = os.listdir(join(ctx.sdk_dir, + 'build-tools')) + build_tools_versions = sorted(build_tools_versions, + key=LooseVersion) + build_tools_version = build_tools_versions[-1] + info(('Detected highest available build tools ' + 'version to be {}').format(build_tools_version)) + + if build_tools_version < '25.0': + raise BuildInterruptingException( + 'build_tools >= 25 is required, but %s is installed' % build_tools_version) + if not exists("gradlew"): + raise BuildInterruptingException("gradlew file is missing") + + env["ANDROID_NDK_HOME"] = self.ctx.ndk_dir + env["ANDROID_HOME"] = self.ctx.sdk_dir + + gradlew = sh.Command('./gradlew') + + if exists('/usr/bin/dos2unix'): + # .../dists/bdisttest_python3/gradlew + # .../build/bootstrap_builds/sdl2-python3/gradlew + # if docker on windows, gradle contains CRLF + output = shprint( + sh.Command('dos2unix'), gradlew._path.decode('utf8'), + _tail=20, _critical=True, _env=env + ) + if args.build_mode == "debug": + gradle_task = "assembleDebug" + elif args.build_mode == "release": + gradle_task = "assembleRelease" + else: + raise BuildInterruptingException( + "Unknown build mode {} for apk()".format(args.build_mode)) + output = shprint(gradlew, gradle_task, _tail=20, + _critical=True, _env=env) + return output, build_args - build_type = ctx.java_build_tool - if build_type == 'auto': - info('Selecting java build tool:') - - build_tools_versions = os.listdir(join(ctx.sdk_dir, - 'build-tools')) - build_tools_versions = sorted(build_tools_versions, - key=LooseVersion) - build_tools_version = build_tools_versions[-1] - info(('Detected highest available build tools ' - 'version to be {}').format(build_tools_version)) - - if build_tools_version >= '25.0' and exists('gradlew'): - build_type = 'gradle' - info(' Building with gradle, as gradle executable is ' - 'present') - else: - build_type = 'ant' - if build_tools_version < '25.0': - info((' Building with ant, as the highest ' - 'build-tools-version is only {}').format( - build_tools_version)) - else: - info(' Building with ant, as no gradle executable ' - 'detected') - - if build_type == 'gradle': - # gradle-based build - env["ANDROID_NDK_HOME"] = self.ctx.ndk_dir - env["ANDROID_HOME"] = self.ctx.sdk_dir - - gradlew = sh.Command('./gradlew') - if exists('/usr/bin/dos2unix'): - # .../dists/bdisttest_python3/gradlew - # .../build/bootstrap_builds/sdl2-python3/gradlew - # if docker on windows, gradle contains CRLF - output = shprint( - sh.Command('dos2unix'), gradlew._path.decode('utf8'), - _tail=20, _critical=True, _env=env - ) - if args.build_mode == "debug": - gradle_task = "assembleDebug" - elif args.build_mode == "release": - gradle_task = "assembleRelease" - else: - raise BuildInterruptingException( - "Unknown build mode {} for apk()". - format(args.build_mode) - ) - output = shprint(gradlew, gradle_task, _tail=20, - _critical=True, _env=env) + def _finish_package(self, args, output, build_args, package_type, output_dir): + """ + Finishes the package after the gradle script run + :param args: the parser args + :param output: RunningCommand output + :param build_args: build args as returned by build.parse_args + :param package_type: one of 'apk', 'aar' + :param output_dir: where to put the package file + """ - # gradle output apks somewhere else - # and don't have version in file - apk_dir = join(dist.dist_dir, - "build", "outputs", "apk", - args.build_mode) - apk_glob = "*-{}.apk" - apk_add_version = True + package_glob = "*-{}.%s" % package_type + package_add_version = True - else: - # ant-based build - try: - ant = sh.Command('ant') - except sh.CommandNotFound: - raise BuildInterruptingException( - 'Could not find ant binary, please install it ' - 'and make sure it is in your $PATH.') - output = shprint(ant, args.build_mode, _tail=20, - _critical=True, _env=env) - apk_dir = join(dist.dist_dir, "bin") - apk_glob = "*-*-{}.apk" - apk_add_version = False - - self.hook("after_apk_assemble") - - info_main('# Copying APK to current directory') - - apk_re = re.compile(r'.*Package: (.*\.apk)$') - apk_file = None + self.hook("after_apk_assemble") + + info_main('# Copying android package to current directory') + + package_re = re.compile(r'.*Package: (.*\.apk)$') + package_file = None for line in reversed(output.splitlines()): - m = apk_re.match(line) + m = package_re.match(line) if m: - apk_file = m.groups()[0] + package_file = m.groups()[0] break - - if not apk_file: - info_main('# APK filename not found in build output. Guessing...') + if not package_file: + info_main('# Android package filename not found in build output. Guessing...') if args.build_mode == "release": suffixes = ("release", "release-unsigned") else: suffixes = ("debug", ) for suffix in suffixes: - apks = glob.glob(join(apk_dir, apk_glob.format(suffix))) - if apks: - if len(apks) > 1: + + package_files = glob.glob(join(output_dir, package_glob.format(suffix))) + if package_files: + if len(package_files) > 1: info('More than one built APK found... guessing you ' - 'just built {}'.format(apks[-1])) - apk_file = apks[-1] + 'just built {}'.format(package_files[-1])) + package_file = package_files[-1] break else: raise BuildInterruptingException('Couldn\'t find the built APK') - info_main('# Found APK file: {}'.format(apk_file)) - if apk_add_version: - info('# Add version number to APK') - apk_name = basename(apk_file)[:-len(APK_SUFFIX)] - apk_file_dest = "{}-{}-{}".format( - apk_name, build_args.version, APK_SUFFIX) - info('# APK renamed to {}'.format(apk_file_dest)) - shprint(sh.cp, apk_file, apk_file_dest) + info_main('# Found android package file: {}'.format(package_file)) + if package_add_version: + info('# Add version number to android package') + package_name = basename(package_file)[:-len(APK_SUFFIX)] + package_file_dest = "{}-{}-{}".format( + package_name, build_args.version, APK_SUFFIX) + info('# Android package renamed to {}'.format(package_file_dest)) + shprint(sh.cp, package_file, package_file_dest) else: - shprint(sh.cp, apk_file, './') + shprint(sh.cp, package_file, './') + + @require_prebuilt_dist + def apk(self, args): + output, build_args = self._build_package(args, package_type='apk') + output_dir = join(self._dist.dist_dir, "build", "outputs", 'apk', args.build_mode) + self._finish_package(args, output, build_args, 'apk', output_dir) + + @require_prebuilt_dist + def aar(self, args): + output, build_args = self._build_package(args, package_type='aar') + output_dir = join(self._dist.dist_dir, "build", "outputs", 'aar') + self._finish_package(args, output, build_args, 'aar', output_dir) @require_prebuilt_dist def create(self, args): diff --git a/testapps/on_device_unit_tests/setup.py b/testapps/on_device_unit_tests/setup.py index 0df67e3f94..0f8574b9da 100644 --- a/testapps/on_device_unit_tests/setup.py +++ b/testapps/on_device_unit_tests/setup.py @@ -44,6 +44,7 @@ 'ndk-api': 21, 'dist-name': 'bdist_unit_tests_app', 'arch': 'armeabi-v7a', + 'bootstrap' : 'sdl2', 'permissions': ['INTERNET', 'VIBRATE'], 'orientation': 'sensor', 'service': 'P4a_test_service:app_service.py', From cea61f59d70a3090ff67b69ddd7768b94bb29810 Mon Sep 17 00:00:00 2001 From: Philipp Auersperg-Castell Date: Sun, 5 Apr 2020 14:52:49 +0200 Subject: [PATCH 22/35] repairted test on number of bootstraps --- tests/test_bootstrap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index 583cefb81c..3d3b13dde4 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -147,7 +147,7 @@ def test_all_bootstraps(self): returns the expected values, which should be: `empty", `service_only`, `webview` and `sdl2` """ - expected_bootstraps = {"empty", "service_only", "webview", "sdl2"} + expected_bootstraps = {"empty", "service_only", "service_library", "webview", "sdl2"} set_of_bootstraps = Bootstrap.all_bootstraps() self.assertEqual( expected_bootstraps, expected_bootstraps & set_of_bootstraps From 15590dabec8c4505d1ec05963f7bd47879e9681d Mon Sep 17 00:00:00 2001 From: Philipp Auersperg-Castell Date: Wed, 15 Apr 2020 19:12:33 +0200 Subject: [PATCH 23/35] fixed rebase armageddon --- pythonforandroid/bdistapk.py | 26 +++++++++--- pythonforandroid/bootstrap.py | 41 +++++++++++-------- .../bootstraps/common/build/build.py | 3 +- .../java/org/kivy/android/PythonUtil.java | 3 +- .../common/build/templates/build.tmpl.gradle | 4 ++ pythonforandroid/build.py | 10 +++-- setup.py | 1 + .../setup_testapp_python3_sqlite_openssl.py | 1 + testapps/setup_vispy.py | 1 + tests/test_bootstrap.py | 19 +-------- 10 files changed, 64 insertions(+), 45 deletions(-) diff --git a/pythonforandroid/bdistapk.py b/pythonforandroid/bdistapk.py index d22c9947a4..d4b2c7953a 100644 --- a/pythonforandroid/bdistapk.py +++ b/pythonforandroid/bdistapk.py @@ -14,16 +14,16 @@ def argv_contains(t): return False -class BdistAPK(Command): - description = 'Create an APK with python-for-android' +class Bdist(Command): user_options = [] + package_type = None def initialize_options(self): for option in self.user_options: setattr(self, option[0].strip('=').replace('-', '_'), None) - option_dict = self.distribution.get_option_dict('apk') + option_dict = self.distribution.get_option_dict(self.package_type) # This is a hack, we probably aren't supposed to loop through # the option_dict so early because distutils does exactly the @@ -34,7 +34,7 @@ def initialize_options(self): def finalize_options(self): - setup_options = self.distribution.get_option_dict('apk') + setup_options = self.distribution.get_option_dict(self.package_type) for (option, (source, value)) in setup_options.items(): if source == 'command line': continue @@ -75,7 +75,7 @@ def run(self): self.prepare_build_dir() from pythonforandroid.entrypoints import main - sys.argv[1] = 'apk' + sys.argv[1] = self.package_type main() def prepare_build_dir(self): @@ -127,6 +127,22 @@ def prepare_build_dir(self): ) +class BdistAPK(Bdist): + """ + distutil command handler for 'apk' + """ + description = 'Create an APK with python-for-android' + package_type = 'apk' + + +class BdistAAR(Bdist): + """ + distutil command handler for 'aar' + """ + description = 'Create an AAR with python-for-android' + package_type = 'aar' + + def _set_user_options(): # This seems like a silly way to do things, but not sure if there's a # better way to pass arbitrary options onwards to p4a diff --git a/pythonforandroid/bootstrap.py b/pythonforandroid/bootstrap.py index 75b82e555f..798934295b 100755 --- a/pythonforandroid/bootstrap.py +++ b/pythonforandroid/bootstrap.py @@ -14,7 +14,7 @@ from pythonforandroid.recipe import Recipe -def copy_files(src_root, dest_root, override=True): +def copy_files(src_root, dest_root, override=True, symlink=False): for root, dirnames, filenames in walk(src_root): for filename in filenames: subdir = normpath(root.replace(src_root, "")) @@ -29,7 +29,10 @@ def copy_files(src_root, dest_root, override=True): if override and os.path.exists(dest_file): os.unlink(dest_file) if not os.path.exists(dest_file): - shutil.copy(src_file, dest_file) + if symlink: + os.symlink(src_file, dest_file) + else: + shutil.copy(src_file, dest_file) else: os.makedirs(dest_file) @@ -109,7 +112,7 @@ def check_recipe_choices(self): and optional dependencies are being used, and returns a list of these.''' recipes = [] - built_recipes = self.ctx.recipe_build_order + built_recipes = self.ctx.recipe_build_order or [] for recipe in self.recipe_depends: if isinstance(recipe, (tuple, list)): for alternative in recipe: @@ -137,21 +140,27 @@ def name(self): modname = self.__class__.__module__ return modname.split(".", 2)[-1] + def get_bootstrap_dirs(self): + """get all bootstrap directories, following the MRO path""" + + # get all bootstrap names along the __mro__, cutting off Bootstrap and object + classes = self.__class__.__mro__[:-2] + bootstrap_names = [cls.name for cls in classes] + ['common'] + bootstrap_dirs = [ + join(self.ctx.root_dir, 'bootstraps', bootstrap_name) + for bootstrap_name in reversed(bootstrap_names) + ] + return bootstrap_dirs + def prepare_build_dir(self): - '''Ensure that a build dir exists for the recipe. This same single - dir will be used for building all different archs.''' + """Ensure that a build dir exists for the recipe. This same single + dir will be used for building all different archs.""" + bootstrap_dirs = self.get_bootstrap_dirs() + # now do a cumulative copy of all bootstrap dirs self.build_dir = self.get_build_dir() - self.common_dir = self.get_common_dir() - copy_files(join(self.bootstrap_dir, 'build'), self.build_dir) - copy_files(join(self.common_dir, 'build'), self.build_dir, - override=False) - if self.ctx.symlink_java_src: - info('Symlinking java src instead of copying') - shprint(sh.rm, '-r', join(self.build_dir, 'src')) - shprint(sh.mkdir, join(self.build_dir, 'src')) - for dirn in listdir(join(self.bootstrap_dir, 'build', 'src')): - shprint(sh.ln, '-s', join(self.bootstrap_dir, 'build', 'src', dirn), - join(self.build_dir, 'src')) + for bootstrap_dir in bootstrap_dirs: + copy_files(join(bootstrap_dir, 'build'), self.build_dir, symlink=self.ctx.symlink_bootstrap_files) + with current_directory(self.build_dir): with open('project.properties', 'w') as fileh: fileh.write('target=android-{}'.format(self.ctx.android_api)) diff --git a/pythonforandroid/bootstraps/common/build/build.py b/pythonforandroid/bootstraps/common/build/build.py index 6b5c87b5c3..8eb1a6fe0e 100644 --- a/pythonforandroid/bootstraps/common/build/build.py +++ b/pythonforandroid/bootstraps/common/build/build.py @@ -225,7 +225,7 @@ def compile_dir(dfn, optimize_python=True): def make_package(args): # If no launcher is specified, require a main.py/main.pyo: if (get_bootstrap_name() != "sdl" or args.launcher is None) and \ - get_bootstrap_name() != "webview": + get_bootstrap_name() not in ["webview", "service_library"]: # (webview doesn't need an entrypoint, apparently) if args.private is None or ( not exists(join(realpath(args.private), 'main.py')) and @@ -479,6 +479,7 @@ def make_package(args): android_api=android_api, build_tools_version=build_tools_version, debug_build="debug" in args.build_mode, + is_library=(get_bootstrap_name() == 'service_library'), ) # ant build templates diff --git a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java index 6a546a7eb1..f3cf0dbf4e 100644 --- a/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java +++ b/pythonforandroid/bootstraps/common/build/src/main/java/org/kivy/android/PythonUtil.java @@ -39,6 +39,7 @@ protected static ArrayList getLibraries(File libsDir) { libsList.add("python3.5m"); libsList.add("python3.6m"); libsList.add("python3.7m"); + libsList.add("python3.8m"); libsList.add("main"); return libsList; } @@ -59,7 +60,7 @@ public static void loadLibraries(File filesDir, File libsDir) { // load, and it has failed, give a more // general error Log.v(TAG, "Library loading error: " + e.getMessage()); - if (lib.startsWith("python3.7") && !foundPython) { + if (lib.startsWith("python3.8") && !foundPython) { throw new java.lang.RuntimeException("Could not load any libpythonXXX.so"); } else if (lib.startsWith("python")) { continue; diff --git a/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle b/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle index 63ba86258f..7b6ba8390b 100644 --- a/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle +++ b/pythonforandroid/bootstraps/common/build/templates/build.tmpl.gradle @@ -22,7 +22,11 @@ allprojects { } } +{% if is_library %} +apply plugin: 'com.android.library' +{% else %} apply plugin: 'com.android.application' +{% endif %} android { compileSdkVersion {{ android_api }} diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index 3d4428573a..40776893f9 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -117,7 +117,7 @@ class Context: recipe_build_order = None # Will hold the list of all built recipes - symlink_java_src = False # If True, will symlink instead of copying during build + symlink_bootstrap_files = False # If True, will symlink instead of copying during build java_build_tool = 'auto' @@ -481,9 +481,11 @@ def set_archs(self, arch_names): info('Will compile for the following archs: {}'.format( ', '.join([arch.arch for arch in self.archs]))) - def prepare_bootstrap(self, bs): - bs.ctx = self - self.bootstrap = bs + def prepare_bootstrap(self, bootstrap): + if not bootstrap: + raise TypeError("None is not allowed for bootstrap") + bootstrap.ctx = self + self.bootstrap = bootstrap self.bootstrap.prepare_build_dir() self.bootstrap_build_dir = self.bootstrap.build_dir diff --git a/setup.py b/setup.py index cb95b08ccc..173d58ee8c 100644 --- a/setup.py +++ b/setup.py @@ -100,6 +100,7 @@ def recursively_include(results, directory, patterns): ], 'distutils.commands': [ 'apk = pythonforandroid.bdistapk:BdistAPK', + 'aar = pythonforandroid.bdistapk:BdistAAR', ], }, classifiers = [ diff --git a/testapps/setup_testapp_python3_sqlite_openssl.py b/testapps/setup_testapp_python3_sqlite_openssl.py index 0f7485d132..0dfd375bba 100644 --- a/testapps/setup_testapp_python3_sqlite_openssl.py +++ b/testapps/setup_testapp_python3_sqlite_openssl.py @@ -5,6 +5,7 @@ options = {'apk': {'requirements': 'requests,peewee,sdl2,pyjnius,kivy,python3', 'android-api': 27, 'ndk-api': 21, + 'bootstrap': 'sdl2', 'dist-name': 'bdisttest_python3_sqlite_openssl_googlendk', 'ndk-version': '10.3.2', 'arch': 'armeabi-v7a', diff --git a/testapps/setup_vispy.py b/testapps/setup_vispy.py index 49ad47fda3..cbc909627b 100644 --- a/testapps/setup_vispy.py +++ b/testapps/setup_vispy.py @@ -7,6 +7,7 @@ 'blacklist-requirements': 'openssl,sqlite3', 'android-api': 27, 'ndk-api': 21, + 'bootstrap': 'empty', 'ndk-dir': '/home/asandy/android/android-ndk-r17c', 'dist-name': 'bdisttest', 'ndk-version': '10.3.2', diff --git a/tests/test_bootstrap.py b/tests/test_bootstrap.py index 3d3b13dde4..6ba39864c0 100644 --- a/tests/test_bootstrap.py +++ b/tests/test_bootstrap.py @@ -288,16 +288,10 @@ def test_bootstrap_prepare_build_dir( @mock.patch("pythonforandroid.bootstrap.os.unlink") @mock.patch("pythonforandroid.bootstrap.open", create=True) @mock.patch("pythonforandroid.util.chdir") - @mock.patch("pythonforandroid.bootstrap.sh.ln") @mock.patch("pythonforandroid.bootstrap.listdir") - @mock.patch("pythonforandroid.bootstrap.sh.mkdir") - @mock.patch("pythonforandroid.bootstrap.sh.rm") def test_bootstrap_prepare_build_dir_with_java_src( self, - mock_sh_rm, - mock_sh_mkdir, mock_listdir, - mock_sh_ln, mock_chdir, mock_open, mock_os_unlink, @@ -309,7 +303,7 @@ def test_bootstrap_prepare_build_dir_with_java_src( :meth:`~pythonforandroid.bootstrap.Bootstrap.prepare_build_dir`. In here we will simulate that we have `with_java_src` set to some value. """ - self.ctx.symlink_java_src = ["some_java_src"] + self.ctx.symlink_bootstrap_files = True mock_listdir.return_value = [ "jnius", "kivy", @@ -327,18 +321,7 @@ def test_bootstrap_prepare_build_dir_with_java_src( # make sure that the open command has been called only once mock_open.assert_called_with("project.properties", "w") - # check that the symlink was made 4 times and that - self.assertEqual( - len(mock_sh_ln.call_args_list), len(mock_listdir.return_value) - ) - for i, directory in enumerate(mock_listdir.return_value): - self.assertTrue( - mock_sh_ln.call_args_list[i][0][1].endswith(directory) - ) - # check that the other mocks we made are actually called - mock_sh_rm.assert_called() - mock_sh_mkdir.assert_called() mock_chdir.assert_called() mock_os_unlink.assert_called() mock_os_path_exists.assert_called() From 00719aea805616a956774825344a091989bde129 Mon Sep 17 00:00:00 2001 From: Prajjwal Nijhara Date: Fri, 17 Apr 2020 03:01:17 +0530 Subject: [PATCH 24/35] Fix some code quality and bug-risk issues --- .deepsource.toml | 12 ++++++++++++ MANIFEST.in | 1 + pythonforandroid/bootstrap.py | 6 +++--- pythonforandroid/build.py | 14 +++++++++----- pythonforandroid/recipes/matplotlib/__init__.py | 2 +- setup.py | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 0000000000..e30c701da6 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,12 @@ +version = 1 + +test_patterns = ["tests/**"] + +exclude_patterns = ["testapps/**"] + +[[analyzers]] +name = "python" +enabled = true + + [analyzers.meta] + runtime_version = "3.x.x" \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in index 4d6223ed3d..d428a87439 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1,6 @@ include LICENSE README.md +include *.toml recursive-include doc * prune doc/build diff --git a/pythonforandroid/bootstrap.py b/pythonforandroid/bootstrap.py index 75b82e555f..1a089ccd91 100755 --- a/pythonforandroid/bootstrap.py +++ b/pythonforandroid/bootstrap.py @@ -195,7 +195,7 @@ def get_usable_bootstraps_for_recipes(cls, recipes, ctx): # Check if the bootstap's dependencies have an internal conflict: for recipe in possible_dependencies: recipe = Recipe.get_recipe(recipe, ctx) - if any([conflict in recipes for conflict in recipe.conflicts]): + if any(conflict in recipes for conflict in recipe.conflicts): ok = False break # Check if bootstrap's dependencies conflict with chosen @@ -207,8 +207,8 @@ def get_usable_bootstraps_for_recipes(cls, recipes, ctx): conflicts = [] else: conflicts = recipe.conflicts - if any([conflict in possible_dependencies - for conflict in conflicts]): + if any(conflict in possible_dependencies + for conflict in conflicts): ok = False break if ok and bs not in acceptable_bootstraps: diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index 3d4428573a..feb9296c7c 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -267,7 +267,7 @@ def prepare_build_environment(self, d.endswith(('.bz2', '.gz'))] if possible_dirs: info('Found possible SDK dirs in buildozer dir: {}'.format( - ', '.join([d.split(os.sep)[-1] for d in possible_dirs]))) + ', '.join(d.split(os.sep)[-1] for d in possible_dirs))) info('Will attempt to use SDK at {}'.format(possible_dirs[0])) warning('This SDK lookup is intended for debug only, if you ' 'use python-for-android much you should probably ' @@ -328,7 +328,7 @@ def prepare_build_environment(self, '~', '.buildozer', 'android', 'platform', 'android-ndk-r*'))) if possible_dirs: info('Found possible NDK dirs in buildozer dir: {}'.format( - ', '.join([d.split(os.sep)[-1] for d in possible_dirs]))) + ', '.join(d.split(os.sep)[-1] for d in possible_dirs))) info('Will attempt to use NDK at {}'.format(possible_dirs[0])) warning('This NDK lookup is intended for debug only, if you ' 'use python-for-android much you should probably ' @@ -479,7 +479,7 @@ def set_archs(self, arch_names): if not self.archs: raise BuildInterruptingException('Asked to compile for no Archs, so failing.') info('Will compile for the following archs: {}'.format( - ', '.join([arch.arch for arch in self.archs]))) + ', '.join(arch.arch for arch in self.archs))) def prepare_bootstrap(self, bs): bs.ctx = self @@ -894,7 +894,9 @@ def biglink(ctx, arch): env=env) -def biglink_function(soname, objs_paths, extra_link_dirs=[], env=None): +def biglink_function(soname, objs_paths, extra_link_dirs=None, env=None): + if extra_link_dirs is None: + extra_link_dirs = [] print('objs_paths are', objs_paths) sofiles = [] @@ -941,7 +943,9 @@ def biglink_function(soname, objs_paths, extra_link_dirs=[], env=None): shprint(cc, '-shared', '-O3', '-o', soname, *unique_args, _env=env) -def copylibs_function(soname, objs_paths, extra_link_dirs=[], env=None): +def copylibs_function(soname, objs_paths, extra_link_dirs=None, env=None): + if extra_link_dirs is None: + extra_link_dirs = [] print('objs_paths are', objs_paths) re_needso = re.compile(r'^.*\(NEEDED\)\s+Shared library: \[lib(.*)\.so\]\s*$') diff --git a/pythonforandroid/recipes/matplotlib/__init__.py b/pythonforandroid/recipes/matplotlib/__init__.py index 277dada75f..b48a24c6de 100644 --- a/pythonforandroid/recipes/matplotlib/__init__.py +++ b/pythonforandroid/recipes/matplotlib/__init__.py @@ -85,7 +85,7 @@ def download_web_backend_dependencies(self, arch): jquery_sha = ( 'f8233674366ab36b2c34c577ec77a3d70cac75d2e387d8587f3836345c0f624d' ) - url = f'https://jqueryui.com/resources/download/jquery-ui-1.12.1.zip' + url = "https://jqueryui.com/resources/download/jquery-ui-1.12.1.zip" target_file = join(env['XDG_CACHE_HOME'], 'matplotlib', jquery_sha) info_notify(f'Will download into {env["XDG_CACHE_HOME"]}') diff --git a/setup.py b/setup.py index cb95b08ccc..853794ae51 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ def recursively_include(results, directory, patterns): for root, subfolders, files in walk(directory): for fn in files: - if not any([glob.fnmatch.fnmatch(fn, pattern) for pattern in patterns]): + if not any(glob.fnmatch.fnmatch(fn, pattern) for pattern in patterns): continue filename = join(root, fn) directory = 'pythonforandroid' From 265fe7f4aa767838a5fa4b4020a0935d23a3e230 Mon Sep 17 00:00:00 2001 From: yingshaoxo Date: Sun, 19 Apr 2020 02:54:14 +0800 Subject: [PATCH 25/35] Update bootstrap.py (#2137) * Update bootstrap.py Try to fix a bug that I meet during compiling. This is how I met this bug: ### Step 1 Follow this tutorial to build an apk, succeeded. ### Step 2 Run `p4a clean_dists`, then run the compile command again: ``` p4a apk --private . --package=xyz.yingshaoxo.kivydiary --name "KivyDiary" --version 0.2 --bootstrap=sdl2 --requirements=python3,kivy,jnius --blacklist-requirements=sqlite3,libffi,openssl --orientation=portrait --add-source . --presplash=./data/flash.png --icon=./data/icon.png --permission INTERNET --permission WRITE_EXTERNAL_STORAGE --debug ``` ### Step 3 This is the error I got: ``` [INFO]: *** PYTHON PACKAGE / PROJECT INSTALL STAGE *** [INFO]: No Python modules and no setup.py to process, skipping [INFO]: # Creating Android project (sdl2) [INFO]: Copying SDL2/gradle build for armeabi-v7a [DEBUG]: -> running rm -rf /home/user/.local/share/python-for-android/dists/unnamed_dist_1__armeabi-v7a [DEBUG]: -> running cp -r /home/user/.local/share/python-for-android/build/bootstrap_builds/sdl2 /home/user/.local/share/python-for-android/dists/unnamed_dist_1__armeabi-v7a [INFO]: -> directory context /home/user/.local/share/python-for-android/dists/unnamed_dist_1__armeabi-v7a [INFO]: <- directory context /home/user/host/app [INFO]: -> directory context /home/user/.local/share/python-for-android/dists/unnamed_dist_1__armeabi-v7a [INFO]: Copying Python distribution [INFO]: Copying libs [DEBUG]: -> running cp -a libs/armeabi-v7a [DEBUG]: /bin/cp: missing destination file operand after 'libs/armeabi-v7a' [DEBUG]: Try '/bin/cp --help' for more information. Exception in thread background thread for pid 19790: Traceback (most recent call last): File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner self.run() File "/usr/lib/python3.6/threading.py", line 864, in run self._target(*self._args, **self._kwargs) File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 1540, in wrap fn(*args, **kwargs) File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 2459, in background_thread handle_exit_code(exit_code) File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 2157, in fn return self.command.handle_command_exit_code(exit_code) File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 815, in handle_command_exit_code raise exc sh.ErrorReturnCode_1: RAN: /bin/cp -a libs/armeabi-v7a STDOUT: /bin/cp: missing destination file operand after 'libs/armeabi-v7a' Try '/bin/cp --help' for more information. STDERR: Traceback (most recent call last): File "/home/user/app/venv/bin/p4a", line 11, in load_entry_point('python-for-android', 'console_scripts', 'p4a')() File "/home/user/app/pythonforandroid/entrypoints.py", line 18, in main ToolchainCL() File "/home/user/app/pythonforandroid/toolchain.py", line 680, in __init__ getattr(self, args.subparser_name.replace('-', '_'))(args) File "/home/user/app/pythonforandroid/toolchain.py", line 154, in wrapper_func build_dist_from_args(ctx, dist, args) File "/home/user/app/pythonforandroid/toolchain.py", line 216, in build_dist_from_args ctx.bootstrap.run_distribute() File "/home/user/app/pythonforandroid/bootstraps/sdl2/__init__.py", line 38, in run_distribute self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) File "/home/user/app/pythonforandroid/bootstrap.py", line 298, in distribute_libs shprint(sh.cp, '-a', *libs, tgt_dir) File "/home/user/app/pythonforandroid/logger.py", line 167, in shprint for line in output: File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 863, in next self.wait() File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 792, in wait self.handle_command_exit_code(exit_code) File "/home/user/app/venv/lib/python3.6/site-packages/sh.py", line 815, in handle_command_exit_code raise exc sh.ErrorReturnCode_1: RAN: /bin/cp -a libs/armeabi-v7a STDOUT: /bin/cp: missing destination file operand after 'libs/armeabi-v7a' Try '/bin/cp --help' for more information. STDERR: ``` ____ But when I modified the `bootstrip.py` as I did in this pull request. Everything works again. --- pythonforandroid/bootstrap.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pythonforandroid/bootstrap.py b/pythonforandroid/bootstrap.py index 811d42d4ff..97c62e01a9 100755 --- a/pythonforandroid/bootstrap.py +++ b/pythonforandroid/bootstrap.py @@ -304,7 +304,8 @@ def distribute_libs(self, arch, src_dirs, wildcard='*', dest_dir="libs"): ensure_dir(tgt_dir) for src_dir in src_dirs: libs = glob.glob(join(src_dir, wildcard)) - shprint(sh.cp, '-a', *libs, tgt_dir) + if libs: + shprint(sh.cp, '-a', *libs, tgt_dir) def distribute_javaclasses(self, javaclass_dir, dest_dir="src"): '''Copy existing javaclasses from build dir to current dist dir.''' From b5dfdafb0953764a884384870eb0d41cad7ed561 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 18 Apr 2020 21:06:44 +0200 Subject: [PATCH 26/35] Simplifies Dockerfile and fix GitHub runner space Simplifies the Dockerfile as Python 2 was dropped. Renames to default "Dockerfile" so it's picked up by docker hub automatically. This is a follow-up for: #2105 Adds the GitHub action build badge. Free up space before building the APKs to avoid the GitHub Action runner being full. The error was: ``` mkdir -p /home/user/.android/android-ndk-r19b \ && unzip -q android-ndk-r19b-linux-x86_64.zip -d /home/user/.android \ && ln -sfn /home/user/.android/android-ndk-r19b /home/user/.android/android-ndk \ && rm -f android-ndk-r19b-linux-x86_64.zip Error processing tar file(exit status 1): write /home/user/.android/android-ndk-r19b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/lib/bfd-plugins/LLVMgold.so: no space left on device Makefile:61: recipe for target 'docker/build' failed make: *** [docker/build] Error 1 ```` https://github.com/kivy/python-for-android/actions/runs/81658805 The "Free disk space" step could clear about ~10G and helped making the build pass. See output logs for details. --- .github/workflows/push.yml | 18 ++++++++++++++++++ Dockerfile.py3 => Dockerfile | 8 +------- Makefile | 2 +- README.md | 1 + 4 files changed, 21 insertions(+), 8 deletions(-) rename Dockerfile.py3 => Dockerfile (93%) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1333844c0c..4d576edb8a 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -52,6 +52,15 @@ jobs: steps: - name: Checkout python-for-android uses: actions/checkout@v2 + # helps with GitHub runner getting out of space + - name: Free disk space + run: | + df -h + sudo swapoff -a + sudo rm -f /swapfile + sudo apt -y clean + docker rmi $(docker image ls -aq) + df -h - name: Pull docker image run: | make docker/pull @@ -75,6 +84,15 @@ jobs: uses: actions/checkout@v2 with: ref: 'develop' + # helps with GitHub runner getting out of space + - name: Free disk space + run: | + df -h + sudo swapoff -a + sudo rm -f /swapfile + sudo apt -y clean + docker rmi $(docker image ls -aq) + df -h - name: Pull docker image run: | make docker/pull diff --git a/Dockerfile.py3 b/Dockerfile similarity index 93% rename from Dockerfile.py3 rename to Dockerfile index 9183c8feaf..a466c3ef7b 100644 --- a/Dockerfile.py3 +++ b/Dockerfile @@ -3,7 +3,7 @@ # - python-for-android dependencies # # Build with: -# docker build --tag=p4a --file Dockerfile.py3 . +# docker build --tag=p4a --file Dockerfile . # # Run with: # docker run -it --rm p4a /bin/sh -c '. venv/bin/activate && p4a apk --help' @@ -71,8 +71,6 @@ RUN dpkg --add-architecture i386 \ openjdk-8-jdk \ patch \ pkg-config \ - python \ - python-pip \ python3 \ python3-dev \ python3-pip \ @@ -95,10 +93,6 @@ RUN useradd --create-home --shell /bin/bash ${USER} RUN usermod -append --groups sudo ${USER} RUN echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers -# install cython for python 2 (for python 3 it's inside the venv) -RUN pip2 install --upgrade Cython==0.28.6 \ - && rm -rf ~/.cache/ - WORKDIR ${WORK_DIR} RUN mkdir ${ANDROID_HOME} && chown --recursive ${USER} ${HOME_DIR} ${ANDROID_HOME} USER ${USER} diff --git a/Makefile b/Makefile index 4b5b1f4414..3858e537ae 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,7 @@ docker/pull: docker pull $(DOCKER_IMAGE):latest || true docker/build: - docker build --cache-from=$(DOCKER_IMAGE) --tag=$(DOCKER_IMAGE) --file=Dockerfile.py3 . + docker build --cache-from=$(DOCKER_IMAGE) --tag=$(DOCKER_IMAGE) . docker/push: docker push $(DOCKER_IMAGE) diff --git a/README.md b/README.md index c3d421873e..ac8a889fe5 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ python-for-android ================== [![Build Status](https://travis-ci.org/kivy/python-for-android.svg?branch=develop)](https://travis-ci.org/kivy/python-for-android) +[![Unit tests & build apps](https://github.com/kivy/python-for-android/workflows/Unit%20tests%20&%20build%20apps/badge.svg?branch=develop)](https://github.com/kivy/python-for-android/actions?query=workflow%3A%22Unit+tests+%26+build+apps%22) [![Coverage Status](https://coveralls.io/repos/github/kivy/python-for-android/badge.svg?branch=develop&kill_cache=1)](https://coveralls.io/github/kivy/python-for-android?branch=develop) [![Backers on Open Collective](https://opencollective.com/kivy/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/kivy/sponsors/badge.svg)](#sponsors) From 5d329bf49ae37c988dd4caa5f1192cd7cf6146e9 Mon Sep 17 00:00:00 2001 From: yingshaoxo Date: Sun, 19 Apr 2020 22:36:20 +0800 Subject: [PATCH 27/35] Update AndroidManifest.tmpl.xml to support HTTP https://stackoverflow.com/questions/52707918/webview-showing-err-cleartext-not-permitted-although-site-is-https https://www.google.com/search?q=net%3A%3AERR_CLEARTEXT_NOT_PERMITTED&oq=net%3A%3AERR_CLEARTEXT_NOT_PERMITTED&aqs=chrome..69i57j69i58.788j0j7&sourceid=chrome-mobile&ie=UTF-8 **This is a key update for webview, without it, webview can't work for android 8 and beyond.** --- .../webview/build/templates/AndroidManifest.tmpl.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml b/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml index d71985c66e..8b6b4ca923 100644 --- a/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml +++ b/pythonforandroid/bootstraps/webview/build/templates/AndroidManifest.tmpl.xml @@ -49,7 +49,9 @@ android:icon="@drawable/icon" android:allowBackup="true" android:theme="{{args.android_apptheme}}{% if not args.window %}.Fullscreen{% endif %}" - android:hardwareAccelerated="true" > + android:hardwareAccelerated="true" + android:usesCleartextTraffic="true" + > {% for l in args.android_used_libs %} {% endfor %} From af8e1b740aa4488ffe8c86aecee55b440a6223df Mon Sep 17 00:00:00 2001 From: pavelsof Date: Mon, 20 Apr 2020 23:08:00 +0200 Subject: [PATCH 28/35] Better recipe for Twisted: removed the unit tests. --- pythonforandroid/recipes/twisted/__init__.py | 13 +++++++++++-- .../recipes/twisted/remove_tests.patch | 16 ++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 pythonforandroid/recipes/twisted/remove_tests.patch diff --git a/pythonforandroid/recipes/twisted/__init__.py b/pythonforandroid/recipes/twisted/__init__.py index 02d532a07c..7264aad23c 100644 --- a/pythonforandroid/recipes/twisted/__init__.py +++ b/pythonforandroid/recipes/twisted/__init__.py @@ -1,3 +1,6 @@ +import os +import shutil + from pythonforandroid.recipe import CythonRecipe @@ -6,7 +9,7 @@ class TwistedRecipe(CythonRecipe): url = 'https://github.com/twisted/twisted/archive/twisted-{version}.tar.gz' depends = ['setuptools', 'zope_interface', 'incremental', 'constantly'] - patches = ['incremental.patch'] + patches = ['incremental.patch', 'remove_tests.patch'] call_hostpython_via_targetpython = False install_in_hostpython = False @@ -14,7 +17,13 @@ class TwistedRecipe(CythonRecipe): def prebuild_arch(self, arch): super().prebuild_arch(arch) # TODO Need to whitelist tty.pyo and termios.so here - print('Should remove twisted tests etc. here, but skipping for now') + + # remove the unit test dirs + source_dir = os.path.join(self.get_build_dir(arch.arch), 'src/twisted') + for item in os.walk(source_dir): + if os.path.basename(item[0]) == 'test': + full_path = os.path.join(source_dir, item[0]) + shutil.rmtree(full_path, ignore_errors=True) def get_recipe_env(self, arch): env = super().get_recipe_env(arch) diff --git a/pythonforandroid/recipes/twisted/remove_tests.patch b/pythonforandroid/recipes/twisted/remove_tests.patch new file mode 100644 index 0000000000..492062b984 --- /dev/null +++ b/pythonforandroid/recipes/twisted/remove_tests.patch @@ -0,0 +1,16 @@ +diff --git a/src/twisted/python/_setup.py b/src/twisted/python/_setup.py +index 32cb096c7..a607fef07 100644 +--- a/src/twisted/python/_setup.py ++++ b/src/twisted/python/_setup.py +@@ -160,11 +160,6 @@ class ConditionalExtension(Extension, object): + + # The C extensions used for Twisted. + _EXTENSIONS = [ +- ConditionalExtension( +- "twisted.test.raiser", +- sources=["src/twisted/test/raiser.c"], +- condition=lambda _: _isCPython), +- + ConditionalExtension( + "twisted.internet.iocpreactor.iocpsupport", + sources=[ From 83f35ab6d83bff2015bf5eb9bc5b33f0f2816c2b Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Sat, 25 Apr 2020 19:31:10 +0200 Subject: [PATCH 29/35] Update setup.py: add classifiers & python_requires (#2151) * :pushpin: Update classifiers & add python_requires * :ok_hand: Allow Python version > 3 --- setup.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup.py b/setup.py index 19a77bb756..2d8f5e9fa0 100644 --- a/setup.py +++ b/setup.py @@ -88,6 +88,7 @@ def recursively_include(results, directory, patterns): description='Android APK packager for Python scripts and apps', long_description=long_description, long_description_content_type='text/markdown', + python_requires=">=3.6.0", author='The Kivy team', author_email='kivy-dev@googlegroups.com', url='https://github.com/kivy/python-for-android', @@ -114,6 +115,9 @@ def recursively_include(results, directory, patterns): 'Operating System :: Android', 'Programming Language :: C', 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Topic :: Software Development', 'Topic :: Utilities', ], From 253dc2876835213dbde1b88a6905f20e1c35fbd0 Mon Sep 17 00:00:00 2001 From: Kevin Ollivier Date: Fri, 17 Apr 2020 08:01:52 -0700 Subject: [PATCH 30/35] When bootstraps were unified, sources moved from src to src/main/java for webview and service boostraps, so copy other sources there as well. --- pythonforandroid/bootstraps/service_only/__init__.py | 3 ++- pythonforandroid/bootstraps/webview/__init__.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pythonforandroid/bootstraps/service_only/__init__.py b/pythonforandroid/bootstraps/service_only/__init__.py index 373dabc38f..f2630bdccc 100644 --- a/pythonforandroid/bootstraps/service_only/__init__.py +++ b/pythonforandroid/bootstraps/service_only/__init__.py @@ -34,7 +34,8 @@ def run_distribute(self): self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) self.distribute_aars(arch) - self.distribute_javaclasses(self.ctx.javaclass_dir) + self.distribute_javaclasses(self.ctx.javaclass_dir, + dest_dir=join("src", "main", "java")) python_bundle_dir = join('_python_bundle', '_python_bundle') ensure_dir(python_bundle_dir) diff --git a/pythonforandroid/bootstraps/webview/__init__.py b/pythonforandroid/bootstraps/webview/__init__.py index 2c4ccadb05..5a7964e3f3 100644 --- a/pythonforandroid/bootstraps/webview/__init__.py +++ b/pythonforandroid/bootstraps/webview/__init__.py @@ -31,7 +31,8 @@ def run_distribute(self): self.distribute_libs(arch, [self.ctx.get_libs_dir(arch.arch)]) self.distribute_aars(arch) - self.distribute_javaclasses(self.ctx.javaclass_dir) + self.distribute_javaclasses(self.ctx.javaclass_dir, + dest_dir=join("src", "main", "java")) python_bundle_dir = join('_python_bundle', '_python_bundle') ensure_dir(python_bundle_dir) From 678117965f53b0fdbbd83d72964403ca4cae672b Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Sun, 26 Apr 2020 01:26:57 +0200 Subject: [PATCH 31/35] Use python3's venv instead of virtualenv (#2152) * :alien: Migrate to `toml` and apply `isort` to `pythonpackage.py` Because `pytoml` is deprecated See also: https://pypi.org/project/pytoml/ * :bug: Avoid copying `.tox` folder when extracting metadata from package Because when running local tests for `test_pythonpackages` and we have some virtual envs created with tox the function also copies the hidden tox folder causing error on our tests * :fire: Use python3's venv instead of `virtualenv` * :green_heart: Add new dependency to docker `libssl-dev` So this way we will get hostpython's _ssl module build, and we will be able to use hostpython's pip without security errors. * :pencil: Update outdated inline comment * :apple: Don't run p4a inside virtualenv/venv because it seems that hostpython's build scripts gets confused on about locating the `pyconfig.h` file **Note:** This only happens to macOS platform --- .travis.yml | 6 ++--- Dockerfile | 2 +- Makefile | 10 +++++++- pythonforandroid/build.py | 22 ++++------------ pythonforandroid/pythonpackage.py | 24 ++++++++---------- pythonforandroid/util.py | 12 --------- setup.py | 4 +-- tests/test_pythonpackage_basic.py | 42 +++---------------------------- tests/test_util.py | 40 ----------------------------- tox.ini | 1 - 10 files changed, 34 insertions(+), 129 deletions(-) diff --git a/.travis.yml b/.travis.yml index 27680224fc..04e49e59c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,9 +23,7 @@ jobs: # See also: https://github.com/travis-ci/travis-ci/issues/8589 - type -t deactivate && deactivate || true - export PATH=/opt/python/3.7/bin:$PATH - # Install tox & virtualenv - # Note: venv/virtualenv are both used by tests/test_pythonpackage.py - - pip3.7 install -U virtualenv + # Install tox - pip3.7 install tox>=2.0 # Install coveralls & dependencies # Note: pyOpenSSL needed to send the coveralls reports @@ -54,7 +52,7 @@ jobs: # installs java 1.8, android's SDK/NDK and p4a - make -f ci/makefiles/osx.mk - export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home - script: make testapps/armeabi-v7a PYTHON_WITH_VERSION=python3 + script: make testapps-no-venv/armeabi-v7a - <<: *testapps name: Rebuild updated recipes script: travis_wait 30 make docker/run/make/rebuild_updated_recipes diff --git a/Dockerfile b/Dockerfile index a466c3ef7b..07377e4248 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,6 +66,7 @@ RUN dpkg --add-architecture i386 \ libncurses5:i386 \ libpangox-1.0-0:i386 \ libpangoxft-1.0-0:i386 \ + libssl-dev \ libstdc++6:i386 \ libtool \ openjdk-8-jdk \ @@ -77,7 +78,6 @@ RUN dpkg --add-architecture i386 \ python3-venv \ sudo \ unzip \ - virtualenv \ wget \ zip \ zlib1g-dev \ diff --git a/Makefile b/Makefile index 3858e537ae..ef0c503eb9 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ ANDROID_NDK_HOME ?= $(HOME)/.android/android-ndk all: virtualenv $(VIRTUAL_ENV): - virtualenv --python=$(PYTHON_WITH_VERSION) $(VIRTUAL_ENV) + python3 -m venv $(VIRTUAL_ENV) $(PIP) install Cython==0.28.6 $(PIP) install -e . @@ -47,6 +47,14 @@ testapps/%: virtualenv python setup.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ --arch=$($@_APP_ARCH) +testapps-no-venv/%: + pip3 install Cython==0.28.6 + pip3 install -e . + $(eval $@_APP_ARCH := $(shell basename $*)) + cd testapps/on_device_unit_tests/ && \ + python3 setup.py apk --sdk-dir $(ANDROID_SDK_HOME) --ndk-dir $(ANDROID_NDK_HOME) \ + --arch=$($@_APP_ARCH) + clean: find . -type d -name "__pycache__" -exec rm -r {} + find . -type d -name "*.egg-info" -exec rm -r {} + diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index e6b3f4ca44..d12181b698 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -13,8 +13,8 @@ import subprocess from pythonforandroid.util import ( - current_directory, ensure_dir, get_virtualenv_executable, - BuildInterruptingException + current_directory, ensure_dir, + BuildInterruptingException, ) from pythonforandroid.logger import (info, warning, info_notify, info_main, shprint) from pythonforandroid.archs import ArchARM, ArchARMv7_a, ArchAarch_64, Archx86, Archx86_64 @@ -357,13 +357,6 @@ def prepare_build_environment(self, check_ndk_api(ndk_api, self.android_api) - virtualenv = get_virtualenv_executable() - if virtualenv is None: - raise IOError('Couldn\'t find a virtualenv executable, ' - 'you must install this to use p4a.') - self.virtualenv = virtualenv - info('Found virtualenv at {}'.format(virtualenv)) - # path to some tools self.ccache = sh.which("ccache") if not self.ccache: @@ -765,15 +758,10 @@ def run_pymodules_install(ctx, modules, project_dir=None, info('Will process project install, if it fails then the ' 'project may not be compatible for Android install.') - venv = sh.Command(ctx.virtualenv) + # Use our hostpython to create the virtualenv + host_python = sh.Command(ctx.hostpython) with current_directory(join(ctx.build_dir)): - shprint(venv, - '--python=python{}'.format( - ctx.python_recipe.major_minor_version_string. - partition(".")[0] - ), - 'venv' - ) + shprint(host_python, '-m', 'venv', 'venv') # Prepare base environment and upgrade pip: base_env = copy.copy(os.environ) diff --git a/pythonforandroid/pythonpackage.py b/pythonforandroid/pythonpackage.py index f96042d982..66dec4fc31 100644 --- a/pythonforandroid/pythonpackage.py +++ b/pythonforandroid/pythonpackage.py @@ -33,12 +33,8 @@ """ -from io import open # needed for python 2 import functools import os -from pep517.envbuild import BuildEnvironment -from pep517.wrappers import Pep517HookCaller -import pytoml import shutil import subprocess import sys @@ -46,13 +42,14 @@ import tempfile import textwrap import time -try: - from urllib.parse import urlparse - from urllib.parse import unquote as urlunquote -except ImportError: # Python 2... - from urlparse import urlparse - from urlparse import unquote as urlunquote import zipfile +from io import open # needed for python 2 +from urllib.parse import unquote as urlunquote +from urllib.parse import urlparse + +import toml +from pep517.envbuild import BuildEnvironment +from pep517.wrappers import Pep517HookCaller def transform_dep_for_pip(dependency): @@ -111,7 +108,8 @@ def extract_metainfo_files_from_package( if is_filesystem_path(package): shutil.copytree( parse_as_folder_reference(package), - os.path.join(temp_folder, "package") + os.path.join(temp_folder, "package"), + ignore=shutil.ignore_patterns(".tox") ) package = os.path.join(temp_folder, "package") @@ -486,7 +484,7 @@ def _extract_metainfo_files_from_package_unsafe( # Get build backend and requirements from pyproject.toml: with open(os.path.join(path, 'pyproject.toml')) as f: - build_sys = pytoml.load(f)['build-system'] + build_sys = toml.load(f)['build-system'] backend = build_sys["build-backend"] build_requires.extend(build_sys["requires"]) @@ -630,7 +628,7 @@ def _extract_info_from_package(dependency, ) and include_build_requirements: # Read build system from pyproject.toml file: (PEP518) with open(os.path.join(output_folder, 'pyproject.toml')) as f: - build_sys = pytoml.load(f)['build-system'] + build_sys = toml.load(f)['build-system'] if "requires" in build_sys: requirements += build_sys["requires"] elif include_build_requirements: diff --git a/pythonforandroid/util.py b/pythonforandroid/util.py index 80a607f5fe..c9b779829a 100644 --- a/pythonforandroid/util.py +++ b/pythonforandroid/util.py @@ -1,7 +1,6 @@ import contextlib from os.path import exists, join from os import getcwd, chdir, makedirs, walk, uname -import sh import shutil from fnmatch import fnmatch from tempfile import mkdtemp @@ -55,17 +54,6 @@ def ensure_dir(filename): makedirs(filename) -def get_virtualenv_executable(): - virtualenv = None - if virtualenv is None: - virtualenv = sh.which('virtualenv2') - if virtualenv is None: - virtualenv = sh.which('virtualenv-2.7') - if virtualenv is None: - virtualenv = sh.which('virtualenv') - return virtualenv - - def walk_valid_filens(base_dir, invalid_dir_names, invalid_file_patterns): """Recursively walks all the files and directories in ``dirn``, ignoring directories that match any pattern in ``invalid_dirns`` diff --git a/setup.py b/setup.py index 2d8f5e9fa0..f22aeec80c 100644 --- a/setup.py +++ b/setup.py @@ -23,9 +23,9 @@ install_reqs = [ 'appdirs', 'colorama>=0.3.3', 'jinja2', 'six', 'enum34; python_version<"3.4"', 'sh>=1.10; sys_platform!="nt"', - 'pep517<0.7.0"', 'pytoml', 'virtualenv<20' + 'pep517<0.7.0"', 'toml', ] -# (pep517, pytoml and virtualenv are used by pythonpackage.py) +# (pep517 and toml are used by pythonpackage.py) # By specifying every file manually, package_data will be able to # include them in binary distributions. Note that we have to add diff --git a/tests/test_pythonpackage_basic.py b/tests/test_pythonpackage_basic.py index a39d8a44e3..9e6596d69e 100644 --- a/tests/test_pythonpackage_basic.py +++ b/tests/test_pythonpackage_basic.py @@ -6,7 +6,6 @@ """ import os -import pytest import shutil import sys import subprocess @@ -279,43 +278,6 @@ def test_systemwide_python(self): else: raise - def test_virtualenv(self): - """ Verifies that _get_system_python_executable() works correctly - if called with a python binary as found inside a virtualenv. - """ - - # Get system-wide python bin seen from here first: - pybin = _get_system_python_executable() - # (this call was not a test, we really just need the path here) - - test_dir = tempfile.mkdtemp() - try: - # Check that in a virtualenv, the system-wide python is returned: - subprocess.check_output([ - pybin, "-m", "virtualenv", - "--python=" + str(sys.executable), - "--", - os.path.join(test_dir, "virtualenv") - ]) - subprocess.check_output([ - os.path.join(test_dir, "virtualenv", "bin", "pip"), - "install", "-U", "pip" - ]) - subprocess.check_output([ - os.path.join(test_dir, "virtualenv", "bin", "pip"), - "install", "-U", "pep517<0.7.0" - ]) - sys_python_path = self.run__get_system_python_executable( - os.path.join(test_dir, "virtualenv", "bin", "python") - ) - assert os.path.normpath(sys_python_path).startswith( - os.path.normpath(pybin) - ) - finally: - shutil.rmtree(test_dir) - - @pytest.mark.skipif(int(sys.version.partition(".")[0]) < 3, - reason="venv is python 3 only") def test_venv(self): """ Verifies that _get_system_python_executable() works correctly in a 'venv' (Python 3 only feature). @@ -340,6 +302,10 @@ def test_venv(self): os.path.join(test_dir, "venv", "bin", "pip"), "install", "-U", "pep517<0.7.0" ]) + subprocess.check_output([ + os.path.join(test_dir, "venv", "bin", "pip"), + "install", "-U", "toml" + ]) sys_python_path = self.run__get_system_python_executable( os.path.join(test_dir, "venv", "bin", "python") ) diff --git a/tests/test_util.py b/tests/test_util.py index 0653991639..ff57dc7a47 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -70,46 +70,6 @@ def test_current_directory_exception(self): ): pass - @mock.patch("pythonforandroid.util.sh.which") - def test_get_virtualenv_executable(self, mock_sh_which): - """ - Test method :meth:`~pythonforandroid.util.get_virtualenv_executable`. - In here we test: - - - that all calls to `sh.which` are performed, so we expect the - first two `sh.which` calls should be None and the last one should - return the expected virtualenv (the python3 one) - - that we don't have virtualenv installed, so all calls to - `sh.which` should return None - """ - expected_venv = os.path.join( - os.path.expanduser("~"), ".local/bin/virtualenv" - ) - mock_sh_which.side_effect = [None, None, expected_venv] - self.assertEqual(util.get_virtualenv_executable(), expected_venv) - mock_sh_which.assert_has_calls( - [ - mock.call("virtualenv2"), - mock.call("virtualenv-2.7"), - mock.call("virtualenv"), - ] - ) - self.assertEqual(mock_sh_which.call_count, 3) - mock_sh_which.reset_mock() - - # Now test that we don't have virtualenv installed, so all calls to - # `sh.which` should return None - mock_sh_which.side_effect = [None, None, None] - self.assertIsNone(util.get_virtualenv_executable()) - self.assertEqual(mock_sh_which.call_count, 3) - mock_sh_which.assert_has_calls( - [ - mock.call("virtualenv2"), - mock.call("virtualenv-2.7"), - mock.call("virtualenv"), - ] - ) - @mock.patch("pythonforandroid.util.walk") def test_walk_valid_filens(self, mock_walk): """ diff --git a/tox.ini b/tox.ini index 9ded48b328..4e69dd89b6 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,6 @@ basepython = python3 [testenv] deps = pytest - virtualenv py3: coveralls backports.tempfile # posargs will be replaced by the tox args, so you can override pytest From 41b363cf17ddaa59bc6eed3ec1881bbcdeefb20a Mon Sep 17 00:00:00 2001 From: Kevin Ollivier Date: Sat, 25 Apr 2020 16:43:38 -0700 Subject: [PATCH 32/35] Show loading screen while unpacking for webview bootstrap (#2153) * Port unpack task to webview to properly show loading screen. * Remove customization for our own implementation. --- .../java/org/kivy/android/PythonActivity.java | 253 +++++++++++------- 1 file changed, 162 insertions(+), 91 deletions(-) diff --git a/pythonforandroid/bootstraps/webview/build/src/main/java/org/kivy/android/PythonActivity.java b/pythonforandroid/bootstraps/webview/build/src/main/java/org/kivy/android/PythonActivity.java index 2bd908ce92..2ac2608082 100644 --- a/pythonforandroid/bootstraps/webview/build/src/main/java/org/kivy/android/PythonActivity.java +++ b/pythonforandroid/bootstraps/webview/build/src/main/java/org/kivy/android/PythonActivity.java @@ -109,115 +109,119 @@ public static void initialize() { protected void onCreate(Bundle savedInstanceState) { Log.v(TAG, "My oncreate running"); resourceManager = new ResourceManager(this); - - Log.v(TAG, "Ready to unpack"); - File app_root_file = new File(getAppRoot()); - unpackData("private", app_root_file); - - Log.v(TAG, "About to do super onCreate"); super.onCreate(savedInstanceState); - Log.v(TAG, "Did super onCreate"); this.mActivity = this; - //this.showLoadingScreen(); - Log.v("Python", "Device: " + android.os.Build.DEVICE); - Log.v("Python", "Model: " + android.os.Build.MODEL); + this.showLoadingScreen(); + new UnpackFilesTask().execute(getAppRoot()); + } - //Log.v(TAG, "Ready to unpack"); - //new UnpackFilesTask().execute(getAppRoot()); + private class UnpackFilesTask extends AsyncTask { + @Override + protected String doInBackground(String... params) { + File app_root_file = new File(params[0]); + Log.v(TAG, "Ready to unpack"); + unpackData("private", app_root_file); + return null; + } - PythonActivity.initialize(); + @Override + protected void onPostExecute(String result) { + Log.v("Python", "Device: " + android.os.Build.DEVICE); + Log.v("Python", "Model: " + android.os.Build.MODEL); - // Load shared libraries - String errorMsgBrokenLib = ""; - try { - loadLibraries(); - } catch(UnsatisfiedLinkError e) { - System.err.println(e.getMessage()); - mBrokenLibraries = true; - errorMsgBrokenLib = e.getMessage(); - } catch(Exception e) { - System.err.println(e.getMessage()); - mBrokenLibraries = true; - errorMsgBrokenLib = e.getMessage(); - } + PythonActivity.initialize(); - if (mBrokenLibraries) - { - AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this); - dlgAlert.setMessage("An error occurred while trying to load the application libraries. Please try again and/or reinstall." - + System.getProperty("line.separator") - + System.getProperty("line.separator") - + "Error: " + errorMsgBrokenLib); - dlgAlert.setTitle("Python Error"); - dlgAlert.setPositiveButton("Exit", - new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog,int id) { - // if this button is clicked, close current activity - PythonActivity.mActivity.finish(); - } - }); - dlgAlert.setCancelable(false); - dlgAlert.create().show(); + // Load shared libraries + String errorMsgBrokenLib = ""; + try { + loadLibraries(); + } catch(UnsatisfiedLinkError e) { + System.err.println(e.getMessage()); + mBrokenLibraries = true; + errorMsgBrokenLib = e.getMessage(); + } catch(Exception e) { + System.err.println(e.getMessage()); + mBrokenLibraries = true; + errorMsgBrokenLib = e.getMessage(); + } - return; - } + if (mBrokenLibraries) + { + AlertDialog.Builder dlgAlert = new AlertDialog.Builder(PythonActivity.mActivity); + dlgAlert.setMessage("An error occurred while trying to load the application libraries. Please try again and/or reinstall." + + System.getProperty("line.separator") + + System.getProperty("line.separator") + + "Error: " + errorMsgBrokenLib); + dlgAlert.setTitle("Python Error"); + dlgAlert.setPositiveButton("Exit", + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog,int id) { + // if this button is clicked, close current activity + PythonActivity.mActivity.finish(); + } + }); + dlgAlert.setCancelable(false); + dlgAlert.create().show(); + + return; + } - // Set up the webview - String app_root_dir = getAppRoot(); + // Set up the webview + String app_root_dir = getAppRoot(); - mWebView = new WebView(this); - mWebView.getSettings().setJavaScriptEnabled(true); - mWebView.getSettings().setDomStorageEnabled(true); - mWebView.loadUrl("file:///" + app_root_dir + "/_load.html"); + mWebView = new WebView(PythonActivity.mActivity); + mWebView.getSettings().setJavaScriptEnabled(true); + mWebView.getSettings().setDomStorageEnabled(true); + mWebView.loadUrl("file:///" + app_root_dir + "/_load.html"); - mWebView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); - mWebView.setWebViewClient(new WebViewClient() { - @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - view.loadUrl(url); - return false; - } - }); - mLayout = new AbsoluteLayout(this); - mLayout.addView(mWebView); + mWebView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); + mWebView.setWebViewClient(new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.loadUrl(url); + return false; + } + }); + mLayout = new AbsoluteLayout(PythonActivity.mActivity); + mLayout.addView(mWebView); - setContentView(mLayout); + setContentView(mLayout); - String mFilesDirectory = mActivity.getFilesDir().getAbsolutePath(); - String entry_point = getEntryPoint(app_root_dir); + String mFilesDirectory = mActivity.getFilesDir().getAbsolutePath(); + String entry_point = getEntryPoint(app_root_dir); - Log.v(TAG, "Setting env vars for start.c and Python to use"); - PythonActivity.nativeSetenv("ANDROID_ENTRYPOINT", entry_point); - PythonActivity.nativeSetenv("ANDROID_ARGUMENT", app_root_dir); - PythonActivity.nativeSetenv("ANDROID_APP_PATH", app_root_dir); - PythonActivity.nativeSetenv("ANDROID_PRIVATE", mFilesDirectory); - PythonActivity.nativeSetenv("ANDROID_UNPACK", app_root_dir); - PythonActivity.nativeSetenv("PYTHONHOME", app_root_dir); - PythonActivity.nativeSetenv("PYTHONPATH", app_root_dir + ":" + app_root_dir + "/lib"); - PythonActivity.nativeSetenv("PYTHONOPTIMIZE", "2"); + Log.v(TAG, "Setting env vars for start.c and Python to use"); + PythonActivity.nativeSetenv("ANDROID_ENTRYPOINT", entry_point); + PythonActivity.nativeSetenv("ANDROID_ARGUMENT", app_root_dir); + PythonActivity.nativeSetenv("ANDROID_APP_PATH", app_root_dir); + PythonActivity.nativeSetenv("ANDROID_PRIVATE", mFilesDirectory); + PythonActivity.nativeSetenv("ANDROID_UNPACK", app_root_dir); + PythonActivity.nativeSetenv("PYTHONHOME", app_root_dir); + PythonActivity.nativeSetenv("PYTHONPATH", app_root_dir + ":" + app_root_dir + "/lib"); + PythonActivity.nativeSetenv("PYTHONOPTIMIZE", "2"); - try { - Log.v(TAG, "Access to our meta-data..."); - mActivity.mMetaData = mActivity.getPackageManager().getApplicationInfo( - mActivity.getPackageName(), PackageManager.GET_META_DATA).metaData; - - PowerManager pm = (PowerManager) mActivity.getSystemService(Context.POWER_SERVICE); - if ( mActivity.mMetaData.getInt("wakelock") == 1 ) { - mActivity.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "Screen On"); - mActivity.mWakeLock.acquire(); + try { + Log.v(TAG, "Access to our meta-data..."); + mActivity.mMetaData = mActivity.getPackageManager().getApplicationInfo( + mActivity.getPackageName(), PackageManager.GET_META_DATA).metaData; + + PowerManager pm = (PowerManager) mActivity.getSystemService(Context.POWER_SERVICE); + if ( mActivity.mMetaData.getInt("wakelock") == 1 ) { + mActivity.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "Screen On"); + mActivity.mWakeLock.acquire(); + } + } catch (PackageManager.NameNotFoundException e) { } - } catch (PackageManager.NameNotFoundException e) { - } - - final Thread pythonThread = new Thread(new PythonMain(), "PythonThread"); - PythonActivity.mPythonThread = pythonThread; - pythonThread.start(); - final Thread wvThread = new Thread(new WebViewLoaderMain(), "WvThread"); - wvThread.start(); + final Thread pythonThread = new Thread(new PythonMain(), "PythonThread"); + PythonActivity.mPythonThread = pythonThread; + pythonThread.start(); + final Thread wvThread = new Thread(new WebViewLoaderMain(), "WvThread"); + wvThread.start(); + } } @Override @@ -367,6 +371,73 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } + // loading screen implementation + public static ImageView mImageView = null; + public void removeLoadingScreen() { + runOnUiThread(new Runnable() { + public void run() { + if (PythonActivity.mImageView != null && + PythonActivity.mImageView.getParent() != null) { + ((ViewGroup)PythonActivity.mImageView.getParent()).removeView( + PythonActivity.mImageView); + PythonActivity.mImageView = null; + } + } + }); + } + + protected void showLoadingScreen() { + // load the bitmap + // 1. if the image is valid and we don't have layout yet, assign this bitmap + // as main view. + // 2. if we have a layout, just set it in the layout. + // 3. If we have an mImageView already, then do nothing because it will have + // already been made the content view or added to the layout. + + if (mImageView == null) { + int presplashId = this.resourceManager.getIdentifier("presplash", "drawable"); + InputStream is = this.getResources().openRawResource(presplashId); + Bitmap bitmap = null; + try { + bitmap = BitmapFactory.decodeStream(is); + } finally { + try { + is.close(); + } catch (IOException e) {}; + } + + mImageView = new ImageView(this); + mImageView.setImageBitmap(bitmap); + + /* + * Set the presplash loading screen background color + * https://developer.android.com/reference/android/graphics/Color.html + * Parse the color string, and return the corresponding color-int. + * If the string cannot be parsed, throws an IllegalArgumentException exception. + * Supported formats are: #RRGGBB #AARRGGBB or one of the following names: + * 'red', 'blue', 'green', 'black', 'white', 'gray', 'cyan', 'magenta', 'yellow', + * 'lightgray', 'darkgray', 'grey', 'lightgrey', 'darkgrey', 'aqua', 'fuchsia', + * 'lime', 'maroon', 'navy', 'olive', 'purple', 'silver', 'teal'. + */ + String backgroundColor = resourceManager.getString("presplash_color"); + if (backgroundColor != null) { + try { + mImageView.setBackgroundColor(Color.parseColor(backgroundColor)); + } catch (IllegalArgumentException e) {} + } + mImageView.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.FILL_PARENT, + ViewGroup.LayoutParams.FILL_PARENT)); + mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); + + } + + if (mLayout == null) { + setContentView(mImageView); + } else if (PythonActivity.mImageView.getParent() == null){ + mLayout.addView(mImageView); + } + } //---------------------------------------------------------------------------- // Listener interface for onNewIntent From 60c624ffe839e0f975bfdbf5a2adfd88743cf010 Mon Sep 17 00:00:00 2001 From: Pol Canelles Date: Sun, 26 Apr 2020 13:20:02 +0200 Subject: [PATCH 33/35] :rotating light: Fix linting for setup.py (#2158) * :rotating_light: Fix linting for setup.py - F401 'os' imported but unused - E303 too many blank lines (3) - E302 expected 2 blank lines, found 1 - E305 expected 2 blank lines after class or function definition, found 1 - E251 unexpected spaces around keyword / parameter equals * :ok_hand: Add setup.py to flake8 tests --- setup.py | 6 +++--- tox.ini | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index f22aeec80c..d59d630797 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,6 @@ from io import open # for open(..,encoding=...) parameter in python 2 from os import walk from os.path import join, dirname, sep -import os import re from setuptools import setup, find_packages @@ -17,7 +16,6 @@ data_files = [] - # must be a single statement since buildozer is currently parsing it, refs: # https://github.com/kivy/buildozer/issues/722 install_reqs = [ @@ -27,6 +25,7 @@ ] # (pep517 and toml are used by pythonpackage.py) + # By specifying every file manually, package_data will be able to # include them in binary distributions. Note that we have to add # everything as a 'pythonforandroid' rule, using '' apparently doesn't @@ -42,6 +41,7 @@ def recursively_include(results, directory, patterns): results[directory] = [] results[directory].append(join(*filename.split(sep)[1:])) + recursively_include(package_data, 'pythonforandroid/recipes', ['*.patch', 'Setup*', '*.pyx', '*.py', '*.c', '*.h', '*.mk', '*.jam', ]) @@ -104,7 +104,7 @@ def recursively_include(results, directory, patterns): 'aar = pythonforandroid.bdistapk:BdistAAR', ], }, - classifiers = [ + classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', diff --git a/tox.ini b/tox.ini index 4e69dd89b6..76da905c69 100644 --- a/tox.ini +++ b/tox.ini @@ -22,7 +22,7 @@ commands = [testenv:pep8] deps = flake8 -commands = flake8 pythonforandroid/ tests/ ci/ +commands = flake8 pythonforandroid/ tests/ ci/ setup.py [flake8] ignore = From e2b9cfe17d17607d876b7664cc0026dcd5e69f2e Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Tue, 28 Apr 2020 23:43:16 +0200 Subject: [PATCH 34/35] Fixes sh `_env` should be a dictionary It looks like the `_env` keyword argument is acception dictionary only. The error was: ``` TypeError: Invalid special arguments: 'env': env must be a dict. Got environ(...) ``` https://travis-ci.org/github/AndreMiras/python-for-android/jobs/680502683 --- pythonforandroid/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/build.py b/pythonforandroid/build.py index d12181b698..34de065854 100644 --- a/pythonforandroid/build.py +++ b/pythonforandroid/build.py @@ -764,7 +764,7 @@ def run_pymodules_install(ctx, modules, project_dir=None, shprint(host_python, '-m', 'venv', 'venv') # Prepare base environment and upgrade pip: - base_env = copy.copy(os.environ) + base_env = dict(copy.copy(os.environ)) base_env["PYTHONPATH"] = ctx.get_site_packages_dir() info('Upgrade pip to latest version') shprint(sh.bash, '-c', ( From 1ffdb769e03ba8a9ff9bc045aa5ca62425e9fb4b Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Thu, 7 May 2020 20:30:46 +0200 Subject: [PATCH 35/35] Updates version number to 2020.04.29 --- pythonforandroid/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonforandroid/__init__.py b/pythonforandroid/__init__.py index 114df6901c..9481240230 100644 --- a/pythonforandroid/__init__.py +++ b/pythonforandroid/__init__.py @@ -1 +1 @@ -__version__ = '2020.03.30' +__version__ = '2020.04.29'