Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Switch to pathlib and implement annotations #80

Conversation

etienne-monier
Copy link
Contributor

This PR use pathlib instead of os + os.path.

Some type hint were added to functions.

@etienne-monier etienne-monier force-pushed the refactor/pathlib-and-annotations branch from d80f8ee to 1fc29e6 Compare January 31, 2024 16:12
Newline argument was added to write_text in Python 3.10
Copy link
Contributor

@PatrickMassot PatrickMassot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai lu en diagonale et pinaillé sur quelques trucs. Par ailleurs il faudrait sans doute ajouter mypy en intégration continue maintenant qu'il y a des annotations de type.


if __name__ == "__main__":
cli()
cli()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cette ligne dupliquée est une typo, n'est-ce pas ?


import click
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même commentaire que plus haut.


import click
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même commentaire que plus haut.


import click
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je trouve un peu étrange d'importer click dans un fichier qui n'est pas le client en ligne de commande. Je vois que c'est utilisé pour avoir click.echo. Pourquoi ne pas utiliser le module logging de la bibliothèque standard Python plutôt ?

elif line.startswith("// LAFAYETTE::"): # obsolete marker
return "lafayette"
return None
def is_new_symbol_mark(line: str) -> Union[str, None]:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi utiliser Union[str, None] plutôt que Optional[str] ? Par ailleurs je trouve le nom de cette fonction un peu contre-intuitif. Vu le nom j'attendrais bool comme type de retour.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je confirme, le nom est totalement idiot. Je ne me souviens même plus pourquoi ça s’appelle comme ça.

@@ -351,8 +348,10 @@ def _fill_template(self, template, rows, layer_number):

return template

def _get_geometry(self, layers=[Layer.BASE]):
def _get_geometry(self, layers: Union[List[Layer], None] = None) -> str:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pourquoi Union[List[Layer], None] plutôt que Optional[List[Layer]] ?

"""`geometry` view of the requested layers."""
if layers is None:
layers = [Layer.BASE]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est-ce vraiment ce qu'on veut ou bien layers = layers or [Layer.BASE] serait mieux ? La différence principale vient du cas où layers est [].

kalamine/cli.py Outdated
"""Convert TOML/YAML descriptions into OS-specific keyboard drivers."""

for input_file in layout_descriptors:
layout = KeyboardLayout(input_file)

# default: build all in the `dist` subdirectory
if out == "all":
make_all(layout, "dist")
make_all(layout, Path(__file__).parent.parent / "dist")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ce changement a l'air d'aller au-delà de l'utilisation de pathlib et des annotations. Je n'ai pas vérifié ce qu'il fait.

Copy link
Collaborator

@fabi1cazenave fabi1cazenave Jan 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci du heads-up. En fait on ne veut pas de cette ligne.

C’est bourrin mais par défaut, kalamine génère tous les pilotes dans un sous-répertoire dist du répertoire courant. Ça mériterait certainement une option (e.g. --output-dir), mais on ne veut pas générer les fichiers dans le dossier de kalamine.

Copy link
Collaborator

@fabi1cazenave fabi1cazenave left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci pour le boulot, j’apprends plein de choses ! Le seul point qui m’apparaisse bloquant c’est l’histoire du répertoire de sortie dist.

Je n’ai pas d’avis pour click (même si le commentaire de Patrick me parle). Je ne savais même pas qu’il pouvait faire ça.

Si on peut utiliser Optional j’avoue que ça me parle plus que Union[*, None], mais c’est vous les spécialistes.

kalamine/cli.py Outdated
"""Convert TOML/YAML descriptions into OS-specific keyboard drivers."""

for input_file in layout_descriptors:
layout = KeyboardLayout(input_file)

# default: build all in the `dist` subdirectory
if out == "all":
make_all(layout, "dist")
make_all(layout, Path(__file__).parent.parent / "dist")
Copy link
Collaborator

@fabi1cazenave fabi1cazenave Jan 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Merci du heads-up. En fait on ne veut pas de cette ligne.

C’est bourrin mais par défaut, kalamine génère tous les pilotes dans un sous-répertoire dist du répertoire courant. Ça mériterait certainement une option (e.g. --output-dir), mais on ne veut pas générer les fichiers dans le dossier de kalamine.

""".format(
layer_name or layout_layer,
"\n".join(getattr(get_layout(layout_name), layout_layer)),
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Chipotage…)

Là j’avoue que j’avais fait à coups de += pare que je n’avais rien trouvé qui fonctionne sans péter l’indentation — ce qui, sur mon environnement de boulot, pète le repliement de code. Il y a peut-être une ruse de dedent qu’on pourrait utiliser ici ?

finally:
temp_file.close()
temp_file.write(layout.xkb)
os.system(f"xkbcomp -w0 {temp_file.name} $DISPLAY")
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J’en conclus donc qu’il n’y a pas besoin de fermer un fichier temporaire ? Le système s’en débarrasse de toute façon ?

return any(
self.layers[layer_index][layer_id] == char
for layer_id in self.layers[layer_index]
)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Joli. :-)
Je crois que layer_index est de type Layer.

self.dead_keys[dk_id]["base"] = used_base
self.dead_keys[dk_id]["alt"] = used_alt
dk_dict["base"] = used_base
dk_dict["alt"] = used_alt
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bêtement, toute cette boucle for pète dans le refacto et va donc disparaître. Mais pour ma compréhension : pourquoi le nom unknown_element ? Ici l’idée était de parcourir un tableau de caractères (base), donc on sait assez précisément ce que l’élément contient, non ?

(Je note le coup du enumerate, j’adore.)

deadkeys[index]["\u0020"] = dk["alt_space"]
deadkeys[index]["\u00a0"] = dk["alt_space"]
deadkeys[index]["\u202f"] = dk["alt_space"]
if index == ODK_ID:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je profite d’avoir des gens expérimentés pour essayer de progresser…

Ici j’ai utilisé id parce que la clé du dictionnaire est un identifiant de touche morte (e.g. **, *^, *', etc.) et non un indice. Mais je fais peut-être une erreur de sémantique ?

(Tout ce code étant au cœur du refacto, il va sauter de toute façon.)

elif line.startswith("// LAFAYETTE::"): # obsolete marker
return "lafayette"
return None
def is_new_symbol_mark(line: str) -> Union[str, None]:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je confirme, le nom est totalement idiot. Je ne me souviens même plus pourquoi ça s’appelle comme ça.

@fabi1cazenave fabi1cazenave dismissed their stale review February 1, 2024 15:18

let’s merge this first and think about it later

@@ -213,7 +209,7 @@ def __init__(self, filepath):
def _parse_dead_keys(self, spc):
"""Build a deadkey dict."""

def layout_has_char(char):
def (char: str) -> bool:
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

j’ai bêtement fait sauter le nom de la fonction en rebasant depuis le navigateur… boulet…

fixing a typo I did while rebasing in the web interface
fix a quick typo
str/Path mismatch
fix a rebasing mistake
@fabi1cazenave fabi1cazenave merged commit 3da728f into OneDeadKey:master Feb 1, 2024
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants