mindbridge-api-python-client 1.6.0__tar.gz → 1.6.1__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.
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/PKG-INFO +7 -9
- mindbridge_api_python_client-1.6.1/pyproject.toml +148 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/__init__.py +2 -2
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_grouping_item.py +0 -2
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_groupings.py +0 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_groups.py +0 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_mappings.py +0 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_period.py +2 -5
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_source_item.py +15 -15
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_sources.py +3 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/async_result_item.py +5 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/base_set.py +9 -1
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/common_validators.py +6 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/data_tables.py +22 -26
- mindbridge_api_python_client-1.6.1/src/mindbridgeapi/engagement_account_group_item.py +21 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagement_account_grouping_item.py +18 -1
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagement_account_groupings.py +26 -2
- mindbridge_api_python_client-1.6.1/src/mindbridgeapi/engagement_account_groups.py +41 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagement_item.py +3 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/deprecated_enum.py +3 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_manager_item.py +3 -18
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/generated_pydantic_model/model.py +2 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/server.py +18 -4
- mindbridge_api_python_client-1.6.1/src/mindbridgeapi/task_histories.py +39 -0
- mindbridge_api_python_client-1.6.1/src/mindbridgeapi/task_history_item.py +40 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/task_item.py +18 -3
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/tasks.py +22 -4
- mindbridge_api_python_client-1.6.1/src/mindbridgeapi/transaction_id_preview_item.py +56 -0
- mindbridge_api_python_client-1.6.1/src/mindbridgeapi/transaction_id_previews.py +39 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/transaction_id_selection.py +4 -2
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/virtual_column.py +1 -1
- mindbridge_api_python_client-1.6.0/pyproject.toml +0 -126
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/LICENSE.txt +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/README.md +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_group_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_mapping_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/accounting_period.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analyses.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_result_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_results.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_source_type_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_source_types.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_type_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_types.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/async_results.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/chunked_file_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/chunked_file_part_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/chunked_files.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/column_mapping.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagements.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/analysis_source_type.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/analysis_type.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/system_library.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/exceptions.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_manager.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_result_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_results.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/libraries.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/library_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/organization_item.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/organizations.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/users.py +0 -0
- {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/version.py +0 -0
|
@@ -1,32 +1,30 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: mindbridge-api-python-client
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.1
|
|
4
4
|
Summary: Interact with the MindBridge API
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
License: LicenseRef-Proprietary
|
|
6
|
+
Keywords: MindBridge
|
|
7
7
|
Author: MBAI Support
|
|
8
8
|
Author-email: mbaisupport@mindbridge.ai
|
|
9
9
|
Maintainer: MBAI Support
|
|
10
10
|
Maintainer-email: mbaisupport@mindbridge.ai
|
|
11
|
-
Requires-Python: >=3.9
|
|
11
|
+
Requires-Python: >= 3.9
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: Framework :: Flake8
|
|
14
13
|
Classifier: Framework :: Pydantic
|
|
15
14
|
Classifier: Framework :: Pydantic :: 2
|
|
16
15
|
Classifier: Framework :: Pytest
|
|
17
16
|
Classifier: License :: Other/Proprietary License
|
|
18
17
|
Classifier: Operating System :: OS Independent
|
|
19
|
-
Classifier: Programming Language :: Python
|
|
20
18
|
Classifier: Programming Language :: Python :: 3
|
|
21
19
|
Classifier: Programming Language :: Python :: 3.9
|
|
22
20
|
Classifier: Programming Language :: Python :: 3.10
|
|
23
21
|
Classifier: Programming Language :: Python :: 3.11
|
|
24
22
|
Classifier: Programming Language :: Python :: 3.12
|
|
25
23
|
Classifier: Programming Language :: Python :: 3.13
|
|
26
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
27
24
|
Classifier: Typing :: Typed
|
|
28
25
|
Requires-Dist: pydantic (>=2.5.2,<3.0.0)
|
|
29
|
-
Requires-Dist: urllib3 (>=2.0
|
|
26
|
+
Requires-Dist: urllib3 (>=2.3.0,<3.0.0)
|
|
27
|
+
Project-URL: Homepage, https://www.mindbridge.ai
|
|
30
28
|
Description-Content-Type: text/markdown
|
|
31
29
|
|
|
32
30
|
<h1 align="center">MindBridge API Python Client</h1>
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["poetry-core>=1.0.0"]
|
|
3
|
+
build-backend = "poetry.core.masonry.api"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "mindbridge-api-python-client"
|
|
7
|
+
version = "1.6.1"
|
|
8
|
+
description = "Interact with the MindBridge API"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "LicenseRef-Proprietary"
|
|
11
|
+
license-files = ["LICENSE.txt"]
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "MBAI Support", email = "mbaisupport@mindbridge.ai"}, # Must be first so that PyPI displays this
|
|
14
|
+
{name = "Edgar Silva", email = "edgar.silva@mindbridge.ai"},
|
|
15
|
+
{name = "Jordan Hatcher", email = "jordan.hatcher@mindbridge.ai"},
|
|
16
|
+
{name = "Kevin Paulson", email = "kevin.paulson@mindbridge.ai"},
|
|
17
|
+
{name = "Michael Smith", email = "msmith@mindbridge.ai"},
|
|
18
|
+
{name = "Owen Allen", email = "owen.allen@mindbridge.ai"},
|
|
19
|
+
{name = "Wing-Leung Chan", email = "wing-leung.chan@mindbridge.ai"},
|
|
20
|
+
]
|
|
21
|
+
maintainers = [
|
|
22
|
+
{name = "MBAI Support", email = "mbaisupport@mindbridge.ai"},
|
|
23
|
+
]
|
|
24
|
+
dependencies = [
|
|
25
|
+
"pydantic (>=2.5.2,<3.0.0)",
|
|
26
|
+
"urllib3 (>=2.3.0,<3.0.0)",
|
|
27
|
+
]
|
|
28
|
+
requires-python = ">= 3.9"
|
|
29
|
+
keywords = [ "MindBridge" ]
|
|
30
|
+
dynamic = [ "classifiers" ]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
homepage = "https://www.mindbridge.ai"
|
|
34
|
+
|
|
35
|
+
[tool.poetry]
|
|
36
|
+
requires-poetry = ">=2.0"
|
|
37
|
+
classifiers = [ # Python classifiers are automatically added by poetry
|
|
38
|
+
"Development Status :: 4 - Beta",
|
|
39
|
+
"Framework :: Pydantic",
|
|
40
|
+
"Framework :: Pydantic :: 2",
|
|
41
|
+
"Framework :: Pytest",
|
|
42
|
+
"License :: Other/Proprietary License",
|
|
43
|
+
"Operating System :: OS Independent",
|
|
44
|
+
"Typing :: Typed",
|
|
45
|
+
]
|
|
46
|
+
packages = [
|
|
47
|
+
{ include = "mindbridgeapi", from = "src" },
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
[tool.poetry.group.lint]
|
|
51
|
+
optional = true
|
|
52
|
+
|
|
53
|
+
[tool.poetry.group.lint.dependencies]
|
|
54
|
+
ruff = "^0.9.6"
|
|
55
|
+
|
|
56
|
+
[tool.poetry.group.test]
|
|
57
|
+
optional = true
|
|
58
|
+
|
|
59
|
+
[tool.poetry.group.test.dependencies]
|
|
60
|
+
pytest = "^8.1.1"
|
|
61
|
+
pytest-randomly = "^3.15.0"
|
|
62
|
+
openpyxl = "^3.1.5"
|
|
63
|
+
pandas = "^2.2.3"
|
|
64
|
+
datamodel-code-generator = "^0.28.0"
|
|
65
|
+
mypy = "^1.13.0"
|
|
66
|
+
pytest-cov = "^6.0.0"
|
|
67
|
+
pytest-html = "^4.1.1"
|
|
68
|
+
|
|
69
|
+
[tool.ruff]
|
|
70
|
+
extend-exclude = [
|
|
71
|
+
"src/mindbridgeapi/generated_pydantic_model/model.py",
|
|
72
|
+
".cci_pycache",
|
|
73
|
+
]
|
|
74
|
+
|
|
75
|
+
[tool.ruff.format]
|
|
76
|
+
line-ending = "lf"
|
|
77
|
+
|
|
78
|
+
[tool.ruff.lint]
|
|
79
|
+
select = [
|
|
80
|
+
"I", # isort
|
|
81
|
+
"F", # Pyflakes
|
|
82
|
+
"E", "W", # pycodestyle
|
|
83
|
+
"N", # pep8-naming
|
|
84
|
+
"B", # flake8-bugbear
|
|
85
|
+
"C4", # flake8-comprehensions
|
|
86
|
+
"ISC", # flake8-implicit-str-concat
|
|
87
|
+
"PT", # flake8-pytest-style
|
|
88
|
+
"RET", # flake8-return
|
|
89
|
+
"SIM", # flake8-simplify
|
|
90
|
+
"TID", # flake8-tidy-imports
|
|
91
|
+
"TRY", # tryceratops
|
|
92
|
+
"TC", # flake8-type-checking
|
|
93
|
+
"RUF100",
|
|
94
|
+
# flake8-clean-block = "^0.1.2"
|
|
95
|
+
# flake8-encodings = "^0.5.1" https://github.com/astral-sh/ruff/issues/3278
|
|
96
|
+
]
|
|
97
|
+
ignore = [
|
|
98
|
+
"E111", "E114", "E117", # Conflicting lint rules with formatter
|
|
99
|
+
"SIM105", # Did not seem useful
|
|
100
|
+
"TRY003", # Did not seem useful
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
[tool.ruff.lint.flake8-tidy-imports]
|
|
104
|
+
ban-relative-imports = "all"
|
|
105
|
+
|
|
106
|
+
[tool.ruff.lint.isort]
|
|
107
|
+
combine-as-imports = true
|
|
108
|
+
force-sort-within-sections = true
|
|
109
|
+
no-lines-before = ["future", "standard-library", "first-party", "local-folder", "third-party"]
|
|
110
|
+
|
|
111
|
+
[tool.pytest.ini_options]
|
|
112
|
+
addopts = [
|
|
113
|
+
"--strict-config",
|
|
114
|
+
"--strict-markers",
|
|
115
|
+
"--cov=mindbridgeapi",
|
|
116
|
+
"--cov=generate_model",
|
|
117
|
+
"--cov=set_circleci_pytest_enviroment_variables",
|
|
118
|
+
"--cov-report=html",
|
|
119
|
+
"--cov-report=term",
|
|
120
|
+
"--cov-report=xml",
|
|
121
|
+
]
|
|
122
|
+
|
|
123
|
+
xfail_strict = true
|
|
124
|
+
filterwarnings = [ "error" ]
|
|
125
|
+
pythonpath = [ "tools" ]
|
|
126
|
+
|
|
127
|
+
[tool.coverage.run]
|
|
128
|
+
branch = true
|
|
129
|
+
omit = [ "src/mindbridgeapi/generated_pydantic_model/*" ]
|
|
130
|
+
|
|
131
|
+
[tool.coverage.report]
|
|
132
|
+
exclude_also = [
|
|
133
|
+
"if TYPE_CHECKING:",
|
|
134
|
+
'if __name__ == "__main__":',
|
|
135
|
+
]
|
|
136
|
+
|
|
137
|
+
[tool.mypy]
|
|
138
|
+
mypy_path = "$MYPY_CONFIG_FILE_DIR/src"
|
|
139
|
+
packages = "mindbridgeapi,tools.generate_model,tools.set_circleci_pytest_enviroment_variables"
|
|
140
|
+
plugins = [ "pydantic.mypy" ]
|
|
141
|
+
strict = true
|
|
142
|
+
no_implicit_optional = true
|
|
143
|
+
show_error_codes = true
|
|
144
|
+
|
|
145
|
+
[tool.pydantic-mypy]
|
|
146
|
+
init_forbid_extra = true
|
|
147
|
+
init_typed = true
|
|
148
|
+
warn_required_dynamic_aliases = true
|
|
@@ -21,10 +21,10 @@ from mindbridgeapi.enumerations.analysis_type import AnalysisType
|
|
|
21
21
|
from mindbridgeapi.enumerations.system_library import SystemLibrary
|
|
22
22
|
from mindbridgeapi.file_manager_item import FileManagerItem, FileManagerType
|
|
23
23
|
from mindbridgeapi.generated_pydantic_model.model import (
|
|
24
|
+
Frequency,
|
|
24
25
|
PeriodType as AnalysisEffectiveDateMetricsPeriod,
|
|
26
|
+
TargetWorkflowState,
|
|
25
27
|
)
|
|
26
|
-
from mindbridgeapi.generated_pydantic_model.model import Frequency
|
|
27
|
-
from mindbridgeapi.generated_pydantic_model.model import TargetWorkflowState
|
|
28
28
|
from mindbridgeapi.library_item import LibraryItem
|
|
29
29
|
from mindbridgeapi.organization_item import OrganizationItem
|
|
30
30
|
from mindbridgeapi.server import Server
|
|
@@ -17,8 +17,6 @@ from mindbridgeapi.common_validators import (
|
|
|
17
17
|
from mindbridgeapi.generated_pydantic_model.model import (
|
|
18
18
|
ApiAccountGroupingRead,
|
|
19
19
|
ApiAccountGroupingUpdate,
|
|
20
|
-
)
|
|
21
|
-
from mindbridgeapi.generated_pydantic_model.model import (
|
|
22
20
|
Type7 as _AccountGroupingFileType,
|
|
23
21
|
)
|
|
24
22
|
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from functools import cached_property
|
|
11
|
-
import logging
|
|
12
11
|
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
13
12
|
from mindbridgeapi.account_grouping_item import (
|
|
14
13
|
AccountGroupingFileType,
|
|
@@ -28,8 +27,6 @@ if TYPE_CHECKING:
|
|
|
28
27
|
from os import PathLike
|
|
29
28
|
from pathlib import Path
|
|
30
29
|
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
30
|
|
|
34
31
|
@dataclass
|
|
35
32
|
class AccountGroupings(BaseSet):
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from functools import cached_property
|
|
11
|
-
import logging
|
|
12
11
|
from typing import TYPE_CHECKING, Any, Optional
|
|
13
12
|
from mindbridgeapi.account_group_item import AccountGroupItem
|
|
14
13
|
from mindbridgeapi.base_set import BaseSet
|
|
@@ -18,8 +17,6 @@ from mindbridgeapi.exceptions import ItemNotFoundError
|
|
|
18
17
|
if TYPE_CHECKING:
|
|
19
18
|
from collections.abc import Generator
|
|
20
19
|
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
|
|
23
20
|
|
|
24
21
|
@dataclass
|
|
25
22
|
class AccountGroups(BaseSet):
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from functools import cached_property
|
|
11
|
-
import logging
|
|
12
11
|
from typing import TYPE_CHECKING, Any, Optional
|
|
13
12
|
from mindbridgeapi.account_mapping_item import AccountMappingItem
|
|
14
13
|
from mindbridgeapi.base_set import BaseSet
|
|
@@ -18,8 +17,6 @@ from mindbridgeapi.exceptions import ItemNotFoundError
|
|
|
18
17
|
if TYPE_CHECKING:
|
|
19
18
|
from collections.abc import Generator
|
|
20
19
|
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
|
|
23
20
|
|
|
24
21
|
@dataclass
|
|
25
22
|
class AccountMappings(BaseSet):
|
|
@@ -40,12 +40,9 @@ class AnalysisPeriod(ApiAnalysisPeriodRead):
|
|
|
40
40
|
if not isinstance(other, AnalysisPeriod):
|
|
41
41
|
return NotImplemented
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
return (self.start_date > other.end_date) or (
|
|
44
44
|
(self.end_date == other.end_date) and (self.start_date > other.start_date)
|
|
45
|
-
)
|
|
46
|
-
return True
|
|
47
|
-
|
|
48
|
-
return False
|
|
45
|
+
)
|
|
49
46
|
|
|
50
47
|
def __le__(self, other: object) -> bool:
|
|
51
48
|
return NotImplemented
|
|
@@ -92,11 +92,11 @@ class _ApiAnalysisSourceCreateOnly(ApiAnalysisSourceCreateOnly):
|
|
|
92
92
|
appropriate virtual column type.
|
|
93
93
|
"""
|
|
94
94
|
|
|
95
|
-
proposed_virtual_columns: Optional[
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
)
|
|
95
|
+
proposed_virtual_columns: Optional[list[_VirtualColumn]] = (
|
|
96
|
+
Field().merge_field_infos( # type: ignore[assignment]
|
|
97
|
+
ApiAnalysisSourceCreateOnly.model_fields["proposed_virtual_columns"]
|
|
98
|
+
)
|
|
99
|
+
)
|
|
100
100
|
|
|
101
101
|
|
|
102
102
|
class _ApiAnalysisSourceUpdate(ApiAnalysisSourceUpdate):
|
|
@@ -106,11 +106,11 @@ class _ApiAnalysisSourceUpdate(ApiAnalysisSourceUpdate):
|
|
|
106
106
|
determine the appropriate virtual column type.
|
|
107
107
|
"""
|
|
108
108
|
|
|
109
|
-
proposed_virtual_columns: Optional[
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
)
|
|
109
|
+
proposed_virtual_columns: Optional[list[_VirtualColumn]] = (
|
|
110
|
+
Field().merge_field_infos( # type: ignore[assignment]
|
|
111
|
+
ApiAnalysisSourceUpdate.model_fields["proposed_virtual_columns"]
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
114
|
virtual_columns: Optional[list[_VirtualColumn]] = Field().merge_field_infos(
|
|
115
115
|
ApiAnalysisSourceUpdate.model_fields["virtual_columns"]
|
|
116
116
|
) # type: ignore[assignment]
|
|
@@ -127,11 +127,11 @@ class AnalysisSourceItem(ApiAnalysisSourceRead):
|
|
|
127
127
|
ApiAnalysisSourceRead.model_fields["analysis_source_type_id"],
|
|
128
128
|
default=AnalysisSourceTypeItem.GENERAL_LEDGER_JOURNAL,
|
|
129
129
|
)
|
|
130
|
-
proposed_virtual_columns: Optional[
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
)
|
|
130
|
+
proposed_virtual_columns: Optional[list[_VirtualColumn]] = (
|
|
131
|
+
Field().merge_field_infos( # type: ignore[assignment]
|
|
132
|
+
ApiAnalysisSourceRead.model_fields["proposed_virtual_columns"]
|
|
133
|
+
)
|
|
134
|
+
)
|
|
135
135
|
virtual_columns: Optional[list[_VirtualColumn]] = Field().merge_field_infos(
|
|
136
136
|
ApiAnalysisSourceRead.model_fields["virtual_columns"]
|
|
137
137
|
) # type: ignore[assignment]
|
|
@@ -21,8 +21,6 @@ from mindbridgeapi.exceptions import (
|
|
|
21
21
|
)
|
|
22
22
|
from mindbridgeapi.generated_pydantic_model.model import (
|
|
23
23
|
ApiEffectiveDateMetricsRead as AnalysisEffectiveDateMetrics,
|
|
24
|
-
)
|
|
25
|
-
from mindbridgeapi.generated_pydantic_model.model import (
|
|
26
24
|
PeriodType as AnalysisEffectiveDateMetricsPeriod,
|
|
27
25
|
)
|
|
28
26
|
|
|
@@ -80,7 +78,9 @@ class AnalysisSources(BaseSet):
|
|
|
80
78
|
def effective_date_metrics(
|
|
81
79
|
self,
|
|
82
80
|
item: AnalysisSourceItem,
|
|
83
|
-
period_type: AnalysisEffectiveDateMetricsPeriod =
|
|
81
|
+
period_type: AnalysisEffectiveDateMetricsPeriod = (
|
|
82
|
+
AnalysisEffectiveDateMetricsPeriod.MONTH
|
|
83
|
+
),
|
|
84
84
|
) -> AnalysisEffectiveDateMetrics:
|
|
85
85
|
if getattr(item, "id", None) is None:
|
|
86
86
|
raise ItemNotFoundError
|
|
@@ -13,9 +13,11 @@ from mindbridgeapi.common_validators import (
|
|
|
13
13
|
_warning_if_extra_fields,
|
|
14
14
|
)
|
|
15
15
|
from mindbridgeapi.exceptions import ItemError, ItemNotFoundError, ValidationError
|
|
16
|
-
from mindbridgeapi.generated_pydantic_model.model import
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
from mindbridgeapi.generated_pydantic_model.model import (
|
|
17
|
+
ApiAsyncResult,
|
|
18
|
+
Status3 as _AsyncResultStatus,
|
|
19
|
+
Type1 as _AsyncResultType,
|
|
20
|
+
)
|
|
19
21
|
|
|
20
22
|
logger = logging.getLogger(__name__)
|
|
21
23
|
|
|
@@ -13,6 +13,7 @@ import logging
|
|
|
13
13
|
import shutil
|
|
14
14
|
from typing import TYPE_CHECKING, Any, Optional
|
|
15
15
|
from urllib.parse import urlencode
|
|
16
|
+
from urllib3.util import Retry
|
|
16
17
|
from mindbridgeapi.exceptions import UnexpectedServerError, ValidationError
|
|
17
18
|
|
|
18
19
|
if TYPE_CHECKING:
|
|
@@ -61,7 +62,14 @@ class BaseSet:
|
|
|
61
62
|
params = {"page": page_number}
|
|
62
63
|
request_url = f"{url}?{urlencode(params)}"
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
# Same as set for the PoolManager (http) in Server, but getting a page will
|
|
66
|
+
# always be considered to be idempotent so we can allow repeat post requests
|
|
67
|
+
method = "POST"
|
|
68
|
+
retries = Retry(
|
|
69
|
+
connect=3, read=3, redirect=0, other=0, allowed_methods={method}
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
resp = self.server.http.request(method, request_url, retries=retries, json=json)
|
|
65
73
|
self._check_response(resp)
|
|
66
74
|
resp_dict = self._response_as_dict(resp)
|
|
67
75
|
|
|
@@ -11,9 +11,12 @@ from typing import Any, Optional, Union
|
|
|
11
11
|
import warnings
|
|
12
12
|
from pydantic import RootModel
|
|
13
13
|
from mindbridgeapi.exceptions import ParameterError
|
|
14
|
-
from mindbridgeapi.generated_pydantic_model.model import
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
from mindbridgeapi.generated_pydantic_model.model import (
|
|
15
|
+
ApiUserInfo,
|
|
16
|
+
ApiUserInfoRead,
|
|
17
|
+
ApiUserRead as UserItem,
|
|
18
|
+
Role,
|
|
19
|
+
)
|
|
17
20
|
|
|
18
21
|
MindBridgeQuery = RootModel[dict[str, Any]]
|
|
19
22
|
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from functools import cached_property
|
|
11
|
-
import logging
|
|
12
11
|
from typing import TYPE_CHECKING, Any, Optional
|
|
13
12
|
import warnings
|
|
14
13
|
from mindbridgeapi.async_result_item import AsyncResultItem, AsyncResultType
|
|
@@ -21,15 +20,13 @@ from mindbridgeapi.generated_pydantic_model.model import (
|
|
|
21
20
|
ApiDataTableQuerySortOrder,
|
|
22
21
|
ApiDataTableRead,
|
|
23
22
|
Direction,
|
|
23
|
+
Type4 as DataTableColumnType,
|
|
24
24
|
)
|
|
25
|
-
from mindbridgeapi.generated_pydantic_model.model import Type4 as DataTableColumnType
|
|
26
25
|
|
|
27
26
|
if TYPE_CHECKING:
|
|
28
27
|
from collections.abc import Generator
|
|
29
28
|
from pathlib import Path
|
|
30
29
|
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
32
|
-
|
|
33
30
|
|
|
34
31
|
@dataclass
|
|
35
32
|
class DataTables(BaseSet):
|
|
@@ -83,7 +80,20 @@ class DataTables(BaseSet):
|
|
|
83
80
|
input_item: ApiDataTableRead,
|
|
84
81
|
sort_direction: Optional[Direction] = None,
|
|
85
82
|
sort_field: Optional[str] = None,
|
|
86
|
-
) -> ApiDataTableQuerySortOrder:
|
|
83
|
+
) -> Optional[ApiDataTableQuerySortOrder]:
|
|
84
|
+
if sort_field is not None and not isinstance(sort_field, str):
|
|
85
|
+
raise ParameterError(
|
|
86
|
+
parameter_name="sort_field", details="Not provided as str."
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if sort_field is None and input_item.logical_name == "gl_journal_lines":
|
|
90
|
+
sort_field = "rowid"
|
|
91
|
+
elif sort_field is None and input_item.logical_name == "gl_journal_tx":
|
|
92
|
+
sort_field = "txid"
|
|
93
|
+
|
|
94
|
+
if sort_field is None or sort_field == "":
|
|
95
|
+
return None
|
|
96
|
+
|
|
87
97
|
if sort_direction is None:
|
|
88
98
|
sort_direction = Direction.ASC
|
|
89
99
|
|
|
@@ -94,22 +104,6 @@ class DataTables(BaseSet):
|
|
|
94
104
|
parameter_name="sort_direction", details="Not a valid Direction."
|
|
95
105
|
) from err
|
|
96
106
|
|
|
97
|
-
if sort_field is not None and not isinstance(sort_field, str):
|
|
98
|
-
raise ParameterError(
|
|
99
|
-
parameter_name="sort_field", details="Not provided as str."
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
if sort_field is None and input_item.type == "flows_compact":
|
|
103
|
-
sort_field = "flow_id"
|
|
104
|
-
elif sort_field is None and input_item.logical_name == "gl_journal_lines":
|
|
105
|
-
sort_field = "rowid"
|
|
106
|
-
elif sort_field is None and input_item.logical_name == "gl_journal_tx":
|
|
107
|
-
sort_field = "txid"
|
|
108
|
-
elif sort_field is None or sort_field == "":
|
|
109
|
-
# Don't send a sort
|
|
110
|
-
sort_field = None
|
|
111
|
-
sort_direction = None
|
|
112
|
-
|
|
113
107
|
return ApiDataTableQuerySortOrder(direction=sort_direction, field=sort_field)
|
|
114
108
|
|
|
115
109
|
def export(
|
|
@@ -126,13 +120,15 @@ class DataTables(BaseSet):
|
|
|
126
120
|
|
|
127
121
|
fields = self._export_get_fields(input_item=input_item, fields=fields)
|
|
128
122
|
|
|
129
|
-
sort = self._export_get_sort(
|
|
130
|
-
input_item=input_item, sort_direction=sort_direction, sort_field=sort_field
|
|
131
|
-
)
|
|
132
|
-
|
|
133
123
|
url = f"{self.base_url}/{input_item.id}/export"
|
|
134
124
|
data_table_export_request = ApiDataTableExportRequest(
|
|
135
|
-
fields=fields,
|
|
125
|
+
fields=fields,
|
|
126
|
+
limit=limit,
|
|
127
|
+
sort=self._export_get_sort(
|
|
128
|
+
input_item=input_item,
|
|
129
|
+
sort_direction=sort_direction,
|
|
130
|
+
sort_field=sort_field,
|
|
131
|
+
),
|
|
136
132
|
)
|
|
137
133
|
|
|
138
134
|
json = data_table_export_request.model_dump(
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright MindBridge Analytics Inc. all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# This material is confidential and may not be copied, distributed,
|
|
5
|
+
# reversed engineered, decompiled or otherwise disseminated without
|
|
6
|
+
# the prior written consent of MindBridge Analytics Inc.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
from pydantic import ConfigDict, model_validator
|
|
10
|
+
from mindbridgeapi.common_validators import _warning_if_extra_fields
|
|
11
|
+
from mindbridgeapi.generated_pydantic_model.model import ApiEngagementAccountGroupRead
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class EngagementAccountGroupItem(ApiEngagementAccountGroupRead):
|
|
15
|
+
model_config = ConfigDict(
|
|
16
|
+
extra="allow",
|
|
17
|
+
validate_assignment=True,
|
|
18
|
+
validate_default=True,
|
|
19
|
+
validate_return=True,
|
|
20
|
+
)
|
|
21
|
+
_ = model_validator(mode="after")(_warning_if_extra_fields)
|
|
@@ -6,17 +6,34 @@
|
|
|
6
6
|
# the prior written consent of MindBridge Analytics Inc.
|
|
7
7
|
#
|
|
8
8
|
|
|
9
|
-
from
|
|
9
|
+
from collections.abc import Generator
|
|
10
|
+
from pydantic import ConfigDict, Field, field_validator, model_validator
|
|
10
11
|
from mindbridgeapi.common_validators import (
|
|
11
12
|
_convert_userinfo_to_useritem,
|
|
12
13
|
_warning_if_extra_fields,
|
|
13
14
|
)
|
|
15
|
+
from mindbridgeapi.engagement_account_group_item import EngagementAccountGroupItem
|
|
14
16
|
from mindbridgeapi.generated_pydantic_model.model import (
|
|
15
17
|
ApiEngagementAccountGroupingRead,
|
|
16
18
|
)
|
|
17
19
|
|
|
18
20
|
|
|
21
|
+
def _empty_engagement_account_groups() -> Generator[
|
|
22
|
+
EngagementAccountGroupItem, None, None
|
|
23
|
+
]:
|
|
24
|
+
"""Empty generator function
|
|
25
|
+
|
|
26
|
+
This returns an empty generator function, it's use is to ensure
|
|
27
|
+
engagement_account_groups is not None for the EngagementAccountGroupingItem class
|
|
28
|
+
"""
|
|
29
|
+
yield from ()
|
|
30
|
+
|
|
31
|
+
|
|
19
32
|
class EngagementAccountGroupingItem(ApiEngagementAccountGroupingRead):
|
|
33
|
+
engagement_account_groups: Generator[EngagementAccountGroupItem, None, None] = (
|
|
34
|
+
Field(default_factory=_empty_engagement_account_groups, exclude=True)
|
|
35
|
+
)
|
|
36
|
+
|
|
20
37
|
model_config = ConfigDict(
|
|
21
38
|
extra="allow",
|
|
22
39
|
validate_assignment=True,
|
|
@@ -28,7 +28,11 @@ class EngagementAccountGroupings(BaseSet):
|
|
|
28
28
|
def get_by_id(self, id: str) -> EngagementAccountGroupingItem:
|
|
29
29
|
url = f"{self.base_url}/{id}"
|
|
30
30
|
resp_dict = super()._get_by_id(url=url)
|
|
31
|
-
|
|
31
|
+
engagement_account_grouping = EngagementAccountGroupingItem.model_validate(
|
|
32
|
+
resp_dict
|
|
33
|
+
)
|
|
34
|
+
self.restart_engagement_account_groups(engagement_account_grouping)
|
|
35
|
+
return engagement_account_grouping
|
|
32
36
|
|
|
33
37
|
def get(
|
|
34
38
|
self, json: Optional[dict[str, Any]] = None
|
|
@@ -38,7 +42,11 @@ class EngagementAccountGroupings(BaseSet):
|
|
|
38
42
|
|
|
39
43
|
url = f"{self.base_url}/query"
|
|
40
44
|
for resp_dict in super()._get(url=url, json=json):
|
|
41
|
-
|
|
45
|
+
engagement_account_grouping = EngagementAccountGroupingItem.model_validate(
|
|
46
|
+
resp_dict
|
|
47
|
+
)
|
|
48
|
+
self.restart_engagement_account_groups(engagement_account_grouping)
|
|
49
|
+
yield engagement_account_grouping
|
|
42
50
|
|
|
43
51
|
def export(self, input_item: EngagementAccountGroupingItem) -> AsyncResultItem:
|
|
44
52
|
if getattr(input_item, "id", None) is None:
|
|
@@ -90,3 +98,19 @@ class EngagementAccountGroupings(BaseSet):
|
|
|
90
98
|
return self.server.file_results.export(
|
|
91
99
|
file_result=file_result, output_file_path=output_file_path
|
|
92
100
|
)
|
|
101
|
+
|
|
102
|
+
def restart_engagement_account_groups(
|
|
103
|
+
self, engagement_account_grouping: EngagementAccountGroupingItem
|
|
104
|
+
) -> None:
|
|
105
|
+
if getattr(engagement_account_grouping, "id", None) is None:
|
|
106
|
+
raise ItemNotFoundError
|
|
107
|
+
|
|
108
|
+
engagement_account_grouping.engagement_account_groups = (
|
|
109
|
+
self.server.engagement_account_groups.get(
|
|
110
|
+
json={
|
|
111
|
+
"engagementAccountGroupingId": {
|
|
112
|
+
"$eq": engagement_account_grouping.id
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright MindBridge Analytics Inc. all rights reserved.
|
|
3
|
+
#
|
|
4
|
+
# This material is confidential and may not be copied, distributed,
|
|
5
|
+
# reversed engineered, decompiled or otherwise disseminated without
|
|
6
|
+
# the prior written consent of MindBridge Analytics Inc.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Optional
|
|
11
|
+
from mindbridgeapi.base_set import BaseSet
|
|
12
|
+
from mindbridgeapi.common_validators import _convert_json_query
|
|
13
|
+
from mindbridgeapi.engagement_account_group_item import EngagementAccountGroupItem
|
|
14
|
+
|
|
15
|
+
if TYPE_CHECKING:
|
|
16
|
+
from collections.abc import Generator
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class EngagementAccountGroups(BaseSet):
|
|
21
|
+
base_url: str = field(init=False)
|
|
22
|
+
|
|
23
|
+
def __post_init__(self) -> None:
|
|
24
|
+
self.base_url = f"{self.server.base_url}/engagement-account-groups"
|
|
25
|
+
|
|
26
|
+
def get_by_id(self, id: str) -> EngagementAccountGroupItem:
|
|
27
|
+
url = f"{self.base_url}/{id}"
|
|
28
|
+
resp_dict = super()._get_by_id(url=url)
|
|
29
|
+
|
|
30
|
+
return EngagementAccountGroupItem.model_validate(resp_dict)
|
|
31
|
+
|
|
32
|
+
def get(
|
|
33
|
+
self, json: Optional[dict[str, Any]] = None
|
|
34
|
+
) -> "Generator[EngagementAccountGroupItem, None, None]":
|
|
35
|
+
mb_query_dict = _convert_json_query(
|
|
36
|
+
json, required_key="engagementAccountGroupingId"
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
url = f"{self.base_url}/query"
|
|
40
|
+
for resp_dict in super()._get(url=url, json=mb_query_dict):
|
|
41
|
+
yield EngagementAccountGroupItem.model_validate(resp_dict)
|
|
@@ -45,9 +45,9 @@ def _empty_file_manager_items() -> Generator[FileManagerItem, None, None]:
|
|
|
45
45
|
yield from ()
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def _empty_engagement_account_groupings() ->
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
def _empty_engagement_account_groupings() -> Generator[
|
|
49
|
+
EngagementAccountGroupingItem, None, None
|
|
50
|
+
]:
|
|
51
51
|
"""Empty generator function
|
|
52
52
|
|
|
53
53
|
This returns an empty generator function, it's use is to ensure
|