Source code for action_updater.main.client

__author__ = "Vanessa Sochat"
__copyright__ = "Copyright 2022, Vanessa Sochat"
__license__ = "MPL 2.0"

import os

from rich.console import Console

import action_updater.utils as utils

from .action import GitHubAction
from .settings import Settings
from .updater import UpdaterFinder


[docs]class ActionUpdater: """ Create a GitHub updater """ def __init__(self, quiet=False, token=None, settings_file=None, **kwargs): self.token = token self._updaters = {} self.quiet = quiet self.c = Console() # If using for a GitHub action, a global flag that indicates changes self.has_changes = False # If we don't have default settings, load if not hasattr(self, "settings"): self.settings = Settings(settings_file) @property def updaters(self): """ Get a list of updaters available """ if not self._updaters: # All updaters can be provided with the GitHub token self.finder = UpdaterFinder() self._updaters = {} for name, updaterClass in self.finder.items(): # Instantiate an updater for the path, provide settings self._updaters[name] = updaterClass(token=self.token, settings=self.settings) return self._updaters
[docs] def iter_paths(self, paths): """ Helper function to flexibly handle parsing paths. """ # Ensure we start from a list if not isinstance(paths, list): paths = [paths] final = set() # Run each updater on each path for path in paths: if os.path.exists(path) and os.path.isfile(path): final.add(path) continue for filename in utils.recursive_find(path, "[.](yaml|yml)"): final.add(filename) return list(final)
[docs] def detect(self, paths, details=True, updaters=None): """ Look for changes in files according to updaters """ actions = {} for path in self.iter_paths(paths): # Load into GitHub action action = GitHubAction(path) self.c.print(f"⭐️ [yellow]{path}[/yellow]") # Todo convert this into an iter function (shared between detect and update) for _, updater in self.updaters.items(): # Skip updaters per request of the user if updaters and updater.slug not in updaters: continue # The count reflects the last run if updater.detect(action): self.c.print(f"[red]✖️ {updater.title} Updater: {updater.count} updates[/red]") self.has_changes = True else: self.c.print(f"[green]✔ {updater.title}: No updates[/green]") # If we want to show details: if details: action.diff(self.settings.code_theme or "vim") actions[path] = action return actions
[docs] def update(self, paths, details=True, updaters=None): """ Update files. """ actions = self.detect(paths, details=details, updaters=updaters) for path, action in actions.items(): if action.has_changes: self.c.print(f"[purple]❇ Writing updated {path}[/purple]") action.write(path, line_length=self.settings.line_length)
def __repr__(self): return str(self) def __str__(self): return "[action-updater]"