fmu-sumo 2.4.2__tar.gz → 2.4.4__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 (66) hide show
  1. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.github/workflows/build_docs.yaml +1 -1
  2. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.github/workflows/publish_release.yaml +1 -1
  3. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.github/workflows/run_tests.yaml +4 -1
  4. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/PKG-INFO +2 -2
  5. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/pyproject.toml +4 -17
  6. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/_version.py +2 -2
  7. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/_child.py +5 -0
  8. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/_search_context.py +71 -139
  9. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu_sumo.egg-info/PKG-INFO +2 -2
  10. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.github/pull_request_template.md +0 -0
  11. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.github/workflows/check_formatting.yml +0 -0
  12. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.gitignore +0 -0
  13. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.pre-commit-config.yaml +0 -0
  14. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/.readthedocs.yml +0 -0
  15. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/CONTRIBUTING.md +0 -0
  16. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/LICENSE +0 -0
  17. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/README.md +0 -0
  18. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/SECURITY.md +0 -0
  19. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/_static/equinor-logo.png +0 -0
  20. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/_static/equinor-logo2.jpg +0 -0
  21. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/_static/equinor_logo.jpg +0 -0
  22. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/_static/equinor_logo_only.jpg +0 -0
  23. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/_templates/layout.html +0 -0
  24. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/conf.py +0 -0
  25. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/explorer.rst +0 -0
  26. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/docs/index.rst +0 -0
  27. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/examples/explorer.ipynb +0 -0
  28. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/examples/explorer2.ipynb +0 -0
  29. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/examples/grids-and-properties.ipynb +0 -0
  30. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/examples/metrics.ipynb +0 -0
  31. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/examples/table-aggregation.ipynb +0 -0
  32. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/examples/tables.ipynb +0 -0
  33. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/setup.cfg +0 -0
  34. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/__init__.py +0 -0
  35. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/__init__.py +0 -0
  36. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/__init__.py +0 -0
  37. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/cache.py +0 -0
  38. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/explorer.py +0 -0
  39. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/filters.py +0 -0
  40. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/__init__.py +0 -0
  41. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/_document.py +0 -0
  42. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/_metrics.py +0 -0
  43. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/case.py +0 -0
  44. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/cases.py +0 -0
  45. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/cpgrid.py +0 -0
  46. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/cpgrid_property.py +0 -0
  47. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/cube.py +0 -0
  48. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/dictionary.py +0 -0
  49. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/ensemble.py +0 -0
  50. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/ensembles.py +0 -0
  51. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/iteration.py +0 -0
  52. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/iterations.py +0 -0
  53. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/polygons.py +0 -0
  54. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/realization.py +0 -0
  55. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/realizations.py +0 -0
  56. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/surface.py +0 -0
  57. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/objects/table.py +0 -0
  58. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu/sumo/explorer/timefilter.py +0 -0
  59. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu_sumo.egg-info/SOURCES.txt +0 -0
  60. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu_sumo.egg-info/dependency_links.txt +0 -0
  61. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu_sumo.egg-info/requires.txt +0 -0
  62. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/src/fmu_sumo.egg-info/top_level.txt +0 -0
  63. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/tests/conftest.py +0 -0
  64. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/tests/context.py +0 -0
  65. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/tests/test_explorer.py +0 -0
  66. {fmu_sumo-2.4.2 → fmu_sumo-2.4.4}/tests/test_objects_table.py +0 -0
@@ -14,7 +14,7 @@ jobs:
14
14
  runs-on: ${{ matrix.os }}
15
15
  strategy:
16
16
  matrix:
17
- python-version: ["3.10"]
17
+ python-version: ["3.12"]
18
18
  os: [ubuntu-latest]
19
19
 
20
20
  steps:
@@ -18,7 +18,7 @@ jobs:
18
18
 
19
19
  - uses: actions/setup-python@v5
20
20
  with:
21
- python-version: "3.10"
21
+ python-version: "3.12"
22
22
 
23
23
  - name: build
24
24
  run: |
@@ -11,8 +11,11 @@ jobs:
11
11
  runs-on: ${{ matrix.os }}
12
12
  strategy:
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11", "3.12"]
14
+ python-version: ["3.11", "3.12"]
15
15
  os: [ubuntu-latest, windows-latest, macos-13]
16
+ exclude:
17
+ - os: windows-latest
18
+ python-version: "3.11"
16
19
  permissions:
17
20
  contents: read
18
21
  id-token: write
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmu-sumo
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: Python package for interacting with Sumo in an FMU setting
5
5
  Author: Equinor
6
6
  License: Apache License
@@ -209,7 +209,7 @@ Project-URL: Repository, https://github.com/equinor/fmu-sumo
209
209
  Platform: any
210
210
  Classifier: License :: OSI Approved :: Apache Software License
211
211
  Classifier: Programming Language :: Python
212
- Requires-Python: >=3.8
212
+ Requires-Python: >=3.11
213
213
  Description-Content-Type: text/markdown
214
214
  License-File: LICENSE
215
215
  Requires-Dist: sumo-wrapper-python
@@ -8,7 +8,7 @@ version_file = "src/fmu/sumo/explorer/_version.py"
8
8
  [project]
9
9
  name = "fmu-sumo"
10
10
  description = "Python package for interacting with Sumo in an FMU setting"
11
- requires-python = ">=3.8"
11
+ requires-python = ">=3.11"
12
12
  dynamic = ["version"]
13
13
  license = { file = "LICENSE" }
14
14
  readme = { file = "README.md", content-type = "text/markdown" }
@@ -17,10 +17,7 @@ classifiers = [
17
17
  "License :: OSI Approved :: Apache Software License",
18
18
  "Programming Language :: Python",
19
19
  ]
20
- dependencies = [
21
- "sumo-wrapper-python",
22
- "deprecation",
23
- ]
20
+ dependencies = ["sumo-wrapper-python", "deprecation"]
24
21
 
25
22
  [project.urls]
26
23
  Repository = "https://github.com/equinor/fmu-sumo"
@@ -58,21 +55,12 @@ platforms = ["any"]
58
55
  where = ["src"]
59
56
 
60
57
  [tool.ruff]
61
- exclude = [
62
- ".env",
63
- ".git",
64
- ".github",
65
- ".venv",
66
- "venv",
67
- ]
58
+ exclude = [".env", ".git", ".github", ".venv", "venv"]
68
59
 
69
60
  line-length = 79
70
61
 
71
62
  [tool.ruff.lint]
72
- ignore = [
73
- "E501",
74
- "PD901",
75
- ]
63
+ ignore = ["E501", "PD901"]
76
64
 
77
65
  extend-select = [
78
66
  "C4", # Flake8-comprehensions
@@ -88,4 +76,3 @@ extend-select = [
88
76
  "__init__.py" = ["F401"]
89
77
  "tests/context.py" = ["F401"]
90
78
  "examples/explorer.ipynb" = ["F821"]
91
-
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.4.2'
21
- __version_tuple__ = version_tuple = (2, 4, 2)
20
+ __version__ = version = '2.4.4'
21
+ __version_tuple__ = version_tuple = (2, 4, 4)
@@ -140,6 +140,11 @@ class Child(Document):
140
140
  """Object iteration"""
141
141
  return self.get_property("fmu.iteration.name")
142
142
 
143
+ @property
144
+ def ensemble(self) -> str:
145
+ """Object ensemble"""
146
+ return self.get_property("fmu.ensemble.name")
147
+
143
148
  @property
144
149
  def context(self) -> str:
145
150
  """Object context"""
@@ -1,10 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import json
4
- import uuid
5
4
  import warnings
6
5
  from datetime import datetime
7
- from io import BytesIO
8
6
  from typing import TYPE_CHECKING, Any, Dict, List, Tuple, Union
9
7
 
10
8
  import deprecation
@@ -1484,12 +1482,10 @@ class SearchContext:
1484
1482
  """
1485
1483
  return await self._get_object_by_class_and_uuid_async("table", uuid)
1486
1484
 
1487
- def _verify_aggregation_operation(
1488
- self,
1489
- ) -> Tuple[Dict, List[str], List[int]]:
1490
- query = {
1485
+ def __prepare_verify_aggregation_query(self) -> Dict:
1486
+ return {
1491
1487
  "query": self._query,
1492
- "size": 1,
1488
+ "size": 0,
1493
1489
  "track_total_hits": True,
1494
1490
  "aggs": {
1495
1491
  k: {"terms": {"field": k + ".keyword", "size": 1}}
@@ -1497,85 +1493,85 @@ class SearchContext:
1497
1493
  "fmu.case.uuid",
1498
1494
  "class",
1499
1495
  "fmu.ensemble.name",
1496
+ "fmu.entity.uuid",
1500
1497
  "data.name",
1501
1498
  "data.tagname",
1502
1499
  "data.content",
1503
1500
  ]
1504
1501
  },
1505
1502
  }
1506
- sres = self._sumo.post("/search", json=query).json()
1507
- if len(sres["hits"]["hits"]) == 0:
1503
+
1504
+ def __verify_aggregation_operation(
1505
+ self, sres
1506
+ ) -> Tuple[str, str, str, str]:
1507
+ tot_hits = sres["hits"]["total"]["value"]
1508
+ if tot_hits == 0:
1508
1509
  raise Exception("No matching realizations found.")
1509
- prototype = sres["hits"]["hits"][0]
1510
1510
  conflicts = [
1511
1511
  k
1512
1512
  for (k, v) in sres["aggregations"].items()
1513
1513
  if (
1514
- ("sum_other_doc_count" in v) and (v["sum_other_doc_count"] > 0)
1514
+ ("sum_other_doc_count" in v)
1515
+ and (v["sum_other_doc_count"] > 0)
1516
+ or v["buckets"][0]["doc_count"] != tot_hits
1515
1517
  )
1516
1518
  ]
1517
1519
  if len(conflicts) > 0:
1518
1520
  raise Exception(f"Conflicting values for {conflicts}")
1521
+ entityuuid = sres["aggregations"]["fmu.entity.uuid"]["buckets"][0][
1522
+ "key"
1523
+ ]
1524
+ caseuuid = sres["aggregations"]["fmu.case.uuid"]["buckets"][0]["key"]
1525
+ ensemblename = sres["aggregations"]["fmu.ensemble.name"]["buckets"][0][
1526
+ "key"
1527
+ ]
1528
+ classname = sres["aggregations"]["class"]["buckets"][0]["key"]
1529
+ return caseuuid, classname, entityuuid, ensemblename
1519
1530
 
1520
- hits = self._search_all(select=["fmu.realization.id"])
1521
-
1522
- if any(
1523
- hit["_source"]["fmu"].get("realization") is None for hit in hits
1524
- ):
1525
- raise Exception("Selection contains non-realization data.")
1526
-
1527
- uuids = [hit["_id"] for hit in hits]
1528
- rids = [hit["_source"]["fmu"]["realization"]["id"] for hit in hits]
1529
- return prototype, uuids, rids
1530
-
1531
- def _aggregate(self, columns=None, operation=None) -> objects.Child:
1531
+ def _verify_aggregation_operation(
1532
+ self, columns, operation
1533
+ ) -> Tuple[str, str, str, str]:
1532
1534
  assert (
1533
1535
  operation != "collection"
1534
1536
  or columns is not None
1535
1537
  and len(columns) == 1
1536
1538
  ), "Exactly one column required for collection aggregation."
1537
- prototype, uuids, rids = self.filter(
1538
- column=columns
1539
- )._verify_aggregation_operation()
1539
+ sc = self if columns is None else self.filter(column=columns)
1540
+ query = sc.__prepare_verify_aggregation_query()
1541
+ sres = sc._sumo.post("/search", json=query).json()
1542
+ return sc.__verify_aggregation_operation(sres)
1543
+
1544
+ def __prepare_aggregation_spec(
1545
+ self, caseuuid, classname, entityuuid, ensemblename, operation, columns
1546
+ ):
1540
1547
  spec = {
1541
- "object_ids": uuids,
1548
+ "case_uuid": caseuuid,
1549
+ "class": classname,
1550
+ "entity_uuid": entityuuid,
1551
+ "ensemble_name": ensemblename,
1552
+ "iteration_name": ensemblename,
1542
1553
  "operations": [operation],
1543
1554
  }
1544
- del prototype["_source"]["fmu"]["realization"]
1545
- del prototype["_source"]["_sumo"]
1546
- del prototype["_source"]["file"]
1547
- if "context" in prototype["_source"]["fmu"]:
1548
- prototype["_source"]["fmu"]["context"]["stage"] = "ensemble"
1549
- pass
1550
- prototype["_source"]["fmu"]["aggregation"] = {
1551
- "id": str(uuid.uuid4()),
1552
- "realization_ids": rids,
1553
- "operation": operation,
1554
- }
1555
1555
  if columns is not None:
1556
1556
  spec["columns"] = columns
1557
- cols = columns[:]
1558
- table_index = prototype["_source"]["data"].get("table_index")
1559
- if (
1560
- table_index is not None
1561
- and len(table_index) != 0
1562
- and table_index[0] not in cols
1563
- ):
1564
- cols.insert(0, table_index[0])
1565
- pass
1566
- prototype["_source"]["data"]["spec"]["columns"] = cols
1567
- pass
1557
+ return spec
1558
+
1559
+ def _aggregate(self, columns=None, operation=None) -> objects.Child:
1560
+ caseuuid, classname, entityuuid, ensemblename = (
1561
+ self._verify_aggregation_operation(columns, operation)
1562
+ )
1563
+ spec = self.__prepare_aggregation_spec(
1564
+ caseuuid, classname, entityuuid, ensemblename, operation, columns
1565
+ )
1566
+ spec["object_ids"] = self.uuids
1568
1567
  try:
1569
1568
  res = self._sumo.post("/aggregations", json=spec)
1570
1569
  except httpx.HTTPStatusError as ex:
1571
1570
  print(ex.response.reason_phrase)
1572
1571
  print(ex.response.text)
1573
1572
  raise ex
1574
- blob = BytesIO(res.content)
1575
- res = self._to_sumo(prototype, blob)
1576
- assert isinstance(res, objects.Child)
1577
- res._blob = blob
1578
- return res
1573
+ res = self._sumo.poll(res).json()
1574
+ return self._to_sumo(res)
1579
1575
 
1580
1576
  def aggregate(self, columns=None, operation=None) -> objects.Child:
1581
1577
  if len(self.hidden) > 0:
@@ -1586,103 +1582,39 @@ class SearchContext:
1586
1582
  )
1587
1583
 
1588
1584
  async def _verify_aggregation_operation_async(
1589
- self,
1590
- ) -> Tuple[Dict, List[str], List[int]]:
1591
- query = {
1592
- "query": self._query,
1593
- "size": 1,
1594
- "track_total_hits": True,
1595
- "aggs": {
1596
- k: {"terms": {"field": k + ".keyword", "size": 1}}
1597
- for k in [
1598
- "fmu.case.uuid",
1599
- "class",
1600
- "fmu.ensemble.name",
1601
- "data.name",
1602
- "data.tagname",
1603
- "data.content",
1604
- ]
1605
- },
1606
- }
1607
- sres = (await self._sumo.post_async("/search", json=query)).json()
1608
- if len(sres["hits"]["hits"]) == 0:
1609
- raise Exception("No matching realizations found.")
1610
- prototype = sres["hits"]["hits"][0]
1611
- conflicts = [
1612
- k
1613
- for (k, v) in sres["aggregations"].items()
1614
- if (
1615
- ("sum_other_doc_count" in v) and (v["sum_other_doc_count"] > 0)
1616
- )
1617
- ]
1618
- if len(conflicts) > 0:
1619
- raise Exception(f"Conflicting values for {conflicts}")
1620
-
1621
- hits = await self._search_all_async(select=["fmu.realization.id"])
1622
-
1623
- if any(
1624
- hit["_source"]["fmu"].get("realization") is None for hit in hits
1625
- ):
1626
- raise Exception("Selection contains non-realization data.")
1627
-
1628
- uuids = [hit["_id"] for hit in hits]
1629
- rids = [hit["_source"]["fmu"]["realization"]["id"] for hit in hits]
1630
- return prototype, uuids, rids
1631
-
1632
- async def _aggregate_async(
1633
- self, columns=None, operation=None
1634
- ) -> objects.Child:
1585
+ self, columns, operation
1586
+ ) -> Tuple[str, str, str, str]:
1635
1587
  assert (
1636
1588
  operation != "collection"
1637
1589
  or columns is not None
1638
1590
  and len(columns) == 1
1639
1591
  ), "Exactly one column required for collection aggregation."
1592
+ sc = self if columns is None else self.filter(column=columns)
1593
+ query = sc.__prepare_verify_aggregation_query()
1594
+ sres = (await self._sumo.post_async("/search", json=query)).json()
1595
+ return sc.__verify_aggregation_operation(sres)
1596
+
1597
+ async def _aggregate_async(
1598
+ self, columns=None, operation=None
1599
+ ) -> objects.Child:
1640
1600
  (
1641
- prototype,
1642
- uuids,
1643
- rids,
1644
- ) = await self.filter(
1645
- column=columns
1646
- )._verify_aggregation_operation_async()
1647
- spec = {
1648
- "object_ids": uuids,
1649
- "operations": [operation],
1650
- }
1651
- del prototype["_source"]["fmu"]["realization"]
1652
- del prototype["_source"]["_sumo"]
1653
- del prototype["_source"]["file"]
1654
- if "context" in prototype["_source"]["fmu"]:
1655
- prototype["_source"]["fmu"]["context"]["stage"] = "ensemble"
1656
- pass
1657
- prototype["_source"]["fmu"]["aggregation"] = {
1658
- "id": str(uuid.uuid4()),
1659
- "realization_ids": rids,
1660
- "operation": operation,
1661
- }
1662
- if columns is not None:
1663
- spec["columns"] = columns
1664
- cols = columns[:]
1665
- table_index = prototype["_source"]["data"].get("table_index")
1666
- if (
1667
- table_index is not None
1668
- and len(table_index) != 0
1669
- and table_index[0] not in cols
1670
- ):
1671
- cols.insert(0, table_index[0])
1672
- pass
1673
- prototype["_source"]["data"]["spec"]["columns"] = cols
1674
- pass
1601
+ caseuuid,
1602
+ classname,
1603
+ entityuuid,
1604
+ ensemblename,
1605
+ ) = await self._verify_aggregation_operation_async(columns, operation)
1606
+ spec = self.__prepare_aggregation_spec(
1607
+ caseuuid, classname, entityuuid, ensemblename, operation, columns
1608
+ )
1609
+ spec["object_ids"] = await self.uuids_async
1675
1610
  try:
1676
1611
  res = await self._sumo.post_async("/aggregations", json=spec)
1677
1612
  except httpx.HTTPStatusError as ex:
1678
1613
  print(ex.response.reason_phrase)
1679
1614
  print(ex.response.text)
1680
1615
  raise ex
1681
- blob = BytesIO(res.content)
1682
- res = self._to_sumo(prototype, blob)
1683
- assert isinstance(res, objects.Child)
1684
- res._blob = blob
1685
- return res
1616
+ res = self._sumo.poll(res).json()
1617
+ return self._to_sumo(res)
1686
1618
 
1687
1619
  async def aggregate_async(
1688
1620
  self, columns=None, operation=None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmu-sumo
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: Python package for interacting with Sumo in an FMU setting
5
5
  Author: Equinor
6
6
  License: Apache License
@@ -209,7 +209,7 @@ Project-URL: Repository, https://github.com/equinor/fmu-sumo
209
209
  Platform: any
210
210
  Classifier: License :: OSI Approved :: Apache Software License
211
211
  Classifier: Programming Language :: Python
212
- Requires-Python: >=3.8
212
+ Requires-Python: >=3.11
213
213
  Description-Content-Type: text/markdown
214
214
  License-File: LICENSE
215
215
  Requires-Dist: sumo-wrapper-python
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes