domaintools-api-test-upload 2.8.0__tar.gz → 2.8.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 (48) hide show
  1. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/PKG-INFO +1 -1
  2. domaintools_api_test_upload-2.8.1/VERSION +1 -0
  3. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/_version.py +1 -1
  4. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/base_results.py +12 -7
  5. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/PKG-INFO +1 -1
  6. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_api.py +28 -0
  7. domaintools_api_test_upload-2.8.0/VERSION +0 -1
  8. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/LICENSE +0 -0
  9. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/README.md +0 -0
  10. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/__init__.py +0 -0
  11. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/api.py +0 -0
  12. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/__init__.py +0 -0
  13. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/api.py +0 -0
  14. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/__init__.py +0 -0
  15. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/accounts.py +0 -0
  16. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/detects.py +0 -0
  17. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/domains.py +0 -0
  18. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/feeds.py +0 -0
  19. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/ips.py +0 -0
  20. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/commands/iris.py +0 -0
  21. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/constants.py +0 -0
  22. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/main.py +0 -0
  23. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/cli/utils.py +0 -0
  24. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/constants.py +0 -0
  25. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/decorators.py +0 -0
  26. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/docstring_patcher.py +0 -0
  27. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/exceptions.py +0 -0
  28. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/filters.py +0 -0
  29. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/request_validator.py +0 -0
  30. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/results.py +0 -0
  31. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/specs/iris-openapi.yaml +0 -0
  32. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools/utils.py +0 -0
  33. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/SOURCES.txt +0 -0
  34. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/dependency_links.txt +0 -0
  35. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/entry_points.txt +0 -0
  36. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/requires.txt +0 -0
  37. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_api_test_upload.egg-info/top_level.txt +0 -0
  38. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/domaintools_async/__init__.py +0 -0
  39. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/pyproject.toml +0 -0
  40. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/setup.cfg +0 -0
  41. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/setup.py +0 -0
  42. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_async.py +0 -0
  43. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_cli.py +0 -0
  44. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_decorators.py +0 -0
  45. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_docstring_patcher.py +0 -0
  46. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_filters.py +0 -0
  47. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_request_validator.py +0 -0
  48. {domaintools_api_test_upload-2.8.0 → domaintools_api_test_upload-2.8.1}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: domaintools_api_test_upload
3
- Version: 2.8.0
3
+ Version: 2.8.1
4
4
  Summary: DomainTools Official Python API
5
5
  Author-email: DomainTools <integrations@domaintools.com>
6
6
  License: The MIT License (MIT)
@@ -0,0 +1 @@
1
+ 2.8.1
@@ -20,4 +20,4 @@ OTHER DEALINGS IN THE SOFTWARE.
20
20
 
21
21
  """
22
22
 
23
- current = "2.8.0"
23
+ current = "2.8.1"
@@ -25,7 +25,6 @@ from domaintools.exceptions import (
25
25
  RequestUriTooLongException,
26
26
  )
27
27
 
28
-
29
28
  try: # pragma: no cover
30
29
  from collections.abc import MutableMapping, MutableSequence
31
30
  except ImportError: # pragma: no cover
@@ -111,7 +110,9 @@ class Results(MutableMapping, MutableSequence):
111
110
  if self.product == "iris-investigate" and "irisql" in self.kwargs:
112
111
  irisql_query = self.kwargs["irisql"]
113
112
  auth_keys = {"api_username", "timestamp", "signature", "api_key"}
114
- query_params = {k: v for k, v in self.kwargs.items() if k != "irisql" and k not in auth_keys}
113
+ query_params = {
114
+ k: v for k, v in self.kwargs.items() if k != "irisql" and k not in auth_keys
115
+ }
115
116
  query_params.update(self.api.extra_request_params)
116
117
  return session.post(
117
118
  url=self.url,
@@ -164,13 +165,13 @@ class Results(MutableMapping, MutableSequence):
164
165
  self._data = results.json()
165
166
  else:
166
167
  self._data = results.text
167
-
168
168
  self.check_limit_exceeded()
169
169
 
170
170
  return self._data
171
171
 
172
172
  def check_limit_exceeded(self):
173
173
  limit_exceeded, reason = False, ""
174
+
174
175
  if isinstance(self._data, dict) and (
175
176
  "response" in self._data
176
177
  and "limit_exceeded" in self._data["response"]
@@ -178,7 +179,13 @@ class Results(MutableMapping, MutableSequence):
178
179
  ):
179
180
  limit_exceeded, reason = True, self._data["response"]["message"]
180
181
  elif "response" in self._data and "limit_exceeded" in self._data:
181
- limit_exceeded = True
182
+ # check for xml format, and return the actual error message
183
+ if self.kwargs.get("format") == "xml" and isinstance(self._data, str):
184
+ if re.search(r"<limit_exceeded>1</limit_exceeded>", self._data):
185
+ msg = re.search(r"<message>(.*?)</message>", self._data)
186
+ limit_exceeded, reason = True, msg.group(1) if msg else ""
187
+ else:
188
+ limit_exceeded = True
182
189
 
183
190
  if limit_exceeded:
184
191
  raise ServiceException(503, f"Limit Exceeded {reason}")
@@ -354,9 +361,7 @@ class Results(MutableMapping, MutableSequence):
354
361
  )
355
362
 
356
363
  def as_list(self):
357
- return "\n".join(
358
- [json.dumps(item, indent=4, separators=(",", ": ")) for item in self._items()]
359
- )
364
+ return "\n".join([json.dumps(item, indent=4, separators=(",", ": ")) for item in self._items()])
360
365
 
361
366
  def __str__(self):
362
367
  return str(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: domaintools_api_test_upload
3
- Version: 2.8.0
3
+ Version: 2.8.1
4
4
  Summary: DomainTools Official Python API
5
5
  Author-email: DomainTools <integrations@domaintools.com>
6
6
  License: The MIT License (MIT)
@@ -602,6 +602,34 @@ def test_limit_exceeded():
602
602
  response.response()
603
603
 
604
604
 
605
+ def test_limit_exceeded_xml():
606
+ xml_response = """<response>
607
+ <error>
608
+ <code>413</code>
609
+ <message>Maximum 10000 returned - you may need to refine your query.</message>
610
+ </error>
611
+ <limit_exceeded>1</limit_exceeded>
612
+ <has_more_results>1</has_more_results>
613
+ <message>Maximum 10000 returned - you may need to refine your query.</message>
614
+ <missing_domains/>
615
+ </response>"""
616
+
617
+ mock_response = MagicMock()
618
+ mock_response.status_code = 200
619
+ mock_response.text = xml_response
620
+
621
+ with patch("domaintools.base_results.Client") as mock_client:
622
+ mock_session = MagicMock()
623
+ mock_client.return_value.__enter__.return_value = mock_session
624
+ mock_session.post.return_value = mock_response
625
+
626
+ with pytest.raises(exceptions.ServiceException) as exc_info:
627
+ result = api.iris_investigate(ip="8.8.8.8", format="xml")
628
+ result.data()
629
+
630
+ assert "Maximum 10000 returned" in str(exc_info.value)
631
+
632
+
605
633
  @vcr.use_cassette
606
634
  def test_newly_observed_domains_feed():
607
635
  results = feeds_api.nod(after="-60", top=5)
@@ -1 +0,0 @@
1
- 2.8.0