├── .github
└── workflows
│ └── streambook.yml
├── .gitignore
├── LICENSE
├── README.md
├── example.gif
├── example.notebook.ipynb
├── example.py
├── example.streambook.py
├── notebook.png
├── output.gif
├── requirements.dev.txt
├── requirements.example.txt
├── requirements.txt
├── setup.py
├── streambook.png
├── streambook
├── __init__.py
├── __main__.py
├── cli.py
├── gen.py
└── lib.py
└── tests
├── example.streambook.main.tmp
├── example.streambook.tmp
└── test_generate.py
/.github/workflows/streambook.yml:
--------------------------------------------------------------------------------
1 | on: [push, pull_request]
2 | jobs:
3 | build:
4 | runs-on: ${{ matrix.os }}
5 | strategy:
6 | matrix:
7 | os: [macos-latest, ubuntu-latest]
8 | python-version: [3.6, 3.8]
9 |
10 | steps:
11 | - uses: actions/checkout@v2
12 | - name: Set up Python ${{ matrix.python-version }}
13 | uses: actions/setup-python@v2
14 | with:
15 | python-version: ${{ matrix.python-version }}
16 | - name: Install package dependencies
17 | run: |
18 | python -m pip install --upgrade pip
19 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
20 | if [ -f requirements.dev.txt ]; then pip install -r requirements.dev.txt; fi
21 | - name: Test package install
22 | run: pip install .
23 | - name: Lint with flake8
24 | run: |
25 | # stop the build if there are Python syntax errors or undefined names
26 | flake8 --ignore "N801, E203, E266, E501, W503, F812, E741, N803, N802, N806" streambook/ tests/
27 | - name: Test with pytest
28 | run: |
29 | pytest tests/
30 | - name: Run command line
31 | run: |
32 | if [ -f requirements.dev.txt ]; then pip install -r requirements.example.txt; fi
33 | streambook export example.py
34 | cmp example.streambook.py tests/example.streambook.tmp
35 | python example.streambook.py
36 | python example.notebook.py
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | pip-wheel-metadata/
24 | share/python-wheels/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 | MANIFEST
29 |
30 | # PyInstaller
31 | # Usually these files are written by a python script from a template
32 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
33 | *.manifest
34 | *.spec
35 |
36 | # Installer logs
37 | pip-log.txt
38 | pip-delete-this-directory.txt
39 |
40 | # Unit test / coverage reports
41 | htmlcov/
42 | .tox/
43 | .nox/
44 | .coverage
45 | .coverage.*
46 | .cache
47 | nosetests.xml
48 | coverage.xml
49 | *.cover
50 | *.py,cover
51 | .hypothesis/
52 | .pytest_cache/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | target/
76 |
77 | # Jupyter Notebook
78 | .ipynb_checkpoints
79 |
80 | # IPython
81 | profile_default/
82 | ipython_config.py
83 |
84 | # pyenv
85 | .python-version
86 |
87 | # pipenv
88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
91 | # install all needed dependencies.
92 | #Pipfile.lock
93 |
94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow
95 | __pypackages__/
96 |
97 | # Celery stuff
98 | celerybeat-schedule
99 | celerybeat.pid
100 |
101 | # SageMath parsed files
102 | *.sage.py
103 |
104 | # Environments
105 | .env
106 | .venv
107 | env/
108 | venv/
109 | ENV/
110 | env.bak/
111 | venv.bak/
112 |
113 | # Spyder project settings
114 | .spyderproject
115 | .spyproject
116 |
117 | # Rope project settings
118 | .ropeproject
119 |
120 | # mkdocs documentation
121 | /site
122 |
123 | # mypy
124 | .mypy_cache/
125 | .dmypy.json
126 | dmypy.json
127 |
128 | # Pyre type checker
129 | .pyre/
130 | # Pycharm
131 | .idea/
132 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Sasha Rush
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Streambook
2 |
3 | Python notebooks without compromises.
4 |
5 |
6 |
7 | * Write your code in any editor (emacs, vi, vscode)
8 | * Use standard tools (git, black, lint, pytest)
9 | * Export to standard Jupyter format for collaboration
10 |
11 | ## Quick start
12 |
13 | Install:
14 |
15 | ```bash
16 | pip install streambook
17 | ```
18 |
19 | Run streambook on a Python file. For the example notebook included:
20 |
21 | ```bash
22 | pip install matplotlib
23 | streambook run example.py
24 | ```
25 |
26 | The output should look like this [streambook](https://share.streamlit.io/srush/streambook-example/main/example.streambook.py).
27 |
28 | Editing your file `example.py` should automatically update the viewer.
29 |
30 | When you are done and ready to export to a notebook run:
31 |
32 | ```bash
33 | streambook convert example.py
34 | ```
35 |
36 | This produces a standard [notebook](https://nbviewer.jupyter.org/github/srush/streambook/blob/main/example.notebook.ipynb).
37 |
38 |
39 | ## How does this work?
40 |
41 | Streambook is a simple library (< 50 lines!) that hooks together Streamlit + Jupytext + Watchdog.
42 |
43 | * [Streamlit](https://docs.streamlit.io/) - Live updating webview with an advanced caching system
44 | * [Jupytext](https://jupytext.readthedocs.io/) - Bidirectional bridge between plaintext and jupyter format
45 | * [Watchdog](https://github.com/gorakhargosh/watchdog) - File watching in python
46 |
47 |
48 | ## Is this fast enough?
49 |
50 | 
51 |
52 |
53 | A "benefit" of using notebooks is being able to keep data cached in memory,
54 | at the cost of often forgetting how it was created and in what order.
55 |
56 | Streambook instead reruns your notebook from the top whenever the file is changed.
57 | Typically this is pretty fast for writing demos or quick notebooks.
58 |
59 |
60 | However this can be very slow for long running ML applications, particularly for users used to standard notebooks.
61 | In order to circumvent this issue there are two tricks.
62 |
63 | 1) You can divide your notebook us into sections. This allows you to edit individual parts of the notebook.
64 |
65 | ```
66 | streambook run --section "Main" example.py
67 | ```
68 |
69 | 2) You can write functions and add caching.
70 |
71 | Streamlit's caching API to makes it pretty easy in most use case. See
72 | https://docs.streamlit.io/en/stable/caching.html for docs.
73 |
74 | An example is given in the [notebook](https://nbviewer.jupyter.org/github/srush/streambook/blob/main/example.notebook.ipynb).
75 |
--------------------------------------------------------------------------------
/example.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/srush/streambook/120311b7e87e525557719cfe2a943d24a1c59e2a/example.gif
--------------------------------------------------------------------------------
/example.notebook.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "ed186238",
6 | "metadata": {},
7 | "source": [
8 | "# Streambook example"
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "id": "83e965bb",
14 | "metadata": {},
15 | "source": [
16 | "Streambook is a setup for writing live-updating notebooks\n",
17 | "in any editor that you might want to use (emacs, vi, notepad)."
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": null,
23 | "id": "14a4e11c",
24 | "metadata": {},
25 | "outputs": [],
26 | "source": []
27 | },
28 | {
29 | "cell_type": "code",
30 | "execution_count": 1,
31 | "id": "7c768749",
32 | "metadata": {
33 | "execution": {
34 | "iopub.execute_input": "2021-04-12T04:33:45.186839Z",
35 | "iopub.status.busy": "2021-04-12T04:33:45.185793Z",
36 | "iopub.status.idle": "2021-04-12T04:33:45.503548Z",
37 | "shell.execute_reply": "2021-04-12T04:33:45.502548Z"
38 | }
39 | },
40 | "outputs": [],
41 | "source": [
42 | "import numpy as np\n",
43 | "import pandas as pd\n",
44 | "import matplotlib.pyplot as plt\n",
45 | "import time"
46 | ]
47 | },
48 | {
49 | "cell_type": "markdown",
50 | "id": "4702566f",
51 | "metadata": {},
52 | "source": [
53 | "## Main Code"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "id": "0690ed8d",
59 | "metadata": {},
60 | "source": [
61 | "Notebook cells are separated by spaces. Comment cells are rendered\n",
62 | "as markdown.\n",
63 | "\n",
64 | "See https://jupytext.readthedocs.io/en/latest/formats.html#the-light-format"
65 | ]
66 | },
67 | {
68 | "cell_type": "code",
69 | "execution_count": 2,
70 | "id": "c3781d0e",
71 | "metadata": {
72 | "execution": {
73 | "iopub.execute_input": "2021-04-12T04:33:45.510026Z",
74 | "iopub.status.busy": "2021-04-12T04:33:45.509117Z",
75 | "iopub.status.idle": "2021-04-12T04:33:45.512247Z",
76 | "shell.execute_reply": "2021-04-12T04:33:45.511341Z"
77 | },
78 | "lines_to_next_cell": 2
79 | },
80 | "outputs": [],
81 | "source": [
82 | "x = np.array([10, 20, 30])"
83 | ]
84 | },
85 | {
86 | "cell_type": "markdown",
87 | "id": "91c619fd",
88 | "metadata": {},
89 | "source": [
90 | "Cells that end with an explicit variables are printed. \n",
91 | "\n",
92 | "See https://docs.streamlit.io/en/stable/api.html#magic-commands"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": 3,
98 | "id": "e74a6cb8",
99 | "metadata": {
100 | "execution": {
101 | "iopub.execute_input": "2021-04-12T04:33:45.521111Z",
102 | "iopub.status.busy": "2021-04-12T04:33:45.520375Z",
103 | "iopub.status.idle": "2021-04-12T04:33:45.524249Z",
104 | "shell.execute_reply": "2021-04-12T04:33:45.525030Z"
105 | },
106 | "lines_to_next_cell": 2
107 | },
108 | "outputs": [
109 | {
110 | "data": {
111 | "text/plain": [
112 | "array([10, 20, 30])"
113 | ]
114 | },
115 | "execution_count": 1,
116 | "metadata": {},
117 | "output_type": "execute_result"
118 | }
119 | ],
120 | "source": [
121 | "x"
122 | ]
123 | },
124 | {
125 | "cell_type": "markdown",
126 | "id": "0dc21cde",
127 | "metadata": {},
128 | "source": [
129 | "Dictionaries are pretty-printed using streamlit and can be collapsed"
130 | ]
131 | },
132 | {
133 | "cell_type": "code",
134 | "execution_count": 4,
135 | "id": "f29c44e3",
136 | "metadata": {
137 | "execution": {
138 | "iopub.execute_input": "2021-04-12T04:33:45.531718Z",
139 | "iopub.status.busy": "2021-04-12T04:33:45.530819Z",
140 | "iopub.status.idle": "2021-04-12T04:33:45.533983Z",
141 | "shell.execute_reply": "2021-04-12T04:33:45.533200Z"
142 | },
143 | "lines_to_next_cell": 2
144 | },
145 | "outputs": [],
146 | "source": [
147 | "data = [dict(key1 = i, key2=f\"{i}\", key3=100 -i) for i in range(100)] "
148 | ]
149 | },
150 | {
151 | "cell_type": "markdown",
152 | "id": "e0b361f9",
153 | "metadata": {
154 | "lines_to_next_cell": 2
155 | },
156 | "source": [
157 | "Pandas dataframe also show up in tables. "
158 | ]
159 | },
160 | {
161 | "cell_type": "code",
162 | "execution_count": 5,
163 | "id": "11e558cd",
164 | "metadata": {
165 | "execution": {
166 | "iopub.execute_input": "2021-04-12T04:33:45.545351Z",
167 | "iopub.status.busy": "2021-04-12T04:33:45.544409Z",
168 | "iopub.status.idle": "2021-04-12T04:33:45.558847Z",
169 | "shell.execute_reply": "2021-04-12T04:33:45.558072Z"
170 | },
171 | "lines_to_next_cell": 2
172 | },
173 | "outputs": [
174 | {
175 | "data": {
176 | "text/html": [
177 | "
\n",
178 | "\n",
191 | "
\n",
192 | " \n",
193 | " \n",
194 | " | \n",
195 | " key1 | \n",
196 | " key2 | \n",
197 | " key3 | \n",
198 | "
\n",
199 | " \n",
200 | " \n",
201 | " \n",
202 | " 0 | \n",
203 | " 0 | \n",
204 | " 0 | \n",
205 | " 100 | \n",
206 | "
\n",
207 | " \n",
208 | " 1 | \n",
209 | " 1 | \n",
210 | " 1 | \n",
211 | " 99 | \n",
212 | "
\n",
213 | " \n",
214 | " 2 | \n",
215 | " 2 | \n",
216 | " 2 | \n",
217 | " 98 | \n",
218 | "
\n",
219 | " \n",
220 | " 3 | \n",
221 | " 3 | \n",
222 | " 3 | \n",
223 | " 97 | \n",
224 | "
\n",
225 | " \n",
226 | " 4 | \n",
227 | " 4 | \n",
228 | " 4 | \n",
229 | " 96 | \n",
230 | "
\n",
231 | " \n",
232 | " ... | \n",
233 | " ... | \n",
234 | " ... | \n",
235 | " ... | \n",
236 | "
\n",
237 | " \n",
238 | " 95 | \n",
239 | " 95 | \n",
240 | " 95 | \n",
241 | " 5 | \n",
242 | "
\n",
243 | " \n",
244 | " 96 | \n",
245 | " 96 | \n",
246 | " 96 | \n",
247 | " 4 | \n",
248 | "
\n",
249 | " \n",
250 | " 97 | \n",
251 | " 97 | \n",
252 | " 97 | \n",
253 | " 3 | \n",
254 | "
\n",
255 | " \n",
256 | " 98 | \n",
257 | " 98 | \n",
258 | " 98 | \n",
259 | " 2 | \n",
260 | "
\n",
261 | " \n",
262 | " 99 | \n",
263 | " 99 | \n",
264 | " 99 | \n",
265 | " 1 | \n",
266 | "
\n",
267 | " \n",
268 | "
\n",
269 | "
100 rows × 3 columns
\n",
270 | "
"
271 | ],
272 | "text/plain": [
273 | " key1 key2 key3\n",
274 | "0 0 0 100\n",
275 | "1 1 1 99\n",
276 | "2 2 2 98\n",
277 | "3 3 3 97\n",
278 | "4 4 4 96\n",
279 | ".. ... ... ...\n",
280 | "95 95 95 5\n",
281 | "96 96 96 4\n",
282 | "97 97 97 3\n",
283 | "98 98 98 2\n",
284 | "99 99 99 1\n",
285 | "\n",
286 | "[100 rows x 3 columns]"
287 | ]
288 | },
289 | "execution_count": 1,
290 | "metadata": {},
291 | "output_type": "execute_result"
292 | }
293 | ],
294 | "source": [
295 | "df = pd.DataFrame(data)\n",
296 | "df"
297 | ]
298 | },
299 | {
300 | "cell_type": "code",
301 | "execution_count": 6,
302 | "id": "52cb3810",
303 | "metadata": {
304 | "execution": {
305 | "iopub.execute_input": "2021-04-12T04:33:45.582671Z",
306 | "iopub.status.busy": "2021-04-12T04:33:45.581684Z",
307 | "iopub.status.idle": "2021-04-12T04:33:45.730438Z",
308 | "shell.execute_reply": "2021-04-12T04:33:45.731204Z"
309 | }
310 | },
311 | "outputs": [
312 | {
313 | "data": {
314 | "image/png": "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\n",
315 | "text/plain": [
316 | ""
317 | ]
318 | },
319 | "execution_count": 1,
320 | "metadata": {},
321 | "output_type": "execute_result"
322 | },
323 | {
324 | "data": {
325 | "image/png": "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\n",
326 | "text/plain": [
327 | ""
328 | ]
329 | },
330 | "metadata": {
331 | "needs_background": "light"
332 | },
333 | "output_type": "display_data"
334 | }
335 | ],
336 | "source": [
337 | "fig, axs = plt.subplots(figsize=(12, 4))\n",
338 | "df.plot(ax=axs)\n",
339 | "fig"
340 | ]
341 | },
342 | {
343 | "cell_type": "code",
344 | "execution_count": null,
345 | "id": "6c78918c",
346 | "metadata": {},
347 | "outputs": [],
348 | "source": []
349 | },
350 | {
351 | "cell_type": "markdown",
352 | "id": "86e3869a",
353 | "metadata": {
354 | "lines_to_next_cell": 2
355 | },
356 | "source": [
357 | "## Advanced Features"
358 | ]
359 | },
360 | {
361 | "cell_type": "markdown",
362 | "id": "deb4f8f7",
363 | "metadata": {},
364 | "source": [
365 | "By default, the notebook is rerun on save to ensure\n",
366 | "consistency."
367 | ]
368 | },
369 | {
370 | "cell_type": "code",
371 | "execution_count": 7,
372 | "id": "99bbb423",
373 | "metadata": {
374 | "execution": {
375 | "iopub.execute_input": "2021-04-12T04:33:45.735616Z",
376 | "iopub.status.busy": "2021-04-12T04:33:45.734721Z",
377 | "iopub.status.idle": "2021-04-12T04:33:45.737902Z",
378 | "shell.execute_reply": "2021-04-12T04:33:45.738651Z"
379 | }
380 | },
381 | "outputs": [
382 | {
383 | "data": {
384 | "text/plain": [
385 | "20"
386 | ]
387 | },
388 | "execution_count": 1,
389 | "metadata": {},
390 | "output_type": "execute_result"
391 | }
392 | ],
393 | "source": [
394 | "def simple_function(x):\n",
395 | " return x + 10\n",
396 | "y = simple_function(10)\n",
397 | "y"
398 | ]
399 | },
400 | {
401 | "cell_type": "markdown",
402 | "id": "73b6ac06",
403 | "metadata": {},
404 | "source": [
405 | "Slower functions such as functions are loading data\n",
406 | "can be cached during development."
407 | ]
408 | },
409 | {
410 | "cell_type": "code",
411 | "execution_count": 8,
412 | "id": "95430398",
413 | "metadata": {
414 | "execution": {
415 | "iopub.execute_input": "2021-04-12T04:33:45.744997Z",
416 | "iopub.status.busy": "2021-04-12T04:33:45.744062Z",
417 | "iopub.status.idle": "2021-04-12T04:33:46.749314Z",
418 | "shell.execute_reply": "2021-04-12T04:33:46.750068Z"
419 | },
420 | "lines_to_next_cell": 2
421 | },
422 | "outputs": [],
423 | "source": [
424 | "def slow_function():\n",
425 | " for i in range(10):\n",
426 | " time.sleep(0.1)\n",
427 | " return None\n",
428 | "slow_function()"
429 | ]
430 | },
431 | {
432 | "cell_type": "markdown",
433 | "id": "06e49c4b",
434 | "metadata": {},
435 | "source": [
436 | "This uses streamlit caching behind the scenes. It will\n",
437 | "run if the arguments or the body of the function change."
438 | ]
439 | },
440 | {
441 | "cell_type": "markdown",
442 | "id": "082b8a9f",
443 | "metadata": {
444 | "lines_to_next_cell": 2
445 | },
446 | "source": [
447 | "See https://docs.streamlit.io/en/stable/caching.html"
448 | ]
449 | },
450 | {
451 | "cell_type": "markdown",
452 | "id": "60b5178c",
453 | "metadata": {},
454 | "source": [
455 | "## Longer example"
456 | ]
457 | },
458 | {
459 | "cell_type": "code",
460 | "execution_count": 9,
461 | "id": "3738c31b",
462 | "metadata": {
463 | "execution": {
464 | "iopub.execute_input": "2021-04-12T04:33:46.758806Z",
465 | "iopub.status.busy": "2021-04-12T04:33:46.757882Z",
466 | "iopub.status.idle": "2021-04-12T04:33:46.760737Z",
467 | "shell.execute_reply": "2021-04-12T04:33:46.761483Z"
468 | }
469 | },
470 | "outputs": [],
471 | "source": [
472 | "def lorenz(x, y, z, s=10, r=28, b=2.667):\n",
473 | " \"\"\"\n",
474 | " Given:\n",
475 | " x, y, z: a point of interest in three dimensional space\n",
476 | " s, r, b: parameters defining the lorenz attractor\n",
477 | " Returns:\n",
478 | " x_dot, y_dot, z_dot: values of the lorenz attractor's partial\n",
479 | " derivatives at the point x, y, z\n",
480 | " \"\"\"\n",
481 | " x_dot = s*(y - x)\n",
482 | " y_dot = r*x - y - x*z\n",
483 | " z_dot = x*y - b*z\n",
484 | " return x_dot, y_dot, z_dot"
485 | ]
486 | },
487 | {
488 | "cell_type": "code",
489 | "execution_count": 10,
490 | "id": "c72bef7e",
491 | "metadata": {
492 | "execution": {
493 | "iopub.execute_input": "2021-04-12T04:33:46.767674Z",
494 | "iopub.status.busy": "2021-04-12T04:33:46.766739Z",
495 | "iopub.status.idle": "2021-04-12T04:33:46.769284Z",
496 | "shell.execute_reply": "2021-04-12T04:33:46.770054Z"
497 | },
498 | "lines_to_next_cell": 1
499 | },
500 | "outputs": [],
501 | "source": [
502 | "dt = 0.01\n",
503 | "num_steps = 20000"
504 | ]
505 | },
506 | {
507 | "cell_type": "code",
508 | "execution_count": 11,
509 | "id": "78f452bd",
510 | "metadata": {
511 | "execution": {
512 | "iopub.execute_input": "2021-04-12T04:33:46.825815Z",
513 | "iopub.status.busy": "2021-04-12T04:33:46.810439Z",
514 | "iopub.status.idle": "2021-04-12T04:33:46.828497Z",
515 | "shell.execute_reply": "2021-04-12T04:33:46.828789Z"
516 | }
517 | },
518 | "outputs": [],
519 | "source": [
520 | "def calc_curve(dt, num_steps):\n",
521 | " # Need one more for the initial values\n",
522 | " xs = np.empty(num_steps + 1)\n",
523 | " ys = np.empty(num_steps + 1)\n",
524 | " zs = np.empty(num_steps + 1)\n",
525 | "\n",
526 | " # Set initial values\n",
527 | " xs[0], ys[0], zs[0] = (0., 1., 1.05)\n",
528 | "\n",
529 | " # Step through \"time\", calculating the partial derivatives at the\n",
530 | " # current point and using them to estimate the next point\n",
531 | " for i in range(num_steps):\n",
532 | " x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])\n",
533 | " xs[i + 1] = xs[i] + (x_dot * dt)\n",
534 | " ys[i + 1] = ys[i] + (y_dot * dt)\n",
535 | " zs[i + 1] = zs[i] + (z_dot * dt)\n",
536 | " return xs, ys, zs\n",
537 | "xs, ys, zs = calc_curve(dt, num_steps)"
538 | ]
539 | },
540 | {
541 | "cell_type": "code",
542 | "execution_count": 12,
543 | "id": "11c450b8",
544 | "metadata": {
545 | "execution": {
546 | "iopub.execute_input": "2021-04-12T04:33:46.853505Z",
547 | "iopub.status.busy": "2021-04-12T04:33:46.844625Z",
548 | "iopub.status.idle": "2021-04-12T04:33:47.037298Z",
549 | "shell.execute_reply": "2021-04-12T04:33:47.037661Z"
550 | },
551 | "lines_to_next_cell": 2
552 | },
553 | "outputs": [
554 | {
555 | "data": {
556 | "image/png": "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c+utt1JQUMC99947a6Te3NzM+eefL5FEcXHxVOXWwSJMEicTbDYbW7du5cUXX2Tfvn2sW7eOiy++mJUrVzIwMDCpz0Qo8NmolZWVzXhuwWc539vby+Dg4ISS62CG5sw2fMfb1NTE0NAQqampkuIzGKLweDzcfvvtpKSkcN99982q2GskSfgrKUOUWweLMEmcrHA4HPz3v/9l8+bN7Ny5k1WrVrFp0ybWrVvH0NAQPT09k16A48En957JDsrxMFJy7V95cLvd0x6aM1Noa2ujv7+fRYsWMTg4GLQ3hsfj4c477yQyMpIHHnhg1tWgE5EEhCS3DhZhkvg8wOVysW3bNl588UV27NjB0qVL2bRpE6eddppUefCV/lJTU9FqteOerK2trfT19R3XBikf/CsPOp0Ou91OVlYW+fn5J0SL4UNbW5v0mYxUnU7kjeHxeLjnnnvweDz86U9/Oi5y8fByIxBhkhgDbrebHTt28NJLL/Hhhx+yYMECLrroIs444wypqWusjlWfrNxn/X8i+x9sNhsHDhwgJycHm80maTGmI2efKsYjiLHg32X7m9/8BlEUiY6O5j//+c9x+zxHksQ05NbBIkwSn2d4PB527drF5s2bJU+Miy++mDPPPBOPxyMZ/UZFReF0OtFoNCe0DwPGH5pjsVik0upk6tSZQnt7u9R2HspFLooi//d//8eBAweIjo6mt7eX7du3z3o0dNVVV/HRRx/R19dHamoq9957LxdddNFU5dbBIkwS/yvweDzs379f8sTIzc1l06ZNnHrqqbz00kusXLkSt9stTRVLTk4+7iF+sENzRpYq/dvcZwo+ggh1ypjPSqCuro6nn34ahUKBw+E4YRPbjwO+mCRx11138frrrxMREUFhYSFPPvmkdFf79a9/zeOPP45cLufhhx/m7LPPnupuThh8qsVnn32WJ554gtLSUi6//HLOPfdcVCoVPT09AXLr42F959NjhDpAaKSblU9sNp1ZGu3t7ZI/RqgE8cc//pEDBw7w3HPPHRe7wJMAX0ySeO+99zj99NNRKBT88Ic/BOD++++npqaGq666it27d9PZ2cnGjRs5evToCTGbnQlcccUVXHjhhSxZsoTNmzfzxhtvEB8fz4UXXsgFF1yARqORkoi+MYQpKSkzflf02e+VlpZOKxpwuVz09/dL2hGtVktqampQWgwfOjo6pAlfoRLEI488wo4dO3jhhRdmNXJ45513uOOOO3C73dx0003cfffds7avIPDFJAl/bNmyhc2bN/Pss8/y61//GoB77rkHgLPPPpuf//znrF69eiZ2ddxhs9kC1vS+4TGbN2/m9ddfR61WS54YvoYunU6HTCabsf6MkUNzZgoej0dSpwZbCp4OQTz++OO8++67vPzyy7PiH+qD2+1m7ty5bN26laysLMrLy/n3v//N/Pnzp73dKd7sTmqSOC7p4ieeeELyGuzo6AiQBGdlZdHR0XE8DmNWMPICFwSBOXPmcM899/DJJ5/wxBNP4PF4uP7667n44ot54403SE9PZ/78+YiiSFVVFXv27KGlpQWr1Rry/vV6PbW1tSxevHhGCQK8blbJycksWLCAlStXkpqaik6nY9euXVRVVUn5DB+mShAA//znP3nzzTfZvHnzrBIEwO7duykqKqKgoICIiAiuvPJKXn311Wlt00cQBoOBxx9/HIvFMkNHe+Ixrazaxo0b6e7uHvX4r371KzZt2iT9X6FQcM0110xnV59LCIJAXl4ed955J9/73vckT4yvf/3r2O12KcJIT0+nr69PmgXqa3GfrKHLZ+m2ZMmSWb+wRtrf+cRQjY2NaDQalEolFouFJUuWhEwQzz77rBR5zTTRjYWxblS7du2a8vZEUUQul2MymSRtzYlw9ZotTIsk3n///Qmff+qpp3jjjTf44IMPpPVsZmYmbW1t0ms+L0NTpwtBEMjMzOT222/ntttuo6enhy1btvCd73yHgYEBzjvvPMkTo6+vjyNHjuBwOKSqw8hEpM+fcsmSJcc96y8IAnFxccTFxVFUVERTUxOdnZ0olUoqKytDyru8+OKLPPPMM7z55pufywuroqKCxYsXA/DTn/6UtWvXcu+999La2sq7775LSUkJa9asOaGameli1upz77zzDr/97W/Ztm1bwJd/4YUXcvXVV0t31rq6upN19NqsQRAE0tLSuPXWW7n11lvp6+vjlVde4Z577kGn03HOOeewadMmFixYQH9/P/X19QFVh6GhIdrb21myZMkJz/53dXVhMBhYvXo1crkcq9VKb28vlZWVkhZjvLbxV155hX/84x+88cYbU5r2PlXM1I1q3759vP322xJJlJSU0NLSwvnnn09+fj4VFRUsWbKEBQsWzHRr+XHFrCUui4qKsNvtkgvU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\n",
557 | "text/plain": [
558 | ""
559 | ]
560 | },
561 | "execution_count": 1,
562 | "metadata": {},
563 | "output_type": "execute_result"
564 | },
565 | {
566 | "data": {
567 | "image/png": "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c+utt1JQUMC99947a6Te3NzM+eefL5FEcXHxVOXWwSJMEicTbDYbW7du5cUXX2Tfvn2sW7eOiy++mJUrVzIwMDCpz0Qo8NmolZWVzXhuwWc539vby+Dg4ISS62CG5sw2fMfb1NTE0NAQqampkuIzGKLweDzcfvvtpKSkcN99982q2GskSfgrKUOUWweLMEmcrHA4HPz3v/9l8+bN7Ny5k1WrVrFp0ybWrVvH0NAQPT09k16A48En957JDsrxMFJy7V95cLvd0x6aM1Noa2ujv7+fRYsWMTg4GLQ3hsfj4c477yQyMpIHHnhg1tWgE5EEhCS3DhZhkvg8wOVysW3bNl588UV27NjB0qVL2bRpE6eddppUefCV/lJTU9FqteOerK2trfT19R3XBikf/CsPOp0Ou91OVlYW+fn5J0SL4UNbW5v0mYxUnU7kjeHxeLjnnnvweDz86U9/Oi5y8fByIxBhkhgDbrebHTt28NJLL/Hhhx+yYMECLrroIs444wypqWusjlWfrNxn/X8i+x9sNhsHDhwgJycHm80maTGmI2efKsYjiLHg32X7m9/8BlEUiY6O5j//+c9x+zxHksQ05NbBIkwSn2d4PB527drF5s2bJU+Miy++mDPPPBOPxyMZ/UZFReF0OtFoNCe0DwPGH5pjsVik0upk6tSZQnt7u9R2HspFLooi//d//8eBAweIjo6mt7eX7du3z3o0dNVVV/HRRx/R19dHamoq9957LxdddNFU5dbBIkwS/yvweDzs379f8sTIzc1l06ZNnHrqqbz00kusXLkSt9stTRVLTk4+7iF+sENzRpYq/dvcZwo+ggh1ypjPSqCuro6nn34ahUKBw+E4YRPbjwO+mCRx11138frrrxMREUFhYSFPPvmkdFf79a9/zeOPP45cLufhhx/m7LPPnupuThh8qsVnn32WJ554gtLSUi6//HLOPfdcVCoVPT09AXLr42F959NjhDpAaKSblU9sNp1ZGu3t7ZI/RqgE8cc//pEDBw7w3HPPHRe7wJMAX0ySeO+99zj99NNRKBT88Ic/BOD++++npqaGq666it27d9PZ2cnGjRs5evToCTGbnQlcccUVXHjhhSxZsoTNmzfzxhtvEB8fz4UXXsgFF1yARqORkoi+MYQpKSkzflf02e+VlpZOKxpwuVz09/dL2hGtVktqampQWgwfOjo6pAlfoRLEI488wo4dO3jhhRdmNXJ45513uOOOO3C73dx0003cfffds7avIPDFJAl/bNmyhc2bN/Pss8/y61//GoB77rkHgLPPPpuf//znrF69eiZ2ddxhs9kC1vS+4TGbN2/m9ddfR61WS54YvoYunU6HTCabsf6MkUNzZgoej0dSpwZbCp4OQTz++OO8++67vPzyy7PiH+qD2+1m7ty5bN26laysLMrLy/n3v//N/Pnzp73dKd7sTmqSOC7p4ieeeELyGuzo6AiQBGdlZdHR0XE8DmNWMPICFwSBOXPmcM899/DJJ5/wxBNP4PF4uP7667n44ot54403SE9PZ/78+YiiSFVVFXv27KGlpQWr1Rry/vV6PbW1tSxevHhGCQK8blbJycksWLCAlStXkpqaik6nY9euXVRVVUn5DB+mShAA//znP3nzzTfZvHnzrBIEwO7duykqKqKgoICIiAiuvPJKXn311Wlt00cQBoOBxx9/HIvFMkNHe+Ixrazaxo0b6e7uHvX4r371KzZt2iT9X6FQcM0110xnV59LCIJAXl4ed955J9/73vckT4yvf/3r2O12KcJIT0+nr69PmgXqa3GfrKHLZ+m2ZMmSWb+wRtrf+cRQjY2NaDQalEolFouFJUuWhEwQzz77rBR5zTTRjYWxblS7du2a8vZEUUQul2MymSRtzYlw9ZotTIsk3n///Qmff+qpp3jjjTf44IMPpPVsZmYmbW1t0ms+L0NTpwtBEMjMzOT222/ntttuo6enhy1btvCd73yHgYEBzjvvPMkTo6+vjyNHjuBwOKSqw8hEpM+fcsmSJcc96y8IAnFxccTFxVFUVERTUxOdnZ0olUoqKytDyru8+OKLPPPMM7z55pufywuroqKCxYsXA/DTn/6UtWvXcu+999La2sq7775LSUkJa9asOaGameli1upz77zzDr/97W/Ztm1bwJd/4YUXcvXVV0t31rq6upN19NqsQRAE0tLSuPXWW7n11lvp6+vjlVde4Z577kGn03HOOeewadMmFixYQH9/P/X19QFVh6GhIdrb21myZMkJz/53dXVhMBhYvXo1crkcq9VKb28vlZWVkhZjvLbxV155hX/84x+88cYbU5r2PlXM1I1q3759vP322xJJlJSU0NLSwvnnn09+fj4VFRUsWbKEBQsWzHRr+XHFrCUui4qKsNvtkgvU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\n",
568 | "text/plain": [
569 | ""
570 | ]
571 | },
572 | "metadata": {
573 | "needs_background": "light"
574 | },
575 | "output_type": "display_data"
576 | }
577 | ],
578 | "source": [
579 | "# Plot\n",
580 | "fig = plt.figure(figsize=(12, 4))\n",
581 | "ax = fig.add_subplot(projection='3d')\n",
582 | "ax.plot(xs, ys, zs, lw=0.5)\n",
583 | "ax.set_xlabel(\"X Axis\")\n",
584 | "ax.set_ylabel(\"Y Axis\")\n",
585 | "ax.set_zlabel(\"Z Axis\")\n",
586 | "ax.set_title(\"Lorenz Attractor\")\n",
587 | "fig"
588 | ]
589 | },
590 | {
591 | "cell_type": "markdown",
592 | "id": "198ecfc4",
593 | "metadata": {},
594 | "source": [
595 | "## Exporting to Jupyter"
596 | ]
597 | },
598 | {
599 | "cell_type": "markdown",
600 | "id": "de77c8e0",
601 | "metadata": {},
602 | "source": [
603 | "The whole notebook can also be exported as a\n",
604 | "Jupyter notebook."
605 | ]
606 | },
607 | {
608 | "cell_type": "markdown",
609 | "id": "8d451a8a",
610 | "metadata": {},
611 | "source": [
612 | "The command is:\n",
613 | "\n",
614 | "`jupytext --to notebook --execute example.notebook.py`"
615 | ]
616 | },
617 | {
618 | "cell_type": "markdown",
619 | "id": "008e3c95",
620 | "metadata": {},
621 | "source": [
622 | "Some commands are slightly different in streamlit that jupyter."
623 | ]
624 | },
625 | {
626 | "cell_type": "code",
627 | "execution_count": 13,
628 | "id": "be9cbe0c",
629 | "metadata": {
630 | "execution": {
631 | "iopub.execute_input": "2021-04-12T04:33:47.039887Z",
632 | "iopub.status.busy": "2021-04-12T04:33:47.039393Z",
633 | "iopub.status.idle": "2021-04-12T04:33:47.042558Z",
634 | "shell.execute_reply": "2021-04-12T04:33:47.042989Z"
635 | },
636 | "lines_to_next_cell": 2
637 | },
638 | "outputs": [
639 | {
640 | "data": {
641 | "text/html": [
642 | "
"
643 | ],
644 | "text/plain": [
645 | ""
646 | ]
647 | },
648 | "execution_count": 1,
649 | "metadata": {},
650 | "output_type": "execute_result"
651 | }
652 | ],
653 | "source": [
654 | "# Jupyter command\n",
655 | "from IPython.display import HTML\n",
656 | "HTML('
')\n",
657 | "# Streamlit command"
658 | ]
659 | }
660 | ],
661 | "metadata": {
662 | "jupytext": {
663 | "cell_metadata_filter": "-all"
664 | },
665 | "kernelspec": {
666 | "display_name": "myenv",
667 | "language": "python",
668 | "name": "myenv"
669 | },
670 | "language_info": {
671 | "codemirror_mode": {
672 | "name": "ipython",
673 | "version": 3
674 | },
675 | "file_extension": ".py",
676 | "mimetype": "text/x-python",
677 | "name": "python",
678 | "nbconvert_exporter": "python",
679 | "pygments_lexer": "ipython3",
680 | "version": "3.8.5"
681 | }
682 | },
683 | "nbformat": 4,
684 | "nbformat_minor": 5
685 | }
686 |
--------------------------------------------------------------------------------
/example.py:
--------------------------------------------------------------------------------
1 | # # Streambook example
2 |
3 | # Streambook is a setup for writing live-updating notebooks
4 | # in any editor that you might want to use (emacs, vi, notepad).
5 |
6 |
7 |
8 | import numpy as np
9 | import pandas as pd
10 | import matplotlib.pyplot as plt
11 | import time
12 |
13 | # ## Main Code
14 |
15 | # Notebook cells are separated by spaces. Comment cells are rendered
16 | # as markdown.
17 | #
18 | # See https://jupytext.readthedocs.io/en/latest/formats.html#the-light-format
19 |
20 | x = np.array([10, 20, 30])
21 |
22 |
23 | # Cells that end with an explicit variables are printed.
24 | #
25 | # See https://docs.streamlit.io/en/stable/api.html#magic-commands
26 |
27 | x
28 |
29 |
30 | # Dictionaries are pretty-printed using streamlit and can be collapsed
31 |
32 | data = [dict(key1 = i, key2=f"{i}", key3=100 -i) for i in range(100)]
33 |
34 |
35 | # Pandas dataframe also show up in tables.
36 |
37 |
38 | df = pd.DataFrame(data)
39 | df
40 |
41 |
42 |
43 | df.plot()
44 | __st.pyplot()
45 |
46 |
47 | x = "hello"
48 | # Printing
49 | print("Printing", x)
50 | print("Printing2", x)
51 | "Output", x
52 |
53 |
54 | # ## Advanced Features
55 |
56 |
57 | # By default, the notebook is rerun on save to ensure
58 | # consistency.
59 |
60 | def simple_function(x):
61 | return x + 10
62 | y = simple_function(10)
63 | y
64 |
65 |
66 | # Slower functions such as functions are loading data
67 | # can be cached during development.
68 |
69 | @__st.cache()
70 | def slow_function():
71 | for i in range(10):
72 | time.sleep(0.1)
73 | return None
74 | slow_function()
75 |
76 |
77 | # This uses streamlit caching behind the scenes. It will
78 | # run if the arguments or the body of the function change.
79 |
80 | # See https://docs.streamlit.io/en/stable/caching.html
81 |
82 |
83 | # ## Longer example
84 |
85 | def lorenz(x, y, z, s=10, r=28, b=2.667):
86 | """
87 | Given:
88 | x, y, z: a point of interest in three dimensional space
89 | s, r, b: parameters defining the lorenz attractor
90 | Returns:
91 | x_dot, y_dot, z_dot: values of the lorenz attractor's partial
92 | derivatives at the point x, y, z
93 | """
94 | x_dot = s*(y - x)
95 | y_dot = r*x - y - x*z
96 | z_dot = x*y - b*z
97 | return x_dot, y_dot, z_dot
98 |
99 |
100 | dt = 0.01
101 | num_steps = 20000
102 |
103 | def calc_curve(dt, num_steps):
104 | # Need one more for the initial values
105 | xs = np.empty(num_steps + 1)
106 | ys = np.empty(num_steps + 1)
107 | zs = np.empty(num_steps + 1)
108 |
109 | # Set initial values
110 | xs[0], ys[0], zs[0] = (0., 1., 1.05)
111 |
112 | # Step through "time", calculating the partial derivatives at the
113 | # current point and using them to estimate the next point
114 | for i in range(num_steps):
115 | x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
116 | xs[i + 1] = xs[i] + (x_dot * dt)
117 | ys[i + 1] = ys[i] + (y_dot * dt)
118 | zs[i + 1] = zs[i] + (z_dot * dt)
119 | return xs, ys, zs
120 | xs, ys, zs = calc_curve(dt, num_steps)
121 |
122 | # Plot file
123 | fig = plt.figure(figsize=(12, 4))
124 | ax = fig.add_subplot(projection='3d')
125 | ax.plot(xs, ys, zs, lw=0.5)
126 | ax.set_xlabel("X Axis")
127 | ax.set_ylabel("Y Axis")
128 | ax.set_zlabel("Z Axis")
129 | ax.set_title("Lorenz Attractor")
130 | fig
131 |
132 |
133 | # ## Exporting to Jupyter
134 |
135 | # The whole notebook can also be exported as a
136 | # Jupyter notebook.
137 |
138 | # The command is:
139 | #
140 | # `streambook convert example.py`
141 |
142 | # Some commands are slightly different in streamlit that jupyter.
143 | # You can include both and all `__st` lines will be stripped out.
144 |
145 | # Jupyter command
146 | from IPython.display import HTML
147 | HTML('
')
148 | # Streamlit command
149 | __st.image("example.gif")
150 |
151 |
--------------------------------------------------------------------------------
/example.streambook.py:
--------------------------------------------------------------------------------
1 |
2 | import streamlit as __st
3 | import streambook
4 | __toc = streambook.TOCSidebar()
5 | __toc._add(streambook.H1('Streambook example'))
6 | __toc._add(streambook.H2('Main Code'))
7 | __toc._add(streambook.H2('Advanced Features'))
8 | __toc._add(streambook.H2('Longer example'))
9 | __toc._add(streambook.H2('Exporting to Jupyter'))
10 |
11 | __toc.generate()
12 | __st.markdown(r"""
13 | # Streambook example""", unsafe_allow_html=True)
14 | __st.markdown(r"""Streambook is a setup for writing live-updating notebooks
15 | in any editor that you might want to use (emacs, vi, notepad).""", unsafe_allow_html=True)
16 | with __st.echo(), streambook.st_stdout('info'):
17 | import numpy as np
18 | import pandas as pd
19 | import matplotlib.pyplot as plt
20 | import time
21 | __st.markdown(r"""
22 | ## Main Code""", unsafe_allow_html=True)
23 | __st.markdown(r"""Notebook cells are separated by spaces. Comment cells are rendered
24 | as markdown.
25 |
26 | See https://jupytext.readthedocs.io/en/latest/formats.html#the-light-format""", unsafe_allow_html=True)
27 | with __st.echo(), streambook.st_stdout('info'):
28 | x = np.array([10, 20, 30])
29 | __st.markdown(r"""Cells that end with an explicit variables are printed.
30 |
31 | See https://docs.streamlit.io/en/stable/api.html#magic-commands""", unsafe_allow_html=True)
32 | with __st.echo(), streambook.st_stdout('info'):
33 | x
34 | __st.markdown(r"""Dictionaries are pretty-printed using streamlit and can be collapsed""", unsafe_allow_html=True)
35 | with __st.echo(), streambook.st_stdout('info'):
36 | data = [dict(key1 = i, key2=f"{i}", key3=100 -i) for i in range(100)]
37 | __st.markdown(r"""Pandas dataframe also show up in tables. """, unsafe_allow_html=True)
38 | with __st.echo(), streambook.st_stdout('info'):
39 | df = pd.DataFrame(data)
40 | df
41 | with __st.echo(), streambook.st_stdout('info'):
42 | df.plot()
43 | __st.pyplot()
44 | with __st.echo(), streambook.st_stdout('info'):
45 | x = "hello"
46 | # Printing
47 | print("Printing", x)
48 | print("Printing2", x)
49 | "Output", x
50 | __st.markdown(r"""
51 | ## Advanced Features""", unsafe_allow_html=True)
52 | __st.markdown(r"""By default, the notebook is rerun on save to ensure
53 | consistency.""", unsafe_allow_html=True)
54 | with __st.echo(), streambook.st_stdout('info'):
55 | def simple_function(x):
56 | return x + 10
57 | y = simple_function(10)
58 | y
59 | __st.markdown(r"""Slower functions such as functions are loading data
60 | can be cached during development.""", unsafe_allow_html=True)
61 | with __st.echo(), streambook.st_stdout('info'):
62 | @__st.cache()
63 | def slow_function():
64 | for i in range(10):
65 | time.sleep(0.1)
66 | return None
67 | slow_function()
68 | __st.markdown(r"""This uses streamlit caching behind the scenes. It will
69 | run if the arguments or the body of the function change.""", unsafe_allow_html=True)
70 | __st.markdown(r"""See https://docs.streamlit.io/en/stable/caching.html""", unsafe_allow_html=True)
71 | __st.markdown(r"""
72 | ## Longer example""", unsafe_allow_html=True)
73 | with __st.echo(), streambook.st_stdout('info'):
74 | def lorenz(x, y, z, s=10, r=28, b=2.667):
75 | """
76 | Given:
77 | x, y, z: a point of interest in three dimensional space
78 | s, r, b: parameters defining the lorenz attractor
79 | Returns:
80 | x_dot, y_dot, z_dot: values of the lorenz attractor's partial
81 | derivatives at the point x, y, z
82 | """
83 | x_dot = s*(y - x)
84 | y_dot = r*x - y - x*z
85 | z_dot = x*y - b*z
86 | return x_dot, y_dot, z_dot
87 | with __st.echo(), streambook.st_stdout('info'):
88 | dt = 0.01
89 | num_steps = 20000
90 | with __st.echo(), streambook.st_stdout('info'):
91 | def calc_curve(dt, num_steps):
92 | # Need one more for the initial values
93 | xs = np.empty(num_steps + 1)
94 | ys = np.empty(num_steps + 1)
95 | zs = np.empty(num_steps + 1)
96 |
97 | # Set initial values
98 | xs[0], ys[0], zs[0] = (0., 1., 1.05)
99 |
100 | # Step through "time", calculating the partial derivatives at the
101 | # current point and using them to estimate the next point
102 | for i in range(num_steps):
103 | x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
104 | xs[i + 1] = xs[i] + (x_dot * dt)
105 | ys[i + 1] = ys[i] + (y_dot * dt)
106 | zs[i + 1] = zs[i] + (z_dot * dt)
107 | return xs, ys, zs
108 | xs, ys, zs = calc_curve(dt, num_steps)
109 | with __st.echo(), streambook.st_stdout('info'):
110 | # Plot file
111 | fig = plt.figure(figsize=(12, 4))
112 | ax = fig.add_subplot(projection='3d')
113 | ax.plot(xs, ys, zs, lw=0.5)
114 | ax.set_xlabel("X Axis")
115 | ax.set_ylabel("Y Axis")
116 | ax.set_zlabel("Z Axis")
117 | ax.set_title("Lorenz Attractor")
118 | fig
119 | __st.markdown(r"""
120 | ## Exporting to Jupyter""", unsafe_allow_html=True)
121 | __st.markdown(r"""The whole notebook can also be exported as a
122 | Jupyter notebook.""", unsafe_allow_html=True)
123 | __st.markdown(r"""The command is:
124 |
125 | `streambook convert example.py`""", unsafe_allow_html=True)
126 | __st.markdown(r"""Some commands are slightly different in streamlit that jupyter.
127 | You can include both and all `__st` lines will be stripped out.""", unsafe_allow_html=True)
128 | with __st.echo(), streambook.st_stdout('info'):
129 | # Jupyter command
130 | from IPython.display import HTML
131 | HTML('
')
132 | # Streamlit command
133 | __st.image("example.gif")
134 |
135 |
--------------------------------------------------------------------------------
/notebook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/srush/streambook/120311b7e87e525557719cfe2a943d24a1c59e2a/notebook.png
--------------------------------------------------------------------------------
/output.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/srush/streambook/120311b7e87e525557719cfe2a943d24a1c59e2a/output.gif
--------------------------------------------------------------------------------
/requirements.dev.txt:
--------------------------------------------------------------------------------
1 | pytest == 6.0.1
2 | flake8==3.8.3
3 | pep8-naming==0.11.1
4 |
--------------------------------------------------------------------------------
/requirements.example.txt:
--------------------------------------------------------------------------------
1 | pandas
2 | matplotlib
3 | jupyter
4 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | streamlit==1.3
2 | jupytext
3 | watchdog
4 | in_place
5 | mistune==0.8.4
6 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | from setuptools import setup
2 |
3 | with open("README.md", "r", encoding="utf-8") as fh:
4 | long_description = fh.read()
5 |
6 | setup(
7 | name="streambook",
8 | author="Alexander Rush",
9 | author_email="arush@cornell.edu",
10 | version="0.3",
11 | packages=["streambook"],
12 | long_description=long_description,
13 | long_description_content_type="text/markdown",
14 | package_data={"streambook": []},
15 | setup_requires=["pytest-runner"],
16 | install_requires=["streamlit", "jupytext", "watchdog", "in_place", "mistune", "typer"],
17 | tests_require=["pytest"],
18 | python_requires=">=3.6",
19 | entry_points={
20 | "console_scripts": [
21 | "streambook = streambook.cli:app",
22 | ],
23 | },
24 | )
25 |
--------------------------------------------------------------------------------
/streambook.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/srush/streambook/120311b7e87e525557719cfe2a943d24a1c59e2a/streambook.png
--------------------------------------------------------------------------------
/streambook/__init__.py:
--------------------------------------------------------------------------------
1 | from .lib import * # noqa: F401,F403
2 | from .gen import * # noqa: F401,F403
3 |
--------------------------------------------------------------------------------
/streambook/__main__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/srush/streambook/120311b7e87e525557719cfe2a943d24a1c59e2a/streambook/__main__.py
--------------------------------------------------------------------------------
/streambook/cli.py:
--------------------------------------------------------------------------------
1 | import subprocess
2 | import time
3 | from pathlib import Path
4 | import os
5 |
6 | import in_place
7 | import typer
8 | from watchdog.events import FileSystemEventHandler
9 | from watchdog.observers import Observer
10 |
11 | from streambook.gen import Generator
12 |
13 | app = typer.Typer()
14 |
15 |
16 | class MyHandler(FileSystemEventHandler):
17 | def __init__(
18 | self,
19 | abs_path: str,
20 | stream_file: str,
21 | notebook_file: str,
22 | jupytext_command: str,
23 | generator: Generator,
24 | quiet: bool,
25 | ):
26 | self.abs_path = abs_path
27 | self.stream_file = stream_file
28 | self.notebook_file = notebook_file
29 | self.jupytext_command = jupytext_command
30 | self.generator = generator
31 | self.quiet = quiet
32 | super().__init__()
33 |
34 | def on_modified(self, event):
35 | if event is None or event.src_path == self.abs_path:
36 | if not self.quiet:
37 | print(f"Regenerating from {self.abs_path}...")
38 | with in_place.InPlace(self.stream_file) as out:
39 | self.generator.generate(self.abs_path, out)
40 | with open(self.notebook_file, "w") as out:
41 | for line in open(self.abs_path, "r"):
42 | if "__st" not in line:
43 | out.write(line)
44 | if self.jupytext_command is not None:
45 | os.system(self.jupytext_command)
46 |
47 |
48 | def file_paths(file: Path):
49 | abs_path = file.resolve()
50 | directory = str(abs_path.parent)
51 | abs_path = str(abs_path)
52 |
53 | ipynb_file = abs_path[:-3] + ".ipynb"
54 | stream_file = abs_path[:-3] + ".streambook.py"
55 | notebook_file = abs_path[:-3] + ".notebook.py"
56 | return abs_path, directory, stream_file, notebook_file, ipynb_file
57 |
58 |
59 | def main(
60 | file: Path,
61 | watch: bool,
62 | streamlit: bool,
63 | quiet: bool,
64 | jupyter: bool = False,
65 | port: int = None,
66 | sections: str = None,
67 | ):
68 | abs_path, directory, stream_file, notebook_file, ipynb_file = file_paths(file)
69 | jupytext_command = (
70 | f"jupytext --to notebook --execute {notebook_file} -o {ipynb_file}"
71 | )
72 | event_handler = MyHandler(
73 | abs_path=abs_path,
74 | stream_file=stream_file,
75 | notebook_file=notebook_file,
76 | jupytext_command=jupytext_command if jupyter else None,
77 | generator=Generator(sections),
78 | quiet=quiet,
79 | )
80 | observer = Observer()
81 | open(stream_file, "w").close()
82 |
83 | view_command = ["streamlit", "run", "--server.runOnSave", "true"]
84 | if port is not None:
85 | view_command += ["--server.port", str(port)]
86 | view_command += [stream_file]
87 |
88 | if not quiet:
89 | if watch:
90 | print("Streambook Daemon\n")
91 | print("Watching directory for changes:")
92 | print(f"\n {directory}")
93 | print()
94 |
95 | print("View Command")
96 | print(" ".join(view_command))
97 | print()
98 | if jupyter:
99 | print("Jupyter Daemon\n")
100 | print(jupytext_command)
101 |
102 | event_handler.on_modified(None)
103 |
104 | if watch:
105 | observer.schedule(event_handler, path=directory, recursive=False)
106 | observer.start()
107 |
108 | if streamlit:
109 | print()
110 | print("Starting Streamlit")
111 | subprocess.run(
112 | view_command, capture_output=True,
113 | )
114 |
115 | try:
116 | while True:
117 | time.sleep(1)
118 | except KeyboardInterrupt:
119 | observer.stop()
120 | observer.join()
121 |
122 |
123 | @app.command()
124 | def convert(file: Path = typer.Argument(..., help="file to convert")):
125 | abs_path, directory, stream_file, notebook_file, ipynb_file = file_paths(file)
126 | command = f"jupytext --to notebook --execute {notebook_file} -o {ipynb_file} "
127 | os.system(command)
128 |
129 |
130 | @app.command()
131 | def run(
132 | file: Path = typer.Argument(..., help="file to run"),
133 | streamlit: bool = typer.Option(True, help="Lauches streamlit"),
134 | jupyter: bool = typer.Option(False, help="Compiles ipynb file"),
135 | quiet: bool = typer.Option(False, help="Don't print anything"),
136 | port: int = typer.Option(None, help="Port to launch streamlit on."),
137 | sections: str = typer.Option(None, help="Regex to filter sections."),
138 | ):
139 | """
140 | Starts the watcher and streamlit services.
141 | """
142 | main(
143 | file,
144 | watch=True,
145 | streamlit=streamlit,
146 | jupyter=jupyter,
147 | quiet=quiet,
148 | port=port,
149 | sections=sections,
150 | )
151 |
152 |
153 | @app.command()
154 | def export(
155 | file: Path = typer.Argument(..., help="file to run"),
156 | quiet: bool = typer.Option(False, help="Don't print anything"),
157 | ):
158 | """
159 | Only creates the '*.streambook.py' file.
160 | """
161 | main(file, watch=False, streamlit=False, quiet=quiet)
162 |
163 |
164 | if __name__ == "__main__":
165 | app()
166 |
--------------------------------------------------------------------------------
/streambook/gen.py:
--------------------------------------------------------------------------------
1 | import jupytext
2 | import textwrap
3 | import mistune
4 | import re
5 | import io
6 |
7 |
8 | class Collect(mistune.Renderer):
9 | def __init__(self):
10 | super().__init__()
11 | self.headers = []
12 |
13 | def header(self, text, level, raw=None):
14 | self.headers.append((text, level - 1))
15 | return ""
16 |
17 |
18 | class Generate:
19 | def __init__(self, out_stream, section_filter=None):
20 | self.out_stream = out_stream
21 | self.all_markdown = ""
22 | self.headers = []
23 | self.current_section = [None, None, None]
24 | self.section_filter = section_filter
25 |
26 | def gen(self, output):
27 | print(output, file=self.out_stream)
28 |
29 | def markdown(self, source):
30 | # Collect all the markdown headers
31 | c = Collect()
32 |
33 | markdown = mistune.Markdown(renderer=c)
34 | markdown(source)
35 | self.headers += c.headers
36 | head = ""
37 | for text, _ in c.headers:
38 | head += f" "
39 | for text, level in c.headers:
40 | self.current_section[level] = text
41 | self.all_markdown += source + "\n"
42 | if self.section_filter is not None and self.current_section[1] is not None:
43 | if not re.search(self.section_filter, self.current_section[1]):
44 | return
45 | if head:
46 | self.gen(
47 | '__st.markdown(r"""%s\n%s""", unsafe_allow_html=True)' % (head, source)
48 | )
49 | else:
50 | self.gen('__st.markdown(r"""%s""", unsafe_allow_html=True)' % (source))
51 |
52 | def code(self, source):
53 | if self.section_filter is not None and self.current_section[1] is not None:
54 | if not re.search(self.section_filter, self.current_section[1]):
55 | return
56 | wrapper = textwrap.TextWrapper(
57 | initial_indent=" ", subsequent_indent=" ", width=5000
58 | )
59 | if not source.strip():
60 | return
61 | self.gen("with __st.echo(), streambook.st_stdout('info'):")
62 | for line in source.splitlines():
63 | self.gen(wrapper.fill(line))
64 |
65 |
66 | header = """
67 | import streamlit as __st
68 | import streambook
69 | __toc = streambook.TOCSidebar()"""
70 |
71 | footer = """
72 | __toc.generate()"""
73 |
74 |
75 | class Generator:
76 | def __init__(self, section_filter=None):
77 | self.section_filter = section_filter
78 |
79 | def generate(self, in_file, out_stream):
80 | out = io.StringIO()
81 | gen = Generate(out, section_filter=self.section_filter)
82 |
83 | print(header, file=out_stream)
84 |
85 | for i, cell in enumerate(jupytext.read(in_file)["cells"]):
86 | if cell["cell_type"] == "markdown":
87 | gen.markdown(cell["source"])
88 | else:
89 | gen.code(cell["source"])
90 | levels = ["streambook.H1", "streambook.H2", "streambook.H3"]
91 | print(
92 | "\n".join(
93 | [
94 | "__toc._add(" + levels[level] + "('" + text + "'))"
95 | for text, level in gen.headers
96 | ]
97 | ),
98 | file=out_stream,
99 | )
100 | print(footer, file=out_stream)
101 | print(out.getvalue(), file=out_stream)
102 |
103 |
104 | if __name__ == "__main__":
105 | import argparse
106 | import os
107 | import sys
108 |
109 | parser = argparse.ArgumentParser(description="Stream book options.")
110 | parser.add_argument("file", help="file to run", type=os.path.abspath)
111 | args = parser.parse_args()
112 | Generator().generate(args.file, sys.stdout)
113 |
--------------------------------------------------------------------------------
/streambook/lib.py:
--------------------------------------------------------------------------------
1 | import streamlit as st
2 | from contextlib import contextmanager
3 | from io import StringIO
4 | from streamlit.report_thread import REPORT_CONTEXT_ATTR_NAME
5 | from threading import current_thread
6 | import sys
7 |
8 | st.set_option("deprecation.showPyplotGlobalUse", False)
9 |
10 |
11 | @contextmanager
12 | def st_redirect(src, dst):
13 | placeholder = st.empty()
14 | output_func = getattr(placeholder, dst)
15 |
16 | with StringIO() as buffer:
17 | old_write = src.write
18 |
19 | def new_write(b):
20 | if getattr(current_thread(), REPORT_CONTEXT_ATTR_NAME, None):
21 | buffer.write(b.replace("\n", "\n\n"))
22 | output_func(buffer.getvalue())
23 | else:
24 | old_write(b)
25 |
26 | try:
27 | src.write = new_write
28 | yield
29 | finally:
30 | src.write = old_write
31 |
32 |
33 | @contextmanager
34 | def st_stdout(dst):
35 | with st_redirect(sys.stdout, dst):
36 | yield
37 |
38 |
39 | @contextmanager
40 | def st_stderr(dst):
41 | with st_redirect(sys.stderr, dst):
42 | yield
43 |
44 |
45 | class Header:
46 | tag: str = ""
47 |
48 | def __init__(self, text: str):
49 | self.text = text
50 |
51 | @property
52 | def id(self):
53 | """Create an identifcator from text."""
54 | return "-".join(self.text.split()).lower()
55 |
56 | @property
57 | def anchor(self):
58 | """Provide html text for anchored header. Example:
59 | Abc Def
60 | """
61 | return f"<{self.tag} id='{self.id}'>{self.text}{self.tag}>"
62 |
63 | def toc_item(self) -> str:
64 | """Make markdown item for TOC listing. Example:
65 | ' - Abc'
66 | """
67 | return f"{self.spaces}- {self.text}"
68 |
69 | @property
70 | def spaces(self):
71 | return dict(h1="", h2=" " * 2, h3=" " * 4).get(self.tag)
72 |
73 |
74 | class H1(Header):
75 | tag = "h1"
76 |
77 |
78 | class H2(Header):
79 | tag = "h2"
80 |
81 |
82 | class H3(Header):
83 | tag = "h3"
84 |
85 |
86 | class TOC:
87 | """
88 | Original code, used with modifications:
89 | https://discuss.streamlit.io/t/table-of-contents-widget/3470/8?u=epogrebnyak
90 | """
91 |
92 | def __init__(self):
93 | self._headers = []
94 | self._placeholder = st.empty()
95 |
96 | def title(self, text):
97 | self._add(H1(text))
98 |
99 | def header(self, text):
100 | self._add(H2(text))
101 |
102 | def subheader(self, text):
103 | self._add(H3(text))
104 |
105 | def generate(self):
106 | text = "\n".join([h.toc_item() for h in self._headers])
107 | self._placeholder.markdown(text, unsafe_allow_html=True)
108 |
109 | def _add(self, header):
110 | self._headers.append(header)
111 |
112 |
113 | class TOCSidebar(TOC):
114 | def __init__(self):
115 | self._headers = []
116 | self._placeholder = st.sidebar.empty()
117 |
--------------------------------------------------------------------------------
/tests/example.streambook.main.tmp:
--------------------------------------------------------------------------------
1 |
2 | import streamlit as __st
3 | import streambook
4 | __toc = streambook.TOCSidebar()
5 | __toc._add(streambook.H1('Streambook example'))
6 | __toc._add(streambook.H2('Main Code'))
7 | __toc._add(streambook.H2('Advanced Features'))
8 | __toc._add(streambook.H2('Longer example'))
9 | __toc._add(streambook.H2('Exporting to Jupyter'))
10 |
11 | __toc.generate()
12 | __st.markdown(r"""
13 | # Streambook example""", unsafe_allow_html=True)
14 | __st.markdown(r"""Streambook is a setup for writing live-updating notebooks
15 | in any editor that you might want to use (emacs, vi, notepad).""", unsafe_allow_html=True)
16 | with __st.echo(), streambook.st_stdout('info'):
17 | import numpy as np
18 | import pandas as pd
19 | import matplotlib.pyplot as plt
20 | import time
21 | __st.markdown(r"""
22 | ## Main Code""", unsafe_allow_html=True)
23 | __st.markdown(r"""Notebook cells are separated by spaces. Comment cells are rendered
24 | as markdown.
25 |
26 | See https://jupytext.readthedocs.io/en/latest/formats.html#the-light-format""", unsafe_allow_html=True)
27 | with __st.echo(), streambook.st_stdout('info'):
28 | x = np.array([10, 20, 30])
29 | __st.markdown(r"""Cells that end with an explicit variables are printed.
30 |
31 | See https://docs.streamlit.io/en/stable/api.html#magic-commands""", unsafe_allow_html=True)
32 | with __st.echo(), streambook.st_stdout('info'):
33 | x
34 | __st.markdown(r"""Dictionaries are pretty-printed using streamlit and can be collapsed""", unsafe_allow_html=True)
35 | with __st.echo(), streambook.st_stdout('info'):
36 | data = [dict(key1 = i, key2=f"{i}", key3=100 -i) for i in range(100)]
37 | __st.markdown(r"""Pandas dataframe also show up in tables. """, unsafe_allow_html=True)
38 | with __st.echo(), streambook.st_stdout('info'):
39 | df = pd.DataFrame(data)
40 | df
41 | with __st.echo(), streambook.st_stdout('info'):
42 | df.plot()
43 | __st.pyplot()
44 | with __st.echo(), streambook.st_stdout('info'):
45 | x = "hello"
46 | # Printing
47 | print("Printing", x)
48 | print("Printing2", x)
49 | "Output", x
50 |
51 |
--------------------------------------------------------------------------------
/tests/example.streambook.tmp:
--------------------------------------------------------------------------------
1 |
2 | import streamlit as __st
3 | import streambook
4 | __toc = streambook.TOCSidebar()
5 | __toc._add(streambook.H1('Streambook example'))
6 | __toc._add(streambook.H2('Main Code'))
7 | __toc._add(streambook.H2('Advanced Features'))
8 | __toc._add(streambook.H2('Longer example'))
9 | __toc._add(streambook.H2('Exporting to Jupyter'))
10 |
11 | __toc.generate()
12 | __st.markdown(r"""
13 | # Streambook example""", unsafe_allow_html=True)
14 | __st.markdown(r"""Streambook is a setup for writing live-updating notebooks
15 | in any editor that you might want to use (emacs, vi, notepad).""", unsafe_allow_html=True)
16 | with __st.echo(), streambook.st_stdout('info'):
17 | import numpy as np
18 | import pandas as pd
19 | import matplotlib.pyplot as plt
20 | import time
21 | __st.markdown(r"""
22 | ## Main Code""", unsafe_allow_html=True)
23 | __st.markdown(r"""Notebook cells are separated by spaces. Comment cells are rendered
24 | as markdown.
25 |
26 | See https://jupytext.readthedocs.io/en/latest/formats.html#the-light-format""", unsafe_allow_html=True)
27 | with __st.echo(), streambook.st_stdout('info'):
28 | x = np.array([10, 20, 30])
29 | __st.markdown(r"""Cells that end with an explicit variables are printed.
30 |
31 | See https://docs.streamlit.io/en/stable/api.html#magic-commands""", unsafe_allow_html=True)
32 | with __st.echo(), streambook.st_stdout('info'):
33 | x
34 | __st.markdown(r"""Dictionaries are pretty-printed using streamlit and can be collapsed""", unsafe_allow_html=True)
35 | with __st.echo(), streambook.st_stdout('info'):
36 | data = [dict(key1 = i, key2=f"{i}", key3=100 -i) for i in range(100)]
37 | __st.markdown(r"""Pandas dataframe also show up in tables. """, unsafe_allow_html=True)
38 | with __st.echo(), streambook.st_stdout('info'):
39 | df = pd.DataFrame(data)
40 | df
41 | with __st.echo(), streambook.st_stdout('info'):
42 | df.plot()
43 | __st.pyplot()
44 | with __st.echo(), streambook.st_stdout('info'):
45 | x = "hello"
46 | # Printing
47 | print("Printing", x)
48 | print("Printing2", x)
49 | "Output", x
50 | __st.markdown(r"""
51 | ## Advanced Features""", unsafe_allow_html=True)
52 | __st.markdown(r"""By default, the notebook is rerun on save to ensure
53 | consistency.""", unsafe_allow_html=True)
54 | with __st.echo(), streambook.st_stdout('info'):
55 | def simple_function(x):
56 | return x + 10
57 | y = simple_function(10)
58 | y
59 | __st.markdown(r"""Slower functions such as functions are loading data
60 | can be cached during development.""", unsafe_allow_html=True)
61 | with __st.echo(), streambook.st_stdout('info'):
62 | @__st.cache()
63 | def slow_function():
64 | for i in range(10):
65 | time.sleep(0.1)
66 | return None
67 | slow_function()
68 | __st.markdown(r"""This uses streamlit caching behind the scenes. It will
69 | run if the arguments or the body of the function change.""", unsafe_allow_html=True)
70 | __st.markdown(r"""See https://docs.streamlit.io/en/stable/caching.html""", unsafe_allow_html=True)
71 | __st.markdown(r"""
72 | ## Longer example""", unsafe_allow_html=True)
73 | with __st.echo(), streambook.st_stdout('info'):
74 | def lorenz(x, y, z, s=10, r=28, b=2.667):
75 | """
76 | Given:
77 | x, y, z: a point of interest in three dimensional space
78 | s, r, b: parameters defining the lorenz attractor
79 | Returns:
80 | x_dot, y_dot, z_dot: values of the lorenz attractor's partial
81 | derivatives at the point x, y, z
82 | """
83 | x_dot = s*(y - x)
84 | y_dot = r*x - y - x*z
85 | z_dot = x*y - b*z
86 | return x_dot, y_dot, z_dot
87 | with __st.echo(), streambook.st_stdout('info'):
88 | dt = 0.01
89 | num_steps = 20000
90 | with __st.echo(), streambook.st_stdout('info'):
91 | def calc_curve(dt, num_steps):
92 | # Need one more for the initial values
93 | xs = np.empty(num_steps + 1)
94 | ys = np.empty(num_steps + 1)
95 | zs = np.empty(num_steps + 1)
96 |
97 | # Set initial values
98 | xs[0], ys[0], zs[0] = (0., 1., 1.05)
99 |
100 | # Step through "time", calculating the partial derivatives at the
101 | # current point and using them to estimate the next point
102 | for i in range(num_steps):
103 | x_dot, y_dot, z_dot = lorenz(xs[i], ys[i], zs[i])
104 | xs[i + 1] = xs[i] + (x_dot * dt)
105 | ys[i + 1] = ys[i] + (y_dot * dt)
106 | zs[i + 1] = zs[i] + (z_dot * dt)
107 | return xs, ys, zs
108 | xs, ys, zs = calc_curve(dt, num_steps)
109 | with __st.echo(), streambook.st_stdout('info'):
110 | # Plot file
111 | fig = plt.figure(figsize=(12, 4))
112 | ax = fig.add_subplot(projection='3d')
113 | ax.plot(xs, ys, zs, lw=0.5)
114 | ax.set_xlabel("X Axis")
115 | ax.set_ylabel("Y Axis")
116 | ax.set_zlabel("Z Axis")
117 | ax.set_title("Lorenz Attractor")
118 | fig
119 | __st.markdown(r"""
120 | ## Exporting to Jupyter""", unsafe_allow_html=True)
121 | __st.markdown(r"""The whole notebook can also be exported as a
122 | Jupyter notebook.""", unsafe_allow_html=True)
123 | __st.markdown(r"""The command is:
124 |
125 | `streambook convert example.py`""", unsafe_allow_html=True)
126 | __st.markdown(r"""Some commands are slightly different in streamlit that jupyter.
127 | You can include both and all `__st` lines will be stripped out.""", unsafe_allow_html=True)
128 | with __st.echo(), streambook.st_stdout('info'):
129 | # Jupyter command
130 | from IPython.display import HTML
131 | HTML('
')
132 | # Streamlit command
133 | __st.image("example.gif")
134 |
135 |
--------------------------------------------------------------------------------
/tests/test_generate.py:
--------------------------------------------------------------------------------
1 | import streambook
2 | from io import StringIO
3 |
4 |
5 | def test_markdown():
6 | output = StringIO()
7 | gen = streambook.Generate(output)
8 | gen.markdown("test")
9 | assert output.getvalue() == '__st.markdown(r"""test""", unsafe_allow_html=True)\n'
10 |
11 |
12 | def test_gen():
13 | output = StringIO()
14 | gen = streambook.Generate(output)
15 | gen.code("x = 10\ny = 20\ny")
16 | print(output.getvalue())
17 | assert (
18 | output.getvalue()
19 | == """with __st.echo(), streambook.st_stdout('info'):
20 | x = 10
21 | y = 20
22 | y
23 | """
24 | )
25 |
26 |
27 | def test_example():
28 | output = StringIO()
29 | streambook.Generator().generate("example.py", output)
30 | generated_output = output.getvalue()
31 | expected_output = open("tests/example.streambook.tmp", "r").read()
32 | assert generated_output == expected_output
33 |
34 |
35 | def test_example_main():
36 | output = StringIO()
37 | streambook.Generator(section_filter="Main").generate("example.py", output)
38 | generated_output = output.getvalue()
39 | expected_output = open("tests/example.streambook.main.tmp", "r").read()
40 | assert generated_output == expected_output
41 |
--------------------------------------------------------------------------------