From 3ec286334be08224ac7b35a06ef06b8995874568 Mon Sep 17 00:00:00 2001 From: Jan200101 Date: Sat, 13 Nov 2021 14:46:41 +0100 Subject: remove unused methods, implement more functions correctly, bump release --- unixreg/__init__.py | 10 ++++---- unixreg/functions.py | 64 ++++++++++++++++++++++++++++++++++------------------ unixreg/key.py | 57 ++++++++++++++++++++++------------------------ 3 files changed, 74 insertions(+), 57 deletions(-) diff --git a/unixreg/__init__.py b/unixreg/__init__.py index fdab30a..974ecec 100644 --- a/unixreg/__init__.py +++ b/unixreg/__init__.py @@ -1,10 +1,10 @@ -__version__ = "0.1.0" +__version__ = "0.1.1" # upwards compatibility with winreg try: - from winreg import * + from winreg import * except ImportError: - from .functions import * - from .constants import * - from .key import * + from .functions import * + from .constants import * + from .key import * diff --git a/unixreg/functions.py b/unixreg/functions.py index 50d4be5..65cd641 100644 --- a/unixreg/functions.py +++ b/unixreg/functions.py @@ -2,12 +2,12 @@ import os from typing import Union from .key import RegKey -from .constants import KEY_WOW64_64KEY, KEY_WRITE, KEY_READ +from .constants import STANDARD_RIGHTS_REQUIRED, KEY_WOW64_64KEY, KEY_WRITE, KEY_READ KEY_TYPE = Union[str, RegKey] SUBKEY_TYPE = KEY_TYPE | Union[None] -_KEY_CACHE = {} +_KEY_CACHE = [] _ENV_REPLACE = { "USERPROFILE": os.getenv("HOME") } @@ -17,7 +17,7 @@ if not _CONFIG_DIR: _CONFIG_DIR = os.path.join(os.getenv("HOME"), ".config") _CONFIG_DIR = os.path.join(_CONFIG_DIR, "unixreg") -def __init_values(key: KEY_TYPE, sub_key, access): +def __init_values(key: KEY_TYPE, sub_key: SUBKEY_TYPE = None, access = STANDARD_RIGHTS_REQUIRED): if isinstance(key, str): key = RegKey(key) @@ -32,9 +32,13 @@ def __create_key(key: RegKey): os.makedirs(path, exist_ok=True) -def CloseKey(key: KEY_TYPE): - if isinstance(key, RegKey): - key.Close() +def CloseKey(key: RegKey): + key.Close() + + try: + _KEY_CACHE.remove(key) + except ValueError: + pass def ConnectRegistry(computer: SUBKEY_TYPE, key: str): if not computer: @@ -44,6 +48,11 @@ def ConnectRegistry(computer: SUBKEY_TYPE, key: str): # any program that fails to catch this is to blame raise OSError("Not Implemented") +def OpenKeyEx(key: KEY_TYPE, sub_key: SUBKEY_TYPE, reserved=0, access=KEY_READ): + return CreateKeyEx(key, sub_key, reserved, access) + +OpenKey = OpenKeyEx + def CreateKey(key: KEY_TYPE, sub_key: SUBKEY_TYPE): return CreateKeyEx(key, sub_key) @@ -52,6 +61,8 @@ def CreateKeyEx(key: KEY_TYPE, sub_key: SUBKEY_TYPE, reserved=0, access=KEY_WRIT __create_key(key) + _KEY_CACHE.append(key) + return key @@ -66,7 +77,13 @@ def DeleteKeyEx(key: KEY_TYPE, sub_key: SUBKEY_TYPE, access=KEY_WOW64_64KEY, res os.remove(path) def DeleteValue(key: KEY_TYPE, value: str): - raise NotImplementedError("Not Implemented") + key = __init_values(key) + + filepath = os.path.join(_CONFIG_DIR, key.key, value) + try: + os.remove(filepath) + except FileNotFoundError: + pass def EnumKey(key: KEY_TYPE, index: int): raise NotImplementedError("Not Implemented") @@ -83,30 +100,33 @@ def ExpandEnvironmentStrings(env: str): def FlushKey(key: KEY_TYPE): raise NotImplementedError("Not Implemented") -def LoadKey(key: KEY_TYPE, sub_key: SUBKEY_TYPE, file_name: str): + +def QueryInfoKey(key: KEY_TYPE): raise NotImplementedError("Not Implemented") -def OpenKeyEx(key: KEY_TYPE, sub_key: SUBKEY_TYPE, reserved=0, access=KEY_READ): - return CreateKeyEx(key, sub_key, reserved, access) +def QueryValueEx(key: KEY_TYPE, sub_key: SUBKEY_TYPE) -> str: + key = __init_values(key, sub_key) -OpenKey = OpenKeyEx + filepath = os.path.join(_CONFIG_DIR, key.key) + with open(filepath, "r") as file: + return file.read() -def QueryInfoKey(key: KEY_TYPE): - QueryValueEx(key, None) +QueryValue = QueryValueEx -def QueryValueEx(key: KEY_TYPE, sub_key: SUBKEY_TYPE): - return "bla" +def LoadKey(key: KEY_TYPE, sub_key: SUBKEY_TYPE, file_name: str): + # Not Implemented but keeping this functionality stubbed should not cause a problem + return -QueryValue = QueryValueEx +def SaveKey(key: KEY_TYPE, file_name: str) -> None: + # Not Implemented but keeping this functionality stubbed should not cause a problem + return -def SaveKey(key: KEY_TYPE, file_name: str): - raise NotImplementedError("Not Implemented") +def SetValue(key: KEY_TYPE, sub_key: str, type: int, value: str): + return SetValueEx(key, sub_key, 0, type, value) -def SetValue(key: KEY_TYPE, sub_key: str, typei: int, value: str): - return SetValueEx(key, sub_key, 0, typei, value) +def SetValueEx(key: KEY_TYPE, value_name: str, reserved: int, type: int, value: str) -> None: + key = __init_values(key) -def SetValueEx(key: KEY_TYPE, value_name: str, reserved: int, type: int, value: str): - print("BLABLABLA", key, value_name, value) filepath = os.path.join(_CONFIG_DIR, key.key, value_name) with open(filepath, "w") as file: file.write(value) diff --git a/unixreg/key.py b/unixreg/key.py index e50415b..c4d5134 100644 --- a/unixreg/key.py +++ b/unixreg/key.py @@ -10,46 +10,43 @@ _HANDLE_COUNTER = 0 class RegKey: - def __init__(self, key: str = "", access: int = STANDARD_RIGHTS_REQUIRED): - global _HANDLE_COUNTER - _HANDLE_COUNTER += 1 + def __init__(self, key: str = "", access: int = STANDARD_RIGHTS_REQUIRED): + global _HANDLE_COUNTER + _HANDLE_COUNTER += 1 - self.key = key - self.handle = _HANDLE_COUNTER - self.access = access + self.key = key + self.handle = _HANDLE_COUNTER + self.access = access - def __add__(self, other: Union[str, RegKeyT]) -> RegKeyT: - if isinstance(other, __class__): - other = other.key + def __add__(self, other: Union[str, RegKeyT]) -> RegKeyT: + if isinstance(other, __class__): + other = other.key - if isinstance(other, str): - other = other.replace("\\\\", "\\").replace("\\", os.path.sep) - retval = deepcopy(self) - retval.key = os.path.join(self.key, other) - return retval + if isinstance(other, str): + other = other.replace("\\\\", "\\").replace("\\", os.path.sep) + retval = deepcopy(self) + retval.key = os.path.join(self.key, other) + return retval - return None + return None - def __access(self, access): - self.access = access + def __enter__(self) -> RegKeyT: + return self - def __enter__(self) -> RegKeyT: - return self + def __exit__(self, *args, **kwargs): + pass - def __exit__(self, *args, **kwargs): - pass + def __repr__(self): + return __class__.__name__ - def __repr__(self): - return __class__.__name__ + def __str__(self): + return f"{__class__.__name__}({self.key}, {self.handle}, {self.access})" - def __str__(self): - return f"{__class__.__name__}({self.key}, {self.handle}, {self.access})" + def Close(self): + pass - def Close(self): - pass - - def Detach(self): - pass + def Detach(self): + pass PyHKEY = RegKey \ No newline at end of file -- cgit v1.2.3