sanic/setup.py

179 lines
4.2 KiB
Python
Raw Normal View History

2016-10-02 03:48:50 +01:00
"""
Sanic
"""
2016-10-25 09:49:43 +01:00
import codecs
import os
import re
import sys
2020-12-24 19:56:35 +00:00
2021-03-21 10:00:32 +00:00
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
2020-12-24 19:56:35 +00:00
import pytest
errno = pytest.main(shlex.split(self.pytest_args))
sys.exit(errno)
2016-10-25 09:49:43 +01:00
2017-05-02 10:04:58 +01:00
def open_local(paths, mode="r", encoding="utf8"):
path = os.path.join(os.path.abspath(os.path.dirname(__file__)), *paths)
2017-05-02 10:04:58 +01:00
return codecs.open(path, mode, encoding)
def str_to_bool(val: str) -> bool:
val = val.lower()
if val in {
"y",
"yes",
"yep",
"yup",
"t",
"true",
"on",
"enable",
"enabled",
"1",
}:
return True
elif val in {"n", "no", "f", "false", "off", "disable", "disabled", "0"}:
return False
else:
raise ValueError(f"Invalid truth value {val}")
2017-05-02 10:04:58 +01:00
with open_local(["sanic", "__version__.py"], encoding="latin1") as fp:
2016-10-25 09:49:43 +01:00
try:
2020-12-24 19:56:35 +00:00
version = re.findall(
r"^__version__ = \"([^']+)\"\r?$", fp.read(), re.M
)[0]
2016-10-25 09:49:43 +01:00
except IndexError:
raise RuntimeError("Unable to determine version.")
2016-10-25 09:49:43 +01:00
with open_local(["README.rst"]) as rm:
2017-05-02 10:04:58 +01:00
long_description = rm.read()
setup_kwargs = {
"name": "sanic",
"version": version,
2021-03-21 10:00:32 +00:00
"url": "http://github.com/sanic-org/sanic/",
"license": "MIT",
"author": "Sanic Community",
"author_email": "admhpkns@gmail.com",
"description": (
2021-02-15 12:18:42 +00:00
"A web server and web framework that's written to go fast. "
"Build fast. Run fast."
),
"long_description": long_description,
2022-08-18 06:58:07 +01:00
"packages": find_packages(exclude=("tests", "tests.*")),
"package_data": {"sanic": ["py.typed", "pages/styles/*"]},
"platforms": "any",
2023-07-09 20:00:14 +01:00
"python_requires": ">=3.8",
"classifiers": [
"Development Status :: 4 - Beta",
"Environment :: Web Environment",
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3.8",
2020-10-25 13:21:48 +00:00
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
2017-03-12 05:46:31 +00:00
],
"entry_points": {"console_scripts": ["sanic = sanic.__main__:main"]},
2017-03-12 03:09:01 +00:00
}
2020-12-24 19:56:35 +00:00
env_dependency = (
'; sys_platform != "win32" and implementation_name == "cpython"'
2020-12-24 19:56:35 +00:00
)
ujson = "ujson>=1.35" + env_dependency
2022-11-13 13:32:04 +00:00
uvloop = "uvloop>=0.15.0" + env_dependency
types_ujson = "types-ujson" + env_dependency
requirements = [
2023-07-25 13:57:29 +01:00
"sanic-routing>=23.6.0",
"httptools>=0.0.10",
uvloop,
ujson,
"aiofiles>=0.6.0",
New websockets (#2158) * First attempt at new Websockets implementation based on websockets >= 9.0, with sans-i/o features. Requires more work. * Update sanic/websocket.py Co-authored-by: Adam Hopkins <adam@amhopkins.com> * Update sanic/websocket.py Co-authored-by: Adam Hopkins <adam@amhopkins.com> * Update sanic/websocket.py Co-authored-by: Adam Hopkins <adam@amhopkins.com> * wip, update websockets code to new Sans/IO API * Refactored new websockets impl into own modules Incorporated other suggestions made by team * Another round of work on the new websockets impl * Added websocket_timeout support (matching previous/legacy support) * Lots more comments * Incorporated suggested changes from previous round of review * Changed RuntimeError usage to ServerError * Changed SanicException usage to ServerError * Removed some redundant asserts * Change remaining asserts to ServerErrors * Fixed some timeout handling issues * Fixed websocket.close() handling, and made it more robust * Made auto_close task smarter and more error-resilient * Made fail_connection routine smarter and more error-resilient * Further new websockets impl fixes * Update compatibility with Websockets v10 * Track server connection state in a more precise way * Try to handle the shutdown process more gracefully * Add a new end_connection() helper, to use as an alterative to close() or fail_connection() * Kill the auto-close task and keepalive-timeout task when sanic is shutdown * Deprecate WEBSOCKET_READ_LIMIT and WEBSOCKET_WRITE_LIMIT configs, they are not used in this implementation. * Change a warning message to debug level Remove default values for deprecated websocket parameters * Fix flake8 errors * Fix a couple of missed failing tests * remove websocket bench from examples * Integrate suggestions from code reviews Use Optional[T] instead of union[T,None] Fix mypy type logic errors change "is not None" to truthy checks where appropriate change "is None" to falsy checks were appropriate Add more debug logging when debug mode is on Change to using sanic.logger for debug logging rather than error_logger. * Fix long line lengths of debug messages Add some new debug messages when websocket IO is paused and unpaused for flow control Fix websocket example to use app.static() * remove unused import in websocket example app * re-run isort after Flake8 fixes Co-authored-by: Adam Hopkins <adam@amhopkins.com> Co-authored-by: Adam Hopkins <admhpkns@gmail.com>
2021-09-29 11:09:23 +01:00
"websockets>=10.0",
"multidict>=5.0,<7.0",
"html5tagger>=1.2.1",
"tracerite>=1.0.0",
"typing-extensions>=4.4.0",
]
tests_require = [
2023-07-25 13:57:29 +01:00
"sanic-testing>=23.6.0",
"pytest==7.1.*",
"coverage",
"beautifulsoup4",
"pytest-sanic",
2019-04-19 15:31:23 +01:00
"pytest-benchmark",
"chardet==3.*",
"ruff",
"bandit",
"mypy",
"docutils",
"pygments",
"uvicorn<0.15.0",
"slotscheck>=0.8.0,<1",
types_ujson,
]
docs_require = [
"sphinx>=2.1.2",
"sphinx_rtd_theme>=0.4.3",
"docutils",
"pygments",
"m2r2",
2022-06-28 08:53:03 +01:00
"enum-tools[sphinx]",
"mistune<2.0.0",
2023-08-23 18:47:23 +01:00
"autodocsumm>=0.2.11",
]
dev_require = tests_require + [
Vhost support using multiple TLS certificates (#2270) * 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>
2021-10-28 14:50:05 +01:00
"cryptography",
"tox",
"towncrier",
]
all_require = list(set(dev_require + docs_require))
if str_to_bool(os.environ.get("SANIC_NO_UJSON", "no")):
print("Installing without uJSON")
requirements.remove(ujson)
tests_require.remove(types_ujson)
2017-12-29 18:04:22 +00:00
# 'nt' means windows OS
if str_to_bool(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,
"ext": ["sanic-ext"],
2022-06-27 09:19:26 +01:00
"http3": ["aioquic"],
}
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)