diff --git a/last_commit.txt b/last_commit.txt index 46eb1475ff..36918aed17 100644 --- a/last_commit.txt +++ b/last_commit.txt @@ -1,23 +1,65 @@ -Repository: plone.restapi +Repository: plone.rest Branch: refs/heads/master -Date: 2020-12-18T15:19:02+01:00 +Date: 2020-12-20T13:28:01+01:00 Author: Timo Stollenwerk (tisto) -Commit: https://github.com/plone/plone.restapi/commit/28406a5b8489f6374a4aff58b6caf954005a8d90 +Commit: https://github.com/plone/plone.rest/commit/14637bb8cedf28ccdb833c61877ae2338c7ff57a -Remove Travis (#1036) +Gh actions (#114) -* Delete .travis.yml +* make update -* Rename travis.cfg -> ci.cfg +* Pin httpie to last py2 compatible version + +* Fix Plone 5.2 buildout with version pins. + +* Fix p 5.2 buildout + +* Properly pin httpie + +* make update + +* make update + +* Remove httpie + +* Add gh actions + +* black + +* pin check-manifest + +* pin check-manifest + +* pin urllib3 + +* Exclude 3.7 with plone 5.1 + +* Pin idna + +* Remove Travis Files changed: +A .github/workflows/ci.yml A ci.cfg -M .github/workflows/ci.yml M Makefile +M README.rst +M base.cfg +M plone-4.3.x.cfg +M plone-5.1.x.cfg +M plone-5.2.x.cfg +M requirements.txt +M src/plone/rest/cors.py +M src/plone/rest/errors.py +M src/plone/rest/events.py +M src/plone/rest/interfaces.py +M src/plone/rest/negotiation.py +M src/plone/rest/patches.py +M src/plone/rest/traverse.py +M src/plone/rest/zcml.py +M versions.cfg D .travis.yml -D travis.cfg -b'diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml\nindex 72c8295b1..6167a76a2 100644\n--- a/.github/workflows/ci.yml\n+++ b/.github/workflows/ci.yml\n@@ -53,11 +53,11 @@ jobs:\n - name: pip install\n run: pip install -r requirements.txt\n - name: choose Plone version\n- run: sed -ie "s#plone-x.x.x.cfg#plone-${{ matrix.plone-version }}.x.cfg#" travis.cfg\n+ run: sed -ie "s#plone-x.x.x.cfg#plone-${{ matrix.plone-version }}.x.cfg#" ci.cfg\n \n # buildout\n - name: buildout\n- run: buildout -t 10 -c travis.cfg\n+ run: buildout -t 10 -c ci.cfg\n env:\n CI: true\n \ndiff --git a/.travis.yml b/.travis.yml\ndeleted file mode 100644\nindex 575208640..000000000\n--- a/.travis.yml\n+++ /dev/null\n@@ -1,69 +0,0 @@\n-os: linux\n-language: python\n-python:\n- - "2.7"\n- - "3.6"\n- - "3.7"\n- - "3.8"\n-dist: xenial\n-# services:\n-# - docker\n-cache:\n- pip: true\n- directories:\n- - $HOME/buildout-cache\n-env:\n- global:\n- # - secure: "tj9kO7Uyn7AY2Z6zhdOggLSYheaD8e+qKA7ZXvdWTrL2HtPAtnNJK8keQGj1JLQyy6bRfoOCt51aL8+Lc0fzcACaLFpAPjleSLtUChphPOh/dqTu1QX5oL0SxZ94B4ZC5+qfaSAQHMwbiiWUW0us9QtJpxQQmiJUekqiTdQDNEo="\n- # - secure: "j06un+j2gHjlGfg+xMcvKG2osf1HSzBq/cPPNIonnjGQY3GJfT/YRzYnHe5LJPPt7IJDD7hAEPentRJ4C0zP66U6gcQ2HjWPsMIcvzlgnXoT2QaaCVkMA9YS4WOsN0C5iY/R64GjFwR7J+/bgeG64XvfhpuQ/UBP2+U68PqSBtM="\n- - ZSERVER_PORT=55001\n- jobs:\n- - PLONE_VERSION=4.3.x\n- - PLONE_VERSION=5.1.x\n- - PLONE_VERSION=5.2.x\n-jobs:\n- exclude:\n- - python: "3.6"\n- env: PLONE_VERSION=4.3.x\n- - python: "3.6"\n- env: PLONE_VERSION=5.0.x\n- - python: "3.6"\n- env: PLONE_VERSION=5.1.x\n- - python: "3.7"\n- env: PLONE_VERSION=4.3.x\n- - python: "3.7"\n- env: PLONE_VERSION=5.0.x\n- - python: "3.7"\n- env: PLONE_VERSION=5.1.x\n- - python: "3.8"\n- env: PLONE_VERSION=4.3.x\n- - python: "3.8"\n- env: PLONE_VERSION=5.0.x\n- - python: "3.8"\n- env: PLONE_VERSION=5.1.x\n-before_install:\n- - mkdir -p $HOME/buildout-cache/{eggs,downloads}\n- - mkdir $HOME/.buildout\n- - echo "[buildout]" > $HOME/.buildout/default.cfg\n- - echo "download-cache = $HOME/buildout-cache/downloads" >> $HOME/.buildout/default.cfg\n- - echo "eggs-directory = $HOME/buildout-cache/eggs" >> $HOME/.buildout/default.cfg\n- - virtualenv -p `which python` .\n- - bin/pip install -r requirements.txt\n-install:\n- - sed -ie "s#plone-x.x.x.cfg#plone-$PLONE_VERSION.cfg#" travis.cfg\n- - bin/buildout -t 10 -c travis.cfg\n-script:\n- - if [ "$PLONE_VERSION" == "5.2.x" ] && [ $TRAVIS_PYTHON_VERSION == \'3.7\' ]; then pip install black && black src/ --check; fi\n- - bin/code-analysis\n- - if [ "$PLONE_VERSION" == "5.2.x" ] && [ $TRAVIS_PYTHON_VERSION == \'3.7\' ]; then bin/sphinxbuilder ; fi\n- - bin/test\n- - bin/test-no-uncommitted-doc-changes\n- - if [ "$PLONE_VERSION" == "5.2.x" ] && [ $TRAVIS_PYTHON_VERSION == \'3.7\' ]; then bin/test-no-sphinx-warnings ; fi\n-after_success:\n- - bin/test-coverage\n- - pip install coverage==5.1 coveralls\n- - coveralls\n- # - docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"\n- # - if [ ! $TRAVIS_TAG ]; then docker build --tag plone/plone.restapi:plone-$PLONE_VERSION-$(git rev-parse HEAD) --tag plone/plone.restapi:latest . ; fi\n- # - if [ $TRAVIS_TAG ]; then docker build --tag plone/plone.restapi:plone-$PLONE_VERSION-$(git rev-parse HEAD) . --tag plone/plone.restapi:plone-$PLONE_VERSION-$TRAVIS_TAG --tag plone/plone.restapi:latest ; fi\n- # - docker push plone/plone.restapi\ndiff --git a/Makefile b/Makefile\nindex 5f715f567..9af7ff733 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -27,7 +27,7 @@ update: ## Update Make and Buildout\n \twget -O plone-4.3.x.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/plone-4.3.x.cfg\n \twget -O plone-5.1.x.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/plone-5.1.x.cfg\n \twget -O plone-5.2.x.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/plone-5.2.x.cfg\n-\twget -O travis.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/travis.cfg\n+\twget -O ci.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/ci.cfg\n \twget -O versions.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/versions.cfg\n \n .installed.cfg: bin/buildout *.cfg\ndiff --git a/travis.cfg b/ci.cfg\nsimilarity index 100%\nrename from travis.cfg\nrename to ci.cfg\n' +b'diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml\nnew file mode 100644\nindex 0000000..7388994\n--- /dev/null\n+++ b/.github/workflows/ci.yml\n@@ -0,0 +1,60 @@\n+name: plone.rest CI\n+on: [push]\n+jobs:\n+ build:\n+ runs-on: ubuntu-latest\n+ strategy:\n+ fail-fast: false\n+ matrix:\n+ python-version: [3.7, 2.7]\n+ plone-version: [5.2, 5.1, 4.3]\n+ exclude:\n+ - python-version: 3.7\n+ plone-version: 4.3\n+ - python-version: 3.7\n+ plone-version: 5.1\n+\n+ steps:\n+\n+ # git checkout\n+ - uses: actions/checkout@v2\n+\n+ # python setup\n+ - name: Set up Python ${{ matrix.python-version }}\n+ uses: actions/setup-python@v1\n+ with:\n+ python-version: ${{ matrix.python-version }}\n+\n+ # python cache\n+ - uses: actions/cache@v1\n+ with:\n+ path: ~/.cache/pip\n+ key: ${{ runner.os }}-pip-${{ hashFiles(\'**/requirements.txt\') }}\n+ restore-keys: |\n+ ${{ runner.os }}-pip-\n+\n+ # python install\n+ - run: pip install virtualenv\n+ - run: pip install wheel\n+ - name: pip install\n+ run: pip install -r requirements.txt\n+ - name: choose Plone version\n+ run: sed -ie "s#plone-x.x.x.cfg#plone-${{ matrix.plone-version }}.x.cfg#" ci.cfg\n+\n+ # buildout\n+ - name: buildout\n+ run: buildout -t 10 -c ci.cfg\n+ env:\n+ CI: true\n+\n+ # black\n+ - name: black\n+ run: if [ "${{ matrix.plone-version }}" == "5.2" ] && [ ${{ matrix.python-version }} == \'3.7\' ]; then pip install black && black src/ --check; fi\n+\n+ # code analysis\n+ - name: black\n+ run: bin/code-analysis\n+\n+ # test\n+ - name: test\n+ run: bin/test\ndiff --git a/.travis.yml b/.travis.yml\ndeleted file mode 100644\nindex 38ef75b..0000000\n--- a/.travis.yml\n+++ /dev/null\n@@ -1,32 +0,0 @@\n-language: python\n-python:\n- - 2.7.15\n- - 3.7\n-cache:\n- pip: true\n- directories:\n- - $HOME/buildout-cache\n-env:\n- - PLONE_VERSION=4.3.x\n- - PLONE_VERSION=5.1.x\n- - PLONE_VERSION=5.2.x\n-jobs:\n- exclude:\n- - python: 3.7\n- env: PLONE_VERSION=4.3.x\n- - python: 3.7\n- env: PLONE_VERSION=5.1.x\n-before_install:\n- - mkdir -p $HOME/buildout-cache/{eggs,downloads}\n- - pip install -r requirements.txt\n-install:\n- - sed -ie "s#plone-x.x.x.cfg#plone-$PLONE_VERSION.cfg#" travis.cfg\n- - buildout -N -t 3 -c travis.cfg\n-script:\n- - if [ -f "bin/black" ]; then bin/black src/ --check ; fi\n- - bin/code-analysis\n- - bin/test\n- - bin/test-coverage\n-after_success:\n- - pip install -q coveralls\n- - coveralls\ndiff --git a/Makefile b/Makefile\nindex 1058c76..871a3cd 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -3,7 +3,7 @@\n SHELL := /bin/bash\n CURRENT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))\n \n-version = 3.7\n+version = 3\n \n # We like colors\n # From: https://coderwall.com/p/izxssa/colored-makefile-for-golang-projects\n@@ -27,7 +27,7 @@ update: ## Update Make and Buildout\n \twget -O plone-4.3.x.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/plone-4.3.x.cfg\n \twget -O plone-5.1.x.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/plone-5.1.x.cfg\n \twget -O plone-5.2.x.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/plone-5.2.x.cfg\n-\twget -O travis.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/travis.cfg\n+\twget -O ci.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/ci.cfg\n \twget -O versions.cfg https://raw.githubusercontent.com/kitconcept/buildout/master/versions.cfg\n \n .installed.cfg: bin/buildout *.cfg\n@@ -71,6 +71,12 @@ build-plone-5.2: .installed.cfg ## Build Plone 5.2\n \tbin/pip install -r requirements.txt\n \tbin/buildout -c plone-5.2.x.cfg\n \n+.PHONY: Build Plone 5.2 Performance\n+build-plone-5.2-performance: .installed.cfg ## Build Plone 5.2\n+\tbin/pip install --upgrade pip\n+\tbin/pip install -r requirements.txt\n+\tbin/buildout -c plone-5.2.x-performance.cfg\n+\n .PHONY: Test\n test: ## Test\n \tbin/test\ndiff --git a/README.rst b/README.rst\nindex 31a79a6..2e3c096 100644\n--- a/README.rst\n+++ b/README.rst\n@@ -1,6 +1,3 @@\n-.. image:: https://secure.travis-ci.org/plone/plone.rest.png?branch=master\n- :target: http://travis-ci.org/plone/plone.rest\n-\n .. image:: https://img.shields.io/coveralls/github/plone/plone.rest.svg\n :alt: Coveralls github\n :target: https://coveralls.io/github/plone/plone.restapi\ndiff --git a/base.cfg b/base.cfg\nindex 59ebfd7..10182f5 100644\n--- a/base.cfg\n+++ b/base.cfg\n@@ -58,7 +58,6 @@ eggs =\n towncrier\n readme\n docutils\n- httpie\n \n [sources]\n plone.dexterity = git git://github.com/plone/plone.dexterity.git pushurl=git@github.com:plone/plone.dexterity.git branch=plip-680\ndiff --git a/ci.cfg b/ci.cfg\nnew file mode 100644\nindex 0000000..af1a4f2\n--- /dev/null\n+++ b/ci.cfg\n@@ -0,0 +1,7 @@\n+[buildout]\n+extends = plone-x.x.x.cfg\n+\n+[code-analysis]\n+recipe = plone.recipe.codeanalysis\n+pre-commit-hook = False\n+return-status-codes = True\ndiff --git a/plone-4.3.x.cfg b/plone-4.3.x.cfg\nindex 3a0c6cb..488b7fd 100644\n--- a/plone-4.3.x.cfg\n+++ b/plone-4.3.x.cfg\n@@ -1,38 +1,30 @@\n [buildout]\n extends =\n base.cfg\n- http://dist.plone.org/release/4.3.19/versions.cfg\n+ https://dist.plone.org/release/4.3.20/versions.cfg\n+ versions.cfg\n \n [versions]\n+plone.testing = 5.0.0\n pytz = 2017.3\n zope.interface = 4.1.0\n+\n # fixes zlib failure: https://stackoverflow.com/questions/34631806/fail-during-installation-of-pillow-python-module-in-linux\n # Pillow = 5.4.1\n future = 0.17.1\n six = 1.11.0\n \n-# Required for Python 2.7 compatibility\n-more-itertools = <6.0.0\n-zipp = >=0.5, <2a\n-\n-# plone.restapi specific\n-plone.schema = 1.2.0\n+# fixes: SyntaxError: invalid syntax (more.py, line 340)\n+zipp = 0.5.2\n \n-# zest.releaser\n-zest.releaser = 6.20.1\n-twine = 1.11.0\n-requests = 2.22.0\n-towncrier = 19.2.0\n-zestreleaser.towncrier = 1.1.0\n-# docutils = 0.13.1\n+# more-itertools >= 6.0.0 dropped python2.7 support\n+more-itertools = 5.0.0\n \n-# Sphinx\n-Sphinx = 1.6.5\n-docutils = 0.14\n+# Error: The requirement (\'Pygments>=2.5.1\') is not allowed by your [versions] constraint (2.2.0)\n Pygments = 2.5.2\n-sphinxcontrib-httpexample = 0.7.0\n-sphinxcontrib-httpdomain = 1.5.0\n-sphinx-rtd-theme = 0.2.4\n-Jinja2 = 2.10\n-Babel = 2.5.1\n-astunparse = 1.6.2\n\\ No newline at end of file\n+\n+# Last pyrsistent version that is python 2 compatible:\n+pyrsistent = 0.15.7\n+\n+# Error: The requirement (\'distlib<1,>=0.3.1\') is not allowed by your [versions] constraint (0.3.0)\n+distlib = 0.3.1\ndiff --git a/plone-5.1.x.cfg b/plone-5.1.x.cfg\nindex b3d7a7e..ab72b98 100644\n--- a/plone-5.1.x.cfg\n+++ b/plone-5.1.x.cfg\n@@ -1,19 +1,30 @@\n [buildout]\n extends =\n base.cfg\n- http://dist.plone.org/release/5.1.6/versions.cfg\n+ https://dist.plone.org/release/5.1.7/versions.cfg\n+ versions.cfg\n \n [versions]\n+plone.testing = 5.0.0\n+\n+# Error: The requirement (\'virtualenv>=20.0.35\') is not allowed by your [versions] constraint (20.0.26)\n+virtualenv = 20.0.35\n+\n+# Error: The requirement (\'distlib<1,>=0.3.1\') is not allowed by your [versions] constraint (0.3.0)\n+distlib = 0.3.1\n+\n # fixes: SyntaxError: invalid syntax (more.py, line 340)\n zipp = 0.5.2\n \n-# plone.restapi specific\n-plone.schema = 1.2.0\n+# Error: The requirement (\'urllib3<1.23,>=1.21.1\') is not allowed by your [versions] constraint (1.25.10)\n+urllib3 = 1.21.1\n+\n+# Error: The requirement (\'idna<2.7,>=2.5\') is not allowed by your [versions] constraint (2.10)\n+idna = 2.5\n \n # zest.releaser\n zest.releaser = 6.20.1\n twine = 1.11.0\n-requests = 2.22.0\n towncrier = 19.2.0\n zestreleaser.towncrier = 1.1.0\n # docutils = 0.13.1\n@@ -21,10 +32,10 @@ zestreleaser.towncrier = 1.1.0\n # Sphinx\n Sphinx = 1.6.5\n docutils = 0.14\n-Pygments = 2.5.2\n+Pygments = 2.5.1\n sphinxcontrib-httpexample = 0.7.0\n sphinxcontrib-httpdomain = 1.5.0\n sphinx-rtd-theme = 0.2.4\n Jinja2 = 2.10\n Babel = 2.5.1\n-astunparse = 1.6.2\n\\ No newline at end of file\n+astunparse = 1.6.2\ndiff --git a/plone-5.2.x.cfg b/plone-5.2.x.cfg\nindex dbb9600..d65b44e 100644\n--- a/plone-5.2.x.cfg\n+++ b/plone-5.2.x.cfg\n@@ -1,10 +1,21 @@\n [buildout]\n extends =\n base.cfg\n- http://dist.plone.org/release/5.2.1/versions.cfg\n-find-links += http://dist.plone.org/thirdparty/\n+ https://dist.plone.org/release/5.2.3/versions.cfg\n+find-links += https://dist.plone.org/thirdparty/\n versions=versions\n \n [versions]\n-# httpie depdendency, Pygments conflicts with \n-Pygments = 2.5.2\n+black = 20.8b1\n+\n+# Error: The requirement (\'virtualenv>=20.0.35\') is not allowed by your [versions] constraint (20.0.26)\n+virtualenv = 20.0.35\n+\n+# Error: The requirement (\'pep517>=0.9\') is not allowed by your [versions] constraint (0.8.2)\n+pep517 = 0.9.1\n+\n+# Error: The requirement (\'importlib-metadata>=1\') is not allowed by your [versions] constraint (0.23)\n+importlib-metadata = 2.0.0\n+\n+# last py2 compatible version\n+check-manifest = 0.41\n\\ No newline at end of file\ndiff --git a/requirements.txt b/requirements.txt\nindex f6ac0d7..69d3090 100644\n--- a/requirements.txt\n+++ b/requirements.txt\n@@ -1,3 +1,3 @@\n # Keep this file in sync with: https://github.com/kitconcept/buildout/edit/master/requirements.txt\n setuptools==42.0.2\n-zc.buildout==2.13.2\n+zc.buildout==2.13.3\ndiff --git a/src/plone/rest/cors.py b/src/plone/rest/cors.py\nindex 7fd230c..dbc2035 100644\n--- a/src/plone/rest/cors.py\n+++ b/src/plone/rest/cors.py\n@@ -26,8 +26,8 @@ def __init__(self, context, request):\n \n def process_simple_request(self):\n """Process the current request as a simple CORS request by setting the\n- appropriate access control headers. Returns True if access control\n- headers were set.\n+ appropriate access control headers. Returns True if access control\n+ headers were set.\n """\n origin = self._allowed_origin()\n if not origin:\n@@ -43,8 +43,8 @@ def process_simple_request(self):\n \n def process_preflight_request(self):\n """Process the current request as a CORS preflight request by setting\n- the appropriate access control headers. Returns True if access\n- control headers were set.\n+ the appropriate access control headers. Returns True if access\n+ control headers were set.\n """\n origin = self._allowed_origin()\n if not origin:\ndiff --git a/src/plone/rest/errors.py b/src/plone/rest/errors.py\nindex 1eed12b..8227ff4 100644\n--- a/src/plone/rest/errors.py\n+++ b/src/plone/rest/errors.py\n@@ -231,8 +231,7 @@ def attempt_redirect(self):\n \n @memoize\n def _url(self):\n- """Get the current, canonical URL\n- """\n+ """Get the current, canonical URL"""\n return self.request.get(\n "ACTUAL_URL",\n self.request.get(\ndiff --git a/src/plone/rest/events.py b/src/plone/rest/events.py\nindex f22f543..e2c65ce 100644\n--- a/src/plone/rest/events.py\n+++ b/src/plone/rest/events.py\n@@ -7,7 +7,7 @@\n \n def mark_as_api_request(event):\n """Mark a request as IAPIRequest if there\'s a service registered for the\n- actual request method and Accept header.\n+ actual request method and Accept header.\n """\n request = event.request\n method = request.get("REQUEST_METHOD", "GET")\ndiff --git a/src/plone/rest/interfaces.py b/src/plone/rest/interfaces.py\nindex 963969b..ac18224 100644\n--- a/src/plone/rest/interfaces.py\n+++ b/src/plone/rest/interfaces.py\n@@ -3,18 +3,16 @@\n \n \n class IAPIRequest(Interface):\n- """Marker for API requests.\n- """\n+ """Marker for API requests."""\n \n \n class IService(Interface):\n- """Marker for REST services.\n- """\n+ """Marker for REST services."""\n \n \n class ICORSPolicy(Interface):\n """Provides methods for processing simple and preflight CORS requests by\n- adding access control headers.\n+ adding access control headers.\n """\n \n def process_simple_request():\ndiff --git a/src/plone/rest/negotiation.py b/src/plone/rest/negotiation.py\nindex 15423b4..7a47d5a 100644\n--- a/src/plone/rest/negotiation.py\n+++ b/src/plone/rest/negotiation.py\n@@ -7,7 +7,7 @@\n \n def parse_accept_header(accept):\n """Parse the given Accept header ignoring any parameters and return a list\n- of media type tuples.\n+ of media type tuples.\n """\n media_types = []\n for media_range in accept.split(","):\n@@ -20,8 +20,8 @@ def parse_accept_header(accept):\n \n def lookup_service_id(method, accept):\n """Lookup the service id for the given request method and Accept header.\n- Only Accept headers containing exactly one media type are considered for\n- negotiation.\n+ Only Accept headers containing exactly one media type are considered for\n+ negotiation.\n """\n media_types = parse_accept_header(accept)\n if len(media_types) != 1:\n@@ -40,7 +40,7 @@ def lookup_service_id(method, accept):\n \n def register_service(method, media_type):\n """Register a service for the given request method and media type and\n- return it\'s service id.\n+ return it\'s service id.\n """\n service_id = u"{}_{}_{}_".format(method, media_type[0], media_type[1])\n types = _services.setdefault(method, {})\ndiff --git a/src/plone/rest/patches.py b/src/plone/rest/patches.py\nindex c28dfac..97b618f 100644\n--- a/src/plone/rest/patches.py\n+++ b/src/plone/rest/patches.py\n@@ -4,7 +4,7 @@\n \n def __before_publishing_traverse__(self, arg1, arg2=None):\n """Pre-traversal hook that stops traversal to prevent the default view\n- to be appended. Appending the default view would break REST calls.\n+ to be appended. Appending the default view would break REST calls.\n """\n # XXX hack around a bug(?) in BeforeTraverse.MultiHook\n REQUEST = arg2 or arg1\ndiff --git a/src/plone/rest/traverse.py b/src/plone/rest/traverse.py\nindex 259d83a..1cacba9 100644\n--- a/src/plone/rest/traverse.py\n+++ b/src/plone/rest/traverse.py\n@@ -52,8 +52,7 @@ def browserDefault(self, request):\n \n @implementer(IBrowserPublisher)\n class RESTWrapper(object):\n- """A wrapper for objects traversed during a REST request.\n- """\n+ """A wrapper for objects traversed during a REST request."""\n \n def __init__(self, context, request):\n self.context = context\ndiff --git a/src/plone/rest/zcml.py b/src/plone/rest/zcml.py\nindex 287398a..b41521b 100644\n--- a/src/plone/rest/zcml.py\n+++ b/src/plone/rest/zcml.py\n@@ -20,8 +20,7 @@\n \n \n class IService(Interface):\n- """\n- """\n+ """"""\n \n method = TextLine(\n title=u"The name of the view that should be the default. "\ndiff --git a/versions.cfg b/versions.cfg\nindex 4087d74..de6710f 100644\n--- a/versions.cfg\n+++ b/versions.cfg\n@@ -2,3 +2,47 @@\n # Buildout\n setuptools =\n zc.buildout =\n+zc.recipe.egg = 2.0.3\n+\n+# fixes Getting distribution for \'configparser\'. assert newdist is not None # newloc above is missing our dist?!\n+configparser = 3.5.3\n+\n+# fixes Error: The requirement (\'Pygments>=2.5.1\') is not allowed by your [versions] constraint (2.2.0)\n+Pygments = 2.5.1\n+\n+# plone.recipe.varnish\n+plone.recipe.varnish = 1.3\n+\n+# Code-analysis\n+plone.recipe.codeanalysis = 3.0.1\n+coverage = 3.7.1\n+pep8 = 1.7.1\n+flake8 = 3.5.0\n+flake8-coding = 1.3.2\n+pycodestyle = 2.3.1\n+\n+# Release\n+zest.releaser = 6.17.0\n+twine = 1.11.0\n+requests = 2.18.4\n+towncrier = 19.2.0\n+zestreleaser.towncrier = 1.1.0\n+docutils = 0.13.1\n+\n+# Sphinx\n+Sphinx = 1.6.5\n+docutils = 0.14\n+Pygments = 2.2.0\n+sphinxcontrib-httpexample = 0.7.0\n+sphinxcontrib-httpdomain = 1.5.0\n+sphinx-rtd-theme = 0.2.4\n+Jinja2 = 2.10\n+Babel = 2.5.1\n+\n+# plone.rest(api) specific pins\n+\n+# last py2 compatible version\n+httpie = 1.0.3\n+\n+# last py2 compatible version\n+check-manifest = 0.41\n\\ No newline at end of file\n'