Skip to content

Instantly share code, notes, and snippets.

@ash2shukla
Last active February 27, 2024 06:00
Show Gist options
  • Select an option

  • Save ash2shukla/ff180d7fbe8ec3a0240f19f4452acde7 to your computer and use it in GitHub Desktop.

Select an option

Save ash2shukla/ff180d7fbe8ec3a0240f19f4452acde7 to your computer and use it in GitHub Desktop.

Revisions

  1. ash2shukla revised this gist Dec 15, 2020. 1 changed file with 33 additions and 2 deletions.
    35 changes: 33 additions & 2 deletions state.py
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,8 @@
    from streamlit.report_thread import get_report_ctx
    from streamlit.hashing import _CodeHasher
    from streamlit.server.server import Server

    from prometheus_client.registry import REGISTRY
    from prometheus_client import Counter


    class _SessionState:
    @@ -79,13 +80,43 @@ def get_state(hash_funcs=None):
    return session._custom_session_state


    def _get_names(collector_name, collector_type):
    result = []
    type_suffixes = {
    'counter': ['_total', '_created'],
    'summary': ['_sum', '_count', '_created'],
    'histogram': ['_bucket', '_sum', '_count', '_created'],
    'gaugehistogram': ['_bucket', '_gsum', '_gcount'],
    'info': ['_info'],
    }
    for suffix in type_suffixes.get(collector_type, []):
    result.append(collector_name + suffix)
    return result


    def get_or_create_metric(metric_type, *, name, **kwargs):
    names = _get_names(name, metric_type.__name__.lower())
    if any(name in REGISTRY._names_to_collectors for name in names):
    return REGISTRY._names_to_collectors[names[0]]
    else:
    return metric_type(name=name, **kwargs)



    def provide_state(func):
    def wrapper(*args, **kwargs):
    state = get_state(hash_funcs={})
    count_sessions()
    return_value = func(state=state, *args, **kwargs)
    state.sync()
    return return_value

    return wrapper
    return wrapper

    def count_sessions():
    state = get_state(hash_funcs={})
    session_counter = get_or_create_metric(Counter, name='session_count', documentation='Unique Sessions')

    if not state._is_session_reused:
    session_counter.inc()
    state._is_session_reused = True
  2. ash2shukla revised this gist Dec 7, 2020. 1 changed file with 0 additions and 19 deletions.
    19 changes: 0 additions & 19 deletions state.py
    Original file line number Diff line number Diff line change
    @@ -1,26 +1,7 @@
    from streamlit.report_thread import get_report_ctx
    from streamlit.hashing import _CodeHasher
    from streamlit.server.server import Server
    from abc import ABC, abstractmethod
    import streamlit as st
    import typing
    import base64
    from datetime import datetime
    from copy import deepcopy

    import numpy as np
    import pandas as pd
    import pymongo
    from lasio.las import HeaderItem
    from prometheus_client import Gauge, Summary




    class Page(ABC):
    @abstractmethod
    def write(self):
    pass


    class _SessionState:
  3. ash2shukla created this gist Oct 1, 2020.
    110 changes: 110 additions & 0 deletions state.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,110 @@
    from streamlit.report_thread import get_report_ctx
    from streamlit.hashing import _CodeHasher
    from streamlit.server.server import Server
    from abc import ABC, abstractmethod
    import streamlit as st
    import typing
    import base64
    from datetime import datetime
    from copy import deepcopy

    import numpy as np
    import pandas as pd
    import pymongo
    from lasio.las import HeaderItem
    from prometheus_client import Gauge, Summary




    class Page(ABC):
    @abstractmethod
    def write(self):
    pass


    class _SessionState:
    def __init__(self, session, hash_funcs):
    """Initialize SessionState instance."""
    self.__dict__["_state"] = {
    "data": {},
    "hash": None,
    "hasher": _CodeHasher(hash_funcs),
    "is_rerun": False,
    "session": session,
    }

    def __call__(self, **kwargs):
    """Initialize state data once."""
    for item, value in kwargs.items():
    if item not in self._state["data"]:
    self._state["data"][item] = value

    def __getitem__(self, item):
    """Return a saved state value, None if item is undefined."""
    return self._state["data"].get(item, None)

    def __getattr__(self, item):
    """Return a saved state value, None if item is undefined."""
    return self._state["data"].get(item, None)

    def __setitem__(self, item, value):
    """Set state value."""
    self._state["data"][item] = value

    def __setattr__(self, item, value):
    """Set state value."""
    self._state["data"][item] = value

    def clear(self):
    """Clear session state and request a rerun."""
    self._state["data"].clear()
    self._state["session"].request_rerun()

    def sync(self):
    """Rerun the app with all state values up to date from the beginning to fix rollbacks."""

    # Ensure to rerun only once to avoid infinite loops
    # caused by a constantly changing state value at each run.
    #
    # Example: state.value += 1
    if self._state["is_rerun"]:
    self._state["is_rerun"] = False

    elif self._state["hash"] is not None:
    if self._state["hash"] != self._state["hasher"].to_bytes(
    self._state["data"], None
    ):
    self._state["is_rerun"] = True
    self._state["session"].request_rerun()

    self._state["hash"] = self._state["hasher"].to_bytes(self._state["data"], None)


    def _get_session():
    session_id = get_report_ctx().session_id
    session_info = Server.get_current()._get_session_info(session_id)

    if session_info is None:
    raise RuntimeError("Couldn't get your Streamlit Session object.")

    return session_info.session

    def get_state(hash_funcs=None):
    session = _get_session()

    if not hasattr(session, "_custom_session_state"):
    session._custom_session_state = _SessionState(session, hash_funcs)
    return session._custom_session_state




    def provide_state(func):
    def wrapper(*args, **kwargs):
    state = get_state(hash_funcs={})
    return_value = func(state=state, *args, **kwargs)
    state.sync()
    return return_value

    return wrapper