From cbbed7a7b7ec11b674e9959934f2b4dae55a9ecf Mon Sep 17 00:00:00 2001 From: "Yuichiro Tachibana (Tsuchiya)" Date: Wed, 26 Jun 2024 00:48:59 +0900 Subject: [PATCH] Upgrade Streamlit to 1.36.0 (#993) * Upgrade Streamlit to 1.36.0 * Update Streamlit version in stlite-server * Update the streamlit submodule * Update samples --- Makefile | 4 +- packages/common-react/package.json | 2 +- .../desktop/bin-src/dump_artifacts/index.ts | 2 +- packages/desktop/package.json | 2 +- packages/desktop/scripts/copy_wheels.js | 2 +- packages/kernel/package.json | 4 +- packages/kernel/py/stlite-server/poetry.lock | 16 +- packages/kernel/src/kernel.ts | 2 +- packages/kernel/vitest.config.ts | 2 +- packages/mountable/package.json | 2 +- .../pages/annotations-in-altair.py | 74 ++++++ .../pages/charts.bar_chart_horizontal.py | 10 + .../pages/dataframe-row-selections.py | 96 +++++++ .../pages/execution.fragment.py | 12 +- .../pages/execution.fragment_balloon.py | 14 ++ .../pages/layout.columns_bottom_widgets.py | 7 + .../layout.columns_vertical_alignment.py | 14 ++ .../pages/utilities.html.py | 10 +- .../public/samples/012_hello/agri.csv.gz | Bin 0 -> 36065 bytes .../public/samples/012_hello/hello.py | 236 ++++++++++++++++++ .../public/samples/012_hello/requirements.txt | 10 + .../public/samples/012_hello/stlite.json | 4 + .../012_tutorials_custom-navigation/README.md | 2 +- .../requirements.txt | 1 - .../README.md | 11 + .../admin/admin_1.py | 4 + .../admin/admin_2.py | 4 + .../images/horizontal_blue.png | Bin 0 -> 39446 bytes .../images/icon_blue.png | Bin 0 -> 4241 bytes .../request/request_1.py | 4 + .../request/request_2.py | 4 + .../respond/respond_1.py | 4 + .../respond/respond_2.py | 4 + .../settings.py | 4 + .../stlite.json | 4 + .../streamlit_app.py | 78 ++++++ .../samples/012_tutorials_fragments/README.md | 11 + .../012_widget.page_link/requirements.txt | 1 - packages/sharing/package.json | 2 +- streamlit | 2 +- 40 files changed, 626 insertions(+), 39 deletions(-) create mode 100644 packages/sharing-editor/public/samples/011_component_gallery/pages/annotations-in-altair.py create mode 100644 packages/sharing-editor/public/samples/011_component_gallery/pages/charts.bar_chart_horizontal.py create mode 100644 packages/sharing-editor/public/samples/011_component_gallery/pages/dataframe-row-selections.py create mode 100644 packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment_balloon.py create mode 100644 packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_bottom_widgets.py create mode 100644 packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_vertical_alignment.py create mode 100644 packages/sharing-editor/public/samples/012_hello/agri.csv.gz create mode 100644 packages/sharing-editor/public/samples/012_hello/hello.py create mode 100644 packages/sharing-editor/public/samples/012_hello/requirements.txt create mode 100644 packages/sharing-editor/public/samples/012_hello/stlite.json delete mode 100644 packages/sharing-editor/public/samples/012_tutorials_custom-navigation/requirements.txt create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/README.md create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_1.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_2.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/images/horizontal_blue.png create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/images/icon_blue.png create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_1.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_2.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_1.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_2.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/settings.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/stlite.json create mode 100644 packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/streamlit_app.py create mode 100644 packages/sharing-editor/public/samples/012_tutorials_fragments/README.md delete mode 100644 packages/sharing-editor/public/samples/012_widget.page_link/requirements.txt diff --git a/Makefile b/Makefile index c7b9b3e78..bd5eb8dc1 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ desktop := packages/desktop/build/* kernel := packages/kernel/dist/* stlite-server-wheel := packages/kernel/py/stlite-server/dist/stlite_server-0.1.0-py3-none-any.whl streamlit_proto := streamlit/frontend/lib/src/proto.d.ts -streamlit_wheel := packages/kernel/py/streamlit/lib/dist/streamlit-1.35.0-cp312-none-any.whl +streamlit_wheel := packages/kernel/py/streamlit/lib/dist/streamlit-1.36.0-cp312-none-any.whl streamlit_frontend_lib_prod := streamlit/frontend/lib/dist/* export USE_CONSTRAINTS_FILE := false # https://github.com/streamlit/streamlit/blob/1.27.0/.github/workflows/release.yml#L67-L68 @@ -134,7 +134,7 @@ $(streamlit_wheel): venv $(streamlit_proto) streamlit/lib/streamlit/**/*.py stre exit 1; \ fi && \ cd streamlit && SNOWPARK_CONDA_BUILD=true $(MAKE) distribution && cd .. && \ - pyodide py-compile --keep streamlit/lib/dist/streamlit-1.35.0-py2.py3-none-any.whl && \ + pyodide py-compile --keep streamlit/lib/dist/streamlit-1.36.0-py2.py3-none-any.whl && \ mkdir -p $(dir $(streamlit_wheel)) && \ cp streamlit/lib/dist/$(notdir $(streamlit_wheel)) $(streamlit_wheel) diff --git a/packages/common-react/package.json b/packages/common-react/package.json index 786fc0298..40ee0924b 100644 --- a/packages/common-react/package.json +++ b/packages/common-react/package.json @@ -14,7 +14,7 @@ "check:prettier": "prettier --check ." }, "dependencies": { - "@streamlit/lib": "1.35.0" + "@streamlit/lib": "1.36.0" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "^5.49.0", diff --git a/packages/desktop/bin-src/dump_artifacts/index.ts b/packages/desktop/bin-src/dump_artifacts/index.ts index 182aa4804..a27db6527 100755 --- a/packages/desktop/bin-src/dump_artifacts/index.ts +++ b/packages/desktop/bin-src/dump_artifacts/index.ts @@ -148,7 +148,7 @@ async function installPackages( requirements.push(stliteServerWheel); const streamlitWheel = await prepareLocalWheel( pyodide, - path.join(wheelsDir, "streamlit-1.35.0-cp312-none-any.whl"), + path.join(wheelsDir, "streamlit-1.36.0-cp312-none-any.whl"), ); requirements.push(streamlitWheel); diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 7aa8a7a31..a2d119456 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -73,7 +73,7 @@ "@stlite/common": "^0.59.0", "@stlite/common-react": "^0.59.0", "@stlite/kernel": "^0.59.0", - "@streamlit/app": "1.35.0", + "@streamlit/app": "1.36.0", "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.0.0", "@types/jest": "^27.4.3", diff --git a/packages/desktop/scripts/copy_wheels.js b/packages/desktop/scripts/copy_wheels.js index 5a10c3cd8..b93813ae2 100755 --- a/packages/desktop/scripts/copy_wheels.js +++ b/packages/desktop/scripts/copy_wheels.js @@ -22,7 +22,7 @@ async function main() { ); const streamlitWheelPath = path.join( stliteKernelPyDir, - "streamlit/lib/dist/streamlit-1.35.0-cp312-none-any.whl", + "streamlit/lib/dist/streamlit-1.36.0-cp312-none-any.whl", ); // Create the `wheels` directory diff --git a/packages/kernel/package.json b/packages/kernel/package.json index a5599ceb9..e19d58382 100644 --- a/packages/kernel/package.json +++ b/packages/kernel/package.json @@ -34,8 +34,8 @@ "dependencies": { "@jupyterlab/coreutils": "^5.4.2", "@stlite/common": "^0.59.0", - "@streamlit/app": "1.35.0", - "@streamlit/lib": "1.35.0", + "@streamlit/app": "1.36.0", + "@streamlit/lib": "1.36.0", "path-browserify": "^1.0.1" } } diff --git a/packages/kernel/py/stlite-server/poetry.lock b/packages/kernel/py/stlite-server/poetry.lock index 7c4f7a243..e2d675a72 100644 --- a/packages/kernel/py/stlite-server/poetry.lock +++ b/packages/kernel/py/stlite-server/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "altair" @@ -1408,13 +1408,13 @@ files = [ [[package]] name = "streamlit" -version = "1.35.0" +version = "1.36.0" description = "A faster way to build and share data apps" optional = false python-versions = "!=3.9.7,>=3.8" files = [ - {file = "streamlit-1.35.0-py2.py3-none-any.whl", hash = "sha256:e17d1d86830a0d7687c37faf2fe47bffa752d0c95a306e96d7749bd3faa72a5b"}, - {file = "streamlit-1.35.0.tar.gz", hash = "sha256:679d55bb6189743f606abf0696623df0bfd223a6d0c8d96b8d60678d4891d2d6"}, + {file = "streamlit-1.36.0-py2.py3-none-any.whl", hash = "sha256:3399a33ea5faa26c05dd433d142eefe68ade67e9189a9e1d47a1731ae30a1c42"}, + {file = "streamlit-1.36.0.tar.gz", hash = "sha256:a12af9f0eb61ab5832f438336257b1ec20eb29d8e0e0c6b40a79116ba939bc9c"}, ] [package.dependencies] @@ -1423,11 +1423,11 @@ blinker = ">=1.0.0,<2" cachetools = ">=4.0,<6" click = ">=7.0,<9" gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4" -numpy = ">=1.19.3,<2" -packaging = ">=16.8,<25" +numpy = ">=1.20,<3" +packaging = ">=20,<25" pandas = ">=1.3.0,<3" pillow = ">=7.1.0,<11" -protobuf = ">=3.20,<5" +protobuf = ">=3.20,<6" pyarrow = ">=7.0" pydeck = ">=0.8.0b4,<1" requests = ">=2.27,<3" @@ -1436,7 +1436,7 @@ tenacity = ">=8.1.0,<9" toml = ">=0.10.1,<2" tornado = ">=6.0.3,<7" typing-extensions = ">=4.3.0,<5" -watchdog = {version = ">=2.1.5", markers = "platform_system != \"Darwin\""} +watchdog = {version = ">=2.1.5,<5", markers = "platform_system != \"Darwin\""} [package.extras] snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python (>=0.9.0)"] diff --git a/packages/kernel/src/kernel.ts b/packages/kernel/src/kernel.ts index 3818735f1..3f266cb28 100644 --- a/packages/kernel/src/kernel.ts +++ b/packages/kernel/src/kernel.ts @@ -32,7 +32,7 @@ import { assertStreamlitConfig } from "./types"; // https://github.com/pyodide/pyodide/pull/1859 // https://pyodide.org/en/stable/project/changelog.html#micropip import STLITE_SERVER_WHEEL from "!!file-loader?name=pypi/[name].[ext]&context=.!../py/stlite-server/dist/stlite_server-0.1.0-py3-none-any.whl"; // TODO: Extract the import statement to an auto-generated file like `_pypi.ts` in JupyterLite: https://github.com/jupyterlite/jupyterlite/blob/f2ecc9cf7189cb19722bec2f0fc7ff5dfd233d47/packages/pyolite-kernel/src/_pypi.ts -import STREAMLIT_WHEEL from "!!file-loader?name=pypi/[name].[ext]&context=.!../py/streamlit/lib/dist/streamlit-1.35.0-cp312-none-any.whl"; +import STREAMLIT_WHEEL from "!!file-loader?name=pypi/[name].[ext]&context=.!../py/streamlit/lib/dist/streamlit-1.36.0-cp312-none-any.whl"; // Ref: https://github.com/streamlit/streamlit/blob/1.12.2/frontend/src/lib/UriUtil.ts#L32-L33 const FINAL_SLASH_RE = /\/+$/; diff --git a/packages/kernel/vitest.config.ts b/packages/kernel/vitest.config.ts index 980603ae2..368733209 100644 --- a/packages/kernel/vitest.config.ts +++ b/packages/kernel/vitest.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ ), "streamlit.whl": path.resolve( __dirname, - "./py/streamlit/lib/dist/streamlit-1.35.0-cp312-none-any.whl", + "./py/streamlit/lib/dist/streamlit-1.36.0-cp312-none-any.whl", ), }, }, diff --git a/packages/mountable/package.json b/packages/mountable/package.json index 6ce799e90..5f55843ae 100644 --- a/packages/mountable/package.json +++ b/packages/mountable/package.json @@ -31,7 +31,7 @@ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", "@stlite/common-react": "^0.59.0", "@stlite/kernel": "^0.59.0", - "@streamlit/app": "1.35.0", + "@streamlit/app": "1.36.0", "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^14.1.2", diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/annotations-in-altair.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/annotations-in-altair.py new file mode 100644 index 000000000..82e56867f --- /dev/null +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/annotations-in-altair.py @@ -0,0 +1,74 @@ +import streamlit as st +import altair as alt +import pandas as pd +from vega_datasets import data + + +@st.cache_data +def get_data(): + source = data.stocks() + source = source[source.date.gt("2004-01-01")] + return source + + +stock_data = get_data() + +hover = alt.selection_single( + fields=["date"], + nearest=True, + on="mouseover", + empty="none", +) + +lines = ( + alt.Chart(stock_data, title="Evolution of stock prices") + .mark_line() + .encode( + x="date", + y="price", + color="symbol", + ) +) + +points = lines.transform_filter(hover).mark_circle(size=65) + +tooltips = ( + alt.Chart(stock_data) + .mark_rule() + .encode( + x="yearmonthdate(date)", + y="price", + opacity=alt.condition(hover, alt.value(0.3), alt.value(0)), + tooltip=[ + alt.Tooltip("date", title="Date"), + alt.Tooltip("price", title="Price (USD)"), + ], + ) + .add_selection(hover) +) + +data_layer = lines + points + tooltips + + +event_picker = alt.selection_point("events") + + +ANNOTATIONS = [ + ("Sep 01, 2007", 400, "🙂", "Something's going well for GOOG & AAPL."), + ("Nov 01, 2008", 180, "🙂", "The market is recovering."), + ("Dec 01, 2007", 700, "😱", "Something's going wrong for GOOG & AAPL."), + ("Dec 01, 2009", 650, "😱", "A hiccup for GOOG."), +] +annotations_df = pd.DataFrame( + ANNOTATIONS, columns=["date", "y", "marker", "description"] +) +annotations_df.date = pd.to_datetime(annotations_df.date) + +annotation_layer = ( + alt.Chart(annotations_df) + .mark_text(size=20, dx=-8, dy=-10, align="left") + .encode(x="date:T", y=alt.Y("y:Q"), text="marker", tooltip="description") +) + +combined_chart = data_layer + annotation_layer +st.altair_chart(combined_chart, use_container_width=True) \ No newline at end of file diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/charts.bar_chart_horizontal.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/charts.bar_chart_horizontal.py new file mode 100644 index 000000000..5583dbc4b --- /dev/null +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/charts.bar_chart_horizontal.py @@ -0,0 +1,10 @@ +import streamlit as st +from vega_datasets import data + +@st.cache_data +def get_data(): + return data.barley() + +source = get_data() + +st.bar_chart(source, x="variety", y="yield", color="site", horizontal=True) diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/dataframe-row-selections.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/dataframe-row-selections.py new file mode 100644 index 000000000..407f83a3c --- /dev/null +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/dataframe-row-selections.py @@ -0,0 +1,96 @@ +import random + +import numpy as np +import pandas as pd +import streamlit as st + + +@st.cache_data +def get_profile_dataset(number_of_items: int = 20, seed: int = 0) -> pd.DataFrame: + from faker import Faker + + new_data = [] + + fake = Faker() + random.seed(seed) + Faker.seed(seed) + + for i in range(number_of_items): + profile = fake.profile() + new_data.append( + { + "avatar": f"https://picsum.photos/400/200?lock={i}", + "name": profile["name"], + "daily_activity": np.random.rand(25), + "activity": np.random.randint(2, 90, size=12), + } + ) + + profile_df = pd.DataFrame(new_data) + return profile_df + + +column_configuration = { + "name": st.column_config.TextColumn( + "Name", help="The name of the user", max_chars=100, width="medium" + ), + "avatar": st.column_config.ImageColumn("Avatar", help="The user's avatar"), + "activity": st.column_config.LineChartColumn( + "Activity (1 year)", + help="The user's activity over the last 1 year", + width="large", + y_min=0, + y_max=100, + ), + "daily_activity": st.column_config.BarChartColumn( + "Activity (daily)", + help="The user's activity in the last 25 days", + width="medium", + y_min=0, + y_max=1, + ), +} + +select, compare = st.tabs(["Select members", "Compare selected"]) + +with select: + st.header("All members") + + df = get_profile_dataset() + + event = st.dataframe( + df, + column_config=column_configuration, + use_container_width=True, + hide_index=True, + on_select="rerun", + selection_mode="multi-row", + ) + + st.header("Selected members") + people = event.selection.rows + filtered_df = df.iloc[people] + st.dataframe( + filtered_df, + column_config=column_configuration, + use_container_width=True, + ) + +with compare: + activity_df = {} + for person in people: + activity_df[df.iloc[person]["name"]] = df.iloc[person]["activity"] + activity_df = pd.DataFrame(activity_df) + + daily_activity_df = {} + for person in people: + daily_activity_df[df.iloc[person]["name"]] = df.iloc[person]["daily_activity"] + daily_activity_df = pd.DataFrame(daily_activity_df) + + if len(people) > 0: + st.header("Daily activity comparison") + st.bar_chart(daily_activity_df) + st.header("Yearly activity comparison") + st.line_chart(activity_df) + else: + st.markdown("No members selected.") diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment.py index 03dd9791b..e2f7fa183 100644 --- a/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment.py +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment.py @@ -1,7 +1,7 @@ import streamlit as st -if "script_runs" not in st.session_state: - st.session_state.script_runs = 0 +if "app_runs" not in st.session_state: + st.session_state.app_runs = 0 st.session_state.fragment_runs = 0 @@ -12,8 +12,8 @@ def fragment(): st.write(f"Fragment says it ran {st.session_state.fragment_runs} times.") -st.session_state.script_runs += 1 +st.session_state.app_runs += 1 fragment() -st.button("Rerun full script") -st.write(f"Full script says it ran {st.session_state.script_runs} times.") -st.write(f"Full script sees that fragment ran {st.session_state.fragment_runs} times.") +st.button("Rerun full app") +st.write(f"Full app says it ran {st.session_state.app_runs} times.") +st.write(f"Full app sees that fragment ran {st.session_state.fragment_runs} times.") diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment_balloon.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment_balloon.py new file mode 100644 index 000000000..be303441d --- /dev/null +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/execution.fragment_balloon.py @@ -0,0 +1,14 @@ +import streamlit as st +import asyncio + + +@st.experimental_fragment +def release_the_balloons(): + st.button("Release the balloons", help="Fragment rerun") + st.balloons() + + +with st.spinner("Inflating balloons..."): + await asyncio.sleep(5) +release_the_balloons() +st.button("Inflate more balloons", help="Full rerun") diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_bottom_widgets.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_bottom_widgets.py new file mode 100644 index 000000000..9ce155c3b --- /dev/null +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_bottom_widgets.py @@ -0,0 +1,7 @@ +import streamlit as st + +left, middle, right = st.columns(3, vertical_alignment="bottom") + +left.text_input("Write something") +middle.button("Click me", use_container_width=True) +right.checkbox("Check me") \ No newline at end of file diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_vertical_alignment.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_vertical_alignment.py new file mode 100644 index 000000000..f4e0512e2 --- /dev/null +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/layout.columns_vertical_alignment.py @@ -0,0 +1,14 @@ +import streamlit as st +import numpy as np + +vertical_alignment = st.selectbox( + "Vertical alignment", ["top", "center", "bottom"], index=2 +) + +left, middle, right = st.columns(3, vertical_alignment=vertical_alignment) +left.image("https://static.streamlit.io/examples/cat.jpg") +left.markdown("By [@phonvanna](https://unsplash.com/photos/0g7BJEXq7sU)") +middle.image("https://static.streamlit.io/examples/dog.jpg") +middle.markdown("By [@shotbyrain](https://unsplash.com/photos/rmkIqi_C3cA)") +right.image("https://static.streamlit.io/examples/owl.jpg") +right.markdown("By [@zmachacek](https://unsplash.com/photos/ZN4CzqizIyI)") diff --git a/packages/sharing-editor/public/samples/011_component_gallery/pages/utilities.html.py b/packages/sharing-editor/public/samples/011_component_gallery/pages/utilities.html.py index 4e72600e9..d03f75974 100644 --- a/packages/sharing-editor/public/samples/011_component_gallery/pages/utilities.html.py +++ b/packages/sharing-editor/public/samples/011_component_gallery/pages/utilities.html.py @@ -1,11 +1,3 @@ import streamlit as st -code = """ - -""" -st.html(code) -st.markdown("Lorem ipsum") +st.html("

Oops!

") diff --git a/packages/sharing-editor/public/samples/012_hello/agri.csv.gz b/packages/sharing-editor/public/samples/012_hello/agri.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..14f9209f085a58c397a989147b9e0d2ff185ba1b GIT binary patch literal 36065 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 literal 0 HcmV?d00001 diff --git a/packages/sharing-editor/public/samples/012_hello/hello.py b/packages/sharing-editor/public/samples/012_hello/hello.py new file mode 100644 index 000000000..dd3e6a665 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_hello/hello.py @@ -0,0 +1,236 @@ +import streamlit as st + + +async def intro(): + import streamlit as st + + st.write("# Welcome to Streamlit! 👋") + st.sidebar.success("Select a demo above.") + + st.markdown( + """ + Streamlit is an open-source app framework built specifically for + Machine Learning and Data Science projects. + + **👈 Select a demo from the dropdown on the left** to see some examples + of what Streamlit can do! + + ### Want to learn more? + + - Check out [streamlit.io](https://streamlit.io) + - Jump into our [documentation](https://docs.streamlit.io) + - Ask a question in our [community + forums](https://discuss.streamlit.io) + + ### See more complex demos + + - Use a neural net to [analyze the Udacity Self-driving Car Image + Dataset](https://github.com/streamlit/demo-self-driving) + - Explore a [New York City rideshare dataset](https://github.com/streamlit/demo-uber-nyc-pickups) + """ + ) + + +async def mapping_demo(): + from urllib.error import URLError + + import pandas as pd + import pydeck as pdk + import streamlit as st + + st.markdown(f"# {list(page_names_to_funcs.keys())[2]}") + st.write( + """ + This demo shows how to use +[`st.pydeck_chart`](https://docs.streamlit.io/develop/api-reference/charts/st.pydeck_chart) +to display geospatial data. +""" + ) + + @st.cache_data + def from_data_file(filename): + url = ( + "http://raw.githubusercontent.com/streamlit/" + "example-data/master/hello/v1/%s" % filename + ) + return pd.read_json(url) + + try: + ALL_LAYERS = { + "Bike Rentals": pdk.Layer( + "HexagonLayer", + data=from_data_file("bike_rental_stats.json"), + get_position=["lon", "lat"], + radius=200, + elevation_scale=4, + elevation_range=[0, 1000], + extruded=True, + ), + "Bart Stop Exits": pdk.Layer( + "ScatterplotLayer", + data=from_data_file("bart_stop_stats.json"), + get_position=["lon", "lat"], + get_color=[200, 30, 0, 160], + get_radius="[exits]", + radius_scale=0.05, + ), + "Bart Stop Names": pdk.Layer( + "TextLayer", + data=from_data_file("bart_stop_stats.json"), + get_position=["lon", "lat"], + get_text="name", + get_color=[0, 0, 0, 200], + get_size=15, + get_alignment_baseline="'bottom'", + ), + "Outbound Flow": pdk.Layer( + "ArcLayer", + data=from_data_file("bart_path_stats.json"), + get_source_position=["lon", "lat"], + get_target_position=["lon2", "lat2"], + get_source_color=[200, 30, 0, 160], + get_target_color=[200, 30, 0, 160], + auto_highlight=True, + width_scale=0.0001, + get_width="outbound", + width_min_pixels=3, + width_max_pixels=30, + ), + } + st.sidebar.markdown("### Map Layers") + selected_layers = [ + layer + for layer_name, layer in ALL_LAYERS.items() + if st.sidebar.checkbox(layer_name, True) + ] + if selected_layers: + st.pydeck_chart( + pdk.Deck( + map_style="mapbox://styles/mapbox/light-v9", + initial_view_state={ + "latitude": 37.76, + "longitude": -122.4, + "zoom": 11, + "pitch": 50, + }, + layers=selected_layers, + ) + ) + else: + st.error("Please choose at least one layer above.") + except URLError as e: + st.error( + """ + **This demo requires internet access.** + + Connection error: %s + """ + % e.reason + ) + + +async def plotting_demo(): + import asyncio + + import numpy as np + import streamlit as st + + st.markdown(f"# {list(page_names_to_funcs.keys())[1]}") + st.write( + """ + This demo illustrates a combination of plotting and animation with +Streamlit. We're generating a bunch of random numbers in a loop for around +5 seconds. Enjoy! +""" + ) + + progress_bar = st.sidebar.progress(0) + status_text = st.sidebar.empty() + last_rows = np.random.randn(1, 1) + chart = st.line_chart(last_rows) + + for i in range(1, 101): + new_rows = last_rows[-1, :] + np.random.randn(5, 1).cumsum(axis=0) + status_text.text("%i%% Complete" % i) + chart.add_rows(new_rows) + progress_bar.progress(i) + last_rows = new_rows + await asyncio.sleep(0.05) + + progress_bar.empty() + + # Streamlit widgets automatically run the script from top to bottom. Since + # this button is not connected to any other logic, it just causes a plain + # rerun. + st.button("Re-run") + + +async def data_frame_demo(): + from urllib.error import URLError + + import altair as alt + import pandas as pd + import streamlit as st + + st.markdown(f"# {list(page_names_to_funcs.keys())[3]}") + st.write( + """ + This demo shows how to use `st.write` to visualize Pandas DataFrames. + +(Data courtesy of the [UN Data Explorer](http://data.un.org/Explorer.aspx).) +""" + ) + + @st.cache_data + def get_UN_data(): + # AWS_BUCKET_URL = "http://streamlit-demo-data.s3-us-west-2.amazonaws.com" + # df = pd.read_csv(AWS_BUCKET_URL + "/agri.csv.gz") + df = pd.read_csv("./agri.csv.gz") + return df.set_index("Region") + + try: + df = get_UN_data() + countries = st.multiselect( + "Choose countries", list(df.index), ["China", "United States of America"] + ) + if not countries: + st.error("Please select at least one country.") + else: + data = df.loc[countries] + data /= 1000000.0 + st.write("### Gross Agricultural Production ($B)", data.sort_index()) + + data = data.T.reset_index() + data = pd.melt(data, id_vars=["index"]).rename( + columns={"index": "year", "value": "Gross Agricultural Product ($B)"} + ) + chart = ( + alt.Chart(data) + .mark_area(opacity=0.3) + .encode( + x="year:T", + y=alt.Y("Gross Agricultural Product ($B):Q", stack=None), + color="Region:N", + ) + ) + st.altair_chart(chart, use_container_width=True) + except URLError as e: + st.error( + """ + **This demo requires internet access.** + + Connection error: %s + """ + % e.reason + ) + + +page_names_to_funcs = { + "—": intro, + "Plotting Demo": plotting_demo, + "Mapping Demo": mapping_demo, + "DataFrame Demo": data_frame_demo, +} + +demo_name = st.sidebar.selectbox("Choose a demo", page_names_to_funcs.keys()) +await page_names_to_funcs[demo_name]() diff --git a/packages/sharing-editor/public/samples/012_hello/requirements.txt b/packages/sharing-editor/public/samples/012_hello/requirements.txt new file mode 100644 index 000000000..96c8bd4b2 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_hello/requirements.txt @@ -0,0 +1,10 @@ +pandas +plotly +bokeh +graphviz +requests +matplotlib +numpy +scipy +altair +pydeck diff --git a/packages/sharing-editor/public/samples/012_hello/stlite.json b/packages/sharing-editor/public/samples/012_hello/stlite.json new file mode 100644 index 000000000..d2fe7828a --- /dev/null +++ b/packages/sharing-editor/public/samples/012_hello/stlite.json @@ -0,0 +1,4 @@ +{ + "title": "Hello", + "entrypoint": "hello.py" +} diff --git a/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/README.md b/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/README.md index 093e322c6..b31353baf 100644 --- a/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/README.md +++ b/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/README.md @@ -1,7 +1,7 @@ ## Streamlit Hello demo This sample app is a copy of the `tutorials/custom-navigation` demo. -The source files were copied from https://github.com/streamlit/docs/tree/4f1c7ce444b6c3e0a1bba473199c9ddb42ed6866/python/api-examples-source +The source files were copied from https://github.com/streamlit/docs/tree/dff6f40ea4ec1c5d2f7052db30348945a93dc9db/python/api-examples-source ## License diff --git a/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/requirements.txt b/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/requirements.txt deleted file mode 100644 index 12a470652..000000000 --- a/packages/sharing-editor/public/samples/012_tutorials_custom-navigation/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -streamlit diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/README.md b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/README.md new file mode 100644 index 000000000..37a2320f5 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/README.md @@ -0,0 +1,11 @@ +## Streamlit Hello demo + +This sample app is a copy of the `tutorials/dynamic-navigation` demo. +The source files were copied from https://github.com/streamlit/docs/tree/dff6f40ea4ec1c5d2f7052db30348945a93dc9db/python/api-examples-source + +## License + +As written above, the source files are copied from `https://github.com/streamlit/docs`, +therefore, the license applied to the source, the Apache-2.0 license, is also applied to this sample. + +See https://github.com/streamlit/docs/blob/main/LICENSE diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_1.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_1.py new file mode 100644 index 000000000..9ea5c67c1 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_1.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Admin 1") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_2.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_2.py new file mode 100644 index 000000000..cdac57a88 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/admin/admin_2.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Admin 2") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/images/horizontal_blue.png b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/images/horizontal_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..05a00969d0e453fc9e4c2564015856c8419c1eba GIT binary patch literal 39446 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 literal 0 HcmV?d00001 diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/images/icon_blue.png b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/images/icon_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..96bce1171d2cd128c5610c913caec35c753c6512 GIT binary patch literal 4241 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 literal 0 HcmV?d00001 diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_1.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_1.py new file mode 100644 index 000000000..0b177a60e --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_1.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Request 1") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_2.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_2.py new file mode 100644 index 000000000..659efb5ff --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/request/request_2.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Request 2") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_1.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_1.py new file mode 100644 index 000000000..652a106ea --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_1.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Respond 1") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_2.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_2.py new file mode 100644 index 000000000..fc987ca3b --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/respond/respond_2.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Respond 2") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/settings.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/settings.py new file mode 100644 index 000000000..bd2cbbef4 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/settings.py @@ -0,0 +1,4 @@ +import streamlit as st + +st.header("Settings") +st.write(f"You are logged in as {st.session_state.role}.") diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/stlite.json b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/stlite.json new file mode 100644 index 000000000..32d4f375c --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/stlite.json @@ -0,0 +1,4 @@ +{ + "title": "Tutorials/Dynamic Navigation", + "entrypoint": "streamlit_app.py" +} diff --git a/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/streamlit_app.py b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/streamlit_app.py new file mode 100644 index 000000000..c5ff7d946 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_dynamic-navigation/streamlit_app.py @@ -0,0 +1,78 @@ +import streamlit as st + +if "role" not in st.session_state: + st.session_state.role = None + +ROLES = [None, "Requester", "Responder", "Admin"] + + +def login(): + + st.header("Log in") + role = st.selectbox("Choose your role", ROLES) + + if st.button("Log in"): + st.session_state.role = role + st.rerun() + + +def logout(): + st.session_state.role = None + st.rerun() + + +role = st.session_state.role + +logout_page = st.Page(logout, title="Log out", icon=":material/logout:") +settings = st.Page("settings.py", title="Settings", icon=":material/settings:") +request_1 = st.Page( + "request/request_1.py", + title="Request 1", + icon=":material/help:", + default=(role == "Requester"), +) +request_2 = st.Page( + "request/request_2.py", title="Request 2", icon=":material/bug_report:" +) +respond_1 = st.Page( + "respond/respond_1.py", + title="Respond 1", + icon=":material/healing:", + default=(role == "Responder"), +) +respond_2 = st.Page( + "respond/respond_2.py", title="Respond 2", icon=":material/handyman:" +) +admin_1 = st.Page( + "admin/admin_1.py", + title="Admin 1", + icon=":material/person_add:", + default=(role == "Admin"), +) +admin_2 = st.Page("admin/admin_2.py", title="Admin 2", icon=":material/security:") + +account_pages = [logout_page, settings] +request_pages = [request_1, request_2] +respond_pages = [respond_1, respond_2] +admin_pages = [admin_1, admin_2] + +st.title("Request manager") +st.logo( + "images/horizontal_blue.png", + icon_image="images/icon_blue.png", +) + +page_dict = {} +if st.session_state.role in ["Requester", "Admin"]: + page_dict["Request"] = request_pages +if st.session_state.role in ["Responder", "Admin"]: + page_dict["Respond"] = respond_pages +if st.session_state.role == "Admin": + page_dict["Admin"] = admin_pages + +if len(page_dict) > 0: + pg = st.navigation({"Account": account_pages} | page_dict) +else: + pg = st.navigation([st.Page(login)]) + +pg.run() diff --git a/packages/sharing-editor/public/samples/012_tutorials_fragments/README.md b/packages/sharing-editor/public/samples/012_tutorials_fragments/README.md new file mode 100644 index 000000000..a1fb441d0 --- /dev/null +++ b/packages/sharing-editor/public/samples/012_tutorials_fragments/README.md @@ -0,0 +1,11 @@ +## Streamlit Hello demo + +This sample app is a copy of the `python/api-examples-source/tutorials/execution-flow/fragments` demo. +The source files were copied from https://github.com/streamlit/docs/tree/dff6f40ea4ec1c5d2f7052db30348945a93dc9db/python/api-examples-source + +## License + +As written above, the source files are copied from `https://github.com/streamlit/docs`, +therefore, the license applied to the source, the Apache-2.0 license, is also applied to this sample. + +See https://github.com/streamlit/docs/blob/main/LICENSE diff --git a/packages/sharing-editor/public/samples/012_widget.page_link/requirements.txt b/packages/sharing-editor/public/samples/012_widget.page_link/requirements.txt deleted file mode 100644 index 12a470652..000000000 --- a/packages/sharing-editor/public/samples/012_widget.page_link/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -streamlit diff --git a/packages/sharing/package.json b/packages/sharing/package.json index 94de46341..d2a340915 100644 --- a/packages/sharing/package.json +++ b/packages/sharing/package.json @@ -8,7 +8,7 @@ "@stlite/common-react": "^0.59.0", "@stlite/kernel": "^0.59.0", "@stlite/sharing-common": "^0.59.0", - "@streamlit/app": "1.35.0", + "@streamlit/app": "1.36.0", "@testing-library/react": "^14.1.2", "@testing-library/user-event": "^14.0.0", "@types/jest": "^27.4.3", diff --git a/streamlit b/streamlit index f75e0c0ba..cb38d7969 160000 --- a/streamlit +++ b/streamlit @@ -1 +1 @@ -Subproject commit f75e0c0ba3610d12af45d1061160250780d58ea4 +Subproject commit cb38d796940d0d00e7199b083cdb90aaa2b1bc87