Skip to content

Commit

Permalink
Merge pull request #8 from bryant-finney/bugfix/sync-pipfile-congrats
Browse files Browse the repository at this point in the history
Bugfix: sync --pipfile congratulations message
  • Loading branch information
Madoshakalaka authored Nov 17, 2019
2 parents 1326bf5 + 07f6915 commit 5ba4275
Show file tree
Hide file tree
Showing 4 changed files with 120 additions and 22 deletions.
19 changes: 10 additions & 9 deletions pipenv_setup/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -248,21 +248,20 @@ def sync(argv):
print("Creating boilerplate setup.py...")
setup_code = setup_filler.fill_boilerplate(dependency_arguments)
if setup_code is None:
fatal_error("Can not find setup.py template file")
fatal_error("Cannot find setup.py template file")
try:
with open(setup_file_path, "w") as new_setup_file:
with open(str(setup_file_path), "w") as new_setup_file:
new_setup_file.write(setup_code)
format_file(setup_file_path)
except OSError as e:
fatal_error([str(e), "failed to write setup.py file"])
else:
congratulate(
[
"setup.py generated",
"%d packages moved from %s to setup.py"
% (default_package_success_count, file.name),
"Please edit the required fields in the generated file",
]
msg_formatter.generate_success(
default_package_success_count,
dev_package_success_count,
argv.pipfile,
)
)

else: # all files exist. Update setup.py
Expand All @@ -274,7 +273,9 @@ def sync(argv):
fatal_error([str(e), msg_formatter.no_sync_performed()])
congratulate(
msg_formatter.update_success(
default_package_success_count, dev_package_success_count
default_package_success_count,
dev_package_success_count,
argv.pipfile,
)
)
else:
Expand Down
42 changes: 34 additions & 8 deletions pipenv_setup/msg_formatter.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,47 @@ def checked_no_problem():
return "No version conflict or missing packages/dependencies found in setup.py!"


def generate_success(
default_package_count, dev_package_count=0, pipfile=False
): # type: (int, int, bool) -> str
"""
:param default_package_count: The number of updated default packages
:param dev_package_count: The number of updated dev packages
:param bool lockfile: indicate that Pipfile was used to update setup.py
"""
src = "Pipfile" if pipfile else "Pipfile.lock"
string = (
"setup.py was successfully generated"
"\n%d default packages synced from %s to setup.py" % (default_package_count, src)
)

if dev_package_count != 0:
string += "\n%d dev packages from %s synced to setup.py" % (
default_package_count,
src,
)

string += "\nPlease edit the required fields in the generated file"
return string

def update_success(
default_package_count, dev_package_count=0
): # type: (int, int) -> str
default_package_count, dev_package_count=0, pipfile=False
): # type: (int, int, bool) -> str
"""
:param default_package_count: The number of updated default packages
:param dev_package_count: The number of updated dev packages
:param bool lockfile: indicate that Pipfile was used to update setup.py
"""
src = "Pipfile" if pipfile else "Pipfile.lock"
string = (
"setup.py successfully updated"
+ "\n%d default packages from Pipfile.lock synced to setup.py"
% default_package_count
"setup.py was successfully updated"
+ "\n%d default packages from %s synced to setup.py"
% (default_package_count, src)
)

if dev_package_count != 0:
string += (
"\n%d dev packages from Pipfile.lock synced to setup.py"
% default_package_count
string += "\n%d dev packages from %s synced to setup.py" % (
default_package_count,
src,
)
return string
31 changes: 31 additions & 0 deletions tests/main_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,37 @@ def test_update(
assert msg_formatter.update_success(update_count) in captured.out


@pytest.mark.parametrize(
("source_pipfile_dirname", "update_count"),
[("nasty_0", 23), ("no_original_kws_0", 23)],
)
def test_only_setup_missing(
capsys, tmp_path, shared_datadir, source_pipfile_dirname, update_count
): # type: (Any, Path, Path, str, int) -> None
"""
test generate setup.py (when it is missing)
"""
pipfile_dir = shared_datadir / source_pipfile_dirname
with data(source_pipfile_dirname, tmp_path):
# delete the setup.py file that was copied to the tmp_path
(tmp_path / "setup.py").unlink()
cmd(argv=["", "sync"])
generated_setup = Path("setup.py")
assert generated_setup.exists()
generated_setup_text = generated_setup.read_text()
expected_setup_text = Path("setup.py").read_text()
for kw_arg_names in ("install_requires", "dependency_links"):

assert compare_list_of_string_kw_arg(
generated_setup_text,
expected_setup_text,
kw_arg_names,
ordering_matters=False,
)
captured = capsys.readouterr()
assert msg_formatter.generate_success(update_count) in captured.out, captured.out


@pytest.mark.parametrize(("source_pipfile_dirname",), [("nasty_0",)])
@pytest.mark.parametrize(
("missing_filenames",),
Expand Down
50 changes: 45 additions & 5 deletions tests/sync_pipfile_test.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,56 @@
from vistir.compat import Path
from .conftest import data
from .main_test import copy_file, compare_list_of_string_kw_arg
from pipenv_setup.main import cmd

import pytest
from vistir.compat import Path


@pytest.mark.parametrize(
("source_pipfile_dirname", "update_count"),
[("nasty_0", 23), ("no_original_kws_0", 23)],
)
def test_sync_pipfile_no_original(
capsys, tmp_path, shared_datadir, source_pipfile_dirname, update_count
):
"""
sync --pipfile should reference Pipfile (not Pipfile.lock) when printing results
"""
pipfile_dir = shared_datadir / source_pipfile_dirname
for filename in ("Pipfile", "Pipfile.lock", "setup.py"):
copy_file(pipfile_dir / filename, tmp_path)

with data(str(pipfile_dir), tmp_path) as path:
setup_file = path / "setup.py" # type: Path
cmd(["", "sync", "--pipfile"])
text = setup_file.read_text()
generated_setup = Path("setup.py")
assert generated_setup.exists()
generated_setup_text = generated_setup.read_text()
expected_setup_text = Path("setup.py").read_text()

for kw_arg_names in ("install_requires", "dependency_links"):
assert compare_list_of_string_kw_arg(
generated_setup_text,
expected_setup_text,
kw_arg_names,
ordering_matters=False,
)

captured = capsys.readouterr()
assert "Pipfile.lock" not in captured.out, captured.out
assert "Pipfile" in captured.out, captured.out


def test_sync_dev_no_original(tmp_path):
def test_sync_dev_pipfile_no_original(tmp_path):
"""
sync --dev should add extras_require: {"dev": [blah]} in the absence of a extras_require keyword
sync --dev --pipfile should add extras_require: {"dev": [blah]} in the absence of an
extras_require keyword
"""
# todo: this test is too simple
with data("self_0", tmp_path) as path:
setup_file = path / "setup.py" # type: Path
cmd(["", "sync", "--dev", "--pipfile"])
text = setup_file.read_text()
assert "pytest~=5.1" in text
assert "requirementslib~=1.5" in text
assert "pytest~=5.1" in text, text
assert "requirementslib~=1.5" in text, text

0 comments on commit 5ba4275

Please sign in to comment.