semvec/pypi-packages huggingface dataset:
meland 0.1.0
Meland is a simple AI IM router and chat agent as your work partner for multiple integrations such as Telegram, Slack, Discord, Teams, Gmail, RSS, etc.
Requires Python: >=3.11

## Meland

Meland is a simple AI IM router and chat agent as your work partner for multiple integrations such as Telegram, Slack, Discord, Teams, Gmail, RSS, etc.

## Developing

- Install [uv](https://docs.astral.sh/uv/) 0.9+

### Install

```shell
uv python ping 3.12
uv sync
uv pip install -e .
```

### Format

```shell
uv format
```

### Lint

```shell
uv run ruff check
```

### Test

```shell
uv run pytest -s -v
```

### Run the API Server

```shell
uv run -m meland.api.server
```
oarepo-doi 3.0.2
"Oarepo12 DOI module with requests."

# OARepo DOI

### Configuration example

```
DATACITE_URL = 'https://api.test.datacite.org/dois'

DATACITE_MODE = "AUTOMATIC_DRAFT"

DATACITE_CREDENTIALS = {"generic": {"prefix": "10.23644" , "password": "yyyy", "username": "xxx"}}

DATACITE_CREDENTIALS_DEFAULT = {"prefix": "10.23644" , "password": "yyy", "username": "xxxx"}

DATACITE_SPECIFIED_ID = True
```

mode types:
  - `AUTOMATIC_DRAFT` - dois will be assigned automatically when draft is creadet
  - `AUTOMATIC` - dois will be assigned automatically after publish 
  - `ON_EVENT` - dois are assigned after request

DATACITE_SPECIFIED_ID
  - Default value - False
  - If true, the doi suffix will be the same as record pid
    
### Providers
The DOI request is made through providers. To implement a new provider, you need to create a custom class that inherits from the `OarepoDataCitePIDProvider` from the `oarepo_doi.services.provider` module. This custom provider class should include your own metadata mapping.

Example of custom provider implementation:
```python
from oarepo_doi.services.provider import OarepoDataCitePIDProvider

class NRDocsDataCitePIDProvider(OarepoDataCitePIDProvider):

    def metadata_check(self, record):
        
        data = record["metadata"]
        if "title" not in data:
            record.append("Title is mandatory")
        
        return record

    def create_datacite_payload(self, data):
        titles = {"title": "xy"}

        
        payload = {
            "data": {
                "type": "dois",
                "attributes": {
                }
            }
        }
        payload["data"]["attributes"]["titles"] = titles
   
        return payload
    
```
Next, the provider must be added to the Invenio configuration (invenio.cfg). For DOI client communication, the `DataCiteClient` from `invenio_rdm_records.services.pids.providers` is used.

Example of the configuration:
```
RDM_PERSISTENT_IDENTIFIER_PROVIDERS = [
    # DataCite Concept DOI provider
    NRDocsDataCitePIDProvider(
        "datacite",
        client=DataCiteClient("datacite", config_prefix="DATACITE"),
        label=_("DOI"),
    ),
]
RDM_PERSISTENT_IDENTIFIERS = {
    "doi": {
        "providers": ["datacite"],
        "label": _("DOI"),
        "is_enabled": NRDocsDataCitePIDProvider.is_enabled,
    },
    }
RDM_PARENT_PERSISTENT_IDENTIFIER_PROVIDERS = [
    # DataCite Concept DOI provider
    NRDocsDataCitePIDProvider(
        "datacite",
        client=DataCiteClient("datacite", config_prefix="DATACITE"),
        label=_("DOI"),
    ),
]

RDM_PARENT_PERSISTENT_IDENTIFIERS = {
    "doi": {
        "providers": ["datacite"],
        "label": _("DOI"),
        "is_enabled": NRDocsDataCitePIDProvider.is_enabled,
    },
}
```