mirror of
				https://github.com/aykhans/AzSuicideDataVisualization.git
				synced 2025-10-31 10:09:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			199 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright 2018-2022 Streamlit Inc.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #    http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| 
 | |
| import contextlib
 | |
| import errno
 | |
| import io
 | |
| import os
 | |
| 
 | |
| import fnmatch
 | |
| 
 | |
| from streamlit import env_util
 | |
| from streamlit import util
 | |
| from streamlit.string_util import is_binary_string
 | |
| 
 | |
| # Configuration and credentials are stored inside the ~/.streamlit folder
 | |
| CONFIG_FOLDER_NAME = ".streamlit"
 | |
| 
 | |
| 
 | |
| def get_encoded_file_data(data, encoding="auto"):
 | |
|     """Coerce bytes to a BytesIO or a StringIO.
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     data : bytes
 | |
|     encoding : str
 | |
| 
 | |
|     Returns
 | |
|     -------
 | |
|     BytesIO or StringIO
 | |
|         If the file's data is in a well-known textual format (or if the encoding
 | |
|         parameter is set), return a StringIO. Otherwise, return BytesIO.
 | |
| 
 | |
|     """
 | |
|     if encoding == "auto":
 | |
|         if is_binary_string(data):
 | |
|             encoding = None
 | |
|         else:
 | |
|             # If the file does not look like a pure binary file, assume
 | |
|             # it's utf-8. It would be great if we could guess it a little
 | |
|             # more smartly here, but it is what it is!
 | |
|             encoding = "utf-8"
 | |
| 
 | |
|     if encoding:
 | |
|         return io.StringIO(data.decode(encoding))
 | |
| 
 | |
|     return io.BytesIO(data)
 | |
| 
 | |
| 
 | |
| @contextlib.contextmanager
 | |
| def streamlit_read(path, binary=False):
 | |
|     """Opens a context to read this file relative to the streamlit path.
 | |
| 
 | |
|     For example:
 | |
| 
 | |
|     with streamlit_read('foo.txt') as foo:
 | |
|         ...
 | |
| 
 | |
|     opens the file `%s/foo.txt`
 | |
| 
 | |
|     path   - the path to write to (within the streamlit directory)
 | |
|     binary - set to True for binary IO
 | |
|     """ % CONFIG_FOLDER_NAME
 | |
|     filename = get_streamlit_file_path(path)
 | |
|     if os.stat(filename).st_size == 0:
 | |
|         raise util.Error('Read zero byte file: "%s"' % filename)
 | |
| 
 | |
|     mode = "r"
 | |
|     if binary:
 | |
|         mode += "b"
 | |
|     with open(os.path.join(CONFIG_FOLDER_NAME, path), mode) as handle:
 | |
|         yield handle
 | |
| 
 | |
| 
 | |
| @contextlib.contextmanager
 | |
| def streamlit_write(path, binary=False):
 | |
|     """
 | |
|     Opens a file for writing within the streamlit path, and
 | |
|     ensuring that the path exists. For example:
 | |
| 
 | |
|         with streamlit_write('foo/bar.txt') as bar:
 | |
|             ...
 | |
| 
 | |
|     opens the file %s/foo/bar.txt for writing,
 | |
|     creating any necessary directories along the way.
 | |
| 
 | |
|     path   - the path to write to (within the streamlit directory)
 | |
|     binary - set to True for binary IO
 | |
|     """ % CONFIG_FOLDER_NAME
 | |
|     mode = "w"
 | |
|     if binary:
 | |
|         mode += "b"
 | |
|     path = get_streamlit_file_path(path)
 | |
|     os.makedirs(os.path.dirname(path), exist_ok=True)
 | |
|     try:
 | |
|         with open(path, mode) as handle:
 | |
|             yield handle
 | |
|     except OSError as e:
 | |
|         msg = ["Unable to write file: %s" % os.path.abspath(path)]
 | |
|         if e.errno == errno.EINVAL and env_util.IS_DARWIN:
 | |
|             msg.append(
 | |
|                 "Python is limited to files below 2GB on OSX. "
 | |
|                 "See https://bugs.python.org/issue24658"
 | |
|             )
 | |
|         raise util.Error("\n".join(msg))
 | |
| 
 | |
| 
 | |
| def get_static_dir():
 | |
|     """Get the folder where static HTML/JS/CSS files live."""
 | |
|     dirname = os.path.dirname(os.path.normpath(__file__))
 | |
|     return os.path.normpath(os.path.join(dirname, "static"))
 | |
| 
 | |
| 
 | |
| def get_assets_dir():
 | |
|     """Get the folder where static assets live."""
 | |
|     dirname = os.path.dirname(os.path.normpath(__file__))
 | |
|     return os.path.normpath(os.path.join(dirname, "static/assets"))
 | |
| 
 | |
| 
 | |
| def get_streamlit_file_path(*filepath) -> str:
 | |
|     """Return the full path to a file in ~/.streamlit.
 | |
| 
 | |
|     This doesn't guarantee that the file (or its directory) exists.
 | |
|     """
 | |
|     # os.path.expanduser works on OSX, Linux and Windows
 | |
|     home = os.path.expanduser("~")
 | |
|     if home is None:
 | |
|         raise RuntimeError("No home directory.")
 | |
| 
 | |
|     return os.path.join(home, CONFIG_FOLDER_NAME, *filepath)
 | |
| 
 | |
| 
 | |
| def get_project_streamlit_file_path(*filepath):
 | |
|     """Return the full path to a filepath in ${CWD}/.streamlit.
 | |
| 
 | |
|     This doesn't guarantee that the file (or its directory) exists.
 | |
|     """
 | |
|     return os.path.join(os.getcwd(), CONFIG_FOLDER_NAME, *filepath)
 | |
| 
 | |
| 
 | |
| def file_is_in_folder_glob(filepath, folderpath_glob) -> bool:
 | |
|     """Test whether a file is in some folder with globbing support.
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     filepath : str
 | |
|         A file path.
 | |
|     folderpath_glob: str
 | |
|         A path to a folder that may include globbing.
 | |
| 
 | |
|     """
 | |
|     # Make the glob always end with "/*" so we match files inside subfolders of
 | |
|     # folderpath_glob.
 | |
|     if not folderpath_glob.endswith("*"):
 | |
|         if folderpath_glob.endswith("/"):
 | |
|             folderpath_glob += "*"
 | |
|         else:
 | |
|             folderpath_glob += "/*"
 | |
| 
 | |
|     file_dir = os.path.dirname(filepath) + "/"
 | |
|     return fnmatch.fnmatch(file_dir, folderpath_glob)
 | |
| 
 | |
| 
 | |
| def file_in_pythonpath(filepath) -> bool:
 | |
|     """Test whether a filepath is in the same folder of a path specified in the PYTHONPATH env variable.
 | |
| 
 | |
| 
 | |
|     Parameters
 | |
|     ----------
 | |
|     filepath : str
 | |
|         An absolute file path.
 | |
| 
 | |
|     Returns
 | |
|     -------
 | |
|     boolean
 | |
|         True if contained in PYTHONPATH, False otherwise. False if PYTHONPATH is not defined or empty.
 | |
| 
 | |
|     """
 | |
| 
 | |
|     pythonpath = os.environ.get("PYTHONPATH", "")
 | |
|     if len(pythonpath) == 0:
 | |
|         return False
 | |
| 
 | |
|     absolute_paths = [os.path.abspath(path) for path in pythonpath.split(os.pathsep)]
 | |
|     return any(
 | |
|         file_is_in_folder_glob(os.path.normpath(filepath), path)
 | |
|         for path in absolute_paths
 | |
|     )
 | 
