aiidalab.registry package#

Submodules#

aiidalab.registry.api module#

Generate API endpoints.

aiidalab.registry.api.build_api_v1(api_path, apps_index, apps_data, scan_app_repository)[source]#

Build tree for API endpoint v1.

aiidalab.registry.api.validate_api_v1(api_path, schemas)[source]#

Validate tree for API endpoint v1.

aiidalab.registry.apps_index module#

Generate the apps index including all aggregated metadata.

aiidalab.registry.apps_index._determine_app_name(app_id)[source]#

Currently the app name is identical to its id.

aiidalab.registry.apps_index._fetch_app_data(app_id, app_data, scan_app_repository)[source]#
aiidalab.registry.apps_index._migrate_app_data(app_data)[source]#
aiidalab.registry.apps_index.generate_apps_index(data, scan_app_repository)[source]#

Generate the comprehensive app index.

This index is built from the apps data and includes additional information such as the releases.

aiidalab.registry.apps_index.validate_apps_index_and_apps(apps_index, apps_index_schema, apps, app_schema)[source]#

Validate the apps_index file.

aiidalab.registry.core module#

Core data classes for the app registry.

class aiidalab.registry.core.AppRegistryData(apps: dict, categories: dict)[source]#

Bases: object

The app registry data objects (apps and categories).

__annotations__ = {'apps': <class 'dict'>, 'categories': <class 'dict'>}#
__dataclass_fields__ = {'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}#
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)#
__dict__ = mappingproxy({'__module__': 'aiidalab.registry.core', '__annotations__': {'apps': <class 'dict'>, 'categories': <class 'dict'>}, '__doc__': 'The app registry data objects (apps and categories).', 'validate': <function AppRegistryData.validate>, '__dict__': <attribute '__dict__' of 'AppRegistryData' objects>, '__weakref__': <attribute '__weakref__' of 'AppRegistryData' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False), '__dataclass_fields__': {'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}, '__init__': <function AppRegistryData.__init__>, '__repr__': <function AppRegistryData.__repr__>, '__eq__': <function AppRegistryData.__eq__>, '__hash__': None, '__match_args__': ('apps', 'categories')})#
__eq__(other)#

Return self==value.

__hash__ = None#
__init__(apps: dict, categories: dict) None#
__match_args__ = ('apps', 'categories')#
__module__ = 'aiidalab.registry.core'#
__repr__()#

Return repr(self).

__weakref__#

list of weak references to the object (if defined)

apps: dict#
categories: dict#
validate(schemas: aiidalab.registry.core.AppRegistrySchemas)[source]#

Validate the registry data against the provided registry schemas.

class aiidalab.registry.core.AppRegistrySchemas(app: dict, apps: dict, apps_index: dict, categories: dict, environment: dict, metadata: dict)[source]#

Bases: object

The app registry JSON-schema objects.

__annotations__ = {'app': <class 'dict'>, 'apps': <class 'dict'>, 'apps_index': <class 'dict'>, 'categories': <class 'dict'>, 'environment': <class 'dict'>, 'metadata': <class 'dict'>}#
__dataclass_fields__ = {'app': Field(name='app',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps_index': Field(name='apps_index',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'environment': Field(name='environment',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'metadata': Field(name='metadata',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}#
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)#
__dict__ = mappingproxy({'__module__': 'aiidalab.registry.core', '__annotations__': {'app': <class 'dict'>, 'apps': <class 'dict'>, 'apps_index': <class 'dict'>, 'categories': <class 'dict'>, 'environment': <class 'dict'>, 'metadata': <class 'dict'>}, '__doc__': 'The app registry JSON-schema objects.', 'from_path': <classmethod(<function AppRegistrySchemas.from_path>)>, 'from_package': <classmethod(<function AppRegistrySchemas.from_package>)>, '__dict__': <attribute '__dict__' of 'AppRegistrySchemas' objects>, '__weakref__': <attribute '__weakref__' of 'AppRegistrySchemas' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False), '__dataclass_fields__': {'app': Field(name='app',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps_index': Field(name='apps_index',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'environment': Field(name='environment',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'metadata': Field(name='metadata',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}, '__init__': <function AppRegistrySchemas.__init__>, '__repr__': <function AppRegistrySchemas.__repr__>, '__eq__': <function AppRegistrySchemas.__eq__>, '__hash__': None, '__match_args__': ('app', 'apps', 'apps_index', 'categories', 'environment', 'metadata')})#
__eq__(other)#

Return self==value.

__hash__ = None#
__init__(app: dict, apps: dict, apps_index: dict, categories: dict, environment: dict, metadata: dict) None#
__match_args__ = ('app', 'apps', 'apps_index', 'categories', 'environment', 'metadata')#
__module__ = 'aiidalab.registry.core'#
__repr__()#

Return repr(self).

__weakref__#

list of weak references to the object (if defined)

app: dict#
apps: dict#
apps_index: dict#
categories: dict#
environment: dict#
classmethod from_package()[source]#
classmethod from_path(path)[source]#
metadata: dict#

aiidalab.registry.html module#

Generate the app registry website HTML pages.

aiidalab.registry.html.build_html(base_path, apps_index, apps_data, templates_path)[source]#

Generate the app registry website at the base_path path.

aiidalab.registry.releases module#

class aiidalab.registry.releases.Release(environment: aiidalab.environment.Environment, metadata: aiidalab.metadata.Metadata, url: str)[source]#

Bases: object

__annotations__ = {'environment': <class 'aiidalab.environment.Environment'>, 'metadata': <class 'aiidalab.metadata.Metadata'>, 'url': <class 'str'>}#
__dataclass_fields__ = {'environment': Field(name='environment',type=<class 'aiidalab.environment.Environment'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'metadata': Field(name='metadata',type=<class 'aiidalab.metadata.Metadata'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'url': Field(name='url',type=<class 'str'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}#
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)#
__dict__ = mappingproxy({'__module__': 'aiidalab.registry.releases', '__annotations__': {'environment': <class 'aiidalab.environment.Environment'>, 'metadata': <class 'aiidalab.metadata.Metadata'>, 'url': <class 'str'>}, '__dict__': <attribute '__dict__' of 'Release' objects>, '__weakref__': <attribute '__weakref__' of 'Release' objects>, '__doc__': 'Release(environment: aiidalab.environment.Environment, metadata: aiidalab.metadata.Metadata, url: str)', '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False), '__dataclass_fields__': {'environment': Field(name='environment',type=<class 'aiidalab.environment.Environment'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'metadata': Field(name='metadata',type=<class 'aiidalab.metadata.Metadata'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'url': Field(name='url',type=<class 'str'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}, '__init__': <function Release.__init__>, '__repr__': <function Release.__repr__>, '__eq__': <function Release.__eq__>, '__hash__': None, '__match_args__': ('environment', 'metadata', 'url')})#
__eq__(other)#

Return self==value.

__hash__ = None#
__init__(environment: aiidalab.environment.Environment, metadata: aiidalab.metadata.Metadata, url: str) None#
__match_args__ = ('environment', 'metadata', 'url')#
__module__ = 'aiidalab.registry.releases'#
__repr__()#

Return repr(self).

__weakref__#

list of weak references to the object (if defined)

environment: aiidalab.environment.Environment#
metadata: aiidalab.metadata.Metadata#
url: str#
aiidalab.registry.releases._gather_releases(release_specs, scan_app_repository, app_metadata)[source]#
aiidalab.registry.releases._get_release_commits(repo: aiidalab.git_util.GitRepo, release_line: str)[source]#

Get the commits for a release line.

Parameters
  • repo – Git repository object.

  • release_line – support standard git revision selection syntax to further reduce the selected commits on a release line. For example, @main:v1.0.0.. means “select all tagged commits on the main branch after commit tagged with v1.0.0”.

aiidalab.registry.releases._get_tags(repo: aiidalab.git_util.GitRepo, branch: str, rev_selection: str)[source]#

Get all tags for given revision selection of a branch.

Parameters
aiidalab.registry.releases._split_release_line(url)[source]#
aiidalab.registry.releases.gather_releases(app_data, scan_app_repository)[source]#

aiidalab.registry.template_filters module#

Custom filters for the Jinja2 template engine.

aiidalab.registry.template_filters.sort_semantic(versions, pre=False)[source]#

aiidalab.registry.util module#

Utility functions for the application registry.

aiidalab.registry.util.get_hosted_on(url)[source]#
aiidalab.registry.util.get_html_app_fname(app_name)[source]#
aiidalab.registry.util.load_json(path: pathlib.Path) dict[source]#

aiidalab.registry.web module#

Generate the app registry website.

aiidalab.registry.web._walk_pkg_resources(package, root)[source]#
aiidalab.registry.web.build(apps_path: pathlib.Path, categories_path: pathlib.Path, base_path: pathlib.Path, html_path: Optional[pathlib.Path] = None, api_path: Optional[pathlib.Path] = None, static_path: Optional[pathlib.Path] = None, templates_path: Optional[pathlib.Path] = None, validate_output: bool = True, validate_input: bool = False)[source]#

Build the app registry website (including schema files).

aiidalab.registry.web.copy_static_tree_from_package(html_path, root='static')[source]#
aiidalab.registry.web.copy_static_tree_from_path(base_path, static_path)[source]#

aiidalab.registry.yaml module#

aiidalab.registry.yaml.load(path)[source]#

Deserialize YAML file at path to a Python object and dereference all references.

aiidalab.registry.yaml.loads(s)[source]#

Deserialize serialized YAML file ‘s’ to a Python object and dereference all references.

aiidalab.registry.yaml.replace_refs(obj)[source]#

Dereference all references in obj.

References may point to JSON or YAML files.

Module contents#

Manage a registry of applications.

class aiidalab.registry.AppRegistryData(apps: dict, categories: dict)[source]#

Bases: object

The app registry data objects (apps and categories).

__annotations__ = {'apps': <class 'dict'>, 'categories': <class 'dict'>}#
__dataclass_fields__ = {'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}#
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)#
__dict__ = mappingproxy({'__module__': 'aiidalab.registry.core', '__annotations__': {'apps': <class 'dict'>, 'categories': <class 'dict'>}, '__doc__': 'The app registry data objects (apps and categories).', 'validate': <function AppRegistryData.validate>, '__dict__': <attribute '__dict__' of 'AppRegistryData' objects>, '__weakref__': <attribute '__weakref__' of 'AppRegistryData' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False), '__dataclass_fields__': {'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}, '__init__': <function AppRegistryData.__init__>, '__repr__': <function AppRegistryData.__repr__>, '__eq__': <function AppRegistryData.__eq__>, '__hash__': None, '__match_args__': ('apps', 'categories')})#
__eq__(other)#

Return self==value.

__hash__ = None#
__init__(apps: dict, categories: dict) None#
__match_args__ = ('apps', 'categories')#
__module__ = 'aiidalab.registry.core'#
__repr__()#

Return repr(self).

__weakref__#

list of weak references to the object (if defined)

apps: dict#
categories: dict#
validate(schemas: aiidalab.registry.core.AppRegistrySchemas)[source]#

Validate the registry data against the provided registry schemas.

class aiidalab.registry.AppRegistrySchemas(app: dict, apps: dict, apps_index: dict, categories: dict, environment: dict, metadata: dict)[source]#

Bases: object

The app registry JSON-schema objects.

__annotations__ = {'app': <class 'dict'>, 'apps': <class 'dict'>, 'apps_index': <class 'dict'>, 'categories': <class 'dict'>, 'environment': <class 'dict'>, 'metadata': <class 'dict'>}#
__dataclass_fields__ = {'app': Field(name='app',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps_index': Field(name='apps_index',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'environment': Field(name='environment',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'metadata': Field(name='metadata',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}#
__dataclass_params__ = _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False)#
__dict__ = mappingproxy({'__module__': 'aiidalab.registry.core', '__annotations__': {'app': <class 'dict'>, 'apps': <class 'dict'>, 'apps_index': <class 'dict'>, 'categories': <class 'dict'>, 'environment': <class 'dict'>, 'metadata': <class 'dict'>}, '__doc__': 'The app registry JSON-schema objects.', 'from_path': <classmethod(<function AppRegistrySchemas.from_path>)>, 'from_package': <classmethod(<function AppRegistrySchemas.from_package>)>, '__dict__': <attribute '__dict__' of 'AppRegistrySchemas' objects>, '__weakref__': <attribute '__weakref__' of 'AppRegistrySchemas' objects>, '__dataclass_params__': _DataclassParams(init=True,repr=True,eq=True,order=False,unsafe_hash=False,frozen=False), '__dataclass_fields__': {'app': Field(name='app',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps': Field(name='apps',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'apps_index': Field(name='apps_index',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'categories': Field(name='categories',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'environment': Field(name='environment',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD), 'metadata': Field(name='metadata',type=<class 'dict'>,default=<dataclasses._MISSING_TYPE object>,default_factory=<dataclasses._MISSING_TYPE object>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=False,_field_type=_FIELD)}, '__init__': <function AppRegistrySchemas.__init__>, '__repr__': <function AppRegistrySchemas.__repr__>, '__eq__': <function AppRegistrySchemas.__eq__>, '__hash__': None, '__match_args__': ('app', 'apps', 'apps_index', 'categories', 'environment', 'metadata')})#
__eq__(other)#

Return self==value.

__hash__ = None#
__init__(app: dict, apps: dict, apps_index: dict, categories: dict, environment: dict, metadata: dict) None#
__match_args__ = ('app', 'apps', 'apps_index', 'categories', 'environment', 'metadata')#
__module__ = 'aiidalab.registry.core'#
__repr__()#

Return repr(self).

__weakref__#

list of weak references to the object (if defined)

app: dict#
apps: dict#
apps_index: dict#
categories: dict#
environment: dict#
classmethod from_package()[source]#
classmethod from_path(path)[source]#
metadata: dict#
aiidalab.registry.build(apps_path: pathlib.Path, categories_path: pathlib.Path, base_path: pathlib.Path, html_path: Optional[pathlib.Path] = None, api_path: Optional[pathlib.Path] = None, static_path: Optional[pathlib.Path] = None, templates_path: Optional[pathlib.Path] = None, validate_output: bool = True, validate_input: bool = False)[source]#

Build the app registry website (including schema files).

aiidalab.registry.build_html(base_path, apps_index, apps_data, templates_path)[source]#

Generate the app registry website at the base_path path.