From 44b07158c514a22c0097d6566eda053c07431c37 Mon Sep 17 00:00:00 2001 From: El Mau Date: Sat, 26 Feb 2022 22:22:11 -0600 Subject: [PATCH] Doc for paths --- docs/source/_static/images/path_01.png | Bin 0 -> 38339 bytes docs/source/_static/images/path_02.png | Bin 0 -> 18983 bytes docs/source/_static/images/path_03.png | Bin 0 -> 25667 bytes docs/source/generated/easymacro.rst | 4 + docs/source/index.rst | 1 + docs/source/paths.rst | 101 +++++ docs/source/tools.rst | 131 ++++++- source/easymacro.py | 513 +++++++++++++++++++++---- 8 files changed, 663 insertions(+), 87 deletions(-) create mode 100644 docs/source/_static/images/path_01.png create mode 100644 docs/source/_static/images/path_02.png create mode 100644 docs/source/_static/images/path_03.png create mode 100644 docs/source/paths.rst diff --git a/docs/source/_static/images/path_01.png b/docs/source/_static/images/path_01.png new file mode 100644 index 0000000000000000000000000000000000000000..bfdb76f0e61aca9495bfa0d7bd3b160ecec04448 GIT binary patch literal 38339 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 V?$p6H3NZOe&e0xYS7z%I_ZN*56wUwu literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/path_03.png b/docs/source/_static/images/path_03.png new file mode 100644 index 0000000000000000000000000000000000000000..8667d23b2c8db5b231d18257f2bc1df06ef1499a GIT binary patch literal 25667 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 None: - """Show messages debug - - :param messages: List of messages to debug - :type messages: list[Any] - """ - - data = [str(m) for m in messages] - log.debug('\t'.join(data)) - return - - -def error(message: Any) -> None: - """Show message error - - :param message: The message error - :type message: Any - """ - - log.error(message) - return - - -def info(*messages) -> None: - """Show messages info - - :param messages: List of messages to debug - :type messages: list[Any] - """ - - data = [str(m) for m in messages] - log.info('\t'.join(data)) - return - - -def save_log(path: str, data: Any) -> None: - """Save data in file, data append to end and automatic add current time. - - :param path: Path to save log - :type path: str - :param data: Data to save in file log - :type data: Any - """ - - with open(path, 'a') as f: - f.write(f'{str(now())[:19]} - ') - pprint(data, stream=f) - return - - def create_instance(name: str, with_context: bool=False, argument: Any=None) -> Any: """Create a service instance @@ -183,6 +143,22 @@ def get_app_config(node_name: str, key: str='') -> Any: return value +# Get info LibO +NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName') +VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion') +LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale') +LANG = LANGUAGE.split('-')[0] + +INFO_DEBUG = f"{NAME} v{VERSION} {LANGUAGE}\n\n{_info_debug}" + +# Get start date from Calc configuration +node = '/org.openoffice.Office.Calc/Calculate/Other/Date' +year = get_app_config(node, 'YY') +month = get_app_config(node, 'MM') +day = get_app_config(node, 'DD') +DATE_OFFSET = datetime.date(year, month, day).toordinal() + + def set_app_config(node_name: str, key: str, new_value: Any) -> Any: """Update value for key in node name. @@ -217,6 +193,56 @@ def set_app_config(node_name: str, key: str, new_value: Any) -> Any: return result +def debug(*messages) -> None: + """Show messages debug + + :param messages: List of messages to debug + :type messages: list[Any] + """ + + data = [str(m) for m in messages] + log.debug('\t'.join(data)) + return + + +def error(message: Any) -> None: + """Show message error + + :param message: The message error + :type message: Any + """ + + log.error(message) + return + + +def info(*messages) -> None: + """Show messages info + + :param messages: List of messages to debug + :type messages: list[Any] + """ + + data = [str(m) for m in messages] + log.info('\t'.join(data)) + return + + +def save_log(path: str, data: Any) -> None: + """Save data in file, data append to end and automatic add current time. + + :param path: Path to save log + :type path: str + :param data: Data to save in file log + :type data: Any + """ + + with open(path, 'a') as f: + f.write(f'{str(now())[:19]} - ') + pprint(data, stream=f) + return + + def _set_app_command(command: str, disable: bool): NEW_NODE_NAME = f'zaz_disable_command_{command.lower()}' name = 'com.sun.star.configuration.ConfigurationProvider' @@ -270,22 +296,6 @@ class commands(): return _set_app_command(self._command, False) -# Get info LibO -NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName') -VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion') -LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale') -LANG = LANGUAGE.split('-')[0] - -INFO_DEBUG = f"{NAME} v{VERSION} {LANGUAGE}\n\n{_info_debug}" - -# Get start date from Calc configuration -node = '/org.openoffice.Office.Calc/Calculate/Other/Date' -year = get_app_config(node, 'YY') -month = get_app_config(node, 'MM') -day = get_app_config(node, 'DD') -DATE_OFFSET = datetime.date(year, month, day).toordinal() - - def mri(obj: Any) -> None: """Inspect object with MRI Extension @@ -487,6 +497,16 @@ class Dates(object): """ return datetime.date.today() + @_classproperty + def time(cls): + """Current local time + + :return: Return the current local time + :rtype: datetime.time + """ + t = cls.now.time().replace(microsecond=0) + return t + @_classproperty def epoch(cls): """Get unix time @@ -662,11 +682,372 @@ class Macro(object): return result +class Shell(object): + """Class for subprocess + + `See Subprocess `_ + """ + @classmethod + def run(cls, command, capture=False, split=False): + """Execute commands + + :param command: Command to run + :type command: str + :param capture: If capture result of command + :type capture: bool + :param split: Some commands need split. + :type split: bool + :return: Result of command + :rtype: Any + """ + if split: + cmd = shlex.split(command) + result = subprocess.run(cmd, capture_output=capture, text=True, shell=IS_WIN) + if capture: + result = result.stdout + else: + result = result.returncode + else: + if capture: + result = subprocess.check_output(command, shell=True).decode() + else: + result = subprocess.Popen(command) + return result + + @classmethod + def popen(cls, command): + """Execute commands and return line by line + + :param command: Command to run + :type command: str + :return: Result of command + :rtype: Any + """ + try: + proc = subprocess.Popen(shlex.split(command), shell=IS_WIN, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + for line in proc.stdout: + yield line.decode().rstrip() + except Exception as e: + error(e) + yield (e.errno, e.strerror) + + +class Timer(object): + """Class for timer thread""" + + class TimerThread(threading.Thread): + + def __init__(self, event, seconds, macro): + threading.Thread.__init__(self) + self._event = event + self._seconds = seconds + self._macro = macro + + def run(self): + while not self._event.wait(self._seconds): + Macro.call(self._macro) + info('\tTimer stopped... ') + return + + @classmethod + def exists(cls, name): + """Validate in timer **name** exists + + :param name: Timer name, it must be unique + :type name: str + :return: True if exists timer name + :rtype: bool + """ + global _EVENTS + return name in _EVENTS + + @classmethod + def start(cls, name: str, seconds: float, macro: dict): + """Start timer **name** every **seconds** and execute **macro** + + :param name: Timer name, it must be unique + :type name: str + :param seconds: Seconds for wait + :type seconds: float + :param macro: Macro for execute + :type macro: dict + """ + global _EVENTS + + _EVENTS[name] = threading.Event() + info(f"Timer '{name}' started, execute macro: '{macro['name']}'") + thread = cls.TimerThread(_EVENTS[name], seconds, macro) + thread.start() + return + + @classmethod + def stop(cls, name: str): + """Stop timer **name** + + :param name: Timer name + :type name: str + """ + global _EVENTS + _EVENTS[name].set() + del _EVENTS[name] + return + + @classmethod + def once(cls, name: str, seconds: float, macro: dict): + """Start timer **name** only once in **seconds** and execute **macro** + + :param name: Timer name, it must be unique + :type name: str + :param seconds: Seconds for wait before execute macro + :type seconds: float + :param macro: Macro for execute + :type macro: dict + """ + global _EVENTS + + _EVENTS[name] = threading.Timer(seconds, Macro.call, (macro,)) + _EVENTS[name].start() + info(f'Event: "{name}", started... execute in {seconds} seconds') + + return + + @classmethod + def cancel(cls, name: str): + """Cancel timer **name** only once events. + + :param name: Timer name, it must be unique + :type name: str + """ + global _EVENTS + + if name in _EVENTS: + try: + _EVENTS[name].cancel() + del _EVENTS[name] + info(f'Cancel event: "{name}", ok...') + except Exception as e: + error(e) + else: + debug(f'Cancel event: "{name}", not exists...') + return + + +class Hash(object): + """Class for hash + """ + @classmethod + def digest(cls, method: str, data: str, in_hex: bool=True): + """Get digest from data with method + + :param method: Digest method: md5, sha1, sha256, sha512, etc... + :type method: str + :param data: Data for get digest + :type data: str + :param in_hex: If True, get digest in hexadecimal, if False, get bytes + :type in_hex: bool + :return: bytes or hex digest + :rtype: bytes or str + """ + + result = '' + obj = getattr(hashlib, method)(data.encode()) + if in_hex: + result = obj.hexdigest() + else: + result = obj.digest() + return result + + +class Paths(object): + """Class for paths + """ + FILE_PICKER = 'com.sun.star.ui.dialogs.FilePicker' + FOLDER_PICKER = 'com.sun.star.ui.dialogs.FolderPicker' + REMOTE_FILE_PICKER = 'com.sun.star.ui.dialogs.RemoteFilePicker' + OFFICE_FILE_PICKER = 'com.sun.star.ui.dialogs.OfficeFilePicker' + + def __init__(self, path=''): + if path.startswith('file://'): + path = str(Path(uno.fileUrlToSystemPath(path)).resolve()) + self._path = Path(path) + + @property + def path(self): + """Get base path""" + return str(self._path.parent) + + @property + def file_name(self): + """Get file name""" + return self._path.name + + @property + def name(self): + """Get name""" + return self._path.stem + + @property + def ext(self): + """Get extension""" + return self._path.suffix[1:] + + @property + def size(self): + """Get size""" + return self._path.stat().st_size + + @property + def url(self): + """Get like URL""" + return self._path.as_uri() + + @property + def info(self): + """Get all info like tuple""" + i = (self.path, self.file_name, self.name, self.ext, self.size, self.url) + return i + + @property + def dict(self): + """Get all info like dict""" + data = { + 'path': self.path, + 'file_name': self.file_name, + 'name': self.name, + 'ext': self.ext, + 'size': self.size, + 'url': self.url, + } + return data + + @_classproperty + def home(self): + """Get user home""" + return str(Path.home()) + + @_classproperty + def documents(self): + """Get user save documents""" + return self.config() + + @_classproperty + def temp_dir(self): + """Get temporary directory in system""" + return tempfile.gettempdir() + + @_classproperty + def python(self): + """Get path executable python""" + if IS_WIN: + path = self.join(self.config('Module'), PYTHON) + elif IS_MAC: + path = self.join(self.config('Module'), '..', 'Resources', PYTHON) + else: + path = sys.executable + return path + + @_classproperty + def user_profile(self): + """Get path user profile""" + path = self.config('UserConfig') + path = str(Path(path).parent) + return path + + @_classproperty + def user_config(self): + """Get path config in user profile""" + path = self.config('UserConfig') + return path + + @classmethod + def to_system(cls, path:str) -> str: + """Convert paths in URL to system + + :param path: Path to convert + :type path: str + :return: Path system format + :rtype: str + """ + if path.startswith('file://'): + path = str(Path(uno.fileUrlToSystemPath(path)).resolve()) + return path + + @classmethod + def to_url(cls, path: str) -> str: + """Convert paths in format system to URL + + :param path: Path to convert + :type path: str + :return: Path in URL + :rtype: str + """ + if not path.startswith('file://'): + path = Path(path).as_uri() + return path + + @classmethod + def config(cls, name: str='Work') -> str: + """Return path from config + + :param name: Name in service PathSettings, default get path documents + :type name: str + :return: Path in config, if exists. + :rtype: str + + `See Api XPathSettings `_ + """ + path = create_instance('com.sun.star.util.PathSettings') + path = cls.to_system(getattr(path, name)) + return path + + @classmethod + def join(cls, *paths: str) -> str: + """Join paths + + :param paths: Paths to join + :type paths: list + :return: New path with joins + :rtype: str + """ + path = str(Path(paths[0]).joinpath(*paths[1:])) + return path + + @classmethod + def exists(cls, path: str) -> bool: + """If exists path + + :param path: Path for validate + :type path: str + :return: True if path exists, False if not. + :rtype: bool + """ + path = cls.to_system(path) + result = Path(path).exists() + return result + + @classmethod + def exists_app(cls, name_app: str) -> bool: + """If exists app in system + + :param name_app: Name of application + :type name_app: str + :return: True if app exists, False if not. + :rtype: bool + """ + result = bool(shutil.which(name_app)) + return result + + def __getattr__(name): classes = { 'dates': Dates, 'json': Json, 'macro': Macro, + 'shell': Shell, + 'timer': Timer, + 'hash': Hash, + 'path': Paths, } if name in classes: return classes[name]