Skip to main content

A lightweight volatile context management store for Python

Project description

EphemeralDB

軽量で揮発性のコンテキスト管理ストアです。メモリ上でスコープ付きキー・バリューストレージを提供します。

概要

EphemeralDBは階層的なスコープ機能を持つ一時的なデータ管理のために設計されています。以下の用途に最適です:

  • DSLインタープリター
  • 複雑な設定パーサー
  • ネストしたトランザクション処理
  • 深い再帰処理中の一時状態管理

主な機能

  • スコープ付きストレージ: スタックのようにスコープをpush/pop
  • 階層アクセス: 子スコープから親スコープのデータにアクセス可能
  • ドット記法: user.profile.nameのようなネストしたキーをサポート
  • コンテキストマネージャー: with文で使用可能
  • スレッドセーフ: マルチスレッド環境で使用可能
  • メモリのみ: ファイルシステムや外部依存関係不要
  • 軽量: 純Python実装

インストール

pip install ephemeraldb

クイックスタート

from ephemeraldb import EphemeralDB

# 新しいデータベースインスタンスを作成
db = EphemeralDB()

# 基本的な使用方法
db.set('名前', 'アリス')
db.set('ユーザー.年齢', 30)
print(db.get('名前'))  # アリス
print(db.get('ユーザー.年齢'))  # 30

# スコープ付き使用方法
db.set('グローバル変数', 'グローバルです')

db.push_scope('スコープ1')
db.set('ローカル変数', 'ローカルです')
print(db.get('グローバル変数'))  # グローバルです(親からアクセス可能)
print(db.get('ローカル変数'))   # ローカルです

db.pop_scope()
print(db.get('ローカル変数'))   # None(スコープが削除されました)

# コンテキストマネージャー使用方法
with db.scope('一時スコープ'):
    db.set('一時データ', '一時的')
    print(db.get('一時データ'))  # 一時的
# 一時データは自動的にクリーンアップされます

APIリファレンス

コアメソッド

  • set(key: str, value: Any) - 値を保存
  • get(key: str, default: Any = None) - 値を取得
  • delete(key: str) - キーを削除
  • exists(key: str) - キーの存在確認
  • clear() - 現在のスコープをクリア

スコープ管理

  • push_scope(name: str = None) - 新しいスコープを作成
  • pop_scope() - 現在のスコープを削除
  • current_scope() - 現在のスコープ名を取得
  • scope_count() - アクティブなスコープ数を取得
  • scope(name: str) - スコープ用コンテキストマネージャー

高度な機能

  • keys() - 現在のスコープの全キーを取得
  • items() - 全キー・バリューペアを取得
  • to_dict() - 現在のスコープを辞書としてエクスポート
  • from_dict(data: dict) - 辞書を現在のスコープにインポート

使用例

DSLインタープリター

from ephemeraldb import EphemeralDB

def execute_block(db, variables, statements):
    """変数スコープを持つブロックの実行をシミュレート"""
    with db.scope('ブロックスコープ'):
        # ブロック変数をインポート
        for var, value in variables.items():
            db.set(var, value)
        
        results = []
        for statement in statements:
            if statement.startswith('SET '):
                _, var, value = statement.split(' ', 2)
                db.set(var, value)
            elif statement.startswith('GET '):
                _, var = statement.split(' ', 1)
                results.append(db.get(var))
        
        return results

db = EphemeralDB()
db.set('グローバル定数', 42)

results = execute_block(
    db,
    {'ローカル変数': 'ブロック1'},
    ['SET 一時変数 こんにちは', 'GET ローカル変数', 'GET 一時変数', 'GET グローバル定数']
)

print(results)  # ['ブロック1', 'こんにちは', 42]

設定パーサー

def parse_config_section(db, section_name, config_data):
    """継承を持つ設定セクションの解析"""
    with db.scope(f'設定_{section_name}'):
        for key, value in config_data.items():
            db.set(f'{section_name}.{key}', value)
        
        return db.to_dict(include_hierarchy=True)

db = EphemeralDB()
db.set('デフォルト.タイムアウト', 30)
db.set('デフォルト.リトライ回数', 3)

dev_config = parse_config_section(db, '開発', {
    'ホスト': 'localhost',
    'ポート': 8000,
    'デバッグ': True
})

print(dev_config)

トランザクション処理

class Transaction:
    def __init__(self, db, name):
        self.db = db
        self.name = name
    
    def __enter__(self):
        self.db.push_scope(f'トランザクション_{self.name}')
        return self
    
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.db.pop_scope()

db = EphemeralDB()
db.set('アカウント.残高', 1000)

try:
    with Transaction(db, '送金') as tx:
        current_balance = db.get('アカウント.残高')
        if current_balance >= 200:
            db.set('アカウント.残高', current_balance - 200)
        else:
            raise ValueError("残高不足")
except ValueError:
    print("トランザクションがロールバックされました")

エラーハンドリング

EphemeralDBは詳細なエラー情報を提供します:

from ephemeraldb import EphemeralDB, ValidationError, CapacityError

try:
    db = EphemeralDB(max_scopes=5)
    # ... 何らかの操作
except CapacityError as e:
    print(f"容量エラー: {e}")
    print(f"エラーコード: {e.error_code}")
    print(f"詳細: {e.details}")

パフォーマンス特性

  • メモリ使用量: 格納されたデータのサイズに比例
  • 時間計算量:
    • 設定/取得: O(キーの深度)
    • スコープ操作: O(1)
  • スレッドセーフ: RLockによる保護
  • 容量制限: 設定可能な上限値

ライセンス

MIT License

貢献

バグ報告や機能リクエストは、GitHubのIssueでお願いします。プルリクエストも歓迎です。

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

ephemeraldb-1.0.0.tar.gz (48.4 kB view details)

Uploaded Source

Built Distribution

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

ephemeraldb-1.0.0-py3-none-any.whl (56.4 kB view details)

Uploaded Python 3

File details

Details for the file ephemeraldb-1.0.0.tar.gz.

File metadata

  • Download URL: ephemeraldb-1.0.0.tar.gz
  • Upload date:
  • Size: 48.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for ephemeraldb-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ebcbbc85660aadf341e697a19c82ff0dd996e2734f93c0202b7dead59535e4f2
MD5 c79b6cbfa4b7d316689bc70c08d9ec33
BLAKE2b-256 da5c3131732d0a377642f83493a91582c730e79d54f95ee792972223b0b84b3a

See more details on using hashes here.

File details

Details for the file ephemeraldb-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: ephemeraldb-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 56.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for ephemeraldb-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dc29ac1a460905aa13e069427398c1df5db848a81bfa0564b77278a0e452e271
MD5 19ecced94eb242276020b98b8342157c
BLAKE2b-256 e4711406d6cb92a21b1a3575564d7b3278c7cd339b29abe8394ec2d1a5faad6d

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