Pyjoyment 0.1.0__py3-none-any.whl
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.
- Pyjo/App/ASGI.py +735 -0
- Pyjo/App/CGI.py +773 -0
- Pyjo/App/FastCGI.py +631 -0
- Pyjo/App/Lambda.py +987 -0
- Pyjo/App/WSGI.py +427 -0
- Pyjo/App/__init__.py +409 -0
- Pyjo/Asset/File.py +377 -0
- Pyjo/Asset/Memory.py +235 -0
- Pyjo/Asset/__init__.py +200 -0
- Pyjo/Base.py +215 -0
- Pyjo/Cache.py +119 -0
- Pyjo/Collection.py +570 -0
- Pyjo/Content/MultiPart.py +325 -0
- Pyjo/Content/Single.py +193 -0
- Pyjo/Content/__init__.py +806 -0
- Pyjo/Cookie/Request.py +90 -0
- Pyjo/Cookie/Response.py +294 -0
- Pyjo/Cookie/__init__.py +143 -0
- Pyjo/DOM/CSS.py +1019 -0
- Pyjo/DOM/HTML.py +550 -0
- Pyjo/DOM/__init__.py +1329 -0
- Pyjo/Date.py +294 -0
- Pyjo/EventEmitter.py +522 -0
- Pyjo/Exception.py +494 -0
- Pyjo/File.py +959 -0
- Pyjo/GetOpt.py +605 -0
- Pyjo/Headers.py +760 -0
- Pyjo/HelloWorld.py +77 -0
- Pyjo/Home.py +109 -0
- Pyjo/IOLoop/ChildProcess.py +591 -0
- Pyjo/IOLoop/Client.py +736 -0
- Pyjo/IOLoop/Datagram.py +982 -0
- Pyjo/IOLoop/Messages.py +664 -0
- Pyjo/IOLoop/Server.py +458 -0
- Pyjo/IOLoop/Stdio.py +446 -0
- Pyjo/IOLoop/Stream.py +644 -0
- Pyjo/IOLoop/Subprocess.py +419 -0
- Pyjo/IOLoop/TLS.py +360 -0
- Pyjo/IOLoop/__init__.py +1036 -0
- Pyjo/IOLoop/certs/README.md +41 -0
- Pyjo/IOLoop/certs/ca.crt +20 -0
- Pyjo/IOLoop/certs/server.crt +21 -0
- Pyjo/IOLoop/certs/server.key +28 -0
- Pyjo/JSON/Pointer.py +135 -0
- Pyjo/JSON/RPC.py +772 -0
- Pyjo/JSON/Schema.py +2506 -0
- Pyjo/JSON/__init__.py +573 -0
- Pyjo/Loader.py +342 -0
- Pyjo/Log.py +723 -0
- Pyjo/Message/Request.py +725 -0
- Pyjo/Message/Response.py +476 -0
- Pyjo/Message/__init__.py +830 -0
- Pyjo/Parameters.py +472 -0
- Pyjo/Path.py +419 -0
- Pyjo/Promise.py +894 -0
- Pyjo/Prove.py +1305 -0
- Pyjo/Reactor/Asyncio.py +854 -0
- Pyjo/Reactor/Poll.py +439 -0
- Pyjo/Reactor/__init__.py +525 -0
- Pyjo/SSE.py +119 -0
- Pyjo/Server/ASGI.py +486 -0
- Pyjo/Server/CGI.py +259 -0
- Pyjo/Server/Daemon.py +1007 -0
- Pyjo/Server/FastCGI.py +517 -0
- Pyjo/Server/Hot/__init__.py +687 -0
- Pyjo/Server/Hot/__main__.py +5 -0
- Pyjo/Server/Lambda.py +641 -0
- Pyjo/Server/Prefork.py +917 -0
- Pyjo/Server/Prethread.py +394 -0
- Pyjo/Server/Reload/Backend/Poll.py +114 -0
- Pyjo/Server/Reload/Backend/__init__.py +126 -0
- Pyjo/Server/Reload/__init__.py +482 -0
- Pyjo/Server/Reload/__main__.py +5 -0
- Pyjo/Server/Stdio.py +228 -0
- Pyjo/Server/WSGI.py +349 -0
- Pyjo/Server/__init__.py +396 -0
- Pyjo/String/Bytes.py +532 -0
- Pyjo/String/HTML.py +210 -0
- Pyjo/String/Mixin.py +333 -0
- Pyjo/String/Template.py +470 -0
- Pyjo/String/Unicode.py +553 -0
- Pyjo/String/__init__.py +0 -0
- Pyjo/TOML.py +232 -0
- Pyjo/Template.py +1290 -0
- Pyjo/Test/Pyjo.py +1454 -0
- Pyjo/Test/__init__.py +1233 -0
- Pyjo/Test/pytest_plugin.py +305 -0
- Pyjo/Transaction/HTTP.py +374 -0
- Pyjo/Transaction/WebSocket.py +709 -0
- Pyjo/Transaction/__init__.py +429 -0
- Pyjo/URL/Template.py +459 -0
- Pyjo/URL/__init__.py +651 -0
- Pyjo/Upload.py +139 -0
- Pyjo/UserAgent/CookieJar.py +391 -0
- Pyjo/UserAgent/Proxy.py +138 -0
- Pyjo/UserAgent/Server.py +239 -0
- Pyjo/UserAgent/Transactor.py +766 -0
- Pyjo/UserAgent/__init__.py +1243 -0
- Pyjo/Util.py +3567 -0
- Pyjo/WebSocket.py +332 -0
- Pyjo/YAML.py +1167 -0
- Pyjo/__init__.py +441 -0
- Pyjo/__main__.py +35 -0
- Pyjo/py.typed +0 -0
- Pyjoyment/Command/Author/__init__.py +20 -0
- Pyjoyment/Command/Author/generate/__init__.py +106 -0
- Pyjoyment/Command/Author/generate/app.py +299 -0
- Pyjoyment/Command/Author/generate/dockerfile.py +281 -0
- Pyjoyment/Command/Author/generate/kubernetes.py +514 -0
- Pyjoyment/Command/Author/generate/lambda_zip.py +372 -0
- Pyjoyment/Command/Author/generate/lite_app.py +113 -0
- Pyjoyment/Command/Author/generate/plugin.py +267 -0
- Pyjoyment/Command/Author/generate/pyproject.py +123 -0
- Pyjoyment/Command/Author/inflate.py +101 -0
- Pyjoyment/Command/__init__.py +332 -0
- Pyjoyment/Command/asgi.py +92 -0
- Pyjoyment/Command/cgi.py +90 -0
- Pyjoyment/Command/daemon.py +160 -0
- Pyjoyment/Command/eval.py +128 -0
- Pyjoyment/Command/fastcgi.py +99 -0
- Pyjoyment/Command/get.py +305 -0
- Pyjoyment/Command/lambda.py +117 -0
- Pyjoyment/Command/prefork.py +181 -0
- Pyjoyment/Command/prethread.py +126 -0
- Pyjoyment/Command/routes.py +133 -0
- Pyjoyment/Command/stdio.py +92 -0
- Pyjoyment/Command/version.py +141 -0
- Pyjoyment/Command/wsgi.py +93 -0
- Pyjoyment/Commands.py +546 -0
- Pyjoyment/Controller.py +1307 -0
- Pyjoyment/HelloWorld.py +56 -0
- Pyjoyment/Lite.py +494 -0
- Pyjoyment/Plugin/AllowedHosts.py +205 -0
- Pyjoyment/Plugin/Config.py +248 -0
- Pyjoyment/Plugin/DefaultHelpers.py +1202 -0
- Pyjoyment/Plugin/EPLRenderer.py +134 -0
- Pyjoyment/Plugin/EPRenderer.py +212 -0
- Pyjoyment/Plugin/HeaderCondition.py +98 -0
- Pyjoyment/Plugin/Health.py +325 -0
- Pyjoyment/Plugin/JSONConfig.py +172 -0
- Pyjoyment/Plugin/Mount.py +223 -0
- Pyjoyment/Plugin/PyRenderer.py +209 -0
- Pyjoyment/Plugin/TOMLConfig.py +141 -0
- Pyjoyment/Plugin/TagHelpers.py +959 -0
- Pyjoyment/Plugin/YAMLConfig.py +178 -0
- Pyjoyment/Plugin/__init__.py +80 -0
- Pyjoyment/Plugins.py +215 -0
- Pyjoyment/Renderer.py +673 -0
- Pyjoyment/Routes/Match.py +251 -0
- Pyjoyment/Routes/Pattern.py +443 -0
- Pyjoyment/Routes/Route.py +827 -0
- Pyjoyment/Routes/__init__.py +419 -0
- Pyjoyment/Sessions.py +255 -0
- Pyjoyment/Static.py +421 -0
- Pyjoyment/Types.py +238 -0
- Pyjoyment/Validator/Validation.py +395 -0
- Pyjoyment/Validator/__init__.py +304 -0
- Pyjoyment/__init__.py +1083 -0
- Pyjoyment/__main__.py +5 -0
- Pyjoyment/py.typed +0 -0
- Pyjoyment/resources/public/favicon.ico +0 -0
- Pyjoyment/resources/public/favicon.svg +345 -0
- Pyjoyment/resources/public/pyjo/bootstrap/LICENSE +21 -0
- Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.bundle.min.js.map +1 -0
- Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.css +6 -0
- Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.js +7 -0
- Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.min.css.map +1 -0
- Pyjoyment/resources/public/pyjo/failunicat.png +0 -0
- Pyjoyment/resources/public/pyjo/failunicat.svg +50 -0
- Pyjoyment/resources/public/pyjo/highlight.js/LICENSE +29 -0
- Pyjoyment/resources/public/pyjo/highlight.js/highlight-mojo-dark.css +56 -0
- Pyjoyment/resources/public/pyjo/highlight.js/highlight.min.js +1262 -0
- Pyjoyment/resources/public/pyjo/highlight.js/pyjoyment.min.js +1 -0
- Pyjoyment/resources/public/pyjo/logo-black-4x.png +0 -0
- Pyjoyment/resources/public/pyjo/logo-black-4x.svg +346 -0
- Pyjoyment/resources/public/pyjo/logo-white-2x.png +0 -0
- Pyjoyment/resources/public/pyjo/logo-white-2x.svg +346 -0
- Pyjoyment/resources/public/pyjo/logo-white-4x.png +0 -0
- Pyjoyment/resources/public/pyjo/logo-white-4x.svg +346 -0
- Pyjoyment/resources/public/pyjo/logo-white.png +0 -0
- Pyjoyment/resources/public/pyjo/logo-white.svg +346 -0
- Pyjoyment/resources/public/pyjo/logo.png +0 -0
- Pyjoyment/resources/public/pyjo/logo.svg +346 -0
- Pyjoyment/resources/public/pyjo/notfound.png +0 -0
- Pyjoyment/resources/public/pyjo/notfound.svg +3 -0
- Pyjoyment/resources/public/pyjo/nounicat.png +0 -0
- Pyjoyment/resources/public/pyjo/nounicat.svg +5 -0
- Pyjoyment/resources/public/pyjo/pinstripe-dark.png +0 -0
- Pyjoyment/resources/public/pyjo/pinstripe-dark.svg +4 -0
- Pyjoyment/resources/public/pyjo/pinstripe-light.png +0 -0
- Pyjoyment/resources/public/pyjo/pinstripe-light.svg +4 -0
- Pyjoyment/resources/public/pyjo/pyjo.css +204 -0
- Pyjoyment/resources/templates/pyjo/debug.html.ep +346 -0
- Pyjoyment/resources/templates/pyjo/exception.html.ep +32 -0
- Pyjoyment/resources/templates/pyjo/not_found.html.ep +45 -0
- pyjoyment-0.1.0.dist-info/METADATA +376 -0
- pyjoyment-0.1.0.dist-info/RECORD +200 -0
- pyjoyment-0.1.0.dist-info/WHEEL +4 -0
- pyjoyment-0.1.0.dist-info/entry_points.txt +8 -0
- pyjoyment-0.1.0.dist-info/licenses/LICENSE +201 -0
Pyjo/HelloWorld.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pyjo.HelloWorld - Hello World!
|
|
3
|
+
==============================
|
|
4
|
+
::
|
|
5
|
+
|
|
6
|
+
from Pyjo.HelloWorld import HelloWorld
|
|
7
|
+
|
|
8
|
+
hello = HelloWorld()
|
|
9
|
+
hello.start()
|
|
10
|
+
|
|
11
|
+
# Or import the module, as in Google Python Style Guide
|
|
12
|
+
|
|
13
|
+
import Pyjo.HelloWorld
|
|
14
|
+
|
|
15
|
+
hello = Pyjo.HelloWorld.new()
|
|
16
|
+
hello.start()
|
|
17
|
+
|
|
18
|
+
:mod:`Pyjo.HelloWorld` is the default application of :mod:`Pyjo.Server`, used
|
|
19
|
+
mostly for testing. It answers every request with ``Your Pyjo is working!``,
|
|
20
|
+
and is a :mod:`Pyjo.App` without :mod:`Pyjoyment`, whose counterpart is
|
|
21
|
+
:mod:`Pyjoyment.HelloWorld`.
|
|
22
|
+
|
|
23
|
+
See also
|
|
24
|
+
--------
|
|
25
|
+
|
|
26
|
+
:mod:`Pyjo.App`, :mod:`Pyjoyment.HelloWorld`, https://mojolicious.org.
|
|
27
|
+
|
|
28
|
+
Inspired by `Mojo::HelloWorld <https://github.com/mojolicious/mojo/blob/v9.49/lib/Mojo/HelloWorld.pm>`_ of
|
|
29
|
+
Mojolicious 9.49, an application of Mojolicious, which :mod:`Pyjoyment.HelloWorld` ports.
|
|
30
|
+
|
|
31
|
+
Classes
|
|
32
|
+
-------
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
import Pyjo.App
|
|
36
|
+
import Pyjo.Log
|
|
37
|
+
|
|
38
|
+
from typing import Any
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class Pyjo_HelloWorld(Pyjo.App.object):
|
|
42
|
+
"""
|
|
43
|
+
:mod:`Pyjo.HelloWorld` inherits all attributes and methods from
|
|
44
|
+
:mod:`Pyjo.App` and implements the following new ones.
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
def __init__(self, attrs: dict[str, Any] | None = None, /, **kwargs: Any) -> None:
|
|
48
|
+
"""::
|
|
49
|
+
|
|
50
|
+
hello = Pyjo.HelloWorld.new()
|
|
51
|
+
hello = Pyjo.HelloWorld.new(log=Pyjo.Log.new())
|
|
52
|
+
|
|
53
|
+
Construct a new :mod:`Pyjo.HelloWorld` object, which logs errors only
|
|
54
|
+
unless it gets a :attr:`~Pyjo.App.Pyjo_App.log`.
|
|
55
|
+
"""
|
|
56
|
+
super().__init__(attrs, **kwargs)
|
|
57
|
+
if self._log is None:
|
|
58
|
+
self._log = Pyjo.Log.new(level='error')
|
|
59
|
+
|
|
60
|
+
def handler(self, tx: Any) -> None:
|
|
61
|
+
"""::
|
|
62
|
+
|
|
63
|
+
hello.handler(Pyjo.Transaction.HTTP.new())
|
|
64
|
+
|
|
65
|
+
Handle the request of the transaction with the response
|
|
66
|
+
``Your Pyjo is working!``.
|
|
67
|
+
"""
|
|
68
|
+
res = tx.res
|
|
69
|
+
res.code = 200
|
|
70
|
+
res.headers.content_type = 'text/html;charset=UTF-8'
|
|
71
|
+
res.body = b'Your Pyjo is working!'
|
|
72
|
+
tx.resume()
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
new = Pyjo_HelloWorld.new
|
|
76
|
+
object = Pyjo_HelloWorld
|
|
77
|
+
HelloWorld = Pyjo_HelloWorld
|
Pyjo/Home.py
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pyjo.Home - Home sweet home
|
|
3
|
+
===========================
|
|
4
|
+
::
|
|
5
|
+
|
|
6
|
+
from Pyjo.Home import Home
|
|
7
|
+
|
|
8
|
+
# Find and manage the project root directory
|
|
9
|
+
home = Home()
|
|
10
|
+
home.detect()
|
|
11
|
+
print(home.child('templates', 'layouts', 'default.html.ep'))
|
|
12
|
+
print(f'{home}')
|
|
13
|
+
|
|
14
|
+
# Or import the module, as in Google Python Style Guide
|
|
15
|
+
|
|
16
|
+
import Pyjo.Home
|
|
17
|
+
|
|
18
|
+
# Find and manage the project root directory
|
|
19
|
+
home = Pyjo.Home.new()
|
|
20
|
+
home.detect()
|
|
21
|
+
print(home.child('templates', 'layouts', 'default.html.ep'))
|
|
22
|
+
print(f'{home}')
|
|
23
|
+
|
|
24
|
+
:mod:`Pyjo.Home` is a container for home directories based on
|
|
25
|
+
:mod:`Pyjo.File`.
|
|
26
|
+
|
|
27
|
+
See also
|
|
28
|
+
--------
|
|
29
|
+
|
|
30
|
+
:mod:`Pyjoyment`, https://mojolicious.org.
|
|
31
|
+
|
|
32
|
+
Ported from `Mojo::Home <https://github.com/mojolicious/mojo/blob/v9.49/lib/Mojo/Home.pm>`_
|
|
33
|
+
of Mojolicious 9.49.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
import Pyjo.File
|
|
37
|
+
|
|
38
|
+
import os
|
|
39
|
+
import sys
|
|
40
|
+
|
|
41
|
+
from types import ModuleType
|
|
42
|
+
from typing import Self
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class Pyjo_Home(Pyjo.File.object):
|
|
46
|
+
"""
|
|
47
|
+
:mod:`Pyjo.Home` inherits all methods from :mod:`Pyjo.File` and
|
|
48
|
+
implements the following new ones.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
def detect(self, cls: type | ModuleType | str | None = None) -> Self:
|
|
52
|
+
"""::
|
|
53
|
+
|
|
54
|
+
home = home.detect()
|
|
55
|
+
home = home.detect(MyApp)
|
|
56
|
+
home = home.detect('My.App')
|
|
57
|
+
|
|
58
|
+
Detect home directory from the value of the ``PYJO_HOME`` environment
|
|
59
|
+
variable or the location of the application class: a class, its
|
|
60
|
+
module, or the dotted name of a module that is loaded. The directory
|
|
61
|
+
of the module's file, less the parts of the name of the module and a
|
|
62
|
+
``lib``, ``blib/lib`` or ``src`` directory, is the home.
|
|
63
|
+
"""
|
|
64
|
+
# Environment variable
|
|
65
|
+
home: list[str] | None = None
|
|
66
|
+
if os.environ.get('PYJO_HOME'):
|
|
67
|
+
home = Pyjo.File.new(os.environ['PYJO_HOME']).to_list()
|
|
68
|
+
|
|
69
|
+
# Location of the application class
|
|
70
|
+
elif cls is not None and (module := _module(cls)) is not None and (file := getattr(module, '__file__', None)):
|
|
71
|
+
home = Pyjo.File.new(file).to_list()
|
|
72
|
+
parts = len(module.__name__.split('.')) + (Pyjo.File.new(file).basename() == '__init__.py')
|
|
73
|
+
del home[-parts:]
|
|
74
|
+
for name in ('lib', 'blib'):
|
|
75
|
+
if home and home[-1] == name:
|
|
76
|
+
home.pop()
|
|
77
|
+
# Not in Mojolicious: the src directory of a Python project, as lib is of a Perl one
|
|
78
|
+
if home and home[-1] == 'src':
|
|
79
|
+
home.pop()
|
|
80
|
+
|
|
81
|
+
if home is not None:
|
|
82
|
+
self._path = Pyjo.File.new(*home).to_abs().to_str()
|
|
83
|
+
return self
|
|
84
|
+
|
|
85
|
+
def rel_file(self, path: str) -> Self:
|
|
86
|
+
"""::
|
|
87
|
+
|
|
88
|
+
path = home.rel_file('foo/bar.html')
|
|
89
|
+
|
|
90
|
+
Return a new :mod:`Pyjo.Home` object relative to the home directory.
|
|
91
|
+
"""
|
|
92
|
+
return self.child(*path.split('/'))
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
# The module of a class, a module, or the longest prefix of a dotted name that is loaded
|
|
96
|
+
def _module(cls: type | ModuleType | str) -> ModuleType | None:
|
|
97
|
+
if isinstance(cls, ModuleType):
|
|
98
|
+
return cls
|
|
99
|
+
name = cls.__module__ if isinstance(cls, type) else cls
|
|
100
|
+
parts = name.split('.')
|
|
101
|
+
for i in range(len(parts), 0, -1):
|
|
102
|
+
if (module := sys.modules.get('.'.join(parts[:i]))) is not None:
|
|
103
|
+
return module
|
|
104
|
+
return None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
new = Pyjo_Home.new
|
|
108
|
+
object = Pyjo_Home
|
|
109
|
+
Home = Pyjo_Home
|