diff --git a/.gitignore b/.gitignore index 81f2d2a..338ffc4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -.html -.xml +*.html +*.xml .idea/ .vscode/ diff --git a/README.md b/README.md index 849deda..c687b4b 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ KEY_NAME_FOR_TESTING = 'HKLM\SOFTWARE\_REMOVE_ME_' # create key winregistry.create_key(KEY_NAME_FOR_TESTING) winregistry.create_key(f'{KEY_NAME_FOR_TESTING}\some_subkey') -print(winregistry.child_keys_names(f'{KEY_NAME_FOR_TESTING}\_REMOVE_ME_')) +print(list(winregistry.child_keys_names(f'{KEY_NAME_FOR_TESTING}\_REMOVE_ME_'))) # manipulations with values winregistry.values_names(KEY_NAME_FOR_TESTING) @@ -38,6 +38,7 @@ print(winregistry.read_value_data(KEY_NAME_FOR_TESTING, 'smth')) winregistry.delete_value(KEY_NAME_FOR_TESTING, 'smth') # delete key +winregistry.delete_key(f'{KEY_NAME_FOR_TESTING}\some_subkey') winregistry.delete_key(KEY_NAME_FOR_TESTING) ``` diff --git a/winregistry.py b/winregistry.py index a9c028d..67addec 100644 --- a/winregistry.py +++ b/winregistry.py @@ -80,7 +80,6 @@ def info( class Value( RegEntity, ): - raw_info: ValueInfo def __init__( self, @@ -161,7 +160,6 @@ def type( class Key( RegEntity, ): - raw_info: KeyInfo def __init__( self, @@ -176,7 +174,7 @@ def __init__( def refresh( self, ) -> None: - self._raw_info = KeyInfo( + self._info = KeyInfo( *winreg.QueryInfoKey( self._hkey, ) @@ -220,7 +218,7 @@ def values_count( def modified_at( self, ) -> datetime: - return datetime(1601, 1, 1) + timedelta(microseconds=self._raw_info.modified_at / 10) + return datetime(1601, 1, 1) + timedelta(microseconds=self.info.modified_at / 10) @property def child_keys_names( @@ -394,45 +392,54 @@ def open_key( @contextmanager -def read_value(key_name: str, value_name: Any) -> Generator[Value, None, None]: - with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS) as client: +def read_value( + key_name: str, + value_name: Any, + auto_refresh: bool = True, +) -> Generator[Value, None, None]: + with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS, auto_refresh=auto_refresh) as client: yield client.read_value(name=value_name) def read_value_data(key_name: str, value_name: Any) -> Any: - with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS) as client: + with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS, auto_refresh=False) as client: value = client.read_value(name=value_name) return value.data def create_key(key_name: str) -> None: key_name, sub_key_name = key_name.split('\\', maxsplit=1) - with open_key(key_name, sub_key=sub_key_name, sub_key_ensure=True, sub_key_access=winreg.KEY_ALL_ACCESS) as client: - client.create_key(sub_key_name) + sub_key_name, new_key_name = sub_key_name.rsplit('\\', maxsplit=1) + + with open_key( + key_name, sub_key=sub_key_name, sub_key_ensure=True, sub_key_access=winreg.KEY_ALL_ACCESS, auto_refresh=False + ) as client: + client.create_key(new_key_name) def child_keys_names(key_name: str) -> None: - with open_key(key_name) as client: - yield from client.child_keys_names + with open_key(key_name, auto_refresh=False) as key: + key.refresh() + yield from key.child_keys_names def delete_key(key_name: str) -> None: key_name, sub_key_name = key_name.rsplit('\\', maxsplit=1) - with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS) as client: + with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS, auto_refresh=False) as client: client.delete_key(sub_key_name) def set_value(key_name: str, value_name: str, type: int, data: Any = None) -> None: - with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS) as key: + with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS, auto_refresh=False) as key: key.set_value(name=value_name, type=type, data=data) def values_names(key_name: str) -> None: - with open_key(key_name) as client: + with open_key(key_name, auto_refresh=False) as client: for value in client.values: yield value.name def delete_value(key_name: str, value_name: str) -> None: - with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS) as key: + with open_key(key_name, sub_key_access=winreg.KEY_ALL_ACCESS, auto_refresh=False) as key: key.delete_value(value_name)