jpterm 0.2.2__tar.gz → 0.2.3__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 (167) hide show
  1. {jpterm-0.2.2 → jpterm-0.2.3}/CHANGELOG.md +16 -2
  2. {jpterm-0.2.2 → jpterm-0.2.3}/PKG-INFO +1 -1
  3. jpterm-0.2.3/examples/widget.ipynb +248 -0
  4. jpterm-0.2.3/jpterm/__init__.py +1 -0
  5. jpterm-0.2.3/plugins/cell/txl_cell/__init__.py +1 -0
  6. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/cell/txl_cell/components.py +3 -1
  7. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/console/pyproject.toml +1 -0
  8. jpterm-0.2.3/plugins/console/txl_console/__init__.py +1 -0
  9. jpterm-0.2.3/plugins/editors/txl_editors/__init__.py +1 -0
  10. jpterm-0.2.3/plugins/file_browser/txl_file_browser/__init__.py +1 -0
  11. jpterm-0.2.3/plugins/image_viewer/txl_image_viewer/__init__.py +1 -0
  12. jpterm-0.2.3/plugins/jpterm/txl_jpterm/__init__.py +1 -0
  13. jpterm-0.2.3/plugins/kernel/txl_kernel/__init__.py +1 -0
  14. jpterm-0.2.3/plugins/launcher/txl_launcher/__init__.py +1 -0
  15. jpterm-0.2.3/plugins/local_contents/txl_local_contents/__init__.py +1 -0
  16. jpterm-0.2.3/plugins/local_kernels/txl_local_kernels/__init__.py +1 -0
  17. jpterm-0.2.3/plugins/local_terminals/txl_local_terminals/__init__.py +1 -0
  18. jpterm-0.2.3/plugins/markdown_viewer/txl_markdown_viewer/__init__.py +1 -0
  19. jpterm-0.2.3/plugins/notebook_editor/txl_notebook_editor/__init__.py +1 -0
  20. jpterm-0.2.3/plugins/remote_contents/txl_remote_contents/__init__.py +1 -0
  21. jpterm-0.2.3/plugins/remote_kernels/txl_remote_kernels/__init__.py +1 -0
  22. jpterm-0.2.3/plugins/remote_terminals/txl_remote_terminals/__init__.py +1 -0
  23. jpterm-0.2.3/plugins/terminal/txl_terminal/__init__.py +1 -0
  24. jpterm-0.2.3/plugins/text_editor/txl_text_editor/__init__.py +1 -0
  25. jpterm-0.2.3/plugins/text_viewer/txl_text_viewer/__init__.py +1 -0
  26. jpterm-0.2.3/plugins/widgets/txl_widgets/__init__.py +1 -0
  27. jpterm-0.2.3/txl/txl/__init__.py +1 -0
  28. jpterm-0.2.2/examples/widget.ipynb +0 -59
  29. jpterm-0.2.2/jpterm/__init__.py +0 -1
  30. jpterm-0.2.2/plugins/cell/txl_cell/__init__.py +0 -1
  31. jpterm-0.2.2/plugins/console/txl_console/__init__.py +0 -1
  32. jpterm-0.2.2/plugins/editors/txl_editors/__init__.py +0 -1
  33. jpterm-0.2.2/plugins/file_browser/txl_file_browser/__init__.py +0 -1
  34. jpterm-0.2.2/plugins/image_viewer/txl_image_viewer/__init__.py +0 -1
  35. jpterm-0.2.2/plugins/jpterm/txl_jpterm/__init__.py +0 -1
  36. jpterm-0.2.2/plugins/kernel/txl_kernel/__init__.py +0 -1
  37. jpterm-0.2.2/plugins/launcher/txl_launcher/__init__.py +0 -1
  38. jpterm-0.2.2/plugins/local_contents/txl_local_contents/__init__.py +0 -1
  39. jpterm-0.2.2/plugins/local_kernels/txl_local_kernels/__init__.py +0 -1
  40. jpterm-0.2.2/plugins/local_terminals/txl_local_terminals/__init__.py +0 -1
  41. jpterm-0.2.2/plugins/markdown_viewer/txl_markdown_viewer/__init__.py +0 -1
  42. jpterm-0.2.2/plugins/notebook_editor/txl_notebook_editor/__init__.py +0 -1
  43. jpterm-0.2.2/plugins/remote_contents/txl_remote_contents/__init__.py +0 -1
  44. jpterm-0.2.2/plugins/remote_kernels/txl_remote_kernels/__init__.py +0 -1
  45. jpterm-0.2.2/plugins/remote_terminals/txl_remote_terminals/__init__.py +0 -1
  46. jpterm-0.2.2/plugins/terminal/txl_terminal/__init__.py +0 -1
  47. jpterm-0.2.2/plugins/text_editor/txl_text_editor/__init__.py +0 -1
  48. jpterm-0.2.2/plugins/text_viewer/txl_text_viewer/__init__.py +0 -1
  49. jpterm-0.2.2/plugins/widgets/txl_widgets/__init__.py +0 -1
  50. jpterm-0.2.2/txl/txl/__init__.py +0 -1
  51. {jpterm-0.2.2 → jpterm-0.2.3}/.github/workflows/test.yml +0 -0
  52. {jpterm-0.2.2 → jpterm-0.2.3}/.gitignore +0 -0
  53. {jpterm-0.2.2 → jpterm-0.2.3}/.pre-commit-config.yaml +0 -0
  54. {jpterm-0.2.2 → jpterm-0.2.3}/LICENSE +0 -0
  55. {jpterm-0.2.2 → jpterm-0.2.3}/README.md +0 -0
  56. {jpterm-0.2.2 → jpterm-0.2.3}/config.yaml +0 -0
  57. {jpterm-0.2.2 → jpterm-0.2.3}/examples/button.ipynb +0 -0
  58. {jpterm-0.2.2 → jpterm-0.2.3}/examples/demo.md +0 -0
  59. {jpterm-0.2.2 → jpterm-0.2.3}/examples/jupyter.png +0 -0
  60. {jpterm-0.2.2 → jpterm-0.2.3}/examples/plotext.ipynb +0 -0
  61. {jpterm-0.2.2 → jpterm-0.2.3}/examples/switch.ipynb +0 -0
  62. {jpterm-0.2.2 → jpterm-0.2.3}/jpterm/cli.py +0 -0
  63. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/cell/LICENSE.txt +0 -0
  64. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/cell/README.md +0 -0
  65. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/cell/pyproject.toml +0 -0
  66. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/console/LICENSE.txt +0 -0
  67. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/console/README.md +0 -0
  68. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/console/txl_console/components.py +0 -0
  69. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/editors/LICENSE.txt +0 -0
  70. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/editors/README.md +0 -0
  71. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/editors/pyproject.toml +0 -0
  72. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/editors/txl_editors/components.py +0 -0
  73. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/file_browser/LICENSE.txt +0 -0
  74. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/file_browser/README.md +0 -0
  75. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/file_browser/pyproject.toml +0 -0
  76. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/file_browser/txl_file_browser/components.py +0 -0
  77. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/image_viewer/LICENSE.txt +0 -0
  78. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/image_viewer/README.md +0 -0
  79. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/image_viewer/pyproject.toml +0 -0
  80. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/image_viewer/txl_image_viewer/components.py +0 -0
  81. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/LICENSE.txt +0 -0
  82. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/README.md +0 -0
  83. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/pyproject.toml +0 -0
  84. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/txl_jpterm/components.py +0 -0
  85. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/txl_jpterm/footer.py +0 -0
  86. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/txl_jpterm/header.py +0 -0
  87. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/txl_jpterm/jpterm.css +0 -0
  88. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/jpterm/txl_jpterm/main_area.py +0 -0
  89. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/kernel/LICENSE.txt +0 -0
  90. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/kernel/README.md +0 -0
  91. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/kernel/pyproject.toml +0 -0
  92. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/kernel/txl_kernel/driver.py +0 -0
  93. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/kernel/txl_kernel/message.py +0 -0
  94. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/launcher/LICENSE.txt +0 -0
  95. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/launcher/README.md +0 -0
  96. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/launcher/pyproject.toml +0 -0
  97. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/launcher/txl_launcher/components.py +0 -0
  98. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_contents/LICENSE.txt +0 -0
  99. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_contents/README.md +0 -0
  100. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_contents/pyproject.toml +0 -0
  101. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_contents/txl_local_contents/components.py +0 -0
  102. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/LICENSE.txt +0 -0
  103. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/README.md +0 -0
  104. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/pyproject.toml +0 -0
  105. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/txl_local_kernels/components.py +0 -0
  106. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/txl_local_kernels/connect.py +0 -0
  107. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/txl_local_kernels/driver.py +0 -0
  108. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/txl_local_kernels/kernelspec.py +0 -0
  109. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/txl_local_kernels/message.py +0 -0
  110. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_kernels/txl_local_kernels/paths.py +0 -0
  111. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_terminals/LICENSE.txt +0 -0
  112. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_terminals/README.md +0 -0
  113. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_terminals/pyproject.toml +0 -0
  114. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_terminals/txl_local_terminals/components.py +0 -0
  115. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_terminals/txl_local_terminals/terminal.py +0 -0
  116. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/local_terminals/txl_local_terminals/win_terminal.py +0 -0
  117. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/markdown_viewer/LICENSE.txt +0 -0
  118. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/markdown_viewer/README.md +0 -0
  119. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/markdown_viewer/pyproject.toml +0 -0
  120. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/markdown_viewer/txl_markdown_viewer/components.py +0 -0
  121. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_editor/LICENSE.txt +0 -0
  122. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_editor/README.md +0 -0
  123. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_editor/pyproject.toml +0 -0
  124. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_editor/txl_notebook_editor/components.py +0 -0
  125. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_viewer/LICENSE.txt +0 -0
  126. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_viewer/README.md +0 -0
  127. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_viewer/pyproject.toml +0 -0
  128. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_viewer/txl_notebook_viewer/__init__.py +0 -0
  129. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/notebook_viewer/txl_notebook_viewer/components.py +0 -0
  130. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_contents/LICENSE.txt +0 -0
  131. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_contents/README.md +0 -0
  132. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_contents/pyproject.toml +0 -0
  133. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_contents/txl_remote_contents/components.py +0 -0
  134. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_kernels/LICENSE.txt +0 -0
  135. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_kernels/README.md +0 -0
  136. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_kernels/pyproject.toml +0 -0
  137. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_kernels/txl_remote_kernels/components.py +0 -0
  138. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_kernels/txl_remote_kernels/driver.py +0 -0
  139. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_kernels/txl_remote_kernels/message.py +0 -0
  140. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_terminals/LICENSE.txt +0 -0
  141. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_terminals/README.md +0 -0
  142. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_terminals/pyproject.toml +0 -0
  143. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/remote_terminals/txl_remote_terminals/components.py +0 -0
  144. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/terminal/LICENSE.txt +0 -0
  145. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/terminal/README.md +0 -0
  146. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/terminal/pyproject.toml +0 -0
  147. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/terminal/txl_terminal/components.py +0 -0
  148. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_editor/LICENSE.txt +0 -0
  149. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_editor/README.md +0 -0
  150. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_editor/pyproject.toml +0 -0
  151. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_editor/txl_text_editor/components.py +0 -0
  152. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_viewer/LICENSE.txt +0 -0
  153. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_viewer/README.md +0 -0
  154. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_viewer/pyproject.toml +0 -0
  155. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/text_viewer/txl_text_viewer/components.py +0 -0
  156. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/widgets/LICENSE.txt +0 -0
  157. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/widgets/README.md +0 -0
  158. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/widgets/pyproject.toml +0 -0
  159. {jpterm-0.2.2 → jpterm-0.2.3}/plugins/widgets/txl_widgets/components.py +0 -0
  160. {jpterm-0.2.2 → jpterm-0.2.3}/pyproject.toml +0 -0
  161. {jpterm-0.2.2 → jpterm-0.2.3}/txl/LICENSE.txt +0 -0
  162. {jpterm-0.2.2 → jpterm-0.2.3}/txl/README.md +0 -0
  163. {jpterm-0.2.2 → jpterm-0.2.3}/txl/pyproject.toml +0 -0
  164. {jpterm-0.2.2 → jpterm-0.2.3}/txl/txl/app.py +0 -0
  165. {jpterm-0.2.2 → jpterm-0.2.3}/txl/txl/base.py +0 -0
  166. {jpterm-0.2.2 → jpterm-0.2.3}/txl/txl/cli.py +0 -0
  167. {jpterm-0.2.2 → jpterm-0.2.3}/txl/txl/text_input.py +0 -0
@@ -2,6 +2,22 @@
2
2
 
3
3
  <!-- <START NEW CHANGELOG ENTRY> -->
4
4
 
5
+ ## 0.2.3
6
+
7
+ ([Full Changelog](https://github.com/davidbrochart/jpterm/compare/v0.2.2...ae0ab58aa584c0b3bad16ffed12584ea74b823ec))
8
+
9
+ ### Merged PRs
10
+
11
+ - Show output execution count [#69](https://github.com/davidbrochart/jpterm/pull/69) ([@davidbrochart](https://github.com/davidbrochart))
12
+
13
+ ### Contributors to this release
14
+
15
+ ([GitHub contributors page for this release](https://github.com/davidbrochart/jpterm/graphs/contributors?from=2023-12-21&to=2023-12-21&type=c))
16
+
17
+ [@davidbrochart](https://github.com/search?q=repo%3Adavidbrochart%2Fjpterm+involves%3Adavidbrochart+updated%3A2023-12-21..2023-12-21&type=Issues)
18
+
19
+ <!-- <END NEW CHANGELOG ENTRY> -->
20
+
5
21
  ## 0.2.2
6
22
 
7
23
  ([Full Changelog](https://github.com/davidbrochart/jpterm/compare/v0.2.1...e6480de616a8a8b471c5510910c90cbd4aa52cdf))
@@ -16,8 +32,6 @@
16
32
 
17
33
  [@davidbrochart](https://github.com/search?q=repo%3Adavidbrochart%2Fjpterm+involves%3Adavidbrochart+updated%3A2023-12-20..2023-12-21&type=Issues)
18
34
 
19
- <!-- <END NEW CHANGELOG ENTRY> -->
20
-
21
35
  ## 0.2.1
22
36
 
23
37
  ([Full Changelog](https://github.com/davidbrochart/jpterm/compare/v0.2.0...b54b3b60006897ba67fe6c03b38a6f03e9a3d023))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jpterm
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Jupyter in the terminal
5
5
  Project-URL: Homepage, https://github.com/davidbrochart/jpterm
6
6
  Author-email: David Brochart <david.brochart@gmail.com>
@@ -0,0 +1,248 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "from decimal import Decimal\n",
10
+ "\n",
11
+ "from textual import events, on\r",
12
+ "from textual.app import App, ComposeResult\r",
13
+ "from textual.containers import Container\r",
14
+ "from textual.css.query import NoMatches\r",
15
+ "from textual.reactive import var\r",
16
+ "from textual.widgets import Button, Digits\r",
17
+ "from ypywidgets_textual import Widget, Driver\r",
18
+ "\r",
19
+ "class CalculatorApp(App):\r",
20
+ " \"\"\"A working 'desktop' calculator.\"\"\"\r",
21
+ "\r",
22
+ " CSS = \"\"\"\r",
23
+ " Screen {\r",
24
+ " overflow: auto;\r",
25
+ " }\r",
26
+ " \r",
27
+ " #calculator {\r",
28
+ " layout: grid;\r",
29
+ " grid-size: 4;\r",
30
+ " grid-gutter: 1 2;\r",
31
+ " grid-columns: 1fr;\r",
32
+ " grid-rows: 2fr 1fr 1fr 1fr 1fr 1fr;\r",
33
+ " margin: 1 2;\r",
34
+ " min-height: 25;\r",
35
+ " min-width: 26;\r",
36
+ " height: 100%;\r",
37
+ " }\r",
38
+ " \r",
39
+ " Button {\r",
40
+ " width: 100%;\r",
41
+ " height: 100%;\r",
42
+ " }\r",
43
+ " \r",
44
+ " #numbers {\r",
45
+ " column-span: 4;\r",
46
+ " padding: 0 1;\r",
47
+ " height: 100%;\r",
48
+ " background: $primary-lighten-2;\r",
49
+ " color: $text;\r",
50
+ " content-align: center middle;\r",
51
+ " text-align: right;\r",
52
+ " }\r",
53
+ " \r",
54
+ " #number-0 {\r",
55
+ " column-span: 2;\r",
56
+ " }\r",
57
+ " \"\"\"\r",
58
+ "\r",
59
+ " numbers = var(\"0\")\r",
60
+ " show_ac = var(True)\r",
61
+ " left = var(Decimal(\"0\"))\r",
62
+ " right = var(Decimal(\"0\"))\r",
63
+ " value = var(\"\")\r",
64
+ " operator = var(\"plus\")\r",
65
+ "\r",
66
+ " NAME_MAP = {\r",
67
+ " \"asterisk\": \"multiply\",\r",
68
+ " \"slash\": \"divide\",\r",
69
+ " \"underscore\": \"plus-minus\",\r",
70
+ " \"full_stop\": \"point\",\r",
71
+ " \"plus_minus_sign\": \"plus-minus\",\r",
72
+ " \"percent_sign\": \"percent\",\r",
73
+ " \"equals_sign\": \"equals\",\r",
74
+ " \"minus\": \"minus\",\r",
75
+ " \"plus\": \"plus\",\r",
76
+ " }\r",
77
+ "\r",
78
+ " def watch_numbers(self, value: str) -> None:\r",
79
+ " \"\"\"Called when numbers is updated.\"\"\"\r",
80
+ " self.query_one(\"#numbers\", Digits).update(value)\r",
81
+ "\r",
82
+ " def compute_show_ac(self) -> bool:\r",
83
+ " \"\"\"Compute switch to show AC or C button\"\"\"\r",
84
+ " return self.value in (\"\", \"0\") and self.numbers == \"0\"\r",
85
+ "\r",
86
+ " def watch_show_ac(self, show_ac: bool) -> None:\r",
87
+ " \"\"\"Called when show_ac changes.\"\"\"\r",
88
+ " self.query_one(\"#c\").display = not show_ac\r",
89
+ " self.query_one(\"#ac\").display = show_ac\r",
90
+ "\r",
91
+ " def compose(self) -> ComposeResult:\r",
92
+ " \"\"\"Add our buttons.\"\"\"\r",
93
+ " with Container(id=\"calculator\"):\r",
94
+ " yield Digits(id=\"numbers\")\r",
95
+ " yield Button(\"AC\", id=\"ac\", variant=\"primary\")\r",
96
+ " yield Button(\"C\", id=\"c\", variant=\"primary\")\r",
97
+ " yield Button(\"+/-\", id=\"plus-minus\", variant=\"primary\")\r",
98
+ " yield Button(\"%\", id=\"percent\", variant=\"primary\")\r",
99
+ " yield Button(\"÷\", id=\"divide\", variant=\"warning\")\r",
100
+ " yield Button(\"7\", id=\"number-7\", classes=\"number\")\r",
101
+ " yield Button(\"8\", id=\"number-8\", classes=\"number\")\r",
102
+ " yield Button(\"9\", id=\"number-9\", classes=\"number\")\r",
103
+ " yield Button(\"×\", id=\"multiply\", variant=\"warning\")\r",
104
+ " yield Button(\"4\", id=\"number-4\", classes=\"number\")\r",
105
+ " yield Button(\"5\", id=\"number-5\", classes=\"number\")\r",
106
+ " yield Button(\"6\", id=\"number-6\", classes=\"number\")\r",
107
+ " yield Button(\"-\", id=\"minus\", variant=\"warning\")\r",
108
+ " yield Button(\"1\", id=\"number-1\", classes=\"number\")\r",
109
+ " yield Button(\"2\", id=\"number-2\", classes=\"number\")\r",
110
+ " yield Button(\"3\", id=\"number-3\", classes=\"number\")\r",
111
+ " yield Button(\"+\", id=\"plus\", variant=\"warning\")\r",
112
+ " yield Button(\"0\", id=\"number-0\", classes=\"number\")\r",
113
+ " yield Button(\".\", id=\"point\")\r",
114
+ " yield Button(\"=\", id=\"equals\", variant=\"warning\")\r",
115
+ "\r",
116
+ " def on_key(self, event: events.Key) -> None:\r",
117
+ " \"\"\"Called when the user presses a key.\"\"\"\r",
118
+ "\r",
119
+ " def press(button_id: str) -> None:\r",
120
+ " \"\"\"Press a button, should it exist.\"\"\"\r",
121
+ " try:\r",
122
+ " self.query_one(f\"#{button_id}\", Button).press()\r",
123
+ " except NoMatches:\r",
124
+ " pass\r",
125
+ "\r",
126
+ " key = event.key\r",
127
+ " if key.isdecimal():\r",
128
+ " press(f\"number-{key}\")\r",
129
+ " elif key == \"c\":\r",
130
+ " press(\"c\")\r",
131
+ " press(\"ac\")\r",
132
+ " else:\r",
133
+ " button_id = self.NAME_MAP.get(key)\r",
134
+ " if button_id is not None:\r",
135
+ " press(self.NAME_MAP.get(key, key))\r",
136
+ "\r",
137
+ " @on(Button.Pressed, \".number\")\r",
138
+ " def number_pressed(self, event: Button.Pressed) -> None:\r",
139
+ " \"\"\"Pressed a number.\"\"\"\r",
140
+ " assert event.button.id is not None\r",
141
+ " number = event.button.id.partition(\"-\")[-1]\r",
142
+ " self.numbers = self.value = self.value.lstrip(\"0\") + number\r",
143
+ "\r",
144
+ " @on(Button.Pressed, \"#plus-minus\")\r",
145
+ " def plus_minus_pressed(self) -> None:\r",
146
+ " \"\"\"Pressed + / -\"\"\"\r",
147
+ " self.numbers = self.value = str(Decimal(self.value or \"0\") * -1)\r",
148
+ "\r",
149
+ " @on(Button.Pressed, \"#percent\")\r",
150
+ " def percent_pressed(self) -> None:\r",
151
+ " \"\"\"Pressed %\"\"\"\r",
152
+ " self.numbers = self.value = str(Decimal(self.value or \"0\") / Decimal(100))\r",
153
+ "\r",
154
+ " @on(Button.Pressed, \"#point\")\r",
155
+ " def pressed_point(self) -> None:\r",
156
+ " \"\"\"Pressed .\"\"\"\r",
157
+ " if \".\" not in self.value:\r",
158
+ " self.numbers = self.value = (self.value or \"0\") + \".\"\r",
159
+ "\r",
160
+ " @on(Button.Pressed, \"#ac\")\r",
161
+ " def pressed_ac(self) -> None:\r",
162
+ " \"\"\"Pressed AC\"\"\"\r",
163
+ " self.value = \"\"\r",
164
+ " self.left = self.right = Decimal(0)\r",
165
+ " self.operator = \"plus\"\r",
166
+ " self.numbers = \"0\"\r",
167
+ "\r",
168
+ " @on(Button.Pressed, \"#c\")\r",
169
+ " def pressed_c(self) -> None:\r",
170
+ " \"\"\"Pressed C\"\"\"\r",
171
+ " self.value = \"\"\r",
172
+ " self.numbers = \"0\"\r",
173
+ "\r",
174
+ " def _do_math(self) -> None:\r",
175
+ " \"\"\"Does the math: LEFT OPERATOR RIGHT\"\"\"\r",
176
+ " try:\r",
177
+ " if self.operator == \"plus\":\r",
178
+ " self.left += self.right\r",
179
+ " elif self.operator == \"minus\":\r",
180
+ " self.left -= self.right\r",
181
+ " elif self.operator == \"divide\":\r",
182
+ " self.left /= self.right\r",
183
+ " elif self.operator == \"multiply\":\r",
184
+ " self.left *= self.right\r",
185
+ " self.numbers = str(self.left)\r",
186
+ " self.value = \"\"\r",
187
+ " except Exception:\r",
188
+ " self.numbers = \"Error\"\r",
189
+ "\r",
190
+ " @on(Button.Pressed, \"#plus,#minus,#divide,#multiply\")\r",
191
+ " def pressed_op(self, event: Button.Pressed) -> None:\r",
192
+ " \"\"\"Pressed one of the arithmetic operations.\"\"\"\r",
193
+ " self.right = Decimal(self.value or \"0\")\r",
194
+ " self._do_math()\r",
195
+ " assert event.button.id is not None\r",
196
+ " self.operator = event.button.id\r",
197
+ "\r",
198
+ " @on(Button.Pressed, \"#equals\")\r",
199
+ " def pressed_equals(self) -> None:\r",
200
+ " \"\"\"Pressed =\"\"\"\r",
201
+ " if self.value:\r",
202
+ " self.right = Decimal(self.value)\r",
203
+ " self._do_math()\r",
204
+ "\r",
205
+ "app = CalculatorApp(driver_class=Driver)"
206
+ ]
207
+ },
208
+ {
209
+ "cell_type": "code",
210
+ "execution_count": null,
211
+ "metadata": {},
212
+ "outputs": [],
213
+ "source": [
214
+ "w = Widget(app, cols=0, rows=0)"
215
+ ]
216
+ },
217
+ {
218
+ "cell_type": "code",
219
+ "execution_count": null,
220
+ "metadata": {},
221
+ "outputs": [],
222
+ "source": [
223
+ "w"
224
+ ]
225
+ }
226
+ ],
227
+ "metadata": {
228
+ "kernelspec": {
229
+ "display_name": "Python 3 (ipykernel)",
230
+ "language": "python",
231
+ "name": "python3"
232
+ },
233
+ "language_info": {
234
+ "codemirror_mode": {
235
+ "name": "ipython",
236
+ "version": 3
237
+ },
238
+ "file_extension": ".py",
239
+ "mimetype": "text/x-python",
240
+ "name": "python",
241
+ "nbconvert_exporter": "python",
242
+ "pygments_lexer": "ipython3",
243
+ "version": "3.11.6"
244
+ }
245
+ },
246
+ "nbformat": 4,
247
+ "nbformat_minor": 4
248
+ }
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -227,6 +227,8 @@ class _Cell(Cell, Container, metaclass=CellMeta, can_focus=True):
227
227
  renderable = RichText.from_ansi(text)
228
228
  elif output_type == "execute_result":
229
229
  execution_count = output.get("execution_count", " ") or " "
230
+ if execution_count != " ":
231
+ execution_count = int(execution_count)
230
232
  execution_count = RichText.from_markup(
231
233
  f"[red]Out[[#ee4b2b]{execution_count}[/#ee4b2b]]:[/red]\n"
232
234
  )
@@ -237,7 +239,7 @@ class _Cell(Cell, Container, metaclass=CellMeta, can_focus=True):
237
239
  widget = YDOCS[f"txl_{model.__class__.__name__[:-5]}"](model)
238
240
  if not widget:
239
241
  data = output["data"].get("text/plain", "")
240
- renderable = RichText()
242
+ renderable = execution_count
241
243
  if isinstance(data, list):
242
244
  text = "".join(data)
243
245
  renderable += RichText.from_ansi(text)
@@ -23,6 +23,7 @@ classifiers = [
23
23
  ]
24
24
  dependencies = [
25
25
  "txl",
26
+ "jupyter-ydoc >=2.0.0,<3.0.0",
26
27
  ]
27
28
  dynamic = ["version"]
28
29
 
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -0,0 +1 @@
1
+ __version__ = "0.2.3"
@@ -1,59 +0,0 @@
1
- {
2
- "cells": [
3
- {
4
- "execution_count": 1,
5
- "metadata": {
6
- "trusted": false
7
- },
8
- "source": "from decimal import Decimal\n\nfrom textual import events, on\rfrom textual.app import App, ComposeResult\rfrom textual.containers import Container\rfrom textual.css.query import NoMatches\rfrom textual.reactive import var\rfrom textual.widgets import Button, Digits\rfrom ypywidgets_textual import Widget, Driver\r\rclass CalculatorApp(App):\r \"\"\"A working 'desktop' calculator.\"\"\"\r\r CSS = \"\"\"\r Screen {\r overflow: auto;\r }\r \r #calculator {\r layout: grid;\r grid-size: 4;\r grid-gutter: 1 2;\r grid-columns: 1fr;\r grid-rows: 2fr 1fr 1fr 1fr 1fr 1fr;\r margin: 1 2;\r min-height: 25;\r min-width: 26;\r height: 100%;\r }\r \r Button {\r width: 100%;\r height: 100%;\r }\r \r #numbers {\r column-span: 4;\r padding: 0 1;\r height: 100%;\r background: $primary-lighten-2;\r color: $text;\r content-align: center middle;\r text-align: right;\r }\r \r #number-0 {\r column-span: 2;\r }\r \"\"\"\r\r numbers = var(\"0\")\r show_ac = var(True)\r left = var(Decimal(\"0\"))\r right = var(Decimal(\"0\"))\r value = var(\"\")\r operator = var(\"plus\")\r\r NAME_MAP = {\r \"asterisk\": \"multiply\",\r \"slash\": \"divide\",\r \"underscore\": \"plus-minus\",\r \"full_stop\": \"point\",\r \"plus_minus_sign\": \"plus-minus\",\r \"percent_sign\": \"percent\",\r \"equals_sign\": \"equals\",\r \"minus\": \"minus\",\r \"plus\": \"plus\",\r }\r\r def watch_numbers(self, value: str) -> None:\r \"\"\"Called when numbers is updated.\"\"\"\r self.query_one(\"#numbers\", Digits).update(value)\r\r def compute_show_ac(self) -> bool:\r \"\"\"Compute switch to show AC or C button\"\"\"\r return self.value in (\"\", \"0\") and self.numbers == \"0\"\r\r def watch_show_ac(self, show_ac: bool) -> None:\r \"\"\"Called when show_ac changes.\"\"\"\r self.query_one(\"#c\").display = not show_ac\r self.query_one(\"#ac\").display = show_ac\r\r def compose(self) -> ComposeResult:\r \"\"\"Add our buttons.\"\"\"\r with Container(id=\"calculator\"):\r yield Digits(id=\"numbers\")\r yield Button(\"AC\", id=\"ac\", variant=\"primary\")\r yield Button(\"C\", id=\"c\", variant=\"primary\")\r yield Button(\"+/-\", id=\"plus-minus\", variant=\"primary\")\r yield Button(\"%\", id=\"percent\", variant=\"primary\")\r yield Button(\"\u00f7\", id=\"divide\", variant=\"warning\")\r yield Button(\"7\", id=\"number-7\", classes=\"number\")\r yield Button(\"8\", id=\"number-8\", classes=\"number\")\r yield Button(\"9\", id=\"number-9\", classes=\"number\")\r yield Button(\"\u00d7\", id=\"multiply\", variant=\"warning\")\r yield Button(\"4\", id=\"number-4\", classes=\"number\")\r yield Button(\"5\", id=\"number-5\", classes=\"number\")\r yield Button(\"6\", id=\"number-6\", classes=\"number\")\r yield Button(\"-\", id=\"minus\", variant=\"warning\")\r yield Button(\"1\", id=\"number-1\", classes=\"number\")\r yield Button(\"2\", id=\"number-2\", classes=\"number\")\r yield Button(\"3\", id=\"number-3\", classes=\"number\")\r yield Button(\"+\", id=\"plus\", variant=\"warning\")\r yield Button(\"0\", id=\"number-0\", classes=\"number\")\r yield Button(\".\", id=\"point\")\r yield Button(\"=\", id=\"equals\", variant=\"warning\")\r\r def on_key(self, event: events.Key) -> None:\r \"\"\"Called when the user presses a key.\"\"\"\r\r def press(button_id: str) -> None:\r \"\"\"Press a button, should it exist.\"\"\"\r try:\r self.query_one(f\"#{button_id}\", Button).press()\r except NoMatches:\r pass\r\r key = event.key\r if key.isdecimal():\r press(f\"number-{key}\")\r elif key == \"c\":\r press(\"c\")\r press(\"ac\")\r else:\r button_id = self.NAME_MAP.get(key)\r if button_id is not None:\r press(self.NAME_MAP.get(key, key))\r\r @on(Button.Pressed, \".number\")\r def number_pressed(self, event: Button.Pressed) -> None:\r \"\"\"Pressed a number.\"\"\"\r assert event.button.id is not None\r number = event.button.id.partition(\"-\")[-1]\r self.numbers = self.value = self.value.lstrip(\"0\") + number\r\r @on(Button.Pressed, \"#plus-minus\")\r def plus_minus_pressed(self) -> None:\r \"\"\"Pressed + / -\"\"\"\r self.numbers = self.value = str(Decimal(self.value or \"0\") * -1)\r\r @on(Button.Pressed, \"#percent\")\r def percent_pressed(self) -> None:\r \"\"\"Pressed %\"\"\"\r self.numbers = self.value = str(Decimal(self.value or \"0\") / Decimal(100))\r\r @on(Button.Pressed, \"#point\")\r def pressed_point(self) -> None:\r \"\"\"Pressed .\"\"\"\r if \".\" not in self.value:\r self.numbers = self.value = (self.value or \"0\") + \".\"\r\r @on(Button.Pressed, \"#ac\")\r def pressed_ac(self) -> None:\r \"\"\"Pressed AC\"\"\"\r self.value = \"\"\r self.left = self.right = Decimal(0)\r self.operator = \"plus\"\r self.numbers = \"0\"\r\r @on(Button.Pressed, \"#c\")\r def pressed_c(self) -> None:\r \"\"\"Pressed C\"\"\"\r self.value = \"\"\r self.numbers = \"0\"\r\r def _do_math(self) -> None:\r \"\"\"Does the math: LEFT OPERATOR RIGHT\"\"\"\r try:\r if self.operator == \"plus\":\r self.left += self.right\r elif self.operator == \"minus\":\r self.left -= self.right\r elif self.operator == \"divide\":\r self.left /= self.right\r elif self.operator == \"multiply\":\r self.left *= self.right\r self.numbers = str(self.left)\r self.value = \"\"\r except Exception:\r self.numbers = \"Error\"\r\r @on(Button.Pressed, \"#plus,#minus,#divide,#multiply\")\r def pressed_op(self, event: Button.Pressed) -> None:\r \"\"\"Pressed one of the arithmetic operations.\"\"\"\r self.right = Decimal(self.value or \"0\")\r self._do_math()\r assert event.button.id is not None\r self.operator = event.button.id\r\r @on(Button.Pressed, \"#equals\")\r def pressed_equals(self) -> None:\r \"\"\"Pressed =\"\"\"\r if self.value:\r self.right = Decimal(self.value)\r self._do_math()\r\rapp = CalculatorApp(driver_class=Driver)",
9
- "execution_state": "idle",
10
- "cell_type": "code",
11
- "outputs": []
12
- },
13
- {
14
- "source": "w = Widget(app, cols=0, rows=0)",
15
- "metadata": {
16
- "trusted": false
17
- },
18
- "cell_type": "code",
19
- "execution_count": 2,
20
- "execution_state": "idle",
21
- "outputs": []
22
- },
23
- {
24
- "execution_state": "idle",
25
- "outputs": [
26
- {
27
- "guid": "ff6903b-1ade-40f9-922d-d414d02afa"
28
- }
29
- ],
30
- "source": "w",
31
- "metadata": {
32
- "trusted": false
33
- },
34
- "execution_count": 3,
35
- "cell_type": "code"
36
- }
37
- ],
38
- "metadata": {
39
- "language_info": {
40
- "file_extension": ".py",
41
- "version": "3.11.6",
42
- "name": "python",
43
- "mimetype": "text/x-python",
44
- "nbconvert_exporter": "python",
45
- "codemirror_mode": {
46
- "version": 3,
47
- "name": "ipython"
48
- },
49
- "pygments_lexer": "ipython3"
50
- },
51
- "kernelspec": {
52
- "name": "python3",
53
- "language": "python",
54
- "display_name": "Python 3 (ipykernel)"
55
- }
56
- },
57
- "nbformat": 4,
58
- "nbformat_minor": 4
59
- }
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
@@ -1 +0,0 @@
1
- __version__ = "0.2.2"
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