├── .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 | ![image](https://user-images.githubusercontent.com/35882/114342503-f0273d80-9b29-11eb-96d2-3fdd7938a04c.png) 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 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | " \n", 246 | " \n", 247 | " \n", 248 | " \n", 249 | " \n", 250 | " \n", 251 | " \n", 252 | " \n", 253 | " \n", 254 | " \n", 255 | " \n", 256 | " \n", 257 | " \n", 258 | " \n", 259 | " \n", 260 | " \n", 261 | " \n", 262 | " \n", 263 | " \n", 264 | " \n", 265 | " \n", 266 | " \n", 267 | " \n", 268 | "
key1key2key3
000100
11199
22298
33397
44496
............
9595955
9696964
9797973
9898982
9999991
\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}" 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 | --------------------------------------------------------------------------------