Developer documentation

If you are interested in learning about how the NexusLIMS back-end works or adding new features, these instructions should get you up and running with a development environment that will allow you to modify how the code operates.

Development environment setup

NexusLIMS(Euclid) uses conda as environment management tool. To set up for development, we first install miniconda (a slimmed version of conda).

Get the miniconda installer from here, choose the latest Python3 version of your platform and archetecture. Install with double clicking if you download a installer, or bash <SCRIPT_NAME> if you download a bash installation script.

In the process, it will ask a few questions:

Accept the license terms?

yes

Where to install?

Default location is $HOME/miniconda3, or whatever you prefer.

Do you wish the installer to initialize Miniconda3

yes

. After these, open a new shell, you should be able to use conda.

Next create an environment with conda:

conda create -n ENV_NAME python=3.8 # replace ENV_NAME with something
                                    # you like, create an environment
                                    # with such name, and install Python
                                    # 3.8, which NexusLIMS(Euclid) depends
                                    # on (3.7 - 3.8).

We strongly recommend you install a supported numpy version when you create the environment. The installation of other dependency packages may (not) throw an error if numpy can not be found. Example: .. code-block:

conda create -n ENV_NAME python=3.8 numpy=1.19.1 # Get the appropriate
                                                 # numpy version from
                                                 # the conda website.

To activate an environment, do:

conda activate ENV_NAME # replace ENV_NAME with the concrete name you set.

to deactivate, do:

conda deactivate

To delete an environment, do:

conda env remove -n ENV_NAME

For more conda usage, please refer to conda usage guide.

Installation

conda activate ENV_NAME                                        # activate conda environment
git clone https://github.com/YOUR_GITHUB_ACCOUNT/nexuslims.git # clone repository
cd nexuslims
pip install -e .                                               # install the package
pip install -r docs/requirements.txt                           # install dev-related package

if python -c "import nexusLIMS" successfully executed (no error), then nexusLIMS is installed correctly.

Set nexusLIMS environment variables

nexusLIMS would require some environment variables set to run, an example would be like:

nexusLIMS_user='username'
nexusLIMS_pass='password'
mmfnexus_path='/path/to/mmfnexus/mount'
nexusLIMS_path='/path/to/nexusLIMS/mount/mmfnexus'
nexusLIMS_db_path='/path/to/nexusLIMS/nexuslims_db.sqlite'

to let shell know them, do:

# linux/macOS
source env.sh [test] # add `test` to set test flag
# Windows Powershell
.\env.ps1 [test] # add `test` to set test flag

Warning

Environment variables in env.sh/env.ps1 may contain credentials, DO NOT let git track its changes to avoid information leak!

Building new records

The most basic feature of the NexusLIMS back-end is to check the database for any logs (inserted by the Session Logger App) with a status of 'TO_BE_BUILT'. This can be accomplished simply by running the record_builder module directly via:

$ pipenv run python -m nexusLIMS.builder.record_builder

This command will find any records that need to be built, build the .xml file, and then upload it to the front-end CDCS instance.

Using other features of the library

Once you are in a python interpreter (such as python, ipython, jupyter, etc.) from the pipenv environment, you can access the code of this library through the nexusLIMS package if you want to do other tasks, such as extracting metadata or building previews images, etc.

For example, to extract the metadata from a .tif file saved on the FEI Quanta, run the following code using the get_quanta_metadata() function:

from nexusLIMS.extractors.quanta_tif import get_quanta_metadata
meta = get_quanta_metadata("path_to_file.tif")

The meta variable will then contain a dictionary with the extracted metadata from the file.

Contributing

To contribute, please fork the repository, develop your addition on a feature branch within your forked repo, and submit a pull request to the master branch to have it included in the project. Contributing to the package requires that every line of code is covered by a test case. This project uses testing through the pytest library, and features that do not pass the test cases or decrease coverage will not be accepted until suitable tests are included (see the tests directory for examples) and that the coverage of any new features is 100%. To get this information, you can use an IDE that includes coverage tracking (such as PyCharm) or include the --cov flag when running the tests. To test the preview image generation, the --mpl option should also be provided, together with the path to the "reference" images that are tested against. For example:

$ cd <path_to_repo>
$ pipenv run pytest nexuslims/nexusLIMS/tests --cov=nexuslims/nexusLIMS \
     --cov-report term --mpl --mpl-baseline-path=nexuslims/nexusLIMS/tests/files/figs

# ============================= test session starts ==============================
# platform linux -- Python 3.7.5, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
# Matplotlib: 3.1.3
# Freetype: 2.6.1
# rootdir: nexuslims/nexusLIMS/tests, inifile: pytest.ini
# plugins: mpl-0.11, cov-2.8.1, sugar-0.9.2
# collected 104 items
#
# nexuslims/nexusLIMS/tests/test_calendar_handling.py .............................. [ 28%]
# nexuslims/nexusLIMS/tests/test_extractors.py ..................................... [ 64%]
# nexuslims/nexusLIMS/tests/test_instruments.py .....                                [ 69%]
# nexuslims/nexusLIMS/tests/test_records.py ......................                   [ 90%]
# nexuslims/nexusLIMS/tests/test_utils.py .........                                  [ 99%]
# nexuslims/nexusLIMS/tests/test_version.py .                                        [100%]
#
# ----------- coverage: platform linux, python 3.7.5-final-0 ---------------------
# Name                                                         Stmts   Miss  Cover
# --------------------------------------------------------------------------------
# nexuslims/nexusLIMS/__init__.py                             8      0   100%
# nexuslims/nexusLIMS/_urls.py                                3      0   100%
# nexuslims/nexusLIMS/builder/__init__.py                     0      0   100%
# nexuslims/nexusLIMS/builder/record_builder.py             149      0   100%
# nexuslims/nexusLIMS/cdcs.py                                69      0   100%
# nexuslims/nexusLIMS/db/__init__.py                         10      0   100%
# nexuslims/nexusLIMS/db/session_handler.py                  72      0   100%
# nexuslims/nexusLIMS/extractors/__init__.py                 65      0   100%
# nexuslims/nexusLIMS/extractors/digital_micrograph.py      421      0   100%
# nexuslims/nexusLIMS/extractors/fei_emi.py                   0      0   100%
# nexuslims/nexusLIMS/extractors/quanta_tif.py              197      0   100%
# nexuslims/nexusLIMS/extractors/thumbnail_generator.py     329      0   100%
# nexuslims/nexusLIMS/harvester/__init__.py                   0      0   100%
# nexuslims/nexusLIMS/harvester/sharepoint_calendar.py      108      0   100%
# nexuslims/nexusLIMS/instruments.py                         44      0   100%
# nexuslims/nexusLIMS/schemas/__init__.py                     0      0   100%
# nexuslims/nexusLIMS/schemas/activity.py                   151      0   100%
# test_calendar_handling.py                                      154      0   100%
# test_extractors.py                                             379      0   100%
# test_instruments.py                                             27      0   100%
# test_records.py                                                181      0   100%
# test_utils.py                                                   61      0   100%
# test_version.py                                                  5      0   100%
# utils.py                                                         7      0   100%
# nexuslims/nexusLIMS/utils.py                              135      0   100%
# nexuslims/nexusLIMS/version.py                              2      0   100%
# --------------------------------------------------------------------------------
# TOTAL                                                         2577      0   100%