.. _developer_documentation: Developer Documentation ======================= .. contents:: :local: :depth: 1 Local Environment ----------------- We use `pixi `_ to create the virtual environment for local development of the project, as well as for creating conda packages for this project. If you don't have `pixi` installed in your Linux machine, you can install it with: .. code-block:: bash $> curl -fsSL https://pixi.sh/install.sh | sh See the `pixi installation page `_ for more options. Then, you can create the virtual environment for local development with: .. code-block:: bash $> cd /path/to/lr_reduction/ $> pixi install This command will also install project `lr_reduction` in editable mode. By installing the project in editable mode, one doesn't need to re-install the project after a change in the source code. To activate the conda environment, type in the terminal: .. code-block:: bash $> pixi shell This command will start a bash shell with the conda environment activated. To exit the shell, type: .. code-block:: bash $> exit Pixi also offers a set of commands to help with the development of the project, like building the documentation, and creating conda packages. To see the list of available commands, type in the terminal: .. code-block:: bash $> pixi task list Tasks that can run on this machine: ----------------------------------- clean-all, conda-build, conda-builder, conda-clean, docs-build, docs-clean, reset-version, sync-version, test-reduction Task Description clean-all Clean all build artifacts conda-build Build the conda package conda-builder Command that creates the conda package conda-clean Clean the local .conda build artifacts docs-build Build the documentation docs-clean Clean the documentation build artifacts reset-version Reset the package version to 0.0.0 sync-version Sync pyproject.toml version with Git version Each task has a brief description in file pyproject.toml, under the section `[tool.pixi.tasks]`. Activating the Environment Automatically ---------------------------------------- Wouldn't be nice if every time you enter the project directory, the conda environment is activated automatically? To achieve this, install `direnv `_ and create file `.envrc` in the project root directory with the following content: .. code-block:: bash watch_file pixi.lock eval "$(pixi shell-hook)" unset PS1 Then, in the terminal, type: .. code-block:: bash $> direnv allow Now direnv activates the environment when you enter the project directory, and deactivates it when you leave the directory. Line `watch_file pixi.lock` directs direnv to re-evaluate the environment whenever file `pixi.lock` changes. Line `unset PS1` prevents direnv from `reporting on a nagging, albeit harmless, error message `_. pre-commit Hooks ---------------- Activate the hooks by typing in the terminal: .. code-block:: bash $> cd /path/to/lr_reduction/ $> pixi shell $> pre-commit install Development procedure --------------------- 1. A developer is assigned with a task during neutron status meeting and changes the task's status to **In Progress**. 2. The developer creates a branch off *next* and completes the task in this branch. 3. The developer creates a pull request (PR) off *next*. 4. Any new features or bugfixes must be covered by new and/or refactored automated tests. 5. The developer asks for another developer as a reviewer to review the PR. A PR can only be approved and merged by the reviewer. 6. The developer changes the task’s status to **Complete** and closes the associated issue. Using the Data Repository liquidsreflectometer-data --------------------------------------------------- To run the integration tests in your local environment, it is necessary first to download the data files. Because of their size, the files are stored in the Git LFS repository `lr_reduction-data `_. It is necessary to have package `git-lfs` installed in your machine. .. code-block:: bash $> sudo apt install git-lfs After this step, initialize or update the data repository: .. code-block:: bash $> cd /path/to/lr_reduction $> git submodule update --init This will either clone `liquidsreflectometer-data` into `/path/to/lr_reduction/tests/liquidsreflectometer-data` or bring the `liquidsreflectometer-data`'s refspec in sync with the refspec listed within file `/path/to/liquidsreflectometer/.gitmodules`. An intro to Git LFS in the context of the Neutron Data Project is found in the `Confluence pages `_ (login required). Coverage reports ---------------- GitHub actions create reports for unit and integration tests, then combine into one report and upload it to `Codecov `_. Building the documentation -------------------------- A repository webhook is setup to automatically trigger the latest documentation build by GitHub actions. To manually build the documentation: .. code-block:: bash $> pixi run docs-build After this, point your browser to `file:///path/to/lr_reduction/docs/build/html/index.html` Creating a stable release ------------------------- - *patch* release, it may be allowed to bypass the creation of a candidate release. Still, we must update branch `qa` first, then create the release tag in branch `main`. For instance, to create patch version "v2.1.1": .. code-block:: bash VERSION="v2.1.2" # update the local repository git fetch --all --prune git fetch --prune --prune-tags origin # update branch qa from next, possibly bringing work done in qa missing in next git switch next git rebase -v origin/next git merge --no-edit origin/qa # commit message is automatically generated git push origin next # required to "link" qa to next, for future fast-forward git switch qa git rebase -v origin/qa git merge --ff-only origin/next # update branch main from qa git merge --no-edit origin/main # commit message is automatically generated git push origin qa # required to "link" main to qa, for future fast-forward git switch main git rebase -v origin/main git merge --ff-only origin/qa git tag $VERSION git push origin --tags main - *minor* or *major* release, we create a stable release *after* we have created a Candidate release. For this customary procedure, follow: + the `Software Maturity Model `_ for continous versioning as well as creating release candidates and stable releases. + Update the :ref:`Release Notes ` with major fixes, updates and additions since last stable release.