Skip to main content

Backend of OpenCloning, a web application to generate molecular cloning strategies in json format, and share them with others.

Project description

OpenCloning Cloning API

This python packages contains an API that provides a series of entry points for in silico cloning. The API documentation can be accessed here.

You can also install it and use some of the exported functions, in particular for primer design.

Migrating between model versions and fixing model bugs

  • The data model changes, so the json files you created may not be compatible with the newest version of the library, which uses the latest data mode. You can easily fix this using python -m opencloning_linkml.migrations.migrate file.json see full documentation.
  • Before version 0.3, there was a bug for assembly fields that included locations spanning the origin. See the details and how to fix it in the documentation of this file.

Getting started

If you want to quickly set up a local instance of the frontend and backend of the application, check getting started in 5 minutes in the main repository.

For the configuration of the container via env variables, check the docker-compose file in the main repository.

Running locally

You can install this as a python package:

# Create a virtual environment
python -m venv .venv
# Activate the virtual environment
source .venv/bin/activate
# Install the package from pypi
pip install opencloning
# Run the API (uvicorn should be installed in the virtual environment)
uvicorn opencloning.main:app

Installing from GitHub (monorepo)

This repository is a uv workspace; the installable package lives in packages/opencloning/. When installing directly from GitHub, include the subdirectory fragment:

# uv
uv add "opencloning @ git+https://github.com/OpenCloning/OpenCloning_backend.git@master#subdirectory=packages/opencloning"

# pip
pip install "git+https://github.com/OpenCloning/OpenCloning_backend.git@master#subdirectory=packages/opencloning"

Running locally if you want to contribute

This repository is a uv workspace: the installable package lives under packages/opencloning/, and the repo root holds workspace metadata and shared dev dependencies. Install uv, then from the repository root:

# Install the workspace (editable opencloning + dev/test dependency groups) into .venv
uv sync

# Install the pre-commit hooks
uv run pre-commit install

# Run tools via uv, or activate .venv and use them directly
source .venv/bin/activate   # optional

The virtual environment is created at the repository root (.venv). For VS Code settings see the folder .vscode.

Now you should be able to run the api by running:

# The --reload argument will reload the API if you make changes to the code
uvicorn opencloning.main:app --reload --reload-exclude='.venv'

Then you should be able to open the API docs at http://127.0.0.1:8000/docs to know that your API is working.

Running locally with docker :whale:

If you want to serve the full site (backend and frontend) with docker, check getting started in 5 minutes in the main repository.

If you want to serve only the backend from a docker container, an image is available at manulera/opencloningbackend. The image is built from docker/opencloning.Dockerfile (repository root as build context) and exposes the port 3000. To run it:

docker build -f docker/opencloning.Dockerfile -t manulera/opencloningbackend .
docker run -d --name backendcontainer -p 8000:8000 manulera/opencloningbackend

To run with a read-only root filesystem while still allowing temporary files (required for tools like mafft), mount /tmp as tmpfs (RAM-backed writable storage). This will not work with RECORD_STUBS=1 (see Generating API stubs).

docker run -d --name backendcontainer -p 8000:8000 \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid,size=256M \
  manulera/opencloningbackend

If you want to build the test image locally, you can do so by:

docker build -f docker/opencloning.Dockerfile -t manulera/opencloningbackend-test --target builder-test .

If you don't want to download the repository and build the image, you can fetch the latest image from dockerhub.

docker pull manulera/opencloningbackend
docker run -d --name backendcontainer -p 8000:8000 manulera/opencloningbackend

The api will be running at http://localhost:8000, so you should be able to access the docs at http://localhost:8000/docs.

Connecting to the frontend

If you want to receive requests from the frontend, or from another web application you may have to include the url of the frontend application in the CORS exceptions. By default, if you run the dev server with uvicorn opencloning.main:app --reload --reload-exclude='.venv', the backend will accept requests coming from http://localhost:3000, which is the default address of the frontend dev server (ran with yarn start).

If you want to change the allowed origins, you can do so via env variables (comma-separated). e.g.:

ALLOWED_ORIGINS=http://localhost:3000,http://localhost:3001 uvicorn opencloning.main:app --reload --reload-exclude='.venv'

Similarly, the frontend should be configured to send requests to the backend address, see here.

Serving the frontend from the backend

You may prefer to handle everything from a single server. You can do so by:

  • Build the frontend with yarn build.
  • Copy the folder build from the frontend to the root directory of the backend, and rename it to frontend.
  • Set the environment variable SERVE_FRONTEND=1 when running the backend. By default this will remove all allowed origins, but you can still set them with ALLOWED_ORIGINS.
  • Set the value of backendUrl in frontend/config.js to /.
  • Now, when you go to the root of the backend (e.g. http://localhost:8000), you should receive the frontend instead of the greeting page of the API.

You can see how this is done in this docker image and docker-compose file.

Running the tests locally

From the repository root (after uv sync):

This will require setting the ADDGENE_USERNAME and ADDGENE_PASSWORD environment variables, see Addgene authenticated access for more details.

uv run pytest packages/opencloning/tests -v -ks

If you wanted to run them in docker:

export COMPOSE_PROJECT_NAME=opencloning-local-docker
# Plus env vars for ADDGENE and NCBI API keys

docker compose \
  -f docker/docker-compose.postgres.yml \
  -f docker/docker-compose.ci-tests.yml \
  run --rm tests \
  python -m pytest -vs -o cache_dir=/tmp/pytest-cache

Addgene authenticated access

Addgene now requires authenticated access to retrieve sequence files.

To be able to access AddGene sequences, create an account on AddGene and set these environment variables to enable Addgene imports:

export ADDGENE_USERNAME="your_addgene_username"
export ADDGENE_PASSWORD="your_addgene_password"

For one-off local runs you can also prefix commands:

ADDGENE_USERNAME="your_addgene_username" ADDGENE_PASSWORD="your_addgene_password" uv run pytest packages/opencloning/tests -v -ks

If these variables are not set, Addgene import endpoints return an informative error explaining that credentials are required.

Use of Addgene credentials and data must comply with Addgene Terms of Use.

For CI, configure repository secrets named ADDGENE_USERNAME and ADDGENE_PASSWORD so Addgene-dependent tests can run.

Generating API stubs

For the frontend, it may be useful to produce stubs (I use them for writing the tests). See how this is implemented by looking at the RecordStubRoute class in api_config_utils.py. To run the dev server and record stubs:

RECORD_STUBS=1 uvicorn opencloning.main:app --reload --reload-exclude='.venv'

This will record the stubs (requests and responses) in the stubs folder.

Catalogs

Catalogs are used to map ids to urls for several plasmid collections. They are stored under packages/opencloning/src/opencloning/catalogs/.

To update the catalogs, run the following command from the repository root:

uv run python scripts/update_catalogs.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opencloning-1.6.1.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opencloning-1.6.1-py3-none-any.whl (158.2 kB view details)

Uploaded Python 3

File details

Details for the file opencloning-1.6.1.tar.gz.

File metadata

  • Download URL: opencloning-1.6.1.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for opencloning-1.6.1.tar.gz
Algorithm Hash digest
SHA256 ba03b84180ac5bfe1a1b9521b54a52207dc8de3fe50a4368c1ae6f1b83adb85b
MD5 6e0f7d7b19b270493b9074dd59f4e206
BLAKE2b-256 9d542f4d20837a50e557f552e02d629280bebbf16c605f1a403f500b7af5481d

See more details on using hashes here.

Provenance

The following attestation bundles were made for opencloning-1.6.1.tar.gz:

Publisher: release-please.yml on OpenCloning/OpenCloning_backend

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file opencloning-1.6.1-py3-none-any.whl.

File metadata

  • Download URL: opencloning-1.6.1-py3-none-any.whl
  • Upload date:
  • Size: 158.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for opencloning-1.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 2547d2cc44a8886f71bca5f266b4e592311fec2017ce9a16a0c46af4d02d44f6
MD5 5258b9964206eddfcfc1012502e08715
BLAKE2b-256 c398068228006713b2a9bc63ba77e4b2ccb3909cd6c432d552098f77d3bdf5ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for opencloning-1.6.1-py3-none-any.whl:

Publisher: release-please.yml on OpenCloning/OpenCloning_backend

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page