Merge branch 'master' into asgi-refactor-attempt
This commit is contained in:
commit
4767a67acd
|
@ -34,28 +34,84 @@ the document that explains the way `sanic` manages dependencies inside the `setu
|
||||||
| extras_require['dev'] | Additional Development requirements to add contributing | pip3 install -e '.[dev]' |
|
| extras_require['dev'] | Additional Development requirements to add contributing | pip3 install -e '.[dev]' |
|
||||||
| extras_require['docs'] | Dependencies required to enable building and enhancing sanic documentation | pip3 install -e '.[docs]' |
|
| extras_require['docs'] | Dependencies required to enable building and enhancing sanic documentation | pip3 install -e '.[docs]' |
|
||||||
|
|
||||||
## Running tests
|
## Running all tests
|
||||||
|
To run the tests for Sanic it is recommended to use tox like so:
|
||||||
To run the tests for sanic it is recommended to use tox like so:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
tox
|
tox
|
||||||
```
|
```
|
||||||
|
|
||||||
See it's that simple!
|
See it's that simple!
|
||||||
|
|
||||||
|
`tox.ini` contains different environments. Running `tox` without any arguments will
|
||||||
|
run all unittests, perform lint and other checks.
|
||||||
|
|
||||||
|
## Run unittests :
|
||||||
|
`tox` environment -> `[testenv]`
|
||||||
|
|
||||||
|
To execute only unittests, run `tox` with environment like so:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
tox -e py36 -v -- tests/test_config.py
|
||||||
|
# or
|
||||||
|
tox -e py37 -v -- tests/test_config.py
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run lint checks :
|
||||||
|
`tox` environment -> `[testenv:lint]`
|
||||||
|
|
||||||
|
Permform `flake8`, `black` and `isort` checks.
|
||||||
|
```bash
|
||||||
|
tox -e lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Run other checks :
|
||||||
|
`tox` environment -> `[testenv:check]`
|
||||||
|
|
||||||
|
Perform other checks.
|
||||||
|
```bash
|
||||||
|
tox -e check
|
||||||
|
```
|
||||||
|
|
||||||
|
# Code Style
|
||||||
|
To maintain the code consistency, Sanic uses following tools.
|
||||||
|
|
||||||
|
1. [isort](https://github.com/timothycrosley/isort)
|
||||||
|
2. [black](https://github.com/python/black)
|
||||||
|
2. [flake8](https://github.com/PyCQA/flake8)
|
||||||
|
|
||||||
|
|
||||||
|
## isort
|
||||||
|
`isort` sorts Python imports. It divides imports into three
|
||||||
|
categories sorted each in alphabetical order.
|
||||||
|
1. built-in
|
||||||
|
2. third-party
|
||||||
|
3. project-specific
|
||||||
|
|
||||||
|
## black
|
||||||
|
`black` is a Python code formatter.
|
||||||
|
|
||||||
|
## flake8
|
||||||
|
`flake8` is a Python style guide that wraps following tools into one.
|
||||||
|
1. PyFlakes
|
||||||
|
2. pycodestyle
|
||||||
|
3. Ned Batchelder's McCabe script
|
||||||
|
|
||||||
|
`isort`, `black` and `flake8` checks are performed during `tox` lint checks.
|
||||||
|
|
||||||
|
Refer [tox](https://tox.readthedocs.io/en/latest/index.html) documentation for more details.
|
||||||
|
|
||||||
## Pull requests!
|
## Pull requests!
|
||||||
|
|
||||||
So the pull request approval rules are pretty simple:
|
So the pull request approval rules are pretty simple:
|
||||||
1. All pull requests must pass unit tests.
|
1. All pull requests must pass unit tests.
|
||||||
2. All pull requests must be reviewed and approved by at least
|
2. All pull requests must be reviewed and approved by at least
|
||||||
one current collaborator on the project.
|
one current collaborator on the project.
|
||||||
3. All pull requests must pass flake8 checks.
|
3. All pull requests must pass flake8 checks.
|
||||||
4. All pull requests must be consistent with the existing code.
|
4. All pull requests must be consistent with the existing code.
|
||||||
5. If you decide to remove/change anything from any common interface
|
5. If you decide to remove/change anything from any common interface
|
||||||
a deprecation message should accompany it.
|
a deprecation message should accompany it.
|
||||||
6. If you implement a new feature you should have at least one unit
|
6. If you implement a new feature you should have at least one unit
|
||||||
test to accompany it.
|
test to accompany it.
|
||||||
7. An example must be one of the following:
|
7. An example must be one of the following:
|
||||||
* Example of how to use Sanic
|
* Example of how to use Sanic
|
||||||
* Example of how to use Sanic extensions
|
* Example of how to use Sanic extensions
|
||||||
|
|
|
@ -16,7 +16,7 @@ Sanic | Build fast. Run fast.
|
||||||
* - Package
|
* - Package
|
||||||
- | |PyPI| |PyPI version| |Wheel| |Supported implementations| |Code style black|
|
- | |PyPI| |PyPI version| |Wheel| |Supported implementations| |Code style black|
|
||||||
* - Support
|
* - Support
|
||||||
- | |Forums| |Join the chat at https://gitter.im/sanic-python/Lobby|
|
- | |Forums| |Join the chat at https://gitter.im/sanic-python/Lobby| |Awesome|
|
||||||
* - Stats
|
* - Stats
|
||||||
- | |Downloads|
|
- | |Downloads|
|
||||||
|
|
||||||
|
@ -44,6 +44,9 @@ Sanic | Build fast. Run fast.
|
||||||
.. |Supported implementations| image:: https://img.shields.io/pypi/implementation/sanic.svg
|
.. |Supported implementations| image:: https://img.shields.io/pypi/implementation/sanic.svg
|
||||||
:alt: Supported implementations
|
:alt: Supported implementations
|
||||||
:target: https://pypi.python.org/pypi/sanic
|
:target: https://pypi.python.org/pypi/sanic
|
||||||
|
.. |Awesome| image:: https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg
|
||||||
|
:alt: Awesome Sanic List
|
||||||
|
:target: https://github.com/mekicha/awesome-sanic
|
||||||
.. |Downloads| image:: https://pepy.tech/badge/sanic/month
|
.. |Downloads| image:: https://pepy.tech/badge/sanic/month
|
||||||
:alt: Downloads
|
:alt: Downloads
|
||||||
:target: https://pepy.tech/project/sanic
|
:target: https://pepy.tech/project/sanic
|
||||||
|
|
|
@ -13,6 +13,7 @@ dependencies:
|
||||||
- sphinx==1.8.3
|
- sphinx==1.8.3
|
||||||
- sphinx_rtd_theme==0.4.2
|
- sphinx_rtd_theme==0.4.2
|
||||||
- recommonmark==0.5.0
|
- recommonmark==0.5.0
|
||||||
|
- requests-async==0.4.0
|
||||||
- sphinxcontrib-asyncio>=0.2.0
|
- sphinxcontrib-asyncio>=0.2.0
|
||||||
- docutils==0.14
|
- docutils==0.14
|
||||||
- pygments==2.3.1
|
- pygments==2.3.1
|
||||||
|
|
10
sanic/app.py
10
sanic/app.py
|
@ -557,12 +557,22 @@ class Sanic:
|
||||||
This method provides the app user a mechanism by which an already
|
This method provides the app user a mechanism by which an already
|
||||||
existing route can be removed from the :class:`Sanic` object
|
existing route can be removed from the :class:`Sanic` object
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
remove_route is deprecated in v19.06 and will be removed
|
||||||
|
from future versions.
|
||||||
|
|
||||||
:param uri: URL Path to be removed from the app
|
:param uri: URL Path to be removed from the app
|
||||||
:param clean_cache: Instruct sanic if it needs to clean up the LRU
|
:param clean_cache: Instruct sanic if it needs to clean up the LRU
|
||||||
route cache
|
route cache
|
||||||
:param host: IP address or FQDN specific to the host
|
:param host: IP address or FQDN specific to the host
|
||||||
:return: None
|
:return: None
|
||||||
"""
|
"""
|
||||||
|
warnings.warn(
|
||||||
|
"remove_route is deprecated and will be removed "
|
||||||
|
"from future versions.",
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
self.router.remove(uri, clean_cache, host)
|
self.router.remove(uri, clean_cache, host)
|
||||||
|
|
||||||
# Decorator
|
# Decorator
|
||||||
|
|
|
@ -842,6 +842,8 @@ def serve_multiple(server_settings, workers):
|
||||||
server_settings["host"] = None
|
server_settings["host"] = None
|
||||||
server_settings["port"] = None
|
server_settings["port"] = None
|
||||||
|
|
||||||
|
processes = []
|
||||||
|
|
||||||
def sig_handler(signal, frame):
|
def sig_handler(signal, frame):
|
||||||
logger.info("Received signal %s. Shutting down.", Signals(signal).name)
|
logger.info("Received signal %s. Shutting down.", Signals(signal).name)
|
||||||
for process in processes:
|
for process in processes:
|
||||||
|
@ -850,8 +852,6 @@ def serve_multiple(server_settings, workers):
|
||||||
signal_func(SIGINT, lambda s, f: sig_handler(s, f))
|
signal_func(SIGINT, lambda s, f: sig_handler(s, f))
|
||||||
signal_func(SIGTERM, lambda s, f: sig_handler(s, f))
|
signal_func(SIGTERM, lambda s, f: sig_handler(s, f))
|
||||||
|
|
||||||
processes = []
|
|
||||||
|
|
||||||
for _ in range(workers):
|
for _ in range(workers):
|
||||||
process = Process(target=serve, kwargs=server_settings)
|
process = Process(target=serve, kwargs=server_settings)
|
||||||
process.daemon = True
|
process.daemon = True
|
||||||
|
|
Loading…
Reference in New Issue
Block a user