plain 0.21.0__tar.gz → 0.21.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- plain-0.21.2/PKG-INFO +12 -0
- plain-0.21.2/README.md +1 -0
- plain-0.21.2/plain/README.md +1 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/compile.py +25 -25
- {plain-0.21.0 → plain-0.21.2}/plain/views/objects.py +24 -12
- {plain-0.21.0 → plain-0.21.2}/pyproject.toml +1 -1
- plain-0.21.0/PKG-INFO +0 -46
- plain-0.21.0/README.md +0 -35
- plain-0.21.0/plain/README.md +0 -33
- {plain-0.21.0 → plain-0.21.2}/.gitignore +0 -0
- {plain-0.21.0 → plain-0.21.2}/LICENSE +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/__main__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/finders.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/fingerprints.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/urls.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/assets/views.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/cli.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/formatting.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/packages.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/print.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/cli/startup.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/csrf/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/csrf/middleware.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/csrf/views.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/debug.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/exceptions.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/forms/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/forms/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/forms/boundfield.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/forms/exceptions.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/forms/fields.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/forms/forms.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/http/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/http/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/http/cookie.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/http/multipartparser.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/http/request.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/http/response.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/base.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/locks.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/move.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/temp.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/uploadedfile.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/uploadhandler.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/files/utils.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/handlers/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/handlers/base.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/handlers/exception.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/handlers/wsgi.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/middleware/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/middleware/headers.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/middleware/https.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/internal/middleware/slash.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/json.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/logs/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/logs/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/logs/configure.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/logs/loggers.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/logs/utils.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/packages/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/packages/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/packages/config.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/packages/registry.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/paginator.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/files.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/messages.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/registry.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/security.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/preflight/urls.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/runtime/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/runtime/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/runtime/global_settings.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/runtime/user_settings.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/signals/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/signals/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/signals/dispatch/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/signals/dispatch/dispatcher.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/signals/dispatch/license.txt +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/signing.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/core.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/jinja/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/jinja/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/jinja/environments.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/jinja/extensions.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/jinja/filters.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/templates/jinja/globals.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/test/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/test/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/test/client.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/base.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/conf.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/converters.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/exceptions.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/urls/resolvers.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/_os.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/cache.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/connection.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/crypto.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/datastructures.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/dateformat.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/dateparse.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/dates.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/deconstruct.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/decorators.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/deprecation.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/duration.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/email.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/encoding.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/functional.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/hashable.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/html.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/http.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/inspect.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/ipv6.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/itercompat.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/module_loading.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/regex_helper.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/safestring.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/text.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/timesince.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/timezone.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/utils/tree.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/validators.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/README.md +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/base.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/csrf.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/errors.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/exceptions.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/forms.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/redirect.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/views/templates.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/plain/wsgi.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/.bolt/assets_collected/assets.json +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/.gitignore +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/app/.gitignore +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/app/settings.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/app/test/__init__.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/app/test/default_settings.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/app/urls.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/conftest.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/test_cli.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/test_runtime.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/tests/test_wsgi.py +0 -0
- {plain-0.21.0 → plain-0.21.2}/uv.lock +0 -0
plain-0.21.2/PKG-INFO
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: plain
|
3
|
+
Version: 0.21.2
|
4
|
+
Summary: A web framework for building products with Python.
|
5
|
+
Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
|
6
|
+
License-File: LICENSE
|
7
|
+
Requires-Python: >=3.11
|
8
|
+
Requires-Dist: click>=8.0.0
|
9
|
+
Requires-Dist: jinja2>=3.1.2
|
10
|
+
Description-Content-Type: text/markdown
|
11
|
+
|
12
|
+
# Plain
|
plain-0.21.2/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
./plain/README.md
|
@@ -0,0 +1 @@
|
|
1
|
+
# Plain
|
@@ -12,34 +12,34 @@ FINGERPRINT_LENGTH = 7
|
|
12
12
|
|
13
13
|
SKIP_COMPRESS_EXTENSIONS = (
|
14
14
|
# Images
|
15
|
-
"jpg",
|
16
|
-
"jpeg",
|
17
|
-
"png",
|
18
|
-
"gif",
|
19
|
-
"webp",
|
15
|
+
".jpg",
|
16
|
+
".jpeg",
|
17
|
+
".png",
|
18
|
+
".gif",
|
19
|
+
".webp",
|
20
20
|
# Compressed files
|
21
|
-
"zip",
|
22
|
-
"gz",
|
23
|
-
"tgz",
|
24
|
-
"bz2",
|
25
|
-
"tbz",
|
26
|
-
"xz",
|
27
|
-
"br",
|
21
|
+
".zip",
|
22
|
+
".gz",
|
23
|
+
".tgz",
|
24
|
+
".bz2",
|
25
|
+
".tbz",
|
26
|
+
".xz",
|
27
|
+
".br",
|
28
28
|
# Fonts
|
29
|
-
"woff",
|
30
|
-
"woff2",
|
29
|
+
".woff",
|
30
|
+
".woff2",
|
31
31
|
# Video
|
32
|
-
"3gp",
|
33
|
-
"3gpp",
|
34
|
-
"asf",
|
35
|
-
"avi",
|
36
|
-
"m4v",
|
37
|
-
"mov",
|
38
|
-
"mp4",
|
39
|
-
"mpeg",
|
40
|
-
"mpg",
|
41
|
-
"webm",
|
42
|
-
"wmv",
|
32
|
+
".3gp",
|
33
|
+
".3gpp",
|
34
|
+
".asf",
|
35
|
+
".avi",
|
36
|
+
".m4v",
|
37
|
+
".mov",
|
38
|
+
".mp4",
|
39
|
+
".mpeg",
|
40
|
+
".mpg",
|
41
|
+
".webm",
|
42
|
+
".wmv",
|
43
43
|
)
|
44
44
|
|
45
45
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from plain.exceptions import ImproperlyConfigured, ObjectDoesNotExist
|
2
|
-
from plain.
|
2
|
+
from plain.forms import Form
|
3
|
+
from plain.http import Http404, Response
|
3
4
|
|
4
5
|
from .forms import FormView
|
5
6
|
from .templates import TemplateView
|
@@ -154,30 +155,41 @@ class UpdateView(ObjectTemplateViewMixin, FormView):
|
|
154
155
|
return kwargs
|
155
156
|
|
156
157
|
|
157
|
-
class DeleteView(ObjectTemplateViewMixin,
|
158
|
+
class DeleteView(ObjectTemplateViewMixin, FormView):
|
158
159
|
"""
|
159
160
|
View for deleting an object retrieved with self.get_object(), with a
|
160
161
|
response rendered by a template.
|
161
162
|
"""
|
162
163
|
|
164
|
+
class EmptyDeleteForm(Form):
|
165
|
+
def __init__(self, instance, *args, **kwargs):
|
166
|
+
self.instance = instance
|
167
|
+
super().__init__(*args, **kwargs)
|
168
|
+
|
169
|
+
def save(self):
|
170
|
+
self.instance.delete()
|
171
|
+
|
172
|
+
form_class = EmptyDeleteForm
|
163
173
|
template_name_suffix = "_confirm_delete"
|
164
174
|
|
175
|
+
def post(self) -> Response:
|
176
|
+
"""
|
177
|
+
Handle POST requests: instantiate a form instance with the passed
|
178
|
+
POST variables and then check if it's valid.
|
179
|
+
"""
|
180
|
+
self.load_object()
|
181
|
+
return super().post()
|
182
|
+
|
165
183
|
def get_form_kwargs(self):
|
166
184
|
"""Return the keyword arguments for instantiating the form."""
|
167
185
|
kwargs = super().get_form_kwargs()
|
168
186
|
kwargs.update({"instance": self.object})
|
169
187
|
return kwargs
|
170
188
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
raise ImproperlyConfigured("No URL to redirect to. Provide a success_url.")
|
176
|
-
|
177
|
-
def post(self):
|
178
|
-
self.load_object()
|
179
|
-
self.object.delete()
|
180
|
-
return ResponseRedirect(self.get_success_url())
|
189
|
+
def form_valid(self, form):
|
190
|
+
"""If the form is valid, save the associated model."""
|
191
|
+
form.save()
|
192
|
+
return super().form_valid(form)
|
181
193
|
|
182
194
|
|
183
195
|
class ListView(TemplateView):
|
plain-0.21.0/PKG-INFO
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.4
|
2
|
-
Name: plain
|
3
|
-
Version: 0.21.0
|
4
|
-
Summary: A web framework for building products with Python.
|
5
|
-
Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
|
6
|
-
License-File: LICENSE
|
7
|
-
Requires-Python: >=3.11
|
8
|
-
Requires-Dist: click>=8.0.0
|
9
|
-
Requires-Dist: jinja2>=3.1.2
|
10
|
-
Description-Content-Type: text/markdown
|
11
|
-
|
12
|
-
<!-- This file is compiled from plain/plain/README.md. Do not edit this file directly. -->
|
13
|
-
|
14
|
-
# Plain
|
15
|
-
|
16
|
-
Plain is a web framework for building products with Python.
|
17
|
-
|
18
|
-
With the core `plain` package you can build an app that:
|
19
|
-
|
20
|
-
- Matches [URL patterns](https://plainframework.com/docs/plain/plain/urls) to Python [views](https://plainframework.com/docs/plain/plain/views)
|
21
|
-
- Handles [HTTP requests and responses](https://plainframework.com/docs/plain/plain/http)
|
22
|
-
- Renders [HTML templates](https://plainframework.com/docs/plain/plain/templates) with Jinja
|
23
|
-
- Processes user input via [forms](https://plainframework.com/docs/plain/plain/forms)
|
24
|
-
- Has a [CLI interface](https://plainframework.com/docs/plain/plain/cli)
|
25
|
-
- Serves static [assets](https://plainframework.com/docs/plain/plain/assets) (CSS, JS, images)
|
26
|
-
- Can be modified with [middleware](https://plainframework.com/docs/plain/plain/middleware)
|
27
|
-
- Integrates first-party and third-party [packages](https://plainframework.com/docs/plain/plain/packages)
|
28
|
-
- Has a [preflight check system](https://plainframework.com/docs/plain/plain/preflight)
|
29
|
-
|
30
|
-
With the official Plain ecosystem packages you can:
|
31
|
-
|
32
|
-
- Integrate a full-featured [database ORM](https://plainframework.com/docs/plain-models/)
|
33
|
-
- Use a built-in [user authentication](https://plainframework.com/docs/plain-auth/) system
|
34
|
-
- [Lint and format code](https://plainframework.com/docs/plain-code/)
|
35
|
-
- Run a [database-backed cache](https://plainframework.com/docs/plain-cache/)
|
36
|
-
- [Send emails](https://plainframework.com/docs/plain-mail/)
|
37
|
-
- Streamline [local development](https://plainframework.com/docs/plain-dev/)
|
38
|
-
- Manage [feature flags](https://plainframework.com/docs/plain-flags/)
|
39
|
-
- Integrate [HTMX](https://plainframework.com/docs/plain-htmx/)
|
40
|
-
- Style with [Tailwind CSS](https://plainframework.com/docs/plain-tailwind/)
|
41
|
-
- Add [OAuth login](https://plainframework.com/docs/plain-oauth/) and API access
|
42
|
-
- Run tests with [pytest](https://plainframework.com/docs/plain-test/)
|
43
|
-
- Run a [background job worker](https://plainframework.com/docs/plain-worker/)
|
44
|
-
- Build [staff tooling and admin dashboards](https://plainframework.com/docs/plain-staff/)
|
45
|
-
|
46
|
-
Learn more at [plainframework.com](https://plainframework.com).
|
plain-0.21.0/README.md
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
<!-- This file is compiled from plain/plain/README.md. Do not edit this file directly. -->
|
2
|
-
|
3
|
-
# Plain
|
4
|
-
|
5
|
-
Plain is a web framework for building products with Python.
|
6
|
-
|
7
|
-
With the core `plain` package you can build an app that:
|
8
|
-
|
9
|
-
- Matches [URL patterns](https://plainframework.com/docs/plain/plain/urls) to Python [views](https://plainframework.com/docs/plain/plain/views)
|
10
|
-
- Handles [HTTP requests and responses](https://plainframework.com/docs/plain/plain/http)
|
11
|
-
- Renders [HTML templates](https://plainframework.com/docs/plain/plain/templates) with Jinja
|
12
|
-
- Processes user input via [forms](https://plainframework.com/docs/plain/plain/forms)
|
13
|
-
- Has a [CLI interface](https://plainframework.com/docs/plain/plain/cli)
|
14
|
-
- Serves static [assets](https://plainframework.com/docs/plain/plain/assets) (CSS, JS, images)
|
15
|
-
- Can be modified with [middleware](https://plainframework.com/docs/plain/plain/middleware)
|
16
|
-
- Integrates first-party and third-party [packages](https://plainframework.com/docs/plain/plain/packages)
|
17
|
-
- Has a [preflight check system](https://plainframework.com/docs/plain/plain/preflight)
|
18
|
-
|
19
|
-
With the official Plain ecosystem packages you can:
|
20
|
-
|
21
|
-
- Integrate a full-featured [database ORM](https://plainframework.com/docs/plain-models/)
|
22
|
-
- Use a built-in [user authentication](https://plainframework.com/docs/plain-auth/) system
|
23
|
-
- [Lint and format code](https://plainframework.com/docs/plain-code/)
|
24
|
-
- Run a [database-backed cache](https://plainframework.com/docs/plain-cache/)
|
25
|
-
- [Send emails](https://plainframework.com/docs/plain-mail/)
|
26
|
-
- Streamline [local development](https://plainframework.com/docs/plain-dev/)
|
27
|
-
- Manage [feature flags](https://plainframework.com/docs/plain-flags/)
|
28
|
-
- Integrate [HTMX](https://plainframework.com/docs/plain-htmx/)
|
29
|
-
- Style with [Tailwind CSS](https://plainframework.com/docs/plain-tailwind/)
|
30
|
-
- Add [OAuth login](https://plainframework.com/docs/plain-oauth/) and API access
|
31
|
-
- Run tests with [pytest](https://plainframework.com/docs/plain-test/)
|
32
|
-
- Run a [background job worker](https://plainframework.com/docs/plain-worker/)
|
33
|
-
- Build [staff tooling and admin dashboards](https://plainframework.com/docs/plain-staff/)
|
34
|
-
|
35
|
-
Learn more at [plainframework.com](https://plainframework.com).
|
plain-0.21.0/plain/README.md
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# Plain
|
2
|
-
|
3
|
-
Plain is a web framework for building products with Python.
|
4
|
-
|
5
|
-
With the core `plain` package you can build an app that:
|
6
|
-
|
7
|
-
- Matches [URL patterns](./urls) to Python [views](./views)
|
8
|
-
- Handles [HTTP requests and responses](./http)
|
9
|
-
- Renders [HTML templates](./templates) with Jinja
|
10
|
-
- Processes user input via [forms](./forms)
|
11
|
-
- Has a [CLI interface](./cli)
|
12
|
-
- Serves static [assets](./assets) (CSS, JS, images)
|
13
|
-
- Can be modified with [middleware](./middleware)
|
14
|
-
- Integrates first-party and third-party [packages](./packages)
|
15
|
-
- Has a [preflight check system](./preflight)
|
16
|
-
|
17
|
-
With the official Plain ecosystem packages you can:
|
18
|
-
|
19
|
-
- Integrate a full-featured [database ORM](https://plainframework.com/docs/plain-models/)
|
20
|
-
- Use a built-in [user authentication](https://plainframework.com/docs/plain-auth/) system
|
21
|
-
- [Lint and format code](https://plainframework.com/docs/plain-code/)
|
22
|
-
- Run a [database-backed cache](https://plainframework.com/docs/plain-cache/)
|
23
|
-
- [Send emails](https://plainframework.com/docs/plain-mail/)
|
24
|
-
- Streamline [local development](https://plainframework.com/docs/plain-dev/)
|
25
|
-
- Manage [feature flags](https://plainframework.com/docs/plain-flags/)
|
26
|
-
- Integrate [HTMX](https://plainframework.com/docs/plain-htmx/)
|
27
|
-
- Style with [Tailwind CSS](https://plainframework.com/docs/plain-tailwind/)
|
28
|
-
- Add [OAuth login](https://plainframework.com/docs/plain-oauth/) and API access
|
29
|
-
- Run tests with [pytest](https://plainframework.com/docs/plain-test/)
|
30
|
-
- Run a [background job worker](https://plainframework.com/docs/plain-worker/)
|
31
|
-
- Build [staff tooling and admin dashboards](https://plainframework.com/docs/plain-staff/)
|
32
|
-
|
33
|
-
Learn more at [plainframework.com](https://plainframework.com).
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|