|
1 | | -Welcome to DBase documentation. For the latest documentation, visit our [GitHub repository](https://github.com/Danex-Exe/dbase). |
| 1 | +# DBase |
2 | 2 |
|
3 | | -## Quick Links |
| 3 | +Лёгкая JSON-based библиотека для хранения данных с интерфейсом, похожим на словарь и атрибуты объекта. |
4 | 4 |
|
5 | | -- [Full Documentation](https://github.com/Danex-Exe/dbase#readme) |
6 | | -- [API Reference](#api-reference) |
7 | | -- [Examples](#examples) |
8 | | -- [Changelog](https://github.com/Danex-Exe/dbase/blob/main/docs/CHANGELOG.md) |
| 5 | +- Простая запись: `db.user = "alice"` или `db["user"] = "alice"` |
| 6 | +- Автосохранение в файл JSON |
| 7 | +- Контекстный менеджер (`with DataBase(...) as db:`) |
| 8 | +- Временные БД (`is_temp=True`) |
| 9 | +- Опциональное простое шифрование при сохранении (`encryption_key`) |
9 | 10 |
|
10 | | -## Installation |
| 11 | +--- |
| 12 | + |
| 13 | +## Содержание |
| 14 | + |
| 15 | +1. [Установка](#установка) |
| 16 | +2. [Быстрый старт](#быстрый-старт) |
| 17 | +3. [Как работает хранение](#как-работает-хранение) |
| 18 | +4. [Шифрование данных](#шифрование-данных) |
| 19 | +5. [Основной API](#основной-api) |
| 20 | +6. [Практические примеры](#практические-примеры) |
| 21 | +7. [Запуск тестов и CI/CD](#запуск-тестов-и-cicd) |
| 22 | +8. [Docker и docker-compose](#docker-и-docker-compose) |
| 23 | +9. [Ограничения и рекомендации](#ограничения-и-рекомендации) |
| 24 | + |
| 25 | +--- |
| 26 | + |
| 27 | +## Установка |
| 28 | + |
| 29 | +### 1) Установка из PyPI |
11 | 30 |
|
12 | 31 | ```bash |
13 | 32 | pip install dbase |
14 | 33 | ``` |
15 | 34 |
|
16 | | -## Basic Example |
| 35 | +Проверка, что модуль установлен: |
17 | 36 |
|
18 | | -```python |
19 | | -from dbase import DataBase |
| 37 | +```bash |
| 38 | +python -c "from dbase import DataBase; print(DataBase)" |
| 39 | +``` |
20 | 40 |
|
21 | | -# Create or open a database |
22 | | -db = DataBase(file_path="data.json") |
| 41 | +### 2) Установка для разработки (из исходников) |
| 42 | + |
| 43 | +```bash |
| 44 | +git clone https://github.com/Danex-Exe/dbase.git |
| 45 | +cd dbase |
| 46 | +python -m pip install -e .[dev] |
| 47 | +``` |
23 | 48 |
|
24 | | -# Store data |
25 | | -db["name"] = "Alice" |
26 | | -db.score = 95 |
| 49 | +Что это даёт: |
| 50 | +- `-e` — editable mode (изменения в коде сразу доступны без переустановки) |
| 51 | +- `.[dev]` — устанавливает dev-зависимости (pytest, black, flake8, mypy) |
27 | 52 |
|
28 | | -# Retrieve data |
29 | | -print(db["name"]) # Alice |
30 | | -print(db.score) # 95 |
| 53 | +### 3) Установка в виртуальном окружении (рекомендуется) |
31 | 54 |
|
32 | | -# Use as context manager |
33 | | -with DataBase(file_path="session.json") as session: |
34 | | - session.user = "admin" |
35 | | - session.timestamp = "2024-01-01" |
| 55 | +```bash |
| 56 | +python -m venv .venv |
| 57 | +source .venv/bin/activate # Linux/macOS |
| 58 | +# .venv\Scripts\activate # Windows PowerShell |
| 59 | +pip install --upgrade pip |
| 60 | +pip install dbase |
36 | 61 | ``` |
37 | 62 |
|
38 | | -## API Reference |
| 63 | +--- |
39 | 64 |
|
40 | | -### DataBase Class |
| 65 | +## Быстрый старт |
41 | 66 |
|
42 | 67 | ```python |
43 | | -class DataBase(file_path=None, show_logs=True, is_temp=False) |
| 68 | +from dbase import DataBase |
| 69 | + |
| 70 | +# Создать или открыть БД |
| 71 | +with DataBase(file_path="data.json", show_logs=False) as db: |
| 72 | + db.user = "alice" |
| 73 | + db["score"] = 95 |
| 74 | + |
| 75 | +# Повторно открыть и прочитать |
| 76 | +with DataBase(file_path="data.json", show_logs=False) as db: |
| 77 | + print(db.user) # alice |
| 78 | + print(db["score"]) # 95 |
44 | 79 | ``` |
45 | 80 |
|
46 | | -**Parameters:** |
47 | | -- `file_path` (str, optional): Path to JSON file for persistent storage |
48 | | -- `show_logs` (bool): Enable/disable logging (default: True) |
49 | | -- `is_temp` (bool): Create temporary in-memory database (default: False) |
| 81 | +--- |
50 | 82 |
|
51 | | -**Methods:** |
52 | | -- `get(key, default=None)`: Get value with fallback |
53 | | -- `pop(key, default=None)`: Remove and return value |
54 | | -- `update(**kwargs)`: Update multiple values |
55 | | -- `clear()`: Remove all data |
56 | | -- `items()`: Return key-value pairs |
57 | | -- `keys()`: Return all keys |
58 | | -- `values()`: Return all values |
| 83 | +## Как работает хранение |
59 | 84 |
|
60 | | -## Examples |
| 85 | +- Библиотека хранит публичные ключи/атрибуты в JSON-файле. |
| 86 | +- Защищённые служебные поля (внутренние) не сериализуются. |
| 87 | +- При каждом изменении значения данные сохраняются в файл. |
| 88 | +- Сохранение выполняется атомарно (через временный файл и замену), чтобы уменьшить риск повреждения данных. |
61 | 89 |
|
62 | | -### Example 1: Basic CRUD Operations |
| 90 | +--- |
63 | 91 |
|
64 | | -```python |
65 | | -db = DataBase("users.json") |
| 92 | +## Шифрование данных |
66 | 93 |
|
67 | | -# Create |
68 | | -db["user1"] = {"name": "Alice", "age": 30} |
| 94 | +Можно включить простое шифрование при сохранении: |
69 | 95 |
|
70 | | -# Read |
71 | | -user = db["user1"] |
| 96 | +```python |
| 97 | +from dbase import DataBase |
72 | 98 |
|
73 | | -# Update |
74 | | -db["user1"]["age"] = 31 |
| 99 | +db = DataBase( |
| 100 | + file_path="secure.json", |
| 101 | + encryption_key="my-secret-key", |
| 102 | + show_logs=False, |
| 103 | +) |
75 | 104 |
|
76 | | -# Delete |
77 | | -del db["user1"] |
| 105 | +db.api_token = "token-123" |
| 106 | +db.close() |
78 | 107 | ``` |
79 | 108 |
|
80 | | -### Example 2: Configuration Storage |
| 109 | +Что важно: |
| 110 | +- Шифрование включается **только** если указан `encryption_key`. |
| 111 | +- Для чтения зашифрованного файла нужно открыть БД с тем же ключом. |
| 112 | +- Текущая схема — lightweight (XOR + Base64): подходит для базовой обфускации, но не для хранения высокочувствительных данных. |
81 | 113 |
|
82 | | -```python |
83 | | -config = DataBase("config.json") |
| 114 | +--- |
| 115 | + |
| 116 | +## Основной API |
84 | 117 |
|
85 | | -# Set configuration |
86 | | -config.database.host = "localhost" |
87 | | -config.database.port = 5432 |
88 | | -config.app.debug = True |
| 118 | +### Инициализация |
89 | 119 |
|
90 | | -# Get configuration |
91 | | -host = config.database.host |
| 120 | +```python |
| 121 | +DataBase( |
| 122 | + file_path: str | None = None, |
| 123 | + show_logs: bool = True, |
| 124 | + is_temp: bool = False, |
| 125 | + encryption_key: str | None = None, |
| 126 | + auto_cleanup_temp: bool = True, |
| 127 | +) |
92 | 128 | ``` |
93 | 129 |
|
94 | | -### Example 3: Temporary Data |
| 130 | +### Полезные методы |
95 | 131 |
|
96 | | -```python |
97 | | -# Temporary in-memory database |
98 | | -cache = DataBase(is_temp=True) |
| 132 | +- `get(key, default=None)` — безопасное чтение с fallback |
| 133 | +- `update(**kwargs)` — массовое обновление |
| 134 | +- `pop(key, default=None)` — извлечение и удаление |
| 135 | +- `clear()` — очистка всех пользовательских ключей |
| 136 | +- `items()`, `keys()`, `values()` — как у словаря |
| 137 | +- `close()` — явное закрытие файла (и cleanup temp-файла для `is_temp=True`) |
99 | 138 |
|
100 | | -# Store temporary data |
101 | | -cache.session_token = "abc123" |
102 | | -cache.timestamp = "2024-01-01T12:00:00" |
| 139 | +### Поддерживаемые операции |
103 | 140 |
|
104 | | -# Data is lost when program ends |
105 | | -``` |
| 141 | +- `db.key = value` |
| 142 | +- `db["key"] = value` |
| 143 | +- `value = db.key` |
| 144 | +- `value = db["key"]` |
| 145 | +- `"key" in db` |
| 146 | +- `len(db)` |
| 147 | +- `del db["key"]` |
106 | 148 |
|
107 | | -## Best Practices |
| 149 | +--- |
108 | 150 |
|
109 | | -1. **Use context managers** for automatic cleanup: |
110 | | - ```python |
111 | | - with DataBase("data.json") as db: |
112 | | - # Work with database |
113 | | - ``` |
| 151 | +## Практические примеры |
114 | 152 |
|
115 | | -2. **Handle missing keys** safely: |
116 | | - ```python |
117 | | - value = db.get("missing_key", default="default_value") |
118 | | - ``` |
| 153 | +### 1) Настройки приложения |
119 | 154 |
|
120 | | -3. **Use appropriate storage**: |
121 | | - - Persistent files for long-term storage |
122 | | - - Temporary databases for caching |
| 155 | +```python |
| 156 | +from dbase import DataBase |
123 | 157 |
|
124 | | -4. **Enable logging** during development: |
125 | | - ```python |
126 | | - db = DataBase("data.json", show_logs=True) |
127 | | - ``` |
| 158 | +cfg = DataBase("config.json", show_logs=False) |
| 159 | +cfg.app_name = "my-service" |
| 160 | +cfg.debug = True |
| 161 | +cfg.port = 8080 |
| 162 | +cfg.close() |
| 163 | +``` |
128 | 164 |
|
| 165 | +### 2) Временное хранилище |
| 166 | + |
| 167 | +```python |
| 168 | +from dbase import DataBase |
| 169 | + |
| 170 | +with DataBase(is_temp=True, show_logs=False) as cache: |
| 171 | + cache.session_id = "abc123" |
| 172 | + cache.ttl = 300 |
| 173 | +``` |
129 | 174 |
|
130 | | -## Encryption (simple) |
| 175 | +### 3) Работа как со словарём |
131 | 176 |
|
132 | 177 | ```python |
133 | 178 | from dbase import DataBase |
134 | 179 |
|
135 | | -secure_db = DataBase(file_path="secure.json", encryption_key="my-secret-key") |
136 | | -secure_db.api_token = "token-123" |
| 180 | +db = DataBase("users.json", show_logs=False) |
| 181 | +db["u1"] = {"name": "Alice", "age": 30} |
| 182 | +print(db.get("u1")) |
| 183 | +print(db.keys()) |
137 | 184 | ``` |
138 | 185 |
|
139 | | -When `encryption_key` is provided, payload is stored in encrypted form using a lightweight XOR+Base64 scheme (sufficient for basic obfuscation, not for high-security storage). |
| 186 | +--- |
140 | 187 |
|
141 | | -## Docker |
| 188 | +## Запуск тестов и CI/CD |
| 189 | + |
| 190 | +Локально: |
142 | 191 |
|
143 | 192 | ```bash |
144 | | -docker compose up --build |
| 193 | +python -m pip install -e .[dev] |
| 194 | +pytest -q |
145 | 195 | ``` |
146 | 196 |
|
147 | | -This runs the test suite inside a container. |
| 197 | +В репозитории настроены GitHub Actions: |
| 198 | +- **CI**: запускает тесты для Python 3.8 / 3.11 / 3.12 |
| 199 | +- **CD**: собирает wheel/sdist по тегам `v*` |
| 200 | + |
| 201 | +--- |
148 | 202 |
|
149 | | -## Troubleshooting |
| 203 | +## Docker и docker-compose |
150 | 204 |
|
151 | | -### Common Issues |
| 205 | +### Docker build + test |
| 206 | + |
| 207 | +```bash |
| 208 | +docker build -t dbase:local . |
| 209 | +docker run --rm dbase:local |
| 210 | +``` |
| 211 | + |
| 212 | +### docker-compose |
| 213 | + |
| 214 | +```bash |
| 215 | +docker compose up --build |
| 216 | +``` |
152 | 217 |
|
153 | | -1. **File not found errors**: Ensure the directory exists before creating database |
154 | | -2. **Permission errors**: Check file permissions |
155 | | -3. **JSON decode errors**: Verify file contains valid JSON |
156 | | -4. **Type errors**: Ensure you're using string keys |
| 218 | +Команда запускает тесты проекта в контейнере. |
157 | 219 |
|
158 | | -### Getting Help |
| 220 | +--- |
159 | 221 |
|
160 | | -- Check the [GitHub Issues](https://github.com/Danex-Exe/dbase/issues) |
161 | | -- Review the source code |
162 | | -- Submit a bug report with reproduction steps |
| 222 | +## Ограничения и рекомендации |
163 | 223 |
|
164 | | -## License |
| 224 | +1. Храните только JSON-сериализуемые значения. |
| 225 | +2. Для production-секретов используйте полноценную криптографию (а не lightweight-обфускацию). |
| 226 | +3. Используйте `with DataBase(...)` или `close()` для корректного завершения работы с файлами. |
| 227 | +4. Для больших объёмов/конкурентной записи рассмотрите переход на СУБД. |
165 | 228 |
|
166 | | -MIT License - see LICENSE file for details. |
| 229 | +--- |
167 | 230 |
|
168 | | -## Support |
| 231 | +## Лицензия |
169 | 232 |
|
170 | | -This project is maintained by Daniil Alekseev. For support, please open an issue on GitHub. |
| 233 | +MIT License. Подробности в файле `LICENSE`. |
0 commit comments