plain 0.48.0__tar.gz → 0.49.0__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 (163) hide show
  1. {plain-0.48.0 → plain-0.49.0}/.gitignore +2 -2
  2. {plain-0.48.0 → plain-0.49.0}/PKG-INFO +1 -1
  3. {plain-0.48.0 → plain-0.49.0}/plain/cli/README.md +6 -0
  4. {plain-0.48.0 → plain-0.49.0}/plain/cli/core.py +2 -0
  5. plain-0.49.0/plain/cli/help.py +27 -0
  6. {plain-0.48.0 → plain-0.49.0}/pyproject.toml +1 -1
  7. {plain-0.48.0 → plain-0.49.0}/tests/test_cli.py +8 -0
  8. {plain-0.48.0 → plain-0.49.0}/LICENSE +0 -0
  9. {plain-0.48.0 → plain-0.49.0}/README.md +0 -0
  10. {plain-0.48.0 → plain-0.49.0}/plain/README.md +0 -0
  11. {plain-0.48.0 → plain-0.49.0}/plain/__main__.py +0 -0
  12. {plain-0.48.0 → plain-0.49.0}/plain/assets/README.md +0 -0
  13. {plain-0.48.0 → plain-0.49.0}/plain/assets/__init__.py +0 -0
  14. {plain-0.48.0 → plain-0.49.0}/plain/assets/compile.py +0 -0
  15. {plain-0.48.0 → plain-0.49.0}/plain/assets/finders.py +0 -0
  16. {plain-0.48.0 → plain-0.49.0}/plain/assets/fingerprints.py +0 -0
  17. {plain-0.48.0 → plain-0.49.0}/plain/assets/urls.py +0 -0
  18. {plain-0.48.0 → plain-0.49.0}/plain/assets/views.py +0 -0
  19. {plain-0.48.0 → plain-0.49.0}/plain/chores/README.md +0 -0
  20. {plain-0.48.0 → plain-0.49.0}/plain/chores/__init__.py +0 -0
  21. {plain-0.48.0 → plain-0.49.0}/plain/chores/registry.py +0 -0
  22. {plain-0.48.0 → plain-0.49.0}/plain/cli/__init__.py +0 -0
  23. {plain-0.48.0 → plain-0.49.0}/plain/cli/build.py +0 -0
  24. {plain-0.48.0 → plain-0.49.0}/plain/cli/chores.py +0 -0
  25. {plain-0.48.0 → plain-0.49.0}/plain/cli/docs.py +0 -0
  26. {plain-0.48.0 → plain-0.49.0}/plain/cli/formatting.py +0 -0
  27. {plain-0.48.0 → plain-0.49.0}/plain/cli/preflight.py +0 -0
  28. {plain-0.48.0 → plain-0.49.0}/plain/cli/print.py +0 -0
  29. {plain-0.48.0 → plain-0.49.0}/plain/cli/registry.py +0 -0
  30. {plain-0.48.0 → plain-0.49.0}/plain/cli/scaffold.py +0 -0
  31. {plain-0.48.0 → plain-0.49.0}/plain/cli/settings.py +0 -0
  32. {plain-0.48.0 → plain-0.49.0}/plain/cli/shell.py +0 -0
  33. {plain-0.48.0 → plain-0.49.0}/plain/cli/startup.py +0 -0
  34. {plain-0.48.0 → plain-0.49.0}/plain/cli/urls.py +0 -0
  35. {plain-0.48.0 → plain-0.49.0}/plain/cli/utils.py +0 -0
  36. {plain-0.48.0 → plain-0.49.0}/plain/csrf/README.md +0 -0
  37. {plain-0.48.0 → plain-0.49.0}/plain/csrf/middleware.py +0 -0
  38. {plain-0.48.0 → plain-0.49.0}/plain/csrf/views.py +0 -0
  39. {plain-0.48.0 → plain-0.49.0}/plain/debug.py +0 -0
  40. {plain-0.48.0 → plain-0.49.0}/plain/exceptions.py +0 -0
  41. {plain-0.48.0 → plain-0.49.0}/plain/forms/README.md +0 -0
  42. {plain-0.48.0 → plain-0.49.0}/plain/forms/__init__.py +0 -0
  43. {plain-0.48.0 → plain-0.49.0}/plain/forms/boundfield.py +0 -0
  44. {plain-0.48.0 → plain-0.49.0}/plain/forms/exceptions.py +0 -0
  45. {plain-0.48.0 → plain-0.49.0}/plain/forms/fields.py +0 -0
  46. {plain-0.48.0 → plain-0.49.0}/plain/forms/forms.py +0 -0
  47. {plain-0.48.0 → plain-0.49.0}/plain/http/README.md +0 -0
  48. {plain-0.48.0 → plain-0.49.0}/plain/http/__init__.py +0 -0
  49. {plain-0.48.0 → plain-0.49.0}/plain/http/cookie.py +0 -0
  50. {plain-0.48.0 → plain-0.49.0}/plain/http/multipartparser.py +0 -0
  51. {plain-0.48.0 → plain-0.49.0}/plain/http/request.py +0 -0
  52. {plain-0.48.0 → plain-0.49.0}/plain/http/response.py +0 -0
  53. {plain-0.48.0 → plain-0.49.0}/plain/internal/__init__.py +0 -0
  54. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/__init__.py +0 -0
  55. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/base.py +0 -0
  56. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/locks.py +0 -0
  57. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/move.py +0 -0
  58. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/temp.py +0 -0
  59. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/uploadedfile.py +0 -0
  60. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/uploadhandler.py +0 -0
  61. {plain-0.48.0 → plain-0.49.0}/plain/internal/files/utils.py +0 -0
  62. {plain-0.48.0 → plain-0.49.0}/plain/internal/handlers/__init__.py +0 -0
  63. {plain-0.48.0 → plain-0.49.0}/plain/internal/handlers/base.py +0 -0
  64. {plain-0.48.0 → plain-0.49.0}/plain/internal/handlers/exception.py +0 -0
  65. {plain-0.48.0 → plain-0.49.0}/plain/internal/handlers/wsgi.py +0 -0
  66. {plain-0.48.0 → plain-0.49.0}/plain/internal/middleware/__init__.py +0 -0
  67. {plain-0.48.0 → plain-0.49.0}/plain/internal/middleware/headers.py +0 -0
  68. {plain-0.48.0 → plain-0.49.0}/plain/internal/middleware/https.py +0 -0
  69. {plain-0.48.0 → plain-0.49.0}/plain/internal/middleware/slash.py +0 -0
  70. {plain-0.48.0 → plain-0.49.0}/plain/json.py +0 -0
  71. {plain-0.48.0 → plain-0.49.0}/plain/logs/README.md +0 -0
  72. {plain-0.48.0 → plain-0.49.0}/plain/logs/__init__.py +0 -0
  73. {plain-0.48.0 → plain-0.49.0}/plain/logs/configure.py +0 -0
  74. {plain-0.48.0 → plain-0.49.0}/plain/logs/loggers.py +0 -0
  75. {plain-0.48.0 → plain-0.49.0}/plain/logs/utils.py +0 -0
  76. {plain-0.48.0 → plain-0.49.0}/plain/packages/README.md +0 -0
  77. {plain-0.48.0 → plain-0.49.0}/plain/packages/__init__.py +0 -0
  78. {plain-0.48.0 → plain-0.49.0}/plain/packages/config.py +0 -0
  79. {plain-0.48.0 → plain-0.49.0}/plain/packages/registry.py +0 -0
  80. {plain-0.48.0 → plain-0.49.0}/plain/paginator.py +0 -0
  81. {plain-0.48.0 → plain-0.49.0}/plain/preflight/README.md +0 -0
  82. {plain-0.48.0 → plain-0.49.0}/plain/preflight/__init__.py +0 -0
  83. {plain-0.48.0 → plain-0.49.0}/plain/preflight/files.py +0 -0
  84. {plain-0.48.0 → plain-0.49.0}/plain/preflight/messages.py +0 -0
  85. {plain-0.48.0 → plain-0.49.0}/plain/preflight/registry.py +0 -0
  86. {plain-0.48.0 → plain-0.49.0}/plain/preflight/security.py +0 -0
  87. {plain-0.48.0 → plain-0.49.0}/plain/preflight/urls.py +0 -0
  88. {plain-0.48.0 → plain-0.49.0}/plain/runtime/README.md +0 -0
  89. {plain-0.48.0 → plain-0.49.0}/plain/runtime/__init__.py +0 -0
  90. {plain-0.48.0 → plain-0.49.0}/plain/runtime/global_settings.py +0 -0
  91. {plain-0.48.0 → plain-0.49.0}/plain/runtime/user_settings.py +0 -0
  92. {plain-0.48.0 → plain-0.49.0}/plain/signals/README.md +0 -0
  93. {plain-0.48.0 → plain-0.49.0}/plain/signals/__init__.py +0 -0
  94. {plain-0.48.0 → plain-0.49.0}/plain/signals/dispatch/__init__.py +0 -0
  95. {plain-0.48.0 → plain-0.49.0}/plain/signals/dispatch/dispatcher.py +0 -0
  96. {plain-0.48.0 → plain-0.49.0}/plain/signals/dispatch/license.txt +0 -0
  97. {plain-0.48.0 → plain-0.49.0}/plain/signing.py +0 -0
  98. {plain-0.48.0 → plain-0.49.0}/plain/templates/README.md +0 -0
  99. {plain-0.48.0 → plain-0.49.0}/plain/templates/__init__.py +0 -0
  100. {plain-0.48.0 → plain-0.49.0}/plain/templates/core.py +0 -0
  101. {plain-0.48.0 → plain-0.49.0}/plain/templates/jinja/__init__.py +0 -0
  102. {plain-0.48.0 → plain-0.49.0}/plain/templates/jinja/environments.py +0 -0
  103. {plain-0.48.0 → plain-0.49.0}/plain/templates/jinja/extensions.py +0 -0
  104. {plain-0.48.0 → plain-0.49.0}/plain/templates/jinja/filters.py +0 -0
  105. {plain-0.48.0 → plain-0.49.0}/plain/templates/jinja/globals.py +0 -0
  106. {plain-0.48.0 → plain-0.49.0}/plain/test/README.md +0 -0
  107. {plain-0.48.0 → plain-0.49.0}/plain/test/__init__.py +0 -0
  108. {plain-0.48.0 → plain-0.49.0}/plain/test/client.py +0 -0
  109. {plain-0.48.0 → plain-0.49.0}/plain/test/encoding.py +0 -0
  110. {plain-0.48.0 → plain-0.49.0}/plain/test/exceptions.py +0 -0
  111. {plain-0.48.0 → plain-0.49.0}/plain/urls/README.md +0 -0
  112. {plain-0.48.0 → plain-0.49.0}/plain/urls/__init__.py +0 -0
  113. {plain-0.48.0 → plain-0.49.0}/plain/urls/converters.py +0 -0
  114. {plain-0.48.0 → plain-0.49.0}/plain/urls/exceptions.py +0 -0
  115. {plain-0.48.0 → plain-0.49.0}/plain/urls/patterns.py +0 -0
  116. {plain-0.48.0 → plain-0.49.0}/plain/urls/resolvers.py +0 -0
  117. {plain-0.48.0 → plain-0.49.0}/plain/urls/routers.py +0 -0
  118. {plain-0.48.0 → plain-0.49.0}/plain/urls/utils.py +0 -0
  119. {plain-0.48.0 → plain-0.49.0}/plain/utils/README.md +0 -0
  120. {plain-0.48.0 → plain-0.49.0}/plain/utils/__init__.py +0 -0
  121. {plain-0.48.0 → plain-0.49.0}/plain/utils/cache.py +0 -0
  122. {plain-0.48.0 → plain-0.49.0}/plain/utils/crypto.py +0 -0
  123. {plain-0.48.0 → plain-0.49.0}/plain/utils/datastructures.py +0 -0
  124. {plain-0.48.0 → plain-0.49.0}/plain/utils/dateparse.py +0 -0
  125. {plain-0.48.0 → plain-0.49.0}/plain/utils/deconstruct.py +0 -0
  126. {plain-0.48.0 → plain-0.49.0}/plain/utils/decorators.py +0 -0
  127. {plain-0.48.0 → plain-0.49.0}/plain/utils/duration.py +0 -0
  128. {plain-0.48.0 → plain-0.49.0}/plain/utils/encoding.py +0 -0
  129. {plain-0.48.0 → plain-0.49.0}/plain/utils/functional.py +0 -0
  130. {plain-0.48.0 → plain-0.49.0}/plain/utils/hashable.py +0 -0
  131. {plain-0.48.0 → plain-0.49.0}/plain/utils/html.py +0 -0
  132. {plain-0.48.0 → plain-0.49.0}/plain/utils/http.py +0 -0
  133. {plain-0.48.0 → plain-0.49.0}/plain/utils/inspect.py +0 -0
  134. {plain-0.48.0 → plain-0.49.0}/plain/utils/ipv6.py +0 -0
  135. {plain-0.48.0 → plain-0.49.0}/plain/utils/itercompat.py +0 -0
  136. {plain-0.48.0 → plain-0.49.0}/plain/utils/module_loading.py +0 -0
  137. {plain-0.48.0 → plain-0.49.0}/plain/utils/regex_helper.py +0 -0
  138. {plain-0.48.0 → plain-0.49.0}/plain/utils/safestring.py +0 -0
  139. {plain-0.48.0 → plain-0.49.0}/plain/utils/text.py +0 -0
  140. {plain-0.48.0 → plain-0.49.0}/plain/utils/timesince.py +0 -0
  141. {plain-0.48.0 → plain-0.49.0}/plain/utils/timezone.py +0 -0
  142. {plain-0.48.0 → plain-0.49.0}/plain/utils/tree.py +0 -0
  143. {plain-0.48.0 → plain-0.49.0}/plain/validators.py +0 -0
  144. {plain-0.48.0 → plain-0.49.0}/plain/views/README.md +0 -0
  145. {plain-0.48.0 → plain-0.49.0}/plain/views/__init__.py +0 -0
  146. {plain-0.48.0 → plain-0.49.0}/plain/views/base.py +0 -0
  147. {plain-0.48.0 → plain-0.49.0}/plain/views/csrf.py +0 -0
  148. {plain-0.48.0 → plain-0.49.0}/plain/views/errors.py +0 -0
  149. {plain-0.48.0 → plain-0.49.0}/plain/views/exceptions.py +0 -0
  150. {plain-0.48.0 → plain-0.49.0}/plain/views/forms.py +0 -0
  151. {plain-0.48.0 → plain-0.49.0}/plain/views/objects.py +0 -0
  152. {plain-0.48.0 → plain-0.49.0}/plain/views/redirect.py +0 -0
  153. {plain-0.48.0 → plain-0.49.0}/plain/views/templates.py +0 -0
  154. {plain-0.48.0 → plain-0.49.0}/plain/wsgi.py +0 -0
  155. {plain-0.48.0 → plain-0.49.0}/tests/.gitignore +0 -0
  156. {plain-0.48.0 → plain-0.49.0}/tests/app/.gitignore +0 -0
  157. {plain-0.48.0 → plain-0.49.0}/tests/app/settings.py +0 -0
  158. {plain-0.48.0 → plain-0.49.0}/tests/app/test/__init__.py +0 -0
  159. {plain-0.48.0 → plain-0.49.0}/tests/app/test/default_settings.py +0 -0
  160. {plain-0.48.0 → plain-0.49.0}/tests/app/urls.py +0 -0
  161. {plain-0.48.0 → plain-0.49.0}/tests/conftest.py +0 -0
  162. {plain-0.48.0 → plain-0.49.0}/tests/test_runtime.py +0 -0
  163. {plain-0.48.0 → plain-0.49.0}/tests/test_wsgi.py +0 -0
@@ -6,8 +6,8 @@ __pycache__
6
6
  *.DS_Store
7
7
  .coverage
8
8
 
9
- # Personal workspace
10
- /*.code-workspace
9
+ # Symlinks to personal packages
10
+ /ext
11
11
 
12
12
  # Test apps
13
13
  plain*/tests/.plain
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plain
3
- Version: 0.48.0
3
+ Version: 0.49.0
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
@@ -30,6 +30,12 @@ Run a Python script in the context of your app.
30
30
 
31
31
  View the runtime value of a named setting.
32
32
 
33
+ ### `plain help`
34
+
35
+ Print help for all available commands and subcommands.
36
+ Each command's help output is prefixed with the full command name for
37
+ readability.
38
+
33
39
  ### `plain shell`
34
40
 
35
41
  Open a Python shell with the Plain loaded.
@@ -10,6 +10,7 @@ from .build import build
10
10
  from .chores import chores
11
11
  from .docs import docs
12
12
  from .formatting import PlainContext
13
+ from .help import help_cmd
13
14
  from .preflight import preflight_checks
14
15
  from .registry import cli_registry
15
16
  from .scaffold import create
@@ -34,6 +35,7 @@ plain_cli.add_command(urls)
34
35
  plain_cli.add_command(setting)
35
36
  plain_cli.add_command(shell)
36
37
  plain_cli.add_command(run)
38
+ plain_cli.add_command(help_cmd)
37
39
 
38
40
 
39
41
  class CLIRegistryGroup(click.Group):
@@ -0,0 +1,27 @@
1
+ import click
2
+ from click.core import MultiCommand
3
+
4
+
5
+ @click.command("help")
6
+ @click.pass_context
7
+ def help_cmd(ctx):
8
+ """Show help for all commands and subcommands."""
9
+
10
+ root = ctx.parent.command
11
+ info_name = ctx.parent.info_name or "plain"
12
+
13
+ def print_help(cmd, prog, parent=None):
14
+ sub_ctx = click.Context(cmd, info_name=prog, parent=parent)
15
+
16
+ title = sub_ctx.command_path
17
+ click.secho(title, fg="green", bold=True)
18
+ click.secho("-" * len(title), fg="green")
19
+ click.echo(sub_ctx.get_help())
20
+
21
+ if isinstance(cmd, MultiCommand):
22
+ for name in cmd.list_commands(sub_ctx):
23
+ click.echo()
24
+ sub_cmd = cmd.get_command(sub_ctx, name)
25
+ print_help(sub_cmd, name, sub_ctx)
26
+
27
+ print_help(root, info_name)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "plain"
3
- version = "0.48.0"
3
+ version = "0.49.0"
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"
@@ -15,3 +15,11 @@ def test_plain_cli_build():
15
15
  result = runner.invoke(cli, ["build"], prog_name="plain")
16
16
  assert result.exit_code == 0
17
17
  assert "Compiled 0 assets into 0 files" in result.output
18
+
19
+
20
+ def test_plain_help_command():
21
+ runner = CliRunner()
22
+ result = runner.invoke(cli, ["help"], prog_name="plain")
23
+ assert result.exit_code == 0
24
+ assert "Usage: plain build" in result.output
25
+ assert "Usage: plain shell" in result.output
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