6c7df68c7c
* Initial support for using multiple SSL certificates. * Also list IP address subjectAltNames on log. * Use Python 3.7+ way of specifying TLSv1.2 as the minimum version. Linter fixes. * isort * Cleanup, store server name for later use. Add RSA ciphers. Log rejected SNIs. * Cleanup, linter. * Alter the order of initial log messages and handling. In particular, enable debug mode early so that debug messages during init can be shown. * Store server name (SNI) to conn_info. * Update test with new error message. * Refactor for readability. * Cleanup * Replace old expired test cert with new ones and a script for regenerating them as needed. * Refactor TLS tests to a separate file. * Add cryptography to dev deps for rebuilding TLS certs. * Minor adjustment to messages. * Tests added for new TLS code. * Find the correct log row before testing for message. The order was different on CI. * More log message order fixup. The tests do not account for the logo being printed first. * Another attempt at log message indexing fixup. * Major TLS refactoring. CertSelector now allows dicts and SSLContext within its list. Server names are stored even when no list is used. SSLContext.sanic now contains a dict with any setting passed and information extracted from cert. That information is available on request.conn_info.cert. Type annotations added. More tests incl. a handler for faking hostname in tests. * Remove a problematic logger test that apparently was not adding any coverage or value to anything. * Revert accidental commit of uvloop disable. * Typing fixes / refactoring. * Additional test for cert selection. Certs recreated without DNS:localhost on sanic.example cert. * Add tests for single certificate path shorthand and SNI information. * Move TLS dict processing to CertSimple, make the names field optional and use names from the cert if absent. * Sanic CLI options --tls and --tls-strict-host to use the new features. * SSL argument typing updated * Use ValueError for internal message passing to avoid CertificateError's odd message formatting. * Linter * Test CLI TLS options. * Maybe the right codeclimate option now... * Improved TLS argument help, removed support for combining --cert/--key with --tls. * Removed support for strict checking without any certs, black forced fscked up formatting. * Update CLI tests for stricter TLS options. Co-authored-by: L. Karkkainen <tronic@users.noreply.github.com> Co-authored-by: Adam Hopkins <admhpkns@gmail.com>
155 lines
3.7 KiB
Python
155 lines
3.7 KiB
Python
"""
|
|
Sanic
|
|
"""
|
|
import codecs
|
|
import os
|
|
import re
|
|
import sys
|
|
|
|
from distutils.util import strtobool
|
|
|
|
from setuptools import find_packages, setup
|
|
from setuptools.command.test import test as TestCommand
|
|
|
|
|
|
class PyTest(TestCommand):
|
|
"""
|
|
Provide a Test runner to be used from setup.py to run unit tests
|
|
"""
|
|
|
|
user_options = [("pytest-args=", "a", "Arguments to pass to pytest")]
|
|
|
|
def initialize_options(self):
|
|
TestCommand.initialize_options(self)
|
|
self.pytest_args = ""
|
|
|
|
def run_tests(self):
|
|
import shlex
|
|
|
|
import pytest
|
|
|
|
errno = pytest.main(shlex.split(self.pytest_args))
|
|
sys.exit(errno)
|
|
|
|
|
|
def open_local(paths, mode="r", encoding="utf8"):
|
|
path = os.path.join(os.path.abspath(os.path.dirname(__file__)), *paths)
|
|
|
|
return codecs.open(path, mode, encoding)
|
|
|
|
|
|
with open_local(["sanic", "__version__.py"], encoding="latin1") as fp:
|
|
try:
|
|
version = re.findall(
|
|
r"^__version__ = \"([^']+)\"\r?$", fp.read(), re.M
|
|
)[0]
|
|
except IndexError:
|
|
raise RuntimeError("Unable to determine version.")
|
|
|
|
with open_local(["README.rst"]) as rm:
|
|
long_description = rm.read()
|
|
|
|
setup_kwargs = {
|
|
"name": "sanic",
|
|
"version": version,
|
|
"url": "http://github.com/sanic-org/sanic/",
|
|
"license": "MIT",
|
|
"author": "Sanic Community",
|
|
"author_email": "admhpkns@gmail.com",
|
|
"description": (
|
|
"A web server and web framework that's written to go fast. "
|
|
"Build fast. Run fast."
|
|
),
|
|
"long_description": long_description,
|
|
"packages": find_packages(),
|
|
"package_data": {"sanic": ["py.typed"]},
|
|
"platforms": "any",
|
|
"python_requires": ">=3.7",
|
|
"classifiers": [
|
|
"Development Status :: 4 - Beta",
|
|
"Environment :: Web Environment",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Programming Language :: Python :: 3.7",
|
|
"Programming Language :: Python :: 3.8",
|
|
"Programming Language :: Python :: 3.9",
|
|
],
|
|
"entry_points": {"console_scripts": ["sanic = sanic.__main__:main"]},
|
|
}
|
|
|
|
env_dependency = (
|
|
'; sys_platform != "win32" ' 'and implementation_name == "cpython"'
|
|
)
|
|
ujson = "ujson>=1.35" + env_dependency
|
|
uvloop = "uvloop>=0.5.3" + env_dependency
|
|
types_ujson = "types-ujson" + env_dependency
|
|
requirements = [
|
|
"sanic-routing~=0.7",
|
|
"httptools>=0.0.10",
|
|
uvloop,
|
|
ujson,
|
|
"aiofiles>=0.6.0",
|
|
"websockets>=10.0",
|
|
"multidict>=5.0,<6.0",
|
|
]
|
|
|
|
tests_require = [
|
|
"sanic-testing>=0.7.0",
|
|
"pytest==5.2.1",
|
|
"coverage==5.3",
|
|
"gunicorn==20.0.4",
|
|
"pytest-cov",
|
|
"beautifulsoup4",
|
|
"pytest-sanic",
|
|
"pytest-sugar",
|
|
"pytest-benchmark",
|
|
"chardet==3.*",
|
|
"flake8",
|
|
"black",
|
|
"isort>=5.0.0",
|
|
"bandit",
|
|
"mypy>=0.901",
|
|
"docutils",
|
|
"pygments",
|
|
"uvicorn<0.15.0",
|
|
types_ujson,
|
|
]
|
|
|
|
docs_require = [
|
|
"sphinx>=2.1.2",
|
|
"sphinx_rtd_theme>=0.4.3",
|
|
"docutils",
|
|
"pygments",
|
|
"m2r2",
|
|
]
|
|
|
|
dev_require = tests_require + [
|
|
"cryptography",
|
|
"tox",
|
|
"towncrier",
|
|
]
|
|
|
|
all_require = list(set(dev_require + docs_require))
|
|
|
|
if strtobool(os.environ.get("SANIC_NO_UJSON", "no")):
|
|
print("Installing without uJSON")
|
|
requirements.remove(ujson)
|
|
tests_require.remove(types_ujson)
|
|
|
|
# 'nt' means windows OS
|
|
if strtobool(os.environ.get("SANIC_NO_UVLOOP", "no")):
|
|
print("Installing without uvLoop")
|
|
requirements.remove(uvloop)
|
|
|
|
extras_require = {
|
|
"test": tests_require,
|
|
"dev": dev_require,
|
|
"docs": docs_require,
|
|
"all": all_require,
|
|
}
|
|
|
|
setup_kwargs["install_requires"] = requirements
|
|
setup_kwargs["tests_require"] = tests_require
|
|
setup_kwargs["extras_require"] = extras_require
|
|
setup_kwargs["cmdclass"] = {"test": PyTest}
|
|
setup(**setup_kwargs)
|