Skip to main content

OARepo Runtime

Runtime extensions for Invenio framework.

Overview

This package extends Invenio with:

  • Model registry for unified record type configuration
  • Typed system fields with dynamic OpenSearch mapping
  • Nested and date-range facets with permission-based filtering
  • Service component dependency ordering
  • Multilingual schema support (I18N)
  • FAIR Signposting implementation (HTTP Link headers and linksets)
  • Repository information endpoints
  • Custom field mapping updates
  • CLI extensions for search initialization

Installation

pip install oarepo-runtime

Requirements

  • Python 3.14+
  • Invenio 14.x
  • OpenSearch/Elasticsearch compatible search backend

Key Features

1. Model Registry and Management

Source: oarepo_runtime/api.py, oarepo_runtime/ext.py, oarepo_runtime/config.py

The Model class provides a unified configuration structure for record types in your repository:

from oarepo_runtime import Model
from flask_babel import lazy_gettext as _

model = Model(
    code="my_record",
    name=_("My Record Type"),
    version="1.0.0",
    service="my_records",
    resource_config="my_app.resources.config.MyRecordResourceConfig",
    description=_("Custom record type for my repository"),
    exports=[
        Export(
            code="datacite",
            name=_("DataCite JSON"),
            mimetype="application/vnd.datacite.datacite+json",
            serializer=DataCiteSerializer(),
        )
    ],
    records_alias_enabled=True,
)

Normally, it is created automatically when using the oarepo-model library.

The OARepoRuntime extension manages all registered models:

from oarepo_runtime import current_runtime

# Access models by code
model = current_runtime.models["my_record"]

# Get service for a record instance
service = current_runtime.get_record_service_for_record(record)

# Find records by PID type
record_class = current_runtime.record_class_by_pid_type["recid"]

# Get all RDM-compatible models
rdm_models = list(current_runtime.rdm_models)

Key capabilities:

  • Centralized model registration via OAREPO_MODELS configuration
  • Automatic service and resource resolution
  • PID type to record class mapping
  • Schema to model mapping for serialization
  • Support for draft/published record workflows
  • File service integration

2. Enhanced System Fields

Source: oarepo_runtime/records/systemfields/

Typed System Fields

Base class for system fields with type hints and proper typing support:

from oarepo_runtime.records.systemfields import TypedSystemField


class MyCustomField(TypedSystemField[MyRecord, str]):
    def obj_get(self, record: MyRecord) -> str:
        # Implementation
        pass

Mapping System Fields

Dynamic OpenSearch mapping support for system fields that need custom indexing:

from oarepo_runtime.records.systemfields import MappingSystemFieldMixin


class DynamicField(MappingSystemFieldMixin, TypedSystemField):
    def mapping_settings(self, record_class):
        return {"type": "keyword", "eager_global_ordinals": True}

Publication Status System Field

Built-in field for tracking record publication status:

from oarepo_runtime.records.systemfields import PublicationStatusSystemField


class MyRecord(Record):
    publication_status = PublicationStatusSystemField()

3. Advanced Faceting System

Source: oarepo_runtime/services/facets/

Date Range Facets

Support for date-based faceting with configurable intervals:

from oarepo_runtime.services.facets.date import DateRangeFacet

facets = {"created": DateRangeFacet(field="created", label="Created Date", interval="year")}

Nested Facets

Faceting on nested objects with label resolution:

from oarepo_runtime.services.facets.nested_facet import NestedLabeledFacet

facets = {
    "contributors": NestedLabeledFacet(
        field="metadata.contributors.person.id",
        nested_path="metadata.contributors",
        value_labels={"person123": {"cs": "Jan Novák", "en": "Jan Novak"}},
    )
}

Grouped Facets with Permissions

Permission-based facet grouping for different user roles:

from invenio_records_resources.services.records.config import SearchOptions
from invenio_records_resources.services.records.facets import TermsFacet


class MySearchOptions(SearchOptions):
    facets = {
        "publication_status": TermsFacet(field="publication_status"),
        "internal_status": TermsFacet(field="internal_status"),
        "workflow_state": TermsFacet(field="workflow_state"),
    }

    facet_groups = {
        "default": ["publication_status"],
        "admin": ["internal_status", "workflow_state"],
    }

4. Service Component Ordering

Source: oarepo_runtime/services/config/components.py

Deterministic ordering of service components with dependency resolution:

class ComponentOrderingMixin:
    """Mixin that ensures service components execute in the correct order."""

    @property
    def components(self):
        # Components are automatically ordered based on:
        # - depends_on declarations
        # - affects declarations
        # - wildcard semantics (*)
        # - input order preservation where possible
        return self._ordered_components

Components can declare dependencies:

class MyComponent(ServiceComponent):
    depends_on = [ValidationComponent]  # Runs after ValidationComponent
    affects = "*"  # Affects all subsequent components

5. Multilingual Support

Source: oarepo_runtime/services/schema/

I18N UI Schema Support

Marshmallow schemas with multilingual field support:

from oarepo_runtime.services.schema.i18n_ui import I18nUISchema, MultilingualUIField


class MyUISchema(I18nUISchema):
    title = MultilingualUIField()
    description = MultilingualUIField(
        ui_params={"widget": "textarea", "placeholder": {"en": "Enter description", "cs": "Zadejte popis"}}
    )

Locale Handling

from oarepo_runtime.services.schema.i18n import LocalizedDateTime


class RecordSchema(Schema):
    created = LocalizedDateTime()  # Automatically formats dates per locale

6. Signposting and FAIR Data

Source: oarepo_runtime/resources/signposting/

Full implementation of FAIR Signposting for machine-readable links:

from oarepo_runtime.resources.signposting import landing_page_signpost_links_list, create_linkset, create_linkset_json

# Generate signposting links for a landing page
links = landing_page_signpost_links_list(datacite_dict, record_dict, short=False)

# Create HTTP Link header
header = list_of_signpost_links_to_http_header(links)

# Create application/linkset format
linkset = create_linkset(datacite_dict, record_dict)

# Create application/linkset+json format
linkset_json = create_linkset_json(datacite_dict, record_dict)

Supported relation types:

  • author - Links to author identifiers
  • cite-as - Persistent identifier (DOI)
  • describedby - Metadata export formats
  • item - File contents
  • license - License URIs
  • type - Resource type (schema.org)

7. Repository Information API

Source: oarepo_runtime/info/views.py

Machine-readable endpoint for repository metadata:

# GET /.well-known/repository
{
    "models": {
        "my_record": {
            "code": "my_record",
            "name": "My Record Type",
            "version": "1.0.0",
            "links": {
                "html": "/my-records/",
                "records": "/api/my-records/",
                "deposit": "/api/my-records/",
                "drafts": "/api/user/my-records/",
            },
            "jsonschemas": {"record": "https://localhost/schemas/my-records-1.0.0.json"},
            "exports": [{"code": "datacite", "mimetype": "application/vnd.datacite.datacite+json"}],
        }
    }
}

8. CLI Extensions

Source: oarepo_runtime/cli/

Enhanced search index initialization:

# Initialize search indices with custom field mapping updates
invenio index init

# The init command automatically runs registered hooks from:
# - oarepo.cli.search.init entry point
# - Updates dynamic mappings for all registered models

Extension point for custom initialization:

# In your package's entry points:
[project.entry-points."oarepo.cli.search.init"]
my_init = "my_app.init:update_custom_mappings"

9. Custom Fields and Relations

Source: oarepo_runtime/services/records/

Support for updating record mappings with custom fields:

from oarepo_runtime.services.records.custom_fields import update_all_records_mappings_relation_fields

# Update OpenSearch mappings for all records with relation fields
update_all_records_mappings_relation_fields()

10. Permission Generators

Source: oarepo_runtime/services/config/permissions.py

Pre-configured permission policy for open access repositories:

from oarepo_runtime.services.config.permissions import EveryonePermissionPolicy


class MyServiceConfig(RecordServiceConfig):
    permission_policy_cls = EveryonePermissionPolicy
    # Grants all permissions to any authenticated or anonymous user

Development

Setup

# Clone repository
git clone https://github.com/oarepo/oarepo-runtime.git
cd oarepo-runtime

./run.sh venv

Running Tests

./run.sh test

Entry Points

The package registers several Invenio entry points:

[project.entry-points."invenio_base.api_apps"]
oarepo_runtime = "oarepo_runtime.ext:OARepoRuntime"

[project.entry-points."invenio_base.apps"]
oarepo_runtime = "oarepo_runtime.ext:OARepoRuntime"

[project.entry-points."flask.commands"]
oarepo = "oarepo_runtime.cli:oarepo"

[project.entry-points."oarepo.cli.search.init"]
runtime_update_mappings = "oarepo_runtime.services.records.mapping:update_all_records_mappings"

[project.entry-points."invenio_base.blueprints"]
oarepo_runtime_info = "oarepo_runtime.info.views:create_wellknown_blueprint"

License

Copyright (c) 2020-2025 CESNET z.s.p.o.

OARepo Runtime is free software; you can redistribute it and/or modify it under the terms of the MIT License. See LICENSE file for more details.

Acknowledgments

This project builds upon Invenio Framework and is developed as part of the OARepo ecosystem.

Metadata

Release files for oarepo-runtime 7.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oarepo-runtime 7.12.0
File Size Uploaded
oarepo_runtime-7.12.0.tar.gz 64.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oarepo-runtime 7.12.0
File Interpreter ABI Platform
oarepo_runtime-7.12.0-py3-none-any.whl Python 3 none any Details

Total release size: 151.5 kB

Release files / oarepo_runtime-7.12.0.tar.gz

Download URL oarepo_runtime-7.12.0.tar.gz
Size 64.3 kB
Tags Source
SHA-256 checksum
How to use checksums
a489ad51f7740ec56db65239a75320efd6cc683ae329932e78e63d9e2892afe3
BLAKE2b-256 checksum
How to use checksums
4efc6495c5164bee2680e4ebba8380cb377845032446c58c66d62bebb917b04f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / oarepo_runtime-7.12.0-py3-none-any.whl

Download URL oarepo_runtime-7.12.0-py3-none-any.whl
Size 87.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a8dc0281faa359edadf553bb5c6a68f0e2dd8ecc72e85e94cf911c7910d881f6
BLAKE2b-256 checksum
How to use checksums
e6c861626971132b521b2faab08b29cf7c67f895b3ffb1bc4d02af88a7571084
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

7.12.0 This release

2 release files

7.11.0

2 release files

7.9.2

2 release files

7.9.1

2 release files

7.8.0

2 release files

7.7.1

2 release files

7.7.0

2 release files

7.6.0

2 release files

7.5.0

2 release files

7.4.0

2 release files

7.3.0

2 release files

7.2.0

2 release files

7.1.0

2 release files

7.0.0

2 release files

6.0.0

2 release files

5.1.1

2 release files

5.1.0

2 release files

5.0.0

2 release files

4.5.0

2 release files

4.4.0

2 release files

4.3.0

2 release files

4.2.0

2 release files

4.1.0

2 release files

4.0.0

2 release files

3.0.1

2 release files

1.10.6

2 release files

1.10.0

2 release files

1.9.4

2 release files

1.9.3

2 release files

1.9.2

2 release files

1.9.1

2 release files

1.9.0

2 release files

1.8.0

2 release files

1.7.2

2 release files

1.7.1

2 release files

1.7.0

2 release files

1.6.2

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.98

2 release files

1.5.97

2 release files

1.5.96

2 release files

1.5.95

2 release files

1.5.94

2 release files

1.5.93

2 release files

1.5.92

2 release files

1.5.91

2 release files

1.5.88

2 release files

1.5.87

2 release files

1.5.86

2 release files

1.5.85

2 release files

1.5.84

2 release files

1.5.82

2 release files

1.5.81

2 release files

1.5.74

2 release files

1.5.73

2 release files

1.5.72

2 release files

1.5.71

2 release files

1.5.70

2 release files

1.5.69

2 release files

1.5.68

2 release files

1.5.67

2 release files

1.5.66

2 release files

1.5.65

2 release files

1.5.64

2 release files

1.5.63

2 release files

1.5.61

2 release files

1.5.60

2 release files

1.5.57

2 release files

1.5.56

2 release files

1.5.55

2 release files

1.5.54

2 release files

1.5.53

2 release files

1.5.52

2 release files

1.5.51

2 release files

1.5.50

2 release files

1.5.49

2 release files

1.5.48

2 release files

1.5.43

2 release files

1.5.42

2 release files

1.5.37

2 release files

1.5.36

2 release files

1.5.35

2 release files

1.5.34

2 release files

1.5.31

2 release files

1.5.27

2 release files

1.5.26

2 release files

1.5.25

2 release files

1.5.24

2 release files

1.5.23

2 release files

1.5.22

2 release files

1.5.21

2 release files

1.5.20

2 release files

1.5.19

2 release files

1.5.18

2 release files

1.5.17

2 release files

1.5.13

2 release files

1.5.12

2 release files

1.5.11

2 release files

1.5.10

2 release files

1.5.9

2 release files

1.5.7

2 release files

1.5.6

2 release files

1.5.5

2 release files

1.5.4

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.46

2 release files

1.4.45

2 release files

1.4.44

2 release files

1.4.43

2 release files

1.4.42

2 release files

1.4.41

2 release files

1.4.40

2 release files

1.4.38

2 release files

1.4.37

2 release files

1.4.36

2 release files

1.4.35

2 release files

1.4.34

2 release files

1.4.33

2 release files

1.4.32

2 release files

1.4.31

2 release files

1.4.30

2 release files

1.4.29

2 release files

1.4.28

2 release files

1.4.27

2 release files

1.4.26

2 release files

1.4.25

2 release files

1.4.18

2 release files

1.4.17

2 release files

1.4.16

2 release files

1.4.15

2 release files

1.4.14

2 release files

1.4.13

2 release files

1.4.12

2 release files

1.4.11

2 release files

1.4.10

2 release files

1.4.9

2 release files

1.4.8

2 release files

1.4.7

2 release files

1.4.6

2 release files

1.4.5

2 release files

1.4.4

2 release files

1.4.3

2 release files

1.4.2

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.24

2 release files

1.3.23

2 release files

1.3.22

2 release files

1.3.21

2 release files

1.3.20

2 release files

1.3.19

2 release files

1.3.18

2 release files

1.3.10

2 release files

1.3.9

2 release files

1.3.8

2 release files

1.3.7

2 release files

1.3.6

2 release files

1.3.5

2 release files

1.3.4

2 release files

1.3.3

2 release files

1.3.2

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.35

2 release files

1.2.34

2 release files

1.2.33

2 release files

1.2.32

2 release files

1.2.31

2 release files

1.2.25

2 release files

1.2.24

2 release files

1.2.23

2 release files

1.2.22

2 release files

1.2.21

2 release files

1.2.20

2 release files

1.2.17

2 release files

1.2.15

2 release files

1.2.14

2 release files

1.2.13

2 release files

1.2.12

2 release files

1.2.11

2 release files

1.2.10

2 release files

1.2.9

2 release files

1.2.8

2 release files

1.2.7

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.7

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.10

2 release files

1.0.8

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page