From 74a2e29fefe2ecac98074a9ccb5ba6f745cb52ba Mon Sep 17 00:00:00 2001 From: Isaac Slavitt Date: Mon, 16 Apr 2018 14:58:45 -0400 Subject: [PATCH] Use pathlib instead of os.path where applicable (#112) * Use pathlib in test_creation.py * Use pathlib for PROJECT_DIR example in make_dataset.py * Add pathlib2 for backwards compatibility if project is Python 2 --- tests/test_creation.py | 62 ++++++++----------- {{ cookiecutter.repo_name }}/requirements.txt | 5 ++ .../src/data/make_dataset.py | 4 +- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/tests/test_creation.py b/tests/test_creation.py index e915f9c..e72886c 100644 --- a/tests/test_creation.py +++ b/tests/test_creation.py @@ -1,93 +1,86 @@ import os +import pytest import shutil +from pathlib import Path from cookiecutter import main -import pytest -CCDS_ROOT = os.path.abspath( - os.path.join( - __file__, - os.pardir, - os.pardir - ) - ) +CCDS_ROOT = Path(__file__).parents[1].resolve() @pytest.fixture(scope='function') def default_baked_project(tmpdir): - out_dir = str(tmpdir.mkdir('data-project')) + temp = tmpdir.mkdir('data-project') + out_dir = Path(temp).resolve() main.cookiecutter( - CCDS_ROOT, + str(CCDS_ROOT), no_input=True, extra_context={}, output_dir=out_dir ) # default project name is project_name - yield os.path.join(out_dir, 'project_name') + yield out_dir / 'project_name' # cleanup after shutil.rmtree(out_dir) def test_readme(default_baked_project): - readme_path = os.path.join(default_baked_project, 'README.md') + readme_path = default_baked_project / 'README.md' - assert os.path.exists(readme_path) + assert readme_path.exists() assert no_curlies(readme_path) def test_license(default_baked_project): - license_path = os.path.join(default_baked_project, 'LICENSE') + license_path = default_baked_project / 'LICENSE' - assert os.path.exists(license_path) + assert license_path.exists() assert no_curlies(license_path) def test_requirements(default_baked_project): - reqs_path = os.path.join(default_baked_project, 'requirements.txt') + reqs_path = default_baked_project / 'requirements.txt' - assert os.path.exists(reqs_path) + assert reqs_path.exists() assert no_curlies(reqs_path) def test_makefile(default_baked_project): - makefile_path = os.path.join(default_baked_project, 'Makefile') + makefile_path = default_baked_project / 'Makefile' - assert os.path.exists(makefile_path) + assert makefile_path.exists() assert no_curlies(makefile_path) def test_folders(default_baked_project): expected_dirs = [ 'data', - os.path.join('data', 'external'), - os.path.join('data', 'interim'), - os.path.join('data', 'processed'), - os.path.join('data', 'raw'), + 'data/external', + 'data/interim', + 'data/processed', + 'data/raw', 'docs', 'models', 'notebooks', 'references', 'reports', - os.path.join('reports', 'figures'), + 'reports/figures', 'src', - os.path.join('src', 'data'), - os.path.join('src', 'features'), - os.path.join('src', 'models'), - os.path.join('src', 'visualization') + 'src/data', + 'src/features', + 'src/models', + 'src/visualization', ] ignored_dirs = [ - default_baked_project - ] - - abs_expected_dirs = [os.path.join(default_baked_project, d) for - d in expected_dirs] + str(default_baked_project) + ] + abs_expected_dirs = [str(default_baked_project / d) for d in expected_dirs] abs_dirs, _, _ = list(zip(*os.walk(default_baked_project))) - assert len(set(abs_expected_dirs + ignored_dirs) - set(abs_dirs)) == 0 @@ -106,5 +99,4 @@ def no_curlies(filepath): ] template_strings_in_file = [s in data for s in template_strings] - return not any(template_strings_in_file) diff --git a/{{ cookiecutter.repo_name }}/requirements.txt b/{{ cookiecutter.repo_name }}/requirements.txt index d4f7d11..10a89cb 100644 --- a/{{ cookiecutter.repo_name }}/requirements.txt +++ b/{{ cookiecutter.repo_name }}/requirements.txt @@ -8,3 +8,8 @@ coverage awscli flake8 python-dotenv>=0.5.1 +{% if cookiecutter.python_interpreter != 'python3' %} + +# backwards compatibility +pathlib2 +{% endif %} \ No newline at end of file diff --git a/{{ cookiecutter.repo_name }}/src/data/make_dataset.py b/{{ cookiecutter.repo_name }}/src/data/make_dataset.py index cfea5ae..96b377a 100644 --- a/{{ cookiecutter.repo_name }}/src/data/make_dataset.py +++ b/{{ cookiecutter.repo_name }}/src/data/make_dataset.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- -import os import click import logging +from pathlib import Path from dotenv import find_dotenv, load_dotenv @@ -21,7 +21,7 @@ if __name__ == '__main__': logging.basicConfig(level=logging.INFO, format=log_fmt) # not used in this stub but often useful for finding various files - project_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir) + project_dir = Path(__file__).resolve().parents[2] # find .env automagically by walking up directories until it's found, then # load up the .env entries as environment variables