Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions tests/test_bundle.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@
_default_title_from_manifest,
_validate_title,
create_html_manifest,
create_python_environment,
get_python_env_info,
inspect_environment,
list_files,
make_api_bundle,
make_api_manifest,
make_html_bundle,
make_manifest_bundle,
make_notebook_html_bundle,
Expand Down Expand Up @@ -1804,3 +1807,79 @@ def test_make_html_bundle():
"manifest.json",
]
assert multi_file_index_dir_extras_ans == json.loads(tar.extractfile("manifest.json").read().decode("utf-8"))


shiny_dir = os.path.join(cur_dir, "./testdata/top-5-income-share-shiny")
shiny_file = os.path.join(cur_dir, "./testdata/top-5-income-share-shiny/app.py")


def test_make_api_manifest():
shiny_dir_ans = {
"version": 1,
"locale": "en_US.UTF-8",
"metadata": {"appmode": "python-shiny"}, # "entrypoint": "app"},
"python": {
"version": "3.8.12",
"package_manager": {"name": "pip", "version": "23.0.1", "package_file": "requirements.txt"},
},
"files": {
"requirements.txt": {"checksum": "2a4bdca32428db1f47c6a7f0ba830a9b"},
"README.md": {"checksum": "4c7804f5c8cb5ec05c34e92cab45f6c7"},
"app.py": {"checksum": "a7726fc4fe5374b54158a049180653a1"},
"data.csv": {"checksum": "9cdb0252eca1273dcd0ce12f9b9196a5"},
},
}
environment = create_python_environment(
shiny_dir,
)
manifest, _ = make_api_manifest(
shiny_dir,
None,
AppModes.PYTHON_SHINY,
environment,
None,
None,
)

assert shiny_dir_ans["metadata"] == manifest["metadata"]
assert shiny_dir_ans["files"].keys() == manifest["files"].keys()


def test_make_api_bundle():
shiny_dir_ans = {
"version": 1,
"locale": "en_US.UTF-8",
"metadata": {"appmode": "python-shiny"}, # "entrypoint": "app"},
"python": {
"version": "3.8.12",
"package_manager": {"name": "pip", "version": "23.0.1", "package_file": "requirements.txt"},
},
"files": {
"requirements.txt": {"checksum": "2a4bdca32428db1f47c6a7f0ba830a9b"},
"README.md": {"checksum": "4c7804f5c8cb5ec05c34e92cab45f6c7"},
"app.py": {"checksum": "a7726fc4fe5374b54158a049180653a1"},
"data.csv": {"checksum": "9cdb0252eca1273dcd0ce12f9b9196a5"},
},
}
environment = create_python_environment(
shiny_dir,
)
with make_api_bundle(
shiny_dir,
None,
AppModes.PYTHON_SHINY,
environment,
None,
None,
) as bundle, tarfile.open(mode="r:gz", fileobj=bundle) as tar:
names = sorted(tar.getnames())
assert names == [
"README.md",
"app.py",
"data.csv",
"manifest.json",
"requirements.txt",
]
bundle_json = json.loads(tar.extractfile("manifest.json").read().decode("utf-8"))
assert shiny_dir_ans["metadata"] == bundle_json["metadata"]
assert shiny_dir_ans["files"].keys() == bundle_json["files"].keys()
17 changes: 17 additions & 0 deletions tests/testdata/top-5-income-share-shiny/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Top 5% income share

## About this example

A Shiny application makes it easy to transform your analysis into an interactive application using Python so users can ask and answer their own questions in real-time.


## Learn more

* [Shiny for Python documentation](https://shiny.rstudio.com/py)
* [Shiny for Python examples](https://shinylive.io/py/examples/)

## Requirements

* Python version 3.7 or higher

<!-- NOTE: this file is generated -->
92 changes: 92 additions & 0 deletions tests/testdata/top-5-income-share-shiny/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import altair as alt
import pandas as pd
from shinywidgets import output_widget, render_widget
from shiny import App, reactive, ui

income_shares = pd.read_csv("data.csv")
countries = income_shares["Entity"].unique().tolist()

select_countries = {
"default": ["Australia", "China", "Germany", "Japan", "United States"],
"latam": ["Argentina", "Uruguay"],
"apac": ["Australia", "China", "Singapore", "Japan", "Korea, South"],
"emea": ["Mauritius", "France", "Italy", "Norway", "Spain"],
"na": ["United States", "Canada"],
}

app_ui = ui.page_fluid(
ui.panel_title("Top 5% Income Share"),
ui.p("Share of income received by the richest 5% of the population"),
ui.layout_sidebar(
ui.panel_sidebar(
ui.input_selectize(
"countries",
"Countries:",
choices=countries,
multiple=True,
selected=select_countries["default"],
),
ui.p("Regions:"),
ui.TagList(
ui.div(
{"class": "btn-group"},
ui.input_action_button("apac", "APAC"),
ui.input_action_button("emea", "EMEA"),
ui.input_action_button("latam", "LATAM"),
ui.input_action_button("na", "NA"),
)
),
ui.input_slider(
"year_range",
"Year Range:",
min=1946,
max=2015,
value=(1946, 2015),
sep="",
),
),
ui.panel_main(
output_widget("income_plot", width="800px"),
),
),
)


def server(input, output, session):
@reactive.Calc
def plot_data():
df = income_shares.loc[
(income_shares["Entity"].isin(input.countries()))
& (income_shares["Year"] >= input.year_range()[0])
& (income_shares["Year"] <= input.year_range()[1])
]
return df

@output
@render_widget
def income_plot():
chart = (
alt.Chart(plot_data())
.mark_line()
.encode(
x=alt.X("Year", axis=alt.Axis(format="d")),
y=alt.Y("Percent", axis=alt.Axis(format="~s")),
color="Entity",
strokeDash="Entity",
)
)
return chart

def make_button_listener(name):
@reactive.Effect
@reactive.event(input[name])
def _():
ui.update_selectize("countries", selected=select_countries[name])

for name in select_countries.keys():
make_button_listener(name)


app = App(app_ui, server)
if __name__ == "__main__":
app.run()
11 changes: 11 additions & 0 deletions tests/testdata/top-5-income-share-shiny/data.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Entity,Code,Year,Percent
Argentina,ARG,1953,29.07
Argentina,ARG,1954,30.28
Argentina,ARG,1956,28.96
Argentina,ARG,1959,30.41
Argentina,ARG,1961,28
Argentina,ARG,1997,22.45
Australia,AUS,1946,21.76
Australia,AUS,1947,23.41
Australia,AUS,1948,23.35

5 changes: 5 additions & 0 deletions tests/testdata/top-5-income-share-shiny/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
shiny
shinywidgets
altair
pandas
vega