diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..f1723d7772df9d8b0ad5fe6c0551619aebb38da5 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,108 @@ +# Official language image. Look for the different tagged releases at: +# https://hub.docker.com/r/library/python/tags/ +image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/python:3.6 + +# Change pip's cache directory to be inside the project directory since we can +# only cache local items. +variables: + PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" + +# Pip's cache doesn't store the python packages +# https://pip.pypa.io/en/stable/reference/pip_install/#caching +# +# If you want to also cache the installed packages, you have to install +# them in a virtualenv and cache it as well. +cache: + paths: + - .cache/pip + - venv/ + +before_script: + - pip install virtualenv + - make show-version # Print out python version for debugging + - virtualenv venv + - source venv/bin/activate + - make deps + +stages: # List of stages for jobs, and their order of execution + - test + - build + - deploy + +unit-test-job: + stage: test + script: + - make test + +pylint-test-job: + stage: test + script: + - make pylint + +pyflakes-test-job: + stage: test + script: + - make pyflakes + +build-job: + stage: build + script: + - make buildbot + - git clone https://gitlab-ci-token:$SIGNER_TOKEN@$SIGNER_REPO + - bash signer/init_keyring.sh + - python signer/signer.py --verbose $GPG_KEY "$PWD/dist" + artifacts: + paths: + - dist + only: + - devel + - master + +sphinx-metadata-job: + stage: build + script: + - printf "{\n\"codename\":\"$CI_COMMIT_BRANCH\",\n" > metadata.json + - printf "\"suite\":$(if [ "$CI_COMMIT_BRANCH" == "master" ]; then echo \"stable\"; else echo \"unstable\"; fi),\n" >> metadata.json + - printf "\"bversion\":\"$(make show-version)\",\n" >> metadata.json + - printf "\"revision\":\"$CI_COMMIT_SHA\",\n" >> metadata.json + - printf "\"bnumber\":\"$CI_PIPELINE_ID\",\n" >> metadata.json + - printf "\"bdate\":\"$(date '+%Y-%m-%d %T')\"\n}\n" >> metadata.json + artifacts: + paths: + - metadata.json + only: + - master + - devel + +twine-job: + stage: deploy + script: + - printf "[pypi]\nusername = __token__\npassword = $TWINE_TOKEN\n" > .pypirc + - mkdir dist2 + - cp dist/*.whl dist/*.tar.gz dist2/. + - twine upload 'dist2/*' --skip-existing --config-file .pypirc + only: + - master + +pages: + stage: deploy + script: + - make docs + - curl -L --header "JOB-TOKEN:$CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/devel/download?job=pages" -o devel.zip + - curl -L --header "JOB-TOKEN:$CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/master/download?job=pages" -o master.zip + - unzip -n '*.zip' || true # Ignore not existing zipfiles + - mkdir -p public/"$CI_COMMIT_BRANCH" + - mkdir -p public/"$CI_COMMIT_BRANCH"/files + - cp -rf doc/_build/html public/"$CI_COMMIT_BRANCH" + - cp -rf dist/* public/"$CI_COMMIT_BRANCH"/files/. + - cd public/"$CI_COMMIT_BRANCH"/files + - echo "<html><body><h1>Directory listing:</h1>" > ./index.html + - find -exec echo "<a href='{}'>{}</a><br/>" \; | sort >> ./index.html + - echo "</body></html>" >> ./index.html + artifacts: + name: "$CI_COMMIT_BRANCH" + paths: + - public + only: + - master + - devel \ No newline at end of file diff --git a/Makefile b/Makefile index 9792bf1b4e870da1a0c887ebeda039a588691087..119d038fa7e4901144fceafdbe5ba76eb6995149 100644 --- a/Makefile +++ b/Makefile @@ -104,7 +104,12 @@ show-version: FORCE #------------------------------------------------------------------------------- -deps: deps-python +deps: deps-python deps-python-dev + +deps-python-dev: FORCE + @echo "\n$(GREEN)*** Installing Python development dependencies ***$(NC)\n" + @pip3 --version + @pip3 install -r requirements-dev.pip deps-python: FORCE @echo "\n${GREEN}*** Installing Python dependencies ***${NC}\n" diff --git a/requirements-dev.pip b/requirements-dev.pip new file mode 100644 index 0000000000000000000000000000000000000000..e92d9cb3c7fc873c0b1fe2936e839410bac9f1ed --- /dev/null +++ b/requirements-dev.pip @@ -0,0 +1,9 @@ +setuptools +wheel +twine +docutils<0.18 +nose==1.3.7 +pyflakes==2.1.0 +pylint==2.2.2 +sphinx==1.8.4 +sphinx-rtd-theme==0.4.2 diff --git a/typedcols.py b/typedcols.py index a87f34111dc8a752b2865a2b6bdd9200ba582d1e..30ebccd3b2cff8612e23c90700f37433613a98f0 100644 --- a/typedcols.py +++ b/typedcols.py @@ -151,7 +151,7 @@ class TypedDict(collections.MutableMapping): for key, tdef in self.typedef.items(): if tdef.get("required", False) and not key in self.data: missing = missing + ((key,),) - elif recursive and issubclass(tdef["type"], TypedDict): + elif recursive and isinstance(tdef["type"], type) and issubclass(tdef["type"], TypedDict): try: self.data[key].checkRequired(recursive) except KeysRequired as e: