Skip to main content

Advanced Toolkit for Application Management System - Universal toolkit for AURA projects

Project description

ATAMS - Advanced Toolkit for Application Management System

Version Python License

Universal toolkit untuk semua AURA (Atams Universal Runtime Architecture) projects.

Features

  • ๐Ÿš€ Instant CRUD Generation - Generate full boilerplate in seconds
  • ๐Ÿ—๏ธ Clean Architecture - Enforced separation of concerns
  • ๐Ÿ”’ Security by Default - Atlas SSO, encryption, RBAC
  • ๐Ÿ“ฆ Reusable Components - Database, middleware, logging, etc.
  • ๐ŸŽจ CLI Tool - Project initialization & code generation
  • ๐ŸŒ CORS Protection - Default to *.atamsindonesia.com

Installation

pip install atams

Quick Start

1. Initialize New Project

atams init my-app
cd my-app
cp .env.example .env
# Edit .env with your configuration
pip install -r requirements.txt
uvicorn app.main:app --reload

2. Generate CRUD

atams generate department

Generates:

  • โœ… Model (SQLAlchemy)
  • โœ… Schema (Pydantic)
  • โœ… Repository (data access)
  • โœ… Service (business logic)
  • โœ… Endpoint (API routes)
  • โœ… Auto-registered to api.py

3. Customize & Run

Edit generated files to add custom logic, then test:

# Access API docs
http://localhost:8000/docs

# Test endpoints
GET  /api/v1/departments
GET  /api/v1/departments/{id}
POST /api/v1/departments
PUT  /api/v1/departments/{id}
DELETE /api/v1/departments/{id}

Components

Core Components

  1. Database Layer - BaseRepository with ORM & Native SQL, configurable connection pooling
  2. Atlas SSO - Authentication & authorization
  3. Response Encryption - AES-256 for GET endpoints
  4. Exception Handling - Standardized error responses
  5. Middleware - Request ID tracking, rate limiting
  6. Logging - Structured logging with JSON format
  7. Transaction Management - Context managers for complex operations
  8. Common Schemas - Response & pagination schemas
  9. Health Check Endpoints - Built-in monitoring endpoints with pool statistics

Configuration

ATAMS provides AtamsBaseSettings with sensible defaults:

from atams import AtamsBaseSettings

class Settings(AtamsBaseSettings):
    APP_NAME: str = "MyApp"
    APP_VERSION: str = "1.0.0"
    DEBUG: bool = True

    # App-specific encryption
    ENCRYPTION_KEY: str = "your-key-32-chars"
    ENCRYPTION_IV: str = "your-iv-16-char"

settings = Settings()

CORS Default: Hanya *.atamsindonesia.com + localhost (development)

Override via .env:

CORS_ORIGINS=["https://myapp.atamsindonesia.com"]

Database Connection Pool Configuration

IMPORTANT: ATAMS now has configurable connection pool settings to prevent "remaining connection slots" errors!

Default Settings (Conservative):

  • DB_POOL_SIZE=3 - Persistent connections
  • DB_MAX_OVERFLOW=5 - Additional overflow connections
  • DB_POOL_RECYCLE=3600 - Recycle connections after 1 hour
  • DB_POOL_TIMEOUT=30 - Timeout waiting for connection
  • DB_POOL_PRE_PING=True - Health check before using

For Aiven Free Tier (20 connection limit):

Add to your .env:

# Database connection pool settings
DB_POOL_SIZE=3
DB_MAX_OVERFLOW=5

This allows max 8 connections per app instance (3 + 5).

For Production (Higher limits):

If your database has max_connections=100, you can increase:

DB_POOL_SIZE=10
DB_MAX_OVERFLOW=20

Calculate Your Pool Settings:

Use this formula:

Total Connections = (DB_POOL_SIZE + DB_MAX_OVERFLOW) ร— Number of App Instances

Ensure: Total Connections < Database Connection Limit - 5 (reserve for admin/monitoring)

Example:

  • Database limit: 20
  • Number of apps: 2
  • Pool size: (3 + 5) ร— 2 = 16 connections โœ… (safe, under 20)

Initialize Database with Custom Pool:

from atams.db import init_database
from app.core.config import settings

# Option 1: Use settings object (reads from .env)
init_database(
    settings.DATABASE_URL,
    settings.DEBUG,
    pool_size=settings.DB_POOL_SIZE,
    max_overflow=settings.DB_MAX_OVERFLOW,
    pool_recycle=settings.DB_POOL_RECYCLE,
    pool_timeout=settings.DB_POOL_TIMEOUT,
    pool_pre_ping=settings.DB_POOL_PRE_PING
)

# Option 2: Explicit values
init_database(
    settings.DATABASE_URL,
    settings.DEBUG,
    pool_size=3,
    max_overflow=5
)

Monitor Connection Pool:

from atams.db import get_pool_status, check_connection_health

# Check pool status
status = get_pool_status()
print(f"Active: {status['checked_out']}/{status['pool_size']}")
print(f"Total connections: {status['total_connections']}")

# Health check
if not check_connection_health():
    print("Database connection issue!")

Built-in Health Check Endpoints:

ATAMS now provides automatic health check endpoints that you can mount in your app!

from fastapi import FastAPI
from atams.api import health_router

app = FastAPI()

# Mount built-in health endpoints
app.include_router(health_router, prefix="/health", tags=["Health"])

This provides 3 endpoints automatically:

  1. GET /health - Basic application health

    {
      "status": "ok",
      "timestamp": "2025-01-13T10:00:00"
    }
    
  2. GET /health/db - Database health with connection pool stats

    {
      "status": "ok",
      "database": {
        "connected": true,
        "pool": {
          "pool_size": 3,
          "checked_in": 2,
          "checked_out": 1,
          "overflow": 0,
          "total_connections": 3
        }
      },
      "timestamp": "2025-01-13T10:00:00"
    }
    
  3. GET /health/full - Full system health check

    {
      "status": "ok",
      "application": {
        "status": "running",
        "timestamp": "2025-01-13T10:00:00"
      },
      "database": {
        "connected": true,
        "pool": {...}
      }
    }
    

Manual Usage (if needed):

from atams.db import get_pool_status, check_connection_health

# Check pool status
status = get_pool_status()
print(f"Active: {status['checked_out']}/{status['pool_size']}")

# Health check
if not check_connection_health():
    print("Database connection issue!")

CLI Commands

atams init <project_name>

Initialize new AURA project with complete structure.

Options:

  • --app-name, -a - Application name (default: project_name)
  • --version, -v - Application version (default: 1.0.0)
  • --schema, -s - Database schema (default: aura)

Example:

atams init my-new-app

atams generate <resource>

Generate full CRUD boilerplate for a resource.

Options:

  • --schema, -s - Database schema (default: aura)
  • --skip-api - Skip auto-registration to api.py

Example:

atams generate department
atams generate user --schema=public

atams --version

Show toolkit version.

Project Structure

my-app/
โ”œโ”€โ”€ app/
โ”‚   โ”œโ”€โ”€ core/              # Configuration
โ”‚   โ”‚   โ””โ”€โ”€ config.py
โ”‚   โ”œโ”€โ”€ db/                # Database
โ”‚   โ”œโ”€โ”€ models/            # SQLAlchemy models
โ”‚   โ”œโ”€โ”€ schemas/           # Pydantic schemas
โ”‚   โ”œโ”€โ”€ repositories/      # Data access layer
โ”‚   โ”œโ”€โ”€ services/          # Business logic layer
โ”‚   โ””โ”€โ”€ api/               # API endpoints
โ”‚       โ””โ”€โ”€ v1/
โ”‚           โ”œโ”€โ”€ api.py
โ”‚           โ””โ”€โ”€ endpoints/
โ”œโ”€โ”€ tests/                 # Test files
โ”œโ”€โ”€ .env.example           # Environment template
โ”œโ”€โ”€ requirements.txt       # Dependencies
โ””โ”€โ”€ README.md

Usage Examples

Using BaseRepository

BaseRepository menyediakan 20+ methods untuk operasi database yang lengkap:

Basic CRUD Operations

Method Description
get(db, id) Get single record by ID
get_multi(db, skip, limit) Get multiple records with pagination
create(db, obj_in) Create new record
update(db, db_obj, obj_in) Update existing record
delete(db, id) Delete record by ID

Advanced Query Methods

Method Description
exists(db, id) Fast existence check (returns bool)
filter(db, filters, skip, limit, order_by) Dynamic filtering with pagination & ordering
first(db, filters, order_by) Get first matching record
count_filtered(db, filters) Count records with conditions
get_or_create(db, defaults, **filters) Get existing or create new (atomic)
update_or_create(db, filters, defaults) Update existing or create (upsert)

Bulk Operations (High Performance)

Method Description
bulk_create(db, objects) Batch insert (100x faster than loop)
bulk_update(db, objects) Batch update multiple records
delete_many(db, ids) Batch delete by IDs
partial_update(db, id, data) Update without fetching first

Soft Delete Pattern

Method Description
soft_delete(db, id, deleted_at_field) Logical deletion with timestamp
restore(db, id, deleted_at_field) Restore soft-deleted record

Native SQL Execution

Method Description
execute_raw_sql(db, query, params) Execute raw SQL, returns result
execute_raw_sql_dict(db, query, params) Execute SQL, returns list of dicts
execute_raw_sql_commit(db, query, params) Execute SQL with auto-commit

Example Usage:

from atams import BaseRepository
from app.models.user import User

class UserRepository(BaseRepository[User]):
    def __init__(self):
        super().__init__(User)

    def example_usage(self, db):
        # Basic CRUD
        user = self.get(db, id=1)
        users = self.get_multi(db, skip=0, limit=10)
        new_user = self.create(db, {"name": "John", "email": "john@example.com"})

        # Advanced queries
        if self.exists(db, id=1):
            print("User exists!")

        active_users = self.filter(db,
            filters={"status": "active"},
            skip=0, limit=50,
            order_by="-created_at"  # descending
        )

        first_admin = self.first(db,
            filters={"role": "admin"},
            order_by="created_at"
        )

        total = self.count_filtered(db, {"status": "active"})

        # Get or create pattern
        user, created = self.get_or_create(db,
            defaults={"status": "pending"},
            email="new@example.com"
        )

        # Bulk operations (very fast!)
        users_data = [
            {"name": "User1", "email": "user1@example.com"},
            {"name": "User2", "email": "user2@example.com"},
        ]
        self.bulk_create(db, users_data)

        # Soft delete
        self.soft_delete(db, id=1, deleted_at_field="deleted_at")
        self.restore(db, id=1, deleted_at_field="deleted_at")

        # Native SQL
        query = "SELECT * FROM users WHERE status = :status"
        active_users = self.execute_raw_sql_dict(db, query, {"status": "active"})

Using Atlas SSO

Configure Atlas SSO in .env:

ATLAS_SSO_URL=https://api.atlas-microapi.atamsindonesia.com/api/v1
ATLAS_APP_CODE=your_app_code
ATLAS_ENCRYPTION_KEY=your_encryption_key
ATLAS_ENCRYPTION_IV=your_encryption_iv

Then use in endpoints:

from atams.sso import require_auth, require_min_role_level

@router.get("/admin", dependencies=[Depends(require_min_role_level(50))])
async def admin_dashboard(current_user: dict = Depends(require_auth)):
    # Only users with role level >= 50 can access
    return {"user": current_user}

Using Response Encryption

from atams.encryption import encrypt_response_data
from atams.schemas import DataResponse

@router.get("/users/{user_id}")
async def get_user(user_id: int):
    user = get_user_from_db(user_id)
    response = DataResponse(
        success=True,
        message="User retrieved",
        data=user
    )
    # Auto-encrypt if ENCRYPTION_ENABLED=true
    return encrypt_response_data(response)

Development

Setup

git clone https://github.com/GratiaManullang03/atams.git
cd atams
pip install -e ".[dev]"

Run Tests

pytest tests/ -v
pytest tests/ --cov=atams --cov-report=html

Build Package

python -m build

Versioning

ATAMS follows Semantic Versioning:

  • MAJOR version for incompatible API changes
  • MINOR version for new functionality (backwards compatible)
  • PATCH version for bug fixes

Current version: 1.1.4

License

MIT License - see LICENSE file for details.

Links

Support

For support, email gratiamanullang03@gmail.com or open an issue on GitHub.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

atams-1.1.4.tar.gz (52.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

atams-1.1.4-py3-none-any.whl (58.1 kB view details)

Uploaded Python 3

File details

Details for the file atams-1.1.4.tar.gz.

File metadata

  • Download URL: atams-1.1.4.tar.gz
  • Upload date:
  • Size: 52.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for atams-1.1.4.tar.gz
Algorithm Hash digest
SHA256 71482fa0c0636b1b94da4a534698270dd2e87ac840da0fea574f3da9d9b4206a
MD5 ea598244aa98da4476ff54bebb637083
BLAKE2b-256 d8c0f83219f42d3f9b5070a7516b1544a2fbf1a7d139ed5945d4ac4d9c071f82

See more details on using hashes here.

File details

Details for the file atams-1.1.4-py3-none-any.whl.

File metadata

  • Download URL: atams-1.1.4-py3-none-any.whl
  • Upload date:
  • Size: 58.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for atams-1.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 0c517944b9befd39730615081faf72b2f76b5a75b13ae74e168584ecc3df9135
MD5 4635830df836e7b86e0e8b405acb174b
BLAKE2b-256 224ef6924a837b3cbf0155d6032fd468591eaeeaceb9598c010eca643acc11c7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page