groundx 2.5.1__py3-none-any.whl → 2.5.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of groundx might be problematic. Click here for more details.

@@ -14,10 +14,10 @@ class BaseClientWrapper:
14
14
 
15
15
  def get_headers(self) -> typing.Dict[str, str]:
16
16
  headers: typing.Dict[str, str] = {
17
- "User-Agent": "groundx/2.5.1",
17
+ "User-Agent": "groundx/2.5.4",
18
18
  "X-Fern-Language": "Python",
19
19
  "X-Fern-SDK-Name": "groundx",
20
- "X-Fern-SDK-Version": "2.5.1",
20
+ "X-Fern-SDK-Version": "2.5.4",
21
21
  }
22
22
  headers["X-API-Key"] = self.api_key
23
23
  return headers
@@ -1,19 +1,25 @@
1
1
  from .agents import AgentCode, AgentTool
2
2
  from .classes import (
3
3
  AgentRequest,
4
- AgentSettings,
5
- ContainerSettings,
6
- ContainerUploadSettings,
7
4
  Document,
8
5
  DocumentRequest,
9
6
  ExtractedField,
10
7
  GroundXDocument,
11
- GroundXSettings,
12
8
  ProcessResponse,
13
9
  Prompt,
10
+ TestChunk,
11
+ TestDocumentPage,
12
+ TestField,
13
+ TestXRay,
14
14
  XRayDocument,
15
15
  )
16
16
  from .services import Logger, RateLimit, SheetsClient, Status, Upload
17
+ from .settings import (
18
+ AgentSettings,
19
+ ContainerSettings,
20
+ ContainerUploadSettings,
21
+ GroundXSettings,
22
+ )
17
23
 
18
24
  __all__ = [
19
25
  "AgentCode",
@@ -33,6 +39,10 @@ __all__ = [
33
39
  "RateLimit",
34
40
  "SheetsClient",
35
41
  "Status",
42
+ "TestChunk",
43
+ "TestDocumentPage",
44
+ "TestField",
45
+ "TestXRay",
36
46
  "Upload",
37
47
  "XRayDocument",
38
48
  ]
@@ -13,9 +13,9 @@ from smolagents.models import ( # pyright: ignore[reportMissingTypeStubs]
13
13
  OpenAIServerModel,
14
14
  )
15
15
 
16
- from ..classes.settings import AgentSettings
17
- from ..classes.utility import clean_json
18
16
  from ..services.logger import Logger
17
+ from ..settings.settings import AgentSettings
18
+ from ..utility.classes import clean_json
19
19
 
20
20
 
21
21
  prompt_suffix = """
@@ -4,24 +4,21 @@ from .document import Document, DocumentRequest
4
4
  from .field import ExtractedField
5
5
  from .groundx import GroundXDocument, XRayDocument
6
6
  from .prompt import Prompt
7
- from .settings import (
8
- AgentSettings,
9
- ContainerSettings,
10
- ContainerUploadSettings,
11
- GroundXSettings,
12
- )
7
+ from .test_field import TestField
8
+ from .test_groundx import TestChunk, TestDocumentPage, TestXRay
9
+
13
10
 
14
11
  __all__ = [
15
12
  "AgentRequest",
16
- "AgentSettings",
17
- "ContainerSettings",
18
- "ContainerUploadSettings",
19
13
  "Document",
20
14
  "DocumentRequest",
21
15
  "ExtractedField",
22
16
  "GroundXDocument",
23
- "GroundXSettings",
24
17
  "ProcessResponse",
25
18
  "Prompt",
19
+ "TestChunk",
20
+ "TestDocumentPage",
21
+ "TestField",
22
+ "TestXRay",
26
23
  "XRayDocument",
27
24
  ]
@@ -6,7 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field, PrivateAttr
6
6
 
7
7
  from .groundx import GroundXDocument
8
8
  from ..services.logger import Logger
9
- from .utility import clean_json
9
+ from ..utility.classes import clean_json
10
10
 
11
11
 
12
12
  DocT = typing.TypeVar("DocT", bound="Document")
@@ -116,6 +116,14 @@ class Document(BaseModel):
116
116
  self.logger.debug_msg(msg, self.file_name, self.document_id, self.task_id)
117
117
 
118
118
 
119
+ def _new_page_image_dict() -> typing.Dict[str, int]:
120
+ return {}
121
+
122
+
123
+ def _new_page_images() -> typing.List[Image.Image]:
124
+ return []
125
+
126
+
119
127
  class DocumentRequest(BaseModel):
120
128
  model_config = ConfigDict(populate_by_name=True)
121
129
  callback_url: str = Field(alias="callbackURL", default="")
@@ -131,10 +139,10 @@ class DocumentRequest(BaseModel):
131
139
  _clear_cache: bool = PrivateAttr(default_factory=bool)
132
140
  _debug_path: typing.Optional[str] = PrivateAttr(default=None)
133
141
  _page_image_dict: typing.Dict[str, int] = PrivateAttr(
134
- default_factory=typing.Dict[str, int]
142
+ default_factory=_new_page_image_dict
135
143
  )
136
144
  _page_images: typing.List[Image.Image] = PrivateAttr(
137
- default_factory=typing.List[Image.Image]
145
+ default_factory=_new_page_images
138
146
  )
139
147
  _start: int = PrivateAttr(
140
148
  default_factory=lambda: int(datetime.now(timezone.utc).timestamp())
@@ -2,7 +2,7 @@ import typing
2
2
 
3
3
  from pydantic import BaseModel
4
4
 
5
- from .utility import str_to_type_sequence
5
+ from ..utility.classes import str_to_type_sequence
6
6
 
7
7
 
8
8
  class Prompt(BaseModel):
@@ -7,6 +7,7 @@ from PIL import Image
7
7
  from unittest.mock import patch
8
8
 
9
9
  from .document import Document, DocumentRequest
10
+ from .test_groundx import TestXRay
10
11
 
11
12
 
12
13
  def DR(**data: typing.Any) -> DocumentRequest:
@@ -17,32 +18,6 @@ def test_request() -> DocumentRequest:
17
18
  return DR(documentID="D", fileName="F", modelID=1, processorID=1, taskID="T")
18
19
 
19
20
 
20
- class DummyChunk:
21
- def __init__(self, json_str: str):
22
- self.sectionSummary = None
23
- self.suggestedText = json_str
24
-
25
-
26
- class DummyDocumentPage:
27
- def __init__(self, page_url: str):
28
- self.pageUrl = page_url
29
-
30
-
31
- class DummyXRay:
32
- def __init__(
33
- self,
34
- source_url: str,
35
- chunks: typing.Optional[typing.List[DummyChunk]] = [],
36
- document_pages: typing.Optional[typing.List[str]] = [],
37
- ):
38
- self.chunks = chunks
39
- self.documentPages: typing.List[DummyDocumentPage] = []
40
- if document_pages is not None:
41
- for p in document_pages:
42
- self.documentPages.append(DummyDocumentPage(p))
43
- self.sourceUrl = source_url
44
-
45
-
46
21
  class TestDocument(unittest.TestCase):
47
22
  def setUp(self) -> None:
48
23
  patcher = patch(
@@ -50,7 +25,7 @@ class TestDocument(unittest.TestCase):
50
25
  )
51
26
  self.mock_xray = patcher.start()
52
27
  self.addCleanup(patcher.stop)
53
- self.mock_xray.return_value = DummyXRay("http://test.co", [])
28
+ self.mock_xray.return_value = TestXRay("http://test.co", [])
54
29
 
55
30
  def test_init_name(self) -> None:
56
31
  st1: Document = Document.from_request(
@@ -101,13 +76,13 @@ class TestDocumentRequest(unittest.TestCase):
101
76
  red_img.save(buf, format="PNG")
102
77
  img_bytes = buf.getvalue()
103
78
 
104
- class DummyResp:
79
+ class TestResp:
105
80
  content = img_bytes
106
81
 
107
82
  def raise_for_status(self) -> None:
108
83
  pass
109
84
 
110
- with patch("requests.get", return_value=DummyResp()):
85
+ with patch("requests.get", return_value=TestResp()):
111
86
  st = test_request()
112
87
  st.load_images(urls)
113
88
 
@@ -12,6 +12,32 @@ from .groundx import (
12
12
  )
13
13
 
14
14
 
15
+ class TestChunk:
16
+ def __init__(self, json_str: str):
17
+ self.sectionSummary = None
18
+ self.suggestedText = json_str
19
+
20
+
21
+ class TestDocumentPage:
22
+ def __init__(self, page_url: str):
23
+ self.pageUrl = page_url
24
+
25
+
26
+ class TestXRay:
27
+ def __init__(
28
+ self,
29
+ source_url: str,
30
+ chunks: typing.Optional[typing.List[TestChunk]] = [],
31
+ document_pages: typing.Optional[typing.List[str]] = [],
32
+ ):
33
+ self.chunks = chunks
34
+ self.documentPages: typing.List[TestDocumentPage] = []
35
+ if document_pages is not None:
36
+ for p in document_pages:
37
+ self.documentPages.append(TestDocumentPage(p))
38
+ self.sourceUrl = source_url
39
+
40
+
15
41
  def GD(**data: typing.Any) -> GroundXDocument:
16
42
  return GroundXDocument.model_validate(data)
17
43
 
@@ -0,0 +1,7 @@
1
+ from .post_process import check_map, check_valid
2
+
3
+
4
+ __all__ = [
5
+ "check_map",
6
+ "check_valid",
7
+ ]
@@ -64,7 +64,6 @@ class Logger:
64
64
  self,
65
65
  api_key: str,
66
66
  callback_url: str,
67
- result_url: str,
68
67
  req: typing.Dict[str, typing.Any],
69
68
  ):
70
69
  import requests
@@ -7,9 +7,9 @@ from starlette.responses import JSONResponse, Response
7
7
  from starlette.types import ASGIApp
8
8
 
9
9
  from ..classes.api import ProcessResponse
10
- from ..classes.settings import ContainerSettings
11
10
  from .logger import Logger
12
11
  from .status import Status
12
+ from ..settings.settings import ContainerSettings
13
13
  from .utility import get_gunicorn_threads, get_thread_id, get_worker_id
14
14
 
15
15
 
@@ -7,7 +7,7 @@ from googleapiclient.discovery import (
7
7
  )
8
8
  import gspread
9
9
 
10
- from ..classes.settings import ContainerSettings, GCP_CREDENTIALS
10
+ from ..settings.settings import ContainerSettings, GCP_CREDENTIALS
11
11
 
12
12
  SPREADSHEET_MIME = "application/vnd.google-apps.spreadsheet"
13
13
 
@@ -2,8 +2,8 @@ import typing
2
2
 
3
3
  from fastapi import Response
4
4
 
5
- from ..classes.settings import ContainerSettings
6
5
  from .logger import Logger
6
+ from ..settings.settings import ContainerSettings
7
7
 
8
8
 
9
9
  class Status:
@@ -1,7 +1,7 @@
1
1
  import typing
2
2
 
3
- from ..classes.settings import ContainerSettings
4
3
  from .logger import Logger
4
+ from ..settings.settings import ContainerSettings
5
5
 
6
6
 
7
7
  @typing.runtime_checkable
@@ -1,7 +1,7 @@
1
1
  import typing
2
2
 
3
- from ..classes.settings import ContainerSettings
4
3
  from .logger import Logger
4
+ from ..settings.settings import ContainerSettings
5
5
 
6
6
 
7
7
  class MinIOClient:
@@ -1,7 +1,7 @@
1
1
  import typing
2
2
 
3
- from ..classes.settings import ContainerSettings
4
3
  from .logger import Logger
4
+ from ..settings.settings import ContainerSettings
5
5
 
6
6
 
7
7
  class S3Client:
@@ -0,0 +1,15 @@
1
+ from .settings import (
2
+ AgentSettings,
3
+ ContainerSettings,
4
+ ContainerUploadSettings,
5
+ GroundXSettings,
6
+ GCP_CREDENTIALS,
7
+ )
8
+
9
+ __all__ = [
10
+ "AgentSettings",
11
+ "ContainerSettings",
12
+ "ContainerUploadSettings",
13
+ "GroundXSettings",
14
+ "GCP_CREDENTIALS",
15
+ ]
@@ -0,0 +1,6 @@
1
+ from .utility import error_response, success_response
2
+
3
+ __all__ = [
4
+ "error_response",
5
+ "success_response",
6
+ ]
@@ -0,0 +1,27 @@
1
+ import typing
2
+
3
+ from ..classes.api import ErrorResponse
4
+ from ..classes.document import DocumentRequest
5
+ from ..classes.groundx import GroundXResponse
6
+
7
+
8
+ def error_response(req: DocumentRequest, msg: str) -> typing.Dict[str, typing.Any]:
9
+ return ErrorResponse(
10
+ code=500,
11
+ documentID=req.document_id,
12
+ message=msg,
13
+ taskID=req.task_id,
14
+ ).model_dump(by_alias=True)
15
+
16
+
17
+ def success_response(
18
+ req: DocumentRequest, result_url: str
19
+ ) -> typing.Dict[str, typing.Any]:
20
+ return GroundXResponse(
21
+ code=200,
22
+ documentID=req.document_id,
23
+ modelID=req.model_id,
24
+ processorID=req.processor_id,
25
+ resultURL=result_url,
26
+ taskID=req.task_id,
27
+ ).model_dump(by_alias=True)
@@ -0,0 +1,15 @@
1
+ from .classes import (
2
+ class_fields,
3
+ clean_json,
4
+ coerce_numeric_string,
5
+ from_attr_name,
6
+ from_key,
7
+ )
8
+
9
+ __all__ = [
10
+ "class_fields",
11
+ "clean_json",
12
+ "coerce_numeric_string",
13
+ "from_attr_name",
14
+ "from_key",
15
+ ]
@@ -1,7 +1,7 @@
1
1
  import typing
2
2
 
3
3
  if typing.TYPE_CHECKING:
4
- from .prompt import Prompt
4
+ from ..classes.prompt import Prompt
5
5
 
6
6
 
7
7
  def class_fields(cls: typing.Any) -> typing.Set[str]:
@@ -1,6 +1,6 @@
1
1
  import typing, unittest
2
2
 
3
- from .utility import class_fields, coerce_numeric_string
3
+ from .classes import class_fields, coerce_numeric_string
4
4
 
5
5
 
6
6
  class DummyModelFields:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: groundx
3
- Version: 2.5.1
3
+ Version: 2.5.4
4
4
  Summary:
5
5
  License: MIT
6
6
  Requires-Python: >=3.8,<4.0
@@ -5,7 +5,7 @@ groundx/buckets/raw_client.py,sha256=T2Ty5obN7eHbaxHGAimzjM8MGOmSOQEckhciyZkzcjE
5
5
  groundx/client.py,sha256=FsVhPSZ1kd70pOVv37zTbNSwBM7XdttSx4aEPobPoew,6412
6
6
  groundx/core/__init__.py,sha256=lTcqUPXcx4112yLDd70RAPeqq6tu3eFMe1pKOqkW9JQ,1562
7
7
  groundx/core/api_error.py,sha256=44vPoTyWN59gonCIZMdzw7M1uspygiLnr3GNFOoVL2Q,614
8
- groundx/core/client_wrapper.py,sha256=8OOaFDaVg2BZ4aoF4sTYwUg2ayUYvR4sTosTVXGacK4,1822
8
+ groundx/core/client_wrapper.py,sha256=kBr56VbHQivYz9fqRz2MasKbw8mPJOr_zMhYwNVaF0s,1822
9
9
  groundx/core/datetime_utils.py,sha256=nBys2IsYrhPdszxGKCNRPSOCwa-5DWOHG95FB8G9PKo,1047
10
10
  groundx/core/file.py,sha256=d4NNbX8XvXP32z8KpK2Xovv33nFfruIrpz0QWxlgpZk,2663
11
11
  groundx/core/force_multipart.py,sha256=awxh5MtcRYe74ehY8U76jzv6fYM_w_D3Rur7KQQzSDk,429
@@ -28,37 +28,42 @@ groundx/environment.py,sha256=CInm1_DKtZ1mrxutmKb1qqv82P33r_S87hZD3Hc1VB0,159
28
28
  groundx/errors/__init__.py,sha256=Ua3Z6OWyRhcgrq0FSXOpwmOc4RxyTgzP2LXbkzGbMhk,234
29
29
  groundx/errors/bad_request_error.py,sha256=PnE3v3kETCXm9E3LiNcHLNtjPEUvpe98-r59q-kQb78,338
30
30
  groundx/errors/unauthorized_error.py,sha256=mryinHCAaknn5St2VF17R9XybZUcWRRYWEjxg63dQSA,340
31
- groundx/extract/__init__.py,sha256=zY16_7ZId6Q1sriEWAYZ9ZOJREuERkEqQkILZRZR-YA,762
31
+ groundx/extract/__init__.py,sha256=bIrn4ulZM0thiaz4zh32XyjnHNTcgmHzixYOsYK1e6M,928
32
32
  groundx/extract/agents/__init__.py,sha256=i95YB5jxXog8gn02t5c2to2zF00EZMiKjeukXZQt36g,90
33
- groundx/extract/agents/agent.py,sha256=A8yjswurw88wcFiNCGV4XgOuhdcN01KBfTRC6ER30_0,6157
34
- groundx/extract/classes/__init__.py,sha256=HIcCbkC7IdKBwV9KgL7HPQoIPsNkRPFa3ijEM7a2bSo,619
33
+ groundx/extract/agents/agent.py,sha256=vFvYv0_lHz4auejiCxz4bX0QG5JxHTEHOuBBcIOXWBI,6158
34
+ groundx/extract/classes/__init__.py,sha256=i7gl0O6K2THXwS8oszYlQ6lzvG4iglmvcuebqLvYH6A,574
35
35
  groundx/extract/classes/agent.py,sha256=4Uo6vca9s_1AcDv8Y2XSQiu5awOhQECgE55-kWUx2-8,677
36
36
  groundx/extract/classes/api.py,sha256=fgCwua4xf8oK2J8p-LYAFyeEpbGg1kETEUAGSH60lr4,345
37
- groundx/extract/classes/document.py,sha256=QL5A_WuAWReA3bfy6fzmQlo2AIhqjtl_eiYH9WkFxbU,9743
37
+ groundx/extract/classes/document.py,sha256=f-V1L95tBEOSMiTQEDBG4pVv2GgCba9oDnFOdzMvG2A,9880
38
38
  groundx/extract/classes/field.py,sha256=x8Y8MIytoeWeU6tpvczw2sLaIlQzCEvfRiO_-PjWEXE,2764
39
39
  groundx/extract/classes/groundx.py,sha256=lsOS9rkVqpZBZ8VsJaf06pyEv1Vk6BIoOKSRlQ2ei5k,3961
40
- groundx/extract/classes/post_process.py,sha256=K558NRMBYSfxfrAQrCYw9Ay5p57A6fRJWpzT9e_CN9U,669
41
- groundx/extract/classes/prompt.py,sha256=3lcEqJrJf21kgWvYEvK0SzMclRKYIbf7G-Orsm4Rw6g,941
42
- groundx/extract/classes/settings.py,sha256=oyw7cWgwqhPUx4d7sokp7MuCwyO_waZDbR9zFYWOb1k,4287
43
- groundx/extract/classes/test_document.py,sha256=MiItBqoMJ-XthE1RuPa-uOPf5k2QUHuqvULlFZ4LO6c,3875
40
+ groundx/extract/classes/prompt.py,sha256=yfngqn6C1uIVBLjDdDigq9aW1mnpQ3o12LI9zjPXh9c,950
41
+ groundx/extract/classes/test_document.py,sha256=I5HhSiASpqeCVg1y1gDUu0KY8O9KMQq4EXhx6H97z3Q,3198
44
42
  groundx/extract/classes/test_field.py,sha256=QVUGxRGOGl16kOmRHPg0RBCh9o5CB7GNN1h1GBNKLd8,1232
45
- groundx/extract/classes/test_groundx.py,sha256=Lvkv_JdaPUXCrbTcBbcroEbwWIkCRSALuhXxFS-rdK8,7426
43
+ groundx/extract/classes/test_groundx.py,sha256=s1WSjOLHyqMOnAMFjSwV_UeTwYLpt4sGpzls0KoB9MY,8129
46
44
  groundx/extract/classes/test_prompt.py,sha256=U8rKlxrDUMr4MpwKnurD1v1Ngw6NLPHRS8dOn2h0JcU,2240
47
- groundx/extract/classes/test_settings.py,sha256=n56UMaIcK7_rN5dUx1CNXsn0Yy7CI4g9jWDwLdl9NKE,18861
48
- groundx/extract/classes/test_utility.py,sha256=dLEWAf3Di3h-ayZtXHq5PtztvVi5XRx_Vj_44jaAtK0,3087
49
- groundx/extract/classes/utility.py,sha256=HJ11OpIlqcPJfIXQd-uNa2xB0IjPotgrhU_A_GwkspQ,4990
45
+ groundx/extract/post_process/__init__.py,sha256=hbiiouYIkC2-LNOz5LYywpEfhX4VvI_9wBKZ-T_XPdU,101
46
+ groundx/extract/post_process/post_process.py,sha256=K558NRMBYSfxfrAQrCYw9Ay5p57A6fRJWpzT9e_CN9U,669
50
47
  groundx/extract/services/.DS_Store,sha256=1lFlJ5EFymdzGAUAaI30vcaaLHt3F1LwpG7xILf9jsM,6148
51
48
  groundx/extract/services/__init__.py,sha256=Zf-PjjmUo5Nv1BaEQOjaFhI3QtOn7xSZo0Mccf9DOg0,249
52
49
  groundx/extract/services/csv.py,sha256=9ugPXvJYioM42wE2o4uXWyIlHMqkK_F6dCDpL_kyCzU,2132
53
- groundx/extract/services/logger.py,sha256=RdVu-eceDNZXEEbio_t8Vw3Ayjq9SaH3IXZJmBuZotA,3226
50
+ groundx/extract/services/logger.py,sha256=yuQ4eBs5eiHVZhlWlrROKNLuJ72G9hlJCcbT93lQO0o,3201
54
51
  groundx/extract/services/logging_cfg.py,sha256=pg-DZRNc751m-tjvHqZf9PbMPVVnHN6az7AiytCDstU,1603
55
- groundx/extract/services/ratelimit.py,sha256=po-g1qY73cmQk02cxQ_VokLM3yLLXbBEtg85yolpRww,3205
56
- groundx/extract/services/sheets_client.py,sha256=jBle7KT2T5-ZPLRNio5mP_b-UPzC7TpFGfTuJ-rTVQA,4858
57
- groundx/extract/services/status.py,sha256=oReCrw-vmZ3FEfjhGR1Bz0qmNr612EqMCuJHsMNnYIo,6699
58
- groundx/extract/services/upload.py,sha256=CS0o01n6rMugx6LYDPZerbaTHG4SV-UAOMxU_wSrAvY,1867
59
- groundx/extract/services/upload_minio.py,sha256=nJh9KEOOI98ZVSa7cAtHpslmsN1m5PJXrun6LEJdC7M,3853
60
- groundx/extract/services/upload_s3.py,sha256=cZtf5cYvbyh991ZdddMbW5CIKtOF9-oONy76-GhCsC4,2309
52
+ groundx/extract/services/ratelimit.py,sha256=PU-9YV9dhzyci0A5knlGEJvi4Jdyl9-hguI0v_DFnYA,3206
53
+ groundx/extract/services/sheets_client.py,sha256=0Sgy6dKYnjwdZ1He3m489D3mQ1038k5xBzbvgKO4BSs,4859
54
+ groundx/extract/services/status.py,sha256=n4_cP-1ZfH8KShlif16bwaSBhtI-7lI_5ecYgTvcKRc,6700
55
+ groundx/extract/services/upload.py,sha256=MyZWoEgGIJJoQEdkHdbfeJqpXxpS6UexBeBo8tNasU0,1868
56
+ groundx/extract/services/upload_minio.py,sha256=i4i5-_ER9_WvEKhYPIuqsg6oZckZdbA4aCKVUAbzw44,3854
57
+ groundx/extract/services/upload_s3.py,sha256=0jUC0V2qz4W-cavt4HaAxkOKAj5SdeGt1L-Dv4A5e50,2310
61
58
  groundx/extract/services/utility.py,sha256=nlAVgSFpzo0LPrm5dqexn2dmDa3cFmAmJpVHFE2rgnM,1321
59
+ groundx/extract/settings/__init__.py,sha256=1YJcL6whtsHNVd9AuOzdIx3vM5xeu5m6e4U5V39McmA,277
60
+ groundx/extract/settings/settings.py,sha256=oyw7cWgwqhPUx4d7sokp7MuCwyO_waZDbR9zFYWOb1k,4287
61
+ groundx/extract/settings/test_settings.py,sha256=n56UMaIcK7_rN5dUx1CNXsn0Yy7CI4g9jWDwLdl9NKE,18861
62
+ groundx/extract/tasks/__init__.py,sha256=fEtUoLXI2vNlbcogE5FmRk2t0ZRuM4xjFK7S4BF1Rws,115
63
+ groundx/extract/tasks/utility.py,sha256=6pJG0SLsj_zTtdFbMqXIUmbIH3kGLbYpOTQKweIIQcY,736
64
+ groundx/extract/utility/__init__.py,sha256=Wf8-yEKavFfI8VnoKevfuFK-SarD0FxAWYWydo1F-Ug,240
65
+ groundx/extract/utility/classes.py,sha256=4wVKK6hBCXxUyoF21RiZqpXvdl86aDHZDuCij6crfH8,4999
66
+ groundx/extract/utility/test_utility.py,sha256=UtzDmpIXi5uvSa0cIm0v6TFiJQ3_ukzkKEXkYr5LuuI,3087
62
67
  groundx/groups/__init__.py,sha256=_VhToAyIt_5axN6CLJwtxg3-CO7THa_23pbUzqhXJa4,85
63
68
  groundx/groups/client.py,sha256=QsZcOXVPHAdUPYPsfuFiPOkyssapSWLZYVD82NWmrSE,16810
64
69
  groundx/groups/raw_client.py,sha256=nP9yFh7MexjDUQU8TtB5j-HAmZJjQWOd78hu-KeMnRs,35111
@@ -121,7 +126,7 @@ groundx/types/subscription_detail.py,sha256=GEEivqyiLsZtd8Ow7mqqwF1y0m0tHD-t9r9d
121
126
  groundx/types/subscription_detail_meters.py,sha256=vGqiR2uupVh5177DfOghjoe5mwzVhoWljKzPF-twUc0,794
122
127
  groundx/types/website_source.py,sha256=53jWDBtSrJVOsBVtVbZbjhEAsd0QGkXa7IuKO4AooLs,1542
123
128
  groundx/version.py,sha256=1yVogKaq260fQfckM2RYN2144SEw0QROsZW8ICtkG4U,74
124
- groundx-2.5.1.dist-info/LICENSE,sha256=dFE6nY1bHnSn6NqmdlghlU1gQqLqYNphrceGVehSa7o,1065
125
- groundx-2.5.1.dist-info/METADATA,sha256=AAvV85HWtV7oWHEHXSkuT8O8NfkyVl-dnInbee7lp30,5833
126
- groundx-2.5.1.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
127
- groundx-2.5.1.dist-info/RECORD,,
129
+ groundx-2.5.4.dist-info/LICENSE,sha256=dFE6nY1bHnSn6NqmdlghlU1gQqLqYNphrceGVehSa7o,1065
130
+ groundx-2.5.4.dist-info/METADATA,sha256=DsmzsVhfBkNGUuF-M0WLdwD6M0PmGj3o_b899azbkuo,5833
131
+ groundx-2.5.4.dist-info/WHEEL,sha256=Zb28QaM1gQi8f4VCBhsUklF61CTlNYfs9YAZn-TOGFk,88
132
+ groundx-2.5.4.dist-info/RECORD,,
File without changes
File without changes