audex 1.0.7a3__py3-none-any.whl
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.
- audex/__init__.py +9 -0
- audex/__main__.py +7 -0
- audex/cli/__init__.py +189 -0
- audex/cli/apis/__init__.py +12 -0
- audex/cli/apis/init/__init__.py +34 -0
- audex/cli/apis/init/gencfg.py +130 -0
- audex/cli/apis/init/setup.py +330 -0
- audex/cli/apis/init/vprgroup.py +125 -0
- audex/cli/apis/serve.py +141 -0
- audex/cli/args.py +356 -0
- audex/cli/exceptions.py +44 -0
- audex/cli/helper/__init__.py +0 -0
- audex/cli/helper/ansi.py +193 -0
- audex/cli/helper/display.py +288 -0
- audex/config/__init__.py +64 -0
- audex/config/core/__init__.py +30 -0
- audex/config/core/app.py +29 -0
- audex/config/core/audio.py +45 -0
- audex/config/core/logging.py +163 -0
- audex/config/core/session.py +11 -0
- audex/config/helper/__init__.py +1 -0
- audex/config/helper/client/__init__.py +1 -0
- audex/config/helper/client/http.py +28 -0
- audex/config/helper/client/websocket.py +21 -0
- audex/config/helper/provider/__init__.py +1 -0
- audex/config/helper/provider/dashscope.py +13 -0
- audex/config/helper/provider/unisound.py +18 -0
- audex/config/helper/provider/xfyun.py +23 -0
- audex/config/infrastructure/__init__.py +31 -0
- audex/config/infrastructure/cache.py +51 -0
- audex/config/infrastructure/database.py +48 -0
- audex/config/infrastructure/recorder.py +32 -0
- audex/config/infrastructure/store.py +19 -0
- audex/config/provider/__init__.py +18 -0
- audex/config/provider/transcription.py +109 -0
- audex/config/provider/vpr.py +99 -0
- audex/container.py +40 -0
- audex/entity/__init__.py +468 -0
- audex/entity/doctor.py +109 -0
- audex/entity/doctor.pyi +51 -0
- audex/entity/fields.py +401 -0
- audex/entity/segment.py +115 -0
- audex/entity/segment.pyi +38 -0
- audex/entity/session.py +133 -0
- audex/entity/session.pyi +47 -0
- audex/entity/utterance.py +142 -0
- audex/entity/utterance.pyi +48 -0
- audex/entity/vp.py +68 -0
- audex/entity/vp.pyi +35 -0
- audex/exceptions.py +157 -0
- audex/filters/__init__.py +692 -0
- audex/filters/generated/__init__.py +21 -0
- audex/filters/generated/doctor.py +987 -0
- audex/filters/generated/segment.py +723 -0
- audex/filters/generated/session.py +978 -0
- audex/filters/generated/utterance.py +939 -0
- audex/filters/generated/vp.py +815 -0
- audex/helper/__init__.py +1 -0
- audex/helper/hash.py +33 -0
- audex/helper/mixin.py +65 -0
- audex/helper/net.py +19 -0
- audex/helper/settings/__init__.py +830 -0
- audex/helper/settings/fields.py +317 -0
- audex/helper/stream.py +153 -0
- audex/injectors/__init__.py +1 -0
- audex/injectors/config.py +12 -0
- audex/injectors/lifespan.py +7 -0
- audex/lib/__init__.py +1 -0
- audex/lib/cache/__init__.py +383 -0
- audex/lib/cache/inmemory.py +513 -0
- audex/lib/database/__init__.py +83 -0
- audex/lib/database/sqlite.py +406 -0
- audex/lib/exporter.py +189 -0
- audex/lib/injectors/__init__.py +1 -0
- audex/lib/injectors/cache.py +25 -0
- audex/lib/injectors/container.py +47 -0
- audex/lib/injectors/exporter.py +26 -0
- audex/lib/injectors/recorder.py +33 -0
- audex/lib/injectors/server.py +17 -0
- audex/lib/injectors/session.py +18 -0
- audex/lib/injectors/sqlite.py +24 -0
- audex/lib/injectors/store.py +13 -0
- audex/lib/injectors/transcription.py +42 -0
- audex/lib/injectors/usb.py +12 -0
- audex/lib/injectors/vpr.py +65 -0
- audex/lib/injectors/wifi.py +7 -0
- audex/lib/recorder.py +844 -0
- audex/lib/repos/__init__.py +149 -0
- audex/lib/repos/container.py +23 -0
- audex/lib/repos/database/__init__.py +1 -0
- audex/lib/repos/database/sqlite.py +672 -0
- audex/lib/repos/decorators.py +74 -0
- audex/lib/repos/doctor.py +286 -0
- audex/lib/repos/segment.py +302 -0
- audex/lib/repos/session.py +285 -0
- audex/lib/repos/tables/__init__.py +70 -0
- audex/lib/repos/tables/doctor.py +137 -0
- audex/lib/repos/tables/segment.py +113 -0
- audex/lib/repos/tables/session.py +140 -0
- audex/lib/repos/tables/utterance.py +131 -0
- audex/lib/repos/tables/vp.py +102 -0
- audex/lib/repos/utterance.py +288 -0
- audex/lib/repos/vp.py +286 -0
- audex/lib/restful.py +251 -0
- audex/lib/server/__init__.py +97 -0
- audex/lib/server/auth.py +98 -0
- audex/lib/server/handlers.py +248 -0
- audex/lib/server/templates/index.html.j2 +226 -0
- audex/lib/server/templates/login.html.j2 +111 -0
- audex/lib/server/templates/static/script.js +68 -0
- audex/lib/server/templates/static/style.css +579 -0
- audex/lib/server/types.py +123 -0
- audex/lib/session.py +503 -0
- audex/lib/store/__init__.py +238 -0
- audex/lib/store/localfile.py +411 -0
- audex/lib/transcription/__init__.py +33 -0
- audex/lib/transcription/dashscope.py +525 -0
- audex/lib/transcription/events.py +62 -0
- audex/lib/usb.py +554 -0
- audex/lib/vpr/__init__.py +38 -0
- audex/lib/vpr/unisound/__init__.py +185 -0
- audex/lib/vpr/unisound/types.py +469 -0
- audex/lib/vpr/xfyun/__init__.py +483 -0
- audex/lib/vpr/xfyun/types.py +679 -0
- audex/lib/websocket/__init__.py +8 -0
- audex/lib/websocket/connection.py +485 -0
- audex/lib/websocket/pool.py +991 -0
- audex/lib/wifi.py +1146 -0
- audex/lifespan.py +75 -0
- audex/service/__init__.py +27 -0
- audex/service/decorators.py +73 -0
- audex/service/doctor/__init__.py +652 -0
- audex/service/doctor/const.py +36 -0
- audex/service/doctor/exceptions.py +96 -0
- audex/service/doctor/types.py +54 -0
- audex/service/export/__init__.py +236 -0
- audex/service/export/const.py +17 -0
- audex/service/export/exceptions.py +34 -0
- audex/service/export/types.py +21 -0
- audex/service/injectors/__init__.py +1 -0
- audex/service/injectors/container.py +53 -0
- audex/service/injectors/doctor.py +34 -0
- audex/service/injectors/export.py +27 -0
- audex/service/injectors/session.py +49 -0
- audex/service/session/__init__.py +754 -0
- audex/service/session/const.py +34 -0
- audex/service/session/exceptions.py +67 -0
- audex/service/session/types.py +91 -0
- audex/types.py +39 -0
- audex/utils.py +287 -0
- audex/valueobj/__init__.py +81 -0
- audex/valueobj/common/__init__.py +1 -0
- audex/valueobj/common/auth.py +84 -0
- audex/valueobj/common/email.py +16 -0
- audex/valueobj/common/ops.py +22 -0
- audex/valueobj/common/phone.py +84 -0
- audex/valueobj/common/version.py +72 -0
- audex/valueobj/session.py +19 -0
- audex/valueobj/utterance.py +15 -0
- audex/view/__init__.py +51 -0
- audex/view/container.py +17 -0
- audex/view/decorators.py +303 -0
- audex/view/pages/__init__.py +1 -0
- audex/view/pages/dashboard/__init__.py +286 -0
- audex/view/pages/dashboard/wifi.py +407 -0
- audex/view/pages/login.py +110 -0
- audex/view/pages/recording.py +348 -0
- audex/view/pages/register.py +202 -0
- audex/view/pages/sessions/__init__.py +196 -0
- audex/view/pages/sessions/details.py +224 -0
- audex/view/pages/sessions/export.py +443 -0
- audex/view/pages/settings.py +374 -0
- audex/view/pages/voiceprint/__init__.py +1 -0
- audex/view/pages/voiceprint/enroll.py +195 -0
- audex/view/pages/voiceprint/update.py +195 -0
- audex/view/static/css/dashboard.css +452 -0
- audex/view/static/css/glass.css +22 -0
- audex/view/static/css/global.css +541 -0
- audex/view/static/css/login.css +386 -0
- audex/view/static/css/recording.css +439 -0
- audex/view/static/css/register.css +293 -0
- audex/view/static/css/sessions/styles.css +501 -0
- audex/view/static/css/settings.css +186 -0
- audex/view/static/css/voiceprint/enroll.css +43 -0
- audex/view/static/css/voiceprint/styles.css +209 -0
- audex/view/static/css/voiceprint/update.css +44 -0
- audex/view/static/images/logo.svg +95 -0
- audex/view/static/js/recording.js +42 -0
- audex-1.0.7a3.dist-info/METADATA +361 -0
- audex-1.0.7a3.dist-info/RECORD +192 -0
- audex-1.0.7a3.dist-info/WHEEL +4 -0
- audex-1.0.7a3.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import abc
|
|
4
|
+
import builtins
|
|
5
|
+
import inspect
|
|
6
|
+
import typing as t
|
|
7
|
+
|
|
8
|
+
from audex.entity import BaseEntity
|
|
9
|
+
from audex.filters import Filter
|
|
10
|
+
|
|
11
|
+
E = t.TypeVar("E", bound=BaseEntity)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RepositoryMeta(abc.ABCMeta):
|
|
15
|
+
"""Metaclass that automatically applies decorators to repository
|
|
16
|
+
methods.
|
|
17
|
+
|
|
18
|
+
Supports configuration via class inheritance:
|
|
19
|
+
|
|
20
|
+
Example:
|
|
21
|
+
```python
|
|
22
|
+
# Enable logging (default)
|
|
23
|
+
class UserRepository(MongoRepository[User]):
|
|
24
|
+
pass
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# Disable logging
|
|
28
|
+
class UserRepository(MongoRepository[User], log=False):
|
|
29
|
+
pass
|
|
30
|
+
```
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __new__(
|
|
34
|
+
mcs,
|
|
35
|
+
name: str,
|
|
36
|
+
bases: tuple[type, ...],
|
|
37
|
+
namespace: dict[str, t.Any],
|
|
38
|
+
log: bool = True,
|
|
39
|
+
**kwargs: t.Any,
|
|
40
|
+
) -> type:
|
|
41
|
+
cls = super().__new__(mcs, name, bases, namespace, **kwargs)
|
|
42
|
+
|
|
43
|
+
# Skip decoration for abstract base classes
|
|
44
|
+
if abc.ABC in bases:
|
|
45
|
+
return cls
|
|
46
|
+
|
|
47
|
+
# Check if this is a concrete repository (inherits from BaseRepository)
|
|
48
|
+
is_repository = any(
|
|
49
|
+
isinstance(base, RepositoryMeta) and hasattr(base, "__repotype__") for base in bases
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
if not is_repository:
|
|
53
|
+
return cls
|
|
54
|
+
|
|
55
|
+
# Skip if log is disabled
|
|
56
|
+
if not log:
|
|
57
|
+
return cls
|
|
58
|
+
|
|
59
|
+
# Import decorator only when needed
|
|
60
|
+
from audex.lib.repos.decorators import log_repo_call
|
|
61
|
+
|
|
62
|
+
# Get all public methods (not starting with _)
|
|
63
|
+
for attr_name in dir(cls):
|
|
64
|
+
# Skip private/protected methods
|
|
65
|
+
if attr_name.startswith("_"):
|
|
66
|
+
continue
|
|
67
|
+
|
|
68
|
+
attr = getattr(cls, attr_name)
|
|
69
|
+
|
|
70
|
+
# Skip if not a method
|
|
71
|
+
if not inspect.ismethod(attr) and not inspect.isfunction(attr):
|
|
72
|
+
continue
|
|
73
|
+
|
|
74
|
+
# Skip if already decorated (has marker attribute)
|
|
75
|
+
if hasattr(attr, "_repo_decorated"):
|
|
76
|
+
continue
|
|
77
|
+
|
|
78
|
+
# Skip properties, classmethods, staticmethods
|
|
79
|
+
if isinstance(
|
|
80
|
+
inspect.getattr_static(cls, attr_name), (property | classmethod | staticmethod)
|
|
81
|
+
):
|
|
82
|
+
continue
|
|
83
|
+
|
|
84
|
+
# Skip if not an async function
|
|
85
|
+
if not inspect.iscoroutinefunction(attr):
|
|
86
|
+
continue
|
|
87
|
+
|
|
88
|
+
# Apply log decorator
|
|
89
|
+
decorated = log_repo_call(attr)
|
|
90
|
+
|
|
91
|
+
# Mark as decorated to avoid double decoration
|
|
92
|
+
decorated._repo_decorated = True # type: ignore
|
|
93
|
+
|
|
94
|
+
# Replace the method
|
|
95
|
+
setattr(cls, attr_name, decorated)
|
|
96
|
+
|
|
97
|
+
return cls
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class BaseRepository(abc.ABC, t.Generic[E], metaclass=RepositoryMeta):
|
|
101
|
+
"""Abstract base repository for generic CRUD operations.
|
|
102
|
+
|
|
103
|
+
This class defines the standard CRUD interface that all repositories
|
|
104
|
+
must implement, regardless of the underlying database technology.
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
__repotype__: t.ClassVar[str] # e.g., "mongodb", "postgresql", "sqlite"
|
|
108
|
+
|
|
109
|
+
def __init_subclass__(cls, **kwargs: t.Any) -> None:
|
|
110
|
+
super().__init_subclass__(**kwargs)
|
|
111
|
+
if not hasattr(cls, "__repotype__"):
|
|
112
|
+
raise NotImplementedError(
|
|
113
|
+
f"Subclass {cls.__name__} must define __repotype__ class variable"
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
@abc.abstractmethod
|
|
117
|
+
async def create(self, data: E, /) -> str: ...
|
|
118
|
+
@abc.abstractmethod
|
|
119
|
+
async def read(self, id: str, /) -> E | None: ...
|
|
120
|
+
@abc.abstractmethod
|
|
121
|
+
async def first(self, filter: Filter) -> E | None: ...
|
|
122
|
+
@abc.abstractmethod
|
|
123
|
+
async def list(
|
|
124
|
+
self,
|
|
125
|
+
arg: builtins.list[str] | t.Optional[Filter] = None, # noqa
|
|
126
|
+
*,
|
|
127
|
+
page_index: int = 0,
|
|
128
|
+
page_size: int = 100,
|
|
129
|
+
) -> builtins.list[E]: ...
|
|
130
|
+
@abc.abstractmethod
|
|
131
|
+
async def update(self, data: E, /) -> str: ...
|
|
132
|
+
@abc.abstractmethod
|
|
133
|
+
async def update_many(self, datas: builtins.list[E]) -> builtins.list[str]: ...
|
|
134
|
+
@abc.abstractmethod
|
|
135
|
+
async def delete(self, id: str, /) -> bool: ...
|
|
136
|
+
@abc.abstractmethod
|
|
137
|
+
async def delete_many(
|
|
138
|
+
self,
|
|
139
|
+
arg: builtins.list[str] | t.Optional[Filter] = None, # noqa
|
|
140
|
+
) -> builtins.list[str]: ...
|
|
141
|
+
@abc.abstractmethod
|
|
142
|
+
async def count(self, filter: t.Optional[Filter] = None) -> int: ... # noqa
|
|
143
|
+
|
|
144
|
+
async def exists(self, filter: Filter) -> bool:
|
|
145
|
+
count = await self.count(filter)
|
|
146
|
+
return count > 0
|
|
147
|
+
|
|
148
|
+
def __repr__(self) -> str:
|
|
149
|
+
return f"REPOSITORY <{self.__class__.__name__}>"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dependency_injector import containers
|
|
4
|
+
from dependency_injector import providers
|
|
5
|
+
|
|
6
|
+
from audex.lib.database.sqlite import SQLite
|
|
7
|
+
from audex.lib.repos.doctor import DoctorRepository
|
|
8
|
+
from audex.lib.repos.segment import SegmentRepository
|
|
9
|
+
from audex.lib.repos.session import SessionRepository
|
|
10
|
+
from audex.lib.repos.utterance import UtteranceRepository
|
|
11
|
+
from audex.lib.repos.vp import VPRepository
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RepositoryContainer(containers.DeclarativeContainer):
|
|
15
|
+
# Dependencies
|
|
16
|
+
sqlite = providers.Dependency(instance_of=SQLite)
|
|
17
|
+
|
|
18
|
+
# Components
|
|
19
|
+
doctor = providers.Factory(DoctorRepository, sqlite=sqlite)
|
|
20
|
+
segment = providers.Factory(SegmentRepository, sqlite=sqlite)
|
|
21
|
+
session = providers.Factory(SessionRepository, sqlite=sqlite)
|
|
22
|
+
utterance = providers.Factory(UtteranceRepository, sqlite=sqlite)
|
|
23
|
+
vp = providers.Factory(VPRepository, sqlite=sqlite)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from __future__ import annotations
|