Skip to content

Commit 198436f

Browse files
committed
Moved cli file, updated tests for cli.
Command line interface moved from __main__.py to cli.py to match the cookiecutter convention. File delete hooks updated accordingly. Because the module is created dynamically by cookies.bake() I used importlib to import the created module and test the command line options with cookies.bake(). Importlib has changed considerably between 2.7/3.3-3.4/3.5 so the code checks for version before running tests. If has a better way to handle this, please do that instead.
1 parent c66e05e commit 198436f

3 files changed

Lines changed: 37 additions & 15 deletions

File tree

hooks/post_gen_project.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ def remove_file(filepath):
1313
if '{{ cookiecutter.use_pypi_deployment_with_travis }}' != 'y':
1414
remove_file('travis_pypi_setup.py')
1515
if '{{ cookiecutter.create_console_script }}' != 'y':
16-
filepath = os.path.join('{{ cookiecutter.project_slug }}', '__main__.py')
16+
filepath = os.path.join('{{ cookiecutter.project_slug }}', 'cli.py')
1717
remove_file(filepath)

tests/test_bake_project.py

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
from contextlib import contextmanager
22
import shlex
33
import os
4+
import sys
45
import subprocess
56
import yaml
6-
import importlib
7+
8+
if sys.version_info > (3,0):
9+
import importlib
10+
else:
11+
import imp
712

813
from click.testing import CliRunner
914

@@ -26,6 +31,13 @@ def run_inside_dir(command, dirpath):
2631
with inside_dir(dirpath):
2732
return subprocess.check_call(shlex.split(command))
2833

34+
def project_info(result):
35+
"""Get toplevel dir, project_slug, and project dir from baked cookies"""
36+
project_path = str(result.project)
37+
project_slug = os.path.split(project_path)[-1]
38+
project_dir = os.path.join(project_path, project_slug)
39+
return project_path, project_slug, project_dir
40+
2941

3042
def test_bake_with_defaults(cookies):
3143
result = cookies.bake()
@@ -66,36 +78,46 @@ def test_bake_and_run_travis_pypi_setup(cookies):
6678
def test_bake_with_no_console_script(cookies):
6779
context = {'create_console_script': 'n'}
6880
result = cookies.bake(extra_context=context)
69-
project_path = str(result.project)
70-
project_slug = os.path.split(project_path)[-1]
71-
project_dir = os.path.join(project_path, project_slug)
81+
project_path, project_slug, project_dir = project_info(result)
7282
found_project_files = os.listdir(project_dir)
73-
assert "__main__.py" not in found_project_files
83+
assert "cli.py" not in found_project_files
7484

7585
setup_path = os.path.join(project_path, 'setup.py')
7686
with open(setup_path, 'r') as setup_file:
7787
assert 'entry_points' not in setup_file.read()
7888

7989

80-
def test_bake_with_console_script(cookies):
90+
def test_bake_with_console_script_files(cookies):
8191
context = {'create_console_script': 'y'}
8292
result = cookies.bake(extra_context=context)
83-
project_path = str(result.project)
84-
project_slug = os.path.split(project_path)[-1]
85-
project_dir = os.path.join(project_path, project_slug)
93+
project_path, project_slug, project_dir = project_info(result)
8694
found_project_files = os.listdir(project_dir)
87-
assert "__main__.py" in found_project_files
95+
assert "cli.py" in found_project_files
8896

8997
setup_path = os.path.join(project_path, 'setup.py')
9098
with open(setup_path, 'r') as setup_file:
9199
assert 'entry_points' in setup_file.read()
92100

93-
module_path = '.'.join([project_slug, '__main__'])
94-
main_module = importlib.import_module(module_path)
95-
noarg_result = runner.invoke(main_module.main)
101+
def test_bake_with_console_script_cli(cookies):
102+
context = {'create_console_script': 'y'}
103+
result = cookies.bake(extra_context=context)
104+
project_path, project_slug, project_dir = project_info(result)
105+
module_path = os.path.join(project_dir, 'cli.py')
106+
module_name = '.'.join([project_slug, 'cli'])
107+
if sys.version_info >= (3,5):
108+
spec = importlib.util.spec_from_file_location(module_name, module_path)
109+
cli = importlib.util.module_from_spec(spec)
110+
spec.loader.exec_module(cli)
111+
elif sys.version_info >= (3,3):
112+
file_loader = importlib.machinery.SourceFileLoader
113+
cli = file_loader(module_name, module_path).load_module()
114+
else:
115+
cli = imp.load_source(module_name, module_path)
116+
print(dir(cli))
117+
noarg_result = runner.invoke(cli.main)
96118
assert noarg_result.exit_code == 0
97119
expected_noarg_output = ' '.join(['Add a console script for', project_slug])
98120
assert expected_noarg_output in noarg_result.output
99-
help_result = runner.invoke(main_module.main, ['--help'])
121+
help_result = runner.invoke(cli.main, ['--help'])
100122
assert help_result.exit_code == 0
101123
assert 'Console script for python_boilerplate' in help_result.output

{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/__main__.py renamed to {{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/cli.py

File renamed without changes.

0 commit comments

Comments
 (0)