Skip to content

Instantly share code, notes, and snippets.

View daaniam's full-sized avatar

dan daaniam

  • San Diego, CA
  • 22:14 (UTC -07:00)
View GitHub Profile
@daaniam
daaniam / dockerized_ftp_client.md
Created January 13, 2024 06:10
Dockerized FTP client

Dockerfile

FROM debian:bookworm-slim
RUN apt update && apt install -y lftp

Send from terminal

docker run -v $(pwd)/file_to_send:/tmp/file_to_send \
@daaniam
daaniam / bruno_scripts.md
Created November 13, 2023 20:55
bruno scripts

Randoms

const _ = require('lodash');

// Function to generate random string
function randStr(length) {
    return _.join(_.times(length, () => _.random(35).toString(36)), '');
}
@daaniam
daaniam / docker_pgadmin_settings.md
Last active July 8, 2023 01:39
docker pgadmin4 mount settings

Mount pgadmin4 settings with passwords (example)

Dirs structure

project_root
 - docker
   - pgadmin4
     - pgpass
     - servers.json
@daaniam
daaniam / sqlalchemy_relationship_proxy.py
Created June 27, 2023 22:17
SQLAlchemy - relationship proxy example
"""
Short example of how to set realtionship in many-to-many with extra column(s) in association table.
creator class is used on the relationship(), but it's also possible to create MUserPermitAssoc
explicitly and pass it to MUser.permits.
"""
from __future__ import annotations
import sqlalchemy as sa
@daaniam
daaniam / fastapi_custom_reponse_class.py
Created June 8, 2023 05:34
FastAPI custom response with data & errors
class MyCUstomResponse(JSONResponse):
def __init__(
self,
data: list[t.Any],
errors: list[t.Any] | None = None,
status_code: int = 200,
headers: dict[str, str] | None = None,
media_type: str | None = None,
background: BackgroundTask | None = None,
) -> None:
@daaniam
daaniam / sqlalchemy_resolve_table_name.py
Created May 14, 2023 20:54
sqlalchemy model resolve table name
import re
from sqlalchemy.orm import DeclarativeBase, declared_attr
def resolve_table_name(name):
"""Resolve table name from Class CamelCase"""
# Match a letter just before an upper-case char
# Example: "Hello World" would match "o" because next "W" is uppercase.
class AsyncTyper(typer.Typer):
def __init__(self, *args, **kwargs):
kwargs["no_args_is_help"] = True
super().__init__(*args, **kwargs)
def async_command(self, *args, **kwargs):
def decorator(async_func):
@wraps(async_func)
def sync_func(*_args, **_kwargs):
@daaniam
daaniam / alembic_async.py
Last active May 3, 2023 04:45
Alembic .env config AsyncEngine
from sqlalchemy.engine import Connection
from sqlalchemy.ext.asyncio import AsyncEngine
from app.core.config import get_config
app_config = get_config()
config.set_main_option("sqlalchemy.url", app_config.postgres.dsn)
@daaniam
daaniam / pydantic_set_env_prefix.md
Last active April 17, 2023 04:05
Pydantic set env_prefix

Add (set_prefix) method to your settings class...

class MyConfig(BaseSettings):
    logging_level: str = "example"

    @classmethod
    def set_prefix(cls, prefix: str):
        cls.__config__.env_prefix = prefix
 for field in cls.__fields__.values():
@daaniam
daaniam / pydantic_sqlalchemy_models.md
Created April 13, 2023 06:08
Pydantic schema from SQLAlchemy model (inheritance)
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from pydantic.dataclasses import dataclass

# Create engine and session
engine = create_engine('sqlite:///example.db')
Session = sessionmaker(bind=engine)
session = Session()