Skip to content

Add type annotations to the module and the unit tests#6

Merged
zariiii9003 merged 10 commits into
cantools:masterfrom
andlaus:add_type_annotations
Jun 18, 2026
Merged

Add type annotations to the module and the unit tests#6
zariiii9003 merged 10 commits into
cantools:masterfrom
andlaus:add_type_annotations

Conversation

@andlaus

@andlaus andlaus commented Jun 8, 2026

Copy link
Copy Markdown
Member

For some of these I am not 100% sure if they are correct.

A lot of the code churn of this patch stems from the fact that some classes had to be reordered because python bails out if annotations use classes that are only defined later in the file.

This patch features a few minor functional changes which were neccessiated by type annotations:

  • Support for python2 is no longer declared in setup.py
  • The Parser.grammar() methods always return Grammar objects instead of a Pattern object which gets implicitly converted to Grammar in Parser.parse(). (IMO this makes the whole affair much less confusing and user code only needs to return Grammar(x) instead of x.)
  • The _Token class is converted from namedtuple to a dataclass because named tuples do not play nicely with type annotations and the performance is basically identical.
  • The internal _String class now uses Pattern as its base class. (It already had the same API as Pattern, but not deriving _String from Pattern would necessiate _String to be handled separately anyway.)

@andlaus andlaus requested a review from zariiii9003 June 8, 2026 11:27
@andlaus

andlaus commented Jun 8, 2026

Copy link
Copy Markdown
Member Author

@ilanbiala: with this, it should be possible to implement full type hinting support for the DBC submodule of cantools...

@andlaus

andlaus commented Jun 8, 2026

Copy link
Copy Markdown
Member Author

updated python version tested in CI to 3.10 and 3.14. (python 3.8 has been EOL for a while.)

@andlaus andlaus force-pushed the add_type_annotations branch from c3d76d3 to 2ddd392 Compare June 8, 2026 11:38
@andlaus

andlaus commented Jun 8, 2026

Copy link
Copy Markdown
Member Author

fun fact: github "simplifies" the 3.10 version specifier to 3.1. adding quotes around the versions fixes that...

@eerimoq

eerimoq commented Jun 8, 2026

Copy link
Copy Markdown
Collaborator

It’s because 3.10 is a number, both in yaml and json. It’s a bit silly that GitHub accepts anything but strings :)

@ilanbiala

Copy link
Copy Markdown
Member

@andlaus is it possible to split out the Python version bump changes into a separate PR and merge that first to isolate this work?

@ilanbiala

Copy link
Copy Markdown
Member

Hey @eerimoq! Sorry to bring this up here, but would it be possible for you to give @andlaus, @zariiii9003, myself, and others more access to the cantools repo and for the readthedocs site for Cantools as well (cantools/cantools#746)?

@andlaus

andlaus commented Jun 8, 2026

Copy link
Copy Markdown
Member Author

@andlaus is it possible to split out the Python version bump changes into a separate PR and merge that first to isolate this work?

yes, but the version bump needs to be done before adding the type hints. be aware that the minimum python version is currently not codified in setup.py: setup.py only specifies the Programming Language :: Python :: {2,3} (informal) classifiers and the yaml for github action mentions python 3.8 and 3.13 a few times, i.e., it is currently tested on python 3.8 and 3.14 (but not 2.x) and there's no formal dependency...

@eerimoq

eerimoq commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Hey @eerimoq! Sorry to bring this up here, but would it be possible for you to give @andlaus, @zariiii9003, myself, and others more access to the cantools repo and for the readthedocs site for Cantools as well (cantools/cantools#746)?

what exactly?

@ilanbiala

Copy link
Copy Markdown
Member

@eerimoq the Cantools readthedocs site is stuck on a commit that's 2.5 years old and a few version releases out of date (commit revision is at the bottom of the docs site). It looks like permissions haven't been set up correctly for other people to push to the docs site.

For some of these I am not 100% sure if they are correct.

A lot of the code churn of this patch stems from the fact that some
classes had to be reordered because python bails out if annotations
use classes that are only defined later in the file.

This patch features a few minor functional changes which were
neccessiated by type annotations:

- Support for python2 is no longer declared in `setup.py`
- The `Parser.grammar()` methods are supposed to return `Grammar`
  objects instead of a `Pattern` object which gets implicitly
  converted to `Grammar` in `Parser.parse()`. IMO this makes the whole
  affair much less confusing and user code only needs to return
  `Grammar(x)` instead of `x`. If `grammar()` returns something else,
  the old behavior is fallen back to, but this will lead to `mypy`
  complaints in user code...
- The `_Token` class is converted from `namedtuple` to a dataclass
  because named tuples do not play nicely with type annotations and
  the performance is basically identical.
- The internal `_String` class now uses `Pattern` as its base
  class. (It already had the same API as `Pattern`, but not deriving
  `_String` from Pattern would necessiate `_String` to be handled
  separately anyway.)

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
Approved-by: Christian Hackenbeck <christian.hackenbeck@mercedes-benz.com>
@andlaus andlaus force-pushed the add_type_annotations branch from a45598c to 79df0af Compare June 9, 2026 13:35
@andlaus

andlaus commented Jun 9, 2026

Copy link
Copy Markdown
Member Author

ok, I rebased this on top of the latest master version, i.e., no need to fiddle with the python versions anymore...

@zariiii9003

Copy link
Copy Markdown
Contributor

@andlaus could you update the gha config to run mypy in CI?

@andlaus

andlaus commented Jun 9, 2026

Copy link
Copy Markdown
Member Author

good idea. I also added a ruff linting step.

andlaus added 2 commits June 9, 2026 17:26
thanks to [at]zariiii9003 for the suggestion!

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
also fix the complaint about the unused import of the `typing` module.

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
@andlaus andlaus force-pushed the add_type_annotations branch from 724b63c to 64b4204 Compare June 9, 2026 15:27
@andlaus

andlaus commented Jun 10, 2026

Copy link
Copy Markdown
Member Author

@ilanbiala, @zariiii9003: any objections to merging this?

Comment thread textparser.py Outdated
Comment thread textparser.py Outdated
Comment thread textparser.py Outdated
Comment thread textparser/__init__.py Outdated
Comment thread py.typed Outdated
@eerimoq

eerimoq commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator

@eerimoq the Cantools readthedocs site is stuck on a commit that's 2.5 years old and a few version releases out of date (commit revision is at the bottom of the docs site). It looks like permissions haven't been set up correctly for other people to push to the docs site.

I guess you have a mail in spam folder? @andlaus

image

thanks to [at]zariiii9003!

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
@andlaus

andlaus commented Jun 10, 2026

Copy link
Copy Markdown
Member Author

indeed. thanks!

it probably works, but I'm not completely sure. thanks to
[at]zariiii9003 for pointing this out.

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
@andlaus andlaus force-pushed the add_type_annotations branch from 84a6325 to 7a756d3 Compare June 11, 2026 09:09
andlaus added 2 commits June 11, 2026 11:13
- replace `setup.py`, `MANIFEST.in`, and `requirements.txt` with
  `pyproject.toml`
- move the source file to the `textparser` sub-directory and rename it
  to `__init__.py`

the main motivation for this is that I did not get the `py.typed` file
included in the wheel with the existing build system...

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
it now uses the same options as cantools which made it quite a bit
stricter.

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
@andlaus andlaus force-pushed the add_type_annotations branch from 7a756d3 to 0308fc6 Compare June 11, 2026 09:13
Comment thread pyproject.toml Outdated
… optional dependencies group

as I see it, "all dependencies not needed by the main module" means
"all currently declared dependencies"...

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
@andlaus andlaus force-pushed the add_type_annotations branch from 7a1bbb8 to 8101941 Compare June 18, 2026 09:38
andlaus added 2 commits June 18, 2026 11:41
…uptools_scm`

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
this is faster than using `isinstance()`. The trick here is to
convince type checkers to narrow the type of a match object after
`if mo is MISMATCH` statements. The trick here is to make the `_Mismatch`
class an enum with `MISMATCH` as its sole member and declare a Literal
type for this.

thanks to [at]zariiii9003 for comming up with this crazy trick!

Signed-off-by: Andreas Lauser <andreas.lauser@mercedes-benz.com>
@andlaus andlaus force-pushed the add_type_annotations branch from 8101941 to 5697c61 Compare June 18, 2026 09:41
@zariiii9003 zariiii9003 merged commit 905bba1 into cantools:master Jun 18, 2026
3 checks passed
@andlaus

andlaus commented Jun 18, 2026

Copy link
Copy Markdown
Member Author

cool. let's see if the automated release process works...

@andlaus

andlaus commented Jun 18, 2026

Copy link
Copy Markdown
Member Author

it does. nice :)

@zariiii9003

Copy link
Copy Markdown
Contributor

it does. nice :)

image

Now release a patch 😄

@zariiii9003

Copy link
Copy Markdown
Contributor

@andlaus you lost py.typed in the modernization commit, i missed that...

@andlaus

andlaus commented Jun 18, 2026

Copy link
Copy Markdown
Member Author

I think it is a good idea if you tagged a release just for fun ;)

@andlaus

andlaus commented Jun 18, 2026

Copy link
Copy Markdown
Member Author

@andlaus you lost py.typed in the modernization commit, i missed that...

hm, it seems to work on my machine:

> python3 -m build
[...]
> unzip ../dist/textparser-0.27.dev2+ge0986f757-py3-none-any.whl
Archive:  ../dist/textparser-0.27.dev2+ge0986f757-py3-none-any.whl
  inflating: textparser/__init__.py  
  inflating: textparser/py.typed     
[...]

@zariiii9003

Copy link
Copy Markdown
Contributor

The file itself was deleted (or not commited after moving). I triggered v0.26.1

@andlaus

andlaus commented Jun 18, 2026

Copy link
Copy Markdown
Member Author

cool, thanks! (I forgot to re-add it to git after the move)

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.

4 participants