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.
Files changed (64) hide show
  1. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/PKG-INFO +7 -9
  2. mindbridge_api_python_client-1.6.1/pyproject.toml +148 -0
  3. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/__init__.py +2 -2
  4. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_grouping_item.py +0 -2
  5. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_groupings.py +0 -3
  6. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_groups.py +0 -3
  7. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_mappings.py +0 -3
  8. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_period.py +2 -5
  9. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_source_item.py +15 -15
  10. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_sources.py +3 -3
  11. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/async_result_item.py +5 -3
  12. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/base_set.py +9 -1
  13. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/common_validators.py +6 -3
  14. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/data_tables.py +22 -26
  15. mindbridge_api_python_client-1.6.1/src/mindbridgeapi/engagement_account_group_item.py +21 -0
  16. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagement_account_grouping_item.py +18 -1
  17. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagement_account_groupings.py +26 -2
  18. mindbridge_api_python_client-1.6.1/src/mindbridgeapi/engagement_account_groups.py +41 -0
  19. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagement_item.py +3 -3
  20. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/deprecated_enum.py +3 -3
  21. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_manager_item.py +3 -18
  22. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/generated_pydantic_model/model.py +2 -0
  23. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/server.py +18 -4
  24. mindbridge_api_python_client-1.6.1/src/mindbridgeapi/task_histories.py +39 -0
  25. mindbridge_api_python_client-1.6.1/src/mindbridgeapi/task_history_item.py +40 -0
  26. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/task_item.py +18 -3
  27. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/tasks.py +22 -4
  28. mindbridge_api_python_client-1.6.1/src/mindbridgeapi/transaction_id_preview_item.py +56 -0
  29. mindbridge_api_python_client-1.6.1/src/mindbridgeapi/transaction_id_previews.py +39 -0
  30. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/transaction_id_selection.py +4 -2
  31. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/virtual_column.py +1 -1
  32. mindbridge_api_python_client-1.6.0/pyproject.toml +0 -126
  33. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/LICENSE.txt +0 -0
  34. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/README.md +0 -0
  35. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_group_item.py +0 -0
  36. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/account_mapping_item.py +0 -0
  37. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/accounting_period.py +0 -0
  38. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analyses.py +0 -0
  39. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_item.py +0 -0
  40. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_result_item.py +0 -0
  41. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_results.py +0 -0
  42. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_source_type_item.py +0 -0
  43. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_source_types.py +0 -0
  44. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_type_item.py +0 -0
  45. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/analysis_types.py +0 -0
  46. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/async_results.py +0 -0
  47. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/chunked_file_item.py +0 -0
  48. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/chunked_file_part_item.py +0 -0
  49. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/chunked_files.py +0 -0
  50. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/column_mapping.py +0 -0
  51. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/engagements.py +0 -0
  52. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/analysis_source_type.py +0 -0
  53. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/analysis_type.py +0 -0
  54. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/enumerations/system_library.py +0 -0
  55. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/exceptions.py +0 -0
  56. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_manager.py +0 -0
  57. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_result_item.py +0 -0
  58. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/file_results.py +0 -0
  59. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/libraries.py +0 -0
  60. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/library_item.py +0 -0
  61. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/organization_item.py +0 -0
  62. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/organizations.py +0 -0
  63. {mindbridge_api_python_client-1.6.0 → mindbridge_api_python_client-1.6.1}/src/mindbridgeapi/users.py +0 -0
  64. {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
1
+ Metadata-Version: 2.3
2
2
  Name: mindbridge-api-python-client
3
- Version: 1.6.0
3
+ Version: 1.6.1
4
4
  Summary: Interact with the MindBridge API
5
- Home-page: https://www.mindbridge.ai
6
- License: Proprietary
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,<4.0
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.7,<3.0.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
- if (self.start_date > other.end_date) or (
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
- list[_VirtualColumn]
97
- ] = Field().merge_field_infos(
98
- ApiAnalysisSourceCreateOnly.model_fields["proposed_virtual_columns"]
99
- ) # type: ignore[assignment]
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
- list[_VirtualColumn]
111
- ] = Field().merge_field_infos(
112
- ApiAnalysisSourceUpdate.model_fields["proposed_virtual_columns"]
113
- ) # type: ignore[assignment]
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
- list[_VirtualColumn]
132
- ] = Field().merge_field_infos(
133
- ApiAnalysisSourceRead.model_fields["proposed_virtual_columns"]
134
- ) # type: ignore[assignment]
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 = AnalysisEffectiveDateMetricsPeriod.MONTH, # noqa:B950
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 ApiAsyncResult
17
- from mindbridgeapi.generated_pydantic_model.model import Status3 as _AsyncResultStatus
18
- from mindbridgeapi.generated_pydantic_model.model import Type1 as _AsyncResultType
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
- resp = self.server.http.request("POST", request_url, json=json)
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 ApiUserInfo, ApiUserInfoRead
15
- from mindbridgeapi.generated_pydantic_model.model import ApiUserRead as UserItem
16
- from mindbridgeapi.generated_pydantic_model.model import Role
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, limit=limit, sort=sort
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 pydantic import ConfigDict, field_validator, model_validator
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
- return EngagementAccountGroupingItem.model_validate(resp_dict)
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
- yield EngagementAccountGroupingItem.model_validate(resp_dict)
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
- Generator[EngagementAccountGroupingItem, None, None]
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