diff --git a/README.md b/README.md index 44760be..87bdf05 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The purpose of this project is to share knowledge on how Awesome [Streamlit](https://streamlit.io/) is and can become. [Pull requests](https://github.com/MarcSkovMadsen/awesome-streamlit/pulls) are very welcome! -Streamlit has just been [announced](https://towardsdatascience.com/coding-ml-tools-like-you-code-ml-models-ddba3357eace) (Oct 2019) but I see the potential of becoming the **Iphone of Data Science Apps**. And maybe it can even become the Iphone of Technical Writing, Code, Micro Apps and Python. +Streamlit has just been [announced](https://towardsdatascience.com/coding-ml-tools-like-you-code-ml-models-ddba3357eace) (Oct 2019) but I see the potential of it becoming the **iPhone of Data Science Apps**. And maybe it can even become the iPhone of Technical Writing, Code, Micro Apps and Python. This project provides @@ -90,7 +90,8 @@ A curated list of awesome streamlit resources. Inspired by [awesome-python](http - [Sentiment Algorithm](https://raw.githubusercontent.com/MarcSkovMadsen/awesome-streamlit/master/gallery/sentiment_analyzer/sentiment_analyzer.py) by [Paras Patidar](https://github.com/patidarparas13) (#App In Gallery, #Code, #Machine Learning) - [SpacyIO](https://raw.githubusercontent.com/MarcSkovMadsen/awesome-streamlit/master/gallery/spacyio/spacyio.py) by [Ines Montani](https://gist.github.com/ines) (#App In Gallery, #Code, #NLP) - [Spreadsheet](https://raw.githubusercontent.com/MarcSkovMadsen/awesome-streamlit/master/gallery/spreadsheet/spreadsheet.py) by [Marc Skov Madsen](https://datamodelsanalytics.com) (#App In Gallery, #Code) -- [Streamlit-components-demo Code](https://github.com/virusvn/streamlit-components-demo) (#Code) +- [Streamlit-components-demo Code](https://github.com/virusvn/streamlit-components-demo) (#Code) +- [Sudoku Solver](https://raw.githubusercontent.com/MarcSkovMadsen/awesome-streamlit/master/gallery/sudoku_solver/sudoku_solver.py) by [Joshua Cook](https://joshuacook.netlify.app/) (#App, #App In Gallery, #Code) - [Table Experiments](https://raw.githubusercontent.com/MarcSkovMadsen/awesome-streamlit/master/gallery/table_experiments/app.py) by [Marc Skov Madsen](https://datamodelsanalytics.com) (#App In Gallery, #Code) - [Uber Data Explorer App](https://dataexplorerlit.herokuapp.com/) (#Code) - [Uber NYC Pickups](https://raw.githubusercontent.com/streamlit/demo-uber-nyc-pickups/master/app.py) by [Streamlit](https://streamlit.io/) (#App In Gallery, #Code) @@ -126,14 +127,16 @@ A curated list of awesome streamlit resources. Inspired by [awesome-python](http - [A step by step guide to running streamlit pytorch and bert on a cheap aws instance](https://fuzzyblog.io/blog/python/2019/10/17/a-step-by-step-guide-to-running-streamlit-pytorch-and-bert-on-a-cheap-aws-instance.html) (#Article, #Deployment, #Tutorial) - [Building a ui for your latest ai](https://towardsdatascience.com/full-stack-ai-building-a-ui-for-your-latest-ai-project-in-no-time-at-all-7e5c8fd4eafd ) by [Luke Posey](https://github.com/Poseyy) (#Article, #Tutorial) -- [Building an Iris EDA App with Streamlit and Python](https://www.youtube.com/watch?v=L_mZcEMFUIc) by [Jesse E. Agbe (JCharis)](https://github.com/Jcharis) (#Tutorial, #Video) +- [Building an Iris EDA App with Streamlit and Python](https://www.youtube.com/watch?v=L_mZcEMFUIc) by [Jesse E. Agbe (JCharis)](https://github.com/Jcharis) (#Tutorial, #Video) +- [Creating A Stock Dashboard](https://www.linkedin.com/pulse/creating-stock-dashboard-curt-beck/?trackingId=AityTMjb3NukPM%2FZIrEoxA%3D%3D) by [Curt Beck](https://www.linkedin.com/pulse/creating-stock-dashboard-curt-beck/?trackingId=AityTMjb3NukPM%2FZIrEoxA%3D%3D) (#Article, #Tutorial) +- [Creating a Streamlit web app, building with Docker + GitHub Actions, and hosting on Heroku](https://joshuacook.netlify.app/post/streamlit-app-heroku/) by [Joshua Cook](https://joshuacook.netlify.app) (#Tutorial, #Article) - [Full-Stack AI: Building a UI for Your Latest AI Project in No Time at All](https://towardsdatascience.com/full-stack-ai-building-a-ui-for-your-latest-ai-project-in-no-time-at-all-7e5c8fd4eafd) (#Article, #Image Recognition, #Tutorial) - [How To Deploy Streamlit Apps (Using Heroku)](https://www.youtube.com/watch?v=skpiLtEN3yk&feature=youtu.be) (#Deployment, #Tutorial, #Video) - [How to build your machine learning app in 3 simple steps](https://towardsdatascience.com/how-to-build-your-machine-learning-app-in-3-simple-steps-d56ed910355c) (#Article, #Deployment, #Tutorial) - [How to create and deploy data exploration web app easily using python](https://medium.com/@ansjin/how-to-create-and-deploy-data-exploration-web-app-easily-using-python-a03c4b8a1f3e) (#Article, #Deployment, #Tutorial) - [How to write web apps using simple python for data scientists](https://towardsdatascience.com/how-to-write-web-apps-using-simple-python-for-data-scientists-a227a1a01582) (#Article, #Tutorial) - [Mining and Classifying Medical Text Documents](https://towardsdatascience.com/mining-and-classifying-medical-text-documents-1876462f73bc) by [Georgi Tancev](https://github.com/gtancev) (#Article, #Deployment, #NLP, #Tutorial) -- [Streamlit Python Tutorial (Crash Course)](https://www.youtube.com/watch?v=_9WiB2PDO7k) by [Jesse E. Agbe (JCharis)](https://github.com/Jcharis) (#Tutorial, #Video +- [Streamlit Python Tutorial (Crash Course)](https://www.youtube.com/watch?v=_9WiB2PDO7k) by [Jesse E. Agbe (JCharis)](https://github.com/Jcharis) (#Tutorial, #Video) ## Governance @@ -147,7 +150,7 @@ You can learn more about me at [datamodelsanalytics.com](https://datamodelsanaly I try my best to govern and maintain this project in the spirit of the [Zen of Python](https://www.python.org/dev/peps/pep-0020/). -But **i'm not an experienced open source maintainer** so helpfull suggestions are appreciated. +But **I'm not an experienced open source maintainer** so helpfull suggestions are appreciated. Thanks @@ -316,7 +319,7 @@ conda create -n awesome-streamlit python=3.7.4 and activate environment. ```bash -activate awesome-streamlit +conda activate awesome-streamlit ``` If you are on windows you need to install some things required by GeoPandas by following [these instructions](https://geoffboeing.com/2014/09/using-geopandas-windows/). diff --git a/app.py b/app.py index 8861790..bade0c2 100644 --- a/app.py +++ b/app.py @@ -1,7 +1,7 @@ """Main module for the streamlit app""" +import awesome_streamlit as ast import streamlit as st -import awesome_streamlit as ast import src.pages.about import src.pages.gallery.index import src.pages.home diff --git a/gallery/googleplaystore_analytics/main.py b/gallery/googleplaystore_analytics/main.py index 5d41d93..151efea 100644 --- a/gallery/googleplaystore_analytics/main.py +++ b/gallery/googleplaystore_analytics/main.py @@ -1,9 +1,8 @@ -import streamlit as st - import dataset import intro import model import references +import streamlit as st import topic_modelling PAGES = { diff --git a/gallery/sudoku_solver/pyomo_sudoku_solver.py b/gallery/sudoku_solver/pyomo_sudoku_solver.py new file mode 100644 index 0000000..f95849f --- /dev/null +++ b/gallery/sudoku_solver/pyomo_sudoku_solver.py @@ -0,0 +1,81 @@ +import re + +import numpy as np +import pandas as pd +from pyomo import environ as pyo +from pyomo.dataportal import DataPortal +from pyomo.opt import SolverFactory + +import pyutilib.subprocess.GlobalData + +pyutilib.subprocess.GlobalData.DEFINE_SIGNAL_HANDLERS_DEFAULT = False + + +def solve_sudoku(known_cells): + known_cells.columns = ["i", "j", "k"] + + # The grid indices and possible values. + N = np.arange(1, 9 + 1) + + # Concrete model + model = pyo.ConcreteModel() + + # Variable + model.X = pyo.Var(N, N, N, within=pyo.Binary) + + # Constraints + model.row_constraint = pyo.ConstraintList() + model.col_constraint = pyo.ConstraintList() + model.block_constraint = pyo.ConstraintList() + model.allcells_constraint = pyo.ConstraintList() + model.knowncells_constraint = pyo.ConstraintList() + + # Rows + for i in N: + for k in N: + model.row_constraint.add(sum(model.X[i, j, k] for j in N) == 1) + + # Columns + for j in N: + for k in N: + model.col_constraint.add(sum(model.X[i, j, k] for i in N) == 1) + + # Blocks + for i in np.arange(1, 9, 3): + for j in np.arange(1, 9, 3): + for k in N: + model.block_constraint.add( + sum( + model.X[p, q, k] + for p in np.arange(i, i + 3) + for q in np.arange(j, j + 3) + ) + == 1 + ) + + # All cells + for i in N: + for j in N: + model.allcells_constraint.add(sum(model.X[i, j, k] for k in N) == 1) + + # Known cells + for i, j, k in zip(known_cells["i"], known_cells["j"], known_cells["k"]): + # if k != 0: + model.knowncells_constraint.add(model.X[i, j, k] == 1) + + # Objective (none) + model.objective = pyo.Objective(expr=1) + + # Solving + opt = SolverFactory("glpk") + solution = opt.solve(model) + + res = np.zeros((9, 9)) + + for v in model.component_data_objects(pyo.Var, active=True): + val = v.value + if val > 0: + i, j, k = [int(x) for x in re.findall("[0-9]", v.name)] + res[i - 1, j - 1] = k + + return res diff --git a/gallery/sudoku_solver/requirements.txt b/gallery/sudoku_solver/requirements.txt new file mode 100644 index 0000000..7db8e3d --- /dev/null +++ b/gallery/sudoku_solver/requirements.txt @@ -0,0 +1,5 @@ +numpy==1.19.4 +pandas==1.1.5 +pyomo==5.7.2 +glpk +streamlit==0.73.1 diff --git a/gallery/sudoku_solver/sudoku_solver.py b/gallery/sudoku_solver/sudoku_solver.py new file mode 100644 index 0000000..d5d20df --- /dev/null +++ b/gallery/sudoku_solver/sudoku_solver.py @@ -0,0 +1,67 @@ +""" +## Sudoku Solver + +A fast, interactive web application for solving Sudoku puzzles +using the optimization library Pyomo (https://www.pyomo.org/). + +Author: [Joshua Cook](https://joshuacook.netlify.app))\n +Source: [Github](https://github.com/jhrcook/streamlit-sudoku) +""" +import streamlit as st + +# Your imports goes below +import random +import re +from itertools import product + +import streamlit as st +import pandas as pd +import numpy as np +from gallery.sudoku_solver.pyomo_sudoku_solver import solve_sudoku +from gallery.sudoku_solver.ui_auxiliary import empty_board_str, board_matrix_to_dataframe + + +def main(): + st.title("Sudoku Solver") + st.markdown("A fast, interactive web application for solving Sudoku puzzles using the optimization library [Pyomo](https://www.pyomo.org/).") + + # Your code goes below + random.seed(0) + + input_data = st.text_area( + label="Enter the starting state of the board.", value=empty_board_str, height=400 + ) + + rows = np.repeat(np.arange(1, 10), 9) + cols = np.tile(np.arange(1, 10), 9) + values = [] + + for line in input_data.split("\n"): + if not "-" in line: + vals = re.findall("[0-9]", line.rstrip()) + values += [int(x) for x in vals] + + if len(rows) == len(cols) == len(values): + + known_cells = pd.DataFrame({"i": rows, "j": cols, "k": values}) + board = known_cells.copy() + + known_cells = known_cells[known_cells["k"] != 0] + + board.k = ["" if x == 0 else str(x) for x in board.k] + board = board.pivot(index="i", columns="j", values="k") + + if st.button("Solve!"): + st.markdown("**Solution**") + res = solve_sudoku(known_cells) + st.write(board_matrix_to_dataframe(res)) + else: + st.markdown("**Board layout**") + st.write(board) + + + else: + st.write("Something is wrong with the layout of the board. Please try again.") + + +main() diff --git a/gallery/sudoku_solver/ui_auxiliary.py b/gallery/sudoku_solver/ui_auxiliary.py new file mode 100644 index 0000000..e59a927 --- /dev/null +++ b/gallery/sudoku_solver/ui_auxiliary.py @@ -0,0 +1,21 @@ +import pandas as pd +import numpy as np + +empty_board_str = """------------------------- +| 0 0 0 | 0 0 0 | 0 0 0 | +| 0 0 0 | 0 0 0 | 0 0 0 | +| 0 0 0 | 0 0 0 | 0 0 0 | +------------------------- +| 0 0 0 | 0 0 0 | 0 0 0 | +| 0 0 0 | 0 0 0 | 0 0 0 | +| 0 0 0 | 0 0 0 | 0 0 0 | +------------------------- +| 0 0 0 | 0 0 0 | 0 0 0 | +| 0 0 0 | 0 0 0 | 0 0 0 | +| 0 0 0 | 0 0 0 | 0 0 0 | +-------------------------""" + + +def board_matrix_to_dataframe(ary): + df = pd.DataFrame(ary, columns=np.arange(1, 10)) + return df diff --git a/gallery/test_runner_app/test_runner_app.py b/gallery/test_runner_app/test_runner_app.py index e272086..df88b0f 100644 --- a/gallery/test_runner_app/test_runner_app.py +++ b/gallery/test_runner_app/test_runner_app.py @@ -2,9 +2,8 @@ # pylint: disable=invalid-name from typing import List -import streamlit as st - import awesome_streamlit as ast +import streamlit as st from awesome_streamlit.database.apps_in_gallery import GITHUB_RAW_GALLERY_URL from awesome_streamlit.testing.models import \ TesTItem # Special Capitalization is due to PyTest diff --git a/package/awesome_streamlit/core/services/other.py b/package/awesome_streamlit/core/services/other.py index 44f3420..faed4cb 100644 --- a/package/awesome_streamlit/core/services/other.py +++ b/package/awesome_streamlit/core/services/other.py @@ -11,7 +11,6 @@ from typing import Optional import streamlit as st - from awesome_streamlit.database.settings import GITHUB_RAW_URL diff --git a/package/awesome_streamlit/database/apps_in_gallery.py b/package/awesome_streamlit/database/apps_in_gallery.py index f999d88..c405dac 100644 --- a/package/awesome_streamlit/database/apps_in_gallery.py +++ b/package/awesome_streamlit/database/apps_in_gallery.py @@ -231,5 +231,12 @@ tags=[tags.CODE, tags.APP_IN_GALLERY], author=authors.STEFANO_TABACCO, ), + Resource( + name="Sudoku Solver", + url=GITHUB_RAW_GALLERY_URL + "sudoku_solver/sudoku_solver.py", + is_awesome=True, + tags=[tags.CODE, tags.APP_IN_GALLERY, tags.APP], + author=authors.JOSHUA_COOK, + ), DEFAULT_APP_IN_GALLERY, ] diff --git a/package/awesome_streamlit/database/authors.py b/package/awesome_streamlit/database/authors.py index 46652dd..4241743 100644 --- a/package/awesome_streamlit/database/authors.py +++ b/package/awesome_streamlit/database/authors.py @@ -43,6 +43,11 @@ ESTEE_TEY = Author(name="Tey Siew Wen", url="https://github.com/lyqht") COLLIN_PRATHER = Author(name="Collin Prather", url="https://github.com/collinprather") STEFANO_TABACCO = Author(name="Stefano Tabacco", url="https://github.com/stabacco") +JOSHUA_COOK = Author( + name="Joshua Cook", + url="https://joshuacook.netlify.app", + # github_url="https://github.com/dchudz", +) AUTHORS = [ ALEXANDRE_DOMINGUES, @@ -66,4 +71,5 @@ DOUG_GUTHRIE, ESTEE_TEY, STEFANO_TABACCO, + JOSHUA_COOK ] diff --git a/package/awesome_streamlit/database/resources.py b/package/awesome_streamlit/database/resources.py index 1b9cb9f..02c2907 100644 --- a/package/awesome_streamlit/database/resources.py +++ b/package/awesome_streamlit/database/resources.py @@ -667,6 +667,13 @@ tags=[tags.APP, tags.CODE], author=authors.COLLIN_PRATHER, ), + Resource( + "Creating a Streamlit web app, building with Docker + GitHub Actions, and hosting on Heroku", + url="https://joshuacook.netlify.app/post/streamlit-app-heroku/", + is_awesome=True, + tags=[tags.TUTORIAL, tags.ARTICLE, tags.DEPLOYMENT, tags.GUIDE], + author=authors.JOSHUA_COOK, + ), ] + STREAMLIT_EXAMPLE_APPS + STREAMLIT_EXAMPLE_APPS_FAILED_TEST diff --git a/package/awesome_streamlit/testing/components.py b/package/awesome_streamlit/testing/components.py index 9f240ba..4db522a 100644 --- a/package/awesome_streamlit/testing/components.py +++ b/package/awesome_streamlit/testing/components.py @@ -3,7 +3,6 @@ from typing import Callable, List import streamlit as st - from awesome_streamlit.testing import services from awesome_streamlit.testing.models import TesTItem diff --git a/package/awesome_streamlit/testing/services/test_item.py b/package/awesome_streamlit/testing/services/test_item.py index 94cf93f..6cf8810 100644 --- a/package/awesome_streamlit/testing/services/test_item.py +++ b/package/awesome_streamlit/testing/services/test_item.py @@ -9,7 +9,6 @@ from typing import List import streamlit as st - from awesome_streamlit import database from awesome_streamlit.shared.models import Resource from awesome_streamlit.testing.models import TesTItem diff --git a/package/awesome_streamlit/testing/services/test_items_dataframe.py b/package/awesome_streamlit/testing/services/test_items_dataframe.py index 62b1589..16f5d0e 100644 --- a/package/awesome_streamlit/testing/services/test_items_dataframe.py +++ b/package/awesome_streamlit/testing/services/test_items_dataframe.py @@ -6,7 +6,6 @@ import pandas as pd import streamlit as st - from awesome_streamlit.testing.models import TesTItem diff --git a/package/setup.py b/package/setup.py index 2682999..3eeaf45 100644 --- a/package/setup.py +++ b/package/setup.py @@ -6,7 +6,7 @@ """ import pathlib -from setuptools import setup, find_packages +from setuptools import find_packages, setup README_FILE_PATH = pathlib.Path(__file__).parent / "README.md" with open(README_FILE_PATH) as f: diff --git a/package/tests/core/test_services.py b/package/tests/core/test_services.py index 239cfbd..bb58680 100644 --- a/package/tests/core/test_services.py +++ b/package/tests/core/test_services.py @@ -2,7 +2,6 @@ import urllib.request import pytest - from awesome_streamlit.core import services diff --git a/package/tests/shared/test_models.py b/package/tests/shared/test_models.py index 692bea3..4855711 100644 --- a/package/tests/shared/test_models.py +++ b/package/tests/shared/test_models.py @@ -1,6 +1,5 @@ """Test of the models""" import pytest - from awesome_streamlit.shared.models import Author, Resource, Tag diff --git a/package/tests/testing/test_models.py b/package/tests/testing/test_models.py index adad8dd..8fff082 100644 --- a/package/tests/testing/test_models.py +++ b/package/tests/testing/test_models.py @@ -1,9 +1,9 @@ """Here we test the models in the testing package""" import pytest - # pylint: disable=redefined-outer-name from awesome_streamlit.shared.models import Author, Resource, Tag from awesome_streamlit.testing.models import TesTItem + from tests.testing.test_module_example_folder import test_module_example_file diff --git a/package/tests/testing/test_utils.py b/package/tests/testing/test_utils.py index f2fe8c4..e96af27 100644 --- a/package/tests/testing/test_utils.py +++ b/package/tests/testing/test_utils.py @@ -2,7 +2,6 @@ import pathlib import pytest - from awesome_streamlit.testing import utils from . import test_module_example_folder diff --git a/requirements_base.txt b/requirements_base.txt index 817b2a4..658f268 100644 --- a/requirements_base.txt +++ b/requirements_base.txt @@ -76,3 +76,4 @@ docformatter==1.3.1 pycodestyle==2.6.0 yapf==0.30.0 pyformat==0.7.0 +pyomo==5.7.2 diff --git a/scratchpad/issue2/problem1/a.py b/scratchpad/issue2/problem1/a.py index e987670..9f87eb9 100644 --- a/scratchpad/issue2/problem1/a.py +++ b/scratchpad/issue2/problem1/a.py @@ -1,10 +1,9 @@ """This module provides a reference test example for https://github.com/MarcSkovMadsen/awesome-streamlit/issues/2""" -import streamlit as st - import bf4.b4 as b4_new_name # Hot reload works in b4.py file import bf.b # Hot reloading works in b.py file import st_extensions # Hot reloading works in st_extensions.py file +import streamlit as st from bf2 import b2 # Hot reload does not work in b2.py file from bf3 import b3 as b3_new_name # Hot reload does not work in b3.py file diff --git a/scratchpad/issue2/problem1/bf/b.py b/scratchpad/issue2/problem1/bf/b.py index 936f9b8..767c284 100644 --- a/scratchpad/issue2/problem1/bf/b.py +++ b/scratchpad/issue2/problem1/bf/b.py @@ -1,5 +1,4 @@ import streamlit as st - from bf.cf import c diff --git a/scratchpad/issue2/problem1/bf/cf/c.py b/scratchpad/issue2/problem1/bf/cf/c.py index 63dab89..cb3a617 100644 --- a/scratchpad/issue2/problem1/bf/cf/c.py +++ b/scratchpad/issue2/problem1/bf/cf/c.py @@ -1,5 +1,4 @@ import streamlit as st - from bf.cf.df import d diff --git a/scripts/take_screenshots_of_resources.py b/scripts/take_screenshots_of_resources.py index 6cb05ea..3b110c0 100644 --- a/scripts/take_screenshots_of_resources.py +++ b/scripts/take_screenshots_of_resources.py @@ -4,11 +4,10 @@ import time import urllib.request +import awesome_streamlit as ast from PIL import Image from selenium import webdriver -import awesome_streamlit as ast - ROOT = pathlib.Path(__file__).parent.parent / "assets/resources_screenshots" FILE = ROOT / "resource_urls.txt" diff --git a/src/pages/about.py b/src/pages/about.py index 9df4640..9c84bf2 100644 --- a/src/pages/about.py +++ b/src/pages/about.py @@ -1,7 +1,6 @@ """Home page shown when the user enters the application""" -import streamlit as st - import awesome_streamlit as ast +import streamlit as st # pylint: disable=line-too-long diff --git a/src/pages/gallery/index.py b/src/pages/gallery/index.py index a08b6bd..57e4596 100644 --- a/src/pages/gallery/index.py +++ b/src/pages/gallery/index.py @@ -9,9 +9,8 @@ import logging from typing import List -import streamlit as st - import awesome_streamlit as ast +import streamlit as st # Get an instance of a logger logging.basicConfig(format="%(asctime)s - %(message)s", level=logging.INFO) diff --git a/src/pages/home.py b/src/pages/home.py index beb0dc8..2aebbb3 100644 --- a/src/pages/home.py +++ b/src/pages/home.py @@ -1,7 +1,6 @@ """Home page shown when the user enters the application""" -import streamlit as st - import awesome_streamlit as ast +import streamlit as st # pylint: disable=line-too-long diff --git a/src/pages/resources.py b/src/pages/resources.py index 95d94ce..e7bbbd9 100644 --- a/src/pages/resources.py +++ b/src/pages/resources.py @@ -1,9 +1,8 @@ """This page is for searching and viewing the list of awesome resources""" import logging -import streamlit as st - import awesome_streamlit as ast +import streamlit as st from awesome_streamlit.core.services import resources logging.basicConfig(format="%(asctime)s - %(message)s", level=logging.INFO) diff --git a/src/pages/vision.py b/src/pages/vision.py index a3ddfea..c300220 100644 --- a/src/pages/vision.py +++ b/src/pages/vision.py @@ -1,9 +1,8 @@ """Page for viewing the awesome Streamlit vision""" import pathlib -import streamlit as st - import awesome_streamlit as ast +import streamlit as st @st.cache diff --git a/tasks/__init__.py b/tasks/__init__.py index d9dbe30..f70cddb 100644 --- a/tasks/__init__.py +++ b/tasks/__init__.py @@ -1,7 +1,7 @@ """Here we import the different task submodules/ collections""" from invoke import Collection, task -from tasks import docker, package, sphinx, test # pylint: disable=import-self +from tasks import docker, package, sphinx, test # pylint: disable=import-self # pylint: disable=invalid-name # as invoke only recognizes lower case