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でお願いします。プルリクエストも歓迎です。

変更履歴

詳細はCHANGELOG.mdをご覧ください。

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-0.1.0.tar.gz (48.5 kB view details)

Uploaded Source

Built Distribution

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

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

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for ephemeraldb-0.1.0.tar.gz
Algorithm Hash digest
SHA256 4ddb7015cfbcced41d5bce02a9d94cf6289988cfea10f35caf85ddce01ee55c0
MD5 7baa1dc2dc2f2c367b7fb9b21fe4de75
BLAKE2b-256 0845f811e8351478b9ea4573852a2683577d12218c729ed50ffb17cf9bc2b781

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ephemeraldb-0.1.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-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3d34d9f2c7979dc382cf16348df57026f4d894345ce35fca1cd33c0b0661b38d
MD5 06a8358b7ad5fa0de04fcd503c69bad9
BLAKE2b-256 b71a6deb0ac4cd60a2a2c7c4603f58f64da112fe8ac41a8ad621e95ed36f1524

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