s-librarykit 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. s_librarykit-0.1.0/.gitignore +47 -0
  2. s_librarykit-0.1.0/AGENTS.md +38 -0
  3. s_librarykit-0.1.0/LICENSE +21 -0
  4. s_librarykit-0.1.0/PKG-INFO +84 -0
  5. s_librarykit-0.1.0/README.md +54 -0
  6. s_librarykit-0.1.0/librarykit/__init__.py +238 -0
  7. s_librarykit-0.1.0/librarykit/antibot.py +467 -0
  8. s_librarykit-0.1.0/librarykit/auth.py +423 -0
  9. s_librarykit-0.1.0/librarykit/browser.py +722 -0
  10. s_librarykit-0.1.0/librarykit/checkpoint.py +187 -0
  11. s_librarykit-0.1.0/librarykit/config_util.py +281 -0
  12. s_librarykit-0.1.0/librarykit/contract.py +376 -0
  13. s_librarykit-0.1.0/librarykit/entities.py +151 -0
  14. s_librarykit-0.1.0/librarykit/enums.py +42 -0
  15. s_librarykit-0.1.0/librarykit/errmap.py +352 -0
  16. s_librarykit-0.1.0/librarykit/errors.py +261 -0
  17. s_librarykit-0.1.0/librarykit/orchestration/__init__.py +43 -0
  18. s_librarykit-0.1.0/librarykit/orchestration/health.py +308 -0
  19. s_librarykit-0.1.0/librarykit/orchestration/onboarding.py +428 -0
  20. s_librarykit-0.1.0/librarykit/orchestration/session_loader.py +121 -0
  21. s_librarykit-0.1.0/librarykit/pagination.py +368 -0
  22. s_librarykit-0.1.0/librarykit/ports.py +95 -0
  23. s_librarykit-0.1.0/librarykit/protocols.py +183 -0
  24. s_librarykit-0.1.0/librarykit/retry.py +287 -0
  25. s_librarykit-0.1.0/librarykit/rpc.py +191 -0
  26. s_librarykit-0.1.0/librarykit/secret_store.py +184 -0
  27. s_librarykit-0.1.0/librarykit/sessions.py +811 -0
  28. s_librarykit-0.1.0/librarykit/stream.py +166 -0
  29. s_librarykit-0.1.0/librarykit/transport.py +738 -0
  30. s_librarykit-0.1.0/pyproject.toml +62 -0
  31. s_librarykit-0.1.0/tests/conftest.py +60 -0
  32. s_librarykit-0.1.0/tests/test_antibot.py +311 -0
  33. s_librarykit-0.1.0/tests/test_auth.py +329 -0
  34. s_librarykit-0.1.0/tests/test_browser.py +424 -0
  35. s_librarykit-0.1.0/tests/test_checkpoint.py +60 -0
  36. s_librarykit-0.1.0/tests/test_config_util.py +82 -0
  37. s_librarykit-0.1.0/tests/test_errmap.py +284 -0
  38. s_librarykit-0.1.0/tests/test_errors.py +73 -0
  39. s_librarykit-0.1.0/tests/test_orchestration.py +646 -0
  40. s_librarykit-0.1.0/tests/test_pagination.py +410 -0
  41. s_librarykit-0.1.0/tests/test_retry.py +96 -0
  42. s_librarykit-0.1.0/tests/test_rpc.py +221 -0
  43. s_librarykit-0.1.0/tests/test_sessions.py +462 -0
  44. s_librarykit-0.1.0/tests/test_stream.py +160 -0
  45. s_librarykit-0.1.0/tests/test_transport_client.py +332 -0
  46. s_librarykit-0.1.0/tests/test_transport_rest.py +419 -0
  47. s_librarykit-0.1.0/uv.lock +832 -0
@@ -0,0 +1,47 @@
1
+ # === atlas universal gitignore ===
2
+
3
+ # OS / IDE
4
+ .DS_Store
5
+ Thumbs.db
6
+ .vscode/
7
+ .idea/
8
+ *.swp
9
+ *.swo
10
+
11
+ # Sensitive
12
+ .env
13
+ .env.local
14
+ *.key
15
+ *.pem
16
+ secrets/
17
+ private/
18
+
19
+ # Python
20
+ __pycache__/
21
+ *.py[cod]
22
+ .venv/
23
+ venv/
24
+ .pytest_cache/
25
+ .ruff_cache/
26
+ *.egg-info/
27
+
28
+ # Node / JS
29
+ node_modules/
30
+ .next/
31
+ dist/
32
+ build/
33
+
34
+ # Temporary / large
35
+ *.log
36
+ *.tmp
37
+ nul
38
+ NUL
39
+ *.zip
40
+ *.rar
41
+ *.7z
42
+
43
+ # Media (selectively unignore via !path/*.ext if needed for fixtures)
44
+ *.mp4
45
+ *.mov
46
+ *.avi
47
+ *.mkv
@@ -0,0 +1,38 @@
1
+ # AGENTS.md — librarykit
2
+
3
+ > Контекст для AI-ассистентов (Claude Code, ChatGPT, Cursor и т.п.), работающих
4
+ > над этим проектом.
5
+
6
+ ## Что это
7
+
8
+ Pure-stdlib кит-дедупликатор: checkpoint/resume, error-иерархия, self-heal-классификатор, secure-store, config-утили (deep_merge/interpolate_env/atomic_write/slugify), base RetryPolicy, pagination — общий код вместо копипасты в clikit/adapterkit/reverse-factory
9
+
10
+ ## Atlas
11
+
12
+ Проект зарегистрирован в Atlas-БД (NP-005). Карточка:
13
+
14
+ ```sh
15
+ atlas projects get librarykit
16
+ ```
17
+
18
+ Любые изменения метаданных (приоритет, статус, теги) — через atlas CLI:
19
+
20
+ - `atlas projects update librarykit --priority P0` — поменять приоритет
21
+ - `atlas add-tags librarykit -t domain:<slug>` — добавить тег
22
+ - `atlas projects move librarykit --to-type <type>` — конвертировать тип
23
+
24
+ ## Тип / Статус (на момент создания)
25
+
26
+ - type=`shared-infrastructure`, status=`experiment`, priority=`P1`
27
+
28
+ ## Правила работы
29
+
30
+ - Все исходные тексты, документы, код проекта — в этом репо.
31
+ - Чувствительные данные (`.env`, токены, ключи) — игнорируются `.gitignore`.
32
+ - AI-ассистенту разрешено: читать, генерировать, редактировать в этом репо.
33
+
34
+ ## Канонические команды
35
+
36
+ - `atlas projects get librarykit` — карточка проекта
37
+ - `atlas pm-tasks list --project librarykit` — задачи проекта (когда W7
38
+ волна будет реализована)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Dmitry
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,84 @@
1
+ Metadata-Version: 2.4
2
+ Name: s-librarykit
3
+ Version: 0.1.0
4
+ Summary: Жирный КОРЕНЬ китов: единая error-иерархия, config/retry/paths-утили, checkpoint/resume — общий код для clikit/adapterkit/reverse-factory.
5
+ Author: Dmitry
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Requires-Python: >=3.11
9
+ Requires-Dist: cryptography>=43
10
+ Requires-Dist: httpx>=0.27
11
+ Requires-Dist: keyring>=25.0
12
+ Requires-Dist: oschmod>=0.3
13
+ Requires-Dist: platformdirs>=4.0
14
+ Requires-Dist: stamina>=24.3
15
+ Requires-Dist: tomli-w>=1.0
16
+ Provides-Extra: antibot
17
+ Requires-Dist: curl-cffi>=0.7; extra == 'antibot'
18
+ Provides-Extra: browser
19
+ Requires-Dist: playwright>=1.40; extra == 'browser'
20
+ Provides-Extra: dev
21
+ Requires-Dist: hypothesis>=6; extra == 'dev'
22
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
23
+ Requires-Dist: pytest>=8; extra == 'dev'
24
+ Requires-Dist: respx>=0.21; extra == 'dev'
25
+ Provides-Extra: oauth
26
+ Requires-Dist: authlib>=1.3; extra == 'oauth'
27
+ Provides-Extra: ws
28
+ Requires-Dist: websockets>=12.0; extra == 'ws'
29
+ Description-Content-Type: text/markdown
30
+
31
+ # librarykit
32
+
33
+ > Pure-stdlib кит-дедупликатор: checkpoint/resume, error-иерархия, self-heal-классификатор, secure-store, config-утили (deep_merge/interpolate_env/atomic_write/slugify), base RetryPolicy, pagination — общий код вместо копипасты в clikit/adapterkit/reverse-factory
34
+
35
+ ## Статус
36
+
37
+ - **Type**: `shared-infrastructure`
38
+ - **Status**: `experiment`
39
+ - **Priority**: P1
40
+ - **Slug**: `librarykit`
41
+ - **Prefix**: `lib`
42
+ - **Tags**: —
43
+ - Создан: 2026-06-22
44
+
45
+ ## Atlas
46
+
47
+ Карточка проекта в Atlas-БД (NP-005):
48
+
49
+ ```sh
50
+ atlas projects get librarykit
51
+ ```
52
+
53
+ Физический layout:
54
+
55
+ - Storage: `_storage/librarykit/`
56
+ - Junction: `Products\librarykit` → `_storage/librarykit`
57
+
58
+ ## Состав (lib-E1)
59
+
60
+ Ядро — **только stdlib**, без runtime-зависимостей.
61
+
62
+ - `librarykit.checkpoint` — `Checkpoint` (атомарный JSON-state),
63
+ `JsonlSink` (append-only forensic-лог), `RunMetrics` (таймер + счётчики).
64
+ - `librarykit.errors` — базовая иерархия `ApiError` + подклассы
65
+ (`AuthRequired` 401/403, `NotFoundError` 404, `RateLimited` 429,
66
+ `ValidationError` 4xx, `ServerError` 5xx, `TransportError`) + `RETRYABLE`.
67
+ - `librarykit.config_util` — `deep_merge`, `interpolate_env`, `load_dotenv`,
68
+ `atomic_write_text`, `slugify`.
69
+
70
+ ## Установка / тесты
71
+
72
+ ```sh
73
+ uv sync --extra dev
74
+ uv run --extra dev pytest -q
75
+ ```
76
+
77
+ ## Лицензия
78
+
79
+ MIT, (c) 2026 Dmitry.
80
+
81
+ ## TODO
82
+
83
+ - [ ] Подключить GitLab-репозиторий (если ещё нет): `atlas projects git init librarykit`.
84
+ - [ ] Шаг 3+ эпика lib-E1: заменить импорты в clikit/rf на librarykit.
@@ -0,0 +1,54 @@
1
+ # librarykit
2
+
3
+ > Pure-stdlib кит-дедупликатор: checkpoint/resume, error-иерархия, self-heal-классификатор, secure-store, config-утили (deep_merge/interpolate_env/atomic_write/slugify), base RetryPolicy, pagination — общий код вместо копипасты в clikit/adapterkit/reverse-factory
4
+
5
+ ## Статус
6
+
7
+ - **Type**: `shared-infrastructure`
8
+ - **Status**: `experiment`
9
+ - **Priority**: P1
10
+ - **Slug**: `librarykit`
11
+ - **Prefix**: `lib`
12
+ - **Tags**: —
13
+ - Создан: 2026-06-22
14
+
15
+ ## Atlas
16
+
17
+ Карточка проекта в Atlas-БД (NP-005):
18
+
19
+ ```sh
20
+ atlas projects get librarykit
21
+ ```
22
+
23
+ Физический layout:
24
+
25
+ - Storage: `_storage/librarykit/`
26
+ - Junction: `Products\librarykit` → `_storage/librarykit`
27
+
28
+ ## Состав (lib-E1)
29
+
30
+ Ядро — **только stdlib**, без runtime-зависимостей.
31
+
32
+ - `librarykit.checkpoint` — `Checkpoint` (атомарный JSON-state),
33
+ `JsonlSink` (append-only forensic-лог), `RunMetrics` (таймер + счётчики).
34
+ - `librarykit.errors` — базовая иерархия `ApiError` + подклассы
35
+ (`AuthRequired` 401/403, `NotFoundError` 404, `RateLimited` 429,
36
+ `ValidationError` 4xx, `ServerError` 5xx, `TransportError`) + `RETRYABLE`.
37
+ - `librarykit.config_util` — `deep_merge`, `interpolate_env`, `load_dotenv`,
38
+ `atomic_write_text`, `slugify`.
39
+
40
+ ## Установка / тесты
41
+
42
+ ```sh
43
+ uv sync --extra dev
44
+ uv run --extra dev pytest -q
45
+ ```
46
+
47
+ ## Лицензия
48
+
49
+ MIT, (c) 2026 Dmitry.
50
+
51
+ ## TODO
52
+
53
+ - [ ] Подключить GitLab-репозиторий (если ещё нет): `atlas projects git init librarykit`.
54
+ - [ ] Шаг 3+ эпика lib-E1: заменить импорты в clikit/rf на librarykit.
@@ -0,0 +1,238 @@
1
+ """librarykit — жирный КОРЕНЬ китов (граф librarykit <- adapterkit <- clikit).
2
+
3
+ Общий код вместо дублирования в clikit/adapterkit/reverse-factory: единая
4
+ error-иерархия (ERROR-HUB), config/paths-утили, политики повторов, checkpoint.
5
+ Почти-stdlib (единственная не-stdlib зависимость — platformdirs для AppPaths).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from librarykit.auth import (
11
+ BrowserLoginAuth,
12
+ CookieSessionAuth,
13
+ OAuth2Auth,
14
+ TokenAuth,
15
+ decrypt_settings,
16
+ dump_settings,
17
+ encrypt_settings,
18
+ load_settings,
19
+ )
20
+ from librarykit.checkpoint import Checkpoint, JsonlSink, RunMetrics
21
+ from librarykit.config_util import (
22
+ AppPaths,
23
+ atomic_write_text,
24
+ chmod_600,
25
+ deep_merge,
26
+ interpolate_env,
27
+ load_dotenv,
28
+ normalize_account_id,
29
+ slugify,
30
+ )
31
+ from librarykit.contract import (
32
+ Auth,
33
+ AuthMode,
34
+ Codec,
35
+ Creds,
36
+ ErrorMapper,
37
+ PaginationMode,
38
+ Paginator,
39
+ Refreshable,
40
+ RequestBody,
41
+ ResponseLike,
42
+ SessionRef,
43
+ SessionStoreProtocol,
44
+ StreamTransport,
45
+ Transport,
46
+ TransportKind,
47
+ )
48
+ from librarykit.entities import (
49
+ HealthReport,
50
+ Session,
51
+ SessionChanges,
52
+ SessionContext,
53
+ )
54
+ from librarykit.errmap import (
55
+ DEFAULT_ERROR_MAP,
56
+ AuthExpired,
57
+ BodyRule,
58
+ ErrorMap,
59
+ ErrorMapBuilder,
60
+ ExcFactory,
61
+ build_error_map,
62
+ )
63
+ from librarykit.errors import (
64
+ RETRYABLE,
65
+ AdapterError,
66
+ ApiError,
67
+ AuthRequired,
68
+ Blocked,
69
+ CliError,
70
+ NotFound,
71
+ NotFoundError,
72
+ NotImplementedYet,
73
+ RateLimited,
74
+ ServerError,
75
+ SessionExpired,
76
+ TransportError,
77
+ ValidationError,
78
+ )
79
+ from librarykit.pagination import (
80
+ DEFAULT_PAGE_PARAMS,
81
+ CursorExtractor,
82
+ CursorPaginator,
83
+ ItemsExtractor,
84
+ PageParams,
85
+ default_extract_cursor,
86
+ default_extract_items,
87
+ with_page_params,
88
+ )
89
+ from librarykit.protocols import (
90
+ HealthProtocol,
91
+ HealthState,
92
+ HealthStatus,
93
+ InteractiveFlow,
94
+ LoginMode,
95
+ LoginRequirements,
96
+ OnboardingProtocol,
97
+ )
98
+ from librarykit.retry import (
99
+ DEFAULT_RETRY,
100
+ DEFAULT_SIMPLE_RETRY,
101
+ RetryPolicy,
102
+ SimpleRetryPolicy,
103
+ )
104
+
105
+ # Мультипротокол (E1): RPC codec-слой (rpc) + stream-транспорты (stream). WS-
106
+ # reference (`WebSocketsStreamTransport`) тянет extra [ws] lazy ВНУТРИ конструктора,
107
+ # поэтому реэкспорт безопасен — `import librarykit` без extra не падает.
108
+ from librarykit.rpc import JsonCodec, PrefixedJsonCodec, RpcClient
109
+ from librarykit.secret_store import SecretStore
110
+ from librarykit.sessions import (
111
+ KekUnavailableError,
112
+ SessionStore,
113
+ SessionStoreError,
114
+ resolve_kek,
115
+ )
116
+ from librarykit.stream import (
117
+ StreamClosedError,
118
+ StubStreamTransport,
119
+ WebSocketsStreamTransport,
120
+ )
121
+
122
+ # Транспортный слой (W4): choke-point `HttpClient` + конкретный `HttpxTransport`.
123
+ # `RestHttpClient`/`ApiError`/`RefreshCallback` НЕ ре-экспортируются на верхний
124
+ # уровень — у librarykit.errors уже есть свой `ApiError` (алиас CliError), и REST-
125
+ # клиент берётся адресно из `librarykit.transport` (его тянет shim clikit.transport).
126
+ from librarykit.transport import HttpClient, HttpxTransport
127
+
128
+ __version__ = "0.1.0"
129
+
130
+ __all__ = [
131
+ "__version__",
132
+ # checkpoint
133
+ "Checkpoint",
134
+ "JsonlSink",
135
+ "RunMetrics",
136
+ # errors (единая иерархия ERROR-HUB)
137
+ "CliError",
138
+ "ApiError",
139
+ "AuthRequired",
140
+ "SessionExpired",
141
+ "RateLimited",
142
+ "ValidationError",
143
+ "NotImplementedYet",
144
+ "NotFoundError",
145
+ "ServerError",
146
+ "TransportError",
147
+ "Blocked",
148
+ "RETRYABLE",
149
+ "AdapterError",
150
+ "NotFound",
151
+ # config_util / paths
152
+ "deep_merge",
153
+ "interpolate_env",
154
+ "load_dotenv",
155
+ "slugify",
156
+ "normalize_account_id",
157
+ "atomic_write_text",
158
+ "chmod_600",
159
+ "AppPaths",
160
+ # contract — generic «талия» (Protocol + enums + DTO координат сессии/кредов)
161
+ "PaginationMode",
162
+ "AuthMode",
163
+ "TransportKind",
164
+ "SessionRef",
165
+ "Creds",
166
+ "RequestBody",
167
+ "ResponseLike",
168
+ "Transport",
169
+ "StreamTransport",
170
+ "Codec",
171
+ "Auth",
172
+ "Refreshable",
173
+ "ErrorMapper",
174
+ "Paginator",
175
+ "SessionStoreProtocol",
176
+ # protocols — онбординг/health контракты (опциональные)
177
+ "LoginMode",
178
+ "LoginRequirements",
179
+ "InteractiveFlow",
180
+ "OnboardingProtocol",
181
+ "HealthState",
182
+ "HealthStatus",
183
+ "HealthProtocol",
184
+ # entities (W6) — нейтральные data-классы оркестраторов (почва под W7)
185
+ "Session",
186
+ "SessionChanges",
187
+ "SessionContext",
188
+ "HealthReport",
189
+ # secret_store — keyring + file-fallback
190
+ "SecretStore",
191
+ # sessions (W4): envelope-шифрованное хранилище сессий (spec §4)
192
+ "SessionStore",
193
+ "SessionStoreError",
194
+ "KekUnavailableError",
195
+ "resolve_kek",
196
+ # transport (W4): конкретный httpx-транспорт + choke-point клиент
197
+ "HttpxTransport",
198
+ "HttpClient",
199
+ # rpc (E1): codec-слой + RPC choke-point поверх HttpClient
200
+ "JsonCodec",
201
+ "PrefixedJsonCodec",
202
+ "RpcClient",
203
+ # stream (E1): WS-подобные persistent-транспорты (Stub + websockets reference)
204
+ "StubStreamTransport",
205
+ "WebSocketsStreamTransport",
206
+ "StreamClosedError",
207
+ # errmap (W4): декларативная карта HTTP-ответ → доменная ошибка
208
+ "ErrorMap",
209
+ "ErrorMapBuilder",
210
+ "BodyRule",
211
+ "ExcFactory",
212
+ "AuthExpired",
213
+ "build_error_map",
214
+ "DEFAULT_ERROR_MAP",
215
+ # pagination (W4): листатель ресурса (offset/cursor/page) tweepy-стиля
216
+ "CursorPaginator",
217
+ "PageParams",
218
+ "DEFAULT_PAGE_PARAMS",
219
+ "ItemsExtractor",
220
+ "CursorExtractor",
221
+ "default_extract_items",
222
+ "default_extract_cursor",
223
+ "with_page_params",
224
+ # auth (W4): стратегии авторизации + персистентность сессии
225
+ "TokenAuth",
226
+ "CookieSessionAuth",
227
+ "OAuth2Auth",
228
+ "BrowserLoginAuth",
229
+ "dump_settings",
230
+ "load_settings",
231
+ "encrypt_settings",
232
+ "decrypt_settings",
233
+ # retry
234
+ "RetryPolicy",
235
+ "DEFAULT_RETRY",
236
+ "SimpleRetryPolicy",
237
+ "DEFAULT_SIMPLE_RETRY",
238
+ ]