Source code for titbit

"""A place to dump things that might be useful in the future, 
but we're not sure enough to find a proper home for it yet.

To make it easy to copy/paste the code elsewhere, include the import statements
within the functions/objects that use them, when possible.
"""

from titbit.ast_utils import (
    rename_variables,
    bound_properties_refactor,
    BoundPropertiesRefactor,
    ensure_ast,
    filter_code,
)

from titbit.graphs import (
    mermaid_to_graphviz,
    attribute_dependency_graph,
    update_node_attributes,
)

from titbit.strings import md_toc_string


from titbit.mappings import generate_key_values


[docs] def git_action_on_projects( projects, action='pull', *, on_error=lambda project, e: print(f'Error with {project=}: {e}'), egress=lambda result: result.stdout, ): """Take git actions all the projects in the list of projects. A project can be a folder path or a module, or the name of a module/package. :param folders: list of projects Usage: >>> projects = [ ... some_package, "some_package_name", "some_package_dir_path" ... ] # doctest: +SKIP >>> # By default, the git action performed is to pull >>> git_action_on_projects(projects) # doctest: +SKIP """ import os import subprocess def _pkg_folder_of_module(module): if hasattr(module, '__path__'): return os.path.dirname(module.__path__[0]) elif isinstance(module, str): return _pkg_folder_of_module(__import__(module)) else: raise ValueError(f"Can't resolve this module to a folder: {module}") def _resolve_folder(project): if os.path.isdir(project): return project else: return _pkg_folder_of_module(project) def _git_action(project): folder = _resolve_folder(project) try: # Execute git pull in the specified folder result = subprocess.run( ['git', '-C', folder, action], check=True, text=True, capture_output=True, ) return egress(result) except subprocess.CalledProcessError as e: print(f'Failed {action=} on {folder}: {e}') except Exception as e: print(f'An error occurred with {folder}: {e}') for project in projects: try: yield _git_action(project) except Exception as e: if on_error: on_error(project, e)