Metadata-Version: 2.4
Name: kamalator
Version: 0.1.1
Summary: Bidirectional SQL-to-SQLAlchemy 2.0 ORM and SQLAlchemy-to-Raw-SQL transpiler for Oracle and PostgreSQL.
Author: M. Kamal
License-Expression: MIT
Keywords: sql,sqlalchemy,orm,oracle,postgresql,transpiler,sql-to-orm,orm-to-sql,codegen
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Database
Classifier: Topic :: Software Development :: Code Generators
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: sqlglot>=25.0.0
Requires-Dist: sqlalchemy>=2.0.0
Provides-Extra: dev
Requires-Dist: pytest>=8.0.0; extra == "dev"
Requires-Dist: build>=1.0.0; extra == "dev"
Requires-Dist: twine>=5.0.0; extra == "dev"
Dynamic: license-file

# Kamalator

Konverter **dua arah (Bidirectional)** antara **Raw SQL (Oracle & PostgreSQL)** dan **SQLAlchemy 2.0 ORM** berbasis AST (`sqlglot` & Python `ast`) dengan pendekatan *Clean Architecture*.

## Fitur Utama

1. **Raw SQL -> SQLAlchemy 2.0 ORM (`oracle()` & `postgresql()`)**:
   - Mendukung query pendek maupun query panjang (otomatis memecah CTE `WITH` dan Subquery menjadi variabel terpisah).
   - Menangani sintaks spesifik Oracle (`TRUNC`, `SYSDATE`, `DECODE`, `NVL`, `ROWNUM`, `FROM DUAL`) dan PostgreSQL (`::type` cast, `ILIKE`, `DISTINCT ON`, `FILTER`).
2. **SQLAlchemy 2.0 ORM -> Raw SQL (`to_oracle()` & `to_postgresql()`)**:
   - Menerima objek `Select`/`ClauseElement` SQLAlchemy langsung **atau** potongan kode string Python SQLAlchemy **tanpa perlu mendefinisikan class Model terlebih dahulu**.
   - Menyubstitusikan nilai dictionary `params` (`{'id': 101}`) ke dalam query dan merapikan format SQL (`pretty=True`).
3. **Output Minimalis**:
   - Hanya menampilkan watermark versi beserta durasi eksekusi (`kamalator v0.1 - 0.23ms`) diikuti langsung oleh hasil query-nya.

## Penggunaan Cepat

```python
import kamalator

id = 101

# 1. Raw SQL -> SQLAlchemy 2.0 ORM
kamalator.oracle(
    "SELECT * from table_a where tgl = trunc(sysdate) and id = :id",
    {"id": id},
)

kamalator.postgresql(
    "SELECT * from table_a where tgl = current_date and id = :id",
    {"id": id},
)

# 2. SQLAlchemy 2.0 ORM -> Raw SQL
kamalator.to_oracle(
    """
    select(TableA)
    .where(
        TableA.tgl == func.trunc(func.sysdate()),
        TableA.id == bindparam("id"),
    )
    """,
    {"id": id},
)

kamalator.to_postgresql(
    """
    select(TableA)
    .where(
        TableA.tgl == func.current_date(),
        TableA.id == bindparam("id"),
    )
    """,
    {"id": id},
)
```
