mirror of
https://github.com/fastapi-admin/fastapi-admin.git
synced 2026-03-13 10:32:25 +08:00
remove docs
This commit is contained in:
42
.github/workflows/gh-pages.yml
vendored
42
.github/workflows/gh-pages.yml
vendored
@@ -1,42 +0,0 @@
|
||||
name: deploy
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'dev'
|
||||
paths:
|
||||
- 'docs'
|
||||
pull_request:
|
||||
branches:
|
||||
- 'dev'
|
||||
paths:
|
||||
- 'docs'
|
||||
jobs:
|
||||
gh-pages:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: "3.x"
|
||||
- name: Install and configure Poetry
|
||||
uses: snok/install-poetry@v1.1.1
|
||||
with:
|
||||
virtualenvs-create: false
|
||||
- name: Install deps
|
||||
run: make deps
|
||||
- name: Build en
|
||||
run: cd docs/en && mkdocs build
|
||||
- name: Deploy en
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: docs/en/site
|
||||
- name: Build zh
|
||||
run: cd docs/zh && mkdocs build
|
||||
- name: Deploy zh
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: docs/zh/site
|
||||
destination_dir: zh
|
||||
cname: fastapi-admin-docs.long2ice.cn
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
## 文档
|
||||
|
||||
文档地址 <https://fastapi-admin-docs.long2ice.cn>。
|
||||
文档地址 <https://fastapi-admin.github.io>。
|
||||
|
||||
## 许可
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://pypi.python.org/pypi/fastapi-admin)
|
||||
[](https://github.com/fastapi-admin/fastapi-admin)
|
||||
[](https://github.com/fastapi-admin/fastapi-admin/actions?query=workflow:gh-pages)
|
||||
[](https://github.com/fastapi-admin/fastapi-admin/actions?query=workflow:deploy)
|
||||
[](https://github.com/fastapi-admin/fastapi-admin/actions?query=workflow:pypi)
|
||||
|
||||
## Introduction
|
||||
@@ -57,7 +57,7 @@ Or pro version online demo [here](https://fastapi-admin-pro.long2ice.cn/admin/lo
|
||||
|
||||
## Documentation
|
||||
|
||||
See documentation at <https://fastapi-admin-docs.long2ice.cn>.
|
||||
See documentation at <https://fastapi-admin.github.io>.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
# Extra Actions
|
||||
@@ -1 +0,0 @@
|
||||
# File Upload
|
||||
@@ -1,8 +0,0 @@
|
||||
# Override builtin pages and widgets
|
||||
|
||||
If you want override the builtin pages and widgets template, you can create a template in your own template folders same
|
||||
path as the builtin.
|
||||
|
||||
For example, the path of builtin layout template is `templates/layout.html`, you can create a template also
|
||||
named `layout.html` and put it in your template folders. The easiest way to override is just to copy the builtin
|
||||
template content then modify the content yourself.
|
||||
@@ -1,60 +0,0 @@
|
||||
# Custom Page
|
||||
|
||||
It is easy to create custom pages.
|
||||
|
||||
## Template folders
|
||||
|
||||
You should configure your template folders when configure `fastapi-admin`.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(template_folders=["templates"])
|
||||
|
||||
```
|
||||
|
||||
## Write router
|
||||
|
||||
Then write a router to render the template.
|
||||
|
||||
If you want you page can access only after login, you need use `get_current_admin` dependency.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.template import templates
|
||||
from starlette.requests import Request
|
||||
from fastapi import Depends
|
||||
from fastapi_admin.depends import get_current_admin
|
||||
|
||||
|
||||
@admin_app.get("/", dependencies=[Depends(get_current_admin)])
|
||||
async def home(request: Request):
|
||||
return templates.TemplateResponse("dashboard.html", context={"request": request})
|
||||
```
|
||||
|
||||
Don't forget to create the template `dashboard.html` and write content.
|
||||
|
||||
## Register resource
|
||||
|
||||
Finally, register it as a `Link` resource.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.resources import Link
|
||||
|
||||
|
||||
@admin_app.register
|
||||
class Dashboard(Link):
|
||||
label = "Dashboard"
|
||||
icon = "fas fa-home"
|
||||
url = "/admin"
|
||||
```
|
||||
|
||||
That's all, if you are a superuser, you can see a menu in navbar now, otherwise you need give the admin permission of
|
||||
the resource.
|
||||
@@ -1,5 +0,0 @@
|
||||
# Provider
|
||||
|
||||
## SearchProvider
|
||||
|
||||
## OAuth2Provider
|
||||
@@ -1 +0,0 @@
|
||||
# Widget
|
||||
@@ -1,33 +0,0 @@
|
||||
# Installation
|
||||
|
||||
## From pypi
|
||||
|
||||
You can install from pypi.
|
||||
|
||||
```shell
|
||||
> pip install fastapi-admin
|
||||
```
|
||||
|
||||
## From source
|
||||
|
||||
Or you can install from source with the latest code.
|
||||
|
||||
```shell
|
||||
> pip install git+https://github.com/fastapi-admin/fastapi-admin.git
|
||||
```
|
||||
|
||||
### With requirements.txt
|
||||
|
||||
Add the following line.
|
||||
|
||||
```
|
||||
-e https://github.com/fastapi-admin/fastapi-admin.git#egg=fastapi-admin
|
||||
```
|
||||
|
||||
### With poetry
|
||||
|
||||
Add the following line in section `[tool.poetry.dependencies]`.
|
||||
|
||||
```toml
|
||||
fastapi-admin = { git = 'https://github.com/fastapi-admin/fastapi-admin.git' }
|
||||
```
|
||||
@@ -1,172 +0,0 @@
|
||||
# Quick Start
|
||||
|
||||
`FastAPI-Admin` is easy to mount your `FastAPI` app, just need a few configs.
|
||||
|
||||
## Mount Admin App
|
||||
|
||||
First, you need mount the admin app from `FastAPI-Admin` as a sub application of `FastAPI`.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
app.mount("/admin", admin_app)
|
||||
|
||||
```
|
||||
|
||||
## Configure Admin App
|
||||
|
||||
There are some configs to configure the admin app, and you need to configure it on startup of `FastAPI`.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.login import UsernamePasswordProvider
|
||||
from examples.models import Admin
|
||||
import aioredis
|
||||
from fastapi import FastAPI
|
||||
|
||||
login_provider = UsernamePasswordProvider(
|
||||
admin_model=Admin,
|
||||
enable_captcha=True,
|
||||
login_logo_url="https://preview.tabler.io/static/logo.svg"
|
||||
)
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
redis = await aioredis.create_redis_pool("redis://localhost", encoding="utf8")
|
||||
admin_app.configure(
|
||||
logo_url="https://preview.tabler.io/static/logo-white.svg",
|
||||
template_folders=[os.path.join(BASE_DIR, "templates")],
|
||||
providers=[login_provider],
|
||||
redis=redis,
|
||||
)
|
||||
```
|
||||
|
||||
The full list of configs and detail can be found in [Configuration](/reference/configuration).
|
||||
|
||||
## Define And Register Resource
|
||||
|
||||
There are three kinds of resources, which are `Link`,`Model`, and `Dropdown`.
|
||||
|
||||
### Link
|
||||
|
||||
The `Link` will display a menu in sidebar with custom page or third page.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.resources import Link
|
||||
|
||||
|
||||
@app.register
|
||||
class Home(Link):
|
||||
label = "Home"
|
||||
icon = "fas fa-home"
|
||||
url = "/admin"
|
||||
```
|
||||
|
||||
### Model
|
||||
|
||||
#### Field
|
||||
|
||||
The `Field` is used in `Model` resource to define how to display and input every field in model page.
|
||||
|
||||
The `Model` make a TortoiseORM model as a menu with CURD page.
|
||||
|
||||
```python
|
||||
|
||||
from examples.models import Admin
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.file_upload import FileUpload
|
||||
from fastapi_admin.resources import Field, Model
|
||||
from fastapi_admin.widgets import displays, filters, inputs
|
||||
|
||||
upload = FileUpload(uploads=os.path.join(BASE_DIR, "static", "uploads"))
|
||||
|
||||
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
label = "Admin"
|
||||
model = Admin
|
||||
icon = "fas fa-user"
|
||||
page_pre_title = "admin list"
|
||||
page_title = "admin model"
|
||||
filters = [
|
||||
filters.Search(
|
||||
name="username", label="Name", search_mode="contains", placeholder="Search for username"
|
||||
),
|
||||
filters.Date(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
fields = [
|
||||
"id",
|
||||
"username",
|
||||
Field(
|
||||
name="password",
|
||||
label="Password",
|
||||
display=displays.InputOnly(),
|
||||
input_=inputs.Password(),
|
||||
),
|
||||
Field(name="email", label="Email", input_=inputs.Email()),
|
||||
Field(
|
||||
name="avatar",
|
||||
label="Avatar",
|
||||
display=displays.Image(width="40"),
|
||||
input_=inputs.Image(null=True, upload=upload),
|
||||
),
|
||||
"created_at",
|
||||
]
|
||||
```
|
||||
|
||||
### Dropdown
|
||||
|
||||
The `Dropdown` can contains both `Link` and `Model`, which can be nested.
|
||||
|
||||
```python
|
||||
|
||||
|
||||
from examples import enums
|
||||
from examples.models import Category, Product
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.resources import Dropdown, Field, Model
|
||||
from fastapi_admin.widgets import displays, filters
|
||||
|
||||
|
||||
@app.register
|
||||
class Content(Dropdown):
|
||||
class CategoryResource(Model):
|
||||
label = "Category"
|
||||
model = Category
|
||||
fields = ["id", "name", "slug", "created_at"]
|
||||
|
||||
class ProductResource(Model):
|
||||
label = "Product"
|
||||
model = Product
|
||||
filters = [
|
||||
filters.Enum(enum=enums.ProductType, name="type", label="ProductType"),
|
||||
filters.Datetime(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
"view_num",
|
||||
"sort",
|
||||
"is_reviewed",
|
||||
"type",
|
||||
Field(name="image", label="Image", display=displays.Image(width="40")),
|
||||
"body",
|
||||
"created_at",
|
||||
]
|
||||
|
||||
label = "Content"
|
||||
icon = "fas fa-bars"
|
||||
resources = [ProductResource, CategoryResource]
|
||||
```
|
||||
|
||||
### What's next?
|
||||
|
||||
That's all, you can run your app now. For more reference you can see [Reference](/reference).
|
||||
|
||||
Or you can see full [examples](https://github.com/fastapi-admin/fastapi-admin/tree/dev/examples).
|
||||
@@ -1 +0,0 @@
|
||||
../../../README.md
|
||||
@@ -1,113 +0,0 @@
|
||||
# Exclusive content
|
||||
|
||||
## Login Captcha
|
||||
|
||||
You can set captcha in admin login page, just set `enable_captcha=True`.
|
||||
|
||||
```python3
|
||||
login_provider = UsernamePasswordProvider(user_model=User, enable_captcha=True)
|
||||
```
|
||||
|
||||
## Google Recaptcha V2
|
||||
|
||||
In addition to captcha, you can also use `Google Recaptcha V2` to protect your site.
|
||||
|
||||
The `GoogleRecaptcha` schema:
|
||||
|
||||
```python
|
||||
class GoogleRecaptcha(BaseModel):
|
||||
cdn_url: str = "https://www.google.com/recaptcha/api.js"
|
||||
verify_url: str = "https://www.google.com/recaptcha/api/siteverify"
|
||||
site_key: str
|
||||
secret: str
|
||||
```
|
||||
|
||||
Just set `google_recaptcha` in login provider.
|
||||
|
||||
```python
|
||||
from fastapi_admin.providers.login import GoogleRecaptcha
|
||||
|
||||
await admin_app.configure(
|
||||
providers=[
|
||||
LoginProvider(
|
||||
google_recaptcha=GoogleRecaptcha(
|
||||
site_key=settings.GOOGLE_RECAPTCHA_SITE_KEY,
|
||||
secret=settings.GOOGLE_RECAPTCHA_SECRET,
|
||||
),
|
||||
),
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
## Failed Login IP Limitation
|
||||
|
||||
If you want limit login failed ip with error password, you can use `LoginPasswordMaxTryMiddleware`.
|
||||
|
||||
```python
|
||||
admin_app.add_middleware(BaseHTTPMiddleware, dispatch=LoginPasswordMaxTryMiddleware(max_times=3, after_seconds=360))
|
||||
```
|
||||
|
||||
## Permission Control
|
||||
|
||||
`PermissionProvider` allow you to configure the access control for resources of admin users with permissions `read`
|
||||
/`create`/`update`/`delete`.
|
||||
|
||||
## Additional File Upload
|
||||
|
||||
### ALiYunOSS
|
||||
|
||||
File upload for ALiYunOSS.
|
||||
|
||||
### AwsS3
|
||||
|
||||
File upload for AWS S3.
|
||||
|
||||
## Maintenance
|
||||
|
||||
If your site is in maintenance, you can set `true` to `admin_app.configure(...)`.
|
||||
|
||||
```python
|
||||
await admin_app.configure(maintenance=True)
|
||||
```
|
||||
|
||||
## Admin Log
|
||||
|
||||
If you want to log all `create/update/delete` actions, you can add `AdminLogProvider` to `admin_app.configure(...)`.
|
||||
|
||||
```python
|
||||
await admin_app.configure(providers=[AdminLogProvider(Log)])
|
||||
```
|
||||
|
||||
## Site Search
|
||||
|
||||
You can enable site search by add `SearchProvider` to `admin_app.configure(...)`.
|
||||
|
||||
```python
|
||||
await admin_app.configure(providers=[SearchProvider()])
|
||||
```
|
||||
|
||||
## Notification
|
||||
|
||||
You can use notification by adding `NotificationProvider` to `admin_app.configure(...) implement by websocket.
|
||||
|
||||
```python
|
||||
await admin_app.configure(providers=[NotificationProvider()])
|
||||
```
|
||||
|
||||
## OAuth2
|
||||
|
||||
Current there are two builtin oauth2 implementations `GitHubOAuth2Provider` and `GoogleOAuth2Provider`.
|
||||
|
||||
```python
|
||||
await admin_app.configure(
|
||||
providers=[
|
||||
GitHubProvider(Admin, settings.GITHUB_CLIENT_ID, settings.GITHUB_CLIENT_SECRET),
|
||||
GoogleProvider(
|
||||
Admin,
|
||||
settings.GOOGLE_CLIENT_ID,
|
||||
settings.GOOGLE_CLIENT_SECRET,
|
||||
redirect_uri="https://fastapi-admin-pro.long2ice.cn/admin/oauth2/google_oauth2_provider",
|
||||
),
|
||||
]
|
||||
)
|
||||
```
|
||||
@@ -1,34 +0,0 @@
|
||||
# Installation
|
||||
|
||||
Because pro version won't publish to pypi, so you can't install from it.
|
||||
|
||||
## Requirements
|
||||
|
||||
In order to access the repository programmatically (from the command line or GitHub Actions workflows), you need to create a personal access token:
|
||||
|
||||
1. Go to <https://github.com/settings/tokens>.
|
||||
2. Click on Generate a new token.
|
||||
3. Enter a name and select the repo scope.
|
||||
4. Generate the token and store it in a safe place.
|
||||
|
||||
## With pip
|
||||
|
||||
```shell
|
||||
> pip install git+https://${GH_TOKEN}@github.com/fastapi-admin/fastapi-admin-pro.git
|
||||
```
|
||||
|
||||
## With poetry
|
||||
|
||||
Add the following line in section `[tool.poetry.dependencies]`.
|
||||
|
||||
```toml
|
||||
fastapi-admin-pro = { git = 'https://${GH_TOKEN}@github.com/fastapi-admin/fastapi-admin-pro.git'}
|
||||
```
|
||||
|
||||
## In requirements.txt
|
||||
|
||||
Add the following line.
|
||||
|
||||
```shell
|
||||
-e https://${GH_TOKEN}@github.com/fastapi-admin/fastapi-admin-pro.git#egg=fastapi-admin-pro
|
||||
```
|
||||
@@ -1,32 +0,0 @@
|
||||
# Sponsor
|
||||
|
||||
The pro version is just for the sponsors. As a sponsor, you will be invited
|
||||
to [fastapi-admin](https://github.com/fastapi-admin) organization as an **outside collaborator with readonly access**,
|
||||
and you can get the pro features and get updates for a time.
|
||||
|
||||
## How to become a sponsor
|
||||
|
||||
Sponsor Link: **<https://sponsor.long2ice.cn>**
|
||||
|
||||
You can choose any sponsor way you like. After sponsor, you can email me <long2ice@gmail.com> with your GitHub account
|
||||
and sponsor way and account, then I will invite you to join [fastapi-admin](https://github.com/fastapi-admin)
|
||||
organization.
|
||||
|
||||
## Levels
|
||||
|
||||
### $18 - Month
|
||||
|
||||
You will be invited and keep collaborator role for a month.
|
||||
|
||||
### $58 - Half a Year
|
||||
|
||||
You will be invited and keep collaborator role for half a year.
|
||||
|
||||
### $98 - Year
|
||||
|
||||
You will be invited and keep collaborator role for a year.
|
||||
|
||||
## Licence
|
||||
|
||||
After you have be invited, you can read and clone and develop yourself, but please **don't distribute the source code**
|
||||
of pro version. Thanks!
|
||||
@@ -1,14 +0,0 @@
|
||||
# Support
|
||||
|
||||
Whenever you have any questions, you can open [issues](https://github.com/fastapi-admin/fastapi-admin-pro/issues/new)
|
||||
in `fastapi-admin-pro`
|
||||
repository for help, I will answer your questions as soon as possible.
|
||||
|
||||
## Feature request
|
||||
|
||||
As sponsor, you can make feature request [here](https://github.com/fastapi-admin/fastapi-admin-pro/discussions/3), and I
|
||||
will consider to implement it.
|
||||
|
||||
## Paid features
|
||||
|
||||
If you want any features which pro version is not available, you can choose payment, and I can work that for you.
|
||||
@@ -1,21 +0,0 @@
|
||||
# Upgrade from the open source version
|
||||
|
||||
It's so easy to upgrade `fastapi-admin` open source version to pro version, because pro version contains all of open
|
||||
source and has same project structure.
|
||||
|
||||
1. Uninstall open source version.
|
||||
|
||||
```shell
|
||||
> pip uninstall fastapi-admin
|
||||
```
|
||||
|
||||
2. Install pro version.
|
||||
|
||||
```shell
|
||||
> pip install git+https://${GH_TOKEN}@github.com/fastapi-admin/fastapi-admin-pro.git
|
||||
```
|
||||
|
||||
That's all, then you can add pro version exclusive content yourself without any code change.
|
||||
|
||||
And you can also see the pro version [examples](https://github.com/fastapi-admin/fastapi-admin-pro/tree/dev/examples)
|
||||
for reference.
|
||||
@@ -1,36 +0,0 @@
|
||||
# Admin Log (💗 Pro only)
|
||||
|
||||
You can enable log all actions by using the `AdminLogProvider`.
|
||||
|
||||
You should just add the `AdminLogProvider` to providers.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.admin_log import AdminLogProvider
|
||||
from examples.models import Log
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[AdminLogProvider(Log)]
|
||||
)
|
||||
```
|
||||
|
||||
The `Log` model is subclass of `fastapi_admin.models.AbstractLog`.
|
||||
|
||||
```python
|
||||
class AbstractLog(Model):
|
||||
admin = fields.ForeignKeyField("models.Admin")
|
||||
content = fields.JSONField()
|
||||
resource = fields.CharField(max_length=50)
|
||||
action = fields.CharEnumField(enums.Action, default=enums.Action.create)
|
||||
created_at = fields.DatetimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
ordering = ["-id"]
|
||||
```
|
||||
@@ -1,14 +0,0 @@
|
||||
# Error Pages
|
||||
|
||||
`fastapi-admin` can catch all `403`,`404`,`500` errors and redirect to builtin error pages.
|
||||
|
||||
To enable that, you should use `add_exception_handler`.
|
||||
|
||||
```python
|
||||
from fastapi_admin.exceptions import forbidden_error_exception, not_found_error_exception, server_error_exception
|
||||
from starlette.status import HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND, HTTP_500_INTERNAL_SERVER_ERROR
|
||||
|
||||
admin_app.add_exception_handler(HTTP_500_INTERNAL_SERVER_ERROR, server_error_exception)
|
||||
admin_app.add_exception_handler(HTTP_404_NOT_FOUND, not_found_error_exception)
|
||||
admin_app.add_exception_handler(HTTP_403_FORBIDDEN, forbidden_error_exception)
|
||||
```
|
||||
@@ -1,55 +0,0 @@
|
||||
# File Upload
|
||||
|
||||
## FileUpload
|
||||
|
||||
`fastapi_admin.file_upload.FileUpload`
|
||||
|
||||
`FileUpload` is used in `file` input widget.
|
||||
|
||||
```python
|
||||
upload = FileUpload(uploads_dir=os.path.join(BASE_DIR, "static", "uploads"))
|
||||
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
fields = [
|
||||
Field(
|
||||
name="avatar",
|
||||
label="Avatar",
|
||||
display=displays.Image(width="40"),
|
||||
input_=inputs.Image(null=True, upload=upload),
|
||||
),
|
||||
]
|
||||
```
|
||||
|
||||
### Parameters
|
||||
|
||||
- `uploads_dir`: File upload directory.
|
||||
- `allow_extensions`: Alow extensions list, default allow all extensions.
|
||||
- `max_size`: Max size allow of file upload.
|
||||
- `filename_generator`: Filename generator `Callable`, which param type passed is `starlette.datastructures.UploadFile`.
|
||||
|
||||
## ALiYunOSS (💗 Pro only)
|
||||
|
||||
`fastapi_admin.file_upload.ALiYunOSS`
|
||||
|
||||
See <https://help.aliyun.com/product/31815.html>
|
||||
|
||||
### Parameters
|
||||
|
||||
- `access_key`: Access key of aliyun.
|
||||
- `access_key_secret`: Access ket secret of aliyun.
|
||||
- `bucket`: Bucket name of aliyun oss.
|
||||
- `endpoint`: Endpoint of aliyun oss.
|
||||
|
||||
## AwsS3 (💗 Pro only)
|
||||
|
||||
`fastapi_admin.file_upload.AwsS3`
|
||||
|
||||
See <https://aws.amazon.com/s3>
|
||||
|
||||
### Parameters
|
||||
|
||||
- `access_key`: Access key of aws.
|
||||
- `access_key_secret`: Access ket secret of aws.
|
||||
- `bucket`: Bucket name of aws.
|
||||
- `region_name`: Regin name of aws.
|
||||
@@ -1,20 +0,0 @@
|
||||
# Global Search (💗 Pro only)
|
||||
|
||||
You can enable site search by add `SearchProvider` to `admin_app.configure(...)`.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.search import SearchProvider
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[SearchProvider()]
|
||||
)
|
||||
```
|
||||
|
||||
The builtin search provider can search for the all available resources by resource name.
|
||||
@@ -1,41 +0,0 @@
|
||||
# Configuration
|
||||
|
||||
You should configure predefined `app` from `fastapi-admin` on startup event of `fastapi`, because which should be in
|
||||
asyncio loop context.
|
||||
|
||||
```python
|
||||
import aioredis
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.login import UsernamePasswordProvider
|
||||
from examples.models import Admin
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
redis = await aioredis.create_redis_pool(address='redis://localhost')
|
||||
await admin_app.configure(
|
||||
logo_url="https://preview.tabler.io/static/logo-white.svg",
|
||||
template_folders=["templates"],
|
||||
providers=[
|
||||
UsernamePasswordProvider(
|
||||
login_logo_url="https://preview.tabler.io/static/logo.svg", admin_model=Admin
|
||||
)
|
||||
],
|
||||
redis=redis,
|
||||
)
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
- `logo_url`: Will show the logo image in admin dashboard.
|
||||
- `admin_path`: Default is `/admin`, but you can change to other path.
|
||||
- `maintenance`: If set to `true`, all pages will be redirected to the `/maintenance` page. (💗 Pro only)
|
||||
- `redis`: Instance of `aioredis`.
|
||||
- `default_locale`: Current support `zh_CN` and `en_US`, default is `en_US`.
|
||||
- `template_folders`: Template folders registered to jinja2 and also can be used to override builtin templates.
|
||||
- `providers`: List of providers to register, all are subclasses of `fastapi_admin.providers.Provider`.
|
||||
- `language_switch`: Whether show a language switch in page, default is `True`.
|
||||
- `default_layout`: Set default layout, current there are both layouts `layout.html` and `layout-navbar.html`, default is `layout.html`. (💗 Pro only)
|
||||
@@ -1,62 +0,0 @@
|
||||
# Login
|
||||
|
||||
## Uername and password
|
||||
|
||||
There is a builtin `UsernamePasswordProvider`, if you want to enable it, you need add in to providers.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.login import UsernamePasswordProvider
|
||||
from examples.models import Admin
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[
|
||||
LoginProvider(
|
||||
login_logo_url="https://preview.tabler.io/static/logo.svg",
|
||||
admin_model=Admin,
|
||||
)
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
Then admin can login with `username` and `password`.
|
||||
|
||||
## OAuth2 (💗 Pro only)
|
||||
|
||||
If want admin login with [oauth2](https://datatracker.ietf.org/doc/html/rfc6749) method, such as `GitHub` or `Google`,
|
||||
you can use `OAuth2Provider`.
|
||||
|
||||
Current there are two builtin providers, `GitHubOAuth2Provider` and `GoogleOAuth2Provider`.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from examples.providers import GitHubProvider, GoogleProvider, LoginProvider
|
||||
from examples.models import Admin
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[
|
||||
GitHubProvider(Admin, settings.GITHUB_CLIENT_ID, settings.GITHUB_CLIENT_SECRET),
|
||||
GoogleProvider(
|
||||
Admin,
|
||||
settings.GOOGLE_CLIENT_ID,
|
||||
settings.GOOGLE_CLIENT_SECRET,
|
||||
redirect_uri="https://fastapi-admin-pro.long2ice.cn/admin/oauth2/google_oauth2_provider",
|
||||
),
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
If you want custom oauth2 provider, just inherit `fastapi_admin.providers.login.OAuth2Provider` and implement its
|
||||
methods. And the `redirect_uri` format is `{server_url}/{admin_path}/oauth2/{provider_name}`.
|
||||
@@ -1,16 +0,0 @@
|
||||
# Middleware
|
||||
|
||||
## LoginPasswordMaxTryMiddleware (💗 Pro only)
|
||||
|
||||
If you want limit login failed ip with error password, you can use `LoginPasswordMaxTryMiddleware`.
|
||||
|
||||
```python
|
||||
from starlette.middleware.base import BaseHTTPMiddleware
|
||||
from fastapi_admin import middlewares
|
||||
from fastapi_admin.app import app as admin_app
|
||||
|
||||
admin_app.add_middleware(BaseHTTPMiddleware,
|
||||
dispatch=middlewares.LoginPasswordMaxTryMiddleware(max_times=3, after_seconds=3600))
|
||||
```
|
||||
|
||||
After that, user can try max `3` times password, if all failed, the ip will be limited `3600` seconds.
|
||||
@@ -1,48 +0,0 @@
|
||||
# Notification (💗 Pro only)
|
||||
|
||||
`FastAPI-Admin` provide a notification center implement by websocket.
|
||||
|
||||

|
||||
|
||||
## Usage
|
||||
|
||||
You should add it to providers to enable it.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.notification import NotificationProvider
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
provider = NotificationProvider()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[provider]
|
||||
)
|
||||
```
|
||||
|
||||
There are two ways to send notifications.
|
||||
|
||||
One is call `await provider.broadcast()` directly.
|
||||
|
||||
```python
|
||||
data = {
|
||||
"title": "test",
|
||||
"content": "//avatars.githubusercontent.com/u/13377178?v=4",
|
||||
"image": "https://avatars.githubusercontent.com/u/13377178?v=4",
|
||||
"link": "https://fastapi-admin-docs.long2ice.cn"
|
||||
}
|
||||
await provider.broadcast(data)
|
||||
```
|
||||
|
||||
If you want to send notifications out of application, another way is use http api.
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
requests.post('http://localhost:8000/admin/notification', json=data)
|
||||
```
|
||||
@@ -1,65 +0,0 @@
|
||||
# Permission Control (💗 Pro only)
|
||||
|
||||
There are for kinds of permissions builtin. The `Link` has only `read`, and `Model` resource has all kinds of
|
||||
permissions.
|
||||
|
||||
```python
|
||||
class Permission(str, Enum):
|
||||
create = "create"
|
||||
delete = "delete"
|
||||
update = "update"
|
||||
read = "read"
|
||||
```
|
||||
|
||||
If an admin user has no `read` for a resource, it won't show the menu in dashboard. The `update`/`delete`/`create`
|
||||
permissions is also related with the `actions` display.
|
||||
|
||||
## Usage
|
||||
|
||||
First, inherit and add the necessary models to your `models.py`.
|
||||
|
||||
```python
|
||||
from fastapi_admin.models import (
|
||||
AbstractPermission,
|
||||
AbstractResource,
|
||||
AbstractRole,
|
||||
)
|
||||
|
||||
|
||||
class Resource(AbstractResource):
|
||||
pass
|
||||
|
||||
|
||||
class Permission(AbstractPermission):
|
||||
pass
|
||||
|
||||
|
||||
class Role(AbstractRole):
|
||||
pass
|
||||
```
|
||||
|
||||
Then also add `PermissionProvider` to providers.
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.permission import PermissionProvider
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
await admin_app.configure(
|
||||
providers=[
|
||||
PermissionProvider(
|
||||
Admin,
|
||||
Resource,
|
||||
Permission,
|
||||
),
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
That's the all code, after that, all resources and permissions will autofill in database, what you need do is just add
|
||||
role and relate admins in dashboard and configure permissions yourself.
|
||||
@@ -1,221 +0,0 @@
|
||||
# Resource
|
||||
|
||||
There are three kinds of resources, `Link`,`Model` and `Dropdown`, all are inherited
|
||||
from `fastapi_admin.resources.Resource`.
|
||||
|
||||
You should use `app.register` decorator to register a resource.
|
||||
|
||||
And all icons define come from <https://tabler-icons.io> and <https://fontawesome.com>.
|
||||
|
||||
## Link
|
||||
|
||||
`Link` just display a menu with a link.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.resources import Link
|
||||
|
||||
|
||||
@app.register
|
||||
class Home(Link):
|
||||
label = "Home"
|
||||
icon = "fas fa-home"
|
||||
url = "/admin"
|
||||
```
|
||||
|
||||
## Field
|
||||
|
||||
`Field` is the object that `Model` use, which define how a field display and input.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
fields = [
|
||||
"id",
|
||||
"username",
|
||||
Field(
|
||||
name="password",
|
||||
label="Password",
|
||||
display=displays.InputOnly(),
|
||||
input_=inputs.Password(),
|
||||
),
|
||||
Field(name="email", label="Email", input_=inputs.Email()),
|
||||
Field(
|
||||
name="avatar",
|
||||
label="Avatar",
|
||||
display=displays.Image(width="40"),
|
||||
input_=inputs.Image(null=True, upload=upload),
|
||||
),
|
||||
"created_at",
|
||||
]
|
||||
```
|
||||
|
||||
You can pass `str` or `Field` to `fields`, if is `str`, it will try to auto mapping display and input widget, such
|
||||
as `displays.Boolean` for `BooleanField`, `inputs.Date` for `DateField`.
|
||||
|
||||
All kind of widgets you can find in [Display](/reference/widget/display/) and [Input](/reference/widget/input/).
|
||||
|
||||
## Action
|
||||
|
||||
The `Action` define the action display in every end of row, and bulk action for every model.
|
||||
|
||||
By default there are two actions, Which are delete action and edit action, and one bulk action, which allow delete rows
|
||||
in bulk.
|
||||
|
||||
To use that, you should override the `get_actions` and `get_bulk_actions`. The following example hide all default
|
||||
actions with return empty list.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
async def get_actions(self, request: Request) -> List[Action]:
|
||||
return []
|
||||
|
||||
async def get_bulk_actions(self, request: Request) -> List[Action]:
|
||||
return []
|
||||
```
|
||||
|
||||
## ComputeField
|
||||
|
||||
The class that `model.get_compute_fields` used.
|
||||
|
||||
```python
|
||||
class ComputeField(BaseModel):
|
||||
label: str
|
||||
name: str
|
||||
|
||||
async def get_value(self, request: Request, obj: dict):
|
||||
return obj.get(self.name)
|
||||
```
|
||||
|
||||
What you need to do is just override the `get_value` method.
|
||||
|
||||
```python
|
||||
class RestDays(ComputeField):
|
||||
async def get_value(self, request: Request, obj: dict):
|
||||
days = (obj.get(self.name) - date.today()).days
|
||||
return days if days >= 0 else 0
|
||||
```
|
||||
|
||||
## ToolbarAction
|
||||
|
||||
The class that `mode.get_toolbar_actions` used.
|
||||
|
||||
```python
|
||||
class ToolbarAction(Action):
|
||||
class_: Optional[str]
|
||||
```
|
||||
|
||||
## Model
|
||||
|
||||
`Model` is the core resource, which make TortoiseORM model as a menu and display a data table with create, update, and
|
||||
delete.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
label = "Admin"
|
||||
model = Admin
|
||||
page_pre_title = "admin list"
|
||||
page_title = "Admin Model"
|
||||
filters = [
|
||||
filters.Search(
|
||||
name="username",
|
||||
label="Name",
|
||||
search_mode="contains",
|
||||
placeholder="Search for username",
|
||||
),
|
||||
filters.Date(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
- `label`: The menu name display.
|
||||
- `model`: TortoiseORM model.
|
||||
- `page_pre_title`: Show page pre title in content.
|
||||
- `page_title`: Show page title in content.
|
||||
- `filters`: Define filters for the model, which will display filter inputs in table above, all kinds of filters you can
|
||||
find in [Filter](/reference/widget/filter/).
|
||||
|
||||
### row_attributes
|
||||
|
||||
You can add extra attributes to each row by use `row_attributes`.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class ConfigResource(Model):
|
||||
async def row_attributes(self, request: Request, obj: dict) -> dict:
|
||||
if obj.get("status") == enums.Status.on:
|
||||
return {"class": "bg-green text-white"}
|
||||
return await super().row_attributes(request, obj)
|
||||
```
|
||||
|
||||
The example above will add the css `class = "bg-green text-white"` for the row which `status = enums.Status.on`.
|
||||
|
||||
### column_attributes
|
||||
|
||||
You can add extra attributes to each column by use `column_attributes`.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class LogResource(Model):
|
||||
async def column_attributes(self, request: Request, field: Field) -> dict:
|
||||
if field.name == "content":
|
||||
return {"class": "w-50"}
|
||||
return await super().column_attributes(request, field)
|
||||
```
|
||||
|
||||
The example above will add the css `class = "w-50"` for the column which `content`.
|
||||
|
||||
### cell_attributes
|
||||
|
||||
Same as `row_attributes` but for the cell, you can add extra attributes to cell depends on the row object and column
|
||||
field.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
async def cell_attributes(self, request: Request, obj: dict, field: Field) -> dict:
|
||||
if field.name == "id":
|
||||
return {"class": "bg-danger text-white"}
|
||||
return await super().cell_attributes(request, obj, field)
|
||||
```
|
||||
|
||||
### get_compute_fields
|
||||
|
||||
In some cases we need show some extra fields which are computed from other fields, you can use `get_compute_fields`.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class SponsorResource(Model):
|
||||
async def get_compute_fields(self, request: Request) -> List[ComputeField]:
|
||||
return [RestDays(name="invalid_date", label="Days Remaining")]
|
||||
```
|
||||
|
||||
### get_toolbar_actions
|
||||
|
||||
Show toolbar actions top right of the table.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class CategoryResource(Model):
|
||||
async def get_toolbar_actions(self, request: Request) -> List[ToolbarAction]:
|
||||
actions = await super().get_toolbar_actions(request)
|
||||
actions.append(import_export_provider.import_action)
|
||||
actions.append(import_export_provider.export_action)
|
||||
return actions
|
||||
```
|
||||
|
||||
## Dropdown
|
||||
|
||||
The dropdown resource just contains `Link` and `Model` resource, and which can be nested.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class Content(Dropdown):
|
||||
label = "Content"
|
||||
icon = "fas fa-bars"
|
||||
resources = [ProductResource, CategoryResource]
|
||||
```
|
||||
@@ -1,39 +0,0 @@
|
||||
# Display
|
||||
|
||||
## Display
|
||||
|
||||
Default display, which will just display the value with any change.
|
||||
|
||||
## DatetimeDisplay
|
||||
|
||||
Will display the value by the giving format, default is `%Y-%m-%d %H:%M:%S`.
|
||||
|
||||
```python
|
||||
class DatetimeDisplay(Display):
|
||||
def __init__(self, format_: str = constants.DATETIME_FORMAT):
|
||||
```
|
||||
|
||||
## DateDisplay
|
||||
|
||||
Will display the value by the giving format, default is `%Y-%m-%d`.
|
||||
|
||||
```python
|
||||
class DatetimeDisplay(Display):
|
||||
def __init__(self, format_: str = constants.DATETIME_FORMAT):
|
||||
```
|
||||
|
||||
## InputOnly
|
||||
|
||||
Which is a special display widget, for that will not display in table content, but display in edit page only.
|
||||
|
||||
## Boolean
|
||||
|
||||
Will display the value in bool mode.
|
||||
|
||||
## Image
|
||||
|
||||
Will display the value as a image.
|
||||
|
||||
## Json
|
||||
|
||||
Will display the value with json highlight.
|
||||
@@ -1,65 +0,0 @@
|
||||
# Filter
|
||||
|
||||
The filter define how to filter the model resource.
|
||||
|
||||
## Search
|
||||
|
||||
Search by a field.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
filters = [
|
||||
filters.Search(
|
||||
name="username",
|
||||
label="Name",
|
||||
search_mode="contains",
|
||||
placeholder="Search for username",
|
||||
),
|
||||
]
|
||||
```
|
||||
|
||||
- `search_mode` choices: `equal`,`contains`,`icontains`,`startswith`,`istartswith`,`endswith`,`iendswith`,`iexact`,`search`
|
||||
|
||||
## Datetime
|
||||
|
||||
Datetime field filter.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
filters = [
|
||||
filters.Datetime(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
```
|
||||
|
||||
## Date
|
||||
|
||||
Date field filter.
|
||||
|
||||
```python
|
||||
@app.register
|
||||
class AdminResource(Model):
|
||||
filters = [
|
||||
filters.Date(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
```
|
||||
|
||||
## Select
|
||||
|
||||
Select filter.
|
||||
|
||||
## Enum
|
||||
|
||||
Like select filter but choice from a enum class.
|
||||
|
||||
```python
|
||||
class ProductResource(Model):
|
||||
filters = [
|
||||
filters.Enum(enum=enums.ProductType, name="type", label="ProductType"),
|
||||
]
|
||||
```
|
||||
|
||||
## ForeignKey
|
||||
|
||||
Like select filter but choice from a `ForeignKey` model.
|
||||
@@ -1,81 +0,0 @@
|
||||
# Input
|
||||
|
||||
## DisplayOnly
|
||||
|
||||
Which is a special display widget, for that will display in table content only but not in edit page.
|
||||
|
||||
## Text
|
||||
|
||||
Common html `input` with `type=text`.
|
||||
|
||||
## Select
|
||||
|
||||
Html select.
|
||||
|
||||
## ForeignKey
|
||||
|
||||
Like select but options come from a `ForeignKey` model.
|
||||
|
||||
## ManyToMany
|
||||
|
||||
Display a multiple select.
|
||||
|
||||
## Enum
|
||||
|
||||
Like select but options come from a enum class.
|
||||
|
||||
## Email
|
||||
|
||||
Html email input.
|
||||
|
||||
## Json
|
||||
|
||||
Display a json editor widget, based on [jsoneditor](https://github.com/josdejong/jsoneditor).
|
||||
|
||||
## TextArea
|
||||
|
||||
Html textarea input.
|
||||
|
||||
## Editor
|
||||
|
||||
Based on [quilljs](https://github.com/quilljs/quill), display a rich editor input.
|
||||
|
||||
## DateTime
|
||||
|
||||
Html datetime input.
|
||||
|
||||
## Date
|
||||
|
||||
Html date input.
|
||||
|
||||
## File
|
||||
|
||||
Html file input.
|
||||
|
||||
## Image
|
||||
|
||||
Like file but with image preview.
|
||||
|
||||
## Radio
|
||||
|
||||
Html Radio input.
|
||||
|
||||
## RadioEnum
|
||||
|
||||
Like radio but choices from a enum class.
|
||||
|
||||
## Switch
|
||||
|
||||
Display a switch, useful for bool field.
|
||||
|
||||
## Password
|
||||
|
||||
Html password input.
|
||||
|
||||
## Number
|
||||
|
||||
Html number input.
|
||||
|
||||
## Color
|
||||
|
||||
Html color input.
|
||||
@@ -1,88 +0,0 @@
|
||||
site_name: FastAPI Admin
|
||||
site_url: https://github.com/fastapi-admin/fastapi-admin
|
||||
repo_url: https://github.com/fastapi-admin/fastapi-admin
|
||||
site_description: A fast admin dashboard based on FastAPI and TortoiseORM with tabler ui, inspired by Django admin.
|
||||
repo_name: fastapi-admin/fastapi-admin
|
||||
site_author: long2ice
|
||||
theme:
|
||||
logo: https://raw.githubusercontent.com/fastapi-admin/fastapi-admin/dev/images/icon-white.svg
|
||||
favicon: https://raw.githubusercontent.com/fastapi-admin/fastapi-admin/dev/images/favicon.png
|
||||
name: material
|
||||
language: en
|
||||
icon:
|
||||
repo: fontawesome/brands/github
|
||||
palette:
|
||||
- scheme: default
|
||||
primary: teal
|
||||
accent: amber
|
||||
toggle:
|
||||
icon: material/lightbulb-outline
|
||||
name: Switch to default mode
|
||||
- scheme: slate
|
||||
primary: teal
|
||||
accent: amber
|
||||
toggle:
|
||||
icon: material/lightbulb
|
||||
name: Switch to dark mode
|
||||
features:
|
||||
- navigation.instant
|
||||
- navigation.tabs
|
||||
- search.suggest
|
||||
- search.highlight
|
||||
- navigation.top
|
||||
markdown_extensions:
|
||||
- pymdownx.highlight
|
||||
- pymdownx.inlinehilite
|
||||
- pymdownx.superfences
|
||||
nav:
|
||||
- Home: index.md
|
||||
- Getting Started:
|
||||
- getting_started/installation.md
|
||||
- getting_started/quick_start.md
|
||||
- Reference:
|
||||
- reference/index.md
|
||||
- reference/resource.md
|
||||
- Widget:
|
||||
- reference/widget/filter.md
|
||||
- reference/widget/display.md
|
||||
- reference/widget/input.md
|
||||
- reference/login.md
|
||||
- reference/file_upload.md
|
||||
- reference/middleware.md
|
||||
- reference/permission.md
|
||||
- reference/admin_log.md
|
||||
- reference/global_search.md
|
||||
- reference/errors.md
|
||||
- reference/notification.md
|
||||
- Customization:
|
||||
- custom/page.md
|
||||
- custom/overwrite.md
|
||||
- custom/widget.md
|
||||
- custom/file_upload.md
|
||||
- custom/provider.md
|
||||
- custom/action.md
|
||||
- Pro Version For Sponsor:
|
||||
- pro/sponsor.md
|
||||
- pro/exclusive.md
|
||||
- pro/installation.md
|
||||
- pro/upgrade.md
|
||||
- pro/support.md
|
||||
extra:
|
||||
alternate:
|
||||
- name: English
|
||||
link: /
|
||||
- name: 简体中文
|
||||
link: /zh/
|
||||
social:
|
||||
- icon: fontawesome/brands/github
|
||||
link: https://github.com/long2ice
|
||||
analytics:
|
||||
provider: google
|
||||
property: G-VFN6RZTCH3
|
||||
copyright: Copyright © 2021 long2ice
|
||||
|
||||
plugins:
|
||||
- search
|
||||
- git-revision-date-localized:
|
||||
type: datetime
|
||||
dev_addr: 127.0.0.1:7999
|
||||
@@ -1,33 +0,0 @@
|
||||
# 安装
|
||||
|
||||
## 从 pypi
|
||||
|
||||
You can install from pypi.
|
||||
|
||||
```shell
|
||||
> pip install fastapi-admin
|
||||
```
|
||||
|
||||
## 从源码
|
||||
|
||||
Or you can install from source with latest code.
|
||||
|
||||
```shell
|
||||
> pip install git+https://github.com/fastapi-admin/fastapi-admin.git
|
||||
```
|
||||
|
||||
### 使用 requirements.txt
|
||||
|
||||
Add the following line.
|
||||
|
||||
```
|
||||
-e https://github.com/fastapi-admin/fastapi-admin.git@develop#egg=fastapi-admin
|
||||
```
|
||||
|
||||
### 使用 poetry
|
||||
|
||||
Add the following line in section `[tool.poetry.dependencies]`.
|
||||
|
||||
```toml
|
||||
fastapi-admin = { git = 'https://github.com/fastapi-admin/fastapi-admin.git', branch = 'develop' }
|
||||
```
|
||||
@@ -1,166 +0,0 @@
|
||||
# 入门指南
|
||||
|
||||
`FastAPI-Admin` is easy to mount your `FastAPI` app, just need a few configs.
|
||||
|
||||
## Mount Admin App
|
||||
|
||||
First, you need mount the admin app from `FastAPI-Admin` as a sub application of `FastAPI`.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
app.mount("/admin", admin_app)
|
||||
|
||||
```
|
||||
|
||||
## Configure Admin App
|
||||
|
||||
There are some configs to configure the admin app, and you need to configure it on startup of `FastAPI`.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app as admin_app
|
||||
from fastapi_admin.providers.login import UsernamePasswordProvider
|
||||
import aioredis
|
||||
from fastapi import FastAPI
|
||||
|
||||
login_provider = UsernamePasswordProvider(user_model=User, enable_captcha=True)
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.on_event("startup")
|
||||
async def startup():
|
||||
redis = await aioredis.create_redis_pool("redis://localhost", encoding="utf8")
|
||||
admin_app.configure(
|
||||
logo_url="https://preview.tabler.io/static/logo-white.svg",
|
||||
login_logo_url="https://preview.tabler.io/static/logo.svg",
|
||||
template_folders=[os.path.join(BASE_DIR, "templates")],
|
||||
login_provider=login_provider,
|
||||
maintenance=False,
|
||||
redis=redis,
|
||||
)
|
||||
```
|
||||
|
||||
The full list of configs and detail can be found in [Configuration](/reference/configuration).
|
||||
|
||||
## Define And Register Resource
|
||||
|
||||
There are three kinds of resources, which are `Link`,`Model`, and `Dropdown`.
|
||||
|
||||
### Link
|
||||
|
||||
The `Link` will display a menu in sidebar with custom page or third page.
|
||||
|
||||
```python
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.resources import Link
|
||||
|
||||
|
||||
@app.register
|
||||
class Home(Link):
|
||||
label = "Home"
|
||||
icon = "ti ti-home"
|
||||
url = "/admin"
|
||||
```
|
||||
|
||||
### Field
|
||||
|
||||
The `Field` is used in `Model` resource to define how to display and input every field in model page.
|
||||
|
||||
### Model
|
||||
|
||||
The `Model` make a TortoiseORM model as a menu with CURD page.
|
||||
|
||||
```python
|
||||
|
||||
from examples.models import User
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.resources import Field, Model
|
||||
from fastapi_admin.widgets import displays, filters, inputs
|
||||
|
||||
|
||||
@app.register
|
||||
class UserResource(Model):
|
||||
label = "User"
|
||||
model = User
|
||||
icon = "ti ti-user"
|
||||
page_pre_title = "user list"
|
||||
page_title = "user model"
|
||||
filters = [
|
||||
filters.Search(
|
||||
name="username", label="Name", search_mode="contains", placeholder="Search for username"
|
||||
),
|
||||
filters.Date(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
fields = [
|
||||
"id",
|
||||
"username",
|
||||
Field(
|
||||
name="password",
|
||||
label="Password",
|
||||
display=displays.InputOnly(),
|
||||
input_=inputs.Password(),
|
||||
),
|
||||
Field(name="email", label="Email", input_=inputs.Email()),
|
||||
Field(
|
||||
name="avatar",
|
||||
label="Avatar",
|
||||
display=displays.Image(width="40"),
|
||||
input_=inputs.Image(null=True, upload_provider=upload_provider),
|
||||
),
|
||||
"is_superuser",
|
||||
"is_active",
|
||||
"created_at",
|
||||
]
|
||||
```
|
||||
|
||||
### Dropdown
|
||||
|
||||
The `Dropdown` can contains both `Link` and `Model`, which can be nested.
|
||||
|
||||
```python
|
||||
|
||||
|
||||
from examples import enums
|
||||
from examples.models import Category, Product
|
||||
from fastapi_admin.app import app
|
||||
from fastapi_admin.resources import Dropdown, Field, Model
|
||||
from fastapi_admin.widgets import displays, filters
|
||||
|
||||
|
||||
@app.register
|
||||
class Content(Dropdown):
|
||||
class CategoryResource(Model):
|
||||
label = "Category"
|
||||
model = Category
|
||||
fields = ["id", "name", "slug", "created_at"]
|
||||
|
||||
class ProductResource(Model):
|
||||
label = "Product"
|
||||
model = Product
|
||||
filters = [
|
||||
filters.Enum(enum=enums.ProductType, name="type", label="ProductType"),
|
||||
filters.Datetime(name="created_at", label="CreatedAt"),
|
||||
]
|
||||
fields = [
|
||||
"id",
|
||||
"name",
|
||||
"view_num",
|
||||
"sort",
|
||||
"is_reviewed",
|
||||
"type",
|
||||
Field(name="image", label="Image", display=displays.Image(width="40")),
|
||||
"body",
|
||||
"created_at",
|
||||
]
|
||||
|
||||
label = "Content"
|
||||
icon = "ti ti-package"
|
||||
resources = [ProductResource, CategoryResource]
|
||||
```
|
||||
|
||||
### What's next?
|
||||
|
||||
That's all, you can run your app now. For more reference you can see [Reference](/reference).
|
||||
@@ -1 +0,0 @@
|
||||
../../../README-zh.md
|
||||
@@ -1,15 +0,0 @@
|
||||
# Content
|
||||
|
||||
## Login Captcha
|
||||
|
||||
## Failed Login IP Limitation
|
||||
|
||||
## Additional File Upload Providers
|
||||
|
||||
## Error pages
|
||||
|
||||
## Free consultation
|
||||
|
||||
## Others
|
||||
|
||||
...
|
||||
@@ -1 +0,0 @@
|
||||
# Installation
|
||||
@@ -1 +0,0 @@
|
||||
# Sponsor
|
||||
@@ -1 +0,0 @@
|
||||
# Configuration
|
||||
@@ -1 +0,0 @@
|
||||
# File Upload
|
||||
@@ -1 +0,0 @@
|
||||
# Middleware
|
||||
@@ -1 +0,0 @@
|
||||
# Resource
|
||||
@@ -1,76 +0,0 @@
|
||||
site_name: FastAPI Admin
|
||||
site_url: https://github.com/fastapi-admin/fastapi-admin
|
||||
repo_url: https://github.com/fastapi-admin/fastapi-admin
|
||||
site_description: A fast admin dashboard based on FastAPI and TortoiseORM with tabler ui, inspired by Django admin.
|
||||
repo_name: fastapi-admin/fastapi-admin
|
||||
site_author: long2ice
|
||||
theme:
|
||||
logo: https://raw.githubusercontent.com/fastapi-admin/fastapi-admin/dev/images/icon-white.svg
|
||||
favicon: https://raw.githubusercontent.com/fastapi-admin/fastapi-admin/dev/images/favicon.png
|
||||
name: material
|
||||
language: zh
|
||||
icon:
|
||||
repo: fontawesome/brands/github
|
||||
palette:
|
||||
- scheme: default
|
||||
primary: teal
|
||||
accent: amber
|
||||
toggle:
|
||||
icon: material/lightbulb-outline
|
||||
name: Switch to default mode
|
||||
- scheme: slate
|
||||
primary: teal
|
||||
accent: amber
|
||||
toggle:
|
||||
icon: material/lightbulb
|
||||
name: Switch to dark mode
|
||||
features:
|
||||
- navigation.instant
|
||||
- navigation.tabs
|
||||
- search.suggest
|
||||
- search.highlight
|
||||
- navigation.top
|
||||
markdown_extensions:
|
||||
- pymdownx.highlight
|
||||
- pymdownx.inlinehilite
|
||||
- pymdownx.superfences
|
||||
nav:
|
||||
- 首页: index.md
|
||||
- 入门指南:
|
||||
- getting_started/installation.md
|
||||
- getting_started/quickstart.md
|
||||
- 参考:
|
||||
- reference/configuration.md
|
||||
- reference/resource.md
|
||||
- 组件:
|
||||
- reference/widget/filter.md
|
||||
- reference/widget/display.md
|
||||
- reference/widget/input.md
|
||||
- reference/file_upload.md
|
||||
- reference/middleware.md
|
||||
- 自定义:
|
||||
- custom/page.md
|
||||
- custom/overwrite.md
|
||||
- custom/login.md
|
||||
- custom/file.md
|
||||
- custom/widget.md
|
||||
- 赞助者 Pro 版本:
|
||||
- pro/index.md
|
||||
- pro/sponsor.md
|
||||
- pro/installation.md
|
||||
extra:
|
||||
alternate:
|
||||
- name: English
|
||||
link: /
|
||||
- name: 简体中文
|
||||
link: /zh/
|
||||
social:
|
||||
- icon: fontawesome/brands/github
|
||||
link: https://github.com/long2ice
|
||||
|
||||
copyright: Copyright © 2021 long2ice
|
||||
|
||||
plugins:
|
||||
- git-revision-date-localized:
|
||||
type: datetime
|
||||
dev_addr: 127.0.0.1:7999
|
||||
@@ -152,7 +152,7 @@ class GithubLink(Link):
|
||||
@app.register
|
||||
class DocumentationLink(Link):
|
||||
label = "Documentation"
|
||||
url = "https://fastapi-admin-docs.long2ice.cn"
|
||||
url = "https://fastapi-admin.github.io"
|
||||
icon = "fas fa-file-code"
|
||||
target = "_blank"
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<ul class="list-inline list-inline-dots mb-0">
|
||||
<li class="list-inline-item">
|
||||
<a
|
||||
href="https://fastapi-admin-docs.long2ice.cn"
|
||||
href="https://fastapi-admin.github.io"
|
||||
class="link-secondary"
|
||||
target="_blank"
|
||||
>Documentation</a
|
||||
|
||||
525
poetry.lock
generated
525
poetry.lock
generated
@@ -29,14 +29,6 @@ python-versions = ">=3.6"
|
||||
[package.dependencies]
|
||||
typing_extensions = ">=3.7.2"
|
||||
|
||||
[[package]]
|
||||
name = "apipkg"
|
||||
version = "1.5"
|
||||
description = "apipkg: namespace control and lazy-import mechanism"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
|
||||
[[package]]
|
||||
name = "appdirs"
|
||||
version = "1.4.4"
|
||||
@@ -47,7 +39,7 @@ python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "asgiref"
|
||||
version = "3.3.4"
|
||||
version = "3.4.1"
|
||||
description = "ASGI specs, helper code, and adapters"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -61,7 +53,7 @@ tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"]
|
||||
|
||||
[[package]]
|
||||
name = "astroid"
|
||||
version = "2.5.6"
|
||||
version = "2.6.2"
|
||||
description = "An abstract syntax tree for Python with inference support."
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -70,6 +62,7 @@ python-versions = "~=3.6"
|
||||
[package.dependencies]
|
||||
lazy-object-proxy = ">=1.4.0"
|
||||
typed-ast = {version = ">=1.4.0,<1.5", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""}
|
||||
typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""}
|
||||
wrapt = ">=1.11,<1.13"
|
||||
|
||||
[[package]]
|
||||
@@ -82,7 +75,7 @@ python-versions = ">=3.5.3"
|
||||
|
||||
[[package]]
|
||||
name = "asyncmy"
|
||||
version = "0.1.6"
|
||||
version = "0.1.7"
|
||||
description = "A fast asyncio MySQL driver"
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -139,7 +132,7 @@ typecheck = ["mypy"]
|
||||
|
||||
[[package]]
|
||||
name = "black"
|
||||
version = "21.5b2"
|
||||
version = "21.6b0"
|
||||
description = "The uncompromising code formatter."
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -194,21 +187,18 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||
|
||||
[[package]]
|
||||
name = "execnet"
|
||||
version = "1.8.1"
|
||||
version = "1.9.0"
|
||||
description = "execnet: rapid multi-Python deployment"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||
|
||||
[package.dependencies]
|
||||
apipkg = ">=1.4"
|
||||
|
||||
[package.extras]
|
||||
testing = ["pre-commit"]
|
||||
|
||||
[[package]]
|
||||
name = "fastapi"
|
||||
version = "0.65.1"
|
||||
version = "0.66.0"
|
||||
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -221,7 +211,7 @@ starlette = "0.14.2"
|
||||
[package.extras]
|
||||
all = ["requests (>=2.24.0,<3.0.0)", "aiofiles (>=0.5.0,<0.6.0)", "jinja2 (>=2.11.2,<3.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<2.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "graphene (>=2.1.8,<3.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)"]
|
||||
dev = ["python-jose[cryptography] (>=3.1.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "graphene (>=2.1.8,<3.0.0)"]
|
||||
doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=6.1.4,<7.0.0)", "markdown-include (>=0.5.1,<0.6.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer-cli (>=0.0.9,<0.0.10)", "pyyaml (>=5.3.1,<6.0.0)"]
|
||||
doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=7.1.9,<8.0.0)", "markdown-include (>=0.6.0,<0.7.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer-cli (>=0.0.12,<0.0.13)", "pyyaml (>=5.3.1,<6.0.0)"]
|
||||
test = ["pytest (==5.4.3)", "pytest-cov (==2.10.0)", "pytest-asyncio (>=0.14.0,<0.15.0)", "mypy (==0.812)", "flake8 (>=3.8.3,<4.0.0)", "black (==20.8b1)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.15.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.4.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.4.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "aiofiles (>=0.5.0,<0.6.0)", "flask (>=1.1.2,<2.0.0)"]
|
||||
|
||||
[[package]]
|
||||
@@ -239,12 +229,18 @@ pycodestyle = ">=2.7.0,<2.8.0"
|
||||
pyflakes = ">=2.3.0,<2.4.0"
|
||||
|
||||
[[package]]
|
||||
name = "future"
|
||||
version = "0.18.2"
|
||||
description = "Clean single-source support for Python 3 and 2"
|
||||
name = "ghp-import"
|
||||
version = "2.0.1"
|
||||
description = "Copy your docs directly to the gh-pages branch."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
python-dateutil = ">=2.8.1"
|
||||
|
||||
[package.extras]
|
||||
dev = ["twine", "markdown", "flake8"]
|
||||
|
||||
[[package]]
|
||||
name = "gitdb"
|
||||
@@ -259,11 +255,11 @@ smmap = ">=3.0.1,<5"
|
||||
|
||||
[[package]]
|
||||
name = "gitpython"
|
||||
version = "3.1.17"
|
||||
version = "3.1.18"
|
||||
description = "Python Git Library"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
gitdb = ">=4.0.1,<5"
|
||||
@@ -298,7 +294,7 @@ test = ["Cython (==0.29.22)"]
|
||||
|
||||
[[package]]
|
||||
name = "importlib-metadata"
|
||||
version = "4.4.0"
|
||||
version = "4.6.1"
|
||||
description = "Read metadata from Python packages"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -310,7 +306,8 @@ zipp = ">=0.5"
|
||||
|
||||
[package.extras]
|
||||
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
|
||||
perf = ["ipython"]
|
||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"]
|
||||
|
||||
[[package]]
|
||||
name = "iniconfig"
|
||||
@@ -330,16 +327,17 @@ python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "isort"
|
||||
version = "5.8.0"
|
||||
version = "5.9.2"
|
||||
description = "A Python utility / library to sort Python imports."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6,<4.0"
|
||||
python-versions = ">=3.6.1,<4.0"
|
||||
|
||||
[package.extras]
|
||||
pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
|
||||
requirements_deprecated_finder = ["pipreqs", "pip-api"]
|
||||
colors = ["colorama (>=0.4.3,<0.5.0)"]
|
||||
plugins = ["setuptools"]
|
||||
|
||||
[[package]]
|
||||
name = "jinja2"
|
||||
@@ -355,14 +353,6 @@ MarkupSafe = ">=2.0"
|
||||
[package.extras]
|
||||
i18n = ["Babel (>=2.7)"]
|
||||
|
||||
[[package]]
|
||||
name = "joblib"
|
||||
version = "1.0.1"
|
||||
description = "Lightweight pipelining with Python functions"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "lazy-object-proxy"
|
||||
version = "1.6.0"
|
||||
@@ -371,34 +361,6 @@ category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
|
||||
[[package]]
|
||||
name = "livereload"
|
||||
version = "2.6.3"
|
||||
description = "Python LiveReload is an awesome tool for web developers"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
six = "*"
|
||||
tornado = {version = "*", markers = "python_version > \"2.7\""}
|
||||
|
||||
[[package]]
|
||||
name = "lunr"
|
||||
version = "0.5.8"
|
||||
description = "A Python implementation of Lunr.js"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[package.dependencies]
|
||||
future = ">=0.16.0"
|
||||
nltk = {version = ">=3.2.5", optional = true, markers = "python_version > \"2.7\" and extra == \"languages\""}
|
||||
six = ">=1.11.0"
|
||||
|
||||
[package.extras]
|
||||
languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"]
|
||||
|
||||
[[package]]
|
||||
name = "markdown"
|
||||
version = "3.3.4"
|
||||
@@ -429,22 +391,36 @@ category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "mergedeep"
|
||||
version = "1.3.4"
|
||||
description = "A deep merge function for 🐍."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs"
|
||||
version = "1.1.2"
|
||||
version = "1.2.1"
|
||||
description = "Project documentation with Markdown."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
click = ">=3.3"
|
||||
ghp-import = ">=1.0"
|
||||
importlib-metadata = ">=3.10"
|
||||
Jinja2 = ">=2.10.1"
|
||||
livereload = ">=2.5.1"
|
||||
lunr = {version = "0.5.8", extras = ["languages"]}
|
||||
Markdown = ">=3.2.1"
|
||||
mergedeep = ">=1.3.4"
|
||||
packaging = ">=20.5"
|
||||
PyYAML = ">=3.10"
|
||||
tornado = ">=5.0"
|
||||
pyyaml-env-tag = ">=0.1"
|
||||
watchdog = ">=2.0"
|
||||
|
||||
[package.extras]
|
||||
i18n = ["babel (>=2.9.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs-git-revision-date-localized-plugin"
|
||||
@@ -461,7 +437,7 @@ mkdocs = ">=1.0"
|
||||
|
||||
[[package]]
|
||||
name = "mkdocs-material"
|
||||
version = "7.1.6"
|
||||
version = "7.1.9"
|
||||
description = "A Material Design theme for MkDocs"
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -487,7 +463,7 @@ mkdocs-material = ">=5.0.0"
|
||||
|
||||
[[package]]
|
||||
name = "mypy"
|
||||
version = "0.812"
|
||||
version = "0.910"
|
||||
description = "Optional static typing for Python"
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -495,11 +471,13 @@ python-versions = ">=3.5"
|
||||
|
||||
[package.dependencies]
|
||||
mypy-extensions = ">=0.4.3,<0.5.0"
|
||||
typed-ast = ">=1.4.0,<1.5.0"
|
||||
toml = "*"
|
||||
typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""}
|
||||
typing-extensions = ">=3.7.4"
|
||||
|
||||
[package.extras]
|
||||
dmypy = ["psutil (>=4.0)"]
|
||||
python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "mypy-extensions"
|
||||
@@ -509,35 +487,13 @@ category = "dev"
|
||||
optional = false
|
||||
python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "nltk"
|
||||
version = "3.6.2"
|
||||
description = "Natural Language Toolkit"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.5.*"
|
||||
|
||||
[package.dependencies]
|
||||
click = "*"
|
||||
joblib = "*"
|
||||
regex = "*"
|
||||
tqdm = "*"
|
||||
|
||||
[package.extras]
|
||||
all = ["matplotlib", "twython", "scipy", "numpy", "gensim (<4.0.0)", "python-crfsuite", "pyparsing", "scikit-learn", "requests"]
|
||||
corenlp = ["requests"]
|
||||
machine_learning = ["gensim (<4.0.0)", "numpy", "python-crfsuite", "scikit-learn", "scipy"]
|
||||
plot = ["matplotlib"]
|
||||
tgrep = ["pyparsing"]
|
||||
twitter = ["twython"]
|
||||
|
||||
[[package]]
|
||||
name = "packaging"
|
||||
version = "20.9"
|
||||
version = "21.0"
|
||||
description = "Core utilities for Python packages"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
pyparsing = ">=2.0.2"
|
||||
@@ -633,14 +589,14 @@ python-versions = ">=3.5"
|
||||
|
||||
[[package]]
|
||||
name = "pylint"
|
||||
version = "2.8.3"
|
||||
version = "2.9.3"
|
||||
description = "python code static checker"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "~=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
astroid = "2.5.6"
|
||||
astroid = ">=2.6.2,<2.7"
|
||||
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||
isort = ">=4.2.5,<6"
|
||||
mccabe = ">=0.6,<0.7"
|
||||
@@ -737,11 +693,11 @@ dev = ["pre-commit", "tox", "pytest-asyncio"]
|
||||
|
||||
[[package]]
|
||||
name = "pytest-xdist"
|
||||
version = "2.2.1"
|
||||
version = "2.3.0"
|
||||
description = "pytest xdist plugin for distributed testing and loop-on-failing modes"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.5"
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
execnet = ">=1.1"
|
||||
@@ -765,7 +721,7 @@ six = ">=1.5"
|
||||
|
||||
[[package]]
|
||||
name = "python-dotenv"
|
||||
version = "0.17.1"
|
||||
version = "0.18.0"
|
||||
description = "Read key-value pairs from a .env file and set them as environment variables"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -809,9 +765,20 @@ category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
|
||||
|
||||
[[package]]
|
||||
name = "pyyaml-env-tag"
|
||||
version = "0.1"
|
||||
description = "A custom YAML tag for referencing environment variables in YAML files. "
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.dependencies]
|
||||
pyyaml = "*"
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "2021.4.4"
|
||||
version = "2021.7.6"
|
||||
description = "Alternative regular expression module, to replace re."
|
||||
category = "dev"
|
||||
optional = false
|
||||
@@ -852,17 +819,9 @@ category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||
|
||||
[[package]]
|
||||
name = "tornado"
|
||||
version = "6.1"
|
||||
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">= 3.5"
|
||||
|
||||
[[package]]
|
||||
name = "tortoise-orm"
|
||||
version = "0.17.4"
|
||||
version = "0.17.5"
|
||||
description = "Easy async ORM for python, built with relations in mind"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -881,19 +840,6 @@ asyncmy = ["asyncmy"]
|
||||
asyncpg = ["asyncpg"]
|
||||
accel = ["ciso8601 (>=2.1.2,<3.0.0)", "python-rapidjson", "uvloop (>=0.14.0,<0.15.0)"]
|
||||
|
||||
[[package]]
|
||||
name = "tqdm"
|
||||
version = "4.61.0"
|
||||
description = "Fast, Extensible Progress Meter"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
|
||||
|
||||
[package.extras]
|
||||
dev = ["py-make (>=0.1.0)", "twine", "wheel"]
|
||||
notebook = ["ipywidgets (>=6)"]
|
||||
telegram = ["requests"]
|
||||
|
||||
[[package]]
|
||||
name = "typed-ast"
|
||||
version = "1.4.3"
|
||||
@@ -947,6 +893,17 @@ dev = ["Cython (>=0.29.20,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=1.7.3,<1.8.0
|
||||
docs = ["Sphinx (>=1.7.3,<1.8.0)", "sphinxcontrib-asyncio (>=0.2.0,<0.3.0)", "sphinx-rtd-theme (>=0.2.4,<0.3.0)"]
|
||||
test = ["aiohttp", "flake8 (>=3.8.4,<3.9.0)", "psutil", "pycodestyle (>=2.6.0,<2.7.0)", "pyOpenSSL (>=19.0.0,<19.1.0)", "mypy (>=0.800)"]
|
||||
|
||||
[[package]]
|
||||
name = "watchdog"
|
||||
version = "2.1.3"
|
||||
description = "Filesystem events monitoring"
|
||||
category = "dev"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
|
||||
[package.extras]
|
||||
watchmedo = ["PyYAML (>=3.10)", "argh (>=0.24.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "watchgod"
|
||||
version = "0.7"
|
||||
@@ -973,7 +930,7 @@ python-versions = "*"
|
||||
|
||||
[[package]]
|
||||
name = "zipp"
|
||||
version = "3.4.1"
|
||||
version = "3.5.0"
|
||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||
category = "main"
|
||||
optional = false
|
||||
@@ -981,7 +938,7 @@ python-versions = ">=3.6"
|
||||
|
||||
[package.extras]
|
||||
docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"]
|
||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
||||
testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
||||
|
||||
[metadata]
|
||||
lock-version = "1.1"
|
||||
@@ -1001,29 +958,25 @@ aiosqlite = [
|
||||
{file = "aiosqlite-0.16.1-py3-none-any.whl", hash = "sha256:1df802815bb1e08a26c06d5ea9df589bcb8eec56e5f3378103b0f9b223c6703c"},
|
||||
{file = "aiosqlite-0.16.1.tar.gz", hash = "sha256:2e915463164efa65b60fd1901aceca829b6090082f03082618afca6fb9c8fdf7"},
|
||||
]
|
||||
apipkg = [
|
||||
{file = "apipkg-1.5-py2.py3-none-any.whl", hash = "sha256:58587dd4dc3daefad0487f6d9ae32b4542b185e1c36db6993290e7c41ca2b47c"},
|
||||
{file = "apipkg-1.5.tar.gz", hash = "sha256:37228cda29411948b422fae072f57e31d3396d2ee1c9783775980ee9c9990af6"},
|
||||
]
|
||||
appdirs = [
|
||||
{file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"},
|
||||
{file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
|
||||
]
|
||||
asgiref = [
|
||||
{file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"},
|
||||
{file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"},
|
||||
{file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"},
|
||||
{file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"},
|
||||
]
|
||||
astroid = [
|
||||
{file = "astroid-2.5.6-py3-none-any.whl", hash = "sha256:4db03ab5fc3340cf619dbc25e42c2cc3755154ce6009469766d7143d1fc2ee4e"},
|
||||
{file = "astroid-2.5.6.tar.gz", hash = "sha256:8a398dfce302c13f14bab13e2b14fe385d32b73f4e4853b9bdfb64598baa1975"},
|
||||
{file = "astroid-2.6.2-py3-none-any.whl", hash = "sha256:606b2911d10c3dcf35e58d2ee5c97360e8477d7b9f3efc3f24811c93e6fc2cd9"},
|
||||
{file = "astroid-2.6.2.tar.gz", hash = "sha256:38b95085e9d92e2ca06cf8b35c12a74fa81da395a6f9e65803742e6509c05892"},
|
||||
]
|
||||
async-timeout = [
|
||||
{file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"},
|
||||
{file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"},
|
||||
]
|
||||
asyncmy = [
|
||||
{file = "asyncmy-0.1.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:184af2f4812e6710454ff0c37af32584a493f56ac38d97c4946098b79d9176da"},
|
||||
{file = "asyncmy-0.1.6.tar.gz", hash = "sha256:7362d27fe31ee144a9454b59566fdb5f88216cb22e7513bbce37320fdf8b62e2"},
|
||||
{file = "asyncmy-0.1.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:79caa320cc105c0608a7d9e6cce9c6e29c55f77ef87b0f2fef654f004804c3b8"},
|
||||
{file = "asyncmy-0.1.7.tar.gz", hash = "sha256:b59d6e8c31dc3757fae28b58c7251a100b2dcd384297ec82813befc9ecca0aef"},
|
||||
]
|
||||
atomicwrites = [
|
||||
{file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"},
|
||||
@@ -1047,8 +1000,8 @@ bcrypt = [
|
||||
{file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"},
|
||||
]
|
||||
black = [
|
||||
{file = "black-21.5b2-py3-none-any.whl", hash = "sha256:e5cf21ebdffc7a9b29d73912b6a6a9a4df4ce70220d523c21647da2eae0751ef"},
|
||||
{file = "black-21.5b2.tar.gz", hash = "sha256:1fc0e0a2c8ae7d269dfcf0c60a89afa299664f3e811395d40b1922dff8f854b5"},
|
||||
{file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"},
|
||||
{file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"},
|
||||
]
|
||||
cffi = [
|
||||
{file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"},
|
||||
@@ -1067,24 +1020,36 @@ cffi = [
|
||||
{file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"},
|
||||
{file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"},
|
||||
{file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"},
|
||||
{file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"},
|
||||
{file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"},
|
||||
{file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"},
|
||||
@@ -1098,27 +1063,27 @@ colorama = [
|
||||
{file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"},
|
||||
]
|
||||
execnet = [
|
||||
{file = "execnet-1.8.1-py2.py3-none-any.whl", hash = "sha256:e840ce25562e414ee5684864d510dbeeb0bce016bc89b22a6e5ce323b5e6552f"},
|
||||
{file = "execnet-1.8.1.tar.gz", hash = "sha256:7e3c2cdb6389542a91e9855a9cc7545fbed679e96f8808bcbb1beb325345b189"},
|
||||
{file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"},
|
||||
{file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"},
|
||||
]
|
||||
fastapi = [
|
||||
{file = "fastapi-0.65.1-py3-none-any.whl", hash = "sha256:7619282fbce0ec53c7dfa3fa262280c00ace9f6d772cfd06e4ab219dce66985e"},
|
||||
{file = "fastapi-0.65.1.tar.gz", hash = "sha256:478b7e0cbb52c9913b9903d88ae14195cb8a479c4596e0b2f2238d317840a7dc"},
|
||||
{file = "fastapi-0.66.0-py3-none-any.whl", hash = "sha256:85d8aee8c3c46171f4cb7bb3651425a42c07cb9183345d100ef55d88ca2ce15f"},
|
||||
{file = "fastapi-0.66.0.tar.gz", hash = "sha256:6ea4225448786f3d6fae737713789f87631a7455f65580de0a4a2e50471060d9"},
|
||||
]
|
||||
flake8 = [
|
||||
{file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"},
|
||||
{file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"},
|
||||
]
|
||||
future = [
|
||||
{file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"},
|
||||
ghp-import = [
|
||||
{file = "ghp-import-2.0.1.tar.gz", hash = "sha256:753de2eace6e0f7d4edfb3cce5e3c3b98cd52aadb80163303d1d036bda7b4483"},
|
||||
]
|
||||
gitdb = [
|
||||
{file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"},
|
||||
{file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"},
|
||||
]
|
||||
gitpython = [
|
||||
{file = "GitPython-3.1.17-py3-none-any.whl", hash = "sha256:29fe82050709760081f588dd50ce83504feddbebdc4da6956d02351552b1c135"},
|
||||
{file = "GitPython-3.1.17.tar.gz", hash = "sha256:ee24bdc93dce357630764db659edaf6b8d664d4ff5447ccfeedd2dc5c253f41e"},
|
||||
{file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"},
|
||||
{file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"},
|
||||
]
|
||||
h11 = [
|
||||
{file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
|
||||
@@ -1185,8 +1150,8 @@ httptools = [
|
||||
{file = "httptools-0.2.0.tar.gz", hash = "sha256:94505026be56652d7a530ab03d89474dc6021019d6b8682281977163b3471ea0"},
|
||||
]
|
||||
importlib-metadata = [
|
||||
{file = "importlib_metadata-4.4.0-py3-none-any.whl", hash = "sha256:960d52ba7c21377c990412aca380bf3642d734c2eaab78a2c39319f67c6a5786"},
|
||||
{file = "importlib_metadata-4.4.0.tar.gz", hash = "sha256:e592faad8de1bda9fe920cf41e15261e7131bcf266c30306eec00e8e225c1dd5"},
|
||||
{file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"},
|
||||
{file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"},
|
||||
]
|
||||
iniconfig = [
|
||||
{file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"},
|
||||
@@ -1197,17 +1162,13 @@ iso8601 = [
|
||||
{file = "iso8601-0.1.14.tar.gz", hash = "sha256:8aafd56fa0290496c5edbb13c311f78fa3a241f0853540da09d9363eae3ebd79"},
|
||||
]
|
||||
isort = [
|
||||
{file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"},
|
||||
{file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"},
|
||||
{file = "isort-5.9.2-py3-none-any.whl", hash = "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813"},
|
||||
{file = "isort-5.9.2.tar.gz", hash = "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"},
|
||||
]
|
||||
jinja2 = [
|
||||
{file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"},
|
||||
{file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"},
|
||||
]
|
||||
joblib = [
|
||||
{file = "joblib-1.0.1-py3-none-any.whl", hash = "sha256:feeb1ec69c4d45129954f1b7034954241eedfd6ba39b5e9e4b6883be3332d5e5"},
|
||||
{file = "joblib-1.0.1.tar.gz", hash = "sha256:9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7"},
|
||||
]
|
||||
lazy-object-proxy = [
|
||||
{file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"},
|
||||
{file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"},
|
||||
@@ -1232,13 +1193,6 @@ lazy-object-proxy = [
|
||||
{file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"},
|
||||
{file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"},
|
||||
]
|
||||
livereload = [
|
||||
{file = "livereload-2.6.3.tar.gz", hash = "sha256:776f2f865e59fde56490a56bcc6773b6917366bce0c267c60ee8aaf1a0959869"},
|
||||
]
|
||||
lunr = [
|
||||
{file = "lunr-0.5.8-py2.py3-none-any.whl", hash = "sha256:aab3f489c4d4fab4c1294a257a30fec397db56f0a50273218ccc3efdbf01d6ca"},
|
||||
{file = "lunr-0.5.8.tar.gz", hash = "sha256:c4fb063b98eff775dd638b3df380008ae85e6cb1d1a24d1cd81a10ef6391c26e"},
|
||||
]
|
||||
markdown = [
|
||||
{file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"},
|
||||
{file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"},
|
||||
@@ -1283,57 +1237,58 @@ mccabe = [
|
||||
{file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
|
||||
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
||||
]
|
||||
mergedeep = [
|
||||
{file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
|
||||
{file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
|
||||
]
|
||||
mkdocs = [
|
||||
{file = "mkdocs-1.1.2-py3-none-any.whl", hash = "sha256:096f52ff52c02c7e90332d2e53da862fde5c062086e1b5356a6e392d5d60f5e9"},
|
||||
{file = "mkdocs-1.1.2.tar.gz", hash = "sha256:f0b61e5402b99d7789efa032c7a74c90a20220a9c81749da06dbfbcbd52ffb39"},
|
||||
{file = "mkdocs-1.2.1-py3-none-any.whl", hash = "sha256:11141126e5896dd9d279b3e4814eb488e409a0990fb638856255020406a8e2e7"},
|
||||
{file = "mkdocs-1.2.1.tar.gz", hash = "sha256:6e0ea175366e3a50d334597b0bc042b8cebd512398cdd3f6f34842d0ef524905"},
|
||||
]
|
||||
mkdocs-git-revision-date-localized-plugin = [
|
||||
{file = "mkdocs-git-revision-date-localized-plugin-0.9.2.tar.gz", hash = "sha256:c15c76d5baa1f8f37e3a4146b9a6f1b00c5a361ea959ada0703fd9ec462afbe3"},
|
||||
{file = "mkdocs_git_revision_date_localized_plugin-0.9.2-py3-none-any.whl", hash = "sha256:d4b21eeb9f212efd314a05e771cf69f2bab1f51bdaa5c9955d09410a396a069b"},
|
||||
]
|
||||
mkdocs-material = [
|
||||
{file = "mkdocs-material-7.1.6.tar.gz", hash = "sha256:b3f1aaea3e79e3c3b30babe0238915cf4ad4c4560d404bb0ac3298ee2ce004a3"},
|
||||
{file = "mkdocs_material-7.1.6-py2.py3-none-any.whl", hash = "sha256:01566c460990dad54d6ec935553b9c5c8e4e753ac3e30ba0945ceeff4ad164ac"},
|
||||
{file = "mkdocs-material-7.1.9.tar.gz", hash = "sha256:5a2fd487f769f382a7c979e869e4eab1372af58d7dec44c4365dd97ef5268cb5"},
|
||||
{file = "mkdocs_material-7.1.9-py2.py3-none-any.whl", hash = "sha256:92c8a2bd3bd44d5948eefc46ba138e2d3285cac658900112b6bf5722c7d067a5"},
|
||||
]
|
||||
mkdocs-material-extensions = [
|
||||
{file = "mkdocs-material-extensions-1.0.1.tar.gz", hash = "sha256:6947fb7f5e4291e3c61405bad3539d81e0b3cd62ae0d66ced018128af509c68f"},
|
||||
{file = "mkdocs_material_extensions-1.0.1-py3-none-any.whl", hash = "sha256:d90c807a88348aa6d1805657ec5c0b2d8d609c110e62b9dce4daf7fa981fa338"},
|
||||
]
|
||||
mypy = [
|
||||
{file = "mypy-0.812-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49"},
|
||||
{file = "mypy-0.812-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c"},
|
||||
{file = "mypy-0.812-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521"},
|
||||
{file = "mypy-0.812-cp35-cp35m-win_amd64.whl", hash = "sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"},
|
||||
{file = "mypy-0.812-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a"},
|
||||
{file = "mypy-0.812-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c"},
|
||||
{file = "mypy-0.812-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6"},
|
||||
{file = "mypy-0.812-cp36-cp36m-win_amd64.whl", hash = "sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064"},
|
||||
{file = "mypy-0.812-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56"},
|
||||
{file = "mypy-0.812-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8"},
|
||||
{file = "mypy-0.812-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7"},
|
||||
{file = "mypy-0.812-cp37-cp37m-win_amd64.whl", hash = "sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564"},
|
||||
{file = "mypy-0.812-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506"},
|
||||
{file = "mypy-0.812-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5"},
|
||||
{file = "mypy-0.812-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66"},
|
||||
{file = "mypy-0.812-cp38-cp38-win_amd64.whl", hash = "sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e"},
|
||||
{file = "mypy-0.812-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a"},
|
||||
{file = "mypy-0.812-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a"},
|
||||
{file = "mypy-0.812-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97"},
|
||||
{file = "mypy-0.812-cp39-cp39-win_amd64.whl", hash = "sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df"},
|
||||
{file = "mypy-0.812-py3-none-any.whl", hash = "sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4"},
|
||||
{file = "mypy-0.812.tar.gz", hash = "sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119"},
|
||||
{file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
|
||||
{file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
|
||||
{file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"},
|
||||
{file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"},
|
||||
{file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"},
|
||||
{file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"},
|
||||
{file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"},
|
||||
{file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"},
|
||||
{file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"},
|
||||
{file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"},
|
||||
{file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"},
|
||||
{file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"},
|
||||
{file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"},
|
||||
{file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"},
|
||||
{file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"},
|
||||
{file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"},
|
||||
{file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"},
|
||||
{file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"},
|
||||
{file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"},
|
||||
{file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"},
|
||||
{file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"},
|
||||
{file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"},
|
||||
{file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"},
|
||||
]
|
||||
mypy-extensions = [
|
||||
{file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
|
||||
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
|
||||
]
|
||||
nltk = [
|
||||
{file = "nltk-3.6.2-py3-none-any.whl", hash = "sha256:240e23ab1ab159ef9940777d30c7c72d7e76d91877099218a7585370c11f6b9e"},
|
||||
{file = "nltk-3.6.2.zip", hash = "sha256:57d556abed621ab9be225cc6d2df1edce17572efb67a3d754630c9f8381503eb"},
|
||||
]
|
||||
packaging = [
|
||||
{file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"},
|
||||
{file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"},
|
||||
{file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"},
|
||||
{file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"},
|
||||
]
|
||||
pathspec = [
|
||||
{file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"},
|
||||
@@ -1411,8 +1366,8 @@ pygments = [
|
||||
{file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"},
|
||||
]
|
||||
pylint = [
|
||||
{file = "pylint-2.8.3-py3-none-any.whl", hash = "sha256:792b38ff30903884e4a9eab814ee3523731abd3c463f3ba48d7b627e87013484"},
|
||||
{file = "pylint-2.8.3.tar.gz", hash = "sha256:0a049c5d47b629d9070c3932d13bff482b12119b6a241a93bc460b0be16953c8"},
|
||||
{file = "pylint-2.9.3-py3-none-any.whl", hash = "sha256:5d46330e6b8886c31b5e3aba5ff48c10f4aa5e76cbf9002c6544306221e63fbc"},
|
||||
{file = "pylint-2.9.3.tar.gz", hash = "sha256:23a1dc8b30459d78e9ff25942c61bb936108ccbe29dd9e71c01dc8274961709a"},
|
||||
]
|
||||
pymdown-extensions = [
|
||||
{file = "pymdown-extensions-8.2.tar.gz", hash = "sha256:b6daa94aad9e1310f9c64c8b1f01e4ce82937ab7eb53bfc92876a97aca02a6f4"},
|
||||
@@ -1443,16 +1398,16 @@ pytest-mock = [
|
||||
{file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"},
|
||||
]
|
||||
pytest-xdist = [
|
||||
{file = "pytest-xdist-2.2.1.tar.gz", hash = "sha256:718887296892f92683f6a51f25a3ae584993b06f7076ce1e1fd482e59a8220a2"},
|
||||
{file = "pytest_xdist-2.2.1-py3-none-any.whl", hash = "sha256:2447a1592ab41745955fb870ac7023026f20a5f0bfccf1b52a879bd193d46450"},
|
||||
{file = "pytest-xdist-2.3.0.tar.gz", hash = "sha256:e8ecde2f85d88fbcadb7d28cb33da0fa29bca5cf7d5967fa89fc0e97e5299ea5"},
|
||||
{file = "pytest_xdist-2.3.0-py3-none-any.whl", hash = "sha256:ed3d7da961070fce2a01818b51f6888327fb88df4379edeb6b9d990e789d9c8d"},
|
||||
]
|
||||
python-dateutil = [
|
||||
{file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
|
||||
{file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
|
||||
]
|
||||
python-dotenv = [
|
||||
{file = "python-dotenv-0.17.1.tar.gz", hash = "sha256:b1ae5e9643d5ed987fc57cc2583021e38db531946518130777734f9589b3141f"},
|
||||
{file = "python_dotenv-0.17.1-py2.py3-none-any.whl", hash = "sha256:00aa34e92d992e9f8383730816359647f358f4a3be1ba45e5a5cefd27ee91544"},
|
||||
{file = "python-dotenv-0.18.0.tar.gz", hash = "sha256:effaac3c1e58d89b3ccb4d04a40dc7ad6e0275fda25fd75ae9d323e2465e202d"},
|
||||
{file = "python_dotenv-0.18.0-py2.py3-none-any.whl", hash = "sha256:dd8fe852847f4fbfadabf6183ddd4c824a9651f02d51714fa075c95561959c7d"},
|
||||
]
|
||||
python-multipart = [
|
||||
{file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"},
|
||||
@@ -1472,64 +1427,76 @@ pyyaml = [
|
||||
{file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"},
|
||||
{file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"},
|
||||
{file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"},
|
||||
{file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"},
|
||||
{file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"},
|
||||
{file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"},
|
||||
]
|
||||
pyyaml-env-tag = [
|
||||
{file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
|
||||
{file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
|
||||
]
|
||||
regex = [
|
||||
{file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"},
|
||||
{file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"},
|
||||
{file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"},
|
||||
{file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"},
|
||||
{file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"},
|
||||
{file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"},
|
||||
{file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"},
|
||||
{file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"},
|
||||
{file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"},
|
||||
{file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"},
|
||||
{file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"},
|
||||
]
|
||||
six = [
|
||||
{file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
|
||||
@@ -1547,56 +1514,9 @@ toml = [
|
||||
{file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
|
||||
{file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
|
||||
]
|
||||
tornado = [
|
||||
{file = "tornado-6.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32"},
|
||||
{file = "tornado-6.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c"},
|
||||
{file = "tornado-6.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05"},
|
||||
{file = "tornado-6.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910"},
|
||||
{file = "tornado-6.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b"},
|
||||
{file = "tornado-6.1-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675"},
|
||||
{file = "tornado-6.1-cp35-cp35m-win32.whl", hash = "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5"},
|
||||
{file = "tornado-6.1-cp35-cp35m-win_amd64.whl", hash = "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68"},
|
||||
{file = "tornado-6.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb"},
|
||||
{file = "tornado-6.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c"},
|
||||
{file = "tornado-6.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921"},
|
||||
{file = "tornado-6.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558"},
|
||||
{file = "tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c"},
|
||||
{file = "tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085"},
|
||||
{file = "tornado-6.1-cp36-cp36m-win32.whl", hash = "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575"},
|
||||
{file = "tornado-6.1-cp36-cp36m-win_amd64.whl", hash = "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795"},
|
||||
{file = "tornado-6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f"},
|
||||
{file = "tornado-6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102"},
|
||||
{file = "tornado-6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4"},
|
||||
{file = "tornado-6.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd"},
|
||||
{file = "tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01"},
|
||||
{file = "tornado-6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d"},
|
||||
{file = "tornado-6.1-cp37-cp37m-win32.whl", hash = "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df"},
|
||||
{file = "tornado-6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37"},
|
||||
{file = "tornado-6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95"},
|
||||
{file = "tornado-6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a"},
|
||||
{file = "tornado-6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5"},
|
||||
{file = "tornado-6.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288"},
|
||||
{file = "tornado-6.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f"},
|
||||
{file = "tornado-6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6"},
|
||||
{file = "tornado-6.1-cp38-cp38-win32.whl", hash = "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326"},
|
||||
{file = "tornado-6.1-cp38-cp38-win_amd64.whl", hash = "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c"},
|
||||
{file = "tornado-6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5"},
|
||||
{file = "tornado-6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe"},
|
||||
{file = "tornado-6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea"},
|
||||
{file = "tornado-6.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2"},
|
||||
{file = "tornado-6.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0"},
|
||||
{file = "tornado-6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd"},
|
||||
{file = "tornado-6.1-cp39-cp39-win32.whl", hash = "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c"},
|
||||
{file = "tornado-6.1-cp39-cp39-win_amd64.whl", hash = "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4"},
|
||||
{file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"},
|
||||
]
|
||||
tortoise-orm = [
|
||||
{file = "tortoise-orm-0.17.4.tar.gz", hash = "sha256:8314a9ae63d3f009bac5da3e7d1f7e3f2de8f9bad43ce1efcd3e059209cd3f9d"},
|
||||
{file = "tortoise_orm-0.17.4-py3-none-any.whl", hash = "sha256:f052b6089e30748afec88669f1a1cf01a3662cdac81cf5427dfb338839ad6027"},
|
||||
]
|
||||
tqdm = [
|
||||
{file = "tqdm-4.61.0-py2.py3-none-any.whl", hash = "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493"},
|
||||
{file = "tqdm-4.61.0.tar.gz", hash = "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042"},
|
||||
{file = "tortoise-orm-0.17.5.tar.gz", hash = "sha256:65a930e6e6050866dc18a7d251a77a6dd2616e814da3ede8bda990147fa6b7d5"},
|
||||
{file = "tortoise_orm-0.17.5-py3-none-any.whl", hash = "sha256:978ec824837b44373fb1b3669d443d823c71b080e39db37db72355fde6cadc24"},
|
||||
]
|
||||
typed-ast = [
|
||||
{file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"},
|
||||
@@ -1651,6 +1571,29 @@ uvloop = [
|
||||
{file = "uvloop-0.15.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6de130d0cb78985a5d080e323b86c5ecaf3af82f4890492c05981707852f983c"},
|
||||
{file = "uvloop-0.15.2.tar.gz", hash = "sha256:2bb0624a8a70834e54dde8feed62ed63b50bad7a1265c40d6403a2ac447bce01"},
|
||||
]
|
||||
watchdog = [
|
||||
{file = "watchdog-2.1.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9628f3f85375a17614a2ab5eac7665f7f7be8b6b0a2a228e6f6a2e91dd4bfe26"},
|
||||
{file = "watchdog-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:acc4e2d5be6f140f02ee8590e51c002829e2c33ee199036fcd61311d558d89f4"},
|
||||
{file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:85b851237cf3533fabbc034ffcd84d0fa52014b3121454e5f8b86974b531560c"},
|
||||
{file = "watchdog-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a12539ecf2478a94e4ba4d13476bb2c7a2e0a2080af2bb37df84d88b1b01358a"},
|
||||
{file = "watchdog-2.1.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6fe9c8533e955c6589cfea6f3f0a1a95fb16867a211125236c82e1815932b5d7"},
|
||||
{file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d9456f0433845e7153b102fffeb767bde2406b76042f2216838af3b21707894e"},
|
||||
{file = "watchdog-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd8c595d5a93abd441ee7c5bb3ff0d7170e79031520d113d6f401d0cf49d7c8f"},
|
||||
{file = "watchdog-2.1.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0bcfe904c7d404eb6905f7106c54873503b442e8e918cc226e1828f498bdc0ca"},
|
||||
{file = "watchdog-2.1.3-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bf84bd94cbaad8f6b9cbaeef43080920f4cb0e61ad90af7106b3de402f5fe127"},
|
||||
{file = "watchdog-2.1.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b8ddb2c9f92e0c686ea77341dcb58216fa5ff7d5f992c7278ee8a392a06e86bb"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8805a5f468862daf1e4f4447b0ccf3acaff626eaa57fbb46d7960d1cf09f2e6d"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:3e305ea2757f81d8ebd8559d1a944ed83e3ab1bdf68bcf16ec851b97c08dc035"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_i686.whl", hash = "sha256:431a3ea70b20962e6dee65f0eeecd768cd3085ea613ccb9b53c8969de9f6ebd2"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:e4929ac2aaa2e4f1a30a36751160be391911da463a8799460340901517298b13"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:201cadf0b8c11922f54ec97482f95b2aafca429c4c3a4bb869a14f3c20c32686"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:3a7d242a7963174684206093846537220ee37ba9986b824a326a8bb4ef329a33"},
|
||||
{file = "watchdog-2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:54e057727dd18bd01a3060dbf5104eb5a495ca26316487e0f32a394fd5fe725a"},
|
||||
{file = "watchdog-2.1.3-py3-none-win32.whl", hash = "sha256:b5fc5c127bad6983eecf1ad117ab3418949f18af9c8758bd10158be3647298a9"},
|
||||
{file = "watchdog-2.1.3-py3-none-win_amd64.whl", hash = "sha256:44acad6f642996a2b50bb9ce4fb3730dde08f23e79e20cd3d8e2a2076b730381"},
|
||||
{file = "watchdog-2.1.3-py3-none-win_ia64.whl", hash = "sha256:0bcdf7b99b56a3ae069866c33d247c9994ffde91b620eaf0306b27e099bd1ae0"},
|
||||
{file = "watchdog-2.1.3.tar.gz", hash = "sha256:e5236a8e8602ab6db4b873664c2d356c365ab3cac96fbdec4970ad616415dd45"},
|
||||
]
|
||||
watchgod = [
|
||||
{file = "watchgod-0.7-py3-none-any.whl", hash = "sha256:d6c1ea21df37847ac0537ca0d6c2f4cdf513562e95f77bb93abbcf05573407b7"},
|
||||
{file = "watchgod-0.7.tar.gz", hash = "sha256:48140d62b0ebe9dd9cf8381337f06351e1f2e70b2203fa9c6eff4e572ca84f29"},
|
||||
@@ -1694,6 +1637,6 @@ wrapt = [
|
||||
{file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"},
|
||||
]
|
||||
zipp = [
|
||||
{file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"},
|
||||
{file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"},
|
||||
{file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"},
|
||||
{file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"},
|
||||
]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
[tool.poetry]
|
||||
authors = ["long2ice <long2ice@gmail.com>"]
|
||||
description = "A fast admin dashboard based on FastAPI and TortoiseORM with tabler ui, inspired by Django admin."
|
||||
documentation = "https://fastapi-admin-docs.long2ice.cn"
|
||||
documentation = "https://fastapi-admin.github.io"
|
||||
homepage = "https://github.com/fastapi-admin/fastapi-admin"
|
||||
include = [
|
||||
"LICENSE",
|
||||
|
||||
Reference in New Issue
Block a user