New Upstream Snapshot - aiohttp-cors

Ready changes

Summary

Merged new upstream version: 0.7.0+git20220103.1.1627c08 (was: 0.7.0).

Resulting package

Built on 2023-01-19T00:21 (took 3m10s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-snapshots python3-aiohttp-cors

Lintian Result

Diff

diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 76419e6..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,53 +0,0 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-/env/
-/build/
-develop-eggs/
-/dist/
-downloads/
-eggs/
-.eggs/
-lib/
-lib64/
-parts/
-sdist/
-var/
-*.egg-info/
-.installed.cfg
-/*.egg
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-/.tox/
-.coverage
-.coverage.*
-/.cache
-nosetests.xml
-coverage.xml
-*,cover
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-geckodriver.log
-.pytest_cache
\ No newline at end of file
diff --git a/.jscs.json b/.jscs.json
deleted file mode 100644
index 73d5fdd..0000000
--- a/.jscs.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-    "requireCurlyBraces": [
-        "if",
-        "else",
-        "for",
-        "while",
-        "do",
-        "try",
-        "catch"
-    ],
-    "requireOperatorBeforeLineBreak": true,
-    "requireCamelCaseOrUpperCaseIdentifiers": true,
-    "maximumLineLength": {
-      "value": 80,
-      "allowComments": true,
-      "allowRegex": true
-    },
-    "validateIndentation": 2,
-    "validateQuoteMarks": "'",
-
-    "disallowMultipleLineStrings": true,
-    "disallowMixedSpacesAndTabs": true,
-    "disallowTrailingWhitespace": true,
-    "disallowSpaceAfterPrefixUnaryOperators": true,
-    "disallowMultipleVarDecl": true,
-
-    "requireSpaceAfterKeywords": [
-      "if",
-      "else",
-      "for",
-      "while",
-      "do",
-      "switch",
-      "return",
-      "try",
-      "catch"
-    ],
-    "requireSpaceBeforeBinaryOperators": [
-        "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=",
-        "&=", "|=", "^=", "+=",
-
-        "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&",
-        "|", "^", "&&", "||", "===", "==", ">=",
-        "<=", "<", ">", "!=", "!=="
-    ],
-    "requireSpaceAfterBinaryOperators": true,
-    "requireSpacesInConditionalExpression": true,
-    "requireSpaceBeforeBlockStatements": true,
-    "requireSpacesInForStatement": true,
-    "requireLineFeedAtFileEnd": true,
-    "requireSpacesInFunctionExpression": {
-        "beforeOpeningCurlyBrace": true
-    },
-    "disallowSpacesInsideObjectBrackets": "all",
-    "disallowSpacesInsideArrayBrackets": "all",
-    "disallowSpacesInsideParentheses": true,
-
-    "disallowMultipleLineBreaks": true,
-    "disallowNewlineBeforeBlockStatements": [
-      "if", "else", "try", "catch", "finally", "do", "while", "for", "function"
-    ]
-}
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644
index a2c474a..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-	"asi": false,
-	"bitwise": false,
-	"boss": false,
-	"browser": true,
-	"camelcase": true,
-	"couch": false,
-	"curly": true,
-	"debug": false,
-	"devel": true,
-	"dojo": false,
-	"eqeqeq": true,
-	"eqnull": true,
-	"es3": true,
-	"esnext": false,
-	"evil": false,
-	"expr": true,
-	"forin": false,
-	"funcscope": true,
-	"globalstrict": false,
-	"immed": true,
-	"iterator": false,
-	"jquery": false,
-	"lastsemic": false,
-	"latedef": false,
-	"laxbreak": true,
-	"laxcomma": false,
-	"loopfunc": true,
-	"mootools": false,
-	"multistr": false,
-	"newcap": true,
-	"noarg": true,
-	"node": false,
-	"noempty": false,
-	"nonew": true,
-	"nonstandard": false,
-	"nomen": false,
-	"onecase": false,
-	"onevar": false,
-	"passfail": false,
-	"plusplus": false,
-	"proto": false,
-	"prototypejs": false,
-	"regexdash": true,
-	"regexp": false,
-	"rhino": false,
-	"undef": true,
-	"unused": "strict",
-	"scripturl": true,
-	"shadow": false,
-	"smarttabs": true,
-	"strict": false,
-	"sub": false,
-	"supernew": false,
-	"trailing": true,
-	"validthis": true,
-	"withstmt": false,
-	"white": true,
-	"worker": false,
-	"wsh": false,
-	"yui": false,
-	"indent": 4,
-	"predef": ["require", "define", "JSON"],
-	"quotmark": "single",
-	"maxcomplexity": 10,
-	"esnext": true
-}
diff --git a/.pep8rc b/.pep8rc
deleted file mode 100644
index dc9adae..0000000
--- a/.pep8rc
+++ /dev/null
@@ -1,7 +0,0 @@
-; TODO: This configuration currently not used in pytest-pep8, see
-; <https://bitbucket.org/pytest-dev/pytest-pep8/issues/11/add-option-to-use-pep8rc-configuration>
-
-[pep8]
-show-source = yes
-statistics = yes
-count = yes
diff --git a/.pylintrc b/.pylintrc
deleted file mode 100644
index 27e8cf7..0000000
--- a/.pylintrc
+++ /dev/null
@@ -1,393 +0,0 @@
-[MASTER]
-
-# Specify a configuration file.
-#rcfile=
-
-# Python code to execute, usually for sys.path manipulation such as
-# pygtk.require().
-#init-hook=
-
-# Profiled execution.
-profile=no
-
-# Add files or directories to the blacklist. They should be base names, not
-# paths.
-ignore=
-
-# Pickle collected data for later comparisons.
-persistent=yes
-
-# List of plugins (as comma separated values of python modules names) to load,
-# usually to register additional checkers.
-load-plugins=
-
-# Deprecated. It was used to include message's id in output. Use --msg-template
-# instead.
-#include-ids=no
-
-# Deprecated. It was used to include symbolic ids of messages in output. Use
-# --msg-template instead.
-#symbols=no
-
-# Use multiple processes to speed up Pylint.
-jobs=1
-
-# Allow loading of arbitrary C extensions. Extensions are imported into the
-# active Python interpreter and may run arbitrary code.
-unsafe-load-any-extension=no
-
-# A comma-separated list of package or module names from where C extensions may
-# be loaded. Extensions are loading into the active Python interpreter and may
-# run arbitrary code
-extension-pkg-whitelist=
-
-# Allow optimization of some AST trees. This will activate a peephole AST
-# optimizer, which will apply various small optimizations. For instance, it can
-# be used to obtain the result of joining multiple strings with the addition
-# operator. Joining a lot of strings can lead to a maximum recursion error in
-# Pylint and this flag can prevent that. It has one side effect, the resulting
-# AST will be different than the one from reality.
-optimize-ast=no
-
-
-[MESSAGES CONTROL]
-
-# Only show warnings with the listed confidence levels. Leave empty to show
-# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
-confidence=
-
-# Enable the message, report, category or checker with the given id(s). You can
-# either give multiple identifier separated by comma (,) or put this option
-# multiple time. See also the "--disable" option for examples.
-#enable=
-
-# Disable the message, report, category or checker with the given id(s). You
-# can either give multiple identifiers separated by comma (,) or put this
-# option multiple times (only on the command line, not in the configuration
-# file where it should appear only once).You can also use "--disable=all" to
-# disable everything first and then reenable specific checks. For example, if
-# you want to run only the similarities checker, you can use "--disable=all
-# --enable=similarities". If you want to run only the classes checker, but have
-# no Warning level messages displayed, use"--disable=all --enable=classes
-# --disable=W"
-disable=E1604,W1629,W1605,I0020,W1609,W1615,W1610,W1618,W1608,W1622,W1640,E1603,W1635,W1636,W1634,W1628,W1614,E1601,W1601,I0021,E1605,W1611,W1612,W1619,W1616,W1638,W1626,W1630,W1607,E1602,W1623,W1613,W1606,W1625,W0704,W1639,W1603,W1632,E1606,W1602,W1637,W1624,W1620,E1608,W1627,E1607,W1633,W1604,W1617,W1621
-
-
-[REPORTS]
-
-# Set the output format. Available formats are text, parseable, colorized, msvs
-# (visual studio) and html. You can also give a reporter class, eg
-# mypackage.mymodule.MyReporterClass.
-output-format=text
-
-# Put messages in a separate file for each module / package specified on the
-# command line instead of printing them on stdout. Reports (if any) will be
-# written in a file name "pylint_global.[txt|html]".
-files-output=no
-
-# Tells whether to display a full report or only the messages
-reports=yes
-
-# Python expression which should return a note less than 10 (10 is the highest
-# note). You have access to the variables errors warning, statement which
-# respectively contain the number of errors / warnings messages and the total
-# number of statements analyzed. This is used by the global evaluation report
-# (RP0004).
-evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
-
-# Add a comment according to your evaluation note. This is used by the global
-# evaluation report (RP0004).
-comment=no
-
-# Template used to display messages. This is a python new-style format string
-# used to format the message information. See doc for all details.
-# Path/line on separate added to allow IDE to parse error messages and
-# provide interactive link on the place of the error.
-msg-template={path}:{line}:
-    {C}:{msg_id}:{line:3d},{column:2d}: {msg} ({symbol})
-
-
-[LOGGING]
-
-# Logging modules to check that the string format arguments are in logging
-# function parameter format
-logging-modules=logging
-
-
-[FORMAT]
-
-# Maximum number of characters on a single line.
-max-line-length=100
-
-# Regexp for a line that is allowed to be longer than the limit.
-ignore-long-lines=^\s*(# )?<?https?://\S+>?$
-
-# Allow the body of an if to be on the same line as the test if there is no
-# else.
-single-line-if-stmt=no
-
-# List of optional constructs for which whitespace checking is disabled
-no-space-check=trailing-comma,dict-separator
-
-# Maximum number of lines in a module
-max-module-lines=1000
-
-# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
-# tab).
-indent-string='    '
-
-# Number of spaces of indent required inside a hanging or continued line.
-indent-after-paren=4
-
-# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
-expected-line-ending-format=
-
-
-[MISCELLANEOUS]
-
-# List of note tags to take in consideration, separated by a comma.
-notes=FIXME,XXX,TODO
-
-
-[VARIABLES]
-
-# Tells whether we should check for unused import in __init__ files.
-init-import=no
-
-# A regular expression matching the name of dummy variables (i.e. expectedly
-# not used).
-dummy-variables-rgx=_$|dummy
-
-# List of additional names supposed to be defined in builtins. Remember that
-# you should avoid to define new builtins when possible.
-additional-builtins=
-
-# List of strings which can identify a callback function by name. A callback
-# name must start or end with one of those strings.
-callbacks=cb_,_cb
-
-
-[BASIC]
-
-# Required attributes for module, separated by a comma
-required-attributes=
-
-# List of builtins function names that should not be used, separated by a comma
-bad-functions=map,filter
-
-# Good variable names which should always be accepted, separated by a comma
-good-names=i,j,k,ex,Run,_
-
-# Bad variable names which should always be refused, separated by a comma
-bad-names=foo,bar,baz,toto,tutu,tata
-
-# Colon-delimited sets of names that determine each other's naming style when
-# the name regexes allow several styles.
-name-group=
-
-# Include a hint for the correct naming format with invalid-name
-include-naming-hint=no
-
-# Regular expression matching correct module names
-module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
-
-# Naming hint for module names
-module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
-
-# Regular expression matching correct method names
-method-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Naming hint for method names
-method-name-hint=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression matching correct class attribute names
-class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
-
-# Naming hint for class attribute names
-class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
-
-# Regular expression matching correct class names
-class-rgx=[A-Z_][a-zA-Z0-9]+$
-
-# Naming hint for class names
-class-name-hint=[A-Z_][a-zA-Z0-9]+$
-
-# Regular expression matching correct function names
-function-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Naming hint for function names
-function-name-hint=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression matching correct inline iteration names
-inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
-
-# Naming hint for inline iteration names
-inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
-
-# Regular expression matching correct constant names
-const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
-
-# Naming hint for constant names
-const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
-
-# Regular expression matching correct argument names
-argument-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Naming hint for argument names
-argument-name-hint=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression matching correct attribute names
-attr-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Naming hint for attribute names
-attr-name-hint=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression matching correct variable names
-variable-rgx=[a-z_][a-z0-9_]{2,30}$
-
-# Naming hint for variable names
-variable-name-hint=[a-z_][a-z0-9_]{2,30}$
-
-# Regular expression which should only match function or class names that do
-# not require a docstring.
-no-docstring-rgx=__.*__
-
-# Minimum line length for functions/classes that require docstrings, shorter
-# ones are exempt.
-docstring-min-length=-1
-
-
-[TYPECHECK]
-
-# Tells whether missing members accessed in mixin class should be ignored. A
-# mixin class is detected if its name ends with "mixin" (case insensitive).
-ignore-mixin-members=yes
-
-# List of module names for which member attributes should not be checked
-# (useful for modules/projects where namespaces are manipulated during runtime
-# and thus existing member attributes cannot be deduced by static analysis
-ignored-modules=
-
-# List of classes names for which member attributes should not be checked
-# (useful for classes with attributes dynamically set).
-ignored-classes=SQLObject
-
-# When zope mode is activated, add a predefined set of Zope acquired attributes
-# to generated-members.
-zope=no
-
-# List of members which are set dynamically and missed by pylint inference
-# system, and so shouldn't trigger E0201 when accessed. Python regular
-# expressions are accepted.
-generated-members=REQUEST,acl_users,aq_parent
-
-
-[SPELLING]
-
-# Spelling dictionary name. Available dictionaries: none. To make it working
-# install python-enchant package.
-spelling-dict=
-
-# List of comma separated words that should not be checked.
-spelling-ignore-words=
-
-# A path to a file that contains private dictionary; one word per line.
-spelling-private-dict-file=
-
-# Tells whether to store unknown words to indicated private dictionary in
-# --spelling-private-dict-file option instead of raising a message.
-spelling-store-unknown-words=no
-
-
-[SIMILARITIES]
-
-# Minimum lines number of a similarity.
-min-similarity-lines=4
-
-# Ignore comments when computing similarities.
-ignore-comments=yes
-
-# Ignore docstrings when computing similarities.
-ignore-docstrings=yes
-
-# Ignore imports when computing similarities.
-ignore-imports=no
-
-
-[IMPORTS]
-
-# Deprecated modules which should not be used, separated by a comma
-deprecated-modules=stringprep,optparse
-
-# Create a graph of every (i.e. internal and external) dependencies in the
-# given file (report RP0402 must not be disabled)
-import-graph=
-
-# Create a graph of external dependencies in the given file (report RP0402 must
-# not be disabled)
-ext-import-graph=
-
-# Create a graph of internal dependencies in the given file (report RP0402 must
-# not be disabled)
-int-import-graph=
-
-
-[CLASSES]
-
-# List of interface methods to ignore, separated by a comma. This is used for
-# instance to not check methods defines in Zope's Interface base class.
-ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
-
-# List of method names used to declare (i.e. assign) instance attributes.
-defining-attr-methods=__init__,__new__,setUp
-
-# List of valid names for the first argument in a class method.
-valid-classmethod-first-arg=cls
-
-# List of valid names for the first argument in a metaclass class method.
-valid-metaclass-classmethod-first-arg=mcs
-
-# List of member names, which should be excluded from the protected access
-# warning.
-exclude-protected=_asdict,_fields,_replace,_source,_make
-
-
-[DESIGN]
-
-# Maximum number of arguments for function / method
-max-args=5
-
-# Argument names that match this expression will be ignored. Default to name
-# with leading underscore
-ignored-argument-names=_.*
-
-# Maximum number of locals for function / method body
-max-locals=15
-
-# Maximum number of return / yield for function / method body
-max-returns=6
-
-# Maximum number of branch for function / method body
-max-branches=12
-
-# Maximum number of statements in function / method body
-max-statements=50
-
-# Maximum number of parents for a class (see R0901).
-max-parents=7
-
-# Maximum number of attributes for a class (see R0902).
-max-attributes=7
-
-# Minimum number of public methods for a class (see R0903).
-min-public-methods=2
-
-# Maximum number of public methods for a class (see R0904).
-max-public-methods=20
-
-
-[EXCEPTIONS]
-
-# Exceptions that will emit a warning when being caught. Defaults to
-# "Exception"
-overgeneral-exceptions=Exception
diff --git a/.pyup.yml b/.pyup.yml
deleted file mode 100644
index 75f9711..0000000
--- a/.pyup.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-# Label PRs with `deps-update` label
-label_prs: deps-update
-
-schedule: every week
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3120baf..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-language: python
-python:
-- 3.5
-- 3.6
-
-# TODO: Use Travis apt addon, when chromium-chromedriver will be supported
-# three: https://github.com/travis-ci/apt-package-whitelist/issues/574
-before_install:
-  - sudo apt-get -qq update
-  - sudo apt-get install -y chromium-browser chromium-chromedriver
-
-install:
-- pip install --upgrade pip setuptools wheel
-- pip install -Ur requirements-dev.txt
-- pip install codecov
-
-before_script:
-  # Start X-server for Selenium tests.
-  - "export DISPLAY=:99.0"
-  - "sh -e /etc/init.d/xvfb start"
-  - sleep 3 # give xvfb some time to start
-
-script:
-- '[ "$TYPE" != "test" ] || python setup.py test --addopts -v --addopts -s'
-- '[ "$TYPE" != "lint" ] || python setup.py check -rms'
-
-after_success:
-  codecov
-
-env:
-  global:
-  - WEBDRIVER_CHROMEDRIVER_PATH=/usr/lib/chromium-browser/chromedriver
-  matrix:
-  # PYTHONASYNCIODEBUG environment variable is considered as enabled if it
-  # is any non empty string.
-  - TYPE=test
-
-matrix:
-  include:
-  # Environment to deploy project on PyPI.
-  - python: "3.5"
-    env: DEPLOY_ENV=1
-
-  - python: "3.5"
-    env: TYPE=lint
-
-# Deploy on PyPI all tagged build on master branch.
-deploy:
-  provider: pypi
-  user: aiohttp-cors-deploy
-  password:
-    secure: KViGT/W2vWRWZkV5bZYLiI3v/qXVRGEFAs8G1OMx/OhLvHTj8vO6pZ+hlzLi9zTnBTVHG2xEOrwtjiuHxpJMcDPAul3rn0fwSXy9BRDAeR7B7RIlvLxegMRTnWtsj5x8/VkqQDrPW5YWmuXFb4tDJ+LEkadUrkF9YhJvtUnSQcEOOHVvJa4DekMhZEVM8AKA+7AT9FibWZbJ5s8bTjLke77/eyX7+1DdgC7G++ZesK2HKS1vlM7fN+cWPyUFofXwcEc42rwQwJ5FY2saqTvPN5GBOMpXdaBUmSyYT64447TVFoINbAFuCa3tUeY7ZQpC6B8bHVqEGq+UAujUGU7uhid29CHV03PTFeupTZRscVDkL+IEUjK6Ft+x/B9eStVpKh9d5Yh8INZkdoHVmybJo62k/YHwxAu7ftG+q1bUAHwgKkukXa+ZpmSD2v6BggVUBS6qFwv6tnKpuI0jRsneEUXPmJVUHpv6lPzVRPW/lQDZqxUvESz9w9mitwBiMA7q8jyL9w4zJVKAETjo6llWGQ2wOLjaz3LwuQ8vDOKfWOdvk78W8Usw5amkp2invyidU/2+Y1hlekRuhaMEaUdd4GPmP8beOh7CEXJr5bD3QjbqOpOMi+d+3rYVR0NZMWxawgtUGMBb/8DUNq4sD4Na5G3sGSy+rHMtDAuMOOUlLoU=
-  distributions: sdist bdist_wheel
-  on:
-    tags: true
-    branch: master
-    condition: $DEPLOY_ENV = 1
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 2f8e8eb..0000000
--- a/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-all: test
-
-
-flake:
-	flake8 aiohttp_cors tests setup.py
-
-test: flake
-	pytest tests
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..5cac2d2
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,636 @@
+Metadata-Version: 2.1
+Name: aiohttp-cors
+Version: 0.7.0
+Summary: CORS support for aiohttp
+Home-page: https://github.com/aio-libs/aiohttp-cors
+Author: Vladimir Rutsky and aio-libs team
+Author-email: vladimir@rutsky.org
+License: Apache License, Version 2.0
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Framework :: AsyncIO
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Development Status :: 3 - Alpha
+License-File: LICENSE
+
+========================
+CORS support for aiohttp
+========================
+
+``aiohttp_cors`` library implements
+`Cross Origin Resource Sharing (CORS) <cors_>`__
+support for `aiohttp <aiohttp_>`__
+asyncio-powered asynchronous HTTP server.
+
+Jump directly to `Usage`_ part to see how to use ``aiohttp_cors``.
+
+Same-origin policy
+==================
+
+Web security model is tightly connected to
+`Same-origin policy (SOP) <sop_>`__.
+In short: web pages cannot *Read* resources which origin
+doesn't match origin of requested page, but can *Embed* (or *Execute*)
+resources and have limited ability to *Write* resources.
+
+Origin of a page is defined in the `Standard <cors_>`__ as tuple
+``(schema, host, port)``
+(there is a notable exception with Internet Explorer: it doesn't use port to
+define origin, but uses it's own
+`Security Zones <https://msdn.microsoft.com/en-us/library/ms537183.aspx>`__).
+
+Can *Embed* means that resource from other origin can be embedded into
+the page,
+e.g. by using ``<script src="...">``, ``<img src="...">``,
+``<iframe src="...">``.
+
+Cannot *Read* means that resource from other origin *source* cannot be
+obtained by page
+(*source* — any information that would allow to reconstruct resource).
+E.g. the page can *Embed* image with ``<img src="...">``,
+but it can't get information about specific pixels, so page can't reconstruct
+original image
+(though some information from the other resource may still be leaked:
+e.g. the page can read embedded image dimensions).
+
+Limited ability to *Write* means, that the page can send POST requests to
+other origin with limited set of ``Content-Type`` values and headers.
+
+Restriction to *Read* resource from other origin is related to authentication
+mechanism that is used by browsers:
+when browser reads (downloads) resource he automatically sends all security
+credentials that user previously authorized for that resource
+(e.g. cookies, HTTP Basic Authentication).
+
+For example, if *Read* would be allowed and user is authenticated
+in some internet banking,
+malicious page would be able to embed internet banking page with ``iframe``
+(since authentication is done by the browser it may be embedded as if
+user is directly navigated to internet banking page),
+then read user private information by reading *source* of the embedded page
+(which may be not only source code, but, for example,
+screenshot of the embedded internet banking page).
+
+Cross-origin resource sharing
+=============================
+
+`Cross-origin Resource Sharing (CORS) <cors_>`__ allows to override
+SOP for specific resources.
+
+In short, CORS works in the following way.
+
+When page ``https://client.example.com`` request (*Read*) resource
+``https://server.example.com/resource`` that have other origin,
+browser implicitly appends ``Origin: https://client.example.com`` header
+to the HTTP request,
+effectively requesting server to give read permission for
+the resource to the ``https://client.example.com`` page::
+
+    GET /resource HTTP/1.1
+    Origin: https://client.example.com
+    Host: server.example.com
+
+If server allows access from the page to the resource, it responds with
+resource with ``Access-Control-Allow-Origin: https://client.example.com``
+HTTP header
+(optionally allowing exposing custom server headers to the page and
+enabling use of the user credentials on the server resource)::
+
+    Access-Control-Allow-Origin: https://client.example.com
+    Access-Control-Allow-Credentials: true
+    Access-Control-Expose-Headers: X-Server-Header
+
+Browser checks, if server responded with proper
+``Access-Control-Allow-Origin`` header and accordingly allows or denies
+access for the obtained resource to the page.
+
+CORS specification designed in a way that servers that are not aware
+of CORS will not expose any additional information, except allowed by the
+SOP.
+
+To request resources with custom headers or using custom HTTP methods
+(e.g. ``PUT``, ``DELETE``) that are not allowed by SOP,
+CORS-enabled browser first send *preflight request* to the
+resource using ``OPTIONS`` method, in which he queries access to the resource
+with specific method and headers::
+
+    OPTIONS / HTTP/1.1
+    Origin: https://client.example.com
+    Access-Control-Request-Method: PUT
+    Access-Control-Request-Headers: X-Client-Header
+
+CORS-enabled server responds is requested method is allowed and which of
+the specified headers are allowed::
+
+    Access-Control-Allow-Origin: https://client.example.com
+    Access-Control-Allow-Credentials: true
+    Access-Control-Allow-Methods: PUT
+    Access-Control-Allow-Headers: X-Client-Header
+    Access-Control-Max-Age: 3600
+
+Browser checks response to preflight request, and, if actual request allowed,
+does actual request.
+
+Installation
+============
+
+You can install ``aiohttp_cors`` as a typical Python library from PyPI or
+from git:
+
+.. code-block:: bash
+
+    $ pip install aiohttp_cors
+
+Note that ``aiohttp_cors`` requires versions of Python >= 3.4.1 and
+``aiohttp`` >= 1.1.
+
+Usage
+=====
+
+To use ``aiohttp_cors`` you need to configure the application and
+enable CORS on
+`resources and routes <https://aiohttp.readthedocs.org/en/stable/web.html#resources-and-routes>`__
+that you want to expose:
+
+.. code-block:: python
+
+    import asyncio
+    from aiohttp import web
+    import aiohttp_cors
+
+    @asyncio.coroutine
+    def handler(request):
+        return web.Response(
+            text="Hello!",
+            headers={
+                "X-Custom-Server-Header": "Custom data",
+            })
+
+    app = web.Application()
+
+    # `aiohttp_cors.setup` returns `aiohttp_cors.CorsConfig` instance.
+    # The `cors` instance will store CORS configuration for the
+    # application.
+    cors = aiohttp_cors.setup(app)
+
+    # To enable CORS processing for specific route you need to add
+    # that route to the CORS configuration object and specify its
+    # CORS options.
+    resource = cors.add(app.router.add_resource("/hello"))
+    route = cors.add(
+        resource.add_route("GET", handler), {
+            "http://client.example.org": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers=("X-Custom-Server-Header",),
+                allow_headers=("X-Requested-With", "Content-Type"),
+                max_age=3600,
+            )
+        })
+
+Each route has it's own CORS configuration passed in ``CorsConfig.add()``
+method.
+
+CORS configuration is a mapping from origins to options for that origins.
+
+In the example above CORS is configured for the resource under path ``/hello``
+and HTTP method ``GET``, and in the context of CORS:
+
+* This resource will be available using CORS only to
+  ``http://client.example.org`` origin.
+
+* Passing of credentials to this resource will be allowed.
+
+* The resource will expose to the client ``X-Custom-Server-Header``
+  server header.
+
+* The client will be allowed to pass ``X-Requested-With`` and
+  ``Content-Type`` headers to the server.
+
+* Preflight requests will be allowed to be cached by client for ``3600``
+  seconds.
+
+Resource will be available only to the explicitly specified origins.
+You can specify "all other origins" using special ``*`` origin:
+
+.. code-block:: python
+
+    cors.add(route, {
+            "*":
+                aiohttp_cors.ResourceOptions(allow_credentials=False),
+            "http://client.example.org":
+                aiohttp_cors.ResourceOptions(allow_credentials=True),
+        })
+
+Here the resource specified by ``route`` will be available to all origins with
+disallowed credentials passing, and with allowed credentials passing only to
+``http://client.example.org``.
+
+By default ``ResourceOptions`` will be constructed without any allowed CORS
+options.
+This means, that resource will be available using CORS to specified origin,
+but client will not be allowed to send either credentials,
+or send non-simple headers, or read from server non-simple headers.
+
+To enable sending or receiving all headers you can specify special value
+``*`` instead of sequence of headers:
+
+.. code-block:: python
+
+    cors.add(route, {
+            "http://client.example.org":
+                aiohttp_cors.ResourceOptions(
+                    expose_headers="*",
+                    allow_headers="*"),
+        })
+
+You can specify default CORS-enabled resource options using
+``aiohttp_cors.setup()``'s ``defaults`` argument:
+
+.. code-block:: python
+
+    cors = aiohttp_cors.setup(app, defaults={
+            # Allow all to read all CORS-enabled resources from
+            # http://client.example.org.
+            "http://client.example.org": aiohttp_cors.ResourceOptions(),
+        })
+
+    # Enable CORS on routes.
+
+    # According to defaults POST and PUT will be available only to
+    # "http://client.example.org".
+    hello_resource = cors.add(app.router.add_resource("/hello"))
+    cors.add(hello_resource.add_route("POST", handler_post))
+    cors.add(hello_resource.add_route("PUT", handler_put))
+
+    # In addition to "http://client.example.org", GET request will be
+    # allowed from "http://other-client.example.org" origin.
+    cors.add(hello_resource.add_route("GET", handler), {
+            "http://other-client.example.org":
+                aiohttp_cors.ResourceOptions(),
+        })
+
+    # CORS will be enabled only on the resources added to `CorsConfig`,
+    # so following resource will be NOT CORS-enabled.
+    app.router.add_route("GET", "/private", handler)
+
+Also you can specify default options for resources:
+
+.. code-block:: python
+
+    # Allow POST and PUT requests from "http://client.example.org" origin.
+    hello_resource = cors.add(app.router.add_resource("/hello"), {
+            "http://client.example.org": aiohttp_cors.ResourceOptions(),
+        })
+    cors.add(hello_resource.add_route("POST", handler_post))
+    cors.add(hello_resource.add_route("PUT", handler_put))
+
+Resource CORS configuration allows to use ``allow_methods`` option that
+explicitly specifies list of allowed HTTP methods for origin
+(or ``*`` for all HTTP methods).
+By using this option it is not required to add all resource routes to
+CORS configuration object:
+
+.. code-block:: python
+
+    # Allow POST and PUT requests from "http://client.example.org" origin.
+    hello_resource = cors.add(app.router.add_resource("/hello"), {
+            "http://client.example.org":
+                aiohttp_cors.ResourceOptions(allow_methods=["POST", "PUT"]),
+        })
+    # No need to add POST and PUT routes into CORS configuration object.
+    hello_resource.add_route("POST", handler_post)
+    hello_resource.add_route("PUT", handler_put)
+    # Still you can add additional methods to CORS configuration object:
+    cors.add(hello_resource.add_route("DELETE", handler_delete))
+
+Here is an example of how to enable CORS for all origins with all CORS
+features:
+
+.. code-block:: python
+
+    cors = aiohttp_cors.setup(app, defaults={
+        "*": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers="*",
+                allow_headers="*",
+            )
+    })
+
+    # Add all resources to `CorsConfig`.
+    resource = cors.add(app.router.add_resource("/hello"))
+    cors.add(resource.add_route("GET", handler_get))
+    cors.add(resource.add_route("PUT", handler_put))
+    cors.add(resource.add_route("POST", handler_put))
+    cors.add(resource.add_route("DELETE", handler_delete))
+
+Old routes API is supported — you can use ``router.add_router`` and
+``router.register_route`` as before, though this usage is discouraged:
+
+.. code-block:: python
+
+    cors.add(
+        app.router.add_route("GET", "/hello", handler), {
+            "http://client.example.org": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers=("X-Custom-Server-Header",),
+                allow_headers=("X-Requested-With", "Content-Type"),
+                max_age=3600,
+            )
+        })
+
+You can enable CORS for all added routes by accessing routes list
+in the router:
+
+.. code-block:: python
+
+    # Setup application routes.
+    app.router.add_route("GET", "/hello", handler_get)
+    app.router.add_route("PUT", "/hello", handler_put)
+    app.router.add_route("POST", "/hello", handler_put)
+    app.router.add_route("DELETE", "/hello", handler_delete)
+
+    # Configure default CORS settings.
+    cors = aiohttp_cors.setup(app, defaults={
+        "*": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers="*",
+                allow_headers="*",
+            )
+    })
+
+    # Configure CORS on all routes.
+    for route in list(app.router.routes()):
+        cors.add(route)
+
+You can also use ``CorsViewMixin`` on ``web.View``:
+
+.. code-block:: python
+
+    class CorsView(web.View, CorsViewMixin):
+
+        cors_config = {
+            "*": ResourceOption(
+                allow_credentials=True,
+                allow_headers="X-Request-ID",
+            )
+        }
+
+        @asyncio.coroutine
+        def get(self):
+            return web.Response(text="Done")
+
+        @custom_cors({
+            "*": ResourceOption(
+                allow_credentials=True,
+                allow_headers="*",
+            )
+        })
+        @asyncio.coroutine
+        def post(self):
+            return web.Response(text="Done")
+
+    cors = aiohttp_cors.setup(app, defaults={
+        "*": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers="*",
+                allow_headers="*",
+            )
+    })
+
+    cors.add(
+        app.router.add_route("*", "/resource", CorsView),
+        webview=True)
+
+
+Security
+========
+
+TODO: fill this
+
+Development
+===========
+
+To setup development environment:
+
+.. code-block:: bash
+
+   # Clone sources repository:
+   git clone https://github.com/aio-libs/aiohttp_cors.git .
+   # Create and activate virtual Python environment:
+   python3 -m venv env
+   source env/bin/activate
+   # Install requirements and aiohttp_cors into virtual environment
+   pip install -r requirements-dev.txt
+
+To run tests:
+
+.. code-block:: bash
+
+   tox
+
+To run only runtime tests in current environment:
+
+.. code-block:: bash
+
+   py.test
+
+To run only static code analysis checks:
+
+.. code-block:: bash
+
+   tox -e check
+
+Running Selenium tests
+----------------------
+
+To run Selenium tests with Firefox web driver you need to install Firefox.
+
+To run Selenium tests with Chromium web driver you need to:
+
+1. Install Chrome driver. On Ubuntu 14.04 it's in ``chromium-chromedriver``
+   package.
+
+2. Either add ``chromedriver`` to PATH or set ``WEBDRIVER_CHROMEDRIVER_PATH``
+   environment variable to ``chromedriver``, e.g. on Ubuntu 14.04
+   ``WEBDRIVER_CHROMEDRIVER_PATH=/usr/lib/chromium-browser/chromedriver``.
+
+Release process
+---------------
+
+To release version ``vA.B.C`` from the current version of ``master`` branch
+you need to:
+
+1. Create local branch ``vA.B.C``.
+2. In ``CHANGES.rst`` set release date to today.
+3. In ``aiohttp_cors/__about__.py`` change version from ``A.B.Ca0`` to
+   ``A.B.C``.
+4. Create pull request with ``vA.B.C`` branch, wait for all checks to
+   successfully finish (Travis and Appveyor).
+5. Merge pull request to master.
+6. Update and checkout ``master`` branch.
+
+7. Create and push tag for release version to GitHub:
+
+   .. code-block:: bash
+
+      git tag vA.B.C
+      git push --tags
+
+   Now Travis should ran tests again, and build and deploy wheel on PyPI.
+
+   If Travis release doesn't work for some reason, use following steps
+   for manual release upload.
+
+   1. Install fresh versions of setuptools and pip.
+      Install ``wheel`` for building wheels.
+      Install ``twine`` for uploading to PyPI.
+
+      .. code-block:: bash
+
+         pip install -U pip setuptools twine wheel
+
+   2. Configure PyPI credentials in ``~/.pypirc``.
+
+   3. Build distribution:
+
+      .. code-block:: bash
+
+         rm -rf build dist; python setup.py sdist bdist_wheel
+
+   4. Upload new release to PyPI:
+
+      .. code-block:: bash
+
+         twine upload dist/*
+
+8. Edit release description on GitHub if needed.
+9. Announce new release on the *aio-libs* mailing list:
+   https://groups.google.com/forum/#!forum/aio-libs.
+
+Post release steps:
+
+1. In ``CHANGES.rst`` add template for the next release.
+2. In ``aiohttp_cors/__about__.py`` change version from ``A.B.C`` to
+   ``A.(B + 1).0a0``.
+
+Bugs
+====
+
+Please report bugs, issues, feature requests, etc. on
+`GitHub <https://github.com/aio-libs/aiohttp_cors/issues>`__.
+
+
+License
+=======
+
+Copyright 2015 Vladimir Rutsky <vladimir@rutsky.org>.
+
+Licensed under the
+`Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>`__,
+see ``LICENSE`` file for details.
+
+.. _cors: http://www.w3.org/TR/cors/
+.. _aiohttp: https://github.com/KeepSafe/aiohttp/
+.. _sop: https://en.wikipedia.org/wiki/Same-origin_policy
+
+
+=========
+ CHANGES
+=========
+
+0.7.0 (2018-03-05)
+==================
+
+- Make web view check implicit and type based (#159)
+
+- Disable Python 3.4 support (#156)
+
+- Support aiohttp 3.0+ (#155)
+
+0.6.0 (2017-12-21)
+==================
+
+- Support aiohttp views by ``CorsViewMixin`` (#145)
+
+0.5.3 (2017-04-21)
+==================
+
+- Fix ``typing`` being installed on Python 3.6.
+
+0.5.2 (2017-03-28)
+==================
+
+- Fix tests compatibility with ``aiohttp`` 2.0.
+  This release and release v0.5.0 should work on ``aiohttp`` 2.0.
+
+
+0.5.1 (2017-03-23)
+==================
+
+- Enforce ``aiohttp`` version to be less than 2.0.
+  Newer ``aiohttp`` releases will be supported in the next release.
+
+0.5.0 (2016-11-18)
+==================
+
+- Fix compatibility with ``aiohttp`` 1.1
+
+
+0.4.0 (2016-04-04)
+==================
+
+- Fixed support with new Resources objects introduced in ``aiohttp`` 0.21.0.
+  Minimum supported version of ``aiohttp`` is 0.21.4 now.
+
+- New Resources objects are supported.
+  You can specify default configuration for a Resource and use
+  ``allow_methods`` to explicitly list allowed methods (or ``*`` for all
+  HTTP methods):
+
+  .. code-block:: python
+
+        # Allow POST and PUT requests from "http://client.example.org" origin.
+        hello_resource = cors.add(app.router.add_resource("/hello"), {
+                "http://client.example.org":
+                    aiohttp_cors.ResourceOptions(
+                        allow_methods=["POST", "PUT"]),
+            })
+        # No need to add POST and PUT routes into CORS configuration object.
+        hello_resource.add_route("POST", handler_post)
+        hello_resource.add_route("PUT", handler_put)
+        # Still you can add additional methods to CORS configuration object:
+        cors.add(hello_resource.add_route("DELETE", handler_delete))
+
+- ``AbstractRouterAdapter`` was completely rewritten to be more Router
+  agnostic.
+
+0.3.0 (2016-02-06)
+==================
+
+- Rename ``UrlDistatcherRouterAdapter`` to ``UrlDispatcherRouterAdapter``.
+
+- Set maximum supported ``aiohttp`` version to ``0.20.2``, see bug #30 for
+  details.
+
+0.2.0 (2015-11-30)
+==================
+
+- Move ABCs from ``aiohttp_cors.router_adapter`` to ``aiohttp_cors.abc``.
+
+- Rename ``RouterAdapter`` to ``AbstractRouterAdapter``.
+
+- Fix bug with configuring CORS for named routes.
+
+0.1.0 (2015-11-05)
+==================
+
+* Initial release.
diff --git a/aiohttp_cors.egg-info/PKG-INFO b/aiohttp_cors.egg-info/PKG-INFO
new file mode 100644
index 0000000..5cac2d2
--- /dev/null
+++ b/aiohttp_cors.egg-info/PKG-INFO
@@ -0,0 +1,636 @@
+Metadata-Version: 2.1
+Name: aiohttp-cors
+Version: 0.7.0
+Summary: CORS support for aiohttp
+Home-page: https://github.com/aio-libs/aiohttp-cors
+Author: Vladimir Rutsky and aio-libs team
+Author-email: vladimir@rutsky.org
+License: Apache License, Version 2.0
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Intended Audience :: Developers
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 3
+Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.5
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Topic :: Internet :: WWW/HTTP
+Classifier: Framework :: AsyncIO
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Development Status :: 3 - Alpha
+License-File: LICENSE
+
+========================
+CORS support for aiohttp
+========================
+
+``aiohttp_cors`` library implements
+`Cross Origin Resource Sharing (CORS) <cors_>`__
+support for `aiohttp <aiohttp_>`__
+asyncio-powered asynchronous HTTP server.
+
+Jump directly to `Usage`_ part to see how to use ``aiohttp_cors``.
+
+Same-origin policy
+==================
+
+Web security model is tightly connected to
+`Same-origin policy (SOP) <sop_>`__.
+In short: web pages cannot *Read* resources which origin
+doesn't match origin of requested page, but can *Embed* (or *Execute*)
+resources and have limited ability to *Write* resources.
+
+Origin of a page is defined in the `Standard <cors_>`__ as tuple
+``(schema, host, port)``
+(there is a notable exception with Internet Explorer: it doesn't use port to
+define origin, but uses it's own
+`Security Zones <https://msdn.microsoft.com/en-us/library/ms537183.aspx>`__).
+
+Can *Embed* means that resource from other origin can be embedded into
+the page,
+e.g. by using ``<script src="...">``, ``<img src="...">``,
+``<iframe src="...">``.
+
+Cannot *Read* means that resource from other origin *source* cannot be
+obtained by page
+(*source* — any information that would allow to reconstruct resource).
+E.g. the page can *Embed* image with ``<img src="...">``,
+but it can't get information about specific pixels, so page can't reconstruct
+original image
+(though some information from the other resource may still be leaked:
+e.g. the page can read embedded image dimensions).
+
+Limited ability to *Write* means, that the page can send POST requests to
+other origin with limited set of ``Content-Type`` values and headers.
+
+Restriction to *Read* resource from other origin is related to authentication
+mechanism that is used by browsers:
+when browser reads (downloads) resource he automatically sends all security
+credentials that user previously authorized for that resource
+(e.g. cookies, HTTP Basic Authentication).
+
+For example, if *Read* would be allowed and user is authenticated
+in some internet banking,
+malicious page would be able to embed internet banking page with ``iframe``
+(since authentication is done by the browser it may be embedded as if
+user is directly navigated to internet banking page),
+then read user private information by reading *source* of the embedded page
+(which may be not only source code, but, for example,
+screenshot of the embedded internet banking page).
+
+Cross-origin resource sharing
+=============================
+
+`Cross-origin Resource Sharing (CORS) <cors_>`__ allows to override
+SOP for specific resources.
+
+In short, CORS works in the following way.
+
+When page ``https://client.example.com`` request (*Read*) resource
+``https://server.example.com/resource`` that have other origin,
+browser implicitly appends ``Origin: https://client.example.com`` header
+to the HTTP request,
+effectively requesting server to give read permission for
+the resource to the ``https://client.example.com`` page::
+
+    GET /resource HTTP/1.1
+    Origin: https://client.example.com
+    Host: server.example.com
+
+If server allows access from the page to the resource, it responds with
+resource with ``Access-Control-Allow-Origin: https://client.example.com``
+HTTP header
+(optionally allowing exposing custom server headers to the page and
+enabling use of the user credentials on the server resource)::
+
+    Access-Control-Allow-Origin: https://client.example.com
+    Access-Control-Allow-Credentials: true
+    Access-Control-Expose-Headers: X-Server-Header
+
+Browser checks, if server responded with proper
+``Access-Control-Allow-Origin`` header and accordingly allows or denies
+access for the obtained resource to the page.
+
+CORS specification designed in a way that servers that are not aware
+of CORS will not expose any additional information, except allowed by the
+SOP.
+
+To request resources with custom headers or using custom HTTP methods
+(e.g. ``PUT``, ``DELETE``) that are not allowed by SOP,
+CORS-enabled browser first send *preflight request* to the
+resource using ``OPTIONS`` method, in which he queries access to the resource
+with specific method and headers::
+
+    OPTIONS / HTTP/1.1
+    Origin: https://client.example.com
+    Access-Control-Request-Method: PUT
+    Access-Control-Request-Headers: X-Client-Header
+
+CORS-enabled server responds is requested method is allowed and which of
+the specified headers are allowed::
+
+    Access-Control-Allow-Origin: https://client.example.com
+    Access-Control-Allow-Credentials: true
+    Access-Control-Allow-Methods: PUT
+    Access-Control-Allow-Headers: X-Client-Header
+    Access-Control-Max-Age: 3600
+
+Browser checks response to preflight request, and, if actual request allowed,
+does actual request.
+
+Installation
+============
+
+You can install ``aiohttp_cors`` as a typical Python library from PyPI or
+from git:
+
+.. code-block:: bash
+
+    $ pip install aiohttp_cors
+
+Note that ``aiohttp_cors`` requires versions of Python >= 3.4.1 and
+``aiohttp`` >= 1.1.
+
+Usage
+=====
+
+To use ``aiohttp_cors`` you need to configure the application and
+enable CORS on
+`resources and routes <https://aiohttp.readthedocs.org/en/stable/web.html#resources-and-routes>`__
+that you want to expose:
+
+.. code-block:: python
+
+    import asyncio
+    from aiohttp import web
+    import aiohttp_cors
+
+    @asyncio.coroutine
+    def handler(request):
+        return web.Response(
+            text="Hello!",
+            headers={
+                "X-Custom-Server-Header": "Custom data",
+            })
+
+    app = web.Application()
+
+    # `aiohttp_cors.setup` returns `aiohttp_cors.CorsConfig` instance.
+    # The `cors` instance will store CORS configuration for the
+    # application.
+    cors = aiohttp_cors.setup(app)
+
+    # To enable CORS processing for specific route you need to add
+    # that route to the CORS configuration object and specify its
+    # CORS options.
+    resource = cors.add(app.router.add_resource("/hello"))
+    route = cors.add(
+        resource.add_route("GET", handler), {
+            "http://client.example.org": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers=("X-Custom-Server-Header",),
+                allow_headers=("X-Requested-With", "Content-Type"),
+                max_age=3600,
+            )
+        })
+
+Each route has it's own CORS configuration passed in ``CorsConfig.add()``
+method.
+
+CORS configuration is a mapping from origins to options for that origins.
+
+In the example above CORS is configured for the resource under path ``/hello``
+and HTTP method ``GET``, and in the context of CORS:
+
+* This resource will be available using CORS only to
+  ``http://client.example.org`` origin.
+
+* Passing of credentials to this resource will be allowed.
+
+* The resource will expose to the client ``X-Custom-Server-Header``
+  server header.
+
+* The client will be allowed to pass ``X-Requested-With`` and
+  ``Content-Type`` headers to the server.
+
+* Preflight requests will be allowed to be cached by client for ``3600``
+  seconds.
+
+Resource will be available only to the explicitly specified origins.
+You can specify "all other origins" using special ``*`` origin:
+
+.. code-block:: python
+
+    cors.add(route, {
+            "*":
+                aiohttp_cors.ResourceOptions(allow_credentials=False),
+            "http://client.example.org":
+                aiohttp_cors.ResourceOptions(allow_credentials=True),
+        })
+
+Here the resource specified by ``route`` will be available to all origins with
+disallowed credentials passing, and with allowed credentials passing only to
+``http://client.example.org``.
+
+By default ``ResourceOptions`` will be constructed without any allowed CORS
+options.
+This means, that resource will be available using CORS to specified origin,
+but client will not be allowed to send either credentials,
+or send non-simple headers, or read from server non-simple headers.
+
+To enable sending or receiving all headers you can specify special value
+``*`` instead of sequence of headers:
+
+.. code-block:: python
+
+    cors.add(route, {
+            "http://client.example.org":
+                aiohttp_cors.ResourceOptions(
+                    expose_headers="*",
+                    allow_headers="*"),
+        })
+
+You can specify default CORS-enabled resource options using
+``aiohttp_cors.setup()``'s ``defaults`` argument:
+
+.. code-block:: python
+
+    cors = aiohttp_cors.setup(app, defaults={
+            # Allow all to read all CORS-enabled resources from
+            # http://client.example.org.
+            "http://client.example.org": aiohttp_cors.ResourceOptions(),
+        })
+
+    # Enable CORS on routes.
+
+    # According to defaults POST and PUT will be available only to
+    # "http://client.example.org".
+    hello_resource = cors.add(app.router.add_resource("/hello"))
+    cors.add(hello_resource.add_route("POST", handler_post))
+    cors.add(hello_resource.add_route("PUT", handler_put))
+
+    # In addition to "http://client.example.org", GET request will be
+    # allowed from "http://other-client.example.org" origin.
+    cors.add(hello_resource.add_route("GET", handler), {
+            "http://other-client.example.org":
+                aiohttp_cors.ResourceOptions(),
+        })
+
+    # CORS will be enabled only on the resources added to `CorsConfig`,
+    # so following resource will be NOT CORS-enabled.
+    app.router.add_route("GET", "/private", handler)
+
+Also you can specify default options for resources:
+
+.. code-block:: python
+
+    # Allow POST and PUT requests from "http://client.example.org" origin.
+    hello_resource = cors.add(app.router.add_resource("/hello"), {
+            "http://client.example.org": aiohttp_cors.ResourceOptions(),
+        })
+    cors.add(hello_resource.add_route("POST", handler_post))
+    cors.add(hello_resource.add_route("PUT", handler_put))
+
+Resource CORS configuration allows to use ``allow_methods`` option that
+explicitly specifies list of allowed HTTP methods for origin
+(or ``*`` for all HTTP methods).
+By using this option it is not required to add all resource routes to
+CORS configuration object:
+
+.. code-block:: python
+
+    # Allow POST and PUT requests from "http://client.example.org" origin.
+    hello_resource = cors.add(app.router.add_resource("/hello"), {
+            "http://client.example.org":
+                aiohttp_cors.ResourceOptions(allow_methods=["POST", "PUT"]),
+        })
+    # No need to add POST and PUT routes into CORS configuration object.
+    hello_resource.add_route("POST", handler_post)
+    hello_resource.add_route("PUT", handler_put)
+    # Still you can add additional methods to CORS configuration object:
+    cors.add(hello_resource.add_route("DELETE", handler_delete))
+
+Here is an example of how to enable CORS for all origins with all CORS
+features:
+
+.. code-block:: python
+
+    cors = aiohttp_cors.setup(app, defaults={
+        "*": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers="*",
+                allow_headers="*",
+            )
+    })
+
+    # Add all resources to `CorsConfig`.
+    resource = cors.add(app.router.add_resource("/hello"))
+    cors.add(resource.add_route("GET", handler_get))
+    cors.add(resource.add_route("PUT", handler_put))
+    cors.add(resource.add_route("POST", handler_put))
+    cors.add(resource.add_route("DELETE", handler_delete))
+
+Old routes API is supported — you can use ``router.add_router`` and
+``router.register_route`` as before, though this usage is discouraged:
+
+.. code-block:: python
+
+    cors.add(
+        app.router.add_route("GET", "/hello", handler), {
+            "http://client.example.org": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers=("X-Custom-Server-Header",),
+                allow_headers=("X-Requested-With", "Content-Type"),
+                max_age=3600,
+            )
+        })
+
+You can enable CORS for all added routes by accessing routes list
+in the router:
+
+.. code-block:: python
+
+    # Setup application routes.
+    app.router.add_route("GET", "/hello", handler_get)
+    app.router.add_route("PUT", "/hello", handler_put)
+    app.router.add_route("POST", "/hello", handler_put)
+    app.router.add_route("DELETE", "/hello", handler_delete)
+
+    # Configure default CORS settings.
+    cors = aiohttp_cors.setup(app, defaults={
+        "*": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers="*",
+                allow_headers="*",
+            )
+    })
+
+    # Configure CORS on all routes.
+    for route in list(app.router.routes()):
+        cors.add(route)
+
+You can also use ``CorsViewMixin`` on ``web.View``:
+
+.. code-block:: python
+
+    class CorsView(web.View, CorsViewMixin):
+
+        cors_config = {
+            "*": ResourceOption(
+                allow_credentials=True,
+                allow_headers="X-Request-ID",
+            )
+        }
+
+        @asyncio.coroutine
+        def get(self):
+            return web.Response(text="Done")
+
+        @custom_cors({
+            "*": ResourceOption(
+                allow_credentials=True,
+                allow_headers="*",
+            )
+        })
+        @asyncio.coroutine
+        def post(self):
+            return web.Response(text="Done")
+
+    cors = aiohttp_cors.setup(app, defaults={
+        "*": aiohttp_cors.ResourceOptions(
+                allow_credentials=True,
+                expose_headers="*",
+                allow_headers="*",
+            )
+    })
+
+    cors.add(
+        app.router.add_route("*", "/resource", CorsView),
+        webview=True)
+
+
+Security
+========
+
+TODO: fill this
+
+Development
+===========
+
+To setup development environment:
+
+.. code-block:: bash
+
+   # Clone sources repository:
+   git clone https://github.com/aio-libs/aiohttp_cors.git .
+   # Create and activate virtual Python environment:
+   python3 -m venv env
+   source env/bin/activate
+   # Install requirements and aiohttp_cors into virtual environment
+   pip install -r requirements-dev.txt
+
+To run tests:
+
+.. code-block:: bash
+
+   tox
+
+To run only runtime tests in current environment:
+
+.. code-block:: bash
+
+   py.test
+
+To run only static code analysis checks:
+
+.. code-block:: bash
+
+   tox -e check
+
+Running Selenium tests
+----------------------
+
+To run Selenium tests with Firefox web driver you need to install Firefox.
+
+To run Selenium tests with Chromium web driver you need to:
+
+1. Install Chrome driver. On Ubuntu 14.04 it's in ``chromium-chromedriver``
+   package.
+
+2. Either add ``chromedriver`` to PATH or set ``WEBDRIVER_CHROMEDRIVER_PATH``
+   environment variable to ``chromedriver``, e.g. on Ubuntu 14.04
+   ``WEBDRIVER_CHROMEDRIVER_PATH=/usr/lib/chromium-browser/chromedriver``.
+
+Release process
+---------------
+
+To release version ``vA.B.C`` from the current version of ``master`` branch
+you need to:
+
+1. Create local branch ``vA.B.C``.
+2. In ``CHANGES.rst`` set release date to today.
+3. In ``aiohttp_cors/__about__.py`` change version from ``A.B.Ca0`` to
+   ``A.B.C``.
+4. Create pull request with ``vA.B.C`` branch, wait for all checks to
+   successfully finish (Travis and Appveyor).
+5. Merge pull request to master.
+6. Update and checkout ``master`` branch.
+
+7. Create and push tag for release version to GitHub:
+
+   .. code-block:: bash
+
+      git tag vA.B.C
+      git push --tags
+
+   Now Travis should ran tests again, and build and deploy wheel on PyPI.
+
+   If Travis release doesn't work for some reason, use following steps
+   for manual release upload.
+
+   1. Install fresh versions of setuptools and pip.
+      Install ``wheel`` for building wheels.
+      Install ``twine`` for uploading to PyPI.
+
+      .. code-block:: bash
+
+         pip install -U pip setuptools twine wheel
+
+   2. Configure PyPI credentials in ``~/.pypirc``.
+
+   3. Build distribution:
+
+      .. code-block:: bash
+
+         rm -rf build dist; python setup.py sdist bdist_wheel
+
+   4. Upload new release to PyPI:
+
+      .. code-block:: bash
+
+         twine upload dist/*
+
+8. Edit release description on GitHub if needed.
+9. Announce new release on the *aio-libs* mailing list:
+   https://groups.google.com/forum/#!forum/aio-libs.
+
+Post release steps:
+
+1. In ``CHANGES.rst`` add template for the next release.
+2. In ``aiohttp_cors/__about__.py`` change version from ``A.B.C`` to
+   ``A.(B + 1).0a0``.
+
+Bugs
+====
+
+Please report bugs, issues, feature requests, etc. on
+`GitHub <https://github.com/aio-libs/aiohttp_cors/issues>`__.
+
+
+License
+=======
+
+Copyright 2015 Vladimir Rutsky <vladimir@rutsky.org>.
+
+Licensed under the
+`Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>`__,
+see ``LICENSE`` file for details.
+
+.. _cors: http://www.w3.org/TR/cors/
+.. _aiohttp: https://github.com/KeepSafe/aiohttp/
+.. _sop: https://en.wikipedia.org/wiki/Same-origin_policy
+
+
+=========
+ CHANGES
+=========
+
+0.7.0 (2018-03-05)
+==================
+
+- Make web view check implicit and type based (#159)
+
+- Disable Python 3.4 support (#156)
+
+- Support aiohttp 3.0+ (#155)
+
+0.6.0 (2017-12-21)
+==================
+
+- Support aiohttp views by ``CorsViewMixin`` (#145)
+
+0.5.3 (2017-04-21)
+==================
+
+- Fix ``typing`` being installed on Python 3.6.
+
+0.5.2 (2017-03-28)
+==================
+
+- Fix tests compatibility with ``aiohttp`` 2.0.
+  This release and release v0.5.0 should work on ``aiohttp`` 2.0.
+
+
+0.5.1 (2017-03-23)
+==================
+
+- Enforce ``aiohttp`` version to be less than 2.0.
+  Newer ``aiohttp`` releases will be supported in the next release.
+
+0.5.0 (2016-11-18)
+==================
+
+- Fix compatibility with ``aiohttp`` 1.1
+
+
+0.4.0 (2016-04-04)
+==================
+
+- Fixed support with new Resources objects introduced in ``aiohttp`` 0.21.0.
+  Minimum supported version of ``aiohttp`` is 0.21.4 now.
+
+- New Resources objects are supported.
+  You can specify default configuration for a Resource and use
+  ``allow_methods`` to explicitly list allowed methods (or ``*`` for all
+  HTTP methods):
+
+  .. code-block:: python
+
+        # Allow POST and PUT requests from "http://client.example.org" origin.
+        hello_resource = cors.add(app.router.add_resource("/hello"), {
+                "http://client.example.org":
+                    aiohttp_cors.ResourceOptions(
+                        allow_methods=["POST", "PUT"]),
+            })
+        # No need to add POST and PUT routes into CORS configuration object.
+        hello_resource.add_route("POST", handler_post)
+        hello_resource.add_route("PUT", handler_put)
+        # Still you can add additional methods to CORS configuration object:
+        cors.add(hello_resource.add_route("DELETE", handler_delete))
+
+- ``AbstractRouterAdapter`` was completely rewritten to be more Router
+  agnostic.
+
+0.3.0 (2016-02-06)
+==================
+
+- Rename ``UrlDistatcherRouterAdapter`` to ``UrlDispatcherRouterAdapter``.
+
+- Set maximum supported ``aiohttp`` version to ``0.20.2``, see bug #30 for
+  details.
+
+0.2.0 (2015-11-30)
+==================
+
+- Move ABCs from ``aiohttp_cors.router_adapter`` to ``aiohttp_cors.abc``.
+
+- Rename ``RouterAdapter`` to ``AbstractRouterAdapter``.
+
+- Fix bug with configuring CORS for named routes.
+
+0.1.0 (2015-11-05)
+==================
+
+* Initial release.
diff --git a/aiohttp_cors.egg-info/SOURCES.txt b/aiohttp_cors.egg-info/SOURCES.txt
new file mode 100644
index 0000000..f1b312a
--- /dev/null
+++ b/aiohttp_cors.egg-info/SOURCES.txt
@@ -0,0 +1,33 @@
+CHANGES.rst
+LICENSE
+MANIFEST.in
+README.rst
+setup.cfg
+setup.py
+aiohttp_cors/__about__.py
+aiohttp_cors/__init__.py
+aiohttp_cors/abc.py
+aiohttp_cors/cors_config.py
+aiohttp_cors/mixin.py
+aiohttp_cors/preflight_handler.py
+aiohttp_cors/resource_options.py
+aiohttp_cors/urldispatcher_router_adapter.py
+aiohttp_cors.egg-info/PKG-INFO
+aiohttp_cors.egg-info/SOURCES.txt
+aiohttp_cors.egg-info/dependency_links.txt
+aiohttp_cors.egg-info/requires.txt
+aiohttp_cors.egg-info/top_level.txt
+tests/__init__.py
+tests/doc/__init__.py
+tests/doc/test_basic_usage.py
+tests/integration/__init__.py
+tests/integration/test_main.py
+tests/integration/test_page.html
+tests/integration/test_real_browser.py
+tests/unit/__init__.py
+tests/unit/test___about__.py
+tests/unit/test_cors_config.py
+tests/unit/test_mixin.py
+tests/unit/test_preflight_handler.py
+tests/unit/test_resource_options.py
+tests/unit/test_urldispatcher_router_adapter.py
\ No newline at end of file
diff --git a/aiohttp_cors.egg-info/dependency_links.txt b/aiohttp_cors.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/aiohttp_cors.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/aiohttp_cors.egg-info/requires.txt b/aiohttp_cors.egg-info/requires.txt
new file mode 100644
index 0000000..8562c09
--- /dev/null
+++ b/aiohttp_cors.egg-info/requires.txt
@@ -0,0 +1,4 @@
+aiohttp>=1.1
+
+[:python_version < "3.5"]
+typing
diff --git a/aiohttp_cors.egg-info/top_level.txt b/aiohttp_cors.egg-info/top_level.txt
new file mode 100644
index 0000000..72d22ff
--- /dev/null
+++ b/aiohttp_cors.egg-info/top_level.txt
@@ -0,0 +1 @@
+aiohttp_cors
diff --git a/aiohttp_cors/urldispatcher_router_adapter.py b/aiohttp_cors/urldispatcher_router_adapter.py
index 1a65e99..f2b02ab 100644
--- a/aiohttp_cors/urldispatcher_router_adapter.py
+++ b/aiohttp_cors/urldispatcher_router_adapter.py
@@ -97,7 +97,7 @@ def _is_web_view(entity, strict=True):
             if not issubclass(handler, CorsViewMixin):
                 if strict:
                     raise ValueError("web view should be derived from "
-                                     "aiohttp_cors.WebViewMixig for working "
+                                     "aiohttp_cors.CorsViewMixin for working "
                                      "with the library")
                 else:
                     return False
diff --git a/conftest.py b/conftest.py
deleted file mode 100644
index 56d32b1..0000000
--- a/conftest.py
+++ /dev/null
@@ -1,15 +0,0 @@
-import sys
-
-# TODO: add option or in other way allow developer to enable debug logging.
-if False:
-    import logging
-    logging.basicConfig(level=logging.DEBUG)
-
-
-def pytest_cmdline_preparse(args):
-    if sys.version_info[:2] == (3, 5):
-        # Disable pylint on Python 3.5, since it's broken:
-        # <https://bitbucket.org/logilab/astroid/issues/187/call-object-has-no-attribute-starargs>
-        args[:] = (
-            ["-p", "no:pylint"] +
-            [arg for arg in args if "pylint" not in arg])
diff --git a/debian/changelog b/debian/changelog
index b599bf4..288e75f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+aiohttp-cors (0.7.0+git20220103.1.1627c08-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 19 Jan 2023 00:20:12 -0000
+
 aiohttp-cors (0.7.0-2) unstable; urgency=medium
 
   [ Ondřej Nový ]
diff --git a/install_python_and_pip.ps1 b/install_python_and_pip.ps1
deleted file mode 100644
index 94cbe51..0000000
--- a/install_python_and_pip.ps1
+++ /dev/null
@@ -1,103 +0,0 @@
-# Sample script to install Python and pip under Windows
-# Authors: Olivier Grisel and Kyle Kastner
-# License: BSD 3 clause
-
-# The script is borrowed from Scikit-learn project
-
-$BASE_URL = "https://www.python.org/ftp/python/"
-$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py"
-$GET_PIP_PATH = "C:\get-pip.py"
-
-
-function DownloadPython ($python_version, $platform_suffix) {
-    $webclient = New-Object System.Net.WebClient
-    $filename = "python-" + $python_version + $platform_suffix + ".msi"
-    $url = $BASE_URL + $python_version + "/" + $filename
-
-    $basedir = $pwd.Path + "\"
-    $filepath = $basedir + $filename
-    if (Test-Path $filename) {
-        Write-Host "Reusing" $filepath
-        return $filepath
-    }
-
-    # Download and retry up to 3 times in case of network transient errors.
-    Write-Host "Downloading" $filename "from" $url
-    $retry_attempts = 2
-    for($i=0; $i -lt $retry_attempts; $i++){
-        try {
-            $webclient.DownloadFile($url, $filepath)
-            break
-        }
-        Catch [Exception]{
-            Start-Sleep 1
-        }
-   }
-   if (Test-Path $filepath) {
-       Write-Host "File saved at" $filepath
-   } else {
-       # Retry once to get the error message if any at the last try
-       $webclient.DownloadFile($url, $filepath)
-   }
-   return $filepath
-}
-
-
-function InstallPython ($python_version, $architecture, $python_home) {
-    Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
-    if (Test-Path $python_home) {
-        Write-Host $python_home "already exists, skipping."
-        return $false
-    }
-    if ($architecture -eq "32") {
-        $platform_suffix = ""
-    } else {
-        $platform_suffix = ".amd64"
-    }
-    $msipath = DownloadPython $python_version $platform_suffix
-    Write-Host "Installing" $msipath "to" $python_home
-    $install_log = $python_home + ".log"
-    $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home"
-    $uninstall_args = "/qn /x $msipath"
-    RunCommand "msiexec.exe" $install_args
-    if (-not(Test-Path $python_home)) {
-        Write-Host "Python seems to be installed else-where, reinstalling."
-        RunCommand "msiexec.exe" $uninstall_args
-        RunCommand "msiexec.exe" $install_args
-    }
-    if (Test-Path $python_home) {
-        Write-Host "Python $python_version ($architecture) installation complete"
-    } else {
-        Write-Host "Failed to install Python in $python_home"
-        Get-Content -Path $install_log
-        Exit 1
-    }
-}
-
-function RunCommand ($command, $command_args) {
-    Write-Host $command $command_args
-    Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
-}
-
-
-function InstallPip ($python_home) {
-    $pip_path = $python_home + "\Scripts\pip.exe"
-    $python_path = $python_home + "\python.exe"
-    if (-not(Test-Path $pip_path)) {
-        Write-Host "Installing pip..."
-        $webclient = New-Object System.Net.WebClient
-        $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH)
-        Write-Host "Executing:" $python_path $GET_PIP_PATH
-        Start-Process -FilePath "$python_path" -ArgumentList "$GET_PIP_PATH" -Wait -Passthru
-    } else {
-        Write-Host "pip already installed."
-    }
-}
-
-
-function main () {
-    InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
-    InstallPip $env:PYTHON
-}
-
-main
\ No newline at end of file
diff --git a/pytest.ini b/pytest.ini
deleted file mode 100644
index e62899b..0000000
--- a/pytest.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[pytest]
-filterwarnings=
-    error
diff --git a/requirements-dev.txt b/requirements-dev.txt
deleted file mode 100644
index 6331621..0000000
--- a/requirements-dev.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-aiohttp==3.0.5
-tox==2.9.1
-pytest==3.4.0
-pytest-aiohttp==0.3.0
-pytest-cov==2.5.1
-pytest-runner==3.0
-pytest-flakes==2.0.0
-pytest-pylint==0.7.1
-pytest-sugar==0.9.1
-flake8==3.5.0
-selenium==3.8.1
-docutils==0.14
-pygments==2.2.0
--e .
diff --git a/setup.cfg b/setup.cfg
index 20d367e..df30c88 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -2,4 +2,9 @@
 test = pytest
 
 [tool:pytest]
-addopts= --cov=aiohttp_cors --cov-report=term --cov-report=html --cov-branch --no-cov-on-fail
\ No newline at end of file
+addopts = --cov=aiohttp_cors --cov-report=term --cov-report=html --cov-branch --no-cov-on-fail
+
+[egg_info]
+tag_build = 
+tag_date = 0
+
diff --git a/tests/integration/test_real_browser.py b/tests/integration/test_real_browser.py
index a5c9030..5dff79a 100644
--- a/tests/integration/test_real_browser.py
+++ b/tests/integration/test_real_browser.py
@@ -193,22 +193,20 @@ class IntegrationServers:
 
         # Start servers.
         for server_name, server_descr in self.servers.items():
-            handler = server_descr.app.make_handler()
-            server = await self.loop.create_server(
-                handler,
-                sock=server_sockets[server_name])
-            server_descr.handler = handler
-            server_descr.server = server
+            runner = web.AppRunner(server_descr.app)
+            await runner.setup()
+            site = web.SockSite(runner, server_sockets[server_name])
+            await site.start()
+            server_descr.runner = runner
 
             self._logger.info("Started server '%s' at '%s'",
                               server_name, server_descr.url)
 
     async def stop_servers(self):
         for server_descr in self.servers.values():
-            server_descr.server.close()
-            await server_descr.handler.shutdown()
-            await server_descr.server.wait_closed()
-            await server_descr.app.cleanup()
+            runner = server_descr.runner
+            await runner.shutdown()
+            await runner.cleanup()
 
         self.servers = {}
 
diff --git a/tests/unit/test_cors_config.py b/tests/unit/test_cors_config.py
index 5b8d8f3..817410e 100644
--- a/tests/unit/test_cors_config.py
+++ b/tests/unit/test_cors_config.py
@@ -58,11 +58,10 @@ def options_route(app):
         "OPTIONS", "/options_path", _handler)
 
 
-def test_add_options_route(cors, options_route):
+def test_add_options_route(app, cors, options_route):
     """Test configuring OPTIONS route"""
-
     with pytest.raises(ValueError,
-                       match="/options_path already has OPTIONS handler"):
+                       match="already has OPTIONS handler"):
         cors.add(options_route.resource)
 
 
diff --git a/tox.ini b/tox.ini
deleted file mode 100644
index 9668d37..0000000
--- a/tox.ini
+++ /dev/null
@@ -1,23 +0,0 @@
-[tox]
-envlist = py34, py35, check
-
-[testenv]
-commands = {envpython} setup.py test
-deps =
-    pytest
-
-[testenv:check]
-deps =
-    docutils
-    pygments
-    flake8
-
-commands =
-    {envpython} setup.py check -rms
-    flake8 aiohttp_cors tests
-
-[pytest]
-testpaths = aiohttp_cors tests
-addopts= --cov=aiohttp_cors --cov-report=term --cov-report=html --cov-branch --no-cov-on-fail
-;addopts = --cov aiohttp_cors
-;    --pylint-rcfile=.pylintrc --pylint

Debdiff

File lists identical (after any substitutions)

No differences were encountered in the control files

More details

Full run details