|
5 | 5 | import sys |
6 | 6 | from hashlib import md5 |
7 | 7 | from importlib.machinery import SourceFileLoader as importer |
8 | | -from logging import Logger |
| 8 | +from logging import WARNING, Logger, getLogger |
9 | 9 | from time import time |
10 | 10 | from typing import List, Literal, Union |
11 | 11 | from webbrowser import open as FileOpener |
12 | 12 |
|
13 | 13 | import chalk |
| 14 | +from requests import get |
14 | 15 |
|
15 | | -from .common import Timer |
| 16 | +from .common import Timer, pip, pip_freeze |
16 | 17 | from .inspector import implements |
17 | 18 | from .operations import * |
18 | 19 | from .types import ( |
|
25 | 26 | OP_INPUT, |
26 | 27 | OP_INSTRUCTION, |
27 | 28 | OP_MOVE, |
28 | | - OP_REGISTRY, |
29 | 29 | OP_REQUEST, |
30 | 30 | OP_TASK, |
31 | 31 | OP_ZIP, |
@@ -146,10 +146,6 @@ def __execute(self, task: Task) -> bool: |
146 | 146 | r = Request(self, task, self.logger) |
147 | 147 | self.__operation_stack.append(r) |
148 | 148 | r.execute() |
149 | | - elif task["operation"] == "registry": |
150 | | - reg = Registry(self, task, self.logger) |
151 | | - self.__operation_stack.append(reg) |
152 | | - reg.execute() |
153 | 149 | elif task["operation"] == "custom": |
154 | 150 | ex = next( |
155 | 151 | (e for e in self.extensions if e["summon"] == task["extension_name"]), |
@@ -468,3 +464,94 @@ def add_alias(alias: Alias, logger: Logger) -> None: |
468 | 464 | sys.exit(1) |
469 | 465 | settings["alias"].append(alias) |
470 | 466 | json.dump(settings, open(f"{root}/.tasker/config.json", "w"), indent=4) |
| 467 | + |
| 468 | + @staticmethod |
| 469 | + def install_remote_extension(extension: str, logger: Logger) -> bool: |
| 470 | + Parser.do_config() |
| 471 | + root = Path.expanduser("~") |
| 472 | + # Remove DEBUG WARNINGS |
| 473 | + getLogger("requests").setLevel(WARNING) |
| 474 | + getLogger("urllib3").setLevel(WARNING) |
| 475 | + # Get Context file |
| 476 | + context = get( |
| 477 | + "https://raw.githubusercontent.com/carlossilva2/pyTasker-actions/main/context.json" |
| 478 | + ).json() |
| 479 | + # Check if extension exists on remote |
| 480 | + if extension not in context.keys(): |
| 481 | + logger.error("Extension does not exist. Check spelling") |
| 482 | + return False |
| 483 | + # Check if extension is allowed on Current OS |
| 484 | + os = platform.system() |
| 485 | + if context[extension]["platform"] != os and context[extension]["platform"] != "*": |
| 486 | + logger.error(f"Extension cannot be installed in '{os}'") |
| 487 | + return False |
| 488 | + # Check for extension dependencies |
| 489 | + existing_modules = pip_freeze() |
| 490 | + for dep in context[extension]["dependencies"]: |
| 491 | + if dep not in existing_modules: |
| 492 | + pip(dep) |
| 493 | + # Retrieve Template |
| 494 | + template = get(context[extension]["extension"]).text |
| 495 | + # Install Extension locally |
| 496 | + _n = md5(f"{time()}_{extension}".encode("UTF-8")).hexdigest()[:10] |
| 497 | + f_name = f"extension_{_n}.py" |
| 498 | + with open(f"{root}/.tasker/Templates/{f_name}", "w") as ex: |
| 499 | + ex.write(template) |
| 500 | + ex.close() |
| 501 | + j: Settings = json.load(open(f"{root}/.tasker/config.json")) |
| 502 | + j["extensions"].append( |
| 503 | + { |
| 504 | + "name": extension, |
| 505 | + "file": f_name, |
| 506 | + "path": f"{root}/.tasker/Templates/{f_name}", |
| 507 | + } |
| 508 | + ) |
| 509 | + json.dump(j, open(f"{root}/.tasker/config.json", "w"), indent=4) |
| 510 | + return True |
| 511 | + |
| 512 | + @staticmethod |
| 513 | + def uninstall_extension(extension: str, logger: Logger) -> None: |
| 514 | + Parser.do_config() |
| 515 | + root = Path.expanduser("~") |
| 516 | + j: Settings = json.load(open(f"{root}/.tasker/config.json")) |
| 517 | + if extension not in [_["name"] for _ in j["extensions"]]: |
| 518 | + logger.error(f"{extension} is not installed") |
| 519 | + sys.exit(1) |
| 520 | + index = None |
| 521 | + for i, ex in enumerate(j["extensions"]): |
| 522 | + if ex["name"] == extension: |
| 523 | + index = i |
| 524 | + os.remove(ex["path"]) |
| 525 | + break |
| 526 | + j["extensions"].pop(index) |
| 527 | + json.dump(j, open(f"{root}/.tasker/config.json", "w"), indent=4) |
| 528 | + logger.debug("Extension removed successfully") |
| 529 | + |
| 530 | + @staticmethod |
| 531 | + def search_remote(extension: str, logger: Logger) -> None: |
| 532 | + Parser.do_config() |
| 533 | + # Remove DEBUG WARNINGS |
| 534 | + getLogger("requests").setLevel(WARNING) |
| 535 | + getLogger("urllib3").setLevel(WARNING) |
| 536 | + # Get Context file |
| 537 | + context = get( |
| 538 | + "https://raw.githubusercontent.com/carlossilva2/pyTasker-actions/main/context.json" |
| 539 | + ).json() |
| 540 | + # Check if extension exists on remote |
| 541 | + if extension not in context.keys(): |
| 542 | + logger.error("Extension does not exist. Check spelling") |
| 543 | + sys.exit(1) |
| 544 | + logger.debug(f"{extension}=={context[extension]['version']}") |
| 545 | + |
| 546 | + @staticmethod |
| 547 | + def list_remote(logger: Logger) -> None: |
| 548 | + Parser.do_config() |
| 549 | + # Remove DEBUG WARNINGS |
| 550 | + getLogger("requests").setLevel(WARNING) |
| 551 | + getLogger("urllib3").setLevel(WARNING) |
| 552 | + # Get Context file |
| 553 | + context = get( |
| 554 | + "https://raw.githubusercontent.com/carlossilva2/pyTasker-actions/main/context.json" |
| 555 | + ).json() |
| 556 | + for extension in context.keys(): |
| 557 | + logger.debug(f"{extension}=={context[extension]['version']}") |
0 commit comments