hijiki


Namehijiki JSON
Version 2.0.85 PyPI version JSON
download
home_pageNone
SummaryPython Rabbit wrapper library to simplify to use Exchanges and Queues with decorators
upload_time2025-08-22 13:51:18
maintainerNone
docs_urlNone
authorLeandro Vilson Battisti
requires_pythonNone
licenseNone
keywords rabbitmq decorator
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # HIJIKI - Gerenciamento de Mensagens com RabbitMQ

## 📚 Sobre a biblioteca HIJIKI

### Versão 2

Este documento descreve a biblioteca **HIJIKI** versão 2, que é uma evolução da versão 1, mantendo compatibilidade com o código existente. A versão 2 introduz melhorias significativas na estrutura e funcionalidade, mas não altera a API pública, garantindo que os usuários possam migrar facilmente sem necessidade de ajustes no código já implementado.
para acesso a versão 1, consulte a documentação da [versão 1](README_v1.md) e para fontes a tag v1_latest

HIJIKI é uma biblioteca Python de alto nível para gerenciamento de mensagens orientada a eventos, destinada a facilitar a criação, configuração e uso de consumidores e produtores de mensagens, principalmente utilizando **RabbitMQ** como broker. Seu objetivo é abstrair detalhes de implementação de fila e troca de mensagens, oferecendo uma interface intuitiva, flexível e adequada tanto para aplicações web quanto scripts standalone.

**Principais Características:**

- **Builder pattern** para configuração (`MessageManagerBuilder`), facilitando setup e customizações complexas.
- **Gerenciamento simplificado de consumidores**: registre consumidores (filas, tópicos e handlers) rapidamente usando uma API intuitiva.
- **Publicação fácil de mensagens**: uso direto de métodos para publicar em tópicos/fila, com suporte a mapeamento customizado de payloads.
- **Suporte a múltiplos brokers**: arquitetura pronta para suporte a outros brokers, embora os exemplos estejam focados em RabbitMQ.
- **Extensível**: pode ser integrada a decorators e middlewares para aplicações async/web como FastAPI ou scripts tradicionais.
- **Métodos utilitários** para manutenção do ciclo de vida do consumo, verificação de saúde (`is_alive`), troca dinâmica do broker, e registro em execução.

**Principais Classes:**

- `MessageManagerBuilder`: Classe principal para construir e configurar a stack.
- `MessageManager`: Gerencia operações de envio e consumo de mensagens.
- `ConsumerData`: Estrutura que associa uma fila, tópico e função handler.

---

## 📦 Instalação

Clone este repositório e instale as dependências:

```shell
git clone https://github.com/asengardeon/hijiki.git
cd hijiki
pipenv  install
```

## ⚙️ Detalhamento técnico dos métodos de uso

A seguir, um resumo técnico dos principais métodos empregados para utilizar a biblioteca HIJIKI na prática:

## 1. Criação e configuração do Manager

A configuração é feita via padrão builder, permitindo customização das conexões e parâmetros:

```python
manager = (
    MessageManagerBuilder()
    .with_host("localhost")
    .with_port(5672)
    .with_user("user")
    .with_password("pwd")
    # outras opções, como troca do broker, etc.
    .build()
)
```

- **with_host(host: str)**: define o endereço do broker RabbitMQ.
- **with_port(port: int)**: configura a porta de conexão.
- **with_user(user: str), with_password(password: str)**: definem credenciais.
- **with_cluster_hosts(cluster_hosts: str)**: define o endereço caso você precise se conectar a uma instância de múltiplos clusters.
- **with_virtual_host(virtual_host: str)**: define a qual virtual host de uma instância a conexão é feita
- **with_secure_protocol(use_secure_protocol: bool)**: define o uso ou não do protocolo `amqps` em vez do `amqp`, que é usado por padrão
- **build()**: instancia e retorna o manager, pronto para uso.

## 2. Registro de consumidores

### Criando consumidor manualmente

É preciso criar uma instância de `ConsumerData` associando uma fila, tópico e função de processamento.

Além dessas informações obrigatórias, o `ConsumerData` permite a customização de outros tipos de parâmetros. Por exemplo, caso você precise consumir filas e exchanges de uma instância que não esteja utilizando os parâmetros padrões usados por esta lib, como os tipos das filas e exchanges, é possível passar os tipos por meio dos parâmetros `queue_type` e `exchange_type` durante a instanciação da `ConsumerData`.

O método **create_consumer** adiciona consumidores ao manager:

```python
def process_message(msg):
    print(f"Mensagem recebida: {msg}")

consumer_data = ConsumerData("nome_da_fila", "nome_do_topico", process_message)
manager.create_consumer(consumer_data)
```

- O handler (função) será chamada a cada mensagem recebida nessa fila/tópico.

##Criando consumidor com decorator
Você também pode usar o decorator `@consumer_handler` para registrar consumidores de forma mais simples:

### Modelo apenas determinando a fila

```python
@consumer_handler(queue_name="teste1")
    def internal_consumer(data):
        print(f"consumiu o valor:{data}")
        result_data_list.append(data)
        result_event_list.append('received event')
```

### Modelo determinando fila e que não cria fila DLQ automaticamente, aconselhado para consumidores dde filas DLQ

```python
    @consumer_handler(queue_name="teste1_dlq", create_dlq=False)
    def internal_consumer_dlq(data):
        print(f"consumiu o valor:{data}")
        result_event_list_dlq.append('received event')
```

### Modelo determinando fila e tópico

```python
    @consumer_handler(queue_name="fila_erro", topic="erro_event")
    def internal_consumer_erro(data):
        print(f"consumiu o valor:{data}")
        result_event_list.append('received event')
        raise Exception("falhou")
```

### Modelos com uso de routing_key

```python
    @consumer_handler(queue_name="teste_with_specific_routing_key", topic='teste1_event',
                      routing_key="specific_routing_key")
    def internal_consumer(data):
        print(f"consumiu o valor:{data}")
        result_data_list.append(data)
        result_data_list_dlq_for_specific_routing_key.append('received event')
```

## 3. Início do consumo

O método **start_consuming** inicia loops de consumo das filas para todos consumidores registrados:

```python
manager.start_consuming()
```

- No FastAPI, recomenda-se executar em thread separada para não bloquear o servidor.

## 4. Publicação de mensagens

O método **publish** envia mensagens diretamente para a fila/ tópico definido:

```python
manager.publish("nome_da_fila", "Conteúdo da mensagem")
```

Por padrão, a publicação das mensagens é feita seguindo o formato `{ "value": <conteúdo da mensagem> }`, para filas do tipo `topic`, sem `routing_key` e parâmetro `reply_to`. Todos estes podem ser customizados se seu caso de uso não se adequar a isso:

```python
def custom_message_mapper(_topic: str, data: str):
  return { "id": uuid(), "data": data }

manager.publish(
  "nome_da_fila",
  "Conteúdo da mensagem",
  message_mapper=custom_message_mapper
  routing_key="my_routing_key",
  reply_to="my_response_queue_name"
)
```

- Mensagens podem ser publicadas a partir de endpoints FastAPI ou scripts Python, conforme exemplo.

---

## 📦 Pré-requisitos

- **RabbitMQ** rodando na máquina local (`localhost:5672`) ou disponível remotamente.
- Dependências Python instaladas:
  - `pipenv install` (na raiz do projeto)
  - Bibliotecas necessárias: `pika`, `fastapi`, `uvicorn`, entre outras já incluídas no `Pipfile` do projeto.

---

## Estrutura dos Exemplos

- [`fastapi_example.py`](./fastapi_example.py)  
  Demonstra como criar endpoints FastAPI para publicar mensagens e inicializar consumidores utilizando HIJIKI.

- [`pure_python_example.py`](./pure_python_example.py)  
  Demonstra como publicar e consumir mensagens programaticamente, usando apenas Python puro, sem framework web.

---

## ▶️ Como executar os exemplos

### 1. Exemplo FastAPI

#### **Passo a passo**

1. **Suba o RabbitMQ** em sua máquina local (padrão: usuário `user`, senha `pwd`, porta `5672`)  
   Se usar outro usuário/senha/host, edite o exemplo conforme necessário.

2. **Execute o servidor FastAPI**:
   ```sh
   uvicorn examples.fastapi_example:app --reload
   ```
3. **Interaja com a API**:
   - Publique uma mensagem:
     ```sh
     curl -X POST "http://localhost:8000/publish/fastapi_queue" -H  "accept: application/json" -d "message=Olá do FastAPI"
     ```
   - Veja os consumidores recebendo mensagens no terminal onde o servidor está rodando (mensagens são exibidas via print).

#### **Observações**

- O consumidor é registrado e inicializado automaticamente ao subir o FastAPI.
- O consumo roda em uma thread em paralelo ao servidor web.

---

### 2. Exemplo Python Puro

#### **Passo a passo**

1. **Suba o RabbitMQ** em sua máquina local (`localhost:5672`).

2. **Execute o script**:

   ```sh
   python examples/pure_python_example.py
   ```

3. **Verifique a saída**:
   - O script publica uma mensagem inicial, registra o consumidor e começa a consumir mensagens da fila `python_queue`.
   - O consumidor imprime no console todas as mensagens recebidas.

#### **Observações**

- Use `Ctrl+C` para interromper o consumo.

---

## 💡 Dicas e Customizações

- Para consumir de outras filas ou alterar tópicos, edite os nomes nos exemplos.
- Você pode registrar múltiplos consumidores, basta criar mais instâncias de `ConsumerData` e passar para `manager.create_consumer()`.
- Troque usuário, senha ou porta caso sua instância RabbitMQ seja diferente.

---

## 🛠️ Sobre a arquitetura utilizada

- Os consumidores são instâncias de `ConsumerData`, que associam fila, tópico e função de processamento.
- O método `manager.start_consuming()` inicia o consumo registrado para as filas configuradas.
- O exemplo FastAPI utiliza um thread para que o consumo de mensagens ocorra junto do serviço web.

---

## ❓ Dúvidas ou Sugestões?

Abra uma issue no repositório principal do projeto, ou envie sugestões/contribuições!

---

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "hijiki",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "RabbitMQ, decorator",
    "author": "Leandro Vilson Battisti",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/d3/73/7286390d578e8da43ca5bf3f527bba7a141b9f045311358004e9055a1f33/hijiki-2.0.85.tar.gz",
    "platform": null,
    "description": "# HIJIKI - Gerenciamento de Mensagens com RabbitMQ\n\n## \ud83d\udcda Sobre a biblioteca HIJIKI\n\n### Vers\u00e3o 2\n\nEste documento descreve a biblioteca **HIJIKI** vers\u00e3o 2, que \u00e9 uma evolu\u00e7\u00e3o da vers\u00e3o 1, mantendo compatibilidade com o c\u00f3digo existente. A vers\u00e3o 2 introduz melhorias significativas na estrutura e funcionalidade, mas n\u00e3o altera a API p\u00fablica, garantindo que os usu\u00e1rios possam migrar facilmente sem necessidade de ajustes no c\u00f3digo j\u00e1 implementado.\npara acesso a vers\u00e3o 1, consulte a documenta\u00e7\u00e3o da [vers\u00e3o 1](README_v1.md) e para fontes a tag v1_latest\n\nHIJIKI \u00e9 uma biblioteca Python de alto n\u00edvel para gerenciamento de mensagens orientada a eventos, destinada a facilitar a cria\u00e7\u00e3o, configura\u00e7\u00e3o e uso de consumidores e produtores de mensagens, principalmente utilizando **RabbitMQ** como broker. Seu objetivo \u00e9 abstrair detalhes de implementa\u00e7\u00e3o de fila e troca de mensagens, oferecendo uma interface intuitiva, flex\u00edvel e adequada tanto para aplica\u00e7\u00f5es web quanto scripts standalone.\n\n**Principais Caracter\u00edsticas:**\n\n- **Builder pattern** para configura\u00e7\u00e3o (`MessageManagerBuilder`), facilitando setup e customiza\u00e7\u00f5es complexas.\n- **Gerenciamento simplificado de consumidores**: registre consumidores (filas, t\u00f3picos e handlers) rapidamente usando uma API intuitiva.\n- **Publica\u00e7\u00e3o f\u00e1cil de mensagens**: uso direto de m\u00e9todos para publicar em t\u00f3picos/fila, com suporte a mapeamento customizado de payloads.\n- **Suporte a m\u00faltiplos brokers**: arquitetura pronta para suporte a outros brokers, embora os exemplos estejam focados em RabbitMQ.\n- **Extens\u00edvel**: pode ser integrada a decorators e middlewares para aplica\u00e7\u00f5es async/web como FastAPI ou scripts tradicionais.\n- **M\u00e9todos utilit\u00e1rios** para manuten\u00e7\u00e3o do ciclo de vida do consumo, verifica\u00e7\u00e3o de sa\u00fade (`is_alive`), troca din\u00e2mica do broker, e registro em execu\u00e7\u00e3o.\n\n**Principais Classes:**\n\n- `MessageManagerBuilder`: Classe principal para construir e configurar a stack.\n- `MessageManager`: Gerencia opera\u00e7\u00f5es de envio e consumo de mensagens.\n- `ConsumerData`: Estrutura que associa uma fila, t\u00f3pico e fun\u00e7\u00e3o handler.\n\n---\n\n## \ud83d\udce6 Instala\u00e7\u00e3o\n\nClone este reposit\u00f3rio e instale as depend\u00eancias:\n\n```shell\ngit clone https://github.com/asengardeon/hijiki.git\ncd hijiki\npipenv  install\n```\n\n## \u2699\ufe0f Detalhamento t\u00e9cnico dos m\u00e9todos de uso\n\nA seguir, um resumo t\u00e9cnico dos principais m\u00e9todos empregados para utilizar a biblioteca HIJIKI na pr\u00e1tica:\n\n## 1. Cria\u00e7\u00e3o e configura\u00e7\u00e3o do Manager\n\nA configura\u00e7\u00e3o \u00e9 feita via padr\u00e3o builder, permitindo customiza\u00e7\u00e3o das conex\u00f5es e par\u00e2metros:\n\n```python\nmanager = (\n    MessageManagerBuilder()\n    .with_host(\"localhost\")\n    .with_port(5672)\n    .with_user(\"user\")\n    .with_password(\"pwd\")\n    # outras op\u00e7\u00f5es, como troca do broker, etc.\n    .build()\n)\n```\n\n- **with_host(host: str)**: define o endere\u00e7o do broker RabbitMQ.\n- **with_port(port: int)**: configura a porta de conex\u00e3o.\n- **with_user(user: str), with_password(password: str)**: definem credenciais.\n- **with_cluster_hosts(cluster_hosts: str)**: define o endere\u00e7o caso voc\u00ea precise se conectar a uma inst\u00e2ncia de m\u00faltiplos clusters.\n- **with_virtual_host(virtual_host: str)**: define a qual virtual host de uma inst\u00e2ncia a conex\u00e3o \u00e9 feita\n- **with_secure_protocol(use_secure_protocol: bool)**: define o uso ou n\u00e3o do protocolo `amqps` em vez do `amqp`, que \u00e9 usado por padr\u00e3o\n- **build()**: instancia e retorna o manager, pronto para uso.\n\n## 2. Registro de consumidores\n\n### Criando consumidor manualmente\n\n\u00c9 preciso criar uma inst\u00e2ncia de `ConsumerData` associando uma fila, t\u00f3pico e fun\u00e7\u00e3o de processamento.\n\nAl\u00e9m dessas informa\u00e7\u00f5es obrigat\u00f3rias, o `ConsumerData` permite a customiza\u00e7\u00e3o de outros tipos de par\u00e2metros. Por exemplo, caso voc\u00ea precise consumir filas e exchanges de uma inst\u00e2ncia que n\u00e3o esteja utilizando os par\u00e2metros padr\u00f5es usados por esta lib, como os tipos das filas e exchanges, \u00e9 poss\u00edvel passar os tipos por meio dos par\u00e2metros `queue_type` e `exchange_type` durante a instancia\u00e7\u00e3o da `ConsumerData`.\n\nO m\u00e9todo **create_consumer** adiciona consumidores ao manager:\n\n```python\ndef process_message(msg):\n    print(f\"Mensagem recebida: {msg}\")\n\nconsumer_data = ConsumerData(\"nome_da_fila\", \"nome_do_topico\", process_message)\nmanager.create_consumer(consumer_data)\n```\n\n- O handler (fun\u00e7\u00e3o) ser\u00e1 chamada a cada mensagem recebida nessa fila/t\u00f3pico.\n\n##Criando consumidor com decorator\nVoc\u00ea tamb\u00e9m pode usar o decorator `@consumer_handler` para registrar consumidores de forma mais simples:\n\n### Modelo apenas determinando a fila\n\n```python\n@consumer_handler(queue_name=\"teste1\")\n    def internal_consumer(data):\n        print(f\"consumiu o valor:{data}\")\n        result_data_list.append(data)\n        result_event_list.append('received event')\n```\n\n### Modelo determinando fila e que n\u00e3o cria fila DLQ automaticamente, aconselhado para consumidores dde filas DLQ\n\n```python\n    @consumer_handler(queue_name=\"teste1_dlq\", create_dlq=False)\n    def internal_consumer_dlq(data):\n        print(f\"consumiu o valor:{data}\")\n        result_event_list_dlq.append('received event')\n```\n\n### Modelo determinando fila e t\u00f3pico\n\n```python\n    @consumer_handler(queue_name=\"fila_erro\", topic=\"erro_event\")\n    def internal_consumer_erro(data):\n        print(f\"consumiu o valor:{data}\")\n        result_event_list.append('received event')\n        raise Exception(\"falhou\")\n```\n\n### Modelos com uso de routing_key\n\n```python\n    @consumer_handler(queue_name=\"teste_with_specific_routing_key\", topic='teste1_event',\n                      routing_key=\"specific_routing_key\")\n    def internal_consumer(data):\n        print(f\"consumiu o valor:{data}\")\n        result_data_list.append(data)\n        result_data_list_dlq_for_specific_routing_key.append('received event')\n```\n\n## 3. In\u00edcio do consumo\n\nO m\u00e9todo **start_consuming** inicia loops de consumo das filas para todos consumidores registrados:\n\n```python\nmanager.start_consuming()\n```\n\n- No FastAPI, recomenda-se executar em thread separada para n\u00e3o bloquear o servidor.\n\n## 4. Publica\u00e7\u00e3o de mensagens\n\nO m\u00e9todo **publish** envia mensagens diretamente para a fila/ t\u00f3pico definido:\n\n```python\nmanager.publish(\"nome_da_fila\", \"Conte\u00fado da mensagem\")\n```\n\nPor padr\u00e3o, a publica\u00e7\u00e3o das mensagens \u00e9 feita seguindo o formato `{ \"value\": <conte\u00fado da mensagem> }`, para filas do tipo `topic`, sem `routing_key` e par\u00e2metro `reply_to`. Todos estes podem ser customizados se seu caso de uso n\u00e3o se adequar a isso:\n\n```python\ndef custom_message_mapper(_topic: str, data: str):\n  return { \"id\": uuid(), \"data\": data }\n\nmanager.publish(\n  \"nome_da_fila\",\n  \"Conte\u00fado da mensagem\",\n  message_mapper=custom_message_mapper\n  routing_key=\"my_routing_key\",\n  reply_to=\"my_response_queue_name\"\n)\n```\n\n- Mensagens podem ser publicadas a partir de endpoints FastAPI ou scripts Python, conforme exemplo.\n\n---\n\n## \ud83d\udce6 Pr\u00e9-requisitos\n\n- **RabbitMQ** rodando na m\u00e1quina local (`localhost:5672`) ou dispon\u00edvel remotamente.\n- Depend\u00eancias Python instaladas:\n  - `pipenv install` (na raiz do projeto)\n  - Bibliotecas necess\u00e1rias: `pika`, `fastapi`, `uvicorn`, entre outras j\u00e1 inclu\u00eddas no `Pipfile` do projeto.\n\n---\n\n## Estrutura dos Exemplos\n\n- [`fastapi_example.py`](./fastapi_example.py)  \n  Demonstra como criar endpoints FastAPI para publicar mensagens e inicializar consumidores utilizando HIJIKI.\n\n- [`pure_python_example.py`](./pure_python_example.py)  \n  Demonstra como publicar e consumir mensagens programaticamente, usando apenas Python puro, sem framework web.\n\n---\n\n## \u25b6\ufe0f Como executar os exemplos\n\n### 1. Exemplo FastAPI\n\n#### **Passo a passo**\n\n1. **Suba o RabbitMQ** em sua m\u00e1quina local (padr\u00e3o: usu\u00e1rio `user`, senha `pwd`, porta `5672`)  \n   Se usar outro usu\u00e1rio/senha/host, edite o exemplo conforme necess\u00e1rio.\n\n2. **Execute o servidor FastAPI**:\n   ```sh\n   uvicorn examples.fastapi_example:app --reload\n   ```\n3. **Interaja com a API**:\n   - Publique uma mensagem:\n     ```sh\n     curl -X POST \"http://localhost:8000/publish/fastapi_queue\" -H  \"accept: application/json\" -d \"message=Ol\u00e1 do FastAPI\"\n     ```\n   - Veja os consumidores recebendo mensagens no terminal onde o servidor est\u00e1 rodando (mensagens s\u00e3o exibidas via print).\n\n#### **Observa\u00e7\u00f5es**\n\n- O consumidor \u00e9 registrado e inicializado automaticamente ao subir o FastAPI.\n- O consumo roda em uma thread em paralelo ao servidor web.\n\n---\n\n### 2. Exemplo Python Puro\n\n#### **Passo a passo**\n\n1. **Suba o RabbitMQ** em sua m\u00e1quina local (`localhost:5672`).\n\n2. **Execute o script**:\n\n   ```sh\n   python examples/pure_python_example.py\n   ```\n\n3. **Verifique a sa\u00edda**:\n   - O script publica uma mensagem inicial, registra o consumidor e come\u00e7a a consumir mensagens da fila `python_queue`.\n   - O consumidor imprime no console todas as mensagens recebidas.\n\n#### **Observa\u00e7\u00f5es**\n\n- Use `Ctrl+C` para interromper o consumo.\n\n---\n\n## \ud83d\udca1 Dicas e Customiza\u00e7\u00f5es\n\n- Para consumir de outras filas ou alterar t\u00f3picos, edite os nomes nos exemplos.\n- Voc\u00ea pode registrar m\u00faltiplos consumidores, basta criar mais inst\u00e2ncias de `ConsumerData` e passar para `manager.create_consumer()`.\n- Troque usu\u00e1rio, senha ou porta caso sua inst\u00e2ncia RabbitMQ seja diferente.\n\n---\n\n## \ud83d\udee0\ufe0f Sobre a arquitetura utilizada\n\n- Os consumidores s\u00e3o inst\u00e2ncias de `ConsumerData`, que associam fila, t\u00f3pico e fun\u00e7\u00e3o de processamento.\n- O m\u00e9todo `manager.start_consuming()` inicia o consumo registrado para as filas configuradas.\n- O exemplo FastAPI utiliza um thread para que o consumo de mensagens ocorra junto do servi\u00e7o web.\n\n---\n\n## \u2753 D\u00favidas ou Sugest\u00f5es?\n\nAbra uma issue no reposit\u00f3rio principal do projeto, ou envie sugest\u00f5es/contribui\u00e7\u00f5es!\n\n---\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python Rabbit wrapper library to simplify to use Exchanges and Queues with decorators",
    "version": "2.0.85",
    "project_urls": null,
    "split_keywords": [
        "rabbitmq",
        " decorator"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d606b96c85c552db20f04a770ce0354d5948d60d7527db02e9a48ab03f930214",
                "md5": "6e72e433f5ba736de8d85274ab627dee",
                "sha256": "09289a6dd8ceaa273e3326f7e0ce4580219b603f5aab4140081dfca01d65d666"
            },
            "downloads": -1,
            "filename": "hijiki-2.0.85-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6e72e433f5ba736de8d85274ab627dee",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 29647,
            "upload_time": "2025-08-22T13:51:17",
            "upload_time_iso_8601": "2025-08-22T13:51:17.328919Z",
            "url": "https://files.pythonhosted.org/packages/d6/06/b96c85c552db20f04a770ce0354d5948d60d7527db02e9a48ab03f930214/hijiki-2.0.85-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d3737286390d578e8da43ca5bf3f527bba7a141b9f045311358004e9055a1f33",
                "md5": "93f3735e772e1b0f494a377a27329750",
                "sha256": "cf9c9f2053f39646837e8552e5572bfe0c53fa7bf2d6d625a6a2c99b13b865e4"
            },
            "downloads": -1,
            "filename": "hijiki-2.0.85.tar.gz",
            "has_sig": false,
            "md5_digest": "93f3735e772e1b0f494a377a27329750",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 32308,
            "upload_time": "2025-08-22T13:51:18",
            "upload_time_iso_8601": "2025-08-22T13:51:18.123603Z",
            "url": "https://files.pythonhosted.org/packages/d3/73/7286390d578e8da43ca5bf3f527bba7a141b9f045311358004e9055a1f33/hijiki-2.0.85.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-22 13:51:18",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "hijiki"
}
        
Elapsed time: 3.79834s