From dbc52432c958d27c6c8c04e037ab10db0f43e7a0 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 02:47:14 +0200 Subject: [PATCH 01/22] ci: cross-checking services.php $functions with $services --- document_services.py | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/document_services.py b/document_services.py index 39b50531..13de986e 100644 --- a/document_services.py +++ b/document_services.py @@ -664,9 +664,9 @@ def parse_string(code: str) -> tuple[int, PHPStringLiteral]: result.append(c) def extract_function_info(file_content: str) -> list[FunctionInfo]: - function_info = [] + function_infos = [] - # Removing comments, PHP tags, and definitions + # Removing line comments, PHP tags, and definitions clean_content = re.sub(r"//.*|<\?php|defined\(.*\)\s*\|\|\s*die\(\);", "", file_content) # Splitting the content based on function definition blocks @@ -699,14 +699,39 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: # Only adding to the list if all information is present if all(value is not None for value in func_dict.values()): - function_info.append(FunctionInfo(**func_dict)) + function_infos.append(FunctionInfo(**func_dict)) else: warn(f"Could not gather all info for {func_dict["name"]}", func_dict) - if len(function_info) == 0: + if len(function_infos) == 0: warn("Couldn't find any functions!") - return function_info + # double-checking using the services list below + services_function_block = re.search(r"\$services = \[.*?'functions' => \[(['a-z_,\s]+)\]", clean_content, re.DOTALL) + if services_function_block is None: + warn("Couldn't find $services") + else: + services_functions = re.findall(r"'local_lbplanner_([a-z]+)_([a-z_]+)'", services_function_block[1]) + exit() + + function_infos_copy = function_infos.copy() + for function in services_functions: + # Extracting function name and group + func_name = function[1] + func_group = function[0] + + for functioninfo in function_infos_copy: + if functioninfo.name == func_name and functioninfo.group == func_group: + function_infos_copy.remove(functioninfo) + continue # found the function + + warn(f"Couldn't find service function {func_group}_{func_name} in $functions") + + for functioninfo in function_infos_copy: + # The ones left here are not in services_function. + warn(f"Couldn't find service function {functioninfo.group}_{functioninfo.name} in $services") + + return function_infos def extract_php_functions(php_code: str, name: str) -> tuple[str | None, str | None]: From c975d704642d346c32426a66d82d556bdbce18ad Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 03:20:18 +0200 Subject: [PATCH 02/22] ci: cross-checking services.php using file tree --- document_services.py | 46 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/document_services.py b/document_services.py index 13de986e..64178861 100644 --- a/document_services.py +++ b/document_services.py @@ -1,7 +1,7 @@ import json import re import sys -from os import path +from os import path, listdir from abc import ABC, abstractmethod import traceback as tb @@ -26,12 +26,12 @@ def warn(msg: str, *context: Any): service_msg: str if CURRENT_SERVICE is None: - service_msg = "outside any service" + service_msg = "" else: - service_msg = f"in service \033[36m{CURRENT_SERVICE}\033[0m" + service_msg = f"in service \033[36m{CURRENT_SERVICE}\033[0m " print( - f"{WARN}\033[31m{msg}\033[0m {service_msg} ({stack_str})", + f"{WARN}\033[31m{msg}\033[0m {service_msg}({stack_str})", f"\n{WARN_TAB} " if len(context) > 0 else "", *[f"\033[2m{c}\033[0m".replace('\n', '\n\033[0m' + WARN_TAB + " \033[2m") for c in context], file=sys.stderr, @@ -712,7 +712,6 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: warn("Couldn't find $services") else: services_functions = re.findall(r"'local_lbplanner_([a-z]+)_([a-z_]+)'", services_function_block[1]) - exit() function_infos_copy = function_infos.copy() for function in services_functions: @@ -720,17 +719,50 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: func_name = function[1] func_group = function[0] + found = False for functioninfo in function_infos_copy: if functioninfo.name == func_name and functioninfo.group == func_group: function_infos_copy.remove(functioninfo) - continue # found the function + found = True + break - warn(f"Couldn't find service function {func_group}_{func_name} in $functions") + if not found: + warn(f"Couldn't find service function {func_group}_{func_name} in $functions") for functioninfo in function_infos_copy: # The ones left here are not in services_function. warn(f"Couldn't find service function {functioninfo.group}_{functioninfo.name} in $services") + # double-checking using existing files + function_infos_copy = function_infos.copy() + searchdir = './lbplanner/services' + for subdir in listdir(searchdir): + dirpath = path.join(searchdir, subdir) + if not path.isdir(dirpath): + warn(f'found file {subdir} in services folder') + continue + + for filename in listdir('lbplanner/services/' + subdir): + if path.isdir(filename): + warn(f'found directory "{filename}" in folder "{dirpath}"') + continue + if not filename.endswith('.php'): + warn(f'found non-php file "{filename}" in folder "{dirpath}"') + continue + + for functioninfo in function_infos_copy: + if functioninfo.name == filename[:-4] and functioninfo.group == subdir: + function_infos_copy.remove(functioninfo) + found = True + break + + if not found: + warn(f"Couldn't find service function {func_group}_{func_name} in $function") + + for functioninfo in function_infos_copy: + # The ones left here are not in the dirs. + warn(f"Couldn't find file {functioninfo.group}/{functioninfo.name}.php in services folder") + return function_infos From 983818b51ec3140f395c207a4dc8e0db94d2fe7f Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 03:32:47 +0200 Subject: [PATCH 03/22] fix: remove unused function from $services --- lbplanner/db/services.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lbplanner/db/services.php b/lbplanner/db/services.php index 6e8d8460..a7999756 100644 --- a/lbplanner/db/services.php +++ b/lbplanner/db/services.php @@ -438,7 +438,6 @@ 'local_lbplanner_plan_update_plan', 'local_lbplanner_notifications_get_all_notifications', 'local_lbplanner_notifications_update_notification', - 'local_lbplanner_plan_get_access', 'local_lbplanner_plan_update_access', 'local_lbplanner_user_delete_user', 'local_lbplanner_plan_accept_invite', From 6693926696c4c4e1666969cc05918c52232a10b5 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 05:56:04 +0200 Subject: [PATCH 04/22] ci: some early code on parsing docstrings --- document_services.py | 128 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 19 deletions(-) diff --git a/document_services.py b/document_services.py index 64178861..0c930f80 100644 --- a/document_services.py +++ b/document_services.py @@ -386,12 +386,15 @@ def __str__(self) -> str: class SlotsDict: @property def __dict__(self): - slots = tuple() + return {name: self.__getattribute__(name) for name in self.get_slots()} + def get_slots(self): + slots = tuple() for cls in self.__class__.__mro__: if cls != SlotsDict and issubclass(cls, SlotsDict): slots = cls.__slots__ + slots - return {name: self.__getattribute__(name) for name in slots} + + return slots class FunctionInfo(SlotsDict): __slots__ = ('name', 'group', 'capabilities', 'description', 'path') @@ -415,6 +418,41 @@ def __init__(self, self.parameters = parameters self.returns = returns +class DocString_TypeDescPair(SlotsDict): + __slots__ = ('typ', 'description') + typ: str + description: str + + def __init__(self, typ: str, description: str): + self.typ = typ + self.description = description + +class DocString(SlotsDict): + __slots__ = ('description', 'params', 'returns') + description: str + params: dict[str, DocString_TypeDescPair] + returns: DocString_TypeDescPair + + def __init__(self, desc: str, params: dict[str, DocString_TypeDescPair], returns: DocString_TypeDescPair): + self.desc = desc + self.params = params + self.returns = returns + +class ExtractedAPIFunction(SlotsDict): + __slots__ = ('docstring', 'name', 'params', 'returns', 'body') + docstring: DocString + name: str + params: str + returns: str + body: str + + def __init__(self, docstring: DocString, name: str, params: str, returns: str, body: str): + self.docstring = docstring + self.name = name + self.params = params + self.returns = returns + self.body = body + class IRElement(SlotsDict, ABC): __slots__ = ('description', 'required', 'type') @@ -766,32 +804,83 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: return function_infos -def extract_php_functions(php_code: str, name: str) -> tuple[str | None, str | None]: +def extract_api_functions(php_code: str, name: str) -> tuple[ExtractedAPIFunction | None, ExtractedAPIFunction | None, ExtractedAPIFunction | None]: # Regular expression to match the function names and bodies # https://regex101.com/r/9GtIMA - pattern = re.compile(r"(public static function (\w+_(?:returns|parameters))\W[^{}]*?{[^{}]+?})", re.DOTALL) + # TODO: params + pattern = re.compile( + r"(?P /\*\*\n(?: \*[^\n]*\n)*? \*/)\s*public static function (?P\w+(?:_returns|_parameters|))\(\s*(?P(?:\??(?:int|string|bool) \$[a-z]*(?:,\s+)?)*)\)(?:: (?P[a-z_]+))? (?P{.+?^ }$)", + re.DOTALL | re.MULTILINE + ) # Find all matches in the PHP code matches: list[tuple[str, str]] = pattern.findall(php_code) parameters_function = None returns_function = None + main_function = None for match in matches: # Extract function name - function_name = match[1] - - if function_name.endswith("_parameters"): - parameters_function = match[0] - elif function_name.endswith("_returns"): - returns_function = match[0] + if len(match) == 4: + func_docstring, func_name, func_params, func_body = match + func_returns = None + elif len(match) == 5: + func_docstring, func_name, func_params, func_returns, func_body = match + else: + raise Exception("unreachable") + + function_packed = ExtractedAPIFunction( + parse_docstring(func_docstring), + func_name, + func_params, + func_returns, + func_body + ) + + if func_name.endswith("_parameters"): + parameters_function = function_packed + elif func_name.endswith("_returns"): + returns_function = function_packed + else: + main_function = function_packed if parameters_function is None: - warn(f"Couldn't find parameters function in {name}") + warn(f"Couldn't find parameters function in {name}", php_code) if returns_function is None: - warn(f"Couldn't find returns function in {name}") - - return parameters_function, returns_function + warn(f"Couldn't find returns function in {name}", php_code) + if main_function is None: + warn(f"Couldn't find main function in {name}", php_code) + + return parameters_function, main_function, returns_function + +def parse_docstring(inpot: str) -> DocString: + desc = "" + params: dict[str, DocString_TypeDescPair] = {} + returns: DocString_TypeDescPair = None + isdesc = True + for line in inpot.splitlines(): + strippedline = line[line.find('*') + 1:].strip() + if strippedline.startswith('@'): + isdec = False + splitline = strippedline.split(' ') + match splitline[0]: + case '@param': + if splitline[2] in params: + warn(f"specified @param {splitline[2]} twice in docstring") + params[splitline[2]] = DocString_TypeDescPair(splitline[1], " ".join(splitline[3:])) + case '@return': + if returns is not None: + warn("specified @returns twice in docstring") + returns = DocString_TypeDescPair(splitline[1], " ".join(splitline[2:])) + case '@throws' | '@see' | '@link': + pass + case unknown: + warn(f"unknown @-rule: {unknown}", line) + elif isdesc: + desc += " " + strippedline + + return DocString(desc, params, returns) def find_import(nr: PHPNameResolution, symbol: str) -> str | None: @@ -887,20 +976,21 @@ def main(): with open(info.path, "r") as func_file: func_content = func_file.read() imports = extract_imports(func_content) - params_func, returns_func = extract_php_functions(func_content, info.path) + params_func, main_func, returns_func = extract_api_functions(func_content, info.path) if returns_func is None or params_func is None: continue - returns = parse_function(returns_func, imports) + returns = parse_function(returns_func.body, imports) - params = parse_function(params_func, imports) + params = parse_function(params_func.body, imports) complete_info.append(FunctionInfoEx(info, params, returns)) - CURRENT_SERVICE = None + if main_func is not None: + pass # TODO: compare docstring of main to params and returns functions - # TODO: intermediary step + CURRENT_SERVICE = None data = json.dumps(complete_info, default=lambda x: x.__dict__) From 9047588a21a5692b55d16df1d1f2a2777b353a61 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 16:10:17 +0200 Subject: [PATCH 05/22] ci: minor typing fixes --- document_services.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/document_services.py b/document_services.py index 0c930f80..bcf48b63 100644 --- a/document_services.py +++ b/document_services.py @@ -431,9 +431,9 @@ class DocString(SlotsDict): __slots__ = ('description', 'params', 'returns') description: str params: dict[str, DocString_TypeDescPair] - returns: DocString_TypeDescPair + returns: DocString_TypeDescPair | None - def __init__(self, desc: str, params: dict[str, DocString_TypeDescPair], returns: DocString_TypeDescPair): + def __init__(self, desc: str, params: dict[str, DocString_TypeDescPair], returns: DocString_TypeDescPair | None): self.desc = desc self.params = params self.returns = returns @@ -807,7 +807,6 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: def extract_api_functions(php_code: str, name: str) -> tuple[ExtractedAPIFunction | None, ExtractedAPIFunction | None, ExtractedAPIFunction | None]: # Regular expression to match the function names and bodies # https://regex101.com/r/9GtIMA - # TODO: params pattern = re.compile( r"(?P /\*\*\n(?: \*[^\n]*\n)*? \*/)\s*public static function (?P\w+(?:_returns|_parameters|))\(\s*(?P(?:\??(?:int|string|bool) \$[a-z]*(?:,\s+)?)*)\)(?:: (?P[a-z_]+))? (?P{.+?^ }$)", re.DOTALL | re.MULTILINE @@ -857,12 +856,11 @@ def extract_api_functions(php_code: str, name: str) -> tuple[ExtractedAPIFunctio def parse_docstring(inpot: str) -> DocString: desc = "" params: dict[str, DocString_TypeDescPair] = {} - returns: DocString_TypeDescPair = None + returns: DocString_TypeDescPair | None = None isdesc = True for line in inpot.splitlines(): strippedline = line[line.find('*') + 1:].strip() if strippedline.startswith('@'): - isdec = False splitline = strippedline.split(' ') match splitline[0]: case '@param': From f9f10c6170a72e9e30340dacfbdbe6a5569dfc00 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 16:24:51 +0200 Subject: [PATCH 06/22] ci: improved warning formatting --- document_services.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/document_services.py b/document_services.py index bcf48b63..4a023927 100644 --- a/document_services.py +++ b/document_services.py @@ -16,8 +16,9 @@ def warn(msg: str, *context: Any): :param str msg: The warning message to print. """ global HAS_WARNED - WARN = "\033[43m\033[30mWARN:\033[0m " - WARN_TAB = " \033[43m\033[33m|\033[0m " + WARN = "\033[0m\033[43m\033[30mWARN:\033[0m " + WARN_TAB = "\033[0m \033[43m\033[33m|\033[0m " + WARN_TAB_LAST = "\033[0m \033[43m\033[33m\033[58;5;0m\033[4m|\033[0m " HAS_WARNED = True @@ -30,10 +31,13 @@ def warn(msg: str, *context: Any): else: service_msg = f"in service \033[36m{CURRENT_SERVICE}\033[0m " + context = tuple(f"{c}".strip() for c in context) + context_formatted = [f"\n{c}\033[0m".replace('\n', f"\n\033[0m{WARN_TAB} \033[2m") for c in context] + context_formatted[-1] = context_formatted[-1].replace(WARN_TAB, WARN_TAB_LAST) + print( f"{WARN}\033[31m{msg}\033[0m {service_msg}({stack_str})", - f"\n{WARN_TAB} " if len(context) > 0 else "", - *[f"\033[2m{c}\033[0m".replace('\n', '\n\033[0m' + WARN_TAB + " \033[2m") for c in context], + *context_formatted, file=sys.stderr, sep="" ) From afe2d0d3df67dcf4cafcdfcd7e60310aaa6be814 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 16:37:29 +0200 Subject: [PATCH 07/22] ci: count number of warnings --- document_services.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/document_services.py b/document_services.py index 4a023927..e1ea91d6 100644 --- a/document_services.py +++ b/document_services.py @@ -7,20 +7,21 @@ from typing import Any, Iterable -HAS_WARNED = False +WARNCOUNT = 0 CURRENT_SERVICE: str | None = None def warn(msg: str, *context: Any): - """Prints a warning message to the console and sets the global HAS_WARNED variable to True. + """Prints a warning message to the console and increments the global WARNCOUNT variable. :param str msg: The warning message to print. + :param Any *context: Any contextual info to be passed along. """ - global HAS_WARNED + global WARNCOUNT WARN = "\033[0m\033[43m\033[30mWARN:\033[0m " WARN_TAB = "\033[0m \033[43m\033[33m|\033[0m " WARN_TAB_LAST = "\033[0m \033[43m\033[33m\033[58;5;0m\033[4m|\033[0m " - HAS_WARNED = True + WARNCOUNT += 1 stack = tb.extract_stack() stack_str = " -> ".join([f"\033[34m{frame.name}\033[0m" for frame in stack if frame != stack[-1]]) @@ -1015,7 +1016,8 @@ def main(): with open(f"{sys.argv[1]}/script.js", "w") as f: f.write(script) - if HAS_WARNED: + if WARNCOUNT > 0: + print(f"printed {WARNCOUNT} warnings in total") sys.exit(1) From d272e7972d8377d8bbab9e033047a52f1aae19d1 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 18:24:53 +0200 Subject: [PATCH 08/22] ci: check API function descriptions --- document_services.py | 69 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/document_services.py b/document_services.py index e1ea91d6..72278fdb 100644 --- a/document_services.py +++ b/document_services.py @@ -433,15 +433,26 @@ def __init__(self, typ: str, description: str): self.description = description class DocString(SlotsDict): - __slots__ = ('description', 'params', 'returns') + __slots__ = ('description', 'params', 'returns', 'subpackage', 'copyright') description: str params: dict[str, DocString_TypeDescPair] returns: DocString_TypeDescPair | None - - def __init__(self, desc: str, params: dict[str, DocString_TypeDescPair], returns: DocString_TypeDescPair | None): - self.desc = desc + subpackage: str + copyright: tuple[int, str] + + def __init__( + self, + desc: str, + params: dict[str, DocString_TypeDescPair], + returns: DocString_TypeDescPair | None, + subpackage: str | None, + copyright: tuple[int, str] | None, + ): + self.description = desc self.params = params self.returns = returns + self.subpackage = subpackage + self.copyright = copyright class ExtractedAPIFunction(SlotsDict): __slots__ = ('docstring', 'name', 'params', 'returns', 'body') @@ -858,14 +869,27 @@ def extract_api_functions(php_code: str, name: str) -> tuple[ExtractedAPIFunctio return parameters_function, main_function, returns_function +def extract_main_api_docstring(inpot: str) -> DocString: + return parse_docstring(inpot[inpot.find('/**'):inpot.find('*/')]) + def parse_docstring(inpot: str) -> DocString: - desc = "" + desc_a = [] params: dict[str, DocString_TypeDescPair] = {} returns: DocString_TypeDescPair | None = None + subpackage: str | None = None + copyright: tuple[int, str] | None = None isdesc = True for line in inpot.splitlines(): strippedline = line[line.find('*') + 1:].strip() - if strippedline.startswith('@'): + if strippedline in ('*', ' ', ''): + continue # empty line, ignore + elif strippedline == '/': + break # last line, ignore + elif strippedline.startswith('NOTE:'): + isdesc = False + continue # internal notes, ignore + elif strippedline.startswith('@'): + isdesc = False splitline = strippedline.split(' ') match splitline[0]: case '@param': @@ -876,14 +900,27 @@ def parse_docstring(inpot: str) -> DocString: if returns is not None: warn("specified @returns twice in docstring") returns = DocString_TypeDescPair(splitline[1], " ".join(splitline[2:])) - case '@throws' | '@see' | '@link': + case '@package': + if splitline[1] != "local_lbplanner": + warn(f"found @package with value {splitline[1]} instead of local_lbplanner") + case '@subpackage': + subpackage = " ".join(splitline[1:]) + case '@copyright': + copyright = int(splitline[1]), " ".join(splitline[2:]) + case '@throws' | '@see' | '@link' | '@license': pass case unknown: warn(f"unknown @-rule: {unknown}", line) elif isdesc: - desc += " " + strippedline + desc_a.append(strippedline) + + desc = " ".join(desc_a) + + # remove trailing period + if desc.endswith('.'): + desc = desc[:-1] - return DocString(desc, params, returns) + return DocString(desc, params, returns, subpackage, copyright) def find_import(nr: PHPNameResolution, symbol: str) -> str | None: @@ -963,7 +1000,7 @@ def parse_function(input_text: str, nr: PHPNameResolution) -> IRElement | None: return topelement -def main(): +def main() -> None: global CURRENT_SERVICE with open("lbplanner/db/services.php", "r") as file: content = file.read() @@ -980,6 +1017,7 @@ def main(): func_content = func_file.read() imports = extract_imports(func_content) params_func, main_func, returns_func = extract_api_functions(func_content, info.path) + main_docstring = extract_main_api_docstring(func_content) if returns_func is None or params_func is None: continue @@ -991,7 +1029,16 @@ def main(): complete_info.append(FunctionInfoEx(info, params, returns)) if main_func is not None: - pass # TODO: compare docstring of main to params and returns functions + if main_func.docstring.description != info.description or main_docstring.description != info.description: + warn( + "non-matching API function descriptions", + f"func docstring: {main_func.docstring.description}", + f"class docstring: {main_docstring.description}", + f"service description: {info.description}", + ) + # TODO: check params + # TODO: check subpackage + # TODO: check copyright CURRENT_SERVICE = None From 2653f61a856908340bafda4b43800385c7a83bb4 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 18:25:21 +0200 Subject: [PATCH 09/22] ci: warncount now has "x warnings per API function" stat --- document_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/document_services.py b/document_services.py index 72278fdb..7d9728eb 100644 --- a/document_services.py +++ b/document_services.py @@ -1064,7 +1064,7 @@ def main() -> None: f.write(script) if WARNCOUNT > 0: - print(f"printed {WARNCOUNT} warnings in total") + print(f"printed {WARNCOUNT} warnings in total ({WARNCOUNT / len(infos):.2f} per API function)") sys.exit(1) From 84213501e7725a74bbe181d5d357817eb4d8b974 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 18:34:40 +0200 Subject: [PATCH 10/22] ci: fixed bug in parsing $service function description --- document_services.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/document_services.py b/document_services.py index 7d9728eb..391f55cc 100644 --- a/document_services.py +++ b/document_services.py @@ -744,8 +744,8 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: func_dict["capabilities"] = [cap.strip() for cap in capabilities.group(1).split(',') if len(cap) > 0] # Extracting description - description = re.search(r"'description' => '(.*?)'", function[3]) - func_dict["description"] = description.group(1) if description else None + description = re.search(r"'description' => '([^\n]*)'", function[3]) + func_dict["description"] = description.group(1).replace('\\\'', '\'') if description else None # Extracting and adjusting path classpath = re.search(r"'classpath' => 'local/(.*?)'", function[3]) From c92919be33d629d10d3f0cef4909328875dfbf1e Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 20:05:40 +0200 Subject: [PATCH 11/22] ci: move stat print to stderr to unclutter stdout --- document_services.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/document_services.py b/document_services.py index 391f55cc..448aca58 100644 --- a/document_services.py +++ b/document_services.py @@ -1064,7 +1064,7 @@ def main() -> None: f.write(script) if WARNCOUNT > 0: - print(f"printed {WARNCOUNT} warnings in total ({WARNCOUNT / len(infos):.2f} per API function)") + print(f"printed {WARNCOUNT} warnings in total ({WARNCOUNT / len(infos):.2f} per API function)", file=sys.stderr) sys.exit(1) From 978e15178ec04eac6d264a2b30dc3661561c5a7a Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 20:12:35 +0200 Subject: [PATCH 12/22] fix: API function descriptions --- lbplanner/db/services.php | 74 +++++++++---------- lbplanner/services/config/get_version.php | 4 +- .../services/courses/get_all_courses.php | 4 +- lbplanner/services/courses/get_my_courses.php | 4 +- lbplanner/services/courses/update_course.php | 4 +- lbplanner/services/kanban/get_board.php | 2 +- .../modules/get_all_course_modules.php | 4 +- .../services/modules/get_all_modules.php | 2 +- lbplanner/services/modules/get_module.php | 2 +- .../notifications/get_all_notifications.php | 4 +- lbplanner/services/plan/accept_invite.php | 4 +- lbplanner/services/plan/clear_plan.php | 4 +- lbplanner/services/plan/decline_invite.php | 2 +- lbplanner/services/plan/delete_deadline.php | 4 +- lbplanner/services/plan/get_invites.php | 4 +- lbplanner/services/plan/get_plan.php | 2 +- lbplanner/services/plan/leave_plan.php | 8 +- lbplanner/services/slots/book_reservation.php | 4 +- lbplanner/services/slots/delete_slot.php | 2 +- lbplanner/services/slots/get_all_slots.php | 1 - .../services/slots/get_my_reservations.php | 3 +- lbplanner/services/slots/get_my_slots.php | 5 +- .../services/slots/get_student_slots.php | 5 +- .../services/slots/get_supervisor_slots.php | 4 +- .../services/slots/unbook_reservation.php | 4 +- lbplanner/services/user/delete_user.php | 2 - lbplanner/services/user/get_all_users.php | 4 +- lbplanner/services/user/get_user.php | 6 +- lbplanner/services/user/update_user.php | 4 +- 29 files changed, 85 insertions(+), 91 deletions(-) diff --git a/lbplanner/db/services.php b/lbplanner/db/services.php index 6e8d8460..3a5bc590 100644 --- a/lbplanner/db/services.php +++ b/lbplanner/db/services.php @@ -30,7 +30,7 @@ 'classname' => 'local_lbplanner_services\user_get_user', 'methodname' => 'get_user', 'classpath' => 'local/lbplanner/services/user/get_user.php', - 'description' => 'Get the data for a user', + 'description' => 'Returns current userdata', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -39,7 +39,7 @@ 'classname' => 'local_lbplanner_services\user_get_all_users', 'methodname' => 'get_all_users', 'classpath' => 'local/lbplanner/services/user/get_all_users.php', - 'description' => 'Gets all users registered by the lbplanner app', + 'description' => 'Returns all users, optionally filtered by vintage', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -48,7 +48,7 @@ 'classname' => 'local_lbplanner_services\user_update_user', 'methodname' => 'update_user', 'classpath' => 'local/lbplanner/services/user/update_user.php', - 'description' => 'Update the data for a user. null values or unset parameters are left unmodified', + 'description' => 'Update current user settings. null values or unset parameters are left unmodified', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -57,7 +57,7 @@ 'classname' => 'local_lbplanner_services\courses_get_all_courses', 'methodname' => 'get_all_courses', 'classpath' => 'local/lbplanner/services/courses/get_all_courses.php', - 'description' => 'Get all courses', + 'description' => 'Returns ALL courses', 'type' => 'read', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -66,7 +66,7 @@ 'classname' => 'local_lbplanner_services\courses_get_my_courses', 'methodname' => 'get_my_courses', 'classpath' => 'local/lbplanner/services/courses/get_my_courses.php', - 'description' => 'Get courses that belong to the user', + 'description' => 'Returns courses visible to this user', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -75,7 +75,7 @@ 'classname' => 'local_lbplanner_services\courses_update_course', 'methodname' => 'update_course', 'classpath' => 'local/lbplanner/services/courses/update_course.php', - 'description' => 'Update the data for a course', + 'description' => 'Update the user-specific data for a course', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -84,7 +84,7 @@ 'classname' => 'local_lbplanner_services\modules_get_module', 'methodname' => 'get_module', 'classpath' => 'local/lbplanner/services/modules/get_module.php', - 'description' => 'Get the data for a module', + 'description' => 'Returns the data for a module', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -93,7 +93,7 @@ 'classname' => 'local_lbplanner_services\modules_get_all_modules', 'methodname' => 'get_all_modules', 'classpath' => 'local/lbplanner/services/modules/get_all_modules.php', - 'description' => 'Get all the modules of the current year', + 'description' => 'Returns all the modules for a user', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -102,7 +102,7 @@ 'classname' => 'local_lbplanner_services\modules_get_all_course_modules', 'methodname' => 'get_all_course_modules', 'classpath' => 'local/lbplanner/services/modules/get_all_course_modules.php', - 'description' => 'Get all the modules of the given course', + 'description' => 'Returns all modules belonging to a course', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -111,7 +111,7 @@ 'classname' => 'local_lbplanner_services\plan_clear_plan', 'methodname' => 'clear_plan', 'classpath' => 'local/lbplanner/services/plan/clear_plan.php', - 'description' => 'Clear the plan for the given user', + 'description' => 'Clears your current plan', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -120,7 +120,7 @@ 'classname' => 'local_lbplanner_services\plan_get_plan', 'methodname' => 'get_plan', 'classpath' => 'local/lbplanner/services/plan/get_plan.php', - 'description' => 'Get the plan of the given user', + 'description' => 'Returns the plan of the current user', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -129,7 +129,7 @@ 'classname' => 'local_lbplanner_services\plan_invite_user', 'methodname' => 'invite_user', 'classpath' => 'local/lbplanner/services/plan/invite_user.php', - 'description' => 'Invite a user to the plan', + 'description' => 'Invite a user to the current user\'s plan', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -138,7 +138,7 @@ 'classname' => 'local_lbplanner_services\plan_remove_user', 'methodname' => 'remove_user', 'classpath' => 'local/lbplanner/services/plan/remove_user.php', - 'description' => 'Remove a user from the plan', + 'description' => 'Remove a user from your plan', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -147,7 +147,7 @@ 'classname' => 'local_lbplanner_services\plan_update_plan', 'methodname' => 'update_plan', 'classpath' => 'local/lbplanner/services/plan/update_plan.php', - 'description' => 'Update the plan of the given user', + 'description' => 'Update the plan details', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -156,7 +156,7 @@ 'classname' => 'local_lbplanner_services\plan_leave_plan', 'methodname' => 'leave_plan', 'classpath' => 'local/lbplanner/services/plan/leave_plan.php', - 'description' => 'Leave the plan of the given user', + 'description' => 'Leave current plan. If no other user exists in the plan, the user can\'t leave', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -165,7 +165,7 @@ 'classname' => 'local_lbplanner_services\plan_delete_deadline', 'methodname' => 'delete_deadline', 'classpath' => 'local/lbplanner/services/plan/delete_deadline.php', - 'description' => 'Delete a deadline from the plan', + 'description' => 'Deletes a deadline from your plan', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -183,7 +183,7 @@ 'classname' => 'local_lbplanner_services\plan_set_deadline', 'methodname' => 'set_deadline', 'classpath' => 'local/lbplanner/services/plan/set_deadline.php', - 'description' => 'Set a deadline from the plan', + 'description' => 'Set the deadline for a module', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -201,7 +201,7 @@ 'classname' => 'local_lbplanner_services\plan_get_invites', 'methodname' => 'get_invites', 'classpath' => 'local/lbplanner/services/plan/get_invites.php', - 'description' => 'Get all the invites of the given user', + 'description' => 'Returns all invites for this user', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -210,7 +210,7 @@ 'classname' => 'local_lbplanner_services\notifications_get_all_notifications', 'methodname' => 'get_all_notifications', 'classpath' => 'local/lbplanner/services/notifications/get_all_notifications.php', - 'description' => 'Get all the notifications of the given user', + 'description' => 'Returns all notifications for this user', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -219,7 +219,7 @@ 'classname' => 'local_lbplanner_services\notifications_update_notification', 'methodname' => 'update_notification', 'classpath' => 'local/lbplanner/services/notifications/update_notification.php', - 'description' => 'Update the notification status of the given user and id', + 'description' => 'Update the notification status', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -228,7 +228,7 @@ 'classname' => 'local_lbplanner_services\plan_accept_invite', 'methodname' => 'accept_invite', 'classpath' => 'local/lbplanner/services/plan/accept_invite.php', - 'description' => 'Accept the invite of the given id', + 'description' => 'Accept an invite', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -237,7 +237,7 @@ 'classname' => 'local_lbplanner_services\plan_decline_invite', 'methodname' => 'decline_invite', 'classpath' => 'local/lbplanner/services/plan/decline_invite.php', - 'description' => 'Decline the invite of the given id', + 'description' => 'Decline an invite', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -246,7 +246,7 @@ 'classname' => 'local_lbplanner_services\config_get_version', 'methodname' => 'get_version', 'classpath' => 'local/lbplanner/services/config/get_version.php', - 'description' => 'Get the version of the plugin', + 'description' => 'Returns the version of the plugin', 'type' => 'read', 'capabilities' => '', 'ajax' => true, @@ -255,7 +255,7 @@ 'classname' => 'local_lbplanner_services\slots_get_my_slots', 'methodname' => 'get_my_slots', 'classpath' => 'local/lbplanner/services/slots/get_my_slots.php', - 'description' => 'Get all slots the user can theoretically reserve.', + 'description' => 'Returns all slots the user can reserve, not including already-reserved ones', 'type' => 'read', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -264,7 +264,7 @@ 'classname' => 'local_lbplanner_services\slots_get_student_slots', 'methodname' => 'get_student_slots', 'classpath' => 'local/lbplanner/services/slots/get_student_slots.php', - 'description' => 'Get all slots a supervisor can theoretically reserve for a student.', + 'description' => 'Returns all slots a supervisor can reserve for a user, not including already-reserved ones', 'type' => 'read', 'capabilities' => 'local/lb_planner:teacher', 'ajax' => true, @@ -273,7 +273,7 @@ 'classname' => 'local_lbplanner_services\slots_get_supervisor_slots', 'methodname' => 'get_supervisor_slots', 'classpath' => 'local/lbplanner/services/slots/get_supervisor_slots.php', - 'description' => 'Get all slots belonging to the supervisor.', + 'description' => 'Returns all slots belonging to the supervisor', 'type' => 'read', 'capabilities' => 'local/lb_planner:teacher', 'ajax' => true, @@ -282,7 +282,7 @@ 'classname' => 'local_lbplanner_services\slots_get_all_slots', 'methodname' => 'get_all_slots', 'classpath' => 'local/lbplanner/services/slots/get_all_slots.php', - 'description' => 'Get all slots.', + 'description' => 'Returns all slots', 'type' => 'read', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -291,7 +291,7 @@ 'classname' => 'local_lbplanner_services\slots_book_reservation', 'methodname' => 'book_reservation', 'classpath' => 'local/lbplanner/services/slots/book_reservation.php', - 'description' => 'Book a reservation', + 'description' => 'Books a reservation for the user. Will unbook any overlapping reservations the user may already have', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -300,7 +300,7 @@ 'classname' => 'local_lbplanner_services\slots_unbook_reservation', 'methodname' => 'unbook_reservation', 'classpath' => 'local/lbplanner/services/slots/unbook_reservation.php', - 'description' => 'Unbook a reservation', + 'description' => 'Tries to request unbooking a reservation', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -309,7 +309,7 @@ 'classname' => 'local_lbplanner_services\slots_get_slot_reservations', 'methodname' => 'get_slot_reservations', 'classpath' => 'local/lbplanner/services/slots/get_slot_reservations.php', - 'description' => 'Get reservations for a slot', + 'description' => 'Returns all reservations for a slot', 'type' => 'write', 'capabilities' => 'local/lb_planner:teacher', 'ajax' => true, @@ -318,7 +318,7 @@ 'classname' => 'local_lbplanner_services\slots_get_my_reservations', 'methodname' => 'get_my_reservations', 'classpath' => 'local/lbplanner/services/slots/get_my_reservations.php', - 'description' => 'Get reservations for this user', + 'description' => 'Returns all reservations for this user', 'type' => 'write', 'capabilities' => 'local/lb_planner:student', 'ajax' => true, @@ -345,7 +345,7 @@ 'classname' => 'local_lbplanner_services\slots_delete_slot', 'methodname' => 'delete_slot', 'classpath' => 'local/lbplanner/services/slots/delete_slot.php', - 'description' => 'Delete a slot', + 'description' => 'Deletes slot', 'type' => 'write', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -354,7 +354,7 @@ 'classname' => 'local_lbplanner_services\slots_add_slot_supervisor', 'methodname' => 'add_slot_supervisor', 'classpath' => 'local/lbplanner/services/slots/add_slot_supervisor.php', - 'description' => 'Add supervisor to a slot', + 'description' => 'Adds a supervisor to a slot', 'type' => 'write', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -363,7 +363,7 @@ 'classname' => 'local_lbplanner_services\slots_remove_slot_supervisor', 'methodname' => 'remove_slot_supervisor', 'classpath' => 'local/lbplanner/services/slots/remove_slot_supervisor.php', - 'description' => 'Removes supervisor from a slot', + 'description' => 'Removes a supervisor from a slot', 'type' => 'write', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -372,7 +372,7 @@ 'classname' => 'local_lbplanner_services\slots_add_slot_filter', 'methodname' => 'add_slot_filter', 'classpath' => 'local/lbplanner/services/slots/add_slot_filter.php', - 'description' => 'Add a slot filter', + 'description' => 'Creates a new filter and adds it to a slot', 'type' => 'write', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -381,7 +381,7 @@ 'classname' => 'local_lbplanner_services\slots_delete_slot_filter', 'methodname' => 'delete_slot_filter', 'classpath' => 'local/lbplanner/services/slots/delete_slot_filter.php', - 'description' => 'Delete a slot filter', + 'description' => 'Delete a filter from a slot', 'type' => 'write', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, @@ -390,7 +390,7 @@ 'classname' => 'local_lbplanner_services\slots_get_slot_filters', 'methodname' => 'get_slot_filters', 'classpath' => 'local/lbplanner/services/slots/get_slot_filters.php', - 'description' => 'Returns all filters associated with a slot', + 'description' => 'List all filters that apply to a slot', 'type' => 'read', 'capabilities' => 'local/lb_planner:slotmaster', 'ajax' => true, diff --git a/lbplanner/services/config/get_version.php b/lbplanner/services/config/get_version.php index 10c426ac..72740eca 100644 --- a/lbplanner/services/config/get_version.php +++ b/lbplanner/services/config/get_version.php @@ -19,7 +19,7 @@ use core_external\{external_api, external_function_parameters, external_single_structure, external_value}; /** - * Get version service. + * Returns the version of the plugin. * * @package local_lbplanner * @subpackage services_config @@ -38,7 +38,7 @@ public static function get_version_parameters(): external_function_parameters { } /** - * Returns the version. + * Returns the version of the plugin. * * @return array containing the version */ diff --git a/lbplanner/services/courses/get_all_courses.php b/lbplanner/services/courses/get_all_courses.php index 4f71caea..b74e01cb 100644 --- a/lbplanner/services/courses/get_all_courses.php +++ b/lbplanner/services/courses/get_all_courses.php @@ -23,7 +23,7 @@ use local_lbplanner\model\user; /** - * Get ALL courses. Slotmaster only. + * Returns ALL courses. * * @package local_lbplanner * @subpackage services_courses @@ -41,7 +41,7 @@ public static function get_all_courses_parameters(): external_function_parameter } /** - * Get ALL courses. + * Returns ALL courses. */ public static function get_all_courses(): array { global $USER; diff --git a/lbplanner/services/courses/get_my_courses.php b/lbplanner/services/courses/get_my_courses.php index 8263c7dd..148067f3 100644 --- a/lbplanner/services/courses/get_my_courses.php +++ b/lbplanner/services/courses/get_my_courses.php @@ -22,7 +22,7 @@ use local_lbplanner\model\course; /** - * Get all the courses of the current year. + * Returns courses visible to this user. * * @package local_lbplanner * @subpackage services_courses @@ -40,7 +40,7 @@ public static function get_my_courses_parameters(): external_function_parameters } /** - * Get all the courses of the current year. + * Returns courses visible to this user. */ public static function get_my_courses(): array { $courses = course_helper::get_eduplanner_courses(true); diff --git a/lbplanner/services/courses/update_course.php b/lbplanner/services/courses/update_course.php index 0463fa6a..32ccd10f 100644 --- a/lbplanner/services/courses/update_course.php +++ b/lbplanner/services/courses/update_course.php @@ -21,7 +21,7 @@ use moodle_exception; /** - * Update the data for a course. + * Update the user-specific data for a course. * * @package local_lbplanner * @subpackage services_courses @@ -48,7 +48,7 @@ public static function update_course_parameters(): external_function_parameters } /** - * Update the User-data for a course. + * Update the user-specific data for a course. * @param int $courseid The id of the course * @param string $color The color of the course * @param string $shortname The shortname of the course diff --git a/lbplanner/services/kanban/get_board.php b/lbplanner/services/kanban/get_board.php index ae275e82..337eacb1 100644 --- a/lbplanner/services/kanban/get_board.php +++ b/lbplanner/services/kanban/get_board.php @@ -45,7 +45,7 @@ public static function get_board_parameters(): external_function_parameters { } /** - * Gets all the entries on this user's board. + * Returns all entries in the kanban board for the current user. */ public static function get_board(): array { global $USER; diff --git a/lbplanner/services/modules/get_all_course_modules.php b/lbplanner/services/modules/get_all_course_modules.php index 95196423..8fbc0ec4 100644 --- a/lbplanner/services/modules/get_all_course_modules.php +++ b/lbplanner/services/modules/get_all_course_modules.php @@ -22,7 +22,7 @@ use local_lbplanner\model\module; /** - * Get all the modules of the given course. + * Returns all modules belonging to a course. * * @package local_lbplanner * @subpackage services_modules @@ -48,7 +48,7 @@ public static function get_all_course_modules_parameters(): external_function_pa } /** - * Returns all the modules inside a course. + * Returns all modules belonging to a course. * * @param int $courseid The ID of the course * @param bool $ekenabled whether or not to include ek modules diff --git a/lbplanner/services/modules/get_all_modules.php b/lbplanner/services/modules/get_all_modules.php index 08055ea2..87ae537f 100644 --- a/lbplanner/services/modules/get_all_modules.php +++ b/lbplanner/services/modules/get_all_modules.php @@ -21,7 +21,7 @@ use local_lbplanner\model\module; /** - * Get all the modules of the current year. + * Returns all the modules for a user. * * @package local_lbplanner * @subpackage services_modules diff --git a/lbplanner/services/modules/get_module.php b/lbplanner/services/modules/get_module.php index 1383d6ff..9fde0d01 100644 --- a/lbplanner/services/modules/get_module.php +++ b/lbplanner/services/modules/get_module.php @@ -20,7 +20,7 @@ use local_lbplanner\model\module; /** - * Get the data for a module. + * Returns the data for a module. * * @package local_lbplanner * @subpackage services_modules diff --git a/lbplanner/services/notifications/get_all_notifications.php b/lbplanner/services/notifications/get_all_notifications.php index 0426cd2f..b1ebe094 100644 --- a/lbplanner/services/notifications/get_all_notifications.php +++ b/lbplanner/services/notifications/get_all_notifications.php @@ -20,7 +20,7 @@ use local_lbplanner\helpers\notifications_helper; /** - * Get all the notifications of the user. + * Returns all notifications for this user. * * @package local_lbplanner * @subpackage services_notifications @@ -37,7 +37,7 @@ public static function get_all_notifications_parameters(): external_function_par } /** - * Returns all the notifications of the user + * Returns all notifications for this user. * * @return array */ diff --git a/lbplanner/services/plan/accept_invite.php b/lbplanner/services/plan/accept_invite.php index 2e28c200..9fb6b554 100644 --- a/lbplanner/services/plan/accept_invite.php +++ b/lbplanner/services/plan/accept_invite.php @@ -23,7 +23,7 @@ use local_lbplanner\helpers\invite_helper; /** - * Accept an invite to the plan. + * Accept an invite. * * @package local_lbplanner * @subpackage services_plan @@ -42,7 +42,7 @@ public static function accept_invite_parameters(): external_function_parameters } /** - * Accepts an invite + * Accept an invite. * * @param int $inviteid the ID of the invite to be accepted * @return void diff --git a/lbplanner/services/plan/clear_plan.php b/lbplanner/services/plan/clear_plan.php index f311b7c8..b35daf8e 100644 --- a/lbplanner/services/plan/clear_plan.php +++ b/lbplanner/services/plan/clear_plan.php @@ -20,7 +20,7 @@ use local_lbplanner\helpers\plan_helper; /** - * Clear the plan for the given user. + * Clears your current plan. * * @package local_lbplanner * @subpackage services_plan @@ -37,7 +37,7 @@ public static function clear_plan_parameters(): external_function_parameters { } /** - * Clear the plan. + * Clears your current plan. * * @return void * @throws Exception when access denied diff --git a/lbplanner/services/plan/decline_invite.php b/lbplanner/services/plan/decline_invite.php index 608b0b8b..3281548a 100644 --- a/lbplanner/services/plan/decline_invite.php +++ b/lbplanner/services/plan/decline_invite.php @@ -21,7 +21,7 @@ use local_lbplanner\enums\{NOTIF_TRIGGER, PLAN_INVITE_STATE}; /** - * Decline an invite from the plan. + * Decline an invite. * * @package local_lbplanner * @subpackage services_plan diff --git a/lbplanner/services/plan/delete_deadline.php b/lbplanner/services/plan/delete_deadline.php index 83d5263a..d56fb7a3 100644 --- a/lbplanner/services/plan/delete_deadline.php +++ b/lbplanner/services/plan/delete_deadline.php @@ -20,7 +20,7 @@ use local_lbplanner\helpers\plan_helper; /** - * Delete a deadline from your plan + * Deletes a deadline from your plan. * * @package local_lbplanner * @subpackage services_plan @@ -45,7 +45,7 @@ public static function delete_deadline_parameters(): external_function_parameter } /** - * Delete a deadline. + * Deletes a deadline from your plan. * * @param int $moduleid ID of the Module * @return void diff --git a/lbplanner/services/plan/get_invites.php b/lbplanner/services/plan/get_invites.php index fa0cbe7d..82a78892 100644 --- a/lbplanner/services/plan/get_invites.php +++ b/lbplanner/services/plan/get_invites.php @@ -21,7 +21,7 @@ use local_lbplanner\helpers\plan_helper; /** - * Get all the invites of the current user. + * Returns all invites for this user. * * @package local_lbplanner * @subpackage services_plan @@ -38,7 +38,7 @@ public static function get_invites_parameters(): external_function_parameters { } /** - * Returns all invites of the current user. + * Returns all invites for this user. * * @return array */ diff --git a/lbplanner/services/plan/get_plan.php b/lbplanner/services/plan/get_plan.php index 3ad725af..0a6972d4 100644 --- a/lbplanner/services/plan/get_plan.php +++ b/lbplanner/services/plan/get_plan.php @@ -20,7 +20,7 @@ use local_lbplanner\helpers\plan_helper; /** - * Get the plan of the given user. + * Returns the plan of the current user. * * @package local_lbplanner * @subpackage services_plan diff --git a/lbplanner/services/plan/leave_plan.php b/lbplanner/services/plan/leave_plan.php index 2a77868f..b7637088 100644 --- a/lbplanner/services/plan/leave_plan.php +++ b/lbplanner/services/plan/leave_plan.php @@ -22,9 +22,8 @@ use local_lbplanner\enums\{NOTIF_TRIGGER, PLAN_ACCESS_TYPE, PLAN_INVITE_STATE}; /** - * Leave your plan - * - * if no other user exists in the plan, the user can't leave + * Leave current plan. + * If no other user exists in the plan, the user can't leave. * * @package local_lbplanner * @subpackage services_plan @@ -41,7 +40,8 @@ public static function leave_plan_parameters(): external_function_parameters { } /** - * Leave your plan + * Leave current plan. + * If no other user exists in the plan, the user can't leave. * * @return void * @throws \moodle_exception when user is only member left in plan diff --git a/lbplanner/services/slots/book_reservation.php b/lbplanner/services/slots/book_reservation.php index 9fb08199..82734606 100644 --- a/lbplanner/services/slots/book_reservation.php +++ b/lbplanner/services/slots/book_reservation.php @@ -69,7 +69,9 @@ public static function book_reservation_parameters(): external_function_paramete } /** - * Books a reservation + * Books a reservation for the user. + * Will unbook any overlapping reservations the user may already have. + * * @param int $slotid the slot to book a reservation for * @param string $date the day this reservation should take place * @param int $userid the user to reserve for diff --git a/lbplanner/services/slots/delete_slot.php b/lbplanner/services/slots/delete_slot.php index f9dbee45..30fecb8e 100644 --- a/lbplanner/services/slots/delete_slot.php +++ b/lbplanner/services/slots/delete_slot.php @@ -46,7 +46,7 @@ public static function delete_slot_parameters(): external_function_parameters { } /** - * Tries to request unbooking + * Deletes slot * @param int $id which slot to delete */ public static function delete_slot(int $id): void { diff --git a/lbplanner/services/slots/get_all_slots.php b/lbplanner/services/slots/get_all_slots.php index a92626b0..2a04c14b 100644 --- a/lbplanner/services/slots/get_all_slots.php +++ b/lbplanner/services/slots/get_all_slots.php @@ -24,7 +24,6 @@ /** * Returns all slots. - * Throws exception if the current user is not a slotmaster. * * @package local_lbplanner * @subpackage services_slots diff --git a/lbplanner/services/slots/get_my_reservations.php b/lbplanner/services/slots/get_my_reservations.php index 9242b399..9d826a64 100644 --- a/lbplanner/services/slots/get_my_reservations.php +++ b/lbplanner/services/slots/get_my_reservations.php @@ -21,8 +21,7 @@ use local_lbplanner\model\reservation; /** - * Returns all slots a supervisor can theoretically reserve for a user. - * This does not include times the user has already reserved a slot for. + * Returns all reservations for this user. * * @package local_lbplanner * @subpackage services_slots diff --git a/lbplanner/services/slots/get_my_slots.php b/lbplanner/services/slots/get_my_slots.php index fb564848..85862bf2 100644 --- a/lbplanner/services/slots/get_my_slots.php +++ b/lbplanner/services/slots/get_my_slots.php @@ -21,8 +21,7 @@ use local_lbplanner\model\slot; /** - * Returns all slots the user can theoretically reserve. - * This does not include times the user has already reserved a slot for. + * Returns all slots the user can reserve, not including already-reserved ones. * * @package local_lbplanner * @subpackage services_slots @@ -39,7 +38,7 @@ public static function get_my_slots_parameters(): external_function_parameters { } /** - * Returns slots the current user is supposed to see + * Returns all slots the user can reserve, not including already-reserved ones. */ public static function get_my_slots(): array { global $USER; diff --git a/lbplanner/services/slots/get_student_slots.php b/lbplanner/services/slots/get_student_slots.php index 1d5c55b9..5f741b96 100644 --- a/lbplanner/services/slots/get_student_slots.php +++ b/lbplanner/services/slots/get_student_slots.php @@ -23,8 +23,7 @@ use local_lbplanner\model\slot; /** - * Returns all slots a supervisor can theoretically reserve for a user. - * This does not include times the user has already reserved a slot for. + * Returns all slots a supervisor can reserve for a user, not including already-reserved ones. * * @package local_lbplanner * @subpackage services_slots @@ -43,7 +42,7 @@ public static function get_student_slots_parameters(): external_function_paramet } /** - * Returns slots of a user the supervisor can see. + * Returns all slots a supervisor can reserve for a user, not including already-reserved ones. * @param int $userid ID of the user in question (NOT the supervisor) */ public static function get_student_slots(int $userid): array { diff --git a/lbplanner/services/slots/get_supervisor_slots.php b/lbplanner/services/slots/get_supervisor_slots.php index da7d49d9..3c4aeff8 100644 --- a/lbplanner/services/slots/get_supervisor_slots.php +++ b/lbplanner/services/slots/get_supervisor_slots.php @@ -21,7 +21,7 @@ use local_lbplanner\model\slot; /** - * Returns all slots a supervisor can see. + * Returns all slots belonging to the supervisor. * * @package local_lbplanner * @subpackage services_slots @@ -38,7 +38,7 @@ public static function get_supervisor_slots_parameters(): external_function_para } /** - * Returns all slots a supervisor controls. + * Returns all slots belonging to the supervisor. */ public static function get_supervisor_slots(): array { global $USER; diff --git a/lbplanner/services/slots/unbook_reservation.php b/lbplanner/services/slots/unbook_reservation.php index 0184a0d8..27e988ca 100644 --- a/lbplanner/services/slots/unbook_reservation.php +++ b/lbplanner/services/slots/unbook_reservation.php @@ -25,7 +25,7 @@ use local_lbplanner\enums\NOTIF_TRIGGER; /** - * Unbooks reservation + * Tries to request unbooking a reservation. * * @package local_lbplanner * @subpackage services_slots @@ -57,7 +57,7 @@ public static function unbook_reservation_parameters(): external_function_parame } /** - * Tries to request unbooking + * Tries to request unbooking a reservation. * @param int $reservationid which reservation to unbook * @param bool $nice whether to ask the student to unbook themself, or force-unbook */ diff --git a/lbplanner/services/user/delete_user.php b/lbplanner/services/user/delete_user.php index a1c5108d..6cd8c065 100644 --- a/lbplanner/services/user/delete_user.php +++ b/lbplanner/services/user/delete_user.php @@ -25,8 +25,6 @@ /** * Removes all user data stored by the lbplanner app. * - * Admins can pass a userid to delete the user with the given id - * * @package local_lbplanner * @subpackage services_user * @copyright 2024 necodeIT diff --git a/lbplanner/services/user/get_all_users.php b/lbplanner/services/user/get_all_users.php index 863eecdb..2e51024c 100644 --- a/lbplanner/services/user/get_all_users.php +++ b/lbplanner/services/user/get_all_users.php @@ -27,7 +27,7 @@ use local_lbplanner\model\user; /** - * Gets all users with one or several LBP capabilities. + * Returns all users, optionally filtered by vintage. * * @package local_lbplanner * @subpackage services_user @@ -46,7 +46,7 @@ public static function get_all_users_parameters(): external_function_parameters } /** - * Gives back all users. + * Returns all users, optionally filtered by vintage. * @param ?string $vintage (optional) gives back all users with the given vintage * @throws moodle_exception * @throws dml_exception diff --git a/lbplanner/services/user/get_user.php b/lbplanner/services/user/get_user.php index d7cc827b..caf9c8b8 100644 --- a/lbplanner/services/user/get_user.php +++ b/lbplanner/services/user/get_user.php @@ -25,9 +25,7 @@ use local_lbplanner\model\user; /** - * Get the data for a user. - * - * Get the data for a user. param userid (optional) gives back the user data with the given ID + * Returns current userdata. * * @package local_lbplanner * @subpackage services_user @@ -44,7 +42,7 @@ public static function get_user_parameters(): external_function_parameters { } /** - * Gives back the data of the user calling the function. + * Returns current userdata. * @throws coding_exception * @throws dml_exception * @throws moodle_exception diff --git a/lbplanner/services/user/update_user.php b/lbplanner/services/user/update_user.php index 89eb5750..dfa98283 100644 --- a/lbplanner/services/user/update_user.php +++ b/lbplanner/services/user/update_user.php @@ -26,7 +26,7 @@ use local_lbplanner\enums\KANBANCOL_TYPE_ORNONE; /** - * Update the data for a user. null values or unset parameters are left unmodified. + * Update current user settings. null values or unset parameters are left unmodified. * * @package local_lbplanner * @subpackage services_user @@ -80,7 +80,7 @@ public static function update_user_parameters(): external_function_parameters { } /** - * Updates the given user in the eduplanner DB + * Update current user settings. null values or unset parameters are left unmodified. * @param ?string $theme The theme the user has selected * @param ?string $colorblindness The colorblindness the user has selected * @param ?bool $displaytaskcount The displaytaskcount the user has selected From 5afb539d5c88c5e6d812147b60aee60a91688d50 Mon Sep 17 00:00:00 2001 From: Riedler Date: Fri, 10 Oct 2025 20:27:57 +0200 Subject: [PATCH 13/22] ci: check for duplicated API function descriptions --- document_services.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/document_services.py b/document_services.py index 448aca58..fe2759e9 100644 --- a/document_services.py +++ b/document_services.py @@ -727,6 +727,9 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: # https://regex101.com/r/qyzYks functions = re.findall(r"'(local_lbplanner_(\w+?)_(\w+))' => \[(.*?)\],", clean_content, re.DOTALL) + # to make sure we never accidentally duplicate descriptions + existing_descriptions = [] + for function in functions: func_dict = {} @@ -753,7 +756,13 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: # Only adding to the list if all information is present if all(value is not None for value in func_dict.values()): - function_infos.append(FunctionInfo(**func_dict)) + finfo = FunctionInfo(**func_dict) + function_infos.append(finfo) + + if finfo.description in existing_descriptions: + warn("duplicated API function description", finfo.description) + else: + existing_descriptions.append(finfo.description) else: warn(f"Could not gather all info for {func_dict["name"]}", func_dict) From 7b94994920cff90da626d4b11e16dbdd936ca8a7 Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 17:12:30 +0200 Subject: [PATCH 14/22] ci: Check copyright notices --- document_services.py | 60 ++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/document_services.py b/document_services.py index fe2759e9..42d32c67 100644 --- a/document_services.py +++ b/document_services.py @@ -4,6 +4,7 @@ from os import path, listdir from abc import ABC, abstractmethod import traceback as tb +from subprocess import Popen, PIPE from typing import Any, Iterable @@ -1024,30 +1025,47 @@ def main() -> None: with open(info.path, "r") as func_file: func_content = func_file.read() - imports = extract_imports(func_content) - params_func, main_func, returns_func = extract_api_functions(func_content, info.path) - main_docstring = extract_main_api_docstring(func_content) - if returns_func is None or params_func is None: - continue - - returns = parse_function(returns_func.body, imports) + imports = extract_imports(func_content) + params_func, main_func, returns_func = extract_api_functions(func_content, info.path) + main_docstring = extract_main_api_docstring(func_content) - params = parse_function(params_func.body, imports) - - complete_info.append(FunctionInfoEx(info, params, returns)) + if returns_func is None or params_func is None: + continue - if main_func is not None: - if main_func.docstring.description != info.description or main_docstring.description != info.description: - warn( - "non-matching API function descriptions", - f"func docstring: {main_func.docstring.description}", - f"class docstring: {main_docstring.description}", - f"service description: {info.description}", - ) - # TODO: check params - # TODO: check subpackage - # TODO: check copyright + returns = parse_function(returns_func.body, imports) + + params = parse_function(params_func.body, imports) + + complete_info.append(FunctionInfoEx(info, params, returns)) + + # checking function descriptions + if main_func is not None: + if main_func.docstring.description != info.description or main_docstring.description != info.description: + warn( + "non-matching API function descriptions", + f"func docstring: {main_func.docstring.description}", + f"class docstring: {main_docstring.description}", + f"service description: {info.description}", + ) + # TODO: check params + + # checking copyright + with Popen(["git", "log", "-1", '--pretty=format:%as', info.path], stdout=PIPE) as p: + lastmodificationyear = int(p.communicate()[0].decode('utf-8').split('-')[0]) + if main_docstring.copyright[0] != lastmodificationyear: + warn( + "incorrect copyright year", + f"expected: {lastmodificationyear}", + f"got: {main_docstring.copyright[0]}" + ) + if main_docstring.copyright[1] != "necodeIT": + warn( + "incorrect copyright name", + "expected: necodeIT", + f"got: {main_docstring.copyright[1]}" + ) + # TODO: check subpackage CURRENT_SERVICE = None From 2e3093054274c6b1e18a808bbef2056bbf2fb5a1 Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 17:20:08 +0200 Subject: [PATCH 15/22] ci: check subpackage --- document_services.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/document_services.py b/document_services.py index 42d32c67..142ece60 100644 --- a/document_services.py +++ b/document_services.py @@ -1065,7 +1065,15 @@ def main() -> None: "expected: necodeIT", f"got: {main_docstring.copyright[1]}" ) - # TODO: check subpackage + + # checking subpackage + expected_subpackage = 'services_' + path.basename(path.dirname(info.path)) + if expected_subpackage != main_docstring.subpackage: + warn( + "incorrect subpackage", + f"expected: {expected_subpackage}", + f"got: {main_docstring.subpackage}" + ) CURRENT_SERVICE = None From f3b7783f6b506024e2843c885e4cf151124f06aa Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 17:38:36 +0200 Subject: [PATCH 16/22] ci: report warning count per-type --- document_services.py | 56 +++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/document_services.py b/document_services.py index 142ece60..0922c215 100644 --- a/document_services.py +++ b/document_services.py @@ -8,7 +8,7 @@ from typing import Any, Iterable -WARNCOUNT = 0 +WARNCOUNT: dict[str, int] = {} CURRENT_SERVICE: str | None = None def warn(msg: str, *context: Any): @@ -17,12 +17,11 @@ def warn(msg: str, *context: Any): :param str msg: The warning message to print. :param Any *context: Any contextual info to be passed along. """ - global WARNCOUNT WARN = "\033[0m\033[43m\033[30mWARN:\033[0m " WARN_TAB = "\033[0m \033[43m\033[33m|\033[0m " WARN_TAB_LAST = "\033[0m \033[43m\033[33m\033[58;5;0m\033[4m|\033[0m " - WARNCOUNT += 1 + WARNCOUNT[msg] = (WARNCOUNT.get(msg) or 0) + 1 stack = tb.extract_stack() stack_str = " -> ".join([f"\033[34m{frame.name}\033[0m" for frame in stack if frame != stack[-1]]) @@ -92,7 +91,7 @@ def parse_nullable(inpot: str) -> bool | None: elif inpot == 'NULL_ALLOWED': return True else: - warn(f"found weird value for nullable: {inpot}") + warn("found weird value for nullable", inpot) return None class PHPNameResolution: @@ -195,7 +194,7 @@ def resolve(self) -> PHPExpression: meth_matches: list[str] = re.findall(meth_pattern, new_file_content, re.DOTALL) if len(meth_matches) == 0: - warn(f"couldn't find {self} inside {self.fp}") + warn("Missing class member", f"couldn't find {self} inside {self.fp}") return PHPConstant('null') elif len(meth_matches) > 1: raise Exception(f"Found multiple definitions for {self} inside {self.fp}") @@ -220,7 +219,7 @@ def getcases(cls, classname: str) -> dict[str, str]: fp = f"lbplanner/classes/enums/{classname}.php" if not path.exists(fp): - warn(f"Couldn't find enum file {fp}") + warn("Couldn't find enum file", fp) return {} with open(fp, "r") as f: matches: list[list[str]] = re.findall(fullbody_pattern, f.read(), re.DOTALL) @@ -229,7 +228,7 @@ def getcases(cls, classname: str) -> dict[str, str]: cases = cls.getcases(matches[0][0]) body = matches[0][1] else: - warn(f"couldn't parse enum {classname}", matches) + warn("couldn't parse enum", f"name: {classname}", matches) matches2: list[str] = re.findall(casepattern, body) for match in matches2: @@ -252,7 +251,7 @@ def __init__(self, classname: str, casename: str, fp: str): def resolve(self) -> PHPString: cases = self.getcases(self.classname) if self.casename not in cases.keys(): - warn(f"enum member {self.classname}::{self.casename} not found", cases) + warn("enum member not found", f"{self.classname}::{self.casename}", cases) return PHPStringLiteral("?") val = cases[self.casename] @@ -375,7 +374,7 @@ def toIR(self) -> 'IRElement': return IRValue(typ, default_value=default, nullable=nullable, description=desc, required=required) case _: - warn(f"unkown constructor name: {self.name}") + warn("unkown constructor name", self.name) return IRValue(None, None, nullable=True) class PHPConstant(PHPExpression): @@ -765,7 +764,7 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: else: existing_descriptions.append(finfo.description) else: - warn(f"Could not gather all info for {func_dict["name"]}", func_dict) + warn("Could not gather all info for API function", func_dict["name"], func_dict) if len(function_infos) == 0: warn("Couldn't find any functions!") @@ -791,11 +790,11 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: break if not found: - warn(f"Couldn't find service function {func_group}_{func_name} in $functions") + warn("Couldn't find service function in $functions", f"{func_group}_{func_name}") for functioninfo in function_infos_copy: # The ones left here are not in services_function. - warn(f"Couldn't find service function {functioninfo.group}_{functioninfo.name} in $services") + warn("Couldn't find service function in $services", f"{functioninfo.group}_{functioninfo.name}") # double-checking using existing files function_infos_copy = function_infos.copy() @@ -803,15 +802,15 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: for subdir in listdir(searchdir): dirpath = path.join(searchdir, subdir) if not path.isdir(dirpath): - warn(f'found file {subdir} in services folder') + warn('found file in services folder', subdir) continue for filename in listdir('lbplanner/services/' + subdir): if path.isdir(filename): - warn(f'found directory "{filename}" in folder "{dirpath}"') + warn('found directory in folder', filename, dirpath) continue if not filename.endswith('.php'): - warn(f'found non-php file "{filename}" in folder "{dirpath}"') + warn('found non-php file in folder', filename, dirpath) continue for functioninfo in function_infos_copy: @@ -821,11 +820,11 @@ def extract_function_info(file_content: str) -> list[FunctionInfo]: break if not found: - warn(f"Couldn't find service function {func_group}_{func_name} in $function") + warn("Couldn't find service function in $function", f"{func_group}_{func_name}") for functioninfo in function_infos_copy: # The ones left here are not in the dirs. - warn(f"Couldn't find file {functioninfo.group}/{functioninfo.name}.php in services folder") + warn("Couldn't find file in services folder", f"{functioninfo.group}/{functioninfo.name}.php") return function_infos @@ -871,11 +870,11 @@ def extract_api_functions(php_code: str, name: str) -> tuple[ExtractedAPIFunctio main_function = function_packed if parameters_function is None: - warn(f"Couldn't find parameters function in {name}", php_code) + warn("Couldn't find parameters function", name, php_code) if returns_function is None: - warn(f"Couldn't find returns function in {name}", php_code) + warn("Couldn't find returns function", name, php_code) if main_function is None: - warn(f"Couldn't find main function in {name}", php_code) + warn("Couldn't find main function", name, php_code) return parameters_function, main_function, returns_function @@ -904,7 +903,7 @@ def parse_docstring(inpot: str) -> DocString: match splitline[0]: case '@param': if splitline[2] in params: - warn(f"specified @param {splitline[2]} twice in docstring") + warn("specified @param twice in docstring", splitline[2]) params[splitline[2]] = DocString_TypeDescPair(splitline[1], " ".join(splitline[3:])) case '@return': if returns is not None: @@ -912,7 +911,7 @@ def parse_docstring(inpot: str) -> DocString: returns = DocString_TypeDescPair(splitline[1], " ".join(splitline[2:])) case '@package': if splitline[1] != "local_lbplanner": - warn(f"found @package with value {splitline[1]} instead of local_lbplanner") + warn("found @package with invalid value instead of local_lbplanner", splitline[1]) case '@subpackage': subpackage = " ".join(splitline[1:]) case '@copyright': @@ -920,7 +919,7 @@ def parse_docstring(inpot: str) -> DocString: case '@throws' | '@see' | '@link' | '@license': pass case unknown: - warn(f"unknown @-rule: {unknown}", line) + warn("unknown @-rule", unknown, line) elif isdesc: desc_a.append(strippedline) @@ -967,10 +966,10 @@ def makepath(p: str, symbol: str): fp_l.append(fallback) if len(fp_l) > 1: - warn(f"found potential import collision for {symbol} using [{nr}]") + warn("found potential import collision", f"{symbol} in [{nr}]") return None elif len(fp_l) == 0: - warn(f"couldn't find symbol: {symbol} using [{nr}]") + warn("couldn't find symbol", f"{symbol} in [{nr}]") return None else: return fp_l[0] @@ -1098,8 +1097,11 @@ def main() -> None: with open(f"{sys.argv[1]}/script.js", "w") as f: f.write(script) - if WARNCOUNT > 0: - print(f"printed {WARNCOUNT} warnings in total ({WARNCOUNT / len(infos):.2f} per API function)", file=sys.stderr) + if len(WARNCOUNT) > 0: + total_warns = sum(count for count in WARNCOUNT.values()) + print(f"printed \033[33m{total_warns}\033[0m warnings in total (\033[33m{total_warns / len(infos):.2f}\033[0m per \033[36mservice\033[0m)", file=sys.stderr) + for msg, count in WARNCOUNT.items(): + print(f"\033[33m{count:02d}\033[0mx \033[31m{msg}\033[0m") sys.exit(1) From 758d7e7658c7af5622e79263d2e21a9f5a1725ba Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 17:43:57 +0200 Subject: [PATCH 17/22] chore: updated copyright years --- lbplanner/services/config/get_version.php | 2 +- lbplanner/services/courses/update_course.php | 2 +- lbplanner/services/modules/get_all_course_modules.php | 2 +- lbplanner/services/modules/get_all_modules.php | 2 +- lbplanner/services/modules/get_module.php | 2 +- lbplanner/services/notifications/get_all_notifications.php | 2 +- lbplanner/services/notifications/update_notification.php | 2 +- lbplanner/services/plan/accept_invite.php | 2 +- lbplanner/services/plan/clear_plan.php | 2 +- lbplanner/services/plan/decline_invite.php | 2 +- lbplanner/services/plan/get_invites.php | 2 +- lbplanner/services/plan/get_plan.php | 2 +- lbplanner/services/plan/invite_user.php | 2 +- lbplanner/services/plan/remove_user.php | 2 +- lbplanner/services/plan/update_plan.php | 2 +- lbplanner/services/slots/add_slot_filter.php | 2 +- lbplanner/services/slots/add_slot_supervisor.php | 2 +- lbplanner/services/slots/book_reservation.php | 2 +- lbplanner/services/slots/create_slot.php | 2 +- lbplanner/services/slots/delete_slot.php | 2 +- lbplanner/services/slots/delete_slot_filter.php | 2 +- lbplanner/services/slots/get_my_reservations.php | 2 +- lbplanner/services/slots/get_my_slots.php | 2 +- lbplanner/services/slots/get_slot_filters.php | 2 +- lbplanner/services/slots/get_slot_reservations.php | 2 +- lbplanner/services/slots/get_student_slots.php | 2 +- lbplanner/services/slots/unbook_reservation.php | 2 +- lbplanner/services/slots/update_slot.php | 2 +- lbplanner/services/user/get_all_users.php | 2 +- lbplanner/services/user/get_user.php | 2 +- 30 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lbplanner/services/config/get_version.php b/lbplanner/services/config/get_version.php index 72740eca..b8bbada6 100644 --- a/lbplanner/services/config/get_version.php +++ b/lbplanner/services/config/get_version.php @@ -23,7 +23,7 @@ * * @package local_lbplanner * @subpackage services_config - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class config_get_version extends external_api { diff --git a/lbplanner/services/courses/update_course.php b/lbplanner/services/courses/update_course.php index 32ccd10f..c22f22aa 100644 --- a/lbplanner/services/courses/update_course.php +++ b/lbplanner/services/courses/update_course.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_courses - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class courses_update_course extends external_api { diff --git a/lbplanner/services/modules/get_all_course_modules.php b/lbplanner/services/modules/get_all_course_modules.php index 8fbc0ec4..cc2010b0 100644 --- a/lbplanner/services/modules/get_all_course_modules.php +++ b/lbplanner/services/modules/get_all_course_modules.php @@ -26,7 +26,7 @@ * * @package local_lbplanner * @subpackage services_modules - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class modules_get_all_course_modules extends external_api { diff --git a/lbplanner/services/modules/get_all_modules.php b/lbplanner/services/modules/get_all_modules.php index 87ae537f..9aaf19ab 100644 --- a/lbplanner/services/modules/get_all_modules.php +++ b/lbplanner/services/modules/get_all_modules.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_modules - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class modules_get_all_modules extends external_api { diff --git a/lbplanner/services/modules/get_module.php b/lbplanner/services/modules/get_module.php index 9fde0d01..234cc73b 100644 --- a/lbplanner/services/modules/get_module.php +++ b/lbplanner/services/modules/get_module.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_modules - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class modules_get_module extends external_api { diff --git a/lbplanner/services/notifications/get_all_notifications.php b/lbplanner/services/notifications/get_all_notifications.php index b1ebe094..a65370d8 100644 --- a/lbplanner/services/notifications/get_all_notifications.php +++ b/lbplanner/services/notifications/get_all_notifications.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_notifications - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class notifications_get_all_notifications extends external_api { diff --git a/lbplanner/services/notifications/update_notification.php b/lbplanner/services/notifications/update_notification.php index 9e8944a0..f1e3fe4d 100644 --- a/lbplanner/services/notifications/update_notification.php +++ b/lbplanner/services/notifications/update_notification.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_notifications - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class notifications_update_notification extends external_api { diff --git a/lbplanner/services/plan/accept_invite.php b/lbplanner/services/plan/accept_invite.php index 73fd4cd7..9f8b064c 100644 --- a/lbplanner/services/plan/accept_invite.php +++ b/lbplanner/services/plan/accept_invite.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_accept_invite extends external_api { diff --git a/lbplanner/services/plan/clear_plan.php b/lbplanner/services/plan/clear_plan.php index b35daf8e..1d352e50 100644 --- a/lbplanner/services/plan/clear_plan.php +++ b/lbplanner/services/plan/clear_plan.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_clear_plan extends external_api { diff --git a/lbplanner/services/plan/decline_invite.php b/lbplanner/services/plan/decline_invite.php index 3281548a..28a60ac8 100644 --- a/lbplanner/services/plan/decline_invite.php +++ b/lbplanner/services/plan/decline_invite.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_decline_invite extends external_api { diff --git a/lbplanner/services/plan/get_invites.php b/lbplanner/services/plan/get_invites.php index 82a78892..5831398f 100644 --- a/lbplanner/services/plan/get_invites.php +++ b/lbplanner/services/plan/get_invites.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_get_invites extends external_api { diff --git a/lbplanner/services/plan/get_plan.php b/lbplanner/services/plan/get_plan.php index 0a6972d4..2896ecd2 100644 --- a/lbplanner/services/plan/get_plan.php +++ b/lbplanner/services/plan/get_plan.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_get_plan extends \core_external\external_api { diff --git a/lbplanner/services/plan/invite_user.php b/lbplanner/services/plan/invite_user.php index 26d977e4..0f81225a 100644 --- a/lbplanner/services/plan/invite_user.php +++ b/lbplanner/services/plan/invite_user.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_invite_user extends external_api { diff --git a/lbplanner/services/plan/remove_user.php b/lbplanner/services/plan/remove_user.php index 37e29222..171194da 100644 --- a/lbplanner/services/plan/remove_user.php +++ b/lbplanner/services/plan/remove_user.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_remove_user extends external_api { diff --git a/lbplanner/services/plan/update_plan.php b/lbplanner/services/plan/update_plan.php index bc269827..f8d8952a 100644 --- a/lbplanner/services/plan/update_plan.php +++ b/lbplanner/services/plan/update_plan.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_update_plan extends external_api { diff --git a/lbplanner/services/slots/add_slot_filter.php b/lbplanner/services/slots/add_slot_filter.php index d89828f1..7b56aac2 100644 --- a/lbplanner/services/slots/add_slot_filter.php +++ b/lbplanner/services/slots/add_slot_filter.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_add_slot_filter extends external_api { diff --git a/lbplanner/services/slots/add_slot_supervisor.php b/lbplanner/services/slots/add_slot_supervisor.php index 7b147f5c..5247caf2 100644 --- a/lbplanner/services/slots/add_slot_supervisor.php +++ b/lbplanner/services/slots/add_slot_supervisor.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_add_slot_supervisor extends external_api { diff --git a/lbplanner/services/slots/book_reservation.php b/lbplanner/services/slots/book_reservation.php index 5f1a07c1..a1fef236 100644 --- a/lbplanner/services/slots/book_reservation.php +++ b/lbplanner/services/slots/book_reservation.php @@ -30,7 +30,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_book_reservation extends external_api { diff --git a/lbplanner/services/slots/create_slot.php b/lbplanner/services/slots/create_slot.php index b295c102..cd8ab06c 100644 --- a/lbplanner/services/slots/create_slot.php +++ b/lbplanner/services/slots/create_slot.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_create_slot extends external_api { diff --git a/lbplanner/services/slots/delete_slot.php b/lbplanner/services/slots/delete_slot.php index b922c1ce..48333ea2 100644 --- a/lbplanner/services/slots/delete_slot.php +++ b/lbplanner/services/slots/delete_slot.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_delete_slot extends external_api { diff --git a/lbplanner/services/slots/delete_slot_filter.php b/lbplanner/services/slots/delete_slot_filter.php index d959ac5c..697d6efa 100644 --- a/lbplanner/services/slots/delete_slot_filter.php +++ b/lbplanner/services/slots/delete_slot_filter.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_delete_slot_filter extends external_api { diff --git a/lbplanner/services/slots/get_my_reservations.php b/lbplanner/services/slots/get_my_reservations.php index 9d826a64..6e3226d3 100644 --- a/lbplanner/services/slots/get_my_reservations.php +++ b/lbplanner/services/slots/get_my_reservations.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_my_reservations extends external_api { diff --git a/lbplanner/services/slots/get_my_slots.php b/lbplanner/services/slots/get_my_slots.php index 85862bf2..469a6cbc 100644 --- a/lbplanner/services/slots/get_my_slots.php +++ b/lbplanner/services/slots/get_my_slots.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_my_slots extends external_api { diff --git a/lbplanner/services/slots/get_slot_filters.php b/lbplanner/services/slots/get_slot_filters.php index 6f95b1f1..9b0a4f9b 100644 --- a/lbplanner/services/slots/get_slot_filters.php +++ b/lbplanner/services/slots/get_slot_filters.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_slot_filters extends external_api { diff --git a/lbplanner/services/slots/get_slot_reservations.php b/lbplanner/services/slots/get_slot_reservations.php index d18943d9..8834697e 100644 --- a/lbplanner/services/slots/get_slot_reservations.php +++ b/lbplanner/services/slots/get_slot_reservations.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_slot_reservations extends external_api { diff --git a/lbplanner/services/slots/get_student_slots.php b/lbplanner/services/slots/get_student_slots.php index df430d98..7774a336 100644 --- a/lbplanner/services/slots/get_student_slots.php +++ b/lbplanner/services/slots/get_student_slots.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_student_slots extends external_api { diff --git a/lbplanner/services/slots/unbook_reservation.php b/lbplanner/services/slots/unbook_reservation.php index 8591bbbe..a3a03fc1 100644 --- a/lbplanner/services/slots/unbook_reservation.php +++ b/lbplanner/services/slots/unbook_reservation.php @@ -26,7 +26,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_unbook_reservation extends external_api { diff --git a/lbplanner/services/slots/update_slot.php b/lbplanner/services/slots/update_slot.php index 7150dee9..4ff4142e 100644 --- a/lbplanner/services/slots/update_slot.php +++ b/lbplanner/services/slots/update_slot.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_TODO - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_update_slot extends external_api { diff --git a/lbplanner/services/user/get_all_users.php b/lbplanner/services/user/get_all_users.php index ff2471eb..e9f48492 100644 --- a/lbplanner/services/user/get_all_users.php +++ b/lbplanner/services/user/get_all_users.php @@ -30,7 +30,7 @@ * * @package local_lbplanner * @subpackage services_user - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class user_get_all_users extends external_api { diff --git a/lbplanner/services/user/get_user.php b/lbplanner/services/user/get_user.php index 48f31b4e..42d7e3ac 100644 --- a/lbplanner/services/user/get_user.php +++ b/lbplanner/services/user/get_user.php @@ -28,7 +28,7 @@ * * @package local_lbplanner * @subpackage services_user - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class user_get_user extends \core_external\external_api { From 5aebbba33f80f37c7c49e53e71e346eb5622e049 Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 17:43:57 +0200 Subject: [PATCH 18/22] chore: updated copyright years --- lbplanner/services/config/get_version.php | 2 +- lbplanner/services/courses/update_course.php | 2 +- lbplanner/services/modules/get_all_course_modules.php | 2 +- lbplanner/services/modules/get_all_modules.php | 2 +- lbplanner/services/modules/get_module.php | 2 +- lbplanner/services/notifications/get_all_notifications.php | 2 +- lbplanner/services/notifications/update_notification.php | 2 +- lbplanner/services/plan/accept_invite.php | 2 +- lbplanner/services/plan/clear_plan.php | 2 +- lbplanner/services/plan/decline_invite.php | 2 +- lbplanner/services/plan/delete_deadline.php | 2 +- lbplanner/services/plan/get_invites.php | 2 +- lbplanner/services/plan/get_plan.php | 2 +- lbplanner/services/plan/invite_user.php | 2 +- lbplanner/services/plan/leave_plan.php | 2 +- lbplanner/services/plan/remove_user.php | 2 +- lbplanner/services/plan/set_deadline.php | 2 +- lbplanner/services/plan/update_access.php | 2 +- lbplanner/services/plan/update_plan.php | 2 +- lbplanner/services/slots/add_slot_filter.php | 2 +- lbplanner/services/slots/add_slot_supervisor.php | 2 +- lbplanner/services/slots/book_reservation.php | 2 +- lbplanner/services/slots/create_slot.php | 2 +- lbplanner/services/slots/delete_slot.php | 2 +- lbplanner/services/slots/delete_slot_filter.php | 2 +- lbplanner/services/slots/get_my_reservations.php | 2 +- lbplanner/services/slots/get_my_slots.php | 2 +- lbplanner/services/slots/get_slot_filters.php | 2 +- lbplanner/services/slots/get_slot_reservations.php | 2 +- lbplanner/services/slots/get_student_slots.php | 2 +- lbplanner/services/slots/unbook_reservation.php | 2 +- lbplanner/services/slots/update_slot.php | 2 +- lbplanner/services/user/delete_user.php | 2 +- lbplanner/services/user/get_all_users.php | 2 +- lbplanner/services/user/get_user.php | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/lbplanner/services/config/get_version.php b/lbplanner/services/config/get_version.php index 72740eca..b8bbada6 100644 --- a/lbplanner/services/config/get_version.php +++ b/lbplanner/services/config/get_version.php @@ -23,7 +23,7 @@ * * @package local_lbplanner * @subpackage services_config - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class config_get_version extends external_api { diff --git a/lbplanner/services/courses/update_course.php b/lbplanner/services/courses/update_course.php index 32ccd10f..c22f22aa 100644 --- a/lbplanner/services/courses/update_course.php +++ b/lbplanner/services/courses/update_course.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_courses - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class courses_update_course extends external_api { diff --git a/lbplanner/services/modules/get_all_course_modules.php b/lbplanner/services/modules/get_all_course_modules.php index 8fbc0ec4..cc2010b0 100644 --- a/lbplanner/services/modules/get_all_course_modules.php +++ b/lbplanner/services/modules/get_all_course_modules.php @@ -26,7 +26,7 @@ * * @package local_lbplanner * @subpackage services_modules - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class modules_get_all_course_modules extends external_api { diff --git a/lbplanner/services/modules/get_all_modules.php b/lbplanner/services/modules/get_all_modules.php index 87ae537f..9aaf19ab 100644 --- a/lbplanner/services/modules/get_all_modules.php +++ b/lbplanner/services/modules/get_all_modules.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_modules - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class modules_get_all_modules extends external_api { diff --git a/lbplanner/services/modules/get_module.php b/lbplanner/services/modules/get_module.php index 9fde0d01..234cc73b 100644 --- a/lbplanner/services/modules/get_module.php +++ b/lbplanner/services/modules/get_module.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_modules - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class modules_get_module extends external_api { diff --git a/lbplanner/services/notifications/get_all_notifications.php b/lbplanner/services/notifications/get_all_notifications.php index b1ebe094..a65370d8 100644 --- a/lbplanner/services/notifications/get_all_notifications.php +++ b/lbplanner/services/notifications/get_all_notifications.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_notifications - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class notifications_get_all_notifications extends external_api { diff --git a/lbplanner/services/notifications/update_notification.php b/lbplanner/services/notifications/update_notification.php index 9e8944a0..f1e3fe4d 100644 --- a/lbplanner/services/notifications/update_notification.php +++ b/lbplanner/services/notifications/update_notification.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_notifications - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class notifications_update_notification extends external_api { diff --git a/lbplanner/services/plan/accept_invite.php b/lbplanner/services/plan/accept_invite.php index 73fd4cd7..9f8b064c 100644 --- a/lbplanner/services/plan/accept_invite.php +++ b/lbplanner/services/plan/accept_invite.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_accept_invite extends external_api { diff --git a/lbplanner/services/plan/clear_plan.php b/lbplanner/services/plan/clear_plan.php index b35daf8e..1d352e50 100644 --- a/lbplanner/services/plan/clear_plan.php +++ b/lbplanner/services/plan/clear_plan.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_clear_plan extends external_api { diff --git a/lbplanner/services/plan/decline_invite.php b/lbplanner/services/plan/decline_invite.php index 3281548a..28a60ac8 100644 --- a/lbplanner/services/plan/decline_invite.php +++ b/lbplanner/services/plan/decline_invite.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_decline_invite extends external_api { diff --git a/lbplanner/services/plan/delete_deadline.php b/lbplanner/services/plan/delete_deadline.php index d56fb7a3..e755935f 100644 --- a/lbplanner/services/plan/delete_deadline.php +++ b/lbplanner/services/plan/delete_deadline.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_delete_deadline extends external_api { diff --git a/lbplanner/services/plan/get_invites.php b/lbplanner/services/plan/get_invites.php index 82a78892..5831398f 100644 --- a/lbplanner/services/plan/get_invites.php +++ b/lbplanner/services/plan/get_invites.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_get_invites extends external_api { diff --git a/lbplanner/services/plan/get_plan.php b/lbplanner/services/plan/get_plan.php index 0a6972d4..2896ecd2 100644 --- a/lbplanner/services/plan/get_plan.php +++ b/lbplanner/services/plan/get_plan.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_get_plan extends \core_external\external_api { diff --git a/lbplanner/services/plan/invite_user.php b/lbplanner/services/plan/invite_user.php index 26d977e4..0f81225a 100644 --- a/lbplanner/services/plan/invite_user.php +++ b/lbplanner/services/plan/invite_user.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_invite_user extends external_api { diff --git a/lbplanner/services/plan/leave_plan.php b/lbplanner/services/plan/leave_plan.php index da67380b..f449da8a 100644 --- a/lbplanner/services/plan/leave_plan.php +++ b/lbplanner/services/plan/leave_plan.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_leave_plan extends external_api { diff --git a/lbplanner/services/plan/remove_user.php b/lbplanner/services/plan/remove_user.php index 37e29222..171194da 100644 --- a/lbplanner/services/plan/remove_user.php +++ b/lbplanner/services/plan/remove_user.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_remove_user extends external_api { diff --git a/lbplanner/services/plan/set_deadline.php b/lbplanner/services/plan/set_deadline.php index 225ade8f..d84b3102 100644 --- a/lbplanner/services/plan/set_deadline.php +++ b/lbplanner/services/plan/set_deadline.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_set_deadline extends external_api { diff --git a/lbplanner/services/plan/update_access.php b/lbplanner/services/plan/update_access.php index 4ac83084..e147d293 100644 --- a/lbplanner/services/plan/update_access.php +++ b/lbplanner/services/plan/update_access.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_update_access extends external_api { diff --git a/lbplanner/services/plan/update_plan.php b/lbplanner/services/plan/update_plan.php index bc269827..f8d8952a 100644 --- a/lbplanner/services/plan/update_plan.php +++ b/lbplanner/services/plan/update_plan.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_plan - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class plan_update_plan extends external_api { diff --git a/lbplanner/services/slots/add_slot_filter.php b/lbplanner/services/slots/add_slot_filter.php index d89828f1..7b56aac2 100644 --- a/lbplanner/services/slots/add_slot_filter.php +++ b/lbplanner/services/slots/add_slot_filter.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_add_slot_filter extends external_api { diff --git a/lbplanner/services/slots/add_slot_supervisor.php b/lbplanner/services/slots/add_slot_supervisor.php index 7b147f5c..5247caf2 100644 --- a/lbplanner/services/slots/add_slot_supervisor.php +++ b/lbplanner/services/slots/add_slot_supervisor.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_add_slot_supervisor extends external_api { diff --git a/lbplanner/services/slots/book_reservation.php b/lbplanner/services/slots/book_reservation.php index 5f1a07c1..a1fef236 100644 --- a/lbplanner/services/slots/book_reservation.php +++ b/lbplanner/services/slots/book_reservation.php @@ -30,7 +30,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_book_reservation extends external_api { diff --git a/lbplanner/services/slots/create_slot.php b/lbplanner/services/slots/create_slot.php index b295c102..cd8ab06c 100644 --- a/lbplanner/services/slots/create_slot.php +++ b/lbplanner/services/slots/create_slot.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_create_slot extends external_api { diff --git a/lbplanner/services/slots/delete_slot.php b/lbplanner/services/slots/delete_slot.php index b922c1ce..48333ea2 100644 --- a/lbplanner/services/slots/delete_slot.php +++ b/lbplanner/services/slots/delete_slot.php @@ -24,7 +24,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_delete_slot extends external_api { diff --git a/lbplanner/services/slots/delete_slot_filter.php b/lbplanner/services/slots/delete_slot_filter.php index d959ac5c..697d6efa 100644 --- a/lbplanner/services/slots/delete_slot_filter.php +++ b/lbplanner/services/slots/delete_slot_filter.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_delete_slot_filter extends external_api { diff --git a/lbplanner/services/slots/get_my_reservations.php b/lbplanner/services/slots/get_my_reservations.php index 9d826a64..6e3226d3 100644 --- a/lbplanner/services/slots/get_my_reservations.php +++ b/lbplanner/services/slots/get_my_reservations.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_my_reservations extends external_api { diff --git a/lbplanner/services/slots/get_my_slots.php b/lbplanner/services/slots/get_my_slots.php index 85862bf2..469a6cbc 100644 --- a/lbplanner/services/slots/get_my_slots.php +++ b/lbplanner/services/slots/get_my_slots.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_my_slots extends external_api { diff --git a/lbplanner/services/slots/get_slot_filters.php b/lbplanner/services/slots/get_slot_filters.php index 6f95b1f1..9b0a4f9b 100644 --- a/lbplanner/services/slots/get_slot_filters.php +++ b/lbplanner/services/slots/get_slot_filters.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_slot_filters extends external_api { diff --git a/lbplanner/services/slots/get_slot_reservations.php b/lbplanner/services/slots/get_slot_reservations.php index d18943d9..8834697e 100644 --- a/lbplanner/services/slots/get_slot_reservations.php +++ b/lbplanner/services/slots/get_slot_reservations.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_slot_reservations extends external_api { diff --git a/lbplanner/services/slots/get_student_slots.php b/lbplanner/services/slots/get_student_slots.php index df430d98..7774a336 100644 --- a/lbplanner/services/slots/get_student_slots.php +++ b/lbplanner/services/slots/get_student_slots.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_get_student_slots extends external_api { diff --git a/lbplanner/services/slots/unbook_reservation.php b/lbplanner/services/slots/unbook_reservation.php index 8591bbbe..a3a03fc1 100644 --- a/lbplanner/services/slots/unbook_reservation.php +++ b/lbplanner/services/slots/unbook_reservation.php @@ -26,7 +26,7 @@ * * @package local_lbplanner * @subpackage services_slots - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_unbook_reservation extends external_api { diff --git a/lbplanner/services/slots/update_slot.php b/lbplanner/services/slots/update_slot.php index 7150dee9..4ff4142e 100644 --- a/lbplanner/services/slots/update_slot.php +++ b/lbplanner/services/slots/update_slot.php @@ -25,7 +25,7 @@ * * @package local_lbplanner * @subpackage services_TODO - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class slots_update_slot extends external_api { diff --git a/lbplanner/services/user/delete_user.php b/lbplanner/services/user/delete_user.php index af58f849..a4a9c9f9 100644 --- a/lbplanner/services/user/delete_user.php +++ b/lbplanner/services/user/delete_user.php @@ -27,7 +27,7 @@ * * @package local_lbplanner * @subpackage services_user - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class user_delete_user extends external_api { diff --git a/lbplanner/services/user/get_all_users.php b/lbplanner/services/user/get_all_users.php index ff2471eb..e9f48492 100644 --- a/lbplanner/services/user/get_all_users.php +++ b/lbplanner/services/user/get_all_users.php @@ -30,7 +30,7 @@ * * @package local_lbplanner * @subpackage services_user - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class user_get_all_users extends external_api { diff --git a/lbplanner/services/user/get_user.php b/lbplanner/services/user/get_user.php index 48f31b4e..42d7e3ac 100644 --- a/lbplanner/services/user/get_user.php +++ b/lbplanner/services/user/get_user.php @@ -28,7 +28,7 @@ * * @package local_lbplanner * @subpackage services_user - * @copyright 2024 necodeIT + * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ class user_get_user extends \core_external\external_api { From 058011eb4a2866fe4057a07f88b5bb51eecc74a2 Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 17:49:19 +0200 Subject: [PATCH 19/22] fix: Corrected subpackage doc --- lbplanner/services/slots/update_slot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lbplanner/services/slots/update_slot.php b/lbplanner/services/slots/update_slot.php index 4ff4142e..1ee475e5 100644 --- a/lbplanner/services/slots/update_slot.php +++ b/lbplanner/services/slots/update_slot.php @@ -24,7 +24,7 @@ * Update a slot's values * * @package local_lbplanner - * @subpackage services_TODO + * @subpackage services_slots * @copyright 2025 necodeIT * @license https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA 4.0 International or later */ From 4596db89f0536aa508c2330ffcbf8eee77484fb6 Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 19:32:20 +0200 Subject: [PATCH 20/22] ci: fixed warn crashing if no context is given --- document_services.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/document_services.py b/document_services.py index 0922c215..4c37f529 100644 --- a/document_services.py +++ b/document_services.py @@ -34,7 +34,8 @@ def warn(msg: str, *context: Any): context = tuple(f"{c}".strip() for c in context) context_formatted = [f"\n{c}\033[0m".replace('\n', f"\n\033[0m{WARN_TAB} \033[2m") for c in context] - context_formatted[-1] = context_formatted[-1].replace(WARN_TAB, WARN_TAB_LAST) + if len(context_formatted) > 0: + context_formatted[-1] = context_formatted[-1].replace(WARN_TAB, WARN_TAB_LAST) print( f"{WARN}\033[31m{msg}\033[0m {service_msg}({stack_str})", From f6c66b3a2a8d57fa73ec29395aa09907629c02eb Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 19:33:22 +0200 Subject: [PATCH 21/22] ci: minor typing fixes --- document_services.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/document_services.py b/document_services.py index 4c37f529..f6ffeec7 100644 --- a/document_services.py +++ b/document_services.py @@ -438,8 +438,8 @@ class DocString(SlotsDict): description: str params: dict[str, DocString_TypeDescPair] returns: DocString_TypeDescPair | None - subpackage: str - copyright: tuple[int, str] + subpackage: str | None + copyright: tuple[int, str] | None def __init__( self, @@ -1051,8 +1051,11 @@ def main() -> None: # TODO: check params # checking copyright - with Popen(["git", "log", "-1", '--pretty=format:%as', info.path], stdout=PIPE) as p: - lastmodificationyear = int(p.communicate()[0].decode('utf-8').split('-')[0]) + if main_docstring.copyright is None: + warn("missing copyright notice") + else: + with Popen(["git", "log", "-1", '--pretty=format:%as', info.path], stdout=PIPE) as p: + lastmodificationyear = int(p.communicate()[0].decode('utf-8').split('-')[0]) if main_docstring.copyright[0] != lastmodificationyear: warn( "incorrect copyright year", From ca7e41ead96e20786adb4a3ad8efc833d681f886 Mon Sep 17 00:00:00 2001 From: Riedler Date: Sun, 12 Oct 2025 19:34:12 +0200 Subject: [PATCH 22/22] ci: checking parameters --- document_services.py | 86 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/document_services.py b/document_services.py index f6ffeec7..c4c0afdd 100644 --- a/document_services.py +++ b/document_services.py @@ -44,7 +44,26 @@ def warn(msg: str, *context: Any): sep="" ) -def convert_php_type_to_normal_type(param_type: str) -> str: +def convert_php_type_to_normal_type(php_type: str) -> tuple[str, bool]: + CONVERSIONS = { + "int": "int", + "string": "String", + "bool": "bool", + } + + if php_type[0] == '?': + nullable = True + php_type = php_type[1:] + else: + nullable = False + + if php_type in CONVERSIONS.keys(): + return CONVERSIONS[php_type], nullable + else: + warn("unrecognized php datatype", php_type) + return php_type, nullable + +def convert_moodle_type_to_normal_type(param_type: str) -> str: CONVERSIONS = { "PARAM_INT": "int", "PARAM_TEXT": "String", @@ -340,7 +359,7 @@ def toIR(self) -> 'IRElement': return IRValue(None, None, nullable=True, description="", required=True) assert isinstance(self.parameters[0], PHPConstant) assert isinstance(self.parameters[1], PHPString) - typ = convert_php_type_to_normal_type(self.parameters[0].name) + typ = convert_moodle_type_to_normal_type(self.parameters[0].name) desc = self.parameters[1].get_value() required = True @@ -459,11 +478,11 @@ class ExtractedAPIFunction(SlotsDict): __slots__ = ('docstring', 'name', 'params', 'returns', 'body') docstring: DocString name: str - params: str + params: dict[str, str] returns: str body: str - def __init__(self, docstring: DocString, name: str, params: str, returns: str, body: str): + def __init__(self, docstring: DocString, name: str, params: dict[str, str], returns: str, body: str): self.docstring = docstring self.name = name self.params = params @@ -858,7 +877,7 @@ def extract_api_functions(php_code: str, name: str) -> tuple[ExtractedAPIFunctio function_packed = ExtractedAPIFunction( parse_docstring(func_docstring), func_name, - func_params, + parse_php_function_parameters(func_params), func_returns, func_body ) @@ -932,6 +951,16 @@ def parse_docstring(inpot: str) -> DocString: return DocString(desc, params, returns, subpackage, copyright) +def parse_php_function_parameters(inpot: str) -> dict[str, str]: + """ "int $a, string $b" → {"a": "int", "b": "string"} """ + # https://regex101.com/r/zfWGKi + matches = re.findall(r"(\??[a-z]+)\s+\$([a-z_]+)", inpot) + out = {} + for match in matches: + out[match[1]] = match[0] + + return out + def find_import(nr: PHPNameResolution, symbol: str) -> str | None: def makepath(p: str, symbol: str): @@ -1039,8 +1068,8 @@ def main() -> None: complete_info.append(FunctionInfoEx(info, params, returns)) - # checking function descriptions if main_func is not None: + # checking function descriptions if main_func.docstring.description != info.description or main_docstring.description != info.description: warn( "non-matching API function descriptions", @@ -1048,7 +1077,50 @@ def main() -> None: f"class docstring: {main_docstring.description}", f"service description: {info.description}", ) - # TODO: check params + + # checking parameters + all_param_names = set() + params_moodleset: dict[str, tuple[str, bool]] = {} + if isinstance(params, IRObject): + for name, param in params.fields.items(): + if isinstance(param, IRValue): + params_moodleset[name] = param.type, param.nullable + all_param_names.add(name) + else: + warn("parameters' IRObject contains non-IRValue", param, params) + elif params is not None: + warn("parameters function does not return IRObject", params) + + params_docstringset: dict[str, tuple[str, bool]] = {} + for name, docpair in main_func.docstring.params.items(): + name = name[1:] # removing dollar sign + params_docstringset[name] = convert_php_type_to_normal_type(docpair.typ) + all_param_names.add(name) + + params_phpset: dict[str, tuple[str, bool]] = {} + for name, typ in main_func.params.items(): + params_phpset[name] = convert_php_type_to_normal_type(typ) + + for name in all_param_names: + if not ( + name in params_moodleset.keys() + and name in params_docstringset.keys() + and name in params_phpset.keys() + ): + warn( + "API call parameter not found in all parameter lists", + f"moodle: {params_moodleset}", + f"docstring: {params_docstringset}", + f"php: {params_phpset}", + ) + elif not (params_moodleset[name] == params_docstringset[name] == params_phpset[name]): + warn( + "API call parameter not the same type in all parameter lists", + name, + f"moodle: {params_moodleset[name]}", + f"docstring: {params_docstringset[name]}", + f"php: {params_phpset[name]}", + ) # checking copyright if main_docstring.copyright is None: