From 387cef19a2341b163e5b731646f1bf2656ec0eca Mon Sep 17 00:00:00 2001 From: SekachVitaliy Date: Mon, 11 Sep 2023 08:28:03 +0300 Subject: [PATCH 1/5] feat: update version of some library --- docs/gen_ref_pages.py | 3 - msaBase/__init__.py | 6 +- msaBase/configurate.py | 5 +- msaBase/logger.py | 9 -- msaBase/models/settings.py | 2 +- msaBase/models/sysinfo.py | 197 ++++++++++++++++++------------------- requirements.txt | 64 ++++++------ 7 files changed, 134 insertions(+), 152 deletions(-) diff --git a/docs/gen_ref_pages.py b/docs/gen_ref_pages.py index f547d77..19880bf 100644 --- a/docs/gen_ref_pages.py +++ b/docs/gen_ref_pages.py @@ -105,7 +105,6 @@ def generate_sub_process_result(requirement_file) -> dict: for entry in check_required: entry = entry.lower() if entry not in sub_process_result: - command = ["pip", "show", entry] print("Collect Req. PIP Infos for package:", entry) result = run( @@ -164,7 +163,6 @@ def generate_code_reference_documentation( nav = mkdocs_gen_files.Nav() for path in sorted(Path(source_path).rglob(source_file_type_filter)): - module_path = path.relative_to(source_path).with_suffix("") doc_path = path.relative_to(source_path).with_suffix(md_file_type) full_doc_path = Path(virtual_ref_nav_path, doc_path) @@ -209,7 +207,6 @@ def generate_code_reference_documentation( with open(requirement_file, "r") as req_file: req_txt = req_file.read() if req_txt and len(req_txt) > 0: - with mkdocs_gen_files.open(req_md_file, "w") as fd: fd.write(f"# {source_path.replace('_', ' ')} - Included Libraries\n***\n\n") # Python 3.x only diff --git a/msaBase/__init__.py b/msaBase/__init__.py index 3f59b8c..677124c 100644 --- a/msaBase/__init__.py +++ b/msaBase/__init__.py @@ -1,7 +1,7 @@ import glob from os.path import basename, dirname, isfile, join -version = "0.0.104" +version = "0.0.105" __author__ = "Stefan Welcker" __copyright__ = "Copyright 2022, U2D.ai" __license__ = "MIT" @@ -12,6 +12,4 @@ __url__ = "https://github.com/u2d-ai/msaBase" modules = glob.glob(join(dirname(__file__), "*.py")) -__all__ = [ - basename(f)[:-3] for f in modules if isfile(f) and not f.endswith("__init__.py") -] +__all__ = [basename(f)[:-3] for f in modules if isfile(f) and not f.endswith("__init__.py")] diff --git a/msaBase/configurate.py b/msaBase/configurate.py index 585bde3..8d6f54e 100644 --- a/msaBase/configurate.py +++ b/msaBase/configurate.py @@ -21,6 +21,7 @@ from fastapi.exception_handlers import http_exception_handler from fastapi.exceptions import RequestValidationError from fastapi.responses import ORJSONResponse +from fastapi_restful.timing import add_timing_middleware from fs.base import FS from grpc._channel import _InactiveRpcError from loguru import logger as logger_gruru @@ -432,7 +433,6 @@ def get_services_settings(self, request: Request) -> ORJSONResponse: def try_get_json(): try: - return jsonable_encoder(self.settings) except Exception as e: @@ -458,7 +458,6 @@ def get_services_openapi_schema(self, request: Request) -> ORJSONResponse: def try_get_json(): try: - return jsonable_encoder(self.openapi()) except Exception as e: @@ -647,7 +646,6 @@ def update_settings(self, new_config: MSAServiceDefinition, one_time=False) -> b if (current_functionality is not None and new_functionality is not None) and ( current_functionality != new_functionality ): - if reload_needed: return True @@ -905,7 +903,6 @@ def configure_cors_middleware(self) -> None: def configure_timing_middleware(self) -> None: """Add Middleware Timing""" self.logger.info("Add Middleware Timing") - from fastapi_utils.timing import add_timing_middleware add_timing_middleware(self, record=self.logger.info, prefix="app", exclude="untimed") diff --git a/msaBase/logger.py b/msaBase/logger.py index 284c2be..4ee83e0 100644 --- a/msaBase/logger.py +++ b/msaBase/logger.py @@ -82,17 +82,10 @@ def init_logging(): ``` """ - # disable handlers for specific uvicorn loggers - # to redirect their output to the default uvicorn logger - # works with uvicorn==0.11.6 - # print("Logger", [name for name in logging.root.manager.loggerDict]) - for handler in logging.root.handlers[:]: logging.root.removeHandler(handler) loggers = (logging.getLogger(name) for name in logging.root.manager.loggerDict if name.startswith("uvicorn.")) - - # change handler for default uvicorn logger intercept_handler = InterceptHandler() for uvicorn_logger in loggers: @@ -100,9 +93,7 @@ def init_logging(): uvicorn_logger.handlers = [intercept_handler] except: pass - # logging.getLogger().handlers = [intercept_handler] logging.getLogger("uvicorn").handlers = [] logging.getLogger("rocketry").handlers = [] - # set logs output, level and format logger.configure(handlers=[{"sink": sys.stdout, "level": logging.INFO, "format": format_record}]) diff --git a/msaBase/models/settings.py b/msaBase/models/settings.py index c2725a3..11792d9 100644 --- a/msaBase/models/settings.py +++ b/msaBase/models/settings.py @@ -1,4 +1,4 @@ -from fastapi_utils.api_settings import APISettings +from fastapi_restful.api_settings import APISettings class MSAAppSettings(APISettings): diff --git a/msaBase/models/sysinfo.py b/msaBase/models/sysinfo.py index d73e17b..12f3370 100644 --- a/msaBase/models/sysinfo.py +++ b/msaBase/models/sysinfo.py @@ -18,14 +18,14 @@ class MSAGPUInfo(BaseModel): uuid: unique GPU identifier """ - id: Optional[int] - name: Optional[str] - load: Optional[str] - free_memory: Optional[str] - used_memory: Optional[str] - total_memory: Optional[str] - temperature: Optional[str] - uuid: Optional[str] + id: Optional[int] = None + name: Optional[str] = None + load: Optional[str] = None + free_memory: Optional[str] = None + used_memory: Optional[str] = None + total_memory: Optional[str] = None + temperature: Optional[str] = None + uuid: Optional[str] = None class MSADiskIO(BaseModel): @@ -45,15 +45,15 @@ class MSADiskIO(BaseModel): """ - read_count: Optional[int] - write_count: Optional[int] - read_bytes: Optional[int] - write_bytes: Optional[int] - read_time: Optional[int] - write_time: Optional[int] - read_merged_count: Optional[int] - write_merged_count: Optional[int] - busy_time: Optional[int] + read_count: Optional[int] = None + write_count: Optional[int] = None + read_bytes: Optional[int] = None + write_bytes: Optional[int] = None + read_time: Optional[int] = None + write_time: Optional[int] = None + read_merged_count: Optional[int] = None + write_merged_count: Optional[int] = None + busy_time: Optional[int] = None class MSANetworkIO(BaseModel): @@ -71,14 +71,14 @@ class MSANetworkIO(BaseModel): dropout: total number of outgoing packets which were dropped (always 0 on macOS and BSD) """ - bytes_sent: Optional[int] - bytes_recv: Optional[int] - packets_sent: Optional[int] - packets_recv: Optional[int] - errin: Optional[int] - errout: Optional[int] - dropin: Optional[int] - dropout: Optional[int] + bytes_sent: Optional[int] = None + bytes_recv: Optional[int] = None + packets_sent: Optional[int] = None + packets_recv: Optional[int] = None + errin: Optional[int] = None + errout: Optional[int] = None + dropin: Optional[int] = None + dropout: Optional[int] = None class MSANetworkConnection(BaseModel): @@ -102,14 +102,14 @@ class MSANetworkConnection(BaseModel): (e.g. Linux) the availability of this field changes depending on process privileges (root is needed). """ - index: Optional[int] - file_descriptor: Optional[int] - family: Optional[int] - type: Optional[int] - local_addr: Optional[str] - remote_addr: Optional[str] + index: Optional[int] = None + file_descriptor: Optional[int] = None + family: Optional[int] = None + type: Optional[int] = None + local_addr: Optional[str] = None + remote_addr: Optional[str] = None status: str = "" - pid: Optional[int] + pid: Optional[int] = None class MSANetworkAdapter(BaseModel): @@ -125,11 +125,11 @@ class MSANetworkAdapter(BaseModel): (typically a VPN). broadcast and ptp are mutually exclusive. May be None. """ - family: Optional[int] - address: Optional[str] - netmask: Optional[str] - broadcast: Optional[str] - ptp: Optional[int] + family: Optional[int] = None + address: Optional[str] = None + netmask: Optional[str] = None + broadcast: Optional[str] = None + ptp: Optional[int] = None class MSANetworkAdapters(BaseModel): @@ -156,10 +156,10 @@ class MSANetworkStat(BaseModel): mtu: NIC’s maximum transmission unit expressed in bytes. """ - isup: Optional[bool] - duplex: Optional[int] - speed: Optional[int] - mtu: Optional[int] + isup: Optional[bool] = None + duplex: Optional[int] = None + speed: Optional[int] = None + mtu: Optional[int] = None class MSANetworkStats(BaseModel): @@ -186,10 +186,10 @@ class MSATemperature(BaseModel): critical: critical temperature """ - label: Optional[str] - current: Optional[float] - high: Optional[float] - critical: Optional[float] + label: Optional[str] = None + current: Optional[float] = None + high: Optional[float] = None + critical: Optional[float] = None class MSATemperatures(BaseModel): @@ -215,9 +215,9 @@ class MSACPUFrequency(BaseModel): max: maximal frequency """ - current: Optional[float] - min: Optional[int] - max: Optional[int] + current: Optional[float] = None + min: Optional[int] = None + max: Optional[int] = None class MSACPUTimes(BaseModel): @@ -240,16 +240,16 @@ class MSACPUTimes(BaseModel): systems under the control of the Linux kernel) """ - user: Optional[float] - nice: Optional[int] - system: Optional[float] - idle: Optional[float] - iowait: Optional[float] - irq: Optional[int] - softirq: Optional[float] - steal: Optional[int] - guest: Optional[float] - guest_nice: Optional[int] + user: Optional[float] = None + nice: Optional[int] = None + system: Optional[float] = None + idle: Optional[float] = None + iowait: Optional[float] = None + irq: Optional[int] = None + softirq: Optional[float] = None + steal: Optional[int] = None + guest: Optional[float] = None + guest_nice: Optional[int] = None class MSACPUStats(BaseModel): @@ -263,11 +263,10 @@ class MSACPUStats(BaseModel): syscalls: number of system calls since boot. Always set to 0 on Linux. """ - ctx_switches: Optional[int] - interrupts: Optional[int] - soft_interrupts: Optional[int] - syscalls: Optional[int] - """""" + ctx_switches: Optional[int] = None + interrupts: Optional[int] = None + soft_interrupts: Optional[int] = None + syscalls: Optional[int] = None class MSAMemoryUsage(BaseModel): @@ -290,15 +289,15 @@ class MSAMemoryUsage(BaseModel): inactive: (UNIX): memory that is marked as not used. """ - total: Optional[float] - available: Optional[float] - used: Optional[float] - free: Optional[float] - percent: Optional[float] - buffers: Optional[float] - cached: Optional[float] - active: Optional[float] - inactive: Optional[float] + total: Optional[float] = None + available: Optional[float] = None + used: Optional[float] = None + free: Optional[float] = None + percent: Optional[float] = None + buffers: Optional[float] = None + cached: Optional[float] = None + active: Optional[float] = None + inactive: Optional[float] = None """""" @@ -313,10 +312,10 @@ class MSASwap(BaseModel): percent: the percentage usage calculated as (total - available) / total * 100 """ - total: Optional[float] - used: Optional[float] - free: Optional[float] - percent: Optional[float] + total: Optional[float] = None + used: Optional[float] = None + free: Optional[float] = None + percent: Optional[float] = None class MSASystemInfo(BaseModel): @@ -371,32 +370,32 @@ class MSASystemInfo(BaseModel): HW_Identifier: str = "" IP_Address: str = "" MAC_Address: str = "" - CPU_Physical: Optional[int] - CPU_Logical: Optional[int] + CPU_Physical: Optional[int] = None + CPU_Logical: Optional[int] = None Memory_Physical: str = "" Memory_Available: str = "" System_Boot: str = "" Service_Start: str = "" Runtime_Exe: str = "" Runtime_Cmd: List[str] = [] - Disk_IO: Optional[MSADiskIO] - Network_IO: Optional[MSANetworkIO] - Network_Connections: Optional[List[MSANetworkConnection]] - Network_Adapters: Optional[List[MSANetworkAdapters]] - Network_Stats: Optional[List[MSANetworkStats]] - Temperatures: Optional[List[MSATemperatures]] - CPU_Affinity: Optional[int] - CPU_Frequency: Optional[MSACPUFrequency] - CPU_Times: Optional[MSACPUTimes] - CPU_Stats: Optional[MSACPUStats] - PID: Optional[int] - CPU_Current: Optional[int] - CPU_Usage_Total: Optional[float] - CPU_Usage_Process: Optional[float] + Disk_IO: Optional[MSADiskIO] = None + Network_IO: Optional[MSANetworkIO] = None + Network_Connections: Optional[List[MSANetworkConnection]] = None + Network_Adapters: Optional[List[MSANetworkAdapters]] = None + Network_Stats: Optional[List[MSANetworkStats]] = None + Temperatures: Optional[List[MSATemperatures]] = None + CPU_Affinity: Optional[int] = None + CPU_Frequency: Optional[MSACPUFrequency] = None + CPU_Times: Optional[MSACPUTimes] = None + CPU_Stats: Optional[MSACPUStats] = None + PID: Optional[int] = None + CPU_Current: Optional[int] = None + CPU_Usage_Total: Optional[float] = None + CPU_Usage_Process: Optional[float] = None CPU_Usage_Name: str = "" - CPU_LoadAvg: Optional[List[float]] - Memory_Usage: Optional[MSAMemoryUsage] - Swap: Optional[MSASwap] + CPU_LoadAvg: Optional[List[float]] = None + Memory_Usage: Optional[MSAMemoryUsage] = None + Swap: Optional[MSASwap] = None Runtime_Status: str = "" @@ -437,14 +436,14 @@ class MSASystemGPUInfo(BaseModel): HW_Identifier: str = "" IP_Address: str = "" MAC_Address: str = "" - CPU_Physical: Optional[int] - CPU_Logical: Optional[int] + CPU_Physical: Optional[int] = None + CPU_Logical: Optional[int] = None Memory_Physical: str = "" Memory_Available: str = "" System_Boot: str = "" Service_Start: str = "" Runtime_Exe: str = "" Runtime_Cmd: List[str] = [] - PID: Optional[int] - GPUs: Optional[List[MSAGPUInfo]] + PID: Optional[int] = None + GPUs: Optional[List[MSAGPUInfo]] = None Runtime_Status: str = "" diff --git a/requirements.txt b/requirements.txt index 6a13f82..83e942b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,68 +1,68 @@ # MSA Dependencies msaFileSystem==0.0.3 # Agnostic Abstract Filesystem API which allows to use S3, GCS, Azure Datalake, your local FS, Youtube etc Optimized for use with FastAPI/Pydantic. -msaDocModels==0.0.95 # MSA Document Pydantic Models and Schemas, used to store Parser, NLP, NLU and AI results for processed documents +msaDocModels==0.0.96 # MSA Document Pydantic Models and Schemas, used to store Parser, NLP, NLU and AI results for processed documents # FastAPI related Dependencies anyio==3.7.1 # an asynchronous networking and concurrency library that works on top of either asyncio or trio -fastapi[all]==0.86.0 # FastAPI framework, high performance, easy to learn, fast to code, ready for production -fastapi_utils==0.2.1 # Reusable utilities for FastAPI, Repeated Tasks, APIModel, APISettings -pydantic[email,dotenv]==1.9.2 # Data validation and settings management using python type hints -pyinstrument==4.4.0 # pyinstrument to check service performance. +fastapi[all]==0.103.1 # FastAPI framework, high performance, easy to learn, fast to code, ready for production +fastapi-restful==0.5.0 # Reusable utilities for FastAPI, Repeated Tasks, APIModel, APISettings +pydantic[all]==2.3.0 # Data validation and settings management using python type hints # General Dependencies -autoflake==2.0.1 # Removes unused imports and unused variables -black==22.6.0 # Code formatter +autoflake==2.2.1 # Removes unused imports and unused variables +black==23.7.0 # Code formatter +typing-inspect==0.9.0 # module defines experimental API for runtime inspection pyproject-flake8==6.0.0 # configure flake8 flake8==6.0.0 # modular source code checker: pep8 pyflakes and co colorama==0.4.6 # Makes ANSI escape character sequence isort==5.12.0 # library to sort Python imports. -sentry-sdk==1.24.0 # library to automatic reporting of errors and exceptions. -loguru==0.6.0 # Python logging made (stupidly) simple -lxml==4.9.2 # Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. -mypy==1.0.0 # Optional static typing for Python -setuptools==67.6.1 # Easily download, build, install, upgrade, and uninstall Python packages -prometheus_fastapi_instrumentator==5.9.1 # Instrument your FastAPI with Prometheus metrics +sentry-sdk==1.30.0 # library to automatic reporting of errors and exceptions. +loguru==0.7.1 # Python logging made (stupidly) simple +lxml==4.9.3 # Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +mypy==1.5.1 # Optional static typing for Python +setuptools==68.2.0 # Easily download, build, install, upgrade, and uninstall Python packages +prometheus_fastapi_instrumentator==6.1.0 # Instrument your FastAPI with Prometheus metrics Jinja2==3.1.2 # A very fast and expressive template engine. -orjson==3.8.3 # Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy -pyinstrument==4.4.0 # pyinstrument to check service performance. +orjson==3.9.6 # Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +pyinstrument==4.5.3 # pyinstrument to check service performance. msgpack-asgi==1.1.0 # Drop-in MessagePack support for ASGI applications and frameworks -slowapi==0.1.7 # A rate limiting extension for Starlette and Fastapi +slowapi==0.1.8 # A rate limiting extension for Starlette and Fastapi addict==2.4.0 # A dictionary whose items can be set using both attribute and item syntax. -pymongo==4.3.3 # A Python distribution containing tools for working with MongoDB +pymongo==4.5.0 # A Python distribution containing tools for working with MongoDB # Dapr Dependencies -dapr==1.9.0 # Dapr is a portable, serverless, event-driven runtime that makes it easy for developers to build resilient, stateless and stateful microservices that run on the cloud and edge -dapr-ext-grpc==1.9.0 # gRPC extension for Dapr. -dapr-ext-fastapi==1.9.0 # Dapr is a portable, serverless, event-driven runtime +dapr==1.10.0 # Dapr is a portable, serverless, event-driven runtime that makes it easy for developers to build resilient, stateless and stateful microservices that run on the cloud and edge +dapr-ext-grpc==1.10.0 # gRPC extension for Dapr. +dapr-ext-fastapi==1.10.0 # Dapr is a portable, serverless, event-driven runtime # File Management related libs -aiofiles==23.1.0 # handling local disk files in asyncio applications +aiofiles==23.2.1 # handling local disk files in asyncio applications fs==2.4.16 # Python's filesystem abstraction layer # Starlette related Dependencies -starlette==0.20.4 # Starlette is a lightweight ASGI framework/toolkit, which is ideal for building async web services in Python. -starlette-context==0.3.5 # Access context in Starlette -starception==0.4.1 # Beautiful debugging page for Starlette apps. +starlette==0.27.0 # Starlette is a lightweight ASGI framework/toolkit, which is ideal for building async web services in Python. +starlette-context==0.3.6 # Access context in Starlette +starception==1.0.1 # Beautiful debugging page for Starlette apps. Starlette-WTF==0.4.3 # Simple integration of Starlette and WTForms. # Other Dependencies -httpx==0.23.3 # The next generation HTTP client. -aiohttp==3.8.4 # The next generation HTTP client. +httpx==0.24.1 # The next generation HTTP client. +aiohttp==3.8.5 # The next generation HTTP client. hjson==3.1.0 # Hjson, a user interface for JSON. # Uvicorn related Dependencies -uvicorn==0.18.3 # The lightning-fast ASGI server. +uvicorn==0.23.2 # The lightning-fast ASGI server. uvloop==0.17.0 # Fast implementation of asyncio event loop on top of libuv # Sysinfo related libs gputil==1.4.0 # Python module for getting the GPU status from NVIDA GPUs using nvidia-smi. -psutil==5.9.4 # Cross-platform lib for process and system monitoring in Python. +psutil==5.9.5 # Cross-platform lib for process and system monitoring in Python. # Scheduler -apscheduler==3.10.0 # APScheduler is a Python library that lets you schedule your Python code to be executed later, either just once or periodically +apscheduler==3.10.4 # APScheduler is a Python library that lets you schedule your Python code to be executed later, either just once or periodically # Testing -pytest==7.2.0 # Framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. -pytest-asyncio==0.20.2 # Library for testing asyncio code with pytest. -pytest-mock==3.10.0 # Library for mock data with pytest. \ No newline at end of file +pytest==7.4.2 # Framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. +pytest-asyncio==0.21.1 # Library for testing asyncio code with pytest. +pytest-mock==3.11.1 # Library for mock data with pytest. \ No newline at end of file From 1fcde84dc4de18b302e813f4e7e7865c70ac25e0 Mon Sep 17 00:00:00 2001 From: SekachVitaliy Date: Mon, 11 Sep 2023 11:43:48 +0300 Subject: [PATCH 2/5] feat: update version of some library --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 83e942b..ec9ecb9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,7 +6,7 @@ msaDocModels==0.0.96 # MSA Document Pydantic Models and Schemas, used to store P anyio==3.7.1 # an asynchronous networking and concurrency library that works on top of either asyncio or trio fastapi[all]==0.103.1 # FastAPI framework, high performance, easy to learn, fast to code, ready for production fastapi-restful==0.5.0 # Reusable utilities for FastAPI, Repeated Tasks, APIModel, APISettings -pydantic[all]==2.3.0 # Data validation and settings management using python type hints +pydantic[email,dotenv]==2.3.0 # Data validation and settings management using python type hints # General Dependencies From 10b15a86927349c61dd51d6af30e785b4754a39d Mon Sep 17 00:00:00 2001 From: Eduard Terletskiy Date: Wed, 20 Sep 2023 16:50:44 +0300 Subject: [PATCH 3/5] feat: added supporting pydantic v2, update msaDocModels, added env for sentry --- docs/release-notes.md | 6 ++++++ docs/saved_req_package_pip_info.pkl | Bin 67898 -> 0 bytes msaBase/config.py | 4 ++-- msaBase/configurate.py | 8 ++++---- requirements.txt | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) delete mode 100644 docs/saved_req_package_pip_info.pkl diff --git a/docs/release-notes.md b/docs/release-notes.md index f46e9a4..be68582 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,6 +1,12 @@ # msaBase Release Notes ## Possible future features: +# 0.0.110 + +- added supporting pydantic v2 +- update msaDocModels +- added env for sentry + # 0.0.109 - add Input and DTO models for Spellcheck diff --git a/docs/saved_req_package_pip_info.pkl b/docs/saved_req_package_pip_info.pkl deleted file mode 100644 index 4ee0e49fe1a7fe27a708fb213965489786d07ca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67898 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

M_0^)r|4dN+(e}&fvUfoTUqjJqN^6Ksm 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 None: """ Saves config to a JSON file """ - sa = self.copy(deep=True) + sa = self.model_copy(deep=True) with open("config.json", "w") as fp: - json.dump(sa.dict(), fp, sort_keys=True, indent=4) + json.dump(sa.model_dump(), fp, sort_keys=True, indent=4) @staticmethod def load_config(): diff --git a/msaBase/configurate.py b/msaBase/configurate.py index dcb0e08..423b3fa 100644 --- a/msaBase/configurate.py +++ b/msaBase/configurate.py @@ -106,11 +106,11 @@ async def load_config(url: str) -> None: if resp.status == 200: config = MSAServiceDefinition.parse_obj(await resp.json()) new_config = get_msa_app_settings() - if new_config.dict(exclude={"version"}) == config.dict(exclude={"version"}): + if new_config.model_dump(exclude={"version"}) == config.model_dump(exclude={"version"}): return with open("config.json", "w") as json_file: - json.dump(config.dict(), json_file, sort_keys=True, indent=4) + json.dump(config.model_dump(), json_file, sort_keys=True, indent=4) logger_gruru.info("New config saved to config.json") else: @@ -224,7 +224,7 @@ async def read_config(received_config: ConfigInput) -> None: if reload_needed: self.logger.info("New config needs reload.") with open("config.json", "w") as json_file: - json.dump(received_config.data.dict(), json_file) + json.dump(received_config.data.model_dump(), json_file) self.logger.info("New config saved to config.json") @@ -961,7 +961,7 @@ def init_sentry(self, sentry_dsn: str) -> None: sentry_sdk.init( dsn=sentry_dsn, traces_sample_rate=1.0, - environment=os.getenv("STAGE_ENV","local"), + environment=os.getenv("STAGE_ENV", "local"), ) diff --git a/requirements.txt b/requirements.txt index 30d1e28..0d5ddd5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ # MSA Dependencies msaFileSystem==0.0.3 # Agnostic Abstract Filesystem API which allows to use S3, GCS, Azure Datalake, your local FS, Youtube etc Optimized for use with FastAPI/Pydantic. -msaDocModels==0.0.100 # MSA Document Pydantic Models and Schemas, used to store Parser, NLP, NLU and AI results for processed documents +msaDocModels==0.0.101 # MSA Document Pydantic Models and Schemas, used to store Parser, NLP, NLU and AI results for processed documents # FastAPI related Dependencies anyio==3.7.1 # an asynchronous networking and concurrency library that works on top of either asyncio or trio From 62669bda024d7dc098eb4b815438fded2c11709e Mon Sep 17 00:00:00 2001 From: Eduard Terletskiy Date: Wed, 20 Sep 2023 16:56:26 +0300 Subject: [PATCH 4/5] feat: build docs --- docs/saved_req_package_pip_info.pkl | Bin 0 -> 98570 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/saved_req_package_pip_info.pkl diff --git a/docs/saved_req_package_pip_info.pkl b/docs/saved_req_package_pip_info.pkl new file mode 100644 index 0000000000000000000000000000000000000000..6f09b36839e1c9d679b66ae343fe611e6bfadb13 GIT binary patch literal 98570 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 Q#UZK Date: Wed, 20 Sep 2023 16:58:14 +0300 Subject: [PATCH 5/5] fix: version --- docs/release-notes.md | 2 +- msaBase/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes.md b/docs/release-notes.md index be68582..f6931ef 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -15,7 +15,7 @@ - added enviroments for sentry -## 0.0.107 +# 0.0.107 - fix algorithm to DocClassifier Input diff --git a/msaBase/__init__.py b/msaBase/__init__.py index ef46bcd..78973f8 100644 --- a/msaBase/__init__.py +++ b/msaBase/__init__.py @@ -1,7 +1,7 @@ import glob from os.path import basename, dirname, isfile, join -version = "0.0.109" +version = "0.0.110" __author__ = "Stefan Welcker" __copyright__ = "Copyright 2022, U2D.ai" __license__ = "MIT"