diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index f870edc..0000000 --- a/.coveragerc +++ /dev/null @@ -1,8 +0,0 @@ -[run] -omit = - tests/* - wsgidav/prop_man/couch_property_manager.py - wsgidav/prop_man/mongo_property_manager.py - wsgidav/samples/* - wsgidav/server/run_reloading_server.py - wsgidav/server/server_sample.py diff --git a/.editorconfig b/.editorconfig index c6fcadb..4277125 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,21 +1,40 @@ -# EditorConfig is awesome: http://EditorConfig.org +# EditorConfig Configurtaion file, for more details see: +# http://EditorConfig.org +# EditorConfig is a convention description, that could be interpreted +# by multiple editors to enforce common coding conventions for specific +# file types -# top-most EditorConfig file +# top-most EditorConfig file: +# Will ignore other EditorConfig files in Home directory or upper tree level. root = true -[*] - -; See https://github.com/editorconfig/editorconfig/issues/226 -;end_of_line = lf +[*] # For All Files +# Unix-style newlines with a newline ending every file +end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true - -# 4 space indentation -[*.py] +# Set default charset +charset = utf-8 +# Indent style default indent_style = space +# Max Line Length - a hard line wrap, should be disabled +max_line_length = off + +[*.{py,cfg,ini}] +# 4 space indentation indent_size = 4 -; Tab indentation (no size specified) -[*.js] -indent_style = tab \ No newline at end of file +[*.{yml}] +# 2 space indentation +indent_size = 2 + +[*.{js}] +# Tab indentation (no size specified) +indent_style = tab + +[{Makefile,.gitmodules}] +# Tab indentation (no size specified, but view as 4 spaces) +indent_style = tab +indent_size = unset +tab_width = unset diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 5188a01..0000000 --- a/.flake8 +++ /dev/null @@ -1,19 +0,0 @@ -[flake8] -max-line-length = 99 -#max-line-length = 88 - -# max-complexity = 12 - -# Ignore some errors that may be created by Black: -# E203 whitespace before ':' -# E501 line too long -# W503 line break before binary operator -ignore = E203, E501, W503 - -# Instead of strict E501, enable B950 for relaxed line length checking (and other bugbear warnings) -select = B,C,E,F,Q,W,B9 - -# Options for the flake8-quotes extension: -inline-quotes = " -multiline-quotes = """ -docstring-quotes = """ diff --git a/.gitignore b/.gitignore index 368a374..9cbda6d 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ debug.log wsgidav.conf wsgidav.json dist +coverage.xml +.coverage* *.prefs *.project diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index 669a4ee..0000000 --- a/.isort.cfg +++ /dev/null @@ -1,6 +0,0 @@ -[settings] -multi_line_output=3 -include_trailing_comma=True -force_grid_wrap=0 -combine_as_imports=True -line_length=88 diff --git a/.travis.yml b/.travis.yml index e262805..2c9aee9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,47 @@ sudo: false language: python -python: - - "2.7" -# - "3.3" # End-of-life September 2017 - - "3.4" - - "3.5" - - "3.6" - # See yaml/pyyaml#126. -# - "3.7-dev" # Planned for 2018-06 -#sudo: required +matrix: + include: + - python: "2.7" + env: TOXENV=lint-py27 + - python: "3.6" + env: TOXENV=black-check,lint-py36 + - python: "2.7" + env: TOXENV=py27 + - python: "3.4" + env: TOXENV=py34 + - python: "3.5" + env: TOXENV=py35 + - python: "3.6" + env: TOXENV=py36 + - python: "3.7" + env: TOXENV=py37 + - python: "3.7-dev" + env: TOXENV=py37 + - python: "3.8-dev" + env: TOXENV=py38 + allow_failures: + - python: "3.7" + env: TOXENV=py37 + - python: "3.7-dev" + env: TOXENV=py37 + - python: "3.8-dev" + env: TOXENV=py38 + before_install: # See issue #80: litmus fails to build on travis # The branch 'travis-litmus' still has this enabled to investigate... # - sudo apt-get install libneon27-dev # - ./install_litmus.sh + install: - pip install tox-travis + - travis_retry pip install -U pip setuptools + - travis_retry pip install -U tox coveralls coverage + script: - tox + - travis_retry tox + +after_success: + - coverage combine + - coveralls diff --git a/setup.cfg b/setup.cfg index 04ee043..868cd20 100644 --- a/setup.cfg +++ b/setup.cfg @@ -8,3 +8,73 @@ license_file = LICENSE ignore = docs/sphinx-build docs/sphinx-build/* + +[isort] +force_alphabetical_sort=True +force_single_line=False +force_to_top=True +from_first=True +lines_after_imports=2 +not_skip=__init__.py +multi_line_output=3 +include_trailing_comma=True +force_grid_wrap=0 +combine_as_imports=True +line_length=88 + +[aliases] +test = pytest + +[tool:pytest] +addopts = +testpaths = + . + tests + +[coverage:run] +branch = True +omit = + tests/* + wsgidav/prop_man/couch_property_manager.py + wsgidav/prop_man/mongo_property_manager.py + wsgidav/samples/* + wsgidav/server/run_reloading_server.py + wsgidav/server/server_sample.py + +[coverage:report] +precision = 2 +show_missing = True +sort = Name + +[coverage:html] +directory = _build/coverage + +[flake8] +max-line-length = 99 +#max-line-length = 88 + +# max-complexity = 12 + +# Ignore some errors that may be created by Black: +# E203 whitespace before ':' +# E501 line too long +# W503 line break before binary operator +ignore = + E203, + E501, + W503 + +# Instead of strict E501, enable B950 for relaxed line length checking (and other bugbear warnings) +select = + B, + C, + E, + F, + Q, + W, + B9 + +# Options for the flake8-quotes extension: +inline-quotes = " +multiline-quotes = """ +docstring-quotes = """ diff --git a/setup.py b/setup.py index 747351d..ba632da 100644 --- a/setup.py +++ b/setup.py @@ -1,17 +1,16 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- + from __future__ import print_function +from setuptools import Command, find_packages, setup +from setuptools.command.test import test as TestCommand +from wsgidav._version import __version__ # from datetime import datetime import os import sys -from setuptools import setup, find_packages -from setuptools import Command -from setuptools.command.test import test as TestCommand - -from wsgidav._version import __version__ - version = __version__ diff --git a/tests/benchmarks.py b/tests/benchmarks.py index 73cbeac..8b6d98f 100644 --- a/tests/benchmarks.py +++ b/tests/benchmarks.py @@ -49,6 +49,9 @@ Test cases file10-10-1.txt -> 1k """ from __future__ import print_function +from tests.util import Timing, WsgiDavTestServer +from wsgidav import __version__ +from wsgidav.xml_tools import use_lxml import datetime import logging @@ -57,9 +60,6 @@ import platform import subprocess import sys -from tests.util import Timing, WsgiDavTestServer -from wsgidav import __version__ -from wsgidav.xml_tools import use_lxml try: # WsgiDAV 2.x diff --git a/tests/conftest.py b/tests/conftest.py index bbbf88d..8868bd4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,7 +1,9 @@ +# -*- coding: utf-8 -*- + import os +import pkg_resources import sys -import pkg_resources sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) pkg_resources.require("wsgidav") diff --git a/tests/davclient.py b/tests/davclient.py index 70c1bcb..41ba76c 100644 --- a/tests/davclient.py +++ b/tests/davclient.py @@ -26,9 +26,9 @@ # - Use requests instead of http.client / httplib import copy +import requests import sys -import requests PY2 = sys.version_info < (3, 0) diff --git a/tests/test_http.py b/tests/test_http.py index 8f62507..4dfb700 100644 --- a/tests/test_http.py +++ b/tests/test_http.py @@ -7,11 +7,11 @@ This test suite uses requests to generate HTTP requests. """ -import unittest +from tests.util import WsgiDavTestServer import requests +import unittest -from tests.util import WsgiDavTestServer _test_server = None diff --git a/tests/test_litmus.py b/tests/test_litmus.py index c63d6e9..4eff8f8 100644 --- a/tests/test_litmus.py +++ b/tests/test_litmus.py @@ -6,11 +6,11 @@ Run litmus against WsgiDAV server. """ from __future__ import print_function +from tests.util import WsgiDavTestServer import subprocess import unittest -from tests.util import WsgiDavTestServer # ======================================================================== # WsgiDAVServerTest diff --git a/tests/test_lock_manager.py b/tests/test_lock_manager.py index fc08a29..e31daa8 100644 --- a/tests/test_lock_manager.py +++ b/tests/test_lock_manager.py @@ -3,14 +3,15 @@ # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license.php """Unit test for lock_manager.py""" +from tempfile import gettempdir +from time import sleep +from wsgidav import lock_manager, lock_storage +from wsgidav.dav_error import DAVError + import os import sys import unittest -from tempfile import gettempdir -from time import sleep -from wsgidav import lock_manager, lock_storage -from wsgidav.dav_error import DAVError # ======================================================================== # BasicTest diff --git a/tests/test_property_manager.py b/tests/test_property_manager.py index c658b94..98e455c 100644 --- a/tests/test_property_manager.py +++ b/tests/test_property_manager.py @@ -3,12 +3,13 @@ # Licensed under the MIT license: # http://www.opensource.org/licenses/mit-license.php """Unit test for property_manager.py""" +from tempfile import gettempdir +from wsgidav.prop_man import property_manager + import os import sys import unittest -from tempfile import gettempdir -from wsgidav.prop_man import property_manager # ======================================================================== # BasicTest diff --git a/tests/test_scripted.py b/tests/test_scripted.py index 3e38f58..1457998 100644 --- a/tests/test_scripted.py +++ b/tests/test_scripted.py @@ -11,20 +11,20 @@ http://svn.osafoundation.org/tools/davclient/trunk/src/davclient/davclient.py """ from __future__ import print_function - -import os -import time -import unittest from tempfile import gettempdir -from threading import Thread - from tests import davclient from tests.util import WsgiDavTestServer +from threading import Thread from wsgidav import compat from wsgidav.fs_dav_provider import FilesystemProvider from wsgidav.server.ext_wsgiutils_server import ExtServer from wsgidav.wsgidav_app import WsgiDAVApp +import os +import time +import unittest + + # SERVER_ADDRESS # (using localhost or mixing hostnames with IPs may be very slow!) SERVER_ADDRESS = "http://127.0.0.1:8080" @@ -61,7 +61,7 @@ def setUpModule(): _test_server = WsgiDAVServerThread() _test_server.start() # let server start the loop, otherwise shutdown might lock - time.sleep(.1) + time.sleep(0.1) return @@ -150,7 +150,7 @@ class WsgiDAVServerThread(Thread): print("WsgiDAVServerThread.shutdown()...") # let server process pending requests, otherwise shutdown might # lock - time.sleep(.1) + time.sleep(0.1) self.ext_server.stop_serve_forever() self.ext_server = None print("WsgiDAVServerThread.shutdown()... complete") diff --git a/tests/test_streaming.py b/tests/test_streaming.py index 74e891f..ccbb229 100644 --- a/tests/test_streaming.py +++ b/tests/test_streaming.py @@ -7,17 +7,17 @@ Unit tests for wsgidav.stream_tools.FileLikeQueue """ +from tempfile import gettempdir +from tests.util import Timing, write_test_file, WsgiDavTestServer +from wsgidav import compat +from wsgidav.dav_provider import DAVNonCollection, DAVProvider +from wsgidav.stream_tools import FileLikeQueue + import os +import requests import threading import unittest -from tempfile import gettempdir -import requests - -from tests.util import Timing, WsgiDavTestServer, write_test_file -from wsgidav import compat -from wsgidav.stream_tools import FileLikeQueue -from wsgidav.dav_provider import DAVNonCollection, DAVProvider # ---------------------------------------------------------------------------- # Dummy DAVProvider implementation diff --git a/tests/test_util.py b/tests/test_util.py index 03f3212..7e76b30 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -4,11 +4,6 @@ # http://www.opensource.org/licenses/mit-license.php """Unit tests for wsgidav.util""" from __future__ import print_function - -import logging -import logging.handlers -import unittest - from wsgidav.compat import StringIO from wsgidav.util import ( BASE_LOGGER_NAME, @@ -22,6 +17,10 @@ from wsgidav.util import ( shift_path, ) +import logging +import logging.handlers +import unittest + class BasicTest(unittest.TestCase): """Test .""" diff --git a/tests/test_wsgidav_app.py b/tests/test_wsgidav_app.py index e318f06..a6acbf0 100644 --- a/tests/test_wsgidav_app.py +++ b/tests/test_wsgidav_app.py @@ -12,16 +12,16 @@ (successor of http://pythonpaste.org/testing-applications.html) """ from __future__ import print_function +from tempfile import gettempdir +from wsgidav import compat, util +from wsgidav.fs_dav_provider import FilesystemProvider +from wsgidav.wsgidav_app import WsgiDAVApp import os import shutil import sys import unittest -from tempfile import gettempdir -from wsgidav import compat, util -from wsgidav.fs_dav_provider import FilesystemProvider -from wsgidav.wsgidav_app import WsgiDAVApp try: import webtest diff --git a/tests/util.py b/tests/util.py index 6c3ac93..50432d9 100644 --- a/tests/util.py +++ b/tests/util.py @@ -10,16 +10,16 @@ Example: ... test methods """ from __future__ import print_function +from tempfile import gettempdir +from wsgidav import compat, util +from wsgidav.fs_dav_provider import FilesystemProvider +from wsgidav.wsgidav_app import WsgiDAVApp import multiprocessing import os import sys import time -from tempfile import gettempdir -from wsgidav import compat, util -from wsgidav.fs_dav_provider import FilesystemProvider -from wsgidav.wsgidav_app import WsgiDAVApp # ======================================================================== # Timing diff --git a/tox.ini b/tox.ini index a829f5e..fd8ec40 100644 --- a/tox.ini +++ b/tox.ini @@ -1,45 +1,134 @@ [tox] basepython = python3.6 -#envlist = clean, py27, py34, py35, stats -envlist = check, py27, py34, py35, py36, py37 +envlist = + py27, + py34, + py35, + py36, + py37, + black-check, + lint-py27, + lint-py36, + coverage, [testenv] +usedevelop = True +extras = + test + passenv = LC_ALL LANG TRAVIS TRAVIS_BRANCH TRAVIS_OS_NAME TRAVIS_BUILD_ID +setenv = + COVERAGE_FILE=.coverage.{envname} + # Note: also honors .coveragerc: commands = # Run everything from /tests folder: - py.test -ra -v -x --cov wsgidav tests - # Check PEP8 style: - flake8 --version - flake8 wsgidav tests + python -V + pip list + pytest -ra -v -x --cov=wsgidav --cov-report=xml --html=_build/pytest/report-{envname}.html --self-contained-html {posargs} deps = cheroot defusedxml - flake8 - flake8-quotes Jinja2 jsmin PyYAML pytest pytest-cov + #pytest-remove-stale-bytecode + pytest-html requests webtest +[testenv:coverage] +skip_install = true -[testenv:check] -description = Check Black formatting compliance and add flake8-bugbear checks -basepython = python3.6 -changedir = {toxinidir} +deps = + coverage + +setenv = + COVERAGE_FILE=.coverage + +commands = + coverage erase + coverage combine + coverage html + coverage xml + coverage report --fail-under=30.0 + + +[testenv:isort-apply] skip_install = true deps = - black - flake8-bugbear -commands = - black --check --diff wsgidav tests - flake8 wsgidav tests + isort +commands = + isort --apply --recursive {toxinidir}/wsgidav {toxinidir}/tests setup.py {posargs} + +[testenv:autopep8] +skip_install = true +deps = + autopep8 + docformatter + +commands = + autopep8 --verbose --in-place --recursive --aggressive --aggressive {toxinidir}/wsgidav {toxinidir}/tests setup.py + docformatter --in-place --recursive {toxinidir}/wsgidav {toxinidir}/tests setup.py + +[lint] +skip_install = true + +deps = + isort + flake8 + # helper to generate HTML reports: + flake8-html + # Useful flake8 plugins that are Python and Plone specific: + flake8-coding + flake8-debugger + flake8-deprecated + flake8-pytest + flake8-quotes + flake8-todo + flake8-isort + mccabe + # Potential flake8 plugins that should be used: # TBD + #flake8-blind-except + #flake8-commas + #flake8-docstrings + #flake8-mypy + #flake8-pep3101 + #flake8-plone-hasattr + #flake8-string-format + #flake8_strict + #flake8-quotes + +commands = + mkdir -p {toxinidir}/_build/flake8 + isort --check-only --recursive {toxinidir}/wsgidav {toxinidir}/tests setup.py + - flake8 --format=html --htmldir={toxinidir}/_build/flake8 --doctests wsgidav tests setup.py + flake8 wsgidav tests setup.py --doctests + +whitelist_externals = + mkdir + +[testenv:lint-py27] +basepython = python2.7 +skip_install = true +deps = + {[lint]deps} +commands = {[lint]commands} +whitelist_externals = {[lint]whitelist_externals} + +[testenv:lint-py36] +basepython = python3.6 +skip_install = true +deps = + {[lint]deps} + flake8-bugbear +commands = {[lint]commands} +whitelist_externals = {[lint]whitelist_externals} [testenv:black] description = Reformat python code using Black @@ -49,8 +138,17 @@ skip_install = true deps = black commands = - black wsgidav tests + black wsgidav tests setup.py +[testenv:black-check] +description = Check Black formatting compliance and add flake8-bugbear checks +basepython = python3.6 +changedir = {toxinidir} +skip_install = true +deps = + black +commands = + black --check --diff wsgidav tests setup.py [testenv:docs] description = Build Sphinx documentation (output directory: docs/sphinx-build) diff --git a/wsgidav/__init__.py b/wsgidav/__init__.py index 11f729b..491ed40 100644 --- a/wsgidav/__init__.py +++ b/wsgidav/__init__.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # make version accessible as 'wsgidav.__version__' from wsgidav._version import __version__ # noqa: F401 @@ -7,6 +8,7 @@ from wsgidav._version import __version__ # noqa: F401 # https://docs.python.org/3/howto/logging.html#configuring-logging-for-a-library import logging + _base_logger = logging.getLogger(__name__) _base_logger.addHandler(logging.NullHandler()) _base_logger.propagate = False diff --git a/wsgidav/_version.py b/wsgidav/_version.py index 252a7ee..a2f4eae 100644 --- a/wsgidav/_version.py +++ b/wsgidav/_version.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ Current WsgiDAV version number. diff --git a/wsgidav/compat.py b/wsgidav/compat.py index 62c965e..e285504 100644 --- a/wsgidav/compat.py +++ b/wsgidav/compat.py @@ -11,6 +11,7 @@ Inspired by six https://pythonhosted.org/six/ import sys + __docformat__ = "reStructuredText" #: True if we are running on Python 2.x diff --git a/wsgidav/dav_error.py b/wsgidav/dav_error.py index 9217fad..0c02b23 100644 --- a/wsgidav/dav_error.py +++ b/wsgidav/dav_error.py @@ -6,11 +6,12 @@ """ Implements a DAVError class that is used to signal WebDAV and HTTP errors. """ -import datetime - from wsgidav import __version__, compat, xml_tools from wsgidav.xml_tools import etree +import datetime + + # import traceback diff --git a/wsgidav/dav_provider.py b/wsgidav/dav_provider.py index 51d0061..95e0e96 100644 --- a/wsgidav/dav_provider.py +++ b/wsgidav/dav_provider.py @@ -76,26 +76,21 @@ lockManager See :doc:`reference_guide` for more information about the WsgiDAV architecture. """ +from wsgidav import compat, util, xml_tools +from wsgidav.dav_error import ( + as_DAVError, + DAVError, + HTTP_FORBIDDEN, + HTTP_NOT_FOUND, + PRECONDITION_CODE_ProtectedProperty, +) +from wsgidav.util import etree + import os import sys import time import traceback -from wsgidav import compat, util, xml_tools -from wsgidav.dav_error import ( - HTTP_FORBIDDEN, - HTTP_NOT_FOUND, - DAVError, - PRECONDITION_CODE_ProtectedProperty, - as_DAVError, -) - -# Trick PyDev to do intellisense and don't produce warnings: -from wsgidav.util import etree # noqa - -if False: - from xml.etree import ElementTree as etree # noqa - __docformat__ = "reStructuredText" diff --git a/wsgidav/dc/nt_dc.py b/wsgidav/dc/nt_dc.py index 828a63f..0a552fd 100644 --- a/wsgidav/dc/nt_dc.py +++ b/wsgidav/dc/nt_dc.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # (c) 2009-2018 Martin Wendt and contributors; see WsgiDAV https://github.com/mar10/wsgidav # Original PyFileServer (c) 2005 Ho Chun Wei. # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php @@ -72,12 +73,12 @@ Testability and caveats ml """ from __future__ import print_function +from wsgidav import compat, util import win32net import win32netcon import win32security -from wsgidav import compat, util __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/dc/simple_dc.py b/wsgidav/dc/simple_dc.py index 247caa6..c7f9cee 100644 --- a/wsgidav/dc/simple_dc.py +++ b/wsgidav/dc/simple_dc.py @@ -32,9 +32,10 @@ domaincontrollerinterface_ .. _domaincontrollerinterface : interfaces/domaincontrollerinterface.py """ +from wsgidav import util + import sys -from wsgidav import util __docformat__ = "reStructuredText" diff --git a/wsgidav/debug_filter.py b/wsgidav/debug_filter.py index 1a4b0c5..b47e988 100644 --- a/wsgidav/debug_filter.py +++ b/wsgidav/debug_filter.py @@ -51,13 +51,14 @@ These configuration settings are evaluated: debug_litmus = ["notowner_modify", "props: 16", ] """ -import sys -import threading - from wsgidav import compat, util from wsgidav.middleware import BaseMiddleware from wsgidav.util import safe_re_encode +import sys +import threading + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/default_conf.py b/wsgidav/default_conf.py index b7895c9..c3da6db 100644 --- a/wsgidav/default_conf.py +++ b/wsgidav/default_conf.py @@ -14,12 +14,13 @@ Default confguration. """ -from wsgidav.dir_browser import WsgiDavDirBrowser from wsgidav.debug_filter import WsgiDavDebugFilter +from wsgidav.dir_browser import WsgiDavDirBrowser from wsgidav.error_printer import ErrorPrinter from wsgidav.http_authenticator import HTTPAuthenticator from wsgidav.request_resolver import RequestResolver + __docformat__ = "reStructuredText" # Use these settings, if config file does not define them (or is totally missing) diff --git a/wsgidav/dir_browser/_dir_browser.py b/wsgidav/dir_browser/_dir_browser.py index 894c5ce..39ab9e5 100644 --- a/wsgidav/dir_browser/_dir_browser.py +++ b/wsgidav/dir_browser/_dir_browser.py @@ -6,15 +6,15 @@ WSGI middleware that handles GET requests on collections to display directories. """ from fnmatch import fnmatch +from jinja2 import Environment, FileSystemLoader +from wsgidav import __version__, compat, util +from wsgidav.dav_error import DAVError, HTTP_MEDIATYPE_NOT_SUPPORTED, HTTP_OK +from wsgidav.middleware import BaseMiddleware +from wsgidav.util import safe_re_encode + import os import sys -from jinja2 import Environment, FileSystemLoader - -from wsgidav import __version__, compat, util -from wsgidav.dav_error import HTTP_MEDIATYPE_NOT_SUPPORTED, HTTP_OK, DAVError -from wsgidav.middleware import BaseMiddleware -from wsgidav.util import safe_re_encode __docformat__ = "reStructuredText" diff --git a/wsgidav/error_printer.py b/wsgidav/error_printer.py index 1f00ce5..27c4725 100644 --- a/wsgidav/error_printer.py +++ b/wsgidav/error_printer.py @@ -7,19 +7,20 @@ WSGI middleware to catch application thrown DAVErrors and return proper responses. """ -import traceback - from wsgidav import util from wsgidav.dav_error import ( + as_DAVError, + DAVError, + get_http_status_string, HTTP_INTERNAL_ERROR, HTTP_NO_CONTENT, HTTP_NOT_MODIFIED, - DAVError, - as_DAVError, - get_http_status_string, ) from wsgidav.middleware import BaseMiddleware +import traceback + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/fs_dav_provider.py b/wsgidav/fs_dav_provider.py index 3c2f444..d5aba00 100644 --- a/wsgidav/fs_dav_provider.py +++ b/wsgidav/fs_dav_provider.py @@ -15,14 +15,15 @@ This provider creates instances of :class:`~wsgidav.fs_dav_provider.FileResource and :class:`~wsgidav.fs_dav_provider.FolderResource` to represent files and directories respectively. """ +from wsgidav import compat, util +from wsgidav.dav_error import DAVError, HTTP_FORBIDDEN +from wsgidav.dav_provider import DAVCollection, DAVNonCollection, DAVProvider + import os import shutil import stat import sys -from wsgidav import compat, util -from wsgidav.dav_error import HTTP_FORBIDDEN, DAVError -from wsgidav.dav_provider import DAVCollection, DAVNonCollection, DAVProvider __docformat__ = "reStructuredText" diff --git a/wsgidav/http_authenticator.py b/wsgidav/http_authenticator.py index 04f73b1..5ecf074 100644 --- a/wsgidav/http_authenticator.py +++ b/wsgidav/http_authenticator.py @@ -75,17 +75,18 @@ The environ variable here is the WSGI 'environ' dictionary. It is passed to all methods of the domain controller as a means for developers to pass information from previous middleware or server config (if required). """ -import inspect -import random -import re -import time from hashlib import md5 - from wsgidav import compat, util from wsgidav.dc.simple_dc import SimpleDomainController from wsgidav.middleware import BaseMiddleware from wsgidav.util import calc_base64, calc_hexdigest, dynamic_import_class +import inspect +import random +import re +import time + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/interfaces/dav_provider_interface.py b/wsgidav/interfaces/dav_provider_interface.py index eda0a26..e368cca 100644 --- a/wsgidav/interfaces/dav_provider_interface.py +++ b/wsgidav/interfaces/dav_provider_interface.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- + + class IDAVProvider(object): """ +----------------------------------------------------------------------+ diff --git a/wsgidav/interfaces/domaincontrollerinterface.py b/wsgidav/interfaces/domaincontrollerinterface.py index 1dab7a1..2e5f7cf 100644 --- a/wsgidav/interfaces/domaincontrollerinterface.py +++ b/wsgidav/interfaces/domaincontrollerinterface.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- + + class IDomainController(object): """ +----------------------------------------------------------------------+ diff --git a/wsgidav/interfaces/lockmanagerinterface.py b/wsgidav/interfaces/lockmanagerinterface.py index 57c063d..d92280f 100644 --- a/wsgidav/interfaces/lockmanagerinterface.py +++ b/wsgidav/interfaces/lockmanagerinterface.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- + + class LockManagerInterface(object): """ +----------------------------------------------------------------------+ diff --git a/wsgidav/interfaces/propertymanagerinterface.py b/wsgidav/interfaces/propertymanagerinterface.py index f8158f9..a2ab08f 100644 --- a/wsgidav/interfaces/propertymanagerinterface.py +++ b/wsgidav/interfaces/propertymanagerinterface.py @@ -1,3 +1,6 @@ +# -*- coding: utf-8 -*- + + class PropertyManagerInterface(object): """ +----------------------------------------------------------------------+ diff --git a/wsgidav/lock_manager.py b/wsgidav/lock_manager.py index fbbfcb4..6263fd2 100644 --- a/wsgidav/lock_manager.py +++ b/wsgidav/lock_manager.py @@ -36,19 +36,20 @@ The lock data model is a dictionary with these fields: Automatically generated unique token. """ -import random -import time from pprint import pformat - from wsgidav import compat, util from wsgidav.dav_error import ( - HTTP_LOCKED, DAVError, DAVErrorCondition, + HTTP_LOCKED, PRECONDITION_CODE_LockConflict, ) from wsgidav.rw_lock import ReadWriteLock +import random +import time + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/lock_storage.py b/wsgidav/lock_storage.py index 663cc9d..4ff7627 100644 --- a/wsgidav/lock_storage.py +++ b/wsgidav/lock_storage.py @@ -11,10 +11,6 @@ Two alternative lock storage classes are defined here: one in-memory See :class:`~wsgidav.lock_manager.LockManager` """ -import os -import shelve -import time - from wsgidav import compat, util from wsgidav.lock_manager import ( generate_lock_token, @@ -24,6 +20,11 @@ from wsgidav.lock_manager import ( ) from wsgidav.rw_lock import ReadWriteLock +import os +import shelve +import time + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/prop_man/__init__.py b/wsgidav/prop_man/__init__.py index e69de29..40a96af 100644 --- a/wsgidav/prop_man/__init__.py +++ b/wsgidav/prop_man/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/wsgidav/prop_man/couch_property_manager.py b/wsgidav/prop_man/couch_property_manager.py index 8f53cf9..18573f6 100644 --- a/wsgidav/prop_man/couch_property_manager.py +++ b/wsgidav/prop_man/couch_property_manager.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # (c) 2009-2018 Martin Wendt and contributors; see WsgiDAV https://github.com/mar10/wsgidav # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php """ @@ -22,11 +23,11 @@ Valid options are (sample shows defaults):: """ from __future__ import print_function - from uuid import uuid4 +from wsgidav import compat, util import couchdb -from wsgidav import compat, util + __docformat__ = "reStructuredText" diff --git a/wsgidav/prop_man/mongo_property_manager.py b/wsgidav/prop_man/mongo_property_manager.py index d87dd8c..b3d835d 100644 --- a/wsgidav/prop_man/mongo_property_manager.py +++ b/wsgidav/prop_man/mongo_property_manager.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # (c) 2009-2018 Martin Wendt and contributors; see WsgiDAV https://github.com/mar10/wsgidav # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php """ @@ -22,9 +23,10 @@ Valid options are (sample shows defaults):: """ from __future__ import print_function +from wsgidav import compat, util import pymongo -from wsgidav import compat, util + __docformat__ = "reStructuredText" diff --git a/wsgidav/prop_man/property_manager.py b/wsgidav/prop_man/property_manager.py index 4a2a838..edbf36d 100644 --- a/wsgidav/prop_man/property_manager.py +++ b/wsgidav/prop_man/property_manager.py @@ -18,11 +18,12 @@ The properties dictionaray is built like:: } """ +from wsgidav import util +from wsgidav.rw_lock import ReadWriteLock + import os import shelve -from wsgidav import util -from wsgidav.rw_lock import ReadWriteLock # TODO: comment's from Ian Bicking (2005) # @@: Use of shelve means this is only really useful in a threaded environment. diff --git a/wsgidav/request_resolver.py b/wsgidav/request_resolver.py index 160a61f..2d44203 100644 --- a/wsgidav/request_resolver.py +++ b/wsgidav/request_resolver.py @@ -88,10 +88,11 @@ header, if present, to:: """ from wsgidav import util -from wsgidav.dav_error import HTTP_NOT_FOUND, DAVError +from wsgidav.dav_error import DAVError, HTTP_NOT_FOUND from wsgidav.middleware import BaseMiddleware from wsgidav.request_server import RequestServer + __docformat__ = "reStructuredText" # NOTE (Martin Wendt, 2009-05): diff --git a/wsgidav/request_server.py b/wsgidav/request_server.py index b48b47e..aae706f 100644 --- a/wsgidav/request_server.py +++ b/wsgidav/request_server.py @@ -8,6 +8,9 @@ WSGI application that handles one single WebDAV request. """ from wsgidav import compat, util, xml_tools from wsgidav.dav_error import ( + as_DAVError, + DAVError, + get_http_status_string, HTTP_BAD_GATEWAY, HTTP_BAD_REQUEST, HTTP_CONFLICT, @@ -24,14 +27,12 @@ from wsgidav.dav_error import ( HTTP_OK, HTTP_PRECONDITION_FAILED, HTTP_RANGE_NOT_SATISFIABLE, - DAVError, PRECONDITION_CODE_LockTokenMismatch, PRECONDITION_CODE_PropfindFiniteDepth, - as_DAVError, - get_http_status_string, ) from wsgidav.util import etree + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/rw_lock.py b/wsgidav/rw_lock.py index e6e4fae..a0b373f 100644 --- a/wsgidav/rw_lock.py +++ b/wsgidav/rw_lock.py @@ -15,9 +15,10 @@ Released under the BSD-license. # Imports # ------- -from threading import Condition, Lock, currentThread +from threading import Condition, currentThread, Lock from time import time + # Read write lock # --------------- diff --git a/wsgidav/samples/dav_provider_tools.py b/wsgidav/samples/dav_provider_tools.py index 49b9f7e..392766f 100644 --- a/wsgidav/samples/dav_provider_tools.py +++ b/wsgidav/samples/dav_provider_tools.py @@ -4,11 +4,12 @@ """ Tools that make it easier to implement custom WsgiDAV providers. """ +from wsgidav import compat, util +from wsgidav.dav_provider import DAVCollection, DAVNonCollection + import os import stat -from wsgidav import compat, util -from wsgidav.dav_provider import DAVCollection, DAVNonCollection __docformat__ = "reStructuredText en" diff --git a/wsgidav/samples/hg_dav_provider.py b/wsgidav/samples/hg_dav_provider.py index d077a3c..d8696aa 100644 --- a/wsgidav/samples/hg_dav_provider.py +++ b/wsgidav/samples/hg_dav_provider.py @@ -72,17 +72,17 @@ Requirements: http://mercurial.berkwood.com/binaries/mercurial-1.4.win32-py2.6.exe """ from __future__ import print_function +from hashlib import md5 +from pprint import pprint +from wsgidav import compat, util +from wsgidav.dav_error import DAVError, HTTP_FORBIDDEN +from wsgidav.dav_provider import _DAVResource, DAVProvider +from wsgidav.samples.dav_provider_tools import VirtualCollection import os import sys import time -from hashlib import md5 -from pprint import pprint -from wsgidav import compat, util -from wsgidav.dav_error import HTTP_FORBIDDEN, DAVError -from wsgidav.dav_provider import DAVProvider, _DAVResource -from wsgidav.samples.dav_provider_tools import VirtualCollection try: import mercurial.ui diff --git a/wsgidav/samples/mongo_dav_provider.py b/wsgidav/samples/mongo_dav_provider.py index 625fd71..3175821 100644 --- a/wsgidav/samples/mongo_dav_provider.py +++ b/wsgidav/samples/mongo_dav_provider.py @@ -24,14 +24,15 @@ Valid options are (sample shows defaults):: } """ -from pprint import pformat - -import pymongo from bson.objectid import ObjectId +from pprint import pformat from wsgidav import compat, util from wsgidav.dav_provider import DAVCollection, DAVNonCollection, DAVProvider from wsgidav.util import join_uri +import pymongo + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/samples/mysql_dav_provider.py b/wsgidav/samples/mysql_dav_provider.py index 15015cb..3ac1ba6 100644 --- a/wsgidav/samples/mysql_dav_provider.py +++ b/wsgidav/samples/mysql_dav_provider.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # (c) 2009-2018 Martin Wendt and contributors; see WsgiDAV https://github.com/mar10/wsgidav # Original PyFileServer (c) 2005 Ho Chun Wei. # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php @@ -57,21 +58,19 @@ its limitations: """ from __future__ import print_function +from wsgidav import compat, util +from wsgidav.dav_error import ( + DAVError, + HTTP_FORBIDDEN, + PRECONDITION_CODE_ProtectedProperty, +) +from wsgidav.dav_provider import _DAVResource, DAVProvider import csv import hashlib - -# import md5 +import MySQLdb # @UnresolvedImport import time -import MySQLdb # @UnresolvedImport -from wsgidav import compat, util -from wsgidav.dav_error import ( - HTTP_FORBIDDEN, - DAVError, - PRECONDITION_CODE_ProtectedProperty, -) -from wsgidav.dav_provider import DAVProvider, _DAVResource __docformat__ = "reStructuredText" diff --git a/wsgidav/samples/virtual_dav_provider.py b/wsgidav/samples/virtual_dav_provider.py index d9c3ad5..cb7e3fa 100644 --- a/wsgidav/samples/virtual_dav_provider.py +++ b/wsgidav/samples/virtual_dav_provider.py @@ -95,19 +95,20 @@ When accessed using WebDAV, the following URLs both return the same resource /by_tag/hot/My doc 1 /by_key/1 """ -import os -import stat - from wsgidav import compat, util from wsgidav.dav_error import ( + DAVError, HTTP_FORBIDDEN, HTTP_INTERNAL_ERROR, - DAVError, PRECONDITION_CODE_ProtectedProperty, ) from wsgidav.dav_provider import DAVCollection, DAVNonCollection, DAVProvider from wsgidav.util import join_uri +import os +import stat + + __docformat__ = "reStructuredText en" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/server/ext_wsgiutils_server.py b/wsgidav/server/ext_wsgiutils_server.py index ccdf3a9..e41707f 100644 --- a/wsgidav/server/ext_wsgiutils_server.py +++ b/wsgidav/server/ext_wsgiutils_server.py @@ -53,6 +53,8 @@ can copy ``ext_wsgi_server.py`` to ``/paste/servers`` and us run the application by specifying ``server='ext_wsgiutils'`` in the ``server.conf`` or appropriate paste configuration. """ +from wsgidav import __version__, compat, util + import logging import socket import sys @@ -60,7 +62,6 @@ import threading import time import traceback -from wsgidav import __version__, compat, util __docformat__ = "reStructuredText" @@ -336,7 +337,7 @@ class ExtServer(socketserver.ThreadingMixIn, BaseHTTPServer.HTTPServer): # # Flag stop request self.stop_request = True - time.sleep(.1) + time.sleep(0.1) if self.stopped: # _logger.info "stop_serve_forever() 'stopped'." return diff --git a/wsgidav/server/run_reloading_server.py b/wsgidav/server/run_reloading_server.py index 930a8ad..184aa60 100644 --- a/wsgidav/server/run_reloading_server.py +++ b/wsgidav/server/run_reloading_server.py @@ -6,10 +6,10 @@ Wrapper for ``server_cli``, that restarts the server when source code is modified. """ from __future__ import print_function +from subprocess import Popen import os import sys -from subprocess import Popen def run(): diff --git a/wsgidav/server/server_cli.py b/wsgidav/server/server_cli.py index 33d61db..c56b1be 100644 --- a/wsgidav/server/server_cli.py +++ b/wsgidav/server/server_cli.py @@ -33,6 +33,14 @@ Configuration is defined like this: FOLDER on the '/' share. """ from __future__ import print_function +from inspect import isfunction +from jsmin import jsmin +from pprint import pformat +from wsgidav import __version__, util +from wsgidav.default_conf import DEFAULT_CONFIG, DEFAULT_VERBOSE +from wsgidav.fs_dav_provider import FilesystemProvider +from wsgidav.wsgidav_app import WsgiDAVApp +from wsgidav.xml_tools import use_lxml import argparse import copy @@ -43,17 +51,8 @@ import os import platform import sys import traceback -from inspect import isfunction -from pprint import pformat - import yaml -from jsmin import jsmin -from wsgidav import __version__, util -from wsgidav.default_conf import DEFAULT_CONFIG, DEFAULT_VERBOSE -from wsgidav.fs_dav_provider import FilesystemProvider -from wsgidav.wsgidav_app import WsgiDAVApp -from wsgidav.xml_tools import use_lxml __docformat__ = "reStructuredText" diff --git a/wsgidav/server/server_sample.py b/wsgidav/server/server_sample.py index b511a6d..133e714 100644 --- a/wsgidav/server/server_sample.py +++ b/wsgidav/server/server_sample.py @@ -6,13 +6,12 @@ Simple example how to a run WsgiDAV in a 3rd-party WSGI server. """ from __future__ import print_function - from tempfile import gettempdir - from wsgidav import __version__ from wsgidav.fs_dav_provider import FilesystemProvider from wsgidav.wsgidav_app import WsgiDAVApp + __docformat__ = "reStructuredText" diff --git a/wsgidav/stream_tools.py b/wsgidav/stream_tools.py index c4f70b3..2fba615 100644 --- a/wsgidav/stream_tools.py +++ b/wsgidav/stream_tools.py @@ -17,9 +17,9 @@ consumer at the same time:: """ from __future__ import print_function - from wsgidav import compat, util + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/util.py b/wsgidav/util.py index 76bba9f..86778e5 100644 --- a/wsgidav/util.py +++ b/wsgidav/util.py @@ -6,6 +6,23 @@ """ Miscellaneous support functions for WsgiDAV. """ +from email.utils import formatdate, parsedate +from hashlib import md5 +from pprint import pformat +from wsgidav import compat +from wsgidav.dav_error import ( + as_DAVError, + DAVError, + get_http_status_string, + HTTP_BAD_REQUEST, + HTTP_CREATED, + HTTP_NO_CONTENT, + HTTP_NOT_MODIFIED, + HTTP_OK, + HTTP_PRECONDITION_FAILED, +) +from wsgidav.xml_tools import etree, is_etree_element, make_sub_element, xml_to_bytes + import base64 import calendar import collections @@ -17,23 +34,7 @@ import socket import stat import sys import time -from email.utils import formatdate, parsedate -from hashlib import md5 -from pprint import pformat -from wsgidav import compat -from wsgidav.dav_error import ( - HTTP_BAD_REQUEST, - HTTP_CREATED, - HTTP_NO_CONTENT, - HTTP_NOT_MODIFIED, - HTTP_OK, - HTTP_PRECONDITION_FAILED, - DAVError, - as_DAVError, - get_http_status_string, -) -from wsgidav.xml_tools import etree, is_etree_element, make_sub_element, xml_to_bytes __docformat__ = "reStructuredText" diff --git a/wsgidav/wsgidav_app.py b/wsgidav/wsgidav_app.py index add168c..f2f908a 100644 --- a/wsgidav/wsgidav_app.py +++ b/wsgidav/wsgidav_app.py @@ -48,13 +48,7 @@ For every request: Note: The OPTIONS method for the '*' path is handled directly. """ -import copy -import inspect -import platform -import sys -import time - -from wsgidav import compat, util, __version__ +from wsgidav import __version__, compat, util from wsgidav.dav_provider import DAVProvider from wsgidav.default_conf import DEFAULT_CONFIG from wsgidav.fs_dav_provider import FilesystemProvider @@ -69,6 +63,13 @@ from wsgidav.util import ( safe_re_encode, ) +import copy +import inspect +import platform +import sys +import time + + __docformat__ = "reStructuredText" _logger = util.get_module_logger(__name__) diff --git a/wsgidav/xml_tools.py b/wsgidav/xml_tools.py index aa79394..6fa8416 100644 --- a/wsgidav/xml_tools.py +++ b/wsgidav/xml_tools.py @@ -8,9 +8,10 @@ Small wrapper for different etree packages. """ # from __future__ import print_function +from wsgidav import compat + import logging -from wsgidav import compat __docformat__ = "reStructuredText"