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.
Files changed (200) hide show
  1. Pyjo/App/ASGI.py +735 -0
  2. Pyjo/App/CGI.py +773 -0
  3. Pyjo/App/FastCGI.py +631 -0
  4. Pyjo/App/Lambda.py +987 -0
  5. Pyjo/App/WSGI.py +427 -0
  6. Pyjo/App/__init__.py +409 -0
  7. Pyjo/Asset/File.py +377 -0
  8. Pyjo/Asset/Memory.py +235 -0
  9. Pyjo/Asset/__init__.py +200 -0
  10. Pyjo/Base.py +215 -0
  11. Pyjo/Cache.py +119 -0
  12. Pyjo/Collection.py +570 -0
  13. Pyjo/Content/MultiPart.py +325 -0
  14. Pyjo/Content/Single.py +193 -0
  15. Pyjo/Content/__init__.py +806 -0
  16. Pyjo/Cookie/Request.py +90 -0
  17. Pyjo/Cookie/Response.py +294 -0
  18. Pyjo/Cookie/__init__.py +143 -0
  19. Pyjo/DOM/CSS.py +1019 -0
  20. Pyjo/DOM/HTML.py +550 -0
  21. Pyjo/DOM/__init__.py +1329 -0
  22. Pyjo/Date.py +294 -0
  23. Pyjo/EventEmitter.py +522 -0
  24. Pyjo/Exception.py +494 -0
  25. Pyjo/File.py +959 -0
  26. Pyjo/GetOpt.py +605 -0
  27. Pyjo/Headers.py +760 -0
  28. Pyjo/HelloWorld.py +77 -0
  29. Pyjo/Home.py +109 -0
  30. Pyjo/IOLoop/ChildProcess.py +591 -0
  31. Pyjo/IOLoop/Client.py +736 -0
  32. Pyjo/IOLoop/Datagram.py +982 -0
  33. Pyjo/IOLoop/Messages.py +664 -0
  34. Pyjo/IOLoop/Server.py +458 -0
  35. Pyjo/IOLoop/Stdio.py +446 -0
  36. Pyjo/IOLoop/Stream.py +644 -0
  37. Pyjo/IOLoop/Subprocess.py +419 -0
  38. Pyjo/IOLoop/TLS.py +360 -0
  39. Pyjo/IOLoop/__init__.py +1036 -0
  40. Pyjo/IOLoop/certs/README.md +41 -0
  41. Pyjo/IOLoop/certs/ca.crt +20 -0
  42. Pyjo/IOLoop/certs/server.crt +21 -0
  43. Pyjo/IOLoop/certs/server.key +28 -0
  44. Pyjo/JSON/Pointer.py +135 -0
  45. Pyjo/JSON/RPC.py +772 -0
  46. Pyjo/JSON/Schema.py +2506 -0
  47. Pyjo/JSON/__init__.py +573 -0
  48. Pyjo/Loader.py +342 -0
  49. Pyjo/Log.py +723 -0
  50. Pyjo/Message/Request.py +725 -0
  51. Pyjo/Message/Response.py +476 -0
  52. Pyjo/Message/__init__.py +830 -0
  53. Pyjo/Parameters.py +472 -0
  54. Pyjo/Path.py +419 -0
  55. Pyjo/Promise.py +894 -0
  56. Pyjo/Prove.py +1305 -0
  57. Pyjo/Reactor/Asyncio.py +854 -0
  58. Pyjo/Reactor/Poll.py +439 -0
  59. Pyjo/Reactor/__init__.py +525 -0
  60. Pyjo/SSE.py +119 -0
  61. Pyjo/Server/ASGI.py +486 -0
  62. Pyjo/Server/CGI.py +259 -0
  63. Pyjo/Server/Daemon.py +1007 -0
  64. Pyjo/Server/FastCGI.py +517 -0
  65. Pyjo/Server/Hot/__init__.py +687 -0
  66. Pyjo/Server/Hot/__main__.py +5 -0
  67. Pyjo/Server/Lambda.py +641 -0
  68. Pyjo/Server/Prefork.py +917 -0
  69. Pyjo/Server/Prethread.py +394 -0
  70. Pyjo/Server/Reload/Backend/Poll.py +114 -0
  71. Pyjo/Server/Reload/Backend/__init__.py +126 -0
  72. Pyjo/Server/Reload/__init__.py +482 -0
  73. Pyjo/Server/Reload/__main__.py +5 -0
  74. Pyjo/Server/Stdio.py +228 -0
  75. Pyjo/Server/WSGI.py +349 -0
  76. Pyjo/Server/__init__.py +396 -0
  77. Pyjo/String/Bytes.py +532 -0
  78. Pyjo/String/HTML.py +210 -0
  79. Pyjo/String/Mixin.py +333 -0
  80. Pyjo/String/Template.py +470 -0
  81. Pyjo/String/Unicode.py +553 -0
  82. Pyjo/String/__init__.py +0 -0
  83. Pyjo/TOML.py +232 -0
  84. Pyjo/Template.py +1290 -0
  85. Pyjo/Test/Pyjo.py +1454 -0
  86. Pyjo/Test/__init__.py +1233 -0
  87. Pyjo/Test/pytest_plugin.py +305 -0
  88. Pyjo/Transaction/HTTP.py +374 -0
  89. Pyjo/Transaction/WebSocket.py +709 -0
  90. Pyjo/Transaction/__init__.py +429 -0
  91. Pyjo/URL/Template.py +459 -0
  92. Pyjo/URL/__init__.py +651 -0
  93. Pyjo/Upload.py +139 -0
  94. Pyjo/UserAgent/CookieJar.py +391 -0
  95. Pyjo/UserAgent/Proxy.py +138 -0
  96. Pyjo/UserAgent/Server.py +239 -0
  97. Pyjo/UserAgent/Transactor.py +766 -0
  98. Pyjo/UserAgent/__init__.py +1243 -0
  99. Pyjo/Util.py +3567 -0
  100. Pyjo/WebSocket.py +332 -0
  101. Pyjo/YAML.py +1167 -0
  102. Pyjo/__init__.py +441 -0
  103. Pyjo/__main__.py +35 -0
  104. Pyjo/py.typed +0 -0
  105. Pyjoyment/Command/Author/__init__.py +20 -0
  106. Pyjoyment/Command/Author/generate/__init__.py +106 -0
  107. Pyjoyment/Command/Author/generate/app.py +299 -0
  108. Pyjoyment/Command/Author/generate/dockerfile.py +281 -0
  109. Pyjoyment/Command/Author/generate/kubernetes.py +514 -0
  110. Pyjoyment/Command/Author/generate/lambda_zip.py +372 -0
  111. Pyjoyment/Command/Author/generate/lite_app.py +113 -0
  112. Pyjoyment/Command/Author/generate/plugin.py +267 -0
  113. Pyjoyment/Command/Author/generate/pyproject.py +123 -0
  114. Pyjoyment/Command/Author/inflate.py +101 -0
  115. Pyjoyment/Command/__init__.py +332 -0
  116. Pyjoyment/Command/asgi.py +92 -0
  117. Pyjoyment/Command/cgi.py +90 -0
  118. Pyjoyment/Command/daemon.py +160 -0
  119. Pyjoyment/Command/eval.py +128 -0
  120. Pyjoyment/Command/fastcgi.py +99 -0
  121. Pyjoyment/Command/get.py +305 -0
  122. Pyjoyment/Command/lambda.py +117 -0
  123. Pyjoyment/Command/prefork.py +181 -0
  124. Pyjoyment/Command/prethread.py +126 -0
  125. Pyjoyment/Command/routes.py +133 -0
  126. Pyjoyment/Command/stdio.py +92 -0
  127. Pyjoyment/Command/version.py +141 -0
  128. Pyjoyment/Command/wsgi.py +93 -0
  129. Pyjoyment/Commands.py +546 -0
  130. Pyjoyment/Controller.py +1307 -0
  131. Pyjoyment/HelloWorld.py +56 -0
  132. Pyjoyment/Lite.py +494 -0
  133. Pyjoyment/Plugin/AllowedHosts.py +205 -0
  134. Pyjoyment/Plugin/Config.py +248 -0
  135. Pyjoyment/Plugin/DefaultHelpers.py +1202 -0
  136. Pyjoyment/Plugin/EPLRenderer.py +134 -0
  137. Pyjoyment/Plugin/EPRenderer.py +212 -0
  138. Pyjoyment/Plugin/HeaderCondition.py +98 -0
  139. Pyjoyment/Plugin/Health.py +325 -0
  140. Pyjoyment/Plugin/JSONConfig.py +172 -0
  141. Pyjoyment/Plugin/Mount.py +223 -0
  142. Pyjoyment/Plugin/PyRenderer.py +209 -0
  143. Pyjoyment/Plugin/TOMLConfig.py +141 -0
  144. Pyjoyment/Plugin/TagHelpers.py +959 -0
  145. Pyjoyment/Plugin/YAMLConfig.py +178 -0
  146. Pyjoyment/Plugin/__init__.py +80 -0
  147. Pyjoyment/Plugins.py +215 -0
  148. Pyjoyment/Renderer.py +673 -0
  149. Pyjoyment/Routes/Match.py +251 -0
  150. Pyjoyment/Routes/Pattern.py +443 -0
  151. Pyjoyment/Routes/Route.py +827 -0
  152. Pyjoyment/Routes/__init__.py +419 -0
  153. Pyjoyment/Sessions.py +255 -0
  154. Pyjoyment/Static.py +421 -0
  155. Pyjoyment/Types.py +238 -0
  156. Pyjoyment/Validator/Validation.py +395 -0
  157. Pyjoyment/Validator/__init__.py +304 -0
  158. Pyjoyment/__init__.py +1083 -0
  159. Pyjoyment/__main__.py +5 -0
  160. Pyjoyment/py.typed +0 -0
  161. Pyjoyment/resources/public/favicon.ico +0 -0
  162. Pyjoyment/resources/public/favicon.svg +345 -0
  163. Pyjoyment/resources/public/pyjo/bootstrap/LICENSE +21 -0
  164. Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.bundle.min.js.map +1 -0
  165. Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.css +6 -0
  166. Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.js +7 -0
  167. Pyjoyment/resources/public/pyjo/bootstrap/bootstrap.min.css.map +1 -0
  168. Pyjoyment/resources/public/pyjo/failunicat.png +0 -0
  169. Pyjoyment/resources/public/pyjo/failunicat.svg +50 -0
  170. Pyjoyment/resources/public/pyjo/highlight.js/LICENSE +29 -0
  171. Pyjoyment/resources/public/pyjo/highlight.js/highlight-mojo-dark.css +56 -0
  172. Pyjoyment/resources/public/pyjo/highlight.js/highlight.min.js +1262 -0
  173. Pyjoyment/resources/public/pyjo/highlight.js/pyjoyment.min.js +1 -0
  174. Pyjoyment/resources/public/pyjo/logo-black-4x.png +0 -0
  175. Pyjoyment/resources/public/pyjo/logo-black-4x.svg +346 -0
  176. Pyjoyment/resources/public/pyjo/logo-white-2x.png +0 -0
  177. Pyjoyment/resources/public/pyjo/logo-white-2x.svg +346 -0
  178. Pyjoyment/resources/public/pyjo/logo-white-4x.png +0 -0
  179. Pyjoyment/resources/public/pyjo/logo-white-4x.svg +346 -0
  180. Pyjoyment/resources/public/pyjo/logo-white.png +0 -0
  181. Pyjoyment/resources/public/pyjo/logo-white.svg +346 -0
  182. Pyjoyment/resources/public/pyjo/logo.png +0 -0
  183. Pyjoyment/resources/public/pyjo/logo.svg +346 -0
  184. Pyjoyment/resources/public/pyjo/notfound.png +0 -0
  185. Pyjoyment/resources/public/pyjo/notfound.svg +3 -0
  186. Pyjoyment/resources/public/pyjo/nounicat.png +0 -0
  187. Pyjoyment/resources/public/pyjo/nounicat.svg +5 -0
  188. Pyjoyment/resources/public/pyjo/pinstripe-dark.png +0 -0
  189. Pyjoyment/resources/public/pyjo/pinstripe-dark.svg +4 -0
  190. Pyjoyment/resources/public/pyjo/pinstripe-light.png +0 -0
  191. Pyjoyment/resources/public/pyjo/pinstripe-light.svg +4 -0
  192. Pyjoyment/resources/public/pyjo/pyjo.css +204 -0
  193. Pyjoyment/resources/templates/pyjo/debug.html.ep +346 -0
  194. Pyjoyment/resources/templates/pyjo/exception.html.ep +32 -0
  195. Pyjoyment/resources/templates/pyjo/not_found.html.ep +45 -0
  196. pyjoyment-0.1.0.dist-info/METADATA +376 -0
  197. pyjoyment-0.1.0.dist-info/RECORD +200 -0
  198. pyjoyment-0.1.0.dist-info/WHEEL +4 -0
  199. pyjoyment-0.1.0.dist-info/entry_points.txt +8 -0
  200. 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