euporie 2.8.0__py3-none-any.whl → 2.8.5__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 (129) hide show
  1. euporie/console/_commands.py +143 -0
  2. euporie/console/_settings.py +58 -0
  3. euporie/console/app.py +25 -71
  4. euporie/console/tabs/console.py +267 -147
  5. euporie/core/__init__.py +1 -9
  6. euporie/core/__main__.py +31 -5
  7. euporie/core/_settings.py +104 -0
  8. euporie/core/app/__init__.py +3 -0
  9. euporie/core/app/_commands.py +70 -0
  10. euporie/core/app/_settings.py +427 -0
  11. euporie/core/{app.py → app/app.py} +214 -572
  12. euporie/core/app/base.py +51 -0
  13. euporie/core/{current.py → app/current.py} +13 -4
  14. euporie/core/app/cursor.py +35 -0
  15. euporie/core/app/dummy.py +12 -0
  16. euporie/core/app/launch.py +28 -0
  17. euporie/core/bars/__init__.py +11 -0
  18. euporie/core/bars/command.py +182 -0
  19. euporie/core/bars/menu.py +258 -0
  20. euporie/core/{widgets → bars}/search.py +154 -57
  21. euporie/core/{widgets → bars}/status.py +9 -26
  22. euporie/core/clipboard.py +19 -80
  23. euporie/core/comm/base.py +8 -6
  24. euporie/core/comm/ipywidgets.py +21 -12
  25. euporie/core/comm/registry.py +2 -1
  26. euporie/core/commands.py +11 -5
  27. euporie/core/completion.py +3 -2
  28. euporie/core/config.py +368 -341
  29. euporie/core/convert/__init__.py +0 -30
  30. euporie/core/convert/datum.py +131 -60
  31. euporie/core/convert/formats/__init__.py +31 -0
  32. euporie/core/convert/formats/ansi.py +46 -30
  33. euporie/core/convert/formats/common.py +11 -23
  34. euporie/core/convert/formats/html.py +45 -40
  35. euporie/core/convert/formats/pil.py +1 -1
  36. euporie/core/convert/formats/png.py +3 -5
  37. euporie/core/convert/formats/sixel.py +3 -3
  38. euporie/core/convert/registry.py +11 -8
  39. euporie/core/convert/utils.py +50 -23
  40. euporie/core/diagnostics.py +2 -2
  41. euporie/core/filters.py +72 -82
  42. euporie/core/format.py +13 -2
  43. euporie/core/ft/ansi.py +1 -1
  44. euporie/core/ft/html.py +36 -36
  45. euporie/core/ft/table.py +1 -3
  46. euporie/core/ft/utils.py +4 -1
  47. euporie/core/graphics.py +216 -124
  48. euporie/core/history.py +2 -2
  49. euporie/core/inspection.py +3 -2
  50. euporie/core/io.py +207 -28
  51. euporie/core/kernel/__init__.py +1 -0
  52. euporie/core/{kernel.py → kernel/client.py} +100 -139
  53. euporie/core/kernel/manager.py +114 -0
  54. euporie/core/key_binding/bindings/__init__.py +2 -8
  55. euporie/core/key_binding/bindings/basic.py +47 -7
  56. euporie/core/key_binding/bindings/completion.py +3 -8
  57. euporie/core/key_binding/bindings/micro.py +5 -7
  58. euporie/core/key_binding/bindings/mouse.py +26 -24
  59. euporie/core/key_binding/bindings/terminal.py +193 -0
  60. euporie/core/key_binding/bindings/vi.py +46 -0
  61. euporie/core/key_binding/key_processor.py +43 -2
  62. euporie/core/key_binding/registry.py +2 -0
  63. euporie/core/key_binding/utils.py +22 -2
  64. euporie/core/keys.py +7156 -92
  65. euporie/core/layout/cache.py +35 -25
  66. euporie/core/layout/containers.py +280 -74
  67. euporie/core/layout/decor.py +5 -5
  68. euporie/core/layout/mouse.py +1 -1
  69. euporie/core/layout/print.py +16 -3
  70. euporie/core/layout/scroll.py +26 -28
  71. euporie/core/log.py +75 -60
  72. euporie/core/lsp.py +118 -24
  73. euporie/core/margins.py +60 -31
  74. euporie/core/path.py +2 -1
  75. euporie/core/renderer.py +58 -17
  76. euporie/core/style.py +60 -40
  77. euporie/core/suggest.py +103 -85
  78. euporie/core/tabs/__init__.py +34 -0
  79. euporie/core/tabs/_settings.py +113 -0
  80. euporie/core/tabs/base.py +11 -435
  81. euporie/core/tabs/kernel.py +420 -0
  82. euporie/core/tabs/notebook.py +20 -54
  83. euporie/core/utils.py +98 -6
  84. euporie/core/validation.py +1 -1
  85. euporie/core/widgets/_settings.py +188 -0
  86. euporie/core/widgets/cell.py +90 -158
  87. euporie/core/widgets/cell_outputs.py +26 -37
  88. euporie/core/widgets/decor.py +11 -41
  89. euporie/core/widgets/dialog.py +55 -44
  90. euporie/core/widgets/display.py +27 -24
  91. euporie/core/widgets/file_browser.py +5 -26
  92. euporie/core/widgets/forms.py +16 -12
  93. euporie/core/widgets/inputs.py +37 -81
  94. euporie/core/widgets/layout.py +7 -6
  95. euporie/core/widgets/logo.py +49 -0
  96. euporie/core/widgets/menu.py +13 -11
  97. euporie/core/widgets/pager.py +9 -11
  98. euporie/core/widgets/palette.py +6 -6
  99. euporie/hub/app.py +52 -31
  100. euporie/notebook/_commands.py +24 -0
  101. euporie/notebook/_settings.py +107 -0
  102. euporie/notebook/app.py +109 -210
  103. euporie/notebook/filters.py +1 -1
  104. euporie/notebook/tabs/__init__.py +46 -7
  105. euporie/notebook/tabs/_commands.py +714 -0
  106. euporie/notebook/tabs/_settings.py +32 -0
  107. euporie/notebook/tabs/display.py +2 -2
  108. euporie/notebook/tabs/edit.py +12 -7
  109. euporie/notebook/tabs/json.py +3 -3
  110. euporie/notebook/tabs/log.py +1 -18
  111. euporie/notebook/tabs/notebook.py +21 -674
  112. euporie/notebook/widgets/_commands.py +11 -0
  113. euporie/notebook/widgets/_settings.py +19 -0
  114. euporie/notebook/widgets/side_bar.py +14 -34
  115. euporie/preview/_settings.py +104 -0
  116. euporie/preview/app.py +8 -30
  117. euporie/preview/tabs/notebook.py +15 -86
  118. euporie/web/tabs/web.py +4 -6
  119. euporie/web/widgets/webview.py +5 -12
  120. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/METADATA +11 -15
  121. euporie-2.8.5.dist-info/RECORD +172 -0
  122. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/WHEEL +1 -1
  123. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/entry_points.txt +2 -2
  124. {euporie-2.8.0.dist-info → euporie-2.8.5.dist-info}/licenses/LICENSE +1 -1
  125. euporie/core/launch.py +0 -59
  126. euporie/core/terminal.py +0 -527
  127. euporie-2.8.0.dist-info/RECORD +0 -146
  128. {euporie-2.8.0.data → euporie-2.8.5.data}/data/share/applications/euporie-console.desktop +0 -0
  129. {euporie-2.8.0.data → euporie-2.8.5.data}/data/share/applications/euporie-notebook.desktop +0 -0
@@ -0,0 +1,32 @@
1
+ """Define settings for the notebook app tabs."""
2
+
3
+ from euporie.core.config import add_setting
4
+
5
+ add_setting(
6
+ name="show_scroll_bar",
7
+ group="euporie.notebook.tabs.notebook",
8
+ title="scroll bar",
9
+ flags=["--show-scroll-bar"],
10
+ type_=bool,
11
+ help_="Show the scroll bar",
12
+ default=True,
13
+ description="""
14
+ Whether the scroll bar should be shown on the right of the screen.
15
+ """,
16
+ )
17
+
18
+ add_setting(
19
+ name="show_side_bar",
20
+ group="euporie.notebook.widgets.side_bar",
21
+ flags=["--show-side-bar"],
22
+ type_=bool,
23
+ title="side-bar",
24
+ help_="Show the side-bar",
25
+ default=False,
26
+ schema={
27
+ "type": "boolean",
28
+ },
29
+ description="""
30
+ Whether the side-bar should be shown at the side of the screen.
31
+ """,
32
+ )
@@ -20,8 +20,8 @@ if TYPE_CHECKING:
20
20
 
21
21
  from prompt_toolkit.layout.containers import AnyContainer
22
22
 
23
- from euporie.core.app import BaseApp
24
- from euporie.core.widgets.status import StatusBarFields
23
+ from euporie.core.app.app import BaseApp
24
+ from euporie.core.bars.status import StatusBarFields
25
25
 
26
26
  log = logging.getLogger(__name__)
27
27
 
@@ -9,11 +9,11 @@ from prompt_toolkit.layout.containers import HSplit
9
9
  from prompt_toolkit.layout.dimension import Dimension
10
10
 
11
11
  from euporie.core.filters import insert_mode, replace_mode
12
- from euporie.core.kernel import Kernel, MsgCallbacks
12
+ from euporie.core.kernel.client import Kernel, MsgCallbacks
13
13
  from euporie.core.key_binding.registry import load_registered_bindings
14
14
  from euporie.core.lexers import detect_lexer
15
15
  from euporie.core.path import UntitledPath
16
- from euporie.core.tabs.base import KernelTab
16
+ from euporie.core.tabs.kernel import KernelTab
17
17
  from euporie.core.widgets.inputs import KernelInput
18
18
 
19
19
  if TYPE_CHECKING:
@@ -22,9 +22,9 @@ if TYPE_CHECKING:
22
22
 
23
23
  from prompt_toolkit.layout.containers import AnyContainer
24
24
 
25
- from euporie.core.app import BaseApp
25
+ from euporie.core.app.app import BaseApp
26
+ from euporie.core.bars.status import StatusBarFields
26
27
  from euporie.core.comm.base import Comm
27
- from euporie.core.widgets.status import StatusBarFields
28
28
 
29
29
  log = logging.getLogger(__name__)
30
30
 
@@ -148,7 +148,10 @@ class EditorTab(KernelTab):
148
148
  [self.input_box],
149
149
  width=Dimension(weight=1),
150
150
  height=Dimension(weight=1),
151
- key_bindings=load_registered_bindings("euporie.core.tabs.base.Tab"),
151
+ key_bindings=load_registered_bindings(
152
+ "euporie.core.tabs.base.Tab",
153
+ config=self.app.config,
154
+ ),
152
155
  )
153
156
 
154
157
  def save(self, path: Path | None = None, cb: Callable | None = None) -> None:
@@ -163,9 +166,11 @@ class EditorTab(KernelTab):
163
166
  log.debug("Saving file...")
164
167
  self.saving = True
165
168
  self.app.invalidate()
166
-
169
+ # Ensure parent path exists
170
+ parent = self.path.parent
171
+ parent.mkdir(exist_ok=True, parents=True)
167
172
  # Save to a temp file, then replace the original
168
- temp_path = self.path.parent / f".{self.path.stem}.tmp{self.path.suffix}"
173
+ temp_path = parent / f".{self.path.stem}.tmp{self.path.suffix}"
169
174
  log.debug("Using temporary file %s", temp_path.name)
170
175
  try:
171
176
  open_file = temp_path.open("w")
@@ -18,8 +18,8 @@ if TYPE_CHECKING:
18
18
 
19
19
  from prompt_toolkit.layout.containers import AnyContainer
20
20
 
21
- from euporie.core.app import BaseApp
22
- from euporie.core.widgets.status import StatusBarFields
21
+ from euporie.core.app.app import BaseApp
22
+ from euporie.core.bars.status import StatusBarFields
23
23
 
24
24
  log = logging.getLogger(__name__)
25
25
 
@@ -29,7 +29,7 @@ class JsonTab(Tab):
29
29
 
30
30
  name = "JSON Viewer"
31
31
  mime_types: ClassVar[set[str]] = {"*json"}
32
- filte_types: ClassVar[set[str]] = {".json"}
32
+ file_types: ClassVar[dict[str, None]] = {".json": None}
33
33
 
34
34
  def __init__(self, app: BaseApp, path: Path | None = None) -> None:
35
35
  """Call when the tab is created."""
@@ -9,8 +9,6 @@ from prompt_toolkit.layout.containers import HSplit, VSplit
9
9
  from prompt_toolkit.layout.dimension import Dimension
10
10
  from prompt_toolkit.widgets import SearchToolbar
11
11
 
12
- from euporie.core.commands import add_cmd
13
- from euporie.core.current import get_app
14
12
  from euporie.core.log import LOG_QUEUE, QueueHandler
15
13
  from euporie.core.margins import MarginContainer, ScrollbarMargin
16
14
  from euporie.core.path import parse_path
@@ -23,7 +21,7 @@ if TYPE_CHECKING:
23
21
 
24
22
  from prompt_toolkit.formatted_text.base import FormattedText
25
23
 
26
- from euporie.core.app import BaseApp
24
+ from euporie.core.app.app import BaseApp
27
25
 
28
26
 
29
27
  class LogView(Tab):
@@ -93,18 +91,3 @@ class LogView(Tab):
93
91
  """Remove log queue handler hook on close."""
94
92
  QueueHandler.unhook(self.hook_id)
95
93
  super().close(cb=cb)
96
-
97
- # ################################### Commands ####################################
98
-
99
- @staticmethod
100
- @add_cmd()
101
- def _view_logs() -> None:
102
- """Open the logs in a new tab."""
103
- app = get_app()
104
- for tab in app.tabs:
105
- if isinstance(tab, LogView):
106
- break
107
- else:
108
- tab = LogView(app)
109
- app.tabs.append(tab)
110
- tab.focus()