sweatstack 0.26.0__py3-none-any.whl → 0.28.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
sweatstack/streamlit.py CHANGED
@@ -39,36 +39,42 @@ class StreamlitAuth:
39
39
  st.session_state.pop("sweatstack_api_key")
40
40
  st.rerun()
41
41
 
42
+ def _running_on_streamlit_cloud(self):
43
+ return os.environ.get("HOSTNAME") == "streamlit"
44
+
42
45
  def _show_sweatstack_login(self):
43
46
  authorization_url = self._get_authorization_url()
44
- st.markdown(
45
- f"""
46
- <style>
47
- .animated-button {{
48
- }}
49
- .animated-button:hover {{
50
- transform: scale(1.05);
51
- }}
52
- .animated-button:active {{
53
- transform: scale(1);
54
- }}
55
- </style>
56
- <a href="{authorization_url}"
57
- target="_top"
58
- class="animated-button"
59
- style="display: inline-block;
60
- padding: 10px 20px;
61
- background-color: #EF2B2D;
62
- color: white;
63
- text-decoration: none;
64
- border-radius: 6px;
65
- border: none;
66
- transition: all 0.3s ease;
67
- cursor: pointer;"
68
- >Login with SweatStack</a>
69
- """,
70
- unsafe_allow_html=True,
71
- )
47
+ if not self._running_on_streamlit_cloud():
48
+ st.markdown(
49
+ f"""
50
+ <style>
51
+ .animated-button {{
52
+ }}
53
+ .animated-button:hover {{
54
+ transform: scale(1.05);
55
+ }}
56
+ .animated-button:active {{
57
+ transform: scale(1);
58
+ }}
59
+ </style>
60
+ <a href="{authorization_url}"
61
+ target="_top"
62
+ class="animated-button"
63
+ style="display: inline-block;
64
+ padding: 10px 20px;
65
+ background-color: #EF2B2D;
66
+ color: white;
67
+ text-decoration: none;
68
+ border-radius: 6px;
69
+ border: none;
70
+ transition: all 0.3s ease;
71
+ cursor: pointer;"
72
+ >Login with SweatStack</a>
73
+ """,
74
+ unsafe_allow_html=True,
75
+ )
76
+ else:
77
+ st.link_button("Login with SweatStack", authorization_url)
72
78
 
73
79
  def _get_authorization_url(self):
74
80
  params = {
@@ -82,6 +88,11 @@ class StreamlitAuth:
82
88
 
83
89
  return authorization_url
84
90
 
91
+ def _set_api_key(self, api_key):
92
+ self.api_key = api_key
93
+ st.session_state["sweatstack_api_key"] = api_key
94
+ self.client = Client(self.api_key, streamlit_compatible=True)
95
+
85
96
  def _exchange_token(self, code):
86
97
  token_data = {
87
98
  "grant_type": "authorization_code",
@@ -101,10 +112,7 @@ class StreamlitAuth:
101
112
  raise Exception(f"SweatStack Python login failed. Please try again.") from e
102
113
  token_response = response.json()
103
114
 
104
- self.api_key = token_response.get("access_token")
105
- st.session_state["sweatstack_api_key"] = self.api_key
106
-
107
- self.client = Client(self.api_key, streamlit_compatible=True)
115
+ self._set_api_key(token_response.get("access_token"))
108
116
 
109
117
  return
110
118
 
@@ -122,4 +130,21 @@ class StreamlitAuth:
122
130
  st.query_params.clear()
123
131
  st.rerun()
124
132
  else:
125
- self._show_sweatstack_login()
133
+ self._show_sweatstack_login()
134
+
135
+ def switch_user(self):
136
+ self.switch_back()
137
+ other_users = self.client.get_users()
138
+ selected_user = st.selectbox(
139
+ "Select a user",
140
+ other_users,
141
+ format_func=lambda user: user.display_name,
142
+ )
143
+ self.client.switch_user(selected_user)
144
+ self._set_api_key(self.client.api_key)
145
+
146
+ return selected_user
147
+
148
+ def switch_back(self):
149
+ self.client.switch_back()
150
+ self._set_api_key(self.client.api_key)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sweatstack
3
- Version: 0.26.0
3
+ Version: 0.28.0
4
4
  Summary: The official Python client for SweatStack
5
5
  Author-email: Aart Goossens <aart@gssns.io>
6
6
  Requires-Python: >=3.9
@@ -7,11 +7,11 @@ sweatstack/jupyterlab_oauth2_startup.py,sha256=eZ6xi0Sa4hO4vUanimq0SqjduHtiywCUR
7
7
  sweatstack/openapi_schemas.py,sha256=XlgiL7qkfcfoDHcQrIm9e5hvhY98onC0QmZWG69bl-s,13441
8
8
  sweatstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  sweatstack/schemas.py,sha256=CArM9jgrJDBUT-ZIIiGN_insqaEGV43MX134Ezf4jyA,103
10
- sweatstack/streamlit.py,sha256=Z6nS0R4TwdPHrpGDgXmyCoqhDOQzN-3jp1RtKQIxiSU,4619
10
+ sweatstack/streamlit.py,sha256=z4xggT1igrTLQCPMQeCBbXUnC2w35dFSH3NSQRVrZgc,5527
11
11
  sweatstack/sweatshell.py,sha256=MYLNcWbOdceqKJ3S0Pe8dwHXEeYsGJNjQoYUXpMTftA,333
12
12
  sweatstack/utils.py,sha256=HtR1NNCKus59vfgfaCSFS-tHA11mtdcuUx5lS6ZX58g,1773
13
13
  sweatstack/Sweat Stack examples/Getting started.ipynb,sha256=k2hiSffWecoQ0VxjdpDcgFzBXDQiYEebhnAYlu8cgX8,6335204
14
- sweatstack-0.26.0.dist-info/METADATA,sha256=6IcxRIyFIVQ27l67nUOJwW-SzVb17vmQ1g4B81zdvDU,775
15
- sweatstack-0.26.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
- sweatstack-0.26.0.dist-info/entry_points.txt,sha256=kCzOUQI3dqbTpEYqtgYDeiKFaqaA7BMlV6D24BMzCFU,208
17
- sweatstack-0.26.0.dist-info/RECORD,,
14
+ sweatstack-0.28.0.dist-info/METADATA,sha256=o6fVjDMx337xaw9ujyRtRtfWIaNTdIU4FjrAMe9zMjw,775
15
+ sweatstack-0.28.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ sweatstack-0.28.0.dist-info/entry_points.txt,sha256=kCzOUQI3dqbTpEYqtgYDeiKFaqaA7BMlV6D24BMzCFU,208
17
+ sweatstack-0.28.0.dist-info/RECORD,,