plain 0.21.4__tar.gz → 0.21.5__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.
Files changed (157) hide show
  1. {plain-0.21.4 → plain-0.21.5}/PKG-INFO +1 -1
  2. {plain-0.21.4 → plain-0.21.5}/plain/cli/packages.py +25 -8
  3. {plain-0.21.4 → plain-0.21.5}/pyproject.toml +1 -1
  4. {plain-0.21.4 → plain-0.21.5}/.gitignore +0 -0
  5. {plain-0.21.4 → plain-0.21.5}/LICENSE +0 -0
  6. {plain-0.21.4 → plain-0.21.5}/README.md +0 -0
  7. {plain-0.21.4 → plain-0.21.5}/plain/README.md +0 -0
  8. {plain-0.21.4 → plain-0.21.5}/plain/__main__.py +0 -0
  9. {plain-0.21.4 → plain-0.21.5}/plain/assets/README.md +0 -0
  10. {plain-0.21.4 → plain-0.21.5}/plain/assets/__init__.py +0 -0
  11. {plain-0.21.4 → plain-0.21.5}/plain/assets/compile.py +0 -0
  12. {plain-0.21.4 → plain-0.21.5}/plain/assets/finders.py +0 -0
  13. {plain-0.21.4 → plain-0.21.5}/plain/assets/fingerprints.py +0 -0
  14. {plain-0.21.4 → plain-0.21.5}/plain/assets/urls.py +0 -0
  15. {plain-0.21.4 → plain-0.21.5}/plain/assets/views.py +0 -0
  16. {plain-0.21.4 → plain-0.21.5}/plain/cli/README.md +0 -0
  17. {plain-0.21.4 → plain-0.21.5}/plain/cli/__init__.py +0 -0
  18. {plain-0.21.4 → plain-0.21.5}/plain/cli/cli.py +0 -0
  19. {plain-0.21.4 → plain-0.21.5}/plain/cli/formatting.py +0 -0
  20. {plain-0.21.4 → plain-0.21.5}/plain/cli/print.py +0 -0
  21. {plain-0.21.4 → plain-0.21.5}/plain/cli/startup.py +0 -0
  22. {plain-0.21.4 → plain-0.21.5}/plain/csrf/README.md +0 -0
  23. {plain-0.21.4 → plain-0.21.5}/plain/csrf/middleware.py +0 -0
  24. {plain-0.21.4 → plain-0.21.5}/plain/csrf/views.py +0 -0
  25. {plain-0.21.4 → plain-0.21.5}/plain/debug.py +0 -0
  26. {plain-0.21.4 → plain-0.21.5}/plain/exceptions.py +0 -0
  27. {plain-0.21.4 → plain-0.21.5}/plain/forms/README.md +0 -0
  28. {plain-0.21.4 → plain-0.21.5}/plain/forms/__init__.py +0 -0
  29. {plain-0.21.4 → plain-0.21.5}/plain/forms/boundfield.py +0 -0
  30. {plain-0.21.4 → plain-0.21.5}/plain/forms/exceptions.py +0 -0
  31. {plain-0.21.4 → plain-0.21.5}/plain/forms/fields.py +0 -0
  32. {plain-0.21.4 → plain-0.21.5}/plain/forms/forms.py +0 -0
  33. {plain-0.21.4 → plain-0.21.5}/plain/http/README.md +0 -0
  34. {plain-0.21.4 → plain-0.21.5}/plain/http/__init__.py +0 -0
  35. {plain-0.21.4 → plain-0.21.5}/plain/http/cookie.py +0 -0
  36. {plain-0.21.4 → plain-0.21.5}/plain/http/multipartparser.py +0 -0
  37. {plain-0.21.4 → plain-0.21.5}/plain/http/request.py +0 -0
  38. {plain-0.21.4 → plain-0.21.5}/plain/http/response.py +0 -0
  39. {plain-0.21.4 → plain-0.21.5}/plain/internal/__init__.py +0 -0
  40. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/README.md +0 -0
  41. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/__init__.py +0 -0
  42. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/base.py +0 -0
  43. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/locks.py +0 -0
  44. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/move.py +0 -0
  45. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/temp.py +0 -0
  46. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/uploadedfile.py +0 -0
  47. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/uploadhandler.py +0 -0
  48. {plain-0.21.4 → plain-0.21.5}/plain/internal/files/utils.py +0 -0
  49. {plain-0.21.4 → plain-0.21.5}/plain/internal/handlers/__init__.py +0 -0
  50. {plain-0.21.4 → plain-0.21.5}/plain/internal/handlers/base.py +0 -0
  51. {plain-0.21.4 → plain-0.21.5}/plain/internal/handlers/exception.py +0 -0
  52. {plain-0.21.4 → plain-0.21.5}/plain/internal/handlers/wsgi.py +0 -0
  53. {plain-0.21.4 → plain-0.21.5}/plain/internal/middleware/__init__.py +0 -0
  54. {plain-0.21.4 → plain-0.21.5}/plain/internal/middleware/headers.py +0 -0
  55. {plain-0.21.4 → plain-0.21.5}/plain/internal/middleware/https.py +0 -0
  56. {plain-0.21.4 → plain-0.21.5}/plain/internal/middleware/slash.py +0 -0
  57. {plain-0.21.4 → plain-0.21.5}/plain/json.py +0 -0
  58. {plain-0.21.4 → plain-0.21.5}/plain/logs/README.md +0 -0
  59. {plain-0.21.4 → plain-0.21.5}/plain/logs/__init__.py +0 -0
  60. {plain-0.21.4 → plain-0.21.5}/plain/logs/configure.py +0 -0
  61. {plain-0.21.4 → plain-0.21.5}/plain/logs/loggers.py +0 -0
  62. {plain-0.21.4 → plain-0.21.5}/plain/logs/utils.py +0 -0
  63. {plain-0.21.4 → plain-0.21.5}/plain/packages/README.md +0 -0
  64. {plain-0.21.4 → plain-0.21.5}/plain/packages/__init__.py +0 -0
  65. {plain-0.21.4 → plain-0.21.5}/plain/packages/config.py +0 -0
  66. {plain-0.21.4 → plain-0.21.5}/plain/packages/registry.py +0 -0
  67. {plain-0.21.4 → plain-0.21.5}/plain/paginator.py +0 -0
  68. {plain-0.21.4 → plain-0.21.5}/plain/preflight/README.md +0 -0
  69. {plain-0.21.4 → plain-0.21.5}/plain/preflight/__init__.py +0 -0
  70. {plain-0.21.4 → plain-0.21.5}/plain/preflight/files.py +0 -0
  71. {plain-0.21.4 → plain-0.21.5}/plain/preflight/messages.py +0 -0
  72. {plain-0.21.4 → plain-0.21.5}/plain/preflight/registry.py +0 -0
  73. {plain-0.21.4 → plain-0.21.5}/plain/preflight/security.py +0 -0
  74. {plain-0.21.4 → plain-0.21.5}/plain/preflight/urls.py +0 -0
  75. {plain-0.21.4 → plain-0.21.5}/plain/runtime/README.md +0 -0
  76. {plain-0.21.4 → plain-0.21.5}/plain/runtime/__init__.py +0 -0
  77. {plain-0.21.4 → plain-0.21.5}/plain/runtime/global_settings.py +0 -0
  78. {plain-0.21.4 → plain-0.21.5}/plain/runtime/user_settings.py +0 -0
  79. {plain-0.21.4 → plain-0.21.5}/plain/signals/README.md +0 -0
  80. {plain-0.21.4 → plain-0.21.5}/plain/signals/__init__.py +0 -0
  81. {plain-0.21.4 → plain-0.21.5}/plain/signals/dispatch/__init__.py +0 -0
  82. {plain-0.21.4 → plain-0.21.5}/plain/signals/dispatch/dispatcher.py +0 -0
  83. {plain-0.21.4 → plain-0.21.5}/plain/signals/dispatch/license.txt +0 -0
  84. {plain-0.21.4 → plain-0.21.5}/plain/signing.py +0 -0
  85. {plain-0.21.4 → plain-0.21.5}/plain/templates/README.md +0 -0
  86. {plain-0.21.4 → plain-0.21.5}/plain/templates/__init__.py +0 -0
  87. {plain-0.21.4 → plain-0.21.5}/plain/templates/core.py +0 -0
  88. {plain-0.21.4 → plain-0.21.5}/plain/templates/jinja/README.md +0 -0
  89. {plain-0.21.4 → plain-0.21.5}/plain/templates/jinja/__init__.py +0 -0
  90. {plain-0.21.4 → plain-0.21.5}/plain/templates/jinja/environments.py +0 -0
  91. {plain-0.21.4 → plain-0.21.5}/plain/templates/jinja/extensions.py +0 -0
  92. {plain-0.21.4 → plain-0.21.5}/plain/templates/jinja/filters.py +0 -0
  93. {plain-0.21.4 → plain-0.21.5}/plain/templates/jinja/globals.py +0 -0
  94. {plain-0.21.4 → plain-0.21.5}/plain/test/README.md +0 -0
  95. {plain-0.21.4 → plain-0.21.5}/plain/test/__init__.py +0 -0
  96. {plain-0.21.4 → plain-0.21.5}/plain/test/client.py +0 -0
  97. {plain-0.21.4 → plain-0.21.5}/plain/urls/README.md +0 -0
  98. {plain-0.21.4 → plain-0.21.5}/plain/urls/__init__.py +0 -0
  99. {plain-0.21.4 → plain-0.21.5}/plain/urls/base.py +0 -0
  100. {plain-0.21.4 → plain-0.21.5}/plain/urls/conf.py +0 -0
  101. {plain-0.21.4 → plain-0.21.5}/plain/urls/converters.py +0 -0
  102. {plain-0.21.4 → plain-0.21.5}/plain/urls/exceptions.py +0 -0
  103. {plain-0.21.4 → plain-0.21.5}/plain/urls/resolvers.py +0 -0
  104. {plain-0.21.4 → plain-0.21.5}/plain/utils/README.md +0 -0
  105. {plain-0.21.4 → plain-0.21.5}/plain/utils/__init__.py +0 -0
  106. {plain-0.21.4 → plain-0.21.5}/plain/utils/_os.py +0 -0
  107. {plain-0.21.4 → plain-0.21.5}/plain/utils/cache.py +0 -0
  108. {plain-0.21.4 → plain-0.21.5}/plain/utils/connection.py +0 -0
  109. {plain-0.21.4 → plain-0.21.5}/plain/utils/crypto.py +0 -0
  110. {plain-0.21.4 → plain-0.21.5}/plain/utils/datastructures.py +0 -0
  111. {plain-0.21.4 → plain-0.21.5}/plain/utils/dateformat.py +0 -0
  112. {plain-0.21.4 → plain-0.21.5}/plain/utils/dateparse.py +0 -0
  113. {plain-0.21.4 → plain-0.21.5}/plain/utils/dates.py +0 -0
  114. {plain-0.21.4 → plain-0.21.5}/plain/utils/deconstruct.py +0 -0
  115. {plain-0.21.4 → plain-0.21.5}/plain/utils/decorators.py +0 -0
  116. {plain-0.21.4 → plain-0.21.5}/plain/utils/deprecation.py +0 -0
  117. {plain-0.21.4 → plain-0.21.5}/plain/utils/duration.py +0 -0
  118. {plain-0.21.4 → plain-0.21.5}/plain/utils/email.py +0 -0
  119. {plain-0.21.4 → plain-0.21.5}/plain/utils/encoding.py +0 -0
  120. {plain-0.21.4 → plain-0.21.5}/plain/utils/functional.py +0 -0
  121. {plain-0.21.4 → plain-0.21.5}/plain/utils/hashable.py +0 -0
  122. {plain-0.21.4 → plain-0.21.5}/plain/utils/html.py +0 -0
  123. {plain-0.21.4 → plain-0.21.5}/plain/utils/http.py +0 -0
  124. {plain-0.21.4 → plain-0.21.5}/plain/utils/inspect.py +0 -0
  125. {plain-0.21.4 → plain-0.21.5}/plain/utils/ipv6.py +0 -0
  126. {plain-0.21.4 → plain-0.21.5}/plain/utils/itercompat.py +0 -0
  127. {plain-0.21.4 → plain-0.21.5}/plain/utils/module_loading.py +0 -0
  128. {plain-0.21.4 → plain-0.21.5}/plain/utils/regex_helper.py +0 -0
  129. {plain-0.21.4 → plain-0.21.5}/plain/utils/safestring.py +0 -0
  130. {plain-0.21.4 → plain-0.21.5}/plain/utils/text.py +0 -0
  131. {plain-0.21.4 → plain-0.21.5}/plain/utils/timesince.py +0 -0
  132. {plain-0.21.4 → plain-0.21.5}/plain/utils/timezone.py +0 -0
  133. {plain-0.21.4 → plain-0.21.5}/plain/utils/tree.py +0 -0
  134. {plain-0.21.4 → plain-0.21.5}/plain/validators.py +0 -0
  135. {plain-0.21.4 → plain-0.21.5}/plain/views/README.md +0 -0
  136. {plain-0.21.4 → plain-0.21.5}/plain/views/__init__.py +0 -0
  137. {plain-0.21.4 → plain-0.21.5}/plain/views/base.py +0 -0
  138. {plain-0.21.4 → plain-0.21.5}/plain/views/csrf.py +0 -0
  139. {plain-0.21.4 → plain-0.21.5}/plain/views/errors.py +0 -0
  140. {plain-0.21.4 → plain-0.21.5}/plain/views/exceptions.py +0 -0
  141. {plain-0.21.4 → plain-0.21.5}/plain/views/forms.py +0 -0
  142. {plain-0.21.4 → plain-0.21.5}/plain/views/objects.py +0 -0
  143. {plain-0.21.4 → plain-0.21.5}/plain/views/redirect.py +0 -0
  144. {plain-0.21.4 → plain-0.21.5}/plain/views/templates.py +0 -0
  145. {plain-0.21.4 → plain-0.21.5}/plain/wsgi.py +0 -0
  146. {plain-0.21.4 → plain-0.21.5}/tests/.bolt/assets_collected/assets.json +0 -0
  147. {plain-0.21.4 → plain-0.21.5}/tests/.gitignore +0 -0
  148. {plain-0.21.4 → plain-0.21.5}/tests/app/.gitignore +0 -0
  149. {plain-0.21.4 → plain-0.21.5}/tests/app/settings.py +0 -0
  150. {plain-0.21.4 → plain-0.21.5}/tests/app/test/__init__.py +0 -0
  151. {plain-0.21.4 → plain-0.21.5}/tests/app/test/default_settings.py +0 -0
  152. {plain-0.21.4 → plain-0.21.5}/tests/app/urls.py +0 -0
  153. {plain-0.21.4 → plain-0.21.5}/tests/conftest.py +0 -0
  154. {plain-0.21.4 → plain-0.21.5}/tests/test_cli.py +0 -0
  155. {plain-0.21.4 → plain-0.21.5}/tests/test_runtime.py +0 -0
  156. {plain-0.21.4 → plain-0.21.5}/tests/test_wsgi.py +0 -0
  157. {plain-0.21.4 → plain-0.21.5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.21.4
3
+ Version: 0.21.5
4
4
  Summary: A web framework for building products with Python.
5
5
  Author-email: Dave Gaeddert <dave.gaeddert@dropseed.dev>
6
6
  License-File: LICENSE
@@ -14,10 +14,11 @@ class InstalledPackagesGroup(click.Group):
14
14
  """
15
15
 
16
16
  PLAIN_APPS_PREFIX = "plain."
17
+ APP_PREFIX = "app."
17
18
  MODULE_NAME = "cli"
18
19
 
19
20
  def list_commands(self, ctx):
20
- packages_with_commands = []
21
+ command_names = []
21
22
 
22
23
  # Get installed packages with a cli.py module
23
24
  for app in packages.get_package_configs():
@@ -26,21 +27,37 @@ class InstalledPackagesGroup(click.Group):
26
27
 
27
28
  cli_name = app.name
28
29
 
30
+ # Change plain.{pkg} to just {pkg}
29
31
  if cli_name.startswith(self.PLAIN_APPS_PREFIX):
30
32
  cli_name = cli_name[len(self.PLAIN_APPS_PREFIX) :]
31
33
 
32
- packages_with_commands.append(cli_name)
34
+ # Change app.{pkg} to just {pkg}
35
+ if cli_name.startswith(self.APP_PREFIX):
36
+ cli_name = cli_name[len(self.APP_PREFIX) :]
33
37
 
34
- return packages_with_commands
38
+ if cli_name in command_names:
39
+ raise ValueError(
40
+ f"Duplicate command name {cli_name} found in installed packages."
41
+ )
42
+
43
+ command_names.append(cli_name)
44
+
45
+ return command_names
35
46
 
36
47
  def get_command(self, ctx, name):
37
- # Try it as plain.x and just x (we don't know ahead of time which it is, but prefer plain.x)
38
- for n in [self.PLAIN_APPS_PREFIX + name, name]:
39
- if not find_spec(n):
40
- # plain.<name> doesn't exist at all
48
+ # Try it as plain.x, app.x, and just x (we don't know ahead of time which it is)
49
+ for n in [self.PLAIN_APPS_PREFIX + name, self.APP_PREFIX + name, name]:
50
+ try:
51
+ if not find_spec(n):
52
+ # plain.<name> doesn't exist at all
53
+ continue
54
+ except ModuleNotFoundError:
41
55
  continue
42
56
 
43
- if not find_spec(f"{n}.{self.MODULE_NAME}"):
57
+ try:
58
+ if not find_spec(f"{n}.{self.MODULE_NAME}"):
59
+ continue
60
+ except ModuleNotFoundError:
44
61
  continue
45
62
 
46
63
  cli = importlib.import_module(f"{n}.{self.MODULE_NAME}")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain"
3
- version = "0.21.4"
3
+ version = "0.21.5"
4
4
  description = "A web framework for building products with Python."
5
5
  authors = [{name = "Dave Gaeddert", email = "dave.gaeddert@dropseed.dev"}]
6
6
  readme = "README.md"
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