From d47604892a915ddf0b2a130dadaf01376442ae6a Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Mon, 3 Dec 2018 16:25:52 -0500 Subject: [PATCH 01/13] Enable output of script line for 'run' in verbose mode --- pipenv/core.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pipenv/core.py b/pipenv/core.py index f26a2edc..686c7e95 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -2303,6 +2303,8 @@ def do_run(command, args, three=None, python=False, pypi_mirror=None): inline_activate_virtual_environment() try: script = project.build_script(command, args) + cmd_string = ' '.join([script.command] + script.args) + logging.getLogger("pip").info("Run: '{0}'".format(cmd_string)) except ScriptEmptyError: click.echo("Can't run script {0!r}-it's empty?", err=True) if os.name == "nt": From aee66c607481a36e52dd414873d0e40e9f12b5c3 Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Mon, 3 Dec 2018 20:15:03 -0500 Subject: [PATCH 02/13] fixup! use click.echo > stderr --- pipenv/core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipenv/core.py b/pipenv/core.py index 686c7e95..48253efd 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -2304,7 +2304,8 @@ def do_run(command, args, three=None, python=False, pypi_mirror=None): try: script = project.build_script(command, args) cmd_string = ' '.join([script.command] + script.args) - logging.getLogger("pip").info("Run: '{0}'".format(cmd_string)) + if environments.is_verbose(): + click.echo(crayons.normal("Run: {0}".format(cmd_string)), err=True) except ScriptEmptyError: click.echo("Can't run script {0!r}-it's empty?", err=True) if os.name == "nt": From 453ed705a8c7bbce38aab1a0950f613019943da8 Mon Sep 17 00:00:00 2001 From: Dan Ryan Date: Tue, 4 Dec 2018 12:03:56 -0500 Subject: [PATCH 03/13] fixup! use `$` Co-Authored-By: refack --- pipenv/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipenv/core.py b/pipenv/core.py index 48253efd..084042e0 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -2305,7 +2305,7 @@ def do_run(command, args, three=None, python=False, pypi_mirror=None): script = project.build_script(command, args) cmd_string = ' '.join([script.command] + script.args) if environments.is_verbose(): - click.echo(crayons.normal("Run: {0}".format(cmd_string)), err=True) + click.echo(crayons.normal("$ {0}".format(cmd_string)), err=True) except ScriptEmptyError: click.echo("Can't run script {0!r}-it's empty?", err=True) if os.name == "nt": From 5c8ecfc86f83cb3d8aeff0fe79a31850bc655232 Mon Sep 17 00:00:00 2001 From: Refael Ackermann Date: Tue, 4 Dec 2018 12:10:37 -0500 Subject: [PATCH 04/13] fixup! add `news` --- news/3348.feature.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/3348.feature.rst diff --git a/news/3348.feature.rst b/news/3348.feature.rst new file mode 100644 index 00000000..50547a3d --- /dev/null +++ b/news/3348.feature.rst @@ -0,0 +1 @@ +Added support for ``--verbose`` output to ``pipenv run``. \ No newline at end of file From 64ae1ed8a4234e5d5b94c10e18b109a58572f3c7 Mon Sep 17 00:00:00 2001 From: nonylene Date: Wed, 5 Dec 2018 06:19:32 +0900 Subject: [PATCH 05/13] Fix `--site-packages` flag is not recognized `site_packages` argument in `cli` function always set to false because `--site-packages` flag was defined in global state (https://github.com/pypa/pipenv/blob/97657b2797b8a8f045776470d74add6048a95b67/pipenv/cli/options.py#L62). Fixes #3351 --- pipenv/cli/command.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pipenv/cli/command.py b/pipenv/cli/command.py index ae7111f1..ec1bef61 100644 --- a/pipenv/cli/command.py +++ b/pipenv/cli/command.py @@ -70,7 +70,6 @@ def cli( python=False, help=False, py=False, - site_packages=False, envs=False, man=False, completion=False, @@ -198,7 +197,7 @@ def cli( ) ctx.abort() # --two / --three was passed… - if (state.python or state.three is not None) or site_packages: + if (state.python or state.three is not None) or state.site_packages: ensure_project( three=state.three, python=state.python, From eff802a62da7292c39e62449f2cbcad46bb48277 Mon Sep 17 00:00:00 2001 From: nonylene Date: Wed, 5 Dec 2018 06:28:36 +0900 Subject: [PATCH 06/13] Create 3352.bugfix.rst --- news/3352.bugfix.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/3352.bugfix.rst diff --git a/news/3352.bugfix.rst b/news/3352.bugfix.rst new file mode 100644 index 00000000..d2d9c675 --- /dev/null +++ b/news/3352.bugfix.rst @@ -0,0 +1 @@ +Fix a bug that ``--site-packages`` flag is not recognized. From e229f7e03812910ba78373f0ca4cb193e57915b3 Mon Sep 17 00:00:00 2001 From: nonylene Date: Wed, 5 Dec 2018 06:41:06 +0900 Subject: [PATCH 07/13] Rename 3352.bugfix.rst to 3351.bugfix.rst --- news/{3352.bugfix.rst => 3351.bugfix.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename news/{3352.bugfix.rst => 3351.bugfix.rst} (100%) diff --git a/news/3352.bugfix.rst b/news/3351.bugfix.rst similarity index 100% rename from news/3352.bugfix.rst rename to news/3351.bugfix.rst From 7f5676e2b8f360de0dcb181736c482a1d73e76a8 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 6 Dec 2018 14:14:29 +0800 Subject: [PATCH 08/13] add news --- news/3362.trivial.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/3362.trivial.rst diff --git a/news/3362.trivial.rst b/news/3362.trivial.rst new file mode 100644 index 00000000..2216b071 --- /dev/null +++ b/news/3362.trivial.rst @@ -0,0 +1 @@ +The inline tables won't be rewritten now. From 27f83a8631220e6c799e80597484a0439c0271e1 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 6 Dec 2018 15:54:18 +0800 Subject: [PATCH 09/13] preserve inline spaces in toml --- pipenv/utils.py | 34 +++++++++++++++++++++---------- tests/integration/test_project.py | 7 ++++++- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/pipenv/utils.py b/pipenv/utils.py index 9f03465c..b0920764 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -83,19 +83,31 @@ def cleanup_toml(tml): def convert_toml_outline_tables(parsed): """Converts all outline tables to inline tables.""" - if isinstance(parsed, tomlkit.container.Container): - empty_inline_table = tomlkit.inline_table - else: - empty_inline_table = toml.TomlDecoder().get_empty_inline_table + def convert_tomlkit_table(section): + for key, value in section._body: + if not key: + continue + if hasattr(value, "keys") and not isinstance(value, tomlkit.items.InlineTable): + table = tomlkit.inline_table() + table.update(value.value) + section[key.key] = table + + def convert_toml_table(section): + for package, value in section.items(): + if hasattr(value, "keys") and not isinstance(toml.decoder.InlineTableDict): + table = toml.TomlDecoder().get_empty_inline_table() + table.update(value) + section[package] = table + for section in ("packages", "dev-packages"): table_data = parsed.get(section, {}) - for package, value in table_data.items(): - if hasattr(value, "keys") and not isinstance( - value, (tomlkit.items.InlineTable, toml.decoder.InlineTableDict) - ): - table = empty_inline_table() - table.update(value) - table_data[package] = table + if not table_data: + continue + if isinstance(parsed, tomlkit.container.Container): + convert_tomlkit_table(table_data) + else: + convert_toml_table(table_data) + return parsed diff --git a/tests/integration/test_project.py b/tests/integration/test_project.py index f9a2ba12..bec98d59 100644 --- a/tests/integration/test_project.py +++ b/tests/integration/test_project.py @@ -154,16 +154,21 @@ def test_rewrite_outline_table(PipenvInstance, pypi): with PipenvInstance(pypi=pypi, chdir=True) as p: with open(p.pipfile_path, 'w') as f: contents = """ +[packages] +six = {version = "*", editable = true} + [packages.requests] version = "*" """.strip() f.write(contents) - c = p.pipenv('install click') + c = p.pipenv("install -e click") assert c.return_code == 0 with open(p.pipfile_path) as f: contents = f.read() assert "[packages.requests]" not in contents + assert 'six = {version = "*", editable = true}' in contents assert 'requests = {version = "*"}' in contents + assert 'click = {' in contents @pytest.mark.install From 560d4ff5aa86eeedfb8bf48c4c59259745d7bf58 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 6 Dec 2018 16:00:33 +0800 Subject: [PATCH 10/13] fix a typo --- pipenv/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipenv/utils.py b/pipenv/utils.py index b0920764..67f3e9a6 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -94,7 +94,7 @@ def convert_toml_outline_tables(parsed): def convert_toml_table(section): for package, value in section.items(): - if hasattr(value, "keys") and not isinstance(toml.decoder.InlineTableDict): + if hasattr(value, "keys") and not isinstance(value, toml.decoder.InlineTableDict): table = toml.TomlDecoder().get_empty_inline_table() table.update(value) section[package] = table From 8efaea620e3f7dfbcaa424263b713c4ccf929bb1 Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Thu, 6 Dec 2018 16:02:37 +0800 Subject: [PATCH 11/13] Raise condition evaluation --- pipenv/utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pipenv/utils.py b/pipenv/utils.py index 67f3e9a6..08847e59 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -99,11 +99,12 @@ def convert_toml_outline_tables(parsed): table.update(value) section[package] = table + is_tomlkit_parsed = isinstance(parsed, tomlkit.container.Container) for section in ("packages", "dev-packages"): table_data = parsed.get(section, {}) if not table_data: continue - if isinstance(parsed, tomlkit.container.Container): + if is_tomlkit_parsed: convert_tomlkit_table(table_data) else: convert_toml_table(table_data) From aadb24b9df3f39b6b56263cf4c45e205cc3d2e6f Mon Sep 17 00:00:00 2001 From: Frost Ming Date: Fri, 7 Dec 2018 09:00:04 +0800 Subject: [PATCH 12/13] Move to install test suite --- tests/integration/test_install_basic.py | 22 ++++++++++++++++++++++ tests/integration/test_project.py | 24 +----------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/integration/test_install_basic.py b/tests/integration/test_install_basic.py index 317351a0..f858f8ac 100644 --- a/tests/integration/test_install_basic.py +++ b/tests/integration/test_install_basic.py @@ -446,3 +446,25 @@ def test_install_package_with_dots(PipenvInstance, pypi): c = p.pipenv("install backports.html") assert c.ok assert "backports.html" in p.pipfile["packages"] + + +@pytest.mark.install +def test_rewrite_outline_table(PipenvInstance, pypi): + with PipenvInstance(pypi=pypi, chdir=True) as p: + with open(p.pipfile_path, 'w') as f: + contents = """ +[packages] +six = {version = "*", editable = true} + +[packages.requests] +version = "*" + """.strip() + f.write(contents) + c = p.pipenv("install -e click") + assert c.return_code == 0 + with open(p.pipfile_path) as f: + contents = f.read() + assert "[packages.requests]" not in contents + assert 'six = {version = "*", editable = true}' in contents + assert 'requests = {version = "*"}' in contents + assert 'click = {' in contents diff --git a/tests/integration/test_project.py b/tests/integration/test_project.py index bec98d59..6a4a858a 100644 --- a/tests/integration/test_project.py +++ b/tests/integration/test_project.py @@ -148,29 +148,6 @@ six = {{version = "*", index = "pypi"}} assert c.return_code == 0 -@pytest.mark.install -@pytest.mark.project -def test_rewrite_outline_table(PipenvInstance, pypi): - with PipenvInstance(pypi=pypi, chdir=True) as p: - with open(p.pipfile_path, 'w') as f: - contents = """ -[packages] -six = {version = "*", editable = true} - -[packages.requests] -version = "*" - """.strip() - f.write(contents) - c = p.pipenv("install -e click") - assert c.return_code == 0 - with open(p.pipfile_path) as f: - contents = f.read() - assert "[packages.requests]" not in contents - assert 'six = {version = "*", editable = true}' in contents - assert 'requests = {version = "*"}' in contents - assert 'click = {' in contents - - @pytest.mark.install @pytest.mark.project def test_include_editable_packages(PipenvInstance, pypi, testsroot, pathlib_tmpdir): @@ -190,6 +167,7 @@ def test_include_editable_packages(PipenvInstance, pypi, testsroot, pathlib_tmpd @pytest.mark.project +@pytest.mark.virtualenv def test_run_in_virtualenv(PipenvInstance, pypi, virtualenv): with PipenvInstance(chdir=True, pypi=pypi) as p: os.environ.pop("PIPENV_IGNORE_VIRTUALENVS", None) From f81e86181ce828768a5f03c25c695394ad90ad29 Mon Sep 17 00:00:00 2001 From: nonylene Date: Sun, 9 Dec 2018 05:17:25 +0900 Subject: [PATCH 13/13] Add test for `pipenv --python --site-packages` --- tests/integration/test_cli.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/integration/test_cli.py b/tests/integration/test_cli.py index 946b98f7..a38883e0 100644 --- a/tests/integration/test_cli.py +++ b/tests/integration/test_cli.py @@ -41,6 +41,20 @@ def test_pipenv_py(PipenvInstance): assert os.path.basename(python).startswith('python') +@pytest.mark.cli +def test_pipenv_site_packages(PipenvInstance): + with PipenvInstance() as p: + c = p.pipenv('--python python --site-packages') + assert c.return_code == 0 + assert 'Making site-packages available' in c.err + + # no-global-site-packages.txt under stdlib dir should not exist. + c = p.pipenv('run python -c "import sysconfig; print(sysconfig.get_path(\'stdlib\'))"') + assert c.return_code == 0 + stdlib_path = c.out.strip() + assert not os.path.isfile(os.path.join(stdlib_path, 'no-global-site-packages.txt')) + + @pytest.mark.cli def test_pipenv_support(PipenvInstance): with PipenvInstance() as p: