Name | hijiki JSON |
Version |
2.0.85
JSON |
| download |
home_page | None |
Summary | Python Rabbit wrapper library to simplify to use Exchanges and Queues with decorators |
upload_time | 2025-08-22 13:51:18 |
maintainer | None |
docs_url | None |
author | Leandro Vilson Battisti |
requires_python | None |
license | None |
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"
}