Skip to content

Commit

Permalink
Migrate default project template to static project metadata
Browse files Browse the repository at this point in the history
Includes consolidated dev requirements in project template.

Fix gh-2280.
Fix gh-2519.

Signed-off-by: Juan Luis Cano Rodríguez <juan_luis_cano@mckinsey.com>
  • Loading branch information
astrojuanlu committed May 23, 2023
1 parent db57510 commit ea380dd
Show file tree
Hide file tree
Showing 9 changed files with 94 additions and 79 deletions.
1 change: 1 addition & 0 deletions dependency/requirements.txt
Expand Up @@ -19,5 +19,6 @@ PyYAML>=4.2, <7.0
rich>=12.0, <14.0
rope>=0.21, <2.0 # subject to LGPLv3 license
setuptools>=65.5.1
tomli~=2.0.1; python_version < '3.11'
toml~=0.10
toposort~=1.5 # Needs to be at least 1.5 to be able to raise CircularDependencyError
39 changes: 32 additions & 7 deletions features/environment.py
Expand Up @@ -8,6 +8,11 @@
import venv
from pathlib import Path

try:
import tomllib
except ImportError:
import tomli as tomllib # type: ignore

from features.steps.sh_run import run

_PATHS_TO_REMOVE: set[Path] = set()
Expand Down Expand Up @@ -115,13 +120,33 @@ def _setup_minimal_env(context):


def _install_project_requirements(context):
install_reqs = (
Path(
"kedro/templates/project/{{ cookiecutter.repo_name }}/src/requirements.txt"
)
.read_text(encoding="utf-8")
.splitlines()
)
# HACK: Dev requirements of the project are stored in pyproject.toml,
# but the file cannot be directly loaded because it's a cookicutter template,
# so we read only the part that we need
with open(
"kedro/templates/project/{{ cookiecutter.repo_name }}/pyproject.toml",
encoding="utf-8",
) as pyproject_fh:
_buffer = []
while True:
try:
line = next(pyproject_fh)
except StopIteration as exc:
raise RuntimeError("Error while reading project dependencies") from exc

if line.startswith("[project.optional-dependencies]"):
_buffer.append(line)
for line in pyproject_fh:
if line.startswith("["):
break

_buffer.append(line)
break

_meta = tomllib.loads("\n".join(_buffer))
install_reqs = _meta["project"]["optional-dependencies"]["dev"]
# EOH

install_reqs = [req for req in install_reqs if "{" not in req]
install_reqs.append(".[pandas.CSVDataSet]")
call([context.pip, "install", *install_reqs], env=context.env)
Expand Down
1 change: 1 addition & 0 deletions features/windows_reqs.txt
Expand Up @@ -6,4 +6,5 @@ pandas~=1.3
psutil==5.8.0
requests~=2.20
toml~=0.10.1
tomli~=2.0.1; python_version < '3.11'
PyYAML>=4.2, <7.0
22 changes: 7 additions & 15 deletions kedro/templates/project/{{ cookiecutter.repo_name }}/README.md
Expand Up @@ -17,12 +17,12 @@ In order to get the best out of the template:

## How to install dependencies

Declare any dependencies in `requirements.txt` for `pip` installation and `environment.yml` for `conda` installation.
Declare any dependencies in `pyproject.toml` for `pip` installation and `environment.yml` for `conda` installation.

To install them, run:

```
pip install -r requirements.txt
pip install -e .
```

## How to run your Kedro pipeline
Expand Down Expand Up @@ -51,38 +51,30 @@ To generate or update the dependency requirements for your project:
kedro build-reqs
```

This will `pip-compile` the contents of `requirements.txt` into a new file `requirements.lock`. You can see the output of the resolution by opening `requirements.lock`.
This will `pip-compile` the contents of `pyproject.toml` into a new file `requirements.lock`. You can see the output of the resolution by opening `requirements.lock`.

After this, if you'd like to update your project requirements, please update `requirements.txt` and re-run `kedro build-reqs`.
After this, if you'd like to update your project requirements, please update `pyproject.toml` and re-run `kedro build-reqs`.

[Further information about project dependencies](https://docs.kedro.org/en/stable/kedro_project_setup/dependencies.html#project-specific-dependencies)

## How to work with Kedro and notebooks

> Note: Using `kedro jupyter` or `kedro ipython` to run your notebook provides these variables in scope: `context`, `catalog`, and `startup_error`.
>
> Jupyter, JupyterLab, and IPython are already included in the project requirements by default, so once you have run `pip install -r requirements.txt` you will not need to take any extra steps before you use them.
### Jupyter
To use Jupyter notebooks in your Kedro project, you need to install Jupyter:
Jupyter, JupyterLab, and IPython are not included in the project requirements by default. To install them, run the following command:

```
pip install jupyter
pip install -e .[dev]
```

### Jupyter
After installing Jupyter, you can start a local notebook server:

```
kedro jupyter notebook
```

### JupyterLab
To use JupyterLab, you need to install it:

```
pip install jupyterlab
```

You can also start JupyterLab:

```
Expand Down
@@ -1,3 +1,53 @@
[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[project]
name = "{{ cookiecutter.python_package }}"
dependencies = [
"kedro~={{ cookiecutter.kedro_version }}",
"kedro-telemetry~=0.2.0",
]
dynamic = ["version"]

[project.scripts]
{{ cookiecutter.repo_name }} = "{{ cookiecutter.python_package }}.__main__:main"

[project.optional-dependencies]
docs = [
"docutils<0.18.0",
"sphinx~=3.4.3",
"sphinx_rtd_theme==0.5.1",
"nbsphinx==0.8.1",
"nbstripout~=0.4",
"sphinx-autodoc-typehints==1.11.1",
"sphinx_copybutton==0.3.1",
"ipykernel>=5.3, <7.0",
"Jinja2<3.1.0",
"myst-parser~=0.17.2",
]
dev = [
"black~=22.0",
"flake8>=3.7.9, <5.0",
"ipython>=7.31.1, <8.0; python_version < '3.8'",
"ipython~=8.10; python_version >= '3.8'",
"isort~=5.0",
"jupyter~=1.0",
"jupyterlab_server>=2.11.1, <2.16.0",
"jupyterlab~=3.0, <3.6.0",
"nbstripout~=0.4",
"pytest-cov~=3.0",
"pytest-mock>=1.7.1, <2.0",
"pytest~=7.2",
]

[tool.setuptools.dynamic]
version = {attr = "{{ cookiecutter.python_package }}.__version__"}

[tool.setuptools.packages.find]
where = ["src"]
namespaces = false

[tool.kedro]
package_name = "{{ cookiecutter.python_package }}"
project_name = "{{ cookiecutter.project_name }}"
Expand Down

This file was deleted.

39 changes: 0 additions & 39 deletions kedro/templates/project/{{ cookiecutter.repo_name }}/setup.py

This file was deleted.

1 change: 1 addition & 0 deletions test_requirements.txt
Expand Up @@ -59,6 +59,7 @@ SQLAlchemy~=1.2
tables~=3.6.0; platform_system == "Windows" and python_version<'3.9'
tables~=3.6; platform_system != "Windows"
tensorflow~=2.0
tomli~=2.0.1; python_version < '3.11'
triad>=0.6.7, <1.0
trufflehog~=2.1
xlsxwriter~=1.0
6 changes: 2 additions & 4 deletions tests/framework/cli/test_starters.py
Expand Up @@ -17,7 +17,7 @@
KedroStarterSpec,
)

FILES_IN_TEMPLATE = 31
FILES_IN_TEMPLATE = 29


@pytest.fixture
Expand Down Expand Up @@ -70,9 +70,7 @@ def _assert_template_ok(
assert (full_path / ".gitignore").is_file()
assert project_name in (full_path / "README.md").read_text(encoding="utf-8")
assert "KEDRO" in (full_path / ".gitignore").read_text(encoding="utf-8")
assert kedro_version in (full_path / "src" / "requirements.txt").read_text(
encoding="utf-8"
)
assert kedro_version in (full_path / "pyproject.toml").read_text(encoding="utf-8")
assert (full_path / "src" / python_package / "__init__.py").is_file()


Expand Down

0 comments on commit ea380dd

Please sign in to comment.