enable ASYNC, DTZ, YTT and EM lints
This commit is contained in:
@@ -85,8 +85,7 @@ class MethodRegistry:
|
||||
def register_abstract(self, fn: Callable[..., T]) -> Callable[..., T]:
|
||||
@wraps(fn)
|
||||
def wrapper(*args: Any, op_key: str, **kwargs: Any) -> ApiResponse[T]:
|
||||
raise NotImplementedError(
|
||||
f"""{fn.__name__} - The platform didn't implement this function.
|
||||
msg = f"""{fn.__name__} - The platform didn't implement this function.
|
||||
|
||||
---
|
||||
# Example
|
||||
@@ -103,16 +102,18 @@ def open_file(file_request: FileRequest) -> str | None:
|
||||
API.register(open_file)
|
||||
---
|
||||
"""
|
||||
)
|
||||
raise NotImplementedError(msg)
|
||||
|
||||
self.register(wrapper)
|
||||
return fn
|
||||
|
||||
def register(self, fn: Callable[..., T]) -> Callable[..., T]:
|
||||
if fn.__name__ in self._registry:
|
||||
raise ValueError(f"Function {fn.__name__} already registered")
|
||||
msg = f"Function {fn.__name__} already registered"
|
||||
raise ValueError(msg)
|
||||
if fn.__name__ in self._orig_signature:
|
||||
raise ValueError(f"Function {fn.__name__} already registered")
|
||||
msg = f"Function {fn.__name__} already registered"
|
||||
raise ValueError(msg)
|
||||
# make copy of original function
|
||||
self._orig_signature[fn.__name__] = signature(fn)
|
||||
|
||||
|
||||
@@ -38,12 +38,14 @@ def set_admin_service(
|
||||
inventory = load_inventory_eval(base_url)
|
||||
|
||||
if not allowed_keys:
|
||||
raise ValueError("At least one key must be provided to ensure access")
|
||||
msg = "At least one key must be provided to ensure access"
|
||||
raise ValueError(msg)
|
||||
|
||||
keys = {}
|
||||
for name, keyfile in allowed_keys.items():
|
||||
if not keyfile.startswith("/"):
|
||||
raise ValueError(f"Keyfile '{keyfile}' must be an absolute path")
|
||||
msg = f"Keyfile '{keyfile}' must be an absolute path"
|
||||
raise ValueError(msg)
|
||||
with open(keyfile) as f:
|
||||
pubkey = f.read()
|
||||
keys[name] = pubkey
|
||||
|
||||
@@ -51,8 +51,9 @@ def extract_frontmatter(readme_content: str, err_scope: str) -> tuple[Frontmatte
|
||||
# Parse the TOML frontmatter
|
||||
frontmatter_parsed = tomllib.loads(frontmatter_raw)
|
||||
except tomllib.TOMLDecodeError as e:
|
||||
msg = f"Error parsing TOML frontmatter: {e}"
|
||||
raise ClanError(
|
||||
f"Error parsing TOML frontmatter: {e}",
|
||||
msg,
|
||||
description=f"Invalid TOML frontmatter. {err_scope}",
|
||||
location="extract_frontmatter",
|
||||
) from e
|
||||
@@ -60,8 +61,9 @@ def extract_frontmatter(readme_content: str, err_scope: str) -> tuple[Frontmatte
|
||||
return Frontmatter(**frontmatter_parsed), remaining_content
|
||||
|
||||
# If no frontmatter is found, raise an error
|
||||
msg = "Invalid README: Frontmatter not found."
|
||||
raise ClanError(
|
||||
"Invalid README: Frontmatter not found.",
|
||||
msg,
|
||||
location="extract_frontmatter",
|
||||
description=f"{err_scope} does not contain valid frontmatter.",
|
||||
)
|
||||
@@ -98,8 +100,9 @@ def get_modules(base_path: str) -> dict[str, str]:
|
||||
proc = run_no_stdout(cmd)
|
||||
res = proc.stdout.strip()
|
||||
except ClanCmdError as e:
|
||||
msg = "clanInternals might not have clanModules attributes"
|
||||
raise ClanError(
|
||||
"clanInternals might not have clanModules attributes",
|
||||
msg,
|
||||
location=f"list_modules {base_path}",
|
||||
description="Evaluation failed on clanInternals.clanModules attribute",
|
||||
) from e
|
||||
@@ -127,15 +130,17 @@ def get_module_info(
|
||||
Retrieves information about a module
|
||||
"""
|
||||
if not module_path:
|
||||
msg = "Module not found"
|
||||
raise ClanError(
|
||||
"Module not found",
|
||||
msg,
|
||||
location=f"show_module_info {module_name}",
|
||||
description="Module does not exist",
|
||||
)
|
||||
module_readme = Path(module_path) / "README.md"
|
||||
if not module_readme.exists():
|
||||
msg = "Module not found"
|
||||
raise ClanError(
|
||||
"Module not found",
|
||||
msg,
|
||||
location=f"show_module_info {module_name}",
|
||||
description="Module does not exist or doesn't have any README.md file",
|
||||
)
|
||||
@@ -170,9 +175,8 @@ def set_service_instance(
|
||||
service_keys = get_type_hints(Service).keys()
|
||||
|
||||
if module_name not in service_keys:
|
||||
raise ValueError(
|
||||
f"{module_name} is not a valid Service attribute. Expected one of {', '.join(service_keys)}."
|
||||
)
|
||||
msg = f"{module_name} is not a valid Service attribute. Expected one of {', '.join(service_keys)}."
|
||||
raise ValueError(msg)
|
||||
|
||||
inventory = load_inventory_json(base_path)
|
||||
target_type = get_args(get_type_hints(Service)[module_name])[1]
|
||||
|
||||
@@ -129,7 +129,8 @@ def construct_value(
|
||||
if loc is None:
|
||||
loc = []
|
||||
if t is None and field_value:
|
||||
raise ClanError(f"Expected None but got: {field_value}", location=f"{loc}")
|
||||
msg = f"Expected None but got: {field_value}"
|
||||
raise ClanError(msg, location=f"{loc}")
|
||||
|
||||
if is_type_in_union(t, type(None)) and field_value is None:
|
||||
# Sometimes the field value is None, which is valid if the type hint allows None
|
||||
@@ -145,8 +146,11 @@ def construct_value(
|
||||
# Field_value must be a string
|
||||
elif is_type_in_union(t, Path):
|
||||
if not isinstance(field_value, str):
|
||||
msg = (
|
||||
f"Expected string, cannot construct pathlib.Path() from: {field_value} "
|
||||
)
|
||||
raise ClanError(
|
||||
f"Expected string, cannot construct pathlib.Path() from: {field_value} ",
|
||||
msg,
|
||||
location=f"{loc}",
|
||||
)
|
||||
|
||||
@@ -155,7 +159,8 @@ def construct_value(
|
||||
# Trivial values
|
||||
elif t is str:
|
||||
if not isinstance(field_value, str):
|
||||
raise ClanError(f"Expected string, got {field_value}", location=f"{loc}")
|
||||
msg = f"Expected string, got {field_value}"
|
||||
raise ClanError(msg, location=f"{loc}")
|
||||
|
||||
return field_value
|
||||
|
||||
@@ -178,7 +183,8 @@ def construct_value(
|
||||
# dict
|
||||
elif get_origin(t) is list:
|
||||
if not isinstance(field_value, list):
|
||||
raise ClanError(f"Expected list, got {field_value}", location=f"{loc}")
|
||||
msg = f"Expected list, got {field_value}"
|
||||
raise ClanError(msg, location=f"{loc}")
|
||||
|
||||
return [construct_value(get_args(t)[0], item) for item in field_value]
|
||||
elif get_origin(t) is dict and isinstance(field_value, dict):
|
||||
@@ -189,9 +195,8 @@ def construct_value(
|
||||
elif get_origin(t) is Literal:
|
||||
valid_values = get_args(t)
|
||||
if field_value not in valid_values:
|
||||
raise ClanError(
|
||||
f"Expected one of {valid_values}, got {field_value}", location=f"{loc}"
|
||||
)
|
||||
msg = f"Expected one of {valid_values}, got {field_value}"
|
||||
raise ClanError(msg, location=f"{loc}")
|
||||
return field_value
|
||||
|
||||
elif get_origin(t) is Annotated:
|
||||
@@ -202,7 +207,8 @@ def construct_value(
|
||||
|
||||
# Unhandled
|
||||
else:
|
||||
raise ClanError(f"Unhandled field type {t} with value {field_value}")
|
||||
msg = f"Unhandled field type {t} with value {field_value}"
|
||||
raise ClanError(msg)
|
||||
|
||||
|
||||
def construct_dataclass(
|
||||
@@ -215,7 +221,8 @@ def construct_dataclass(
|
||||
if path is None:
|
||||
path = []
|
||||
if not is_dataclass(t):
|
||||
raise ClanError(f"{t.__name__} is not a dataclass")
|
||||
msg = f"{t.__name__} is not a dataclass"
|
||||
raise ClanError(msg)
|
||||
|
||||
# Attempt to create an instance of the data_class#
|
||||
field_values: dict[str, Any] = {}
|
||||
@@ -251,9 +258,8 @@ def construct_dataclass(
|
||||
for field_name in required:
|
||||
if field_name not in field_values:
|
||||
formatted_path = " ".join(path)
|
||||
raise ClanError(
|
||||
f"Default value missing for: '{field_name}' in {t} {formatted_path}, got Value: {data}"
|
||||
)
|
||||
msg = f"Default value missing for: '{field_name}' in {t} {formatted_path}, got Value: {data}"
|
||||
raise ClanError(msg)
|
||||
|
||||
return t(**field_values) # type: ignore
|
||||
|
||||
@@ -265,7 +271,8 @@ def from_dict(
|
||||
path = []
|
||||
if is_dataclass(t):
|
||||
if not isinstance(data, dict):
|
||||
raise ClanError(f"{data} is not a dict. Expected {t}")
|
||||
msg = f"{data} is not a dict. Expected {t}"
|
||||
raise ClanError(msg)
|
||||
return construct_dataclass(t, data, path) # type: ignore
|
||||
else:
|
||||
return construct_value(t, data, path)
|
||||
|
||||
@@ -122,9 +122,8 @@ def type_to_dict(
|
||||
# And return the resolved type instead of the TypeVar
|
||||
resolved = type_map.get(t)
|
||||
if not resolved:
|
||||
raise JSchemaTypeError(
|
||||
f"{scope} - TypeVar {t} not found in type_map, map: {type_map}"
|
||||
)
|
||||
msg = f"{scope} - TypeVar {t} not found in type_map, map: {type_map}"
|
||||
raise JSchemaTypeError(msg)
|
||||
return type_to_dict(type_map.get(t), scope, type_map)
|
||||
|
||||
elif hasattr(t, "__origin__"): # Check if it's a generic type
|
||||
@@ -134,7 +133,8 @@ def type_to_dict(
|
||||
if origin is None:
|
||||
# Non-generic user-defined or built-in type
|
||||
# TODO: handle custom types
|
||||
raise JSchemaTypeError(f"{scope} Unhandled Type: ", origin)
|
||||
msg = f"{scope} Unhandled Type: "
|
||||
raise JSchemaTypeError(msg, origin)
|
||||
|
||||
elif origin is Literal:
|
||||
# Handle Literal values for enums in JSON Schema
|
||||
@@ -179,7 +179,8 @@ def type_to_dict(
|
||||
new_map.update(inspect_dataclass_fields(t))
|
||||
return type_to_dict(origin, scope, new_map)
|
||||
|
||||
raise JSchemaTypeError(f"{scope} - Error api type not yet supported {t!s}")
|
||||
msg = f"{scope} - Error api type not yet supported {t!s}"
|
||||
raise JSchemaTypeError(msg)
|
||||
|
||||
elif isinstance(t, type):
|
||||
if t is str:
|
||||
@@ -193,23 +194,23 @@ def type_to_dict(
|
||||
if t is object:
|
||||
return {"type": "object"}
|
||||
if t is Any:
|
||||
raise JSchemaTypeError(
|
||||
f"{scope} - Usage of the Any type is not supported for API functions. In: {scope}"
|
||||
)
|
||||
msg = f"{scope} - Usage of the Any type is not supported for API functions. In: {scope}"
|
||||
raise JSchemaTypeError(msg)
|
||||
if t is pathlib.Path:
|
||||
return {
|
||||
# TODO: maybe give it a pattern for URI
|
||||
"type": "string",
|
||||
}
|
||||
if t is dict:
|
||||
raise JSchemaTypeError(
|
||||
f"{scope} - Generic 'dict' type not supported. Use dict[str, Any] or any more expressive type."
|
||||
)
|
||||
msg = f"{scope} - Generic 'dict' type not supported. Use dict[str, Any] or any more expressive type."
|
||||
raise JSchemaTypeError(msg)
|
||||
|
||||
# Optional[T] gets internally transformed Union[T,NoneType]
|
||||
if t is NoneType:
|
||||
return {"type": "null"}
|
||||
|
||||
raise JSchemaTypeError(f"{scope} - Error primitive type not supported {t!s}")
|
||||
msg = f"{scope} - Error primitive type not supported {t!s}"
|
||||
raise JSchemaTypeError(msg)
|
||||
else:
|
||||
raise JSchemaTypeError(f"{scope} - Error type not supported {t!s}")
|
||||
msg = f"{scope} - Error type not supported {t!s}"
|
||||
raise JSchemaTypeError(msg)
|
||||
|
||||
Reference in New Issue
Block a user