Skip to content

Commit

Permalink
chore: resolve Ruff warnings A003, B023, D103 and PLR0911 (#684)
Browse files Browse the repository at this point in the history
Co-authored-by: Johannes Nussbaum <39048939+jnussbaum@users.noreply.github.com>
  • Loading branch information
BalduinLandolt and jnussbaum committed Dec 14, 2023
1 parent a7d2e59 commit b0f598c
Show file tree
Hide file tree
Showing 21 changed files with 283 additions and 254 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/tests-on-push.yml
Expand Up @@ -67,7 +67,7 @@ jobs:
run: >
poetry run ruff check .
--output-format=github
--ignore=A002,A003,B023,D101,D102,D103,PLR0911,PLR0912,PLR0913,PLR0915,PLR2004,PLR5501,PLW0603
--ignore=A002,D101,D102,PLR0912,PLR0913,PLR0915,PLR2004,PLR5501,PLW0603
- name: Formatting with ruff
run: poetry run ruff format .
- name: Linting with mypy
Expand Down
4 changes: 0 additions & 4 deletions .pre-commit-config.yaml
Expand Up @@ -8,12 +8,8 @@ repos:
- id: ruff
args: [
--ignore=A002,
--ignore=A003,
--ignore=B023,
--ignore=D101,
--ignore=D102,
--ignore=D103,
--ignore=PLR0911,
--ignore=PLR0912,
--ignore=PLR0913,
--ignore=PLR0915,
Expand Down
27 changes: 16 additions & 11 deletions pyproject.toml
Expand Up @@ -104,20 +104,20 @@ pythonpath = [".", "src", "test"]


[tool.mypy]
ignore_missing_imports = true # TODO: deactivate this
ignore_missing_imports = true # TODO: deactivate this
show_column_numbers = true
strict = true
exclude = [
"src/dsp_tools/models/helpers.py", # TODO: activate this
"src/dsp_tools/models/langstring.py", # TODO: activate this
"src/dsp_tools/commands/project/models/group.py", # TODO: activate this
"src/dsp_tools/commands/project/models/listnode.py", # TODO: activate this
"src/dsp_tools/commands/project/models/ontology.py", # TODO: activate this
"src/dsp_tools/commands/project/models/project.py", # TODO: activate this
"src/dsp_tools/models/projectContext.py", # TODO: activate this
"src/dsp_tools/commands/project/models/propertyclass.py", # TODO: activate this
"src/dsp_tools/commands/project/models/resourceclass.py", # TODO: activate this
"src/dsp_tools/commands/project/models/user.py", # TODO: activate this
"src/dsp_tools/models/helpers.py", # TODO: activate this
"src/dsp_tools/models/langstring.py", # TODO: activate this
"src/dsp_tools/commands/project/models/group.py", # TODO: activate this
"src/dsp_tools/commands/project/models/listnode.py", # TODO: activate this
"src/dsp_tools/commands/project/models/ontology.py", # TODO: activate this
"src/dsp_tools/commands/project/models/project.py", # TODO: activate this
"src/dsp_tools/models/projectContext.py", # TODO: activate this
"src/dsp_tools/commands/project/models/propertyclass.py", # TODO: activate this
"src/dsp_tools/commands/project/models/resourceclass.py", # TODO: activate this
"src/dsp_tools/commands/project/models/user.py", # TODO: activate this
]


Expand Down Expand Up @@ -167,6 +167,11 @@ ignore = [
"testdata/**" = [
"INP001", # implicit-namespace-package # there are some python files, but no __init__.py
]
"test/*" = [
"D103", # pydocstyle: undocumented-public-function
"D102", # pydocstyle: undocumented-public-method
"D101", # pydocstyle: undocumented-public-class
]


[tool.ruff.lint.pydocstyle]
Expand Down
2 changes: 1 addition & 1 deletion src/dsp_tools/cli/call_action.py
Expand Up @@ -24,7 +24,7 @@
logger = get_logger(__name__)


def call_requested_action(args: argparse.Namespace) -> bool:
def call_requested_action(args: argparse.Namespace) -> bool: # noqa: PLR0911 (Too many return statements)
"""
Call the appropriate method of DSP-TOOLS.
Expand Down
10 changes: 7 additions & 3 deletions src/dsp_tools/commands/excel2json/project.py
Expand Up @@ -57,7 +57,7 @@ def excel2json(
def _validate_folder_structure_get_filenames(data_model_files: str) -> tuple[list[Path], list[Path]]:
if not Path(data_model_files).is_dir():
raise UserError(f"ERROR: {data_model_files} is not a directory.")
folder = [x for x in Path(data_model_files).glob("*") if not regex.search(r"^(\.|~\$).+", x.name)]
folder = [x for x in Path(data_model_files).glob("*") if _non_hidden(x)]
processed_files = []
onto_folders, processed_onto = _get_validate_onto_folder(data_model_files, folder)
processed_files.extend(processed_onto)
Expand All @@ -77,7 +77,7 @@ def _get_validate_list_folder(data_model_files: str, folder: list[Path]) -> tupl
processed_files: list[str] = []
listfolder = [x for x in folder if x.is_dir() and x.name == "lists"]
if listfolder:
listfolder_contents = [x for x in Path(listfolder[0]).glob("*") if not regex.search(r"^(\.|~\$).+", x.name)]
listfolder_contents = [x for x in Path(listfolder[0]).glob("*") if _non_hidden(x)]
if not all(regex.search(r"(de|en|fr|it|rm).xlsx", file.name) for file in listfolder_contents):
raise UserError(
f"The only files allowed in '{data_model_files}/lists' are en.xlsx, de.xlsx, fr.xlsx, it.xlsx, rm.xlsx"
Expand All @@ -94,7 +94,7 @@ def _get_validate_onto_folder(data_model_files: str, folder: list[Path]) -> tupl
f"'{data_model_files}' must contain at least one subfolder named after the pattern 'onto_name (onto_label)'"
)
for onto_folder in onto_folders:
contents = sorted([x.name for x in Path(onto_folder).glob("*") if not regex.search(r"^(\.|~\$).+", x.name)])
contents = sorted([x.name for x in Path(onto_folder).glob("*") if _non_hidden(x)])
if contents != ["properties.xlsx", "resources.xlsx"]:
raise UserError(
f"ERROR: '{data_model_files}/{onto_folder.name}' must contain one file 'properties.xlsx' "
Expand All @@ -104,6 +104,10 @@ def _get_validate_onto_folder(data_model_files: str, folder: list[Path]) -> tupl
return onto_folders, processed_files


def _non_hidden(path: Path) -> bool:
return not regex.search(r"^(\.|~\$).+", path.name)


def _create_project_json(
data_model_files: str, listfolder: list[Path], onto_folders: list[Path]
) -> tuple[bool, dict[str, Any]]:
Expand Down
184 changes: 95 additions & 89 deletions src/dsp_tools/commands/excel2xml/excel2xml_lib.py
Expand Up @@ -11,6 +11,7 @@
import regex
from lxml import etree
from lxml.builder import E
from regex import Match

from dsp_tools.commands.excel2xml.propertyelement import PropertyElement
from dsp_tools.models.exceptions import BaseError
Expand Down Expand Up @@ -136,38 +137,43 @@ def find_date_in_string(string: str) -> Optional[str]:
# sanitize input, just in case that the method was called on an empty or N/A cell
if not check_notna(string):
return None
try:
return _find_date_in_string_throwing(string)
except ValueError:
return None

months_dict = {
"January": 1,
"Jan": 1,
"February": 2,
"Feb": 2,
"March": 3,
"Mar": 3,
"April": 4,
"Apr": 4,
"May": 5,
"June": 6,
"Jun": 6,
"July": 7,
"Jul": 7,
"August": 8,
"Aug": 8,
"September": 9,
"Sept": 9,
"October": 10,
"Oct": 10,
"November": 11,
"Nov": 11,
"December": 12,
"Dec": 12,
}

startdate: Optional[datetime.date] = None
enddate: Optional[datetime.date] = None
startyear: Optional[int] = None
endyear: Optional[int] = None

_months_dict = {
"January": 1,
"Jan": 1,
"February": 2,
"Feb": 2,
"March": 3,
"Mar": 3,
"April": 4,
"Apr": 4,
"May": 5,
"June": 6,
"Jun": 6,
"July": 7,
"Jul": 7,
"August": 8,
"Aug": 8,
"September": 9,
"Sept": 9,
"October": 10,
"Oct": 10,
"November": 11,
"Nov": 11,
"December": 12,
"Dec": 12,
}


def _find_date_in_string_throwing(string: str) -> str | None:
"""
This function is the same as find_date_in_string(), but may raise a ValueError instead of returning None.
"""
year_regex = r"([0-2]?[0-9][0-9][0-9])"
month_regex = r"([0-1]?[0-9])"
day_regex = r"([0-3]?[0-9])"
Expand All @@ -194,79 +200,79 @@ def find_date_in_string(string: str) -> Optional[str]:
string,
)
# template: March 9, 1908 | March5,1908 | May 11, 1906
all_months = "|".join(months_dict)
all_months = "|".join(_months_dict)
monthname_date_regex = rf"{lookbehind}({all_months}) ?{day_regex}, ?{year_regex}{lookahead}"
monthname_date = regex.search(monthname_date_regex, string)
# template: 1849/50 | 1849-50 | 1849/1850
year_range = regex.search(lookbehind + year_regex + r"[/-](\d{1,4})" + lookahead, string)
# template: 1907
year_only = regex.search(rf"{lookbehind}{year_regex}{lookahead}", string)

res: str | None = None
if iso_date:
year = int(iso_date.group(1))
month = int(iso_date.group(2))
day = int(iso_date.group(3))
try:
startdate = datetime.date(year, month, day)
enddate = startdate
except ValueError:
return None

res = _from_iso_date(iso_date)
elif eur_date_range:
startday = int(eur_date_range.group(1))
startmonth = int(eur_date_range.group(2)) if eur_date_range.group(2) else int(eur_date_range.group(5))
startyear = int(eur_date_range.group(3)) if eur_date_range.group(3) else int(eur_date_range.group(6))
endday = int(eur_date_range.group(4))
endmonth = int(eur_date_range.group(5))
endyear = int(eur_date_range.group(6))
try:
startdate = datetime.date(startyear, startmonth, startday)
enddate = datetime.date(endyear, endmonth, endday)
if enddate < startdate:
raise ValueError
except ValueError:
return None

res = _from_eur_date_range(eur_date_range)
elif eur_date:
startday = int(eur_date.group(1))
startmonth = int(eur_date.group(2))
startyear = int(eur_date.group(3))
try:
startdate = datetime.date(startyear, startmonth, startday)
enddate = startdate
except ValueError:
return None

res = _from_eur_date(eur_date)
elif monthname_date:
day = int(monthname_date.group(2))
month = months_dict[monthname_date.group(1)]
year = int(monthname_date.group(3))
try:
startdate = datetime.date(year, month, day)
enddate = startdate
except ValueError:
return None

res = _from_monthname_date(monthname_date)
elif year_range:
startyear = int(year_range.group(1))
endyear = int(year_range.group(2))
if endyear // 10 == 0:
# endyear is only 1-digit: add the first 2-3 digits of startyear
endyear = startyear // 10 * 10 + endyear
elif endyear // 100 == 0:
# endyear is only 2-digit: add the first 1-2 digits of startyear
endyear = startyear // 100 * 100 + endyear

res = _from_year_range(year_range)
elif year_only:
startyear = int(year_only.group(0))
endyear = startyear
year = int(year_only.group(0))
res = f"GREGORIAN:CE:{year}:CE:{year}"
return res

if startdate and enddate:
return f"GREGORIAN:CE:{startdate.isoformat()}:CE:{enddate.isoformat()}"
elif startyear and endyear:
return f"GREGORIAN:CE:{startyear}:CE:{endyear}"
else:
return None

def _from_iso_date(iso_date: Match[str]) -> str:
year = int(iso_date.group(1))
month = int(iso_date.group(2))
day = int(iso_date.group(3))
date = datetime.date(year, month, day)
return f"GREGORIAN:CE:{date.isoformat()}:CE:{date.isoformat()}"


def _from_eur_date_range(eur_date_range: Match[str]) -> str:
startday = int(eur_date_range.group(1))
startmonth = int(eur_date_range.group(2)) if eur_date_range.group(2) else int(eur_date_range.group(5))
startyear = int(eur_date_range.group(3)) if eur_date_range.group(3) else int(eur_date_range.group(6))
endday = int(eur_date_range.group(4))
endmonth = int(eur_date_range.group(5))
endyear = int(eur_date_range.group(6))
startdate = datetime.date(startyear, startmonth, startday)
enddate = datetime.date(endyear, endmonth, endday)
if enddate < startdate:
raise ValueError
return f"GREGORIAN:CE:{startdate.isoformat()}:CE:{enddate.isoformat()}"


def _from_eur_date(eur_date: Match[str]) -> str:
startday = int(eur_date.group(1))
startmonth = int(eur_date.group(2))
startyear = int(eur_date.group(3))
date = datetime.date(startyear, startmonth, startday)
return f"GREGORIAN:CE:{date.isoformat()}:CE:{date.isoformat()}"


def _from_monthname_date(monthname_date: Match[str]) -> str:
day = int(monthname_date.group(2))
month = _months_dict[monthname_date.group(1)]
year = int(monthname_date.group(3))
date = datetime.date(year, month, day)
return f"GREGORIAN:CE:{date.isoformat()}:CE:{date.isoformat()}"


def _from_year_range(year_range: Match[str]) -> str:
startyear = int(year_range.group(1))
endyear = int(year_range.group(2))
if endyear // 10 == 0:
# endyear is only 1-digit: add the first 2-3 digits of startyear
endyear = startyear // 10 * 10 + endyear
elif endyear // 100 == 0:
# endyear is only 2-digit: add the first 1-2 digits of startyear
endyear = startyear // 100 * 100 + endyear
return f"GREGORIAN:CE:{startyear}:CE:{endyear}"


def prepare_value(
Expand Down
21 changes: 0 additions & 21 deletions src/dsp_tools/commands/project/models/listnode.py
Expand Up @@ -35,27 +35,6 @@
from dsp_tools.utils.connection import Connection


def list_creator(con: Connection, project: Project, parent_node: "ListNode", nodes: list[dict]) -> list["ListNode"]:
nodelist: list[ListNode] = []

for n in nodes:
new_node = ListNode(
con=con,
project=project,
label=n["labels"],
comments=n.get("comments"),
name=n["name"],
parent=parent_node,
)

if n.get("nodes"):
new_node.children = list_creator(con, project, new_node, n["nodes"])

nodelist.append(new_node)

return nodelist


class ListNode(Model):
"""
This class represents a list node
Expand Down
2 changes: 1 addition & 1 deletion src/dsp_tools/commands/project/models/ontology.py
Expand Up @@ -199,7 +199,7 @@ def fromJsonObj(cls, con: Connection, json_obj: Any) -> "Ontology":
property_classes = [
PropertyClass.fromJsonObj(con=con, context=context, json_obj=a)
for a in properties_obj
if WithId(a.get(knora_api + ":objectType")).str() != "knora-api:LinkValue"
if WithId(a.get(knora_api + ":objectType")).to_string() != "knora-api:LinkValue"
]
return cls(
con=con,
Expand Down
6 changes: 3 additions & 3 deletions src/dsp_tools/commands/project/models/propertyclass.py
Expand Up @@ -209,13 +209,13 @@ def fromJsonObj(cls, con: Connection, context: Context, json_obj: Any) -> "Prope
superproperties = [x["@id"] for x in superproperties_obj if x and x.get("@id")]
else:
superproperties = None
rdf_object = WithId(json_obj.get(knora_api + ":objectType")).str()
rdf_subject = WithId(json_obj.get(knora_api + ":subjectType")).str()
rdf_object = WithId(json_obj.get(knora_api + ":objectType")).to_string()
rdf_subject = WithId(json_obj.get(knora_api + ":subjectType")).to_string()
label = LangString.fromJsonLdObj(json_obj.get(rdfs + ":label"))
comment = LangString.fromJsonLdObj(json_obj.get(rdfs + ":comment"))
gui_element = None
if json_obj.get(salsah_gui + ":guiElement") is not None:
gui_element = WithId(json_obj.get(salsah_gui + ":guiElement")).str()
gui_element = WithId(json_obj.get(salsah_gui + ":guiElement")).to_string()
gui_element = gui_element.replace("Pulldown", "List")
gui_element = gui_element.replace("Radio", "List")
gui_attributes_list = json_obj.get(salsah_gui + ":guiAttribute")
Expand Down

0 comments on commit b0f598c

Please sign in to comment.