# 🚀 CaspyORM
**Status: 🚀 Beta - Em Desenvolvimento Ativo**
Um ORM moderno e Pythonic para Apache Cassandra, inspirado no Pydantic e focado em produtividade, performance e suporte assĂncrono completo.
[](https://python.org)
[](LICENSE)
[](tests/)
[](coverage.xml)
[](caspyorm/)
## ✨ CaracterĂsticas Principais
### 🔄 **Suporte AssĂncrono Completo**
- **Event Loop Seguro**: Todas as operações async realmente não bloqueiam o event loop
- **API Dupla**: Suporte sĂncrono e assĂncrono para todas as operações
- **Integração FastAPI**: CompatĂvel com frameworks assĂncronos modernos
- **Performance Superior**: Melhor utilização de recursos do sistema
### 🎯 **API Intuitiva e Pythonic**
- **Definição de modelos** baseada em tipos Python
- **Consultas fluentes** com encadeamento natural
- **Validação robusta** integrada ao Pydantic
- **Sincronização automática** de schema
### ⚡ **Performance e Escalabilidade**
- **Operações em lote** otimizadas
- **Queries preparadas** para máxima performance
- **Índices automáticos** para consultas rápidas
- **Paginação eficiente** para grandes datasets
### 🛠️ **Ferramentas de Desenvolvimento**
- **Logging detalhado** para monitoramento
- **Tratamento de erros** robusto e informativo
- **Documentação completa** com exemplos práticos
## 📦 Instalação
```bash
# Em breve no PyPI
pip install caspyorm
# Desenvolvimento local
git clone https://github.com/seu-usuario/caspyorm.git
cd caspyorm
pip install -e .
```
## 🚀 Quick Start
### Configuração Básica
```python
from caspyorm import Model, fields, connection
import uuid
# Configurar conexĂŁo
connection.connect(['localhost'], keyspace='meu_keyspace')
class Usuario(Model):
__table_name__ = 'usuarios'
id = fields.UUID(primary_key=True)
nome = fields.Text(required=True)
email = fields.Text(index=True)
ativo = fields.Boolean(default=True)
tags = fields.List(fields.Text(), default=[])
# Sincronizar schema (cria tabela e Ăndices)
Usuario.sync_table()
```
### Operações SĂncronas
```python
# CRUD básico
usuario = Usuario.create(
id=uuid.uuid4(),
nome="JoĂŁo Silva",
email="joao@email.com",
tags=['python', 'developer']
)
# Buscar por ID
usuario = Usuario.get(id=usuario.id)
# Consultas com filtros
usuarios_ativos = Usuario.filter(ativo=True).all()
usuario_por_email = Usuario.filter(email="joao@email.com").first()
# Operações em lote
usuarios = [
Usuario(id=uuid.uuid4(), nome=f"Usuário {i}", email=f"user{i}@email.com")
for i in range(100)
]
Usuario.bulk_create(usuarios)
```
### Operações AssĂncronas
```python
import asyncio
# ConexĂŁo assĂncrona
await connection.connect_async(['localhost'], keyspace='meu_keyspace')
# CRUD assĂncrono
usuario = await Usuario.create_async(
id=uuid.uuid4(),
nome="Maria Silva",
email="maria@email.com"
)
# Consultas assĂncronas
usuarios = await Usuario.all().all_async()
count = await Usuario.filter(ativo=True).count_async()
# Iteração assĂncrona
async for usuario in Usuario.filter(ativo=True):
print(usuario.nome)
# Operações atômicas em coleções
await usuario.update_collection_async('tags', add=['cassandra'])
```
## 🔍 Consultas Avançadas
### Filtros Complexos
```python
# Operadores de comparação
usuarios_caros = Usuario.filter(preco__gte=100.0).all()
usuarios_especificos = Usuario.filter(id__in=[id1, id2, id3]).all()
# Filtros em coleções
posts_com_tag = Post.filter(tags__contains='python').all()
posts_sem_tags = Post.filter(tags=[]).all()
# Count e Exists otimizados
total_usuarios = Usuario.all().count()
if Usuario.filter(email="joao@email.com").exists():
print("Usuário encontrado!")
```
### Paginação
```python
# Paginação eficiente para grandes datasets
resultados, next_page = Usuario.all().page(page_size=50)
while next_page:
mais_resultados, next_page = Usuario.all().page(
page_size=50,
paging_state=next_page
)
```
## 🔄 Atualizações Atômicas
### Coleções (List, Set, Map)
```python
class Post(Model):
__table_name__ = 'posts'
id = fields.UUID(primary_key=True)
tags = fields.List(fields.Text())
colaboradores = fields.Set(fields.Text())
metadados = fields.Map(fields.Text(), fields.Text())
post = Post.create(
id=uuid.uuid4(),
tags=['python', 'orm'],
colaboradores={'ana', 'bruno'}
)
# Adicionar elementos atomicamente
post.update_collection('tags', add=['cassandra'])
post.update_collection('colaboradores', add={'carlos'})
# Remover elementos atomicamente
post.update_collection('tags', remove=['python'])
post.update_collection('colaboradores', remove={'bruno'})
# Operações assĂncronas
await post.update_collection_async('tags', add=['async'])
```
## 🏗️ Estrutura do Projeto
```
CaspyORM/
├── 📚 docs/ # Documentação completa
│ ├── analysis/ # Análise da API
│ ├── performance/ # Métricas de performance
│ └── README.md # Guia da documentação
├── 🧪 tests/ # Testes organizados (129/129 passando)
│ ├── unit/ # Testes unitários
│ ├── integration/ # Testes de integração
│ ├── performance/ # Testes de performance
│ └── nyc_taxi/ # Testes com dados reais NYC TLC
├── 🚀 examples/ # Exemplos práticos
│ ├── basic/ # Exemplos básicos
│ └── api/ # Exemplos de API FastAPI
├── 🔧 scripts/ # Scripts utilitários
│ └── download/ # Scripts de download
├── 📊 data/ # Dados de teste
│ └── nyc_taxi/ # Dados NYC TLC (48MB)
├── 📦 caspyorm/ # Biblioteca principal
├── 📋 pyproject.toml # Configuração do projeto
└── 📖 README.md # Este arquivo
```
## đź§Ş Testes
O projeto possui **129 testes passando** com cobertura completa:
```bash
# Executar todos os testes
pytest
# Testes especĂficos
pytest tests/unit/ # Testes unitários
pytest tests/integration/ # Testes de integração
pytest tests/unit/test_13_async_crud.py # Testes assĂncronos
# Com cobertura
pytest --cov=caspyorm --cov-report=html
```
### Resultados dos Testes
- âś… **129/129 testes passando (100%)**
- âś… **Todos os testes assĂncronos funcionando**
- ✅ **Zero regressões após correções**
- âś… **Cobertura completa das funcionalidades**
## 📊 Performance
### Métricas de Performance
| Operação | SĂncrono | AssĂncrono | Melhoria |
|----------|----------|------------|----------|
| Bulk Create (1k) | 2.3s | 1.8s | 22% |
| Filter + Count | 45ms | 38ms | 16% |
| Complex Queries | 120ms | 95ms | 21% |
| Pagination | 15ms | 12ms | 20% |
## 🔧 Integração com FastAPI
```python
from fastapi import FastAPI, HTTPException
from caspyorm import Model, fields
import uuid
app = FastAPI()
class User(Model):
__table_name__ = 'users'
id = fields.UUID(primary_key=True)
username = fields.Text(required=True)
email = fields.Text(index=True)
@app.post("/users/")
async def create_user(username: str, email: str):
user = await User.create_async(
id=uuid.uuid4(),
username=username,
email=email
)
return {"id": str(user.id), "username": user.username}
@app.get("/users/")
async def list_users():
users = await User.all().all_async()
return [{"id": str(u.id), "username": u.username} for u in users]
```
## 🚀 Roadmap
### âś… Implementado
- [x] API sĂncrona completa
- [x] API assĂncrona corrigida (event loop seguro)
- [x] Integração Pydantic
- [x] Operações em lote
- [x] Coleções (List, Set, Map)
- [x] Índices automáticos
- [x] Paginação eficiente
- [x] 129 testes passando
### 🔄 Em Desenvolvimento
- [ ] Publicação no PyPI
- [ ] Documentação interativa
- [ ] Plugins para IDEs
- [ ] Mais drivers Cassandra
### 🎯 Próximas Versões
- [ ] Suporte a mĂşltiplos clusters
- [ ] Migrations automáticas
- [ ] Cache integrado
- [ ] Métricas avançadas
## 🤝 Contribuindo
1. Fork o projeto
2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
3. Commit suas mudanças (`git commit -m 'Add some AmazingFeature'`)
4. Push para a branch (`git push origin feature/AmazingFeature`)
5. Abra um Pull Request
## 📄 Licença
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
## 🙏 Agradecimentos
- **DataStax** pelo driver Python para Cassandra
- **Pydantic** pela inspiração na API
- **FastAPI** pela integração assĂncrona
- **Comunidade Python** pelo feedback e suporte
---
**Status**: ✅ **Pronto para Uso em Produção**
**Última Atualização**: 19/07/2024
**VersĂŁo**: CaspyORM (desenvolvimento local)
**Testes**: 129/129 passando (100%)
**Async Support**: âś… Event Loop Seguro
Raw data
{
"_id": null,
"home_page": null,
"name": "caspyorm",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "cassandra, database, fastapi, nosql, orm, pydantic",
"author": null,
"author_email": "CaspyORM Team <team@caspyorm.dev>",
"download_url": "https://files.pythonhosted.org/packages/75/ef/e6a9860897a41dc70478b4d80a0169a4d5e80b8e89431288547a28169067/caspyorm-2.1.0.tar.gz",
"platform": null,
"description": "# \ud83d\ude80 CaspyORM\n\n**Status: \ud83d\ude80 Beta - Em Desenvolvimento Ativo**\n\nUm ORM moderno e Pythonic para Apache Cassandra, inspirado no Pydantic e focado em produtividade, performance e suporte ass\u00edncrono completo.\n\n[](https://python.org)\n[](LICENSE)\n[](tests/)\n[](coverage.xml)\n[](caspyorm/)\n\n## \u2728 Caracter\u00edsticas Principais\n\n### \ud83d\udd04 **Suporte Ass\u00edncrono Completo**\n- **Event Loop Seguro**: Todas as opera\u00e7\u00f5es async realmente n\u00e3o bloqueiam o event loop\n- **API Dupla**: Suporte s\u00edncrono e ass\u00edncrono para todas as opera\u00e7\u00f5es\n- **Integra\u00e7\u00e3o FastAPI**: Compat\u00edvel com frameworks ass\u00edncronos modernos\n- **Performance Superior**: Melhor utiliza\u00e7\u00e3o de recursos do sistema\n\n### \ud83c\udfaf **API Intuitiva e Pythonic**\n- **Defini\u00e7\u00e3o de modelos** baseada em tipos Python\n- **Consultas fluentes** com encadeamento natural\n- **Valida\u00e7\u00e3o robusta** integrada ao Pydantic\n- **Sincroniza\u00e7\u00e3o autom\u00e1tica** de schema\n\n### \u26a1 **Performance e Escalabilidade**\n- **Opera\u00e7\u00f5es em lote** otimizadas\n- **Queries preparadas** para m\u00e1xima performance\n- **\u00cdndices autom\u00e1ticos** para consultas r\u00e1pidas\n- **Pagina\u00e7\u00e3o eficiente** para grandes datasets\n\n### \ud83d\udee0\ufe0f **Ferramentas de Desenvolvimento**\n- **Logging detalhado** para monitoramento\n- **Tratamento de erros** robusto e informativo\n- **Documenta\u00e7\u00e3o completa** com exemplos pr\u00e1ticos\n\n## \ud83d\udce6 Instala\u00e7\u00e3o\n\n```bash\n# Em breve no PyPI\npip install caspyorm\n\n# Desenvolvimento local\ngit clone https://github.com/seu-usuario/caspyorm.git\ncd caspyorm\npip install -e .\n```\n\n## \ud83d\ude80 Quick Start\n\n### Configura\u00e7\u00e3o B\u00e1sica\n\n```python\nfrom caspyorm import Model, fields, connection\nimport uuid\n\n# Configurar conex\u00e3o\nconnection.connect(['localhost'], keyspace='meu_keyspace')\n\nclass Usuario(Model):\n __table_name__ = 'usuarios'\n id = fields.UUID(primary_key=True)\n nome = fields.Text(required=True)\n email = fields.Text(index=True)\n ativo = fields.Boolean(default=True)\n tags = fields.List(fields.Text(), default=[])\n\n# Sincronizar schema (cria tabela e \u00edndices)\nUsuario.sync_table()\n```\n\n### Opera\u00e7\u00f5es S\u00edncronas\n\n```python\n# CRUD b\u00e1sico\nusuario = Usuario.create(\n id=uuid.uuid4(),\n nome=\"Jo\u00e3o Silva\",\n email=\"joao@email.com\",\n tags=['python', 'developer']\n)\n\n# Buscar por ID\nusuario = Usuario.get(id=usuario.id)\n\n# Consultas com filtros\nusuarios_ativos = Usuario.filter(ativo=True).all()\nusuario_por_email = Usuario.filter(email=\"joao@email.com\").first()\n\n# Opera\u00e7\u00f5es em lote\nusuarios = [\n Usuario(id=uuid.uuid4(), nome=f\"Usu\u00e1rio {i}\", email=f\"user{i}@email.com\")\n for i in range(100)\n]\nUsuario.bulk_create(usuarios)\n```\n\n### Opera\u00e7\u00f5es Ass\u00edncronas\n\n```python\nimport asyncio\n\n# Conex\u00e3o ass\u00edncrona\nawait connection.connect_async(['localhost'], keyspace='meu_keyspace')\n\n# CRUD ass\u00edncrono\nusuario = await Usuario.create_async(\n id=uuid.uuid4(),\n nome=\"Maria Silva\",\n email=\"maria@email.com\"\n)\n\n# Consultas ass\u00edncronas\nusuarios = await Usuario.all().all_async()\ncount = await Usuario.filter(ativo=True).count_async()\n\n# Itera\u00e7\u00e3o ass\u00edncrona\nasync for usuario in Usuario.filter(ativo=True):\n print(usuario.nome)\n\n# Opera\u00e7\u00f5es at\u00f4micas em cole\u00e7\u00f5es\nawait usuario.update_collection_async('tags', add=['cassandra'])\n```\n\n## \ud83d\udd0d Consultas Avan\u00e7adas\n\n### Filtros Complexos\n\n```python\n# Operadores de compara\u00e7\u00e3o\nusuarios_caros = Usuario.filter(preco__gte=100.0).all()\nusuarios_especificos = Usuario.filter(id__in=[id1, id2, id3]).all()\n\n# Filtros em cole\u00e7\u00f5es\nposts_com_tag = Post.filter(tags__contains='python').all()\nposts_sem_tags = Post.filter(tags=[]).all()\n\n# Count e Exists otimizados\ntotal_usuarios = Usuario.all().count()\nif Usuario.filter(email=\"joao@email.com\").exists():\n print(\"Usu\u00e1rio encontrado!\")\n```\n\n### Pagina\u00e7\u00e3o\n\n```python\n# Pagina\u00e7\u00e3o eficiente para grandes datasets\nresultados, next_page = Usuario.all().page(page_size=50)\nwhile next_page:\n mais_resultados, next_page = Usuario.all().page(\n page_size=50, \n paging_state=next_page\n )\n```\n\n## \ud83d\udd04 Atualiza\u00e7\u00f5es At\u00f4micas\n\n### Cole\u00e7\u00f5es (List, Set, Map)\n\n```python\nclass Post(Model):\n __table_name__ = 'posts'\n id = fields.UUID(primary_key=True)\n tags = fields.List(fields.Text())\n colaboradores = fields.Set(fields.Text())\n metadados = fields.Map(fields.Text(), fields.Text())\n\npost = Post.create(\n id=uuid.uuid4(),\n tags=['python', 'orm'],\n colaboradores={'ana', 'bruno'}\n)\n\n# Adicionar elementos atomicamente\npost.update_collection('tags', add=['cassandra'])\npost.update_collection('colaboradores', add={'carlos'})\n\n# Remover elementos atomicamente\npost.update_collection('tags', remove=['python'])\npost.update_collection('colaboradores', remove={'bruno'})\n\n# Opera\u00e7\u00f5es ass\u00edncronas\nawait post.update_collection_async('tags', add=['async'])\n```\n\n\n\n## \ud83c\udfd7\ufe0f Estrutura do Projeto\n\n```\nCaspyORM/\n\u251c\u2500\u2500 \ud83d\udcda docs/ # Documenta\u00e7\u00e3o completa\n\u2502 \u251c\u2500\u2500 analysis/ # An\u00e1lise da API\n\u2502 \u251c\u2500\u2500 performance/ # M\u00e9tricas de performance\n\u2502 \u2514\u2500\u2500 README.md # Guia da documenta\u00e7\u00e3o\n\u251c\u2500\u2500 \ud83e\uddea tests/ # Testes organizados (129/129 passando)\n\u2502 \u251c\u2500\u2500 unit/ # Testes unit\u00e1rios\n\u2502 \u251c\u2500\u2500 integration/ # Testes de integra\u00e7\u00e3o\n\u2502 \u251c\u2500\u2500 performance/ # Testes de performance\n\u2502 \u2514\u2500\u2500 nyc_taxi/ # Testes com dados reais NYC TLC\n\u251c\u2500\u2500 \ud83d\ude80 examples/ # Exemplos pr\u00e1ticos\n\u2502 \u251c\u2500\u2500 basic/ # Exemplos b\u00e1sicos\n\u2502 \u2514\u2500\u2500 api/ # Exemplos de API FastAPI\n\u251c\u2500\u2500 \ud83d\udd27 scripts/ # Scripts utilit\u00e1rios\n\u2502 \u2514\u2500\u2500 download/ # Scripts de download\n\u251c\u2500\u2500 \ud83d\udcca data/ # Dados de teste\n\u2502 \u2514\u2500\u2500 nyc_taxi/ # Dados NYC TLC (48MB)\n\u251c\u2500\u2500 \ud83d\udce6 caspyorm/ # Biblioteca principal\n\n\u251c\u2500\u2500 \ud83d\udccb pyproject.toml # Configura\u00e7\u00e3o do projeto\n\u2514\u2500\u2500 \ud83d\udcd6 README.md # Este arquivo\n```\n\n## \ud83e\uddea Testes\n\nO projeto possui **129 testes passando** com cobertura completa:\n\n```bash\n# Executar todos os testes\npytest\n\n# Testes espec\u00edficos\npytest tests/unit/ # Testes unit\u00e1rios\npytest tests/integration/ # Testes de integra\u00e7\u00e3o\npytest tests/unit/test_13_async_crud.py # Testes ass\u00edncronos\n\n# Com cobertura\npytest --cov=caspyorm --cov-report=html\n```\n\n### Resultados dos Testes\n- \u2705 **129/129 testes passando (100%)**\n- \u2705 **Todos os testes ass\u00edncronos funcionando**\n- \u2705 **Zero regress\u00f5es ap\u00f3s corre\u00e7\u00f5es**\n- \u2705 **Cobertura completa das funcionalidades**\n\n## \ud83d\udcca Performance\n\n### M\u00e9tricas de Performance\n\n| Opera\u00e7\u00e3o | S\u00edncrono | Ass\u00edncrono | Melhoria |\n|----------|----------|------------|----------|\n| Bulk Create (1k) | 2.3s | 1.8s | 22% |\n| Filter + Count | 45ms | 38ms | 16% |\n| Complex Queries | 120ms | 95ms | 21% |\n| Pagination | 15ms | 12ms | 20% |\n\n## \ud83d\udd27 Integra\u00e7\u00e3o com FastAPI\n\n```python\nfrom fastapi import FastAPI, HTTPException\nfrom caspyorm import Model, fields\nimport uuid\n\napp = FastAPI()\n\nclass User(Model):\n __table_name__ = 'users'\n id = fields.UUID(primary_key=True)\n username = fields.Text(required=True)\n email = fields.Text(index=True)\n\n@app.post(\"/users/\")\nasync def create_user(username: str, email: str):\n user = await User.create_async(\n id=uuid.uuid4(),\n username=username,\n email=email\n )\n return {\"id\": str(user.id), \"username\": user.username}\n\n@app.get(\"/users/\")\nasync def list_users():\n users = await User.all().all_async()\n return [{\"id\": str(u.id), \"username\": u.username} for u in users]\n```\n\n## \ud83d\ude80 Roadmap\n\n### \u2705 Implementado\n- [x] API s\u00edncrona completa\n- [x] API ass\u00edncrona corrigida (event loop seguro)\n- [x] Integra\u00e7\u00e3o Pydantic\n- [x] Opera\u00e7\u00f5es em lote\n- [x] Cole\u00e7\u00f5es (List, Set, Map)\n- [x] \u00cdndices autom\u00e1ticos\n- [x] Pagina\u00e7\u00e3o eficiente\n- [x] 129 testes passando\n\n### \ud83d\udd04 Em Desenvolvimento\n- [ ] Publica\u00e7\u00e3o no PyPI\n- [ ] Documenta\u00e7\u00e3o interativa\n- [ ] Plugins para IDEs\n- [ ] Mais drivers Cassandra\n\n### \ud83c\udfaf Pr\u00f3ximas Vers\u00f5es\n- [ ] Suporte a m\u00faltiplos clusters\n- [ ] Migrations autom\u00e1ticas\n- [ ] Cache integrado\n- [ ] M\u00e9tricas avan\u00e7adas\n\n## \ud83e\udd1d Contribuindo\n\n1. Fork o projeto\n2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)\n3. Commit suas mudan\u00e7as (`git commit -m 'Add some AmazingFeature'`)\n4. Push para a branch (`git push origin feature/AmazingFeature`)\n5. Abra um Pull Request\n\n## \ud83d\udcc4 Licen\u00e7a\n\nEste projeto est\u00e1 licenciado sob a Licen\u00e7a MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.\n\n## \ud83d\ude4f Agradecimentos\n\n- **DataStax** pelo driver Python para Cassandra\n- **Pydantic** pela inspira\u00e7\u00e3o na API\n- **FastAPI** pela integra\u00e7\u00e3o ass\u00edncrona\n- **Comunidade Python** pelo feedback e suporte\n\n---\n\n**Status**: \u2705 **Pronto para Uso em Produ\u00e7\u00e3o** \n**\u00daltima Atualiza\u00e7\u00e3o**: 19/07/2024 \n**Vers\u00e3o**: CaspyORM (desenvolvimento local) \n**Testes**: 129/129 passando (100%) \n**Async Support**: \u2705 Event Loop Seguro ",
"bugtrack_url": null,
"license": "MIT",
"summary": "Um ORM moderno e eficiente para Apache Cassandra",
"version": "2.1.0",
"project_urls": {
"Bug Tracker": "https://github.com/caspyorm/caspyorm/issues",
"Documentation": "https://caspyorm.readthedocs.io",
"Homepage": "https://github.com/caspyorm/caspyorm",
"Repository": "https://github.com/caspyorm/caspyorm",
"Source Code": "https://github.com/caspyorm/caspyorm"
},
"split_keywords": [
"cassandra",
" database",
" fastapi",
" nosql",
" orm",
" pydantic"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "0293fb930eabc6b972b4c7e6d81f8606b1e98f5a993666b6f6c306bb145a8400",
"md5": "c4cfd53302398a36876f641af97443a8",
"sha256": "3d34ac82efcd67e016bf23283578101d1f13df824e8468852fb8ca08fb08888a"
},
"downloads": -1,
"filename": "caspyorm-2.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c4cfd53302398a36876f641af97443a8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 40785,
"upload_time": "2025-07-22T11:17:58",
"upload_time_iso_8601": "2025-07-22T11:17:58.969457Z",
"url": "https://files.pythonhosted.org/packages/02/93/fb930eabc6b972b4c7e6d81f8606b1e98f5a993666b6f6c306bb145a8400/caspyorm-2.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "75efe6a9860897a41dc70478b4d80a0169a4d5e80b8e89431288547a28169067",
"md5": "ded56d135273535961cce5761081362f",
"sha256": "defc956c6fd4bbe25934f70d7717b11f3dd3c89d318e3d3c1f3e2aa4c7c75b22"
},
"downloads": -1,
"filename": "caspyorm-2.1.0.tar.gz",
"has_sig": false,
"md5_digest": "ded56d135273535961cce5761081362f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 91800,
"upload_time": "2025-07-22T11:18:01",
"upload_time_iso_8601": "2025-07-22T11:18:01.318917Z",
"url": "https://files.pythonhosted.org/packages/75/ef/e6a9860897a41dc70478b4d80a0169a4d5e80b8e89431288547a28169067/caspyorm-2.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-22 11:18:01",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "caspyorm",
"github_project": "caspyorm",
"github_not_found": true,
"lcname": "caspyorm"
}