From ffc7f54968f5d70e71afed3fd4b94cab05c7db47 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 28 Feb 2023 11:39:09 +0000 Subject: [PATCH 1/8] Remove FAQ content, fix links Signed-off-by: Jo Stichbury --- .../technical_steering_committee.md | 11 +- docs/source/deployment/aws_step_functions.md | 2 +- docs/source/development/commands_reference.md | 2 +- docs/source/extend_kedro/plugins.md | 2 +- docs/source/faq/faq.md | 276 ------------------ docs/source/get_started/install.md | 48 ++- docs/source/get_started/kedro_concepts.md | 4 +- docs/source/index.rst | 11 +- docs/source/kedro_project_setup/settings.md | 2 +- .../images/data_engineering_convention.png | Bin 80345 -> 0 bytes docs/source/meta/images/typical_workflow.png | Bin 44118 -> 0 bytes .../architecture_overview.md | 0 docs/source/resources/glossary.md | 2 +- .../{faq => resources}/kedro_principles.md | 0 docs/source/resources/logos.md | 18 -- docs/source/tutorial/set_up_data.md | 2 +- docs/source/tutorial/spaceflights_tutorial.md | 2 +- docs/source/tutorial/tutorial_template.md | 14 +- .../visualisation/kedro-viz_visualisation.md | 2 +- 19 files changed, 74 insertions(+), 324 deletions(-) delete mode 100644 docs/source/faq/faq.md delete mode 100644 docs/source/meta/images/data_engineering_convention.png delete mode 100644 docs/source/meta/images/typical_workflow.png rename docs/source/{faq => resources}/architecture_overview.md (100%) rename docs/source/{faq => resources}/kedro_principles.md (100%) delete mode 100644 docs/source/resources/logos.md diff --git a/docs/source/contribution/technical_steering_committee.md b/docs/source/contribution/technical_steering_committee.md index 780e7c63a6..d065cbfa2d 100644 --- a/docs/source/contribution/technical_steering_committee.md +++ b/docs/source/contribution/technical_steering_committee.md @@ -1,8 +1,11 @@ # Join the Technical Steering Committee -The term "Technical Steering Committee (TSC)" describes the group of people that maintain Kedro. The TSC has many responsibilities surrounding the project's future development; you can read about our duties in our [Technical Charter](https://github.com/kedro-org/kedro/blob/main/kedro_technical_charter.pdf). We accept new members on the TSC as this fuels Kedro's continued development. You can see [a list of Kedro's current and past maintainers](../faq/faq.md#who-maintains-kedro). +The term "Technical Steering Committee" (TSC) describes the group of Kedro maintainers. + +The TSC is responsible for the project's future development; you can read about our duties in our [Technical Charter](https://github.com/kedro-org/kedro/blob/main/kedro_technical_charter.pdf). We accept new members into the TSC to fuel Kedro's continued development. We keep a list [Kedro's current and past maintainers](https://github.com/kedro-org/kedro/blob/main/README.md#the-humans-behind-kedro) on GitHub. + +In this section, we describe: -In this section, we detail: - [Responsibilities of a maintainer](#responsibilities-of-a-maintainer) - [Requirements to become a maintainer](#requirements-to-become-a-maintainer) - [Application process](#application-process) @@ -59,4 +62,6 @@ GitHub discussions is used to host votes on issues, proposals and changes affect ### Adding or removing maintainers -Adding or removing maintainers requires a pull request against [our team list](../faq/faq.md#who-maintains-kedro). The decision is made based on TSC members votes in that pull request. Additions and removals of maintainers require **a 2/3 majority**. +The decision to add or remove a maintainer is made based on TSC members votes in that pull request. Additions and removals of maintainers require **a 2/3 majority**. + +The act of adding or removing maintainers onto the list requires a pull request against [Kedro's README.md file](https://github.com/kedro-org/kedro/blob/main/README.md#the-humans-behind-kedro). diff --git a/docs/source/deployment/aws_step_functions.md b/docs/source/deployment/aws_step_functions.md index b427ad5c41..c8c5ffe0ed 100644 --- a/docs/source/deployment/aws_step_functions.md +++ b/docs/source/deployment/aws_step_functions.md @@ -387,4 +387,4 @@ Generally speaking, the [limitations on AWS Lambda](https://docs.aws.amazon.com/ ## Final thought -One major benefit of running a Kedro pipeline in a serverless computing platform is the ability to take advantage of other services from the same provider. For example, AWS has recently announced a [Feature Store for SageMaker](https://aws.amazon.com/sagemaker/feature-store/). We could easily use it as the Features layer in [Kedro's Data Engineering convention](../faq/faq.md#what-is-data-engineering-convention). +One major benefit of running a Kedro pipeline in a serverless computing platform is the ability to take advantage of other services from the same provider, such as the use of the AWS [feature store for SageMaker](https://aws.amazon.com/sagemaker/feature-store/) to store features data. diff --git a/docs/source/development/commands_reference.md b/docs/source/development/commands_reference.md index 9c80fc0ed0..98666a5430 100644 --- a/docs/source/development/commands_reference.md +++ b/docs/source/development/commands_reference.md @@ -316,7 +316,7 @@ Call the `run()` method of the `KedroSession` defined in `kedro.framework.sessio kedro run ``` -`KedroContext` can be extended in `run.py` (`src//run.py`). In order to use the extended `KedroContext`, you need to set `context_path` in the [`pyproject.toml` configuration file](../faq/architecture_overview.md#kedro-project). +`KedroContext` can be extended in `run.py` (`src//run.py`). In order to use the extended `KedroContext`, you need to set `context_path` in the `pyproject.toml` configuration file. #### Modifying a `kedro run` diff --git a/docs/source/extend_kedro/plugins.md b/docs/source/extend_kedro/plugins.md index e8b1946ca4..acd72f09a0 100644 --- a/docs/source/extend_kedro/plugins.md +++ b/docs/source/extend_kedro/plugins.md @@ -219,7 +219,7 @@ Your plugin needs to have an [Apache 2.0 compatible license](https://www.apache. - [kedro-great](https://github.com/tamsanh/kedro-great), by [Tam-Sanh Nguyen](https://github.com/tamsanh), integrates Kedro with [Great Expectations](https://greatexpectations.io), enabling catalog-based expectation generation and data validation on pipeline run - [Kedro-Accelerator](https://github.com/deepyaman/kedro-accelerator), by [Deepyaman Datta](https://github.com/deepyaman), speeds up pipelines by parallelizing I/O in the background - [kedro-dataframe-dropin](https://github.com/mzjp2/kedro-dataframe-dropin), by [Zain Patel](https://github.com/mzjp2), lets you swap out pandas datasets for modin or RAPIDs equivalents for specialised use to speed up your workflows (e.g on GPUs) -- [kedro-mlflow](https://github.com/Galileo-Galilei/kedro-mlflow), by [Yolan Honoré-Rougé](https://github.com/galileo-galilei) and [Takieddine Kadiri](https://github.com/takikadiri), facilitates [MLflow](https://www.mlflow.org/) integration inside Kedro projects while enforcing [Kedro's principles](../faq/faq.md#what-are-the-primary-advantages-of-kedro). Its main features are modular configuration, automatic parameters tracking, datasets versioning, Kedro pipelines packaging and serving and automatic synchronization between training and inference pipelines for high reproducibility of machine learning experiments and ease of deployment. A tutorial is provided in the [kedro-mlflow-tutorial repo](https://github.com/Galileo-Galilei/kedro-mlflow-tutorial). You can find more information in the [kedro-mlflow documentation](https://kedro-mlflow.readthedocs.io/en/stable/). +- [kedro-mlflow](https://github.com/Galileo-Galilei/kedro-mlflow), by [Yolan Honoré-Rougé](https://github.com/galileo-galilei) and [Takieddine Kadiri](https://github.com/takikadiri), facilitates [MLflow](https://www.mlflow.org/) integration within a Kedro project. Its main features are modular configuration, automatic parameters tracking, datasets versioning, Kedro pipelines packaging and serving and automatic synchronization between training and inference pipelines for high reproducibility of machine learning experiments and ease of deployment. A tutorial is provided in the [kedro-mlflow-tutorial repo](https://github.com/Galileo-Galilei/kedro-mlflow-tutorial). You can find more information in the [kedro-mlflow documentation](https://kedro-mlflow.readthedocs.io/en/stable/). - [Kedro-Neptune](https://github.com/neptune-ai/kedro-neptune), by [Jakub Czakon](https://github.com/jakubczakon) and [Rafał Jankowski](https://github.com/Raalsky), lets you have all the benefits of a nicely organized Kedro pipeline with Neptune: a powerful user interface built for ML metadata management. It lets you browse and filter pipeline executions, compare nodes and pipelines on metrics and parameters, and visualize pipeline metadata like learning curves, node outputs, and charts. For more information, tutorials and videos, go to the [Kedro-Neptune documentation](https://docs.neptune.ai/integrations-and-supported-tools/automation-pipelines/kedro). - [kedro-dolt](https://www.dolthub.com/blog/2021-06-16-kedro-dolt-plugin/), by [Max Hoffman](https://github.com/max-hoffman) and [Oscar Batori](https://github.com/oscarbatori), allows you to expand the data versioning abilities of data scientists and engineers - [kedro-kubeflow](https://github.com/getindata/kedro-kubeflow), by [GetInData](https://github.com/getindata), lets you run and schedule pipelines on Kubernetes clusters using [Kubeflow Pipelines](https://www.kubeflow.org/docs/components/pipelines/overview/) diff --git a/docs/source/faq/faq.md b/docs/source/faq/faq.md deleted file mode 100644 index 75f3ae5357..0000000000 --- a/docs/source/faq/faq.md +++ /dev/null @@ -1,276 +0,0 @@ -# Frequently asked questions - -The following lists a set of questions that we have been asked about Kedro in the past. If you have a different question which isn't answered here, check out the [searchable archive of Discord discussions](https://linen-discord.kedro.org/)(https://linen-discord.kedro.org) or post a new query on the [Slack organisation](https://slack.kedro.org). - -## What is Kedro? - -Kedro is an open-source Python framework for creating reproducible, maintainable and modular data science code. It borrows concepts from software engineering and applies them to machine-learning code; applied concepts include modularity, separation of concerns and versioning. Kedro is hosted by the [LF AI & Data Foundation](https://lfaidata.foundation/). - -For the source code, take a look at the [Kedro repository on GitHub](https://github.com/kedro-org/kedro). - -## What are the primary advantages of Kedro? - -If you're a Data Scientist, then you should be interested in Kedro because it enables you to: - -- **Write cleaner code,** so that your Python code is easy to maintain and re-run in future; it does this by applying standardisation and software-engineering best practices -- **Make a seamless transition from development to production,** as you can write quick, throw-away exploratory code and - transition to maintainable, easy-to-share, code experiments quickly -- **Stay current in machine learning operations [(MLOps)](https://en.wikipedia.org/wiki/MLOps),** as Kedro takes care - of the principles you need to create data science code that lasts; you'll always be two steps in front of industry standards -- **Integrate with your data science workflow,** and use tools in the data science ecosystem, like Tensorflow, SciKit-Learn or Jupyter notebooks for experimentation. You can also take advantage of tools to produce for producing - quality code like Sphinx (documentation); `black`, `isort` and `flake8` (code linting and formatting); and,`pytest` (unit tests) - -If you're a Machine-Learning Engineer or Data Engineer, then you should be interested in Kedro because: - -- **Standardisation creates efficiency,** establishing proper analytics code foundations can save up to 80% of your hours down the road when putting models in production -- **You can focus on solving problems, not setting up projects,** Kedro provides the scaffolding to build more - complex data and machine-learning pipelines. There's a focus on spending less time on the tedious "plumbing" required to maintain analytics code; this means that you have more time to solve new problems -- **A data-driven framework makes pipelines easy,** by permitting data versioning, incremental computing and automatic pipeline running order resolution -- **It is platform-agnostic,** allowing you to choose what compute or platform to run your Kedro workflow; Databricks - and products like Kubeflow, Argo, Prefect and Airflow are deployment targets -- **It is easy to extend**, by using Hooks to add in tools like [MLFlow](https://mlflow.org/) (experiment tracking), [Great Expectations](https://greatexpectations.io/) (data validation and profiling) and [Grafana](https://grafana.com/) (pipeline monitoring) - -If you're a Project Lead, then you should be interested in Kedro because: - -- **It allows for effortless teamwork and an ability to scale analytics across an organisation.** Kedro standardises team workflows; the modular structure of Kedro facilitates a higher level of collaboration when teams solve problems together -- We stand for **no more fire drills.** You can remove long delays created because you have to refactor a data - science proof of concept into production -- **You don't need to start from scratch,** standardisation and separation of concerns makes it possible to reuse analytics code -- **See your project like never before,** Kedro’s pipeline visualization plugin lets you see a blueprint of your team's developing workflows and better collaborate with business stakeholders - -## How does Kedro compare to other projects? - -Some of our open-source users have called Kedro, the [React](https://medium.com/quantumblack/beyond-the-notebook-and-into-the-data-science-framework-revolution-a7fd364ab9c4) or Django for data science code and we think it's a - suitable framing for who we are. We exist to standardise how data science code is created. - -Everyone sees the pipeline abstraction in Kedro and gets excited, thinking that we're similar to orchestrators like - Airflow, Luigi, Prefect, Dagster, Flyte, Kubeflow and more. We focus on a different problem, which is the process of - _authoring_ pipelines, as opposed to _running, scheduling and monitoring_ them. - -The responsibility of _"What time will this pipeline run?"_, _"How do I manage my compute?"_ and _"How will I know if it - failed?"_ is left to the orchestrators. We also have deployment guidelines for using orchestrators as deployment - targets and are working in collaboration with the maintainers of some of those tools to make the deployment experience as enjoyable as possible. - -## What is the typical Kedro project development workflow? - -When you build a Kedro project, you will typically follow a standard development workflow: - -![](../meta/images/typical_workflow.png) - -### 1. Set up the project template - -* Create a new project with `kedro new` -* Install project dependencies with `pip install -r src/requirements.txt` -* Configure the following in the `conf` folder: - * Logging - * Credentials - * Any other sensitive / personal content - -### 2. Set up the data - -* Add data to the `data` folder -* Reference all datasets for the project in the `conf/base/catalog.yml` file - -### 3. Create the pipeline - -* Create the data transformation steps as Python functions -* Add your functions as nodes, to construct the pipeline -* Choose how to run the pipeline: sequentially or in parallel - -### 4. Package the project - - * Build the project documentation - * Package the project for distribution - -## What is data engineering convention? - -[Bruce Philp](https://github.com/bruceaphilp) and [Guilherme Braccialli](https://github.com/gbraccialli-qb) are the -brains behind a layered data-engineering convention as a model of managing data. You can find an [in-depth walk through of their convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71) as a blog post on Medium. - -Refer to the following table below for a high level guide to each layer's purpose - -```{note} -The data layers don’t have to exist locally in the `data` folder within your project, but we recommend that you structure your S3 buckets or other data stores in a similar way. -``` - -![](../meta/images/data_engineering_convention.png) - -| Folder in data | Description | -| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Raw | Initial start of the pipeline, containing the sourced data model(s) that should never be changed, it forms your single source of truth to work from. These data models are typically un-typed in most cases e.g. csv, but this will vary from case to case | -| Intermediate | Optional data model(s), which are introduced to type your :code:`raw` data model(s), e.g. converting string based values into their current typed representation | -| Primary | Domain specific data model(s) containing cleansed, transformed and wrangled data from either `raw` or `intermediate`, which forms your layer that you input into your feature engineering | -| Feature | Analytics specific data model(s) containing a set of features defined against the `primary` data, which are grouped by feature area of analysis and stored against a common dimension | -| Model input | Analytics specific data model(s) containing all :code:`feature` data against a common dimension and in the case of live projects against an analytics run date to ensure that you track the historical changes of the features over time | -| Models | Stored, serialised pre-trained machine learning models | -| Model output | Analytics specific data model(s) containing the results generated by the model based on the `model input` data | -| Reporting | Reporting data model(s) that are used to combine a set of `primary`, `feature`, `model input` and `model output` data used to drive the dashboard and the views constructed. It encapsulates and removes the need to define any blending or joining of data, improve performance and replacement of presentation layer without having to redefine the data models | - -## What best practice should I follow to avoid leaking confidential data? - -* Do not commit data to version control. -* Do not commit notebook output cells (data can easily sneak into notebooks when you don't delete output cells). -* Do not commit credentials in `conf/`. Use only the `conf/local/` folder for sensitive information like access credentials. - -```{note} -By default any file inside the `conf/` folder (and its subfolders) that contains `credentials` in its name will be ignored via `.gitignore`. -``` - -## How do I upgrade Kedro? - -We use [Semantic Versioning](https://semver.org/). The best way to safely upgrade is to check our [release notes](https://github.com/kedro-org/kedro/blob/main/RELEASE.md) for any notable breaking changes. Follow the steps in the migration guide included for that specific release. - -Once Kedro is installed, you can check your version as follows: - -``` -kedro --version -``` - -To later upgrade Kedro to a different version, simply run: - -``` -pip install kedro -U -``` - -When migrating an existing project to a newer Kedro version, make sure you also update the `project_version` in your `pyproject.toml` file from the project root directory or, for projects generated with Kedro<0.17.0, in your `ProjectContext`, which is found in `src//run.py`. - -## How can I use a development version of Kedro? - -```{important} -The development version of Kedro is not guaranteed to be bug-free and/or compatible with any of the [stable versions](https://pypi.org/project/kedro/#history). We do not recommend that you use a development version of Kedro in any production systems. Please install and use with caution. -``` - -If you want to try out the latest, most novel functionality of Kedro which has not been released yet, you can run the following installation command: - -```console -pip install git+https://github.com/kedro-org/kedro.git@develop -``` - -This will install Kedro from the `develop` branch of the GitHub repository, which is always the most up to date. This command will install Kedro from source, unlike `pip install kedro` which installs from PyPI. - -If you want to rollback to the stable version of Kedro, execute the following in your environment: - -```console -pip uninstall kedro -y -pip install kedro -``` - -## How can I find out more about Kedro? - -There are a host of articles, podcasts, talks and Kedro showcase projects in the [`kedro-community`](https://github.com/kedro-org/kedro-community) repository. - -Our preferred channel for feedback is through [GitHub issues](https://github.com/kedro-org/kedro/issues). We update the codebase regularly; you can find news about updates and features in the [RELEASE.md file on the GitHub repository](https://github.com/kedro-org/kedro/blob/develop/RELEASE.md). - -## Who maintains Kedro? - -Kedro was originally designed by [Aris Valtazanos](https://github.com/arisvqb) and [Nikolaos Tsaousis](https://github.com/tsanikgr) at QuantumBlack to solve challenges they faced in their project work. Their work was later turned into an internal product by [Peteris Erins](https://github.com/Pet3ris), [Ivan Danov](https://github.com/idanov), [Nikolaos Kaltsas](https://github.com/nikos-kal), [Meisam Emamjome](https://github.com/misamae) and [Nikolaos Tsaousis](https://github.com/tsanikgr). In the project's latest iteration it is an incubating project within [LF AI & Data](https://lfaidata.foundation/). - -Currently, the core Kedro team consists of -[Ahdra Merali](https://github.com/AhdraMeraliQB), -[Andrew Mackay](https://github.com/Mackay031), -[Ankita Katiyar](https://github.com/ankatiyar), -[Antony Milne](https://github.com/AntonyMilneQB), -[Cvetanka Nechevska](https://github.com/cvetankanechevska), -[Deepyaman Datta](https://github.com/deepyaman), -[Gabriel Comym](https://github.com/comym), -[Huong Nguyen](https://github.com/Huongg), -[Ivan Danov](https://github.com/idanov), -[Jannic Holzer](https://github.com/jmholzer), -[Jo Stichbury](https://github.com/stichbury), -[Joel Schwarzmann](https://github.com/datajoely), -[Juan Luis Cano](https://github.com/astrojuanlu), -[Lim Hoang](https://github.com/limdauto), -[Merel Theisen](https://github.com/merelcht), -[Nero Okwa](https://github.com/NeroOkwa), -[Nok Lam Chan](https://github.com/noklam), -[Rashida Kanchwala](https://github.com/rashidakanchwala), -[Sajid Alam](https://github.com/SajidAlamQB), -[Tynan DeBold](https://github.com/tynandebold) and -[Yetunde Dada](https://github.com/yetudada). - -Former core team members with significant contributions include: -[Andrii Ivaniuk](https://github.com/andrii-ivaniuk), -[Anton Kirilenko](https://github.com/Flid), -[Dmitrii Deriabin](https://github.com/dmder), -[Gordon Wrigley](https://github.com/tolomea), -[Hamza Oza](https://github.com/hamzaoza), -[Ignacio Paricio](https://github.com/ignacioparicio), -[Jiri Klein](https://github.com/jiriklein), -[Kiyohito Kunii](https://github.com/921kiyo), -[Laís Carvalho](https://github.com/laisbsc), -[Liam Brummitt](https://github.com/bru5), -[Lorena Bălan](https://github.com/lorenabalan), -[Nasef Khan](https://github.com/nakhan98), -[Richard Westenra](https://github.com/richardwestenra), -[Susanna Wong](https://github.com/studioswong) and -[Zain Patel](https://github.com/mzjp2). - -And last, but not least, all the open-source contributors whose work went into all Kedro [releases](https://github.com/kedro-org/kedro/blob/main/RELEASE.md). - - -## How can I cite Kedro? - -If you're an academic, Kedro can also help you, for example, as a tool to solve the problem of reproducible research. Use the "Cite this repository" button on [our repository](https://github.com/kedro-org/kedro) to generate a citation from the [CITATION.cff file](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-citation-files). - -## Can I create a virtual environment without `conda`? - -You can use `venv` or `pipenv` instead. - -### `venv` (instead of `conda`) - -If you use Python 3, you should already have the `venv` module installed with the standard library. Create a directory for working with Kedro within your virtual environment: - -```bash -mkdir kedro-environment && cd kedro-environment -``` - -This will create a `kedro-environment` directory in your current working directory. Next, to create a new virtual environment in this directory, run: - -```bash -python -m venv env/kedro-environment # macOS / Linux -python -m venv env\kedro-environment # Windows -``` - -Activate this virtual environment: - -```bash -source env/kedro-environment/bin/activate # macOS / Linux -.\env\kedro-environment\Scripts\activate # Windows -``` - -To exit the environment: - -```bash -deactivate -``` - -### `pipenv` (instead of `conda`) - -Install `pipenv` as follows: - -```bash -pip install pipenv -``` - -Create a directory for the virtual environment and change to that directory: - -```bash -mkdir kedro-environment && cd kedro-environment -``` - -Once all the dependencies are installed, to start a session with the correct virtual environment activated: - -```bash -pipenv shell -``` - -To exit the shell session: - -```bash -exit -``` - - -## How can I get my question answered? - -If your question isn't answered above, talk to the community on the [Kedro Slack organisation](https://slack.kedro.org). diff --git a/docs/source/get_started/install.md b/docs/source/get_started/install.md index 247f4bbae3..ed69b8f638 100644 --- a/docs/source/get_started/install.md +++ b/docs/source/get_started/install.md @@ -43,7 +43,9 @@ We suggest you create a new Python virtual environment for *each* new Kedro proj [Read more about Python virtual environments](https://realpython.com/python-virtual-environments-a-primer/) or [watch an explainer video about them](https://youtu.be/YKfAwIItO7M). ``` -Depending on your preferred Python installation, you can alternatively create virtual environments to work with Kedro using `venv` or `pipenv` instead of `conda`, as described in the [FAQ](../faq/faq.md) +```{note} +Depending on your preferred Python installation, you can alternatively create virtual environments to work with Kedro using `venv` or `pipenv` instead of `conda`. +``` #### Create a new Python virtual environment using `conda` @@ -95,8 +97,46 @@ You should see an ASCII art graphic and the Kedro version number: for example, ![](../meta/images/kedro_graphic.png) -If you do not see the graphic displayed, or have any issues with your installation, see the [frequently asked questions](../faq/faq.md), check out the [searchable archive from our retired Discord server](https://linen-discord.kedro.org), or post a new query on the [Slack organisation](https://slack.kedro.org). +If you do not see the graphic displayed, or have any issues with your installation, see the [searchable archive of past community support discussions](https://linen-discord.kedro.org), or post a new query on [Kedro's Slack organisation](https://slack.kedro.org). + +### How do I upgrade Kedro? + +We use [Semantic Versioning](https://semver.org/). The best way to safely upgrade is to check our [release notes](https://github.com/kedro-org/kedro/blob/main/RELEASE.md) for any notable breaking changes. Follow the steps in the migration guide included for that specific release. + +Once Kedro is installed, you can check your version as follows: + +``` +kedro --version +``` + +To later upgrade Kedro to a different version, simply run: + +``` +pip install kedro -U +``` + +When migrating an existing project to a newer Kedro version, make sure you also update the `project_version` in your `pyproject.toml` file from the project root directory or, for projects generated with Kedro<0.17.0, in your `ProjectContext`, which is found in `src//run.py`. + + +## Install a development version of Kedro + +This section explains how to try out a development version of Kedro direct from the [Kedro GitHub repository](https://github.com/kedro-org/kedro). + +```{important} +The development version of Kedro is not guaranteed to be bug-free and/or compatible with any of the [stable versions](https://pypi.org/project/kedro/#history). We do not recommend that you use a development version of Kedro in any production systems. Please install and use with caution. +``` + +To try out latest, unreleased functionality, run the following installation command: + +```console +pip install git+https://github.com/kedro-org/kedro.git@develop +``` + +This will install Kedro from the `develop` branch of the GitHub repository, which is always the most up to date. This command will install Kedro from source, unlike `pip install kedro` which installs Kedro from PyPI. -## Install a development version +If you want to roll back to a stable version of Kedro, execute the following in your environment: -To try out a development version of Kedro direct from the [Kedro GitHub repository](https://github.com/kedro-org/kedro), follow [these steps](../faq/faq.md#how-can-i-use-a-development-version-of-kedro). +```console +pip uninstall kedro -y +pip install kedro +``` diff --git a/docs/source/get_started/kedro_concepts.md b/docs/source/get_started/kedro_concepts.md index e3d0e07308..302dc9b747 100644 --- a/docs/source/get_started/kedro_concepts.md +++ b/docs/source/get_started/kedro_concepts.md @@ -60,7 +60,7 @@ project-dir # Parent directory of the template ├── docs # Project documentation ├── logs # Project output logs (not committed to version control) ├── notebooks # Project-related Jupyter notebooks (can be used for experimental code before moving the code to src) -├── pyproject.toml # Identifies the project root and [contains configuration information](../faq/architecture_overview.md#kedro-project) +├── pyproject.toml # Identifies the project root and contains configuration information ├── README.md # Project README ├── setup.cfg # Configuration options for `pytest` when doing `kedro test` and for the `isort` utility when doing `kedro lint` └── src # Project source code @@ -90,7 +90,7 @@ By default, Kedro creates one file, `credentials.yml`, in `conf/local`. ### `data` -The `data` folder contains multiple subfolders to store project data. We recommend you put raw data into `raw` and move processed data to other subfolders according to the [data engineering convention](../faq/faq.md#what-is-data-engineering-convention). +The `data` folder contains multiple subfolders to store project data. We recommend you put raw data into `raw` and move processed data to other subfolders according to the [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71). ### `src` diff --git a/docs/source/index.rst b/docs/source/index.rst index f36b951e95..0e2067ecac 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -179,20 +179,13 @@ Welcome to Kedro's documentation! tools_integration/pyspark -.. toctree:: - :maxdepth: 2 - :caption: FAQs - - faq/faq - faq/architecture_overview - faq/kedro_principles - .. toctree:: :maxdepth: 2 :caption: Resources - resources/logos resources/glossary + resources/architecture_overview + resources/kedro_principles .. toctree:: :maxdepth: 2 diff --git a/docs/source/kedro_project_setup/settings.md b/docs/source/kedro_project_setup/settings.md index eb831e63be..b4c5761d9f 100644 --- a/docs/source/kedro_project_setup/settings.md +++ b/docs/source/kedro_project_setup/settings.md @@ -3,7 +3,7 @@ A Kedro project's `settings.py` file contains the application settings for the project, including registration of Hooks and library components. This page explains how settings work, and which settings are available. ```{note} -Application settings is distinct from [run time configuration](configuration.md), which is stored in the `conf` folder and can vary by configuration environment, and [pyproject.toml](../faq/architecture_overview.md#kedro-project) , which provides project metadata and build configuration. +Application settings is distinct from [run time configuration](configuration.md), which is stored in the `conf` folder and can vary by configuration environment, and according to the contents of `pyproject.toml`, which provides project metadata such as `package_name`, `project_name` and `project_version` (the version of Kedro with which the project was generated). ``` By default, all code in `settings.py` is commented out. When settings are not supplied, Kedro chooses sensible default values. You only need to edit `settings.py` if you wish to change to values other than the defaults. diff --git a/docs/source/meta/images/data_engineering_convention.png b/docs/source/meta/images/data_engineering_convention.png deleted file mode 100644 index fd3798310ab0860ba4f8365501ee3891ba0c93a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80345 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 E04nXLrT_o{ diff --git a/docs/source/meta/images/typical_workflow.png b/docs/source/meta/images/typical_workflow.png deleted file mode 100644 index 9e12c6ea255260bacbaa1f240e21e922ce0e3eb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44118 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 diff --git a/docs/source/faq/architecture_overview.md b/docs/source/resources/architecture_overview.md similarity index 100% rename from docs/source/faq/architecture_overview.md rename to docs/source/resources/architecture_overview.md diff --git a/docs/source/resources/glossary.md b/docs/source/resources/glossary.md index 2bdeb059eb..a9dd66dd50 100644 --- a/docs/source/resources/glossary.md +++ b/docs/source/resources/glossary.md @@ -36,7 +36,7 @@ You can use Kedro-Viz to visualise your Kedro data pipelines: [Further information from the Kedro-Viz repository](https://github.com/kedro-org/kedro-viz) and [Kedro-Viz documentation](../visualisation/kedro-viz_visualisation.md) ## Layers (data engineering convention) -According to [data engineering convention](../faq/faq.md#what-is-data-engineering-convention), a pipeline can be broken up into different layers according to how data is processed. This convention makes it easier to collaborate with other team members because everyone has an idea of what type of data cleaning or processing has happened. +According to [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71#the-kedro-data-layers), a pipeline can be broken up into different layers according to how data is processed. This convention makes it easier to collaborate with other team members because everyone has an idea of what type of data cleaning or processing has happened. Kedro-Viz makes it easy to [visualise these data processing stages](../visualisation/kedro-viz_visualisation.md#visualise-layers) by adding a `layer` attribute to the datasets in the Data Catalog. diff --git a/docs/source/faq/kedro_principles.md b/docs/source/resources/kedro_principles.md similarity index 100% rename from docs/source/faq/kedro_principles.md rename to docs/source/resources/kedro_principles.md diff --git a/docs/source/resources/logos.md b/docs/source/resources/logos.md deleted file mode 100644 index fb9024e472..0000000000 --- a/docs/source/resources/logos.md +++ /dev/null @@ -1,18 +0,0 @@ -# Images and icons - -## White background - -### Icon -![Icon on white background](../meta/images/kedro_icon_no-type_whitebg.svg) - -### Icon with text -![Icon with text on white background](../meta/images/kedro_icon_type_whitebg.svg) - -## Black background - -### Icon -![Icon on black background](../meta/images/kedro_icon_no-type_blackbg.svg) - - -### Icon with text -![Icon with text on black background](../meta/images/kedro_icon_type_blackbg.svg) diff --git a/docs/source/tutorial/set_up_data.md b/docs/source/tutorial/set_up_data.md index 1b1702064c..3e1e955e44 100644 --- a/docs/source/tutorial/set_up_data.md +++ b/docs/source/tutorial/set_up_data.md @@ -6,7 +6,7 @@ Don't forget to check the [tutorial FAQ](spaceflights_tutorial_faqs.md) if you r In this section, we discuss the data setup phase, which is the second part of the standard development workflow. The steps are as follows: -* Add datasets to your `data` folder, according to [data engineering convention](../faq/faq.md#what-is-data-engineering-convention) +* Add datasets to your `data/raw` folder * Register the datasets with the Kedro Data Catalog in `conf/base/catalog.yml`, which is the registry of all data sources available for use by the project. This ensures that your code is reproducible when it references datasets in different locations and/or environments. You can find further information about the [Data Catalog](../data/data_catalog.md) in specific documentation covering advanced usage. diff --git a/docs/source/tutorial/spaceflights_tutorial.md b/docs/source/tutorial/spaceflights_tutorial.md index b890693a3a..93b2304037 100644 --- a/docs/source/tutorial/spaceflights_tutorial.md +++ b/docs/source/tutorial/spaceflights_tutorial.md @@ -42,7 +42,7 @@ Also known as the "root directory", this is the parent folder for the entire pro These are Python packages or libraries that an individual project depends upon to complete a task. For example, the Spaceflights tutorial project depends on the [scikit-learn](https://scikit-learn.org/stable/) library. ### Standard development workflow -When you build a Kedro project, you will typically follow a [standard development workflow](../faq/faq.md#what-is-the-typical-kedro-project-development-workflow): +When you build a Kedro project, you will typically follow a standard development workflow: 1. Set up the project template diff --git a/docs/source/tutorial/tutorial_template.md b/docs/source/tutorial/tutorial_template.md index 8532704147..2671854f59 100644 --- a/docs/source/tutorial/tutorial_template.md +++ b/docs/source/tutorial/tutorial_template.md @@ -87,12 +87,18 @@ To install all the project-specific dependencies, run the following from the pro pip install -r src/requirements.txt ``` -## Optional: configuration and logging +## Optional: logging and configuration -You may want to store credentials such as usernames and passwords if they are needed for specific data sources used by the project. +You might want to [set up logging](../logging/logging.md) at this stage of the workflow, but we do not use it in this tutorial. + +You may also want to store credentials such as usernames and passwords if they are needed for specific data sources used by the project. To do this, add them to `conf/local/credentials.yml` (some examples are included in that file for illustration). -You can find additional information in the [advanced documentation on configuration](../kedro_project_setup/configuration.md). +### Configuration best practice to avoid leaking confidential data? -You might also want to [set up logging](../logging/logging.md) at this stage of the workflow, but we do not use it in this tutorial. +* Do not commit data to version control. +* Do not commit notebook output cells (data can easily sneak into notebooks when you don't delete output cells). +* Do not commit credentials in `conf/`. Use only the `conf/local/` folder for sensitive information like access credentials. + +You can find additional information in the [advanced documentation on configuration](../kedro_project_setup/configuration.md). diff --git a/docs/source/visualisation/kedro-viz_visualisation.md b/docs/source/visualisation/kedro-viz_visualisation.md index 99b6717e0a..a19639e363 100644 --- a/docs/source/visualisation/kedro-viz_visualisation.md +++ b/docs/source/visualisation/kedro-viz_visualisation.md @@ -76,7 +76,7 @@ The `autoreload` flag reflects changes to the project as they happen. For exampl By convention, a [pipeline can be defined as having different layers](../resources/glossary.md#layers-data-engineering-convention) according to how data is processed, which makes it easier to collaborate. -For example, the [data engineering convention](../faq/faq.md#what-is-data-engineering-convention) labels datasets according to the stage of the pipeline (e.g. whether the data has been cleaned). +For example, the [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71#the-kedro-data-layers) labels datasets according to the stage of the pipeline (e.g. whether the data has been cleaned). You can add a `layer` attribute to the datasets in the Data Catalog, which is reflected in the Kedro-Viz visualisation. From 2eb3d825cf834f79e1973ee32d4732e0a14fbdf3 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 28 Feb 2023 15:21:42 +0000 Subject: [PATCH 2/8] Fix broken links in markdown and exclusions as needed Signed-off-by: Jo Stichbury --- docs/conf.py | 4 +- .../technical_steering_committee.md | 2 +- docs/source/index.rst | 2 - .../source/resources/architecture_overview.md | 46 ------------------- docs/source/resources/glossary.md | 2 +- docs/source/resources/kedro_principles.md | 24 ---------- .../visualisation/kedro-viz_visualisation.md | 2 +- 7 files changed, 4 insertions(+), 78 deletions(-) delete mode 100644 docs/source/resources/architecture_overview.md delete mode 100644 docs/source/resources/kedro_principles.md diff --git a/docs/conf.py b/docs/conf.py index 3caf8513de..6a44788725 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -220,13 +220,11 @@ "https://eternallybored.org/misc/wget/", "https://arrow.apache.org/docs/python/generated/pyarrow.Table.html#pyarrow.Table.from_pandas", "https://www.oracle.com/java/technologies/javase-downloads.html", # "forbidden" url - "https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71", - "https://medium.com/quantumblack/beyond-the-notebook-and-into-the-data-science-framework-revolution-a7fd364ab9c4", "https://www.java.com/en/download/help/download_options.html", # "403 Client Error: Forbidden for url" # "anchor not found" but it's a valid selector for code examples "https://docs.delta.io/latest/delta-update.html#language-python", "https://github.com/kedro-org/kedro/blob/main/kedro/framework/project/default_logging.yml", - "https://kedro.readthedocs.io/en/stable/data/kedro_io.html#partitioned-dataset-lazy-saving", # Until 0.18.4 + "https://github.com/kedro-org/kedro/blob/main/README.md#the-humans-behind-kedro", # "anchor not found" but is valid "https://opensource.org/license/apache2-0-php/", ] diff --git a/docs/source/contribution/technical_steering_committee.md b/docs/source/contribution/technical_steering_committee.md index d065cbfa2d..f2ad960dc5 100644 --- a/docs/source/contribution/technical_steering_committee.md +++ b/docs/source/contribution/technical_steering_committee.md @@ -2,7 +2,7 @@ The term "Technical Steering Committee" (TSC) describes the group of Kedro maintainers. -The TSC is responsible for the project's future development; you can read about our duties in our [Technical Charter](https://github.com/kedro-org/kedro/blob/main/kedro_technical_charter.pdf). We accept new members into the TSC to fuel Kedro's continued development. We keep a list [Kedro's current and past maintainers](https://github.com/kedro-org/kedro/blob/main/README.md#the-humans-behind-kedro) on GitHub. +The TSC is responsible for the project's future development; you can read about our duties in our [Technical Charter](https://github.com/kedro-org/kedro/blob/main/kedro_technical_charter.pdf). We accept new members into the TSC to fuel Kedro's continued development. We list [Kedro's current and past maintainers](https://github.com/kedro-org/kedro/blob/main/README.md#the-humans-behind-kedro) on GitHub. In this section, we describe: diff --git a/docs/source/index.rst b/docs/source/index.rst index 0e2067ecac..ee0d157f84 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -184,8 +184,6 @@ Welcome to Kedro's documentation! :caption: Resources resources/glossary - resources/architecture_overview - resources/kedro_principles .. toctree:: :maxdepth: 2 diff --git a/docs/source/resources/architecture_overview.md b/docs/source/resources/architecture_overview.md deleted file mode 100644 index 6a24bef2f9..0000000000 --- a/docs/source/resources/architecture_overview.md +++ /dev/null @@ -1,46 +0,0 @@ -# Kedro architecture overview - -![Kedro architecture diagram](../meta/images/kedro_architecture.png) - -At a high level, Kedro consists of five main parts: - -## Kedro project - -As a data pipeline developer, you will interact with a Kedro project, which consists of: - -* The **`conf/`** directory, which contains configuration for the project, such as data catalog configuration, parameters, etc. -* The **`src`** directory, which contains the source code for the project, including: - * The **`pipelines`** directory, which contains the source code for your pipelines. - * **`settings.py`** file contains the settings for the project, such as library component registration, custom hooks registration, etc. All the available settings are listed and explained in the [project settings chapter](../kedro_project_setup/settings.md). - * **`pipeline_registry.py`** file defines the project pipelines, i.e. pipelines that can be run using `kedro run --pipeline`. - * **`__main__.py`** file serves as the main entry point of the project in [package mode](../tutorial/package_a_project.md#package-your-project). -* **`pyproject.toml`** identifies the project root by providing project metadata, including: - * `package_name`: A valid Python package name for your project package - * `project_name`: A human readable name for your project - * `project_version`: Kedro version with which the project was generated - -## Kedro starter - -You can use a [Kedro starter](../kedro_project_setup/starters.md) to generate a Kedro project that contains boilerplate code. We maintain a set of [official starters](https://github.com/kedro-org/kedro-starters/) but you can also use a custom starter of your choice. - -## Kedro library - -Kedro library consists of independent units, each responsible for one aspect of computation in a data pipeline: - -* **`Config Loader`** provides utility to parse and load configuration defined in a Kedro project. -* **`Pipeline`** provides a collection of abstractions to model data pipelines. -* **`Runner`** provides an abstraction for different execution strategy of a data pipeline. -* **`I/O`** provides a collection of abstractions to handle I/O in a project, including `DataCatalog` and many `DataSet` implementations. - -## Kedro framework - -Kedro framework serves as the interface between a Kedro project and Kedro library components. The major building blocks of the Kedro framework include: - -* **`Session`** is responsible for managing the lifecycle of a Kedro run. -* **`Context`** holds the configuration and Kedro's main functionality, and also serves as the main entry point for interactions with core library components. -* **`Hooks`** defines all hook specifications available to extend Kedro. -* **`CLI`** defines built-in Kedro CLI commands and utilities to load custom CLI commands from plugins. - -## Kedro extension - -You can also extend Kedro behaviour in your project using a Kedro extension, which can be a custom starter, a Python library with extra hooks implementations, extra CLI commands such as [Kedro-Viz](https://github.com/kedro-org/kedro-viz) or a custom library component implementation. diff --git a/docs/source/resources/glossary.md b/docs/source/resources/glossary.md index a9dd66dd50..adaf2f48d5 100644 --- a/docs/source/resources/glossary.md +++ b/docs/source/resources/glossary.md @@ -36,7 +36,7 @@ You can use Kedro-Viz to visualise your Kedro data pipelines: [Further information from the Kedro-Viz repository](https://github.com/kedro-org/kedro-viz) and [Kedro-Viz documentation](../visualisation/kedro-viz_visualisation.md) ## Layers (data engineering convention) -According to [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71#the-kedro-data-layers), a pipeline can be broken up into different layers according to how data is processed. This convention makes it easier to collaborate with other team members because everyone has an idea of what type of data cleaning or processing has happened. +According to [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71), a pipeline can be broken up into different layers according to how data is processed. This convention makes it easier to collaborate with other team members because everyone has an idea of what type of data cleaning or processing has happened. Kedro-Viz makes it easy to [visualise these data processing stages](../visualisation/kedro-viz_visualisation.md#visualise-layers) by adding a `layer` attribute to the datasets in the Data Catalog. diff --git a/docs/source/resources/kedro_principles.md b/docs/source/resources/kedro_principles.md deleted file mode 100644 index dfe4efbd0d..0000000000 --- a/docs/source/resources/kedro_principles.md +++ /dev/null @@ -1,24 +0,0 @@ -# Kedro Principles - -After a long discussion, we wrote this set of principles to summarise our development philosophy and to guide us through future decisions about Kedro. - -## 1. Modularity at the core ️📦 -Modularity allows for easy construction, flexible arrangements and reusability of components, resulting in an extensible and customisable system. Kedro is built around the idea of enabling modular data engineering and data science code. To make this possible, we take this as our core tenet and make sure Kedro’s own components are modular and independent of each other as much as possible. Each component has clearly defined responsibilities and narrow interfaces. We aim to make most of our components highly decoupled from each other and ensure they can be used on their own. - -## 2. Grow beginners into experts 🌱 -Every user is on a learning journey and Kedro aims to be the perfect vehicle for such an adventure. We want Kedro to be loved by users across all different levels of experience. Kedro should be your companion as a beginner, taking your first steps into building data products, or as an expert user, well-seasoned in taking machine-learning models into production. - -## 3. User empathy without unfounded assumptions 🤝 -Kedro is designed with the user in mind, but makes no guesses about what the user has in mind. We strive to understand our users without claiming we are one with them. Our users trust us with their time to learn our API and we should make sure we spend their time wisely. All our assumptions should be grounded on extensive experience and hard data. - -## 4. Simplicity means bare necessities 🍞 -We believe that simplicity is “attained not when there is no longer anything to add, but when there is no longer anything to take away”, very much like Antoine de Saint-Exupéry’s definition of perfection. Simplicity is hard to achieve, but once achieved it is easy to understand and rely on. In our pursuit of simplicity at Kedro we start by defining it as something composed of small number of parts, with small number of features or functional branches and having very little optionality. Simple things are easy, robust, reliable and loved by everyone. They can be used in countless ways on their own or effortlessly become a part of a more complex system since they are modular by nature. - -## 5. There should be one obvious way of doing things 🎯 -Inspired by The Zen of Python, we recommend certain ways of accomplishing tasks. We do this because it allows users to focus on their original problem rather than deal with accidental complexity. That doesn’t mean that it will be impossible to do things using a different way; but, as one becomes more accustomed to Kedro, it will become apparent that there is a preferred way of doing things. Kedro is an opinionated framework, and this is built into its design. - -## 6. A sprinkle of magic is better than a spoonful of it ✨ -The declarative nature of Kedro introduces some magic by hiding the imperative implementation details. However, we recognise that this departure from Python’s preference for explicit solutions can be taken too far and quickly spiral into “dark magic”. Dark magic introduces confusion for the users and can make it easy for them to get lost in their own project. That’s why we have a strong preference for common sense over dark magic and making things obvious rather than clever. Nevertheless, magic is sometimes justified if it simplifies how things work. We promise to use it sparingly and only for good. - -## 7. Lean process and lean product 👟 -Kedro started as a small framework which tackles big problems in the delivery of data science projects from inception to production. We fully subscribe to the principles of lean software development and do our best to eliminate waste as much as possible. We favour small incremental changes over big bang deliveries of functionality and in general we strive to achieve more with less. diff --git a/docs/source/visualisation/kedro-viz_visualisation.md b/docs/source/visualisation/kedro-viz_visualisation.md index a19639e363..f04703f44c 100644 --- a/docs/source/visualisation/kedro-viz_visualisation.md +++ b/docs/source/visualisation/kedro-viz_visualisation.md @@ -76,7 +76,7 @@ The `autoreload` flag reflects changes to the project as they happen. For exampl By convention, a [pipeline can be defined as having different layers](../resources/glossary.md#layers-data-engineering-convention) according to how data is processed, which makes it easier to collaborate. -For example, the [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71#the-kedro-data-layers) labels datasets according to the stage of the pipeline (e.g. whether the data has been cleaned). +For example, the [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71) labels datasets according to the stage of the pipeline (e.g. whether the data has been cleaned). You can add a `layer` attribute to the datasets in the Data Catalog, which is reflected in the Kedro-Viz visualisation. From 6139f9673ab438e56a75822e70dedfc769b30f21 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 1 Mar 2023 15:24:10 +0000 Subject: [PATCH 3/8] Some modifications following review Signed-off-by: Jo Stichbury --- docs/source/get_started/install.md | 9 ++++++--- docs/source/get_started/kedro_concepts.md | 2 +- docs/source/resources/glossary.md | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/source/get_started/install.md b/docs/source/get_started/install.md index ed69b8f638..a54ccb7cc2 100644 --- a/docs/source/get_started/install.md +++ b/docs/source/get_started/install.md @@ -101,7 +101,7 @@ If you do not see the graphic displayed, or have any issues with your installati ### How do I upgrade Kedro? -We use [Semantic Versioning](https://semver.org/). The best way to safely upgrade is to check our [release notes](https://github.com/kedro-org/kedro/blob/main/RELEASE.md) for any notable breaking changes. Follow the steps in the migration guide included for that specific release. +The best way to safely upgrade is to check our [release notes](https://github.com/kedro-org/kedro/blob/main/RELEASE.md) for any notable breaking changes. Follow the steps in the migration guide included for that specific release. Once Kedro is installed, you can check your version as follows: @@ -115,7 +115,10 @@ To later upgrade Kedro to a different version, simply run: pip install kedro -U ``` -When migrating an existing project to a newer Kedro version, make sure you also update the `project_version` in your `pyproject.toml` file from the project root directory or, for projects generated with Kedro<0.17.0, in your `ProjectContext`, which is found in `src//run.py`. +When migrating an existing project to a newer Kedro version, make sure you also update the `project_version`: + +* For projects generated with versions of Kedro > 0.17.0, you'll do this in the `pyproject.toml` file from the project root directory. +* If your project was generated with a version of Kedro <0.17.0, you will instead need to update the `ProjectContext`, which is found in `src//run.py`. ## Install a development version of Kedro @@ -126,7 +129,7 @@ This section explains how to try out a development version of Kedro direct from The development version of Kedro is not guaranteed to be bug-free and/or compatible with any of the [stable versions](https://pypi.org/project/kedro/#history). We do not recommend that you use a development version of Kedro in any production systems. Please install and use with caution. ``` -To try out latest, unreleased functionality, run the following installation command: +To try out latest, unreleased functionality from the `develop` branch of the Kedro GitHub repository, run the following installation command: ```console pip install git+https://github.com/kedro-org/kedro.git@develop diff --git a/docs/source/get_started/kedro_concepts.md b/docs/source/get_started/kedro_concepts.md index 302dc9b747..f6b8db1cc0 100644 --- a/docs/source/get_started/kedro_concepts.md +++ b/docs/source/get_started/kedro_concepts.md @@ -90,7 +90,7 @@ By default, Kedro creates one file, `credentials.yml`, in `conf/local`. ### `data` -The `data` folder contains multiple subfolders to store project data. We recommend you put raw data into `raw` and move processed data to other subfolders according to the [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71). +The `data` folder contains multiple subfolders to store project data. We recommend you put raw data into `raw` and move processed data to other subfolders according to the [commonly accepted data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71). ### `src` diff --git a/docs/source/resources/glossary.md b/docs/source/resources/glossary.md index adaf2f48d5..642c220621 100644 --- a/docs/source/resources/glossary.md +++ b/docs/source/resources/glossary.md @@ -36,7 +36,7 @@ You can use Kedro-Viz to visualise your Kedro data pipelines: [Further information from the Kedro-Viz repository](https://github.com/kedro-org/kedro-viz) and [Kedro-Viz documentation](../visualisation/kedro-viz_visualisation.md) ## Layers (data engineering convention) -According to [data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71), a pipeline can be broken up into different layers according to how data is processed. This convention makes it easier to collaborate with other team members because everyone has an idea of what type of data cleaning or processing has happened. +According to [common data engineering convention](https://towardsdatascience.com/the-importance-of-layered-thinking-in-data-engineering-a09f685edc71), a pipeline can be broken up into different layers according to how data is processed. This convention makes it easier to collaborate with other team members because everyone has an idea of what type of data cleaning or processing has happened. Kedro-Viz makes it easy to [visualise these data processing stages](../visualisation/kedro-viz_visualisation.md#visualise-layers) by adding a `layer` attribute to the datasets in the Data Catalog. From 98eb3e935a8a650d5430849ae6e4fa74d4ede87a Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 7 Mar 2023 14:33:19 +0000 Subject: [PATCH 4/8] Adding a skinny FAQ with some basic questions Signed-off-by: Jo Stichbury --- docs/source/faq/faq.md | 26 ++++++++++++++++++++++++++ docs/source/index.rst | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 docs/source/faq/faq.md diff --git a/docs/source/faq/faq.md b/docs/source/faq/faq.md new file mode 100644 index 0000000000..957396f1ac --- /dev/null +++ b/docs/source/faq/faq.md @@ -0,0 +1,26 @@ +# Frequently asked questions + +## Kedro project development + +* [How do I write my own Kedro starter projects](../kedro_project_setup/starters.md#how-to-create-a-kedro-starter)? + +## Working with Jupyter + +* [How can I convert functions from Jupyter Notebooks into Kedro nodes](../notebooks_and_ipython/kedro_and_notebooks.md#convert-functions-from-jupyter-notebooks-into-kedro-nodes)? + +* [How do I connect a Kedro project kernel to other Jupyter clients like JupyterLab](../notebooks_and_ipython/kedro_and_notebooks.md#ipython-jupyterlab-and-other-jupyter-clients)? + + +## Datasets and the Data Catalog + +* [Can I read the same data file using two different dataset implementations](../data/data_catalog.md#transcode-datasets)? + +## Nodes and pipelines + +* [How do I create a modular pipeline](../nodes_and_pipelines/modular_pipelines.md#how-do-i-create-a-modular-pipeline)? + +* [Can I use generator functions in a node](../nodes_and_pipelines/nodes.md#how-to-use-generator-functions-in-a-node)? + +## Visualisation + +* [Can I annotate a Kedro-Viz visualisation to show different data layers](../visualisation/kedro-viz_visualisation.md#visualise-layers)? \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index ee0d157f84..c6de344513 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -183,8 +183,10 @@ Welcome to Kedro's documentation! :maxdepth: 2 :caption: Resources + faq/faq resources/glossary + .. toctree:: :maxdepth: 2 :caption: Contribute to Kedro From 7c2e81048c51d07b0a575e32e97af5a0b6fd92c1 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 7 Mar 2023 14:49:55 +0000 Subject: [PATCH 5/8] Fix linting error Signed-off-by: Jo Stichbury --- docs/source/faq/faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/faq/faq.md b/docs/source/faq/faq.md index 957396f1ac..2e6d7ba9da 100644 --- a/docs/source/faq/faq.md +++ b/docs/source/faq/faq.md @@ -23,4 +23,4 @@ ## Visualisation -* [Can I annotate a Kedro-Viz visualisation to show different data layers](../visualisation/kedro-viz_visualisation.md#visualise-layers)? \ No newline at end of file +* [Can I annotate a Kedro-Viz visualisation to show different data layers](../visualisation/kedro-viz_visualisation.md#visualise-layers)? From cc29d0da66cf601de3705c9ab16051586a57de7b Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 14 Mar 2023 15:04:35 +0000 Subject: [PATCH 6/8] Change to install.md to limit to FAQ removal Signed-off-by: Jo Stichbury --- docs/source/get_started/install.md | 51 +----------------------------- 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/docs/source/get_started/install.md b/docs/source/get_started/install.md index a54ccb7cc2..5b049297c9 100644 --- a/docs/source/get_started/install.md +++ b/docs/source/get_started/install.md @@ -43,10 +43,6 @@ We suggest you create a new Python virtual environment for *each* new Kedro proj [Read more about Python virtual environments](https://realpython.com/python-virtual-environments-a-primer/) or [watch an explainer video about them](https://youtu.be/YKfAwIItO7M). ``` -```{note} -Depending on your preferred Python installation, you can alternatively create virtual environments to work with Kedro using `venv` or `pipenv` instead of `conda`. -``` - #### Create a new Python virtual environment using `conda` To create a new virtual environment called `kedro-environment` using `conda`: @@ -97,49 +93,4 @@ You should see an ASCII art graphic and the Kedro version number: for example, ![](../meta/images/kedro_graphic.png) -If you do not see the graphic displayed, or have any issues with your installation, see the [searchable archive of past community support discussions](https://linen-discord.kedro.org), or post a new query on [Kedro's Slack organisation](https://slack.kedro.org). - -### How do I upgrade Kedro? - -The best way to safely upgrade is to check our [release notes](https://github.com/kedro-org/kedro/blob/main/RELEASE.md) for any notable breaking changes. Follow the steps in the migration guide included for that specific release. - -Once Kedro is installed, you can check your version as follows: - -``` -kedro --version -``` - -To later upgrade Kedro to a different version, simply run: - -``` -pip install kedro -U -``` - -When migrating an existing project to a newer Kedro version, make sure you also update the `project_version`: - -* For projects generated with versions of Kedro > 0.17.0, you'll do this in the `pyproject.toml` file from the project root directory. -* If your project was generated with a version of Kedro <0.17.0, you will instead need to update the `ProjectContext`, which is found in `src//run.py`. - - -## Install a development version of Kedro - -This section explains how to try out a development version of Kedro direct from the [Kedro GitHub repository](https://github.com/kedro-org/kedro). - -```{important} -The development version of Kedro is not guaranteed to be bug-free and/or compatible with any of the [stable versions](https://pypi.org/project/kedro/#history). We do not recommend that you use a development version of Kedro in any production systems. Please install and use with caution. -``` - -To try out latest, unreleased functionality from the `develop` branch of the Kedro GitHub repository, run the following installation command: - -```console -pip install git+https://github.com/kedro-org/kedro.git@develop -``` - -This will install Kedro from the `develop` branch of the GitHub repository, which is always the most up to date. This command will install Kedro from source, unlike `pip install kedro` which installs Kedro from PyPI. - -If you want to roll back to a stable version of Kedro, execute the following in your environment: - -```console -pip uninstall kedro -y -pip install kedro -``` +If you do not see the graphic displayed, or have any issues with your installation, check out the [searchable archive from our retired Discord server](https://linen-discord.kedro.org), or post a new query on the [Slack organisation](https://slack.kedro.org). From ecccf7c195a6625f73484a2845ecd1fd3f30d69c Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Mar 2023 12:37:28 +0000 Subject: [PATCH 7/8] Fix linkcheck Signed-off-by: Jo Stichbury --- docs/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/conf.py b/docs/conf.py index f6166a08b2..0957813875 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -221,6 +221,7 @@ "https://github.com/kedro-org/kedro/blob/main/kedro/framework/project/default_logging.yml", "https://github.com/kedro-org/kedro/blob/main/README.md#the-humans-behind-kedro", # "anchor not found" but is valid "https://opensource.org/license/apache2-0-php/", + "https://docs.github.com/en/rest/overview/other-authentication-methods#via-username-and-password" ] # retry before render a link broken (fix for "too many requests") From 5cdb4da09ae15b3f50a7173ceb9ea9f225c49aaf Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Mon, 20 Mar 2023 11:26:46 +0000 Subject: [PATCH 8/8] Final tweaks following review Signed-off-by: Jo Stichbury --- docs/source/development/automated_testing.md | 4 ++-- docs/source/development/commands_reference.md | 2 +- docs/source/get_started/install.md | 14 ++++++-------- docs/source/tutorial/package_a_project.md | 4 ++-- docs/source/tutorial/tutorial_template.md | 2 +- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/docs/source/development/automated_testing.md b/docs/source/development/automated_testing.md index 28d4e469b9..6efcfa73b9 100644 --- a/docs/source/development/automated_testing.md +++ b/docs/source/development/automated_testing.md @@ -21,7 +21,7 @@ Let's look at how you can start working with `pytest` in your Kedro project. ### Install `pytest` -Install `pytest` as you would install other packages with `pip`, making sure your [project's virtual environment is active](../get_started/install.md#create-a-python-virtual-environment-for-your-kedro-project). +Install `pytest` as you would install other packages with `pip`, making sure your [project's virtual environment is active](../get_started/install.md#create-a-virtual-environment-for-your-kedro-project). ```bash pip install pytest @@ -125,7 +125,7 @@ It can be useful to see how much of your project is covered by tests. For this, ### Install `pytest-cov` -Install `pytest` as you would install other packages with pip, making sure your [project's virtual environment is active](../get_started/install.md#create-a-python-virtual-environment-for-your-kedro-project). +Install `pytest` as you would install other packages with pip, making sure your [project's virtual environment is active](../get_started/install.md#create-a-virtual-environment-for-your-kedro-project). ```bash pip install pytest-cov diff --git a/docs/source/development/commands_reference.md b/docs/source/development/commands_reference.md index d4b81d8f64..6909287314 100644 --- a/docs/source/development/commands_reference.md +++ b/docs/source/development/commands_reference.md @@ -396,7 +396,7 @@ _This command will be deprecated from Kedro version 0.19.0._ kedro build-docs ``` -The `build-docs` command builds [project documentation](../tutorial/package_a_project.md#add-documentation-to-your-project) using the [Sphinx](https://www.sphinx-doc.org) framework. To further customise your documentation, please refer to `docs/source/conf.py` and the [Sphinx documentation](http://www.sphinx-doc.org/en/master/usage/configuration.html). +The `build-docs` command builds [project documentation](../tutorial/package_a_project.md#add-documentation-to-a-kedro-project) using the [Sphinx](https://www.sphinx-doc.org) framework. To further customise your documentation, please refer to `docs/source/conf.py` and the [Sphinx documentation](http://www.sphinx-doc.org/en/master/usage/configuration.html). #### Lint your project diff --git a/docs/source/get_started/install.md b/docs/source/get_started/install.md index b4a4b391b1..753056dffd 100644 --- a/docs/source/get_started/install.md +++ b/docs/source/get_started/install.md @@ -16,12 +16,12 @@ If you encounter any problems as you set up Kedro, ask for help on Kedro's [Slac * **git**: You must install `git` onto your machine if you do not already have it. Type `git -v` into your terminal window to confirm it is installed; it will return the version of `git` available or an error message. [You can download `git` from the official website](https://git-scm.com/). -## Create a Python virtual environment for your Kedro project +## Create a virtual environment for your Kedro project We strongly recommend [installing `conda` as your virtual environment manager](https://docs.conda.io/projects/conda/en/latest/user-guide/install/) if you don't already use it. ``` {tip} -[Read more about Python virtual environments](https://realpython.com/python-virtual-environments-a-primer/) or [watch an explainer video about them](https://youtu.be/YKfAwIItO7M). +[Read more about virtual environments for Python projects](https://realpython.com/python-virtual-environments-a-primer/) or [watch an explainer video about them](https://youtu.be/YKfAwIItO7M). ``` ### How to create a new virtual environment using `conda` @@ -58,7 +58,7 @@ To exit `kedro-environment`: conda deactivate ``` -### How to create a new Python virtual environment without using `conda` +### How to create a new virtual environment without using `conda` Depending on your preferred Python installation, you can create virtual environments to work with Kedro using `venv` or `pipenv` instead of `conda`. @@ -121,7 +121,7 @@ exit -## Install Kedro using `pip` +## How to install Kedro using `pip` To install Kedro from the Python Package Index (PyPI): @@ -131,7 +131,7 @@ pip install kedro You can also install Kedro using `conda install -c conda-forge kedro`. -## Verify your Kedro installation +## How to verify your Kedro installation To check that Kedro is installed: @@ -162,12 +162,11 @@ To later upgrade Kedro to a different version, simply run: pip install kedro -U ``` -When migrating an existing project to a newer Kedro version, make sure you also update the `project_version`: +When migrating an existing project to a newer Kedro version, make sure you also update the `kedro_init_version`: * For projects generated with versions of Kedro > 0.17.0, you'll do this in the `pyproject.toml` file from the project root directory. * If your project was generated with a version of Kedro <0.17.0, you will instead need to update the `ProjectContext`, which is found in `src//run.py`. - ## How to install a development version of Kedro This section explains how to try out a development version of Kedro direct from the [Kedro GitHub repository](https://github.com/kedro-org/kedro). @@ -190,4 +189,3 @@ If you want to roll back to a stable version of Kedro, execute the following in pip uninstall kedro -y pip install kedro ``` - diff --git a/docs/source/tutorial/package_a_project.md b/docs/source/tutorial/package_a_project.md index 30c9f59867..d86fc6a0bd 100644 --- a/docs/source/tutorial/package_a_project.md +++ b/docs/source/tutorial/package_a_project.md @@ -4,7 +4,7 @@ This section explains how to build project documentation, and how to bundle a Ke Kedro also has an advanced feature which supports packaging on a pipeline level allowing you share and reuse pipelines across projects! To read more about this please look at the [section on micro-packaging](../nodes_and_pipelines/micro_packaging.md). -## Add documentation to your project +## Add documentation to a Kedro project There are several documentation frameworks for Python projects. This section describes how to use [Sphinx](https://www.sphinx-doc.org). @@ -97,7 +97,7 @@ make html Consult the Sphinx project documentation for [additional options to pass to `sphinx-build`](https://www.sphinx-doc.org/en/master/man/sphinx-build.html). To customise your documentation beyond the basic template, you'll need to adjust the [Sphinx configuration settings](https://www.sphinx-doc.org/en/master/usage/configuration.html) which are stored in `docs/source/conf.py` file. ``` -## Package your project +## Package a Kedro project To package a project, run the following in your project root directory: diff --git a/docs/source/tutorial/tutorial_template.md b/docs/source/tutorial/tutorial_template.md index fc0567c687..ea255b5886 100644 --- a/docs/source/tutorial/tutorial_template.md +++ b/docs/source/tutorial/tutorial_template.md @@ -74,7 +74,7 @@ You may also want to store credentials such as usernames and passwords if they a To do this, add them to `conf/local/credentials.yml` (some examples are included in that file for illustration). -### Configuration best practice to avoid leaking confidential data? +### Configuration best practice to avoid leaking confidential data * Do not commit data to version control. * Do not commit notebook output cells (data can easily sneak into notebooks when you don't delete output cells).