Repository navigation
Conversation
| ("No", False), | ||
| ], | ||
| ) | ||
| def test_bool_convert_valid(cli_value: str, expected: bool) -> None: |
There was a problem hiding this comment.
This test currently mimics master behaviour 100%.
…o feat/pydantic
|
Feedback inline 👇
Yep, good catch. The bool parsing is one of the last things I changed because of the comment in Fable's review about start up cost and it broke the envvar parsing. I pushed a few commits to address this (actually simplifying the bool parsing as a whole) and extended the test suite accordingly, with a variant of the proposed
Yep, this was another regression. Fixed by checking for the empty list specifically when determining
Ah, yep. This was tested but with a ConclusionThese were 3 actual regressions from I'm considering these 3 regressions fixed now. |
This comment was marked as resolved.
This comment was marked as resolved.
tiangolo
left a comment
There was a problem hiding this comment.
I just remembered another thing I wanted and forgot in the last review.
I would like to make anything new "private" by default.
E.g. rename adapters.py to _adapters.py and so on for new modules/files.
And for things added to existing modules (as we shouldn't change the name of those existing modules/files), then rename the symbols, e.g. describe_number_range to _describe_number_range.
Later I want to also make most existing things "private" as well unless intentionally exposed. To prevent people from using internals in ways that we could break in future refactors.
And although we are not yet changing existing things to private, we can still make new things private (unless we intentionally need to expose and document them).
tiangolo
left a comment
There was a problem hiding this comment.
I finally managed to finish reviewing all the logic flows and checking all the code and changes. 🚀
It all makes sense to me (as much as I can dig, it's a really big refactor 😅).
I think you went through all of it with enough effort, iterations, and time. I also gave it a review as deep as possible.
I think the sooner we release, the sooner we'll get external feedback. Maybe see what strange corner cases people might have that we didn't predict (and if we want to support them or not).
I'm ready to merge it and release it. 😎
I held myself from any more unnecessary nitpicks so we can release this version already known to work. With that out there we can continue building on top and tweaking things as necessary.
The only thing is making the new things private (unless it doesn't make sense in some cases), but other than that, let me know and I'll click the green button. ✔️
|
I updated this branch with And then:
Modules renamed:
New symbols in existing modules:
|
Meta: marked as a "feature", but definitely also "breaking" !
Description
Make Pydantic a required dependency and rely on it for parameter validation. Picked
>=2.5.3which is the current pin forgithub-actions.Click's
ParamTypehierarchy is now replaced by a three-layer design:TypeDescriptorobjects store static facts about a parameter's type (in the new modulecoercion.py)TypeAdapterobjects are defined in the new moduleadapters.pyRuntimeParamsubclasses own coercion (also defined incoercion.py)Further type-specific functionality is bundled in the new module
param_types.py.How to review this
_click/types.pyandtyper/_types.pyare deletedtyper/param_types.py, thentyper/adapters.py, thentyper/coercion.pytyper/core.pytyper/*.pytyper/_click/*.pyExtended/improved functionality
[%Y-%m-%d|%Y-%m-%dT%H:%M:%S|%Y-%m-%d %H:%M:%S]. Unix timestamps as seconds or milliseconds since the Unix epoch are now also supported.TyperParameter, not quite finished yet with some ugly imports from within_clickbut we'll deal with those in follow-up workTests with same behaviour on
mastertest_bool_convert_validto ensure that the "bool" conversion has remained the same for all kinds of inputs.test_path_resolves, cf point 1) in the Fable review 👇Breaking changes
(more or less in order of breakingness from most to least)
click_typeand open bounds throughmin_openandmax_open. This greatly simplifies the code base while still providing an alternative by settingparserinstead.<list[Eggs|Bacon|Cheese]>(before there was no visual distinction between a single choice, or a list of them).<datetime>". Before, it would show the (only) 3 options, but those are not exhaustive anymore. When the user provides actualformats, those are shown (as before).reprfunctionality ofparam.type. This wasn't really used except for the tests that were recently added in ➖ Vendor Click and streamline Typer's functionality and code base #1774.Anydoes NOT raiseRuntimeError: Type not yet supportedanymore, but instead just falls through and gets a genericTypeAdapter(annotation)Note that as before, nothing in the module
typer/_click(a remnant of the recent vendoring) should be used directly by users and all of it is subject to change in the near future. Any changes in those modules are not considered to be "breaking".Bug fixes (also breaking bwd compat)
def main(age: int = typer.Option(15.3))will now throw a validation error by Pydantic instead ofint(15.3)converting it to15. I consider this a bug fix instead of a regression, and have added a testtest_int_rejects_float_defaultfor it.None(e.g.tuple[str, int, bool]), will fail validation as soon as one of those elements isNone. Our documented example of setting that tuple's default to(None, None, None)is not valid anymore, it should be set toNoneinstead. cf. change todocs_src/multiple_values/options_with_multiple_values/tutorial001_an_py310.py.test_default_infers_param_type.Decision points
_parse_cli_boolwas created to ensure we still parse""asFalseand to strip whitespace from something like" True ". This is just to mimic old Click behaviour. If we don't do this preprocessing (cleaner code base), the empty string and the non-stripped strings won't pass Pydantic validation and it would be slightly breaking.datetimetype if no formats are provided by the user (cf ☝️ "Breaking changes")intorfloatas datetime input, to present Unix timestamps as seconds or milliseconds since the Unix epoch? Cf also Fable's concern in point 4 of its review below 👇AI Disclaimer
Cursor was used as a micro-managed junior. Every edit was reviewed & understood by me.
TODO
Parameter.nametyped asstrinstead ofstr | None#1878Follow-up work
typer/_click