#26597: Optparse for `noinput` and `interactive` can produce unwanted results
when
passed togeather
-------------------------------------+-------------------------------------
Reporter: JBKahn | Owner: nobody
Type: Bug | Status: new
Component: Migrations | Version: 1.8
Severity: Normal | Resolution:
Keywords: migrate argparse | Triage Stage:
command | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Description changed by JBKahn:
Old description:
> The option mapping for argparse in `call_command` is incorrectly mapping
> args. For example, it maps `noinput` to `interactive` and does not take
> into account that they are opposites. Here's where the bug is:
>
> Because of the way options are parsed on:
> https://github.com/django/django/blob/1.8.13/django/core/management/__init__.py#L106-L108
>
> You can end up with the dictionary returning `.items` back in one of two
> orders when you pass both `interactive` and `noinput`. Which is what I
> was doing in a test case.
>
> I assume this is present on other management commands, but I have not
> tested them.
>
> (note, I simplified `opt_mapping` to just the example)
> The following command:
> `arg_options = {opt_mapping.get(key, key): value for key, value in
> options.items()}`
> can be run as:
> `{{'noinput': 'interactive'}.get(key, key): value for key, value in
> [('verbosity', 0), ('fake', True), ('list', True), ('fake_initial',
> True), ('app_label', 'tests'), ('noinput', True), ('interactive',
> False)]}`
> or
> `{{'noinput': 'interactive'}.get(key, key): value for key, value in
> [('verbosity', 0), ('fake', True), ('list', True), ('fake_initial',
> True), ('app_label', 'tests'), ('interactive', False), ('noinput',
> True)]}`
>
> leading to `interactive` being False or True, respectively.
New description:
The option mapping for argparse in `call_command` is incorrectly mapping
args. For example, it maps `noinput` to `interactive` and does not take
into account that they are opposites. Here's where the bug is:
Because of the way options are parsed on:
https://github.com/django/django/blob/1.8.13/django/core/management/__init__.py#L106-L108
I assume this is present on other management commands, but I have not
tested them.
(note, I simplified `opt_mapping` to just the example)
The following command:
`arg_options = {opt_mapping.get(key, key): value for key, value in
options.items()}`
can be run as:
`{{'noinput': 'interactive'}.get(key, key): value for key, value in
[('verbosity', 0), ('fake', True), ('list', True), ('fake_initial', True),
('app_label', 'tests'), ('noinput', True)]}`
leading to `interactive` being True.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/26597#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/064.1fba307347d814c2b9a7e2ec567c58c7%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.