Skip to content

Commit

Permalink
Merge pull request #549 from pypa/bugfix/548-non-interactive-arg
Browse files Browse the repository at this point in the history
Fix issue with non-interactive-arg
  • Loading branch information
jaraco committed Nov 27, 2019
2 parents e3aeaaf + 8148ac9 commit 68dc617
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 3 deletions.
3 changes: 3 additions & 0 deletions docs/changelog.rst
Expand Up @@ -3,6 +3,9 @@
=========
Changelog
=========
* :release:`3.1.1 <2019-11-27>`
* :bug:`548` Restore ``--non-interactive`` as a flag not expecting an
argument.
* :release:`3.1.0 <2019-11-23>`
* :feature:`547` Add support for specifying ``--non-interactive`` as an
environment variable.
Expand Down
22 changes: 22 additions & 0 deletions tests/test_settings.py
Expand Up @@ -14,6 +14,7 @@
# limitations under the License.
import os.path
import textwrap
import argparse

from twine import exceptions
from twine import settings
Expand Down Expand Up @@ -81,3 +82,24 @@ def test_client_cert_is_set_and_password_not_if_both_given(entered_password):
username='fakeuser', password='anything', client_cert=client_cert)
assert not settings_obj.password
assert settings_obj.client_cert == client_cert


class TestArgumentParsing:

@staticmethod
def parse_args(args):
parser = argparse.ArgumentParser()
settings.Settings.register_argparse_arguments(parser)
return parser.parse_args(args)

def test_non_interactive_flag(self):
args = self.parse_args(['--non-interactive'])
assert args.non_interactive

def test_non_interactive_environment(self, monkeypatch):
monkeypatch.setenv("TWINE_NON_INTERACTIVE", "1")
args = self.parse_args([])
assert args.non_interactive
monkeypatch.setenv("TWINE_NON_INTERACTIVE", "0")
args = self.parse_args([])
assert not args.non_interactive
4 changes: 1 addition & 3 deletions twine/settings.py
Expand Up @@ -201,10 +201,8 @@ def register_argparse_arguments(parser: argparse.ArgumentParser) -> None:
)
parser.add_argument(
"--non-interactive",
action=utils.EnvironmentDefault,
action=utils.EnvironmentFlag,
env="TWINE_NON_INTERACTIVE",
default=False,
required=False,
help="Do not interactively prompt for username/password if the "
"required credentials are missing. (Can also be set via "
"%(env)s environment variable.)"
Expand Down
24 changes: 24 additions & 0 deletions twine/utils.py
Expand Up @@ -233,3 +233,27 @@ def __init__(

def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, values)


class EnvironmentFlag(argparse.Action):
"""Set boolean flag from environment variable."""

def __init__(
self,
env: str,
**kwargs
) -> None:
default = self.bool_from_env(os.environ.get(env))
self.env = env
super().__init__(default=default, nargs=0, **kwargs)

def __call__(self, parser, namespace, values, option_string=None):
setattr(namespace, self.dest, True)

@staticmethod
def bool_from_env(val):
"""
Allow '0' and 'false' and 'no' to be False
"""
falsey = {'0', 'false', 'no'}
return val and val.lower() not in falsey

0 comments on commit 68dc617

Please sign in to comment.