tcex 4.0.11.dev0__tar.gz → 4.0.11.dev2__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 (386) hide show
  1. {tcex-4.0.11.dev0/tcex.egg-info → tcex-4.0.11.dev2}/PKG-INFO +1 -1
  2. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/pyproject.toml +1 -1
  3. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/__metadata__.py +1 -1
  4. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/batch.py +1 -138
  5. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/batch_submit.py +143 -2
  6. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/object_abc.py +12 -1
  7. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/object_collection_abc.py +6 -5
  8. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2/tcex.egg-info}/PKG-INFO +1 -1
  9. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/LICENSE +0 -0
  10. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/README.md +0 -0
  11. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/setup.cfg +0 -0
  12. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/__init__.py +0 -0
  13. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/__init__.py +0 -0
  14. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/api.py +0 -0
  15. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/__init__.py +0 -0
  16. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/tc.py +0 -0
  17. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/__init__.py +0 -0
  18. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/model/__init__.py +0 -0
  19. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/model/transform_model.py +0 -0
  20. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/ti_predefined_functions.py +0 -0
  21. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/ti_transform.py +0 -0
  22. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/ti_transform/transform_abc.py +0 -0
  23. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/util/__init__.py +0 -0
  24. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/util/threat_intel_util.py +0 -0
  25. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/__init__.py +0 -0
  26. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/__init__.py +0 -0
  27. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/association.py +0 -0
  28. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/attribute.py +0 -0
  29. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/batch_writer.py +0 -0
  30. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/group.py +0 -0
  31. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/indicator.py +0 -0
  32. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/security_label.py +0 -0
  33. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/batch/tag.py +0 -0
  34. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/datastore/__init__.py +0 -0
  35. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/datastore/cache.py +0 -0
  36. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/datastore/datastore.py +0 -0
  37. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/metric/__init__.py +0 -0
  38. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/metric/metric.py +0 -0
  39. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/notification/__init__.py +0 -0
  40. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/notification/notification.py +0 -0
  41. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/__init__.py +0 -0
  42. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/__init__.py +0 -0
  43. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/filters.py +0 -0
  44. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/__init__.py +0 -0
  45. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group.py +0 -0
  46. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/__init__.py +0 -0
  47. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/adversary.py +0 -0
  48. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/attack_pattern.py +0 -0
  49. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/campaign.py +0 -0
  50. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/course_of_action.py +0 -0
  51. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/document.py +0 -0
  52. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/email.py +0 -0
  53. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/event.py +0 -0
  54. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/incident.py +0 -0
  55. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/intrusion_set.py +0 -0
  56. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/malware.py +0 -0
  57. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/report.py +0 -0
  58. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/signature.py +0 -0
  59. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/tactic.py +0 -0
  60. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/threat.py +0 -0
  61. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/tool.py +0 -0
  62. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/group/group_type/vulnerability.py +0 -0
  63. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/__init__.py +0 -0
  64. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator.py +0 -0
  65. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/__init__.py +0 -0
  66. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/address.py +0 -0
  67. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/email_address.py +0 -0
  68. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/file.py +0 -0
  69. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/host.py +0 -0
  70. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/indicator/indicator_type/url.py +0 -0
  71. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/mapping.py +0 -0
  72. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/owner.py +0 -0
  73. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/security_label.py +0 -0
  74. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/tag.py +0 -0
  75. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/tags.py +0 -0
  76. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/task.py +0 -0
  77. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/mapping/victim.py +0 -0
  78. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/tcex_ti_tc_request.py +0 -0
  79. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/threat_intelligence/threat_intelligence.py +0 -0
  80. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v2/v2.py +0 -0
  81. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/__init__.py +0 -0
  82. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/__init__.py +0 -0
  83. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen.py +0 -0
  84. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_abc.py +0 -0
  85. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_args_abc.py +0 -0
  86. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_filter_abc.py +0 -0
  87. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_model_abc.py +0 -0
  88. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_gen_object_abc.py +0 -0
  89. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_options_abc.py +0 -0
  90. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_options_data_filter.py +0 -0
  91. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/_options_data_object.py +0 -0
  92. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/model/__init__.py +0 -0
  93. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/model/_filter_model.py +0 -0
  94. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/_gen/model/_property_model.py +0 -0
  95. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/adversary_assets/__init__.py +0 -0
  96. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/api_endpoints.py +0 -0
  97. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/__init__.py +0 -0
  98. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/artifact_type.py +0 -0
  99. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/artifact_type_filter.py +0 -0
  100. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifact_types/artifact_type_model.py +0 -0
  101. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/__init__.py +0 -0
  102. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/artifact.py +0 -0
  103. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/artifact_filter.py +0 -0
  104. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/artifacts/artifact_model.py +0 -0
  105. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/__init__.py +0 -0
  106. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/attribute_type.py +0 -0
  107. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/attribute_type_filter.py +0 -0
  108. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attribute_types/attribute_type_model.py +0 -0
  109. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attributes/__init__.py +0 -0
  110. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/attributes/attribute_model.py +0 -0
  111. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/__init__.py +0 -0
  112. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/case_attribute.py +0 -0
  113. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/case_attribute_filter.py +0 -0
  114. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_attributes/case_attribute_model.py +0 -0
  115. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_management/__init__.py +0 -0
  116. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/case_management/case_management.py +0 -0
  117. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/__init__.py +0 -0
  118. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/case.py +0 -0
  119. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/case_filter.py +0 -0
  120. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/cases/case_model.py +0 -0
  121. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_actions/__init__.py +0 -0
  122. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_actions/file_action_model.py +0 -0
  123. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_occurrences/__init__.py +0 -0
  124. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/file_occurrences/file_occurrence_model.py +0 -0
  125. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/filter_abc.py +0 -0
  126. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/__init__.py +0 -0
  127. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/group_attribute.py +0 -0
  128. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/group_attribute_filter.py +0 -0
  129. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/group_attributes/group_attribute_model.py +0 -0
  130. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/__init__.py +0 -0
  131. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/group.py +0 -0
  132. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/group_filter.py +0 -0
  133. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/groups/group_model.py +0 -0
  134. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/__init__.py +0 -0
  135. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/indicator_attribute.py +0 -0
  136. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/indicator_attribute_filter.py +0 -0
  137. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicator_attributes/indicator_attribute_model.py +0 -0
  138. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/__init__.py +0 -0
  139. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/indicator.py +0 -0
  140. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/indicator_filter.py +0 -0
  141. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/indicators/indicator_model.py +0 -0
  142. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirement/__init__.py +0 -0
  143. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirement/ir.py +0 -0
  144. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/__init__.py +0 -0
  145. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/__init__.py +0 -0
  146. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/category.py +0 -0
  147. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/category_filter.py +0 -0
  148. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/categories/category_model.py +0 -0
  149. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_req_type_model.py +0 -0
  150. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_requirement.py +0 -0
  151. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_requirement_filter.py +0 -0
  152. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/intel_requirement_model.py +0 -0
  153. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/keyword_sections/__init__.py +0 -0
  154. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/keyword_sections/keyword_section_model.py +0 -0
  155. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/__init__.py +0 -0
  156. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/result.py +0 -0
  157. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/result_filter.py +0 -0
  158. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/results/result_model.py +0 -0
  159. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/__init__.py +0 -0
  160. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/subtype.py +0 -0
  161. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/subtype_filter.py +0 -0
  162. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/intel_requirements/subtypes/subtype_model.py +0 -0
  163. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/__init__.py +0 -0
  164. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/note.py +0 -0
  165. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/note_filter.py +0 -0
  166. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/notes/note_model.py +0 -0
  167. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/__init__.py +0 -0
  168. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/assignee_model.py +0 -0
  169. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/assignee_user_group_model.py +0 -0
  170. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/assignee_user_model.py +0 -0
  171. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/__init__.py +0 -0
  172. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/exclusion_list.py +0 -0
  173. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/exclusion_list_filter.py +0 -0
  174. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/exclusion_lists/exclusion_list_model.py +0 -0
  175. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/__init__.py +0 -0
  176. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/owner_role.py +0 -0
  177. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/owner_role_filter.py +0 -0
  178. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owner_roles/owner_role_model.py +0 -0
  179. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/__init__.py +0 -0
  180. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/owner.py +0 -0
  181. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/owner_filter.py +0 -0
  182. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/owners/owner_model.py +0 -0
  183. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/security.py +0 -0
  184. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/__init__.py +0 -0
  185. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/system_role.py +0 -0
  186. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/system_role_filter.py +0 -0
  187. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/system_roles/system_role_model.py +0 -0
  188. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/task_assignee_model.py +0 -0
  189. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/__init__.py +0 -0
  190. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/user_group.py +0 -0
  191. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/user_group_filter.py +0 -0
  192. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/user_groups/user_group_model.py +0 -0
  193. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/__init__.py +0 -0
  194. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/user.py +0 -0
  195. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/user_filter.py +0 -0
  196. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security/users/user_model.py +0 -0
  197. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/__init__.py +0 -0
  198. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/security_label.py +0 -0
  199. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/security_label_filter.py +0 -0
  200. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/security_labels/security_label_model.py +0 -0
  201. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/__init__.py +0 -0
  202. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/default_naics_tags.py +0 -0
  203. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/mitre_tags.py +0 -0
  204. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/naics_tags.py +0 -0
  205. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/tag.py +0 -0
  206. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/tag_filter.py +0 -0
  207. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tags/tag_model.py +0 -0
  208. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/__init__.py +0 -0
  209. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/task.py +0 -0
  210. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/task_filter.py +0 -0
  211. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tasks/task_model.py +0 -0
  212. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/threat_intelligence/__init__.py +0 -0
  213. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/threat_intelligence/threat_intelligence.py +0 -0
  214. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/__init__.py +0 -0
  215. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/tql.py +0 -0
  216. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/tql_operator.py +0 -0
  217. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/tql/tql_type.py +0 -0
  218. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/v3.py +0 -0
  219. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/v3_model_abc.py +0 -0
  220. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/v3_types.py +0 -0
  221. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/__init__.py +0 -0
  222. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/victim_asset.py +0 -0
  223. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/victim_asset_filter.py +0 -0
  224. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_assets/victim_asset_model.py +0 -0
  225. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/__init__.py +0 -0
  226. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/victim_attribute.py +0 -0
  227. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/victim_attribute_filter.py +0 -0
  228. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victim_attributes/victim_attribute_model.py +0 -0
  229. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/__init__.py +0 -0
  230. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/victim.py +0 -0
  231. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/victim_filter.py +0 -0
  232. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/victims/victim_model.py +0 -0
  233. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/__init__.py +0 -0
  234. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/workflow_event.py +0 -0
  235. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/workflow_event_filter.py +0 -0
  236. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_events/workflow_event_model.py +0 -0
  237. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/__init__.py +0 -0
  238. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/workflow_template.py +0 -0
  239. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/workflow_template_filter.py +0 -0
  240. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/api/tc/v3/workflow_templates/workflow_template_model.py +0 -0
  241. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/__init__.py +0 -0
  242. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/app.py +0 -0
  243. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/__init__.py +0 -0
  244. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/app_spec_yml.py +0 -0
  245. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/install_json.py +0 -0
  246. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/install_json_update.py +0 -0
  247. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/install_json_validate.py +0 -0
  248. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/job_json.py +0 -0
  249. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/layout_json.py +0 -0
  250. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/__init__.py +0 -0
  251. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/app_spec_yml_model.py +0 -0
  252. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/install_json_model.py +0 -0
  253. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/job_json_model.py +0 -0
  254. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/layout_json_model.py +0 -0
  255. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/model/tcex_json_model.py +0 -0
  256. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/permutation.py +0 -0
  257. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/tcex_json.py +0 -0
  258. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/config/tcex_json_update.py +0 -0
  259. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/__init__.py +0 -0
  260. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/benchmark.py +0 -0
  261. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/debug.py +0 -0
  262. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/fail_on_output.py +0 -0
  263. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/on_exception.py +0 -0
  264. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/on_success.py +0 -0
  265. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/decorator/output.py +0 -0
  266. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/__init__.py +0 -0
  267. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_abc.py +0 -0
  268. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_api.py +0 -0
  269. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_mock.py +0 -0
  270. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_redis.py +0 -0
  271. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/key_value_store.py +0 -0
  272. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/redis_client.py +0 -0
  273. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/key_value_store/redis_client_ssl.py +0 -0
  274. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/__init__.py +0 -0
  275. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/advanced_request.py +0 -0
  276. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook.py +0 -0
  277. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_create.py +0 -0
  278. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_delete.py +0 -0
  279. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_output.py +0 -0
  280. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/playbook/playbook_read.py +0 -0
  281. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/__init__.py +0 -0
  282. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/api_service.py +0 -0
  283. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/common_service.py +0 -0
  284. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/common_service_trigger.py +0 -0
  285. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/mqtt_message_broker.py +0 -0
  286. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/service/webhook_trigger_service.py +0 -0
  287. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/token/__init__.py +0 -0
  288. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/app/token/token.py +0 -0
  289. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/exit/__init__.py +0 -0
  290. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/exit/error_code.py +0 -0
  291. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/exit/exit.py +0 -0
  292. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/__init__.py +0 -0
  293. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/__init__.py +0 -0
  294. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/binary.py +0 -0
  295. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/case_management_entity.py +0 -0
  296. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/choice.py +0 -0
  297. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/datetime.py +0 -0
  298. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/edit_choice.py +0 -0
  299. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/exception.py +0 -0
  300. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/group_entity.py +0 -0
  301. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/indicator_entity.py +0 -0
  302. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/integer.py +0 -0
  303. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/ip_address.py +0 -0
  304. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/key_value.py +0 -0
  305. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/sensitive.py +0 -0
  306. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/string.py +0 -0
  307. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/tc_entity.py +0 -0
  308. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/field_type/validator.py +0 -0
  309. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/input.py +0 -0
  310. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/__init__.py +0 -0
  311. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/advanced_request_model.py +0 -0
  312. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/api_model.py +0 -0
  313. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_api_service_model.py +0 -0
  314. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_external_model.py +0 -0
  315. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_feed_api_service_model.py +0 -0
  316. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_organization_model.py +0 -0
  317. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_playbook_model.py +0 -0
  318. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_system_model.py +0 -0
  319. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_trigger_service_model.py +0 -0
  320. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/app_webhook_trigger_service_model.py +0 -0
  321. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/batch_model.py +0 -0
  322. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/cal_setting_model.py +0 -0
  323. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/cert_model.py +0 -0
  324. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/common_advanced_model.py +0 -0
  325. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/common_model.py +0 -0
  326. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/create_config_model.py +0 -0
  327. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/logging_model.py +0 -0
  328. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/model_map.py +0 -0
  329. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/module_app_model.py +0 -0
  330. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/module_requests_session_model.py +0 -0
  331. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/organization_model.py +0 -0
  332. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/path_model.py +0 -0
  333. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/playbook_common_model.py +0 -0
  334. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/playbook_model.py +0 -0
  335. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/proxy_model.py +0 -0
  336. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/service_model.py +0 -0
  337. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/input/model/smtp_setting_model.py +0 -0
  338. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/__init__.py +0 -0
  339. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/api_handler.py +0 -0
  340. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/cache_handler.py +0 -0
  341. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/logger.py +0 -0
  342. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/rotating_file_handler_custom.py +0 -0
  343. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/sensitive_filter.py +0 -0
  344. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/logger/trace_logger.py +0 -0
  345. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/__init__.py +0 -0
  346. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/cached_property.py +0 -0
  347. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/event.py +0 -0
  348. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/exception_thread.py +0 -0
  349. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/jmespath_custom.py +0 -0
  350. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/none_model.py +0 -0
  351. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/proxies.py +0 -0
  352. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/scoped_property.py +0 -0
  353. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/pleb/singleton.py +0 -0
  354. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/registry.py +0 -0
  355. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/__init__.py +0 -0
  356. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/external_session.py +0 -0
  357. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/rate_limit_handler.py +0 -0
  358. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_external/requests_external.py +0 -0
  359. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/__init__.py +0 -0
  360. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/__init__.py +0 -0
  361. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/hmac_auth.py +0 -0
  362. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/tc_auth.py +0 -0
  363. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/auth/token_auth.py +0 -0
  364. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/requests_tc.py +0 -0
  365. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/requests_tc/tc_session.py +0 -0
  366. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/tcex.py +0 -0
  367. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/__init__.py +0 -0
  368. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/aes_operation.py +0 -0
  369. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/code_operation.py +0 -0
  370. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/datetime_operation.py +0 -0
  371. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/file_operation.py +0 -0
  372. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/model/__init__.py +0 -0
  373. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/model/playbook_variable_model.py +0 -0
  374. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/__init__.py +0 -0
  375. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render.py +0 -0
  376. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render_panel.py +0 -0
  377. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render_prompt.py +0 -0
  378. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/render/render_table.py +0 -0
  379. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/requests_to_curl.py +0 -0
  380. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/string_operation.py +0 -0
  381. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/util.py +0 -0
  382. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex/util/variable.py +0 -0
  383. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/SOURCES.txt +0 -0
  384. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/dependency_links.txt +0 -0
  385. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/requires.txt +0 -0
  386. {tcex-4.0.11.dev0 → tcex-4.0.11.dev2}/tcex.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tcex
3
- Version: 4.0.11.dev0
3
+ Version: 4.0.11.dev2
4
4
  Summary: ThreatConnect Exchange App Framework
5
5
  Author-email: ThreatConnect <support@threatconnect.com>
6
6
  License-Expression: Apache-2.0
@@ -108,7 +108,7 @@ commit = false
108
108
  # Additional arguments to pass to the git commit command
109
109
  commit_args = "--no-verify"
110
110
  # The current version of the project
111
- current_version = "4.0.11-dev0"
111
+ current_version = "4.0.11-dev2"
112
112
  # The commit message template used when committing version bumps
113
113
  message = "Version updated from {current_version} to {new_version}"
114
114
  # Regular expression for parsing version strings
@@ -1,4 +1,4 @@
1
1
  """TcEx Framework Module"""
2
2
 
3
3
  __license__ = 'Apache-2.0'
4
- __version__ = '4.0.11-dev0'
4
+ __version__ = '4.0.11-dev2'
@@ -10,7 +10,6 @@ import threading
10
10
  import time
11
11
  from collections import deque
12
12
  from collections.abc import Callable
13
- from functools import cached_property
14
13
  from typing import Any
15
14
 
16
15
  # third-party
@@ -922,140 +921,7 @@ class Batch(BatchWriter, BatchSubmit):
922
921
 
923
922
  return {}
924
923
 
925
- @cached_property
926
- def attribute_config(self) -> dict:
927
- """Return a dict of attribute types keyed by 'name', fetched across all pages."""
928
- attributes: dict[str, dict] = {}
929
-
930
- # Start with the initial endpoint
931
- url = '/v3/attributeTypes'
932
- while True:
933
- # Fetch page (first call uses relative path; subsequent calls use absolute next_ URL)
934
- resp = self.session_tc.get(url, params={'resultLimit': 10_000})
935
- payload = resp.json()
936
-
937
- # Collect items from this page
938
- for attribute_type in payload.get('data', []):
939
- name = attribute_type.get('name')
940
- if name is None:
941
- # Skip entries without a name key (defensive)
942
- continue
943
- attributes[name] = attribute_type
944
-
945
- # Get the next page URL; stop if none
946
- next_ = payload.get('next')
947
- if not next_:
948
- break
949
-
950
- # next_ is the full URL for the next page
951
- url = next_
952
-
953
- return attributes
954
-
955
- def _auto_truncate_attribute(
956
- self, attribute_type: str, attribute_value: str, ellipsis: str = '...'
957
- ) -> str:
958
- """Truncate attribute value if it exceeds the maximum length for its type.
959
-
960
- Args:
961
- attribute_type: The name of the attribute type.
962
- attribute_value: The attribute value to potentially truncate.
963
- ellipsis: The string to append when truncating. Defaults to '...'.
964
-
965
- Returns:
966
- The original value if within limits, or the truncated value with ellipsis.
967
- """
968
- attribute_config = self.attribute_config.get(attribute_type)
969
- if not attribute_config:
970
- return attribute_value
971
-
972
- max_length = attribute_config.get('maxSize')
973
- if not max_length:
974
- return attribute_value
975
-
976
- # Only strings can be truncated
977
- if not isinstance(attribute_value, str):
978
- return attribute_value
979
-
980
- # If within limit, keep as-is
981
- if len(attribute_value) <= max_length:
982
- return attribute_value
983
-
984
- # If max is tiny, avoid negative slicing; fall back to hard cut
985
- if max_length <= len(ellipsis):
986
- return attribute_value[:max_length]
987
-
988
- # Truncate and append the msg
989
- return attribute_value[: max_length - len(ellipsis)] + ellipsis
990
-
991
- def _clean_attributes(self, content: dict) -> dict:
992
- """Clean, truncate, and deduplicate attributes for groups and indicators.
993
-
994
- Args:
995
- content: The content dictionary containing groups and/or indicators with attributes.
996
-
997
- Returns:
998
- The content dictionary with cleaned, truncated, and deduplicated attributes.
999
- """
1000
- truncated_types: set[str] = set()
1001
-
1002
- for key in ['groups', 'indicators']:
1003
- for item in content.get(key, []):
1004
- original_attrs = item.get('attributes') or []
1005
- cleaned_attrs = []
1006
- seen = set() # track normalized tuples of the entire attribute
1007
-
1008
- for attr in original_attrs:
1009
- type_ = attr.get('type')
1010
- value = attr.get('value')
1011
-
1012
- # Skip if type missing or value explicitly empty/None
1013
- if not type_ or value is None or value == '':
1014
- continue
1015
-
1016
- # Truncate/normalize value
1017
- truncated = self._auto_truncate_attribute(type_, value)
1018
-
1019
- # Log warning once per attribute type when truncation occurs
1020
- if truncated != value and type_ not in truncated_types:
1021
- truncated_types.add(type_)
1022
- self.log.warning(
1023
- f'feature=batch, event=attribute-truncated, '
1024
- f'key={key}, attribute-type={type_}'
1025
- )
1026
-
1027
- # De-duplication is based on all fields, but with the truncated value
1028
- # Combine with the `seen` set to skip duplicates
1029
- normalized_items = tuple(
1030
- (k, truncated if k == 'value' else attr.get(k)) for k in sorted(attr.keys())
1031
- )
1032
-
1033
- if normalized_items in seen:
1034
- continue
1035
- seen.add(normalized_items)
1036
-
1037
- new_attr = dict(attr)
1038
- new_attr['value'] = truncated
1039
- cleaned_attrs.append(new_attr)
1040
-
1041
- item['attributes'] = cleaned_attrs
1042
-
1043
- return content
1044
-
1045
- def clean_content(self, content: dict) -> dict:
1046
- """Clean content before upload.
1047
-
1048
- Args:
1049
- content: The content dictionary to clean.
1050
-
1051
- Returns:
1052
- The cleaned content dictionary.
1053
- """
1054
- return self._clean_attributes(content)
1055
-
1056
- def submit_files(
1057
- self, file_data: dict, halt_on_error: bool = True, clean_content: bool = False
1058
- ) -> list[dict] | None:
924
+ def submit_files(self, file_data: dict, halt_on_error: bool = True) -> list[dict] | None:
1059
925
  """Submit Files for Documents and Reports to ThreatConnect API.
1060
926
 
1061
927
  Critical Errors: There is insufficient document storage allocated to this account.
@@ -1097,9 +963,6 @@ class Batch(BatchWriter, BatchSubmit):
1097
963
  except Exception as e:
1098
964
  self.log.warning(f'feature=batch, event=file-download-exception, err="""{e}"""')
1099
965
 
1100
- if clean_content is True:
1101
- content = self.clean_content(content)
1102
-
1103
966
  if content is None:
1104
967
  upload_status.append({'uploaded': False, 'xid': xid})
1105
968
  self.log.warning(f'feature=batch-submit-files, xid={xid}, event=content-null')
@@ -15,6 +15,7 @@ from requests import Session
15
15
  from tcex.exit.error_code import handle_error
16
16
  from tcex.input.input import Input
17
17
  from tcex.logger.trace_logger import TraceLogger
18
+ from tcex.pleb.cached_property import cached_property
18
19
 
19
20
  # get tcex logger
20
21
  _logger: TraceLogger = logging.getLogger(__name__.split('.', maxsplit=1)[0]) # type: ignore
@@ -73,6 +74,96 @@ class BatchSubmit:
73
74
  self._poll_interval_times = []
74
75
  self._poll_timeout = 3600
75
76
 
77
+ def _auto_truncate_attribute(
78
+ self, attribute_type: str, attribute_value: str, ellipsis: str = '...'
79
+ ) -> str:
80
+ """Truncate attribute value if it exceeds the maximum length for its type.
81
+
82
+ Args:
83
+ attribute_type: The name of the attribute type.
84
+ attribute_value: The attribute value to potentially truncate.
85
+ ellipsis: The string to append when truncating. Defaults to '...'.
86
+
87
+ Returns:
88
+ The original value if within limits, or the truncated value with ellipsis.
89
+ """
90
+ attribute_config = self.attribute_config.get(attribute_type)
91
+ if not attribute_config:
92
+ return attribute_value
93
+
94
+ max_length = attribute_config.get('maxSize')
95
+ if not max_length:
96
+ return attribute_value
97
+
98
+ # Only strings can be truncated
99
+ if not isinstance(attribute_value, str):
100
+ return attribute_value
101
+
102
+ # If within limit, keep as-is
103
+ if len(attribute_value) <= max_length:
104
+ return attribute_value
105
+
106
+ # If max is tiny, avoid negative slicing; fall back to hard cut
107
+ if max_length <= len(ellipsis):
108
+ return attribute_value[:max_length]
109
+
110
+ # Truncate and append the msg
111
+ return attribute_value[: max_length - len(ellipsis)] + ellipsis
112
+
113
+ def _clean_attributes(self, content: dict) -> dict:
114
+ """Clean, truncate, and deduplicate attributes for groups and indicators.
115
+
116
+ Args:
117
+ content: The content dictionary containing groups and/or indicators with attributes.
118
+
119
+ Returns:
120
+ The content dictionary with cleaned, truncated, and deduplicated attributes.
121
+ """
122
+ truncated_types: set[str] = set()
123
+
124
+ for key in ['groups', 'indicators']:
125
+ for item in content.get(key, []):
126
+ original_attrs = item.get('attributes') or []
127
+ cleaned_attrs = []
128
+ seen = set() # track normalized tuples of the entire attribute
129
+
130
+ for attr in original_attrs:
131
+ type_ = attr.get('type')
132
+ value = attr.get('value')
133
+
134
+ # Skip if type missing or value explicitly empty/None
135
+ if not type_ or value is None or value == '':
136
+ continue
137
+
138
+ # Truncate/normalize value
139
+ truncated = self._auto_truncate_attribute(type_, value)
140
+
141
+ # Log warning once per attribute type when truncation occurs
142
+ if truncated != value and type_ not in truncated_types:
143
+ truncated_types.add(type_)
144
+ self.log.warning(
145
+ f'feature=batch, event=attribute-truncated, '
146
+ f'key={key}, attribute-type={type_}'
147
+ )
148
+
149
+ # De-duplication is based on all fields, but with the truncated value
150
+ # Combine with the `seen` set to skip duplicates
151
+ normalized_items = tuple(
152
+ (k, truncated if k == 'value' else attr.get(k)) for k in sorted(attr.keys())
153
+ )
154
+
155
+ if normalized_items in seen:
156
+ continue
157
+ seen.add(normalized_items)
158
+
159
+ new_attr = dict(attr)
160
+ new_attr['value'] = truncated
161
+ cleaned_attrs.append(new_attr)
162
+
163
+ item['attributes'] = cleaned_attrs
164
+
165
+ return content
166
+
76
167
  @property
77
168
  def _critical_failures(self) -> list[str]: # pragma: no cover
78
169
  """Return Batch critical failure messages."""
@@ -91,6 +182,36 @@ class BatchSubmit:
91
182
  """Set batch action."""
92
183
  self._action = action
93
184
 
185
+ @cached_property
186
+ def attribute_config(self) -> dict:
187
+ """Return a dict of attribute types keyed by 'name', fetched across all pages."""
188
+ attributes: dict[str, dict] = {}
189
+
190
+ # Start with the initial endpoint
191
+ url = '/v3/attributeTypes'
192
+ while True:
193
+ # Fetch page (first call uses relative path; subsequent calls use absolute next_ URL)
194
+ resp = self.session_tc.get(url, params={'resultLimit': 10_000})
195
+ payload = resp.json()
196
+
197
+ # Collect items from this page
198
+ for attribute_type in payload.get('data', []):
199
+ name = attribute_type.get('name')
200
+ if name is None:
201
+ # Skip entries without a name key (defensive)
202
+ continue
203
+ attributes[name] = attribute_type
204
+
205
+ # Get the next page URL; stop if none
206
+ next_ = payload.get('next')
207
+ if not next_:
208
+ break
209
+
210
+ # next_ is the full URL for the next page
211
+ url = next_
212
+
213
+ return attributes
214
+
94
215
  @property
95
216
  def attribute_write_type(self) -> str:
96
217
  """Return batch attribute write type."""
@@ -101,6 +222,18 @@ class BatchSubmit:
101
222
  """Set batch attribute write type."""
102
223
  self._attribute_write_type = write_type
103
224
 
225
+ def clean_content(self, content: dict | str) -> dict:
226
+ """Clean content before upload.
227
+
228
+ Args:
229
+ content: The content dictionary to clean.
230
+
231
+ Returns:
232
+ The cleaned content dictionary.
233
+ """
234
+ content_dict = json.loads(content) if isinstance(content, str) else content
235
+ return self._clean_attributes(content_dict)
236
+
104
237
  def create_job(self, halt_on_error: bool = True) -> int | None:
105
238
  """Submit Batch request to ThreatConnect API.
106
239
 
@@ -341,7 +474,7 @@ class BatchSubmit:
341
474
  if data.get('data', {}).get('batchStatus', {}).get('status') == 'Completed':
342
475
  # store last 5 poll times to use in calculating average poll time
343
476
  modifier = poll_time_total * 0.7
344
- self._poll_interval_times = self._poll_interval_times[-4:] + [modifier] # noqa: RUF005
477
+ self._poll_interval_times = [*self._poll_interval_times[-4:], modifier]
345
478
 
346
479
  weights: list[float | int] = [1]
347
480
  poll_interval_time_weighted_sum = 0
@@ -447,7 +580,11 @@ class BatchSubmit:
447
580
  return {}
448
581
 
449
582
  def submit_data(
450
- self, batch_id: int, content: dict | str, halt_on_error: bool = True
583
+ self,
584
+ batch_id: int,
585
+ content: dict | str,
586
+ halt_on_error: bool = True,
587
+ clean_content: bool = False,
451
588
  ) -> dict | None:
452
589
  """Submit Batch request to ThreatConnect API.
453
590
 
@@ -456,6 +593,7 @@ class BatchSubmit:
456
593
  content: The dict of groups and indicator data.
457
594
  halt_on_error (bool = True): If True the process
458
595
  should halt if any errors are encountered.
596
+ clean_content: If True the content will be cleaned before upload.
459
597
 
460
598
  Returns:
461
599
  dict: The response data
@@ -467,6 +605,9 @@ class BatchSubmit:
467
605
  # TC Core requires the header to be application/octet-stream
468
606
  headers = {'Content-Type': 'application/octet-stream'}
469
607
  try:
608
+ if clean_content is True:
609
+ content = self.clean_content(content)
610
+
470
611
  if isinstance(content, dict):
471
612
  content = json.dumps(content)
472
613
 
@@ -54,6 +54,7 @@ class ObjectABC(ABC): # noqa: B024
54
54
  self._model: V3ModelABC
55
55
  self._nested_field_name: str | None = None
56
56
  self._nested_filter: str | None = None
57
+ self._timeout = None
57
58
  self.type_: str
58
59
 
59
60
  @property
@@ -141,7 +142,7 @@ class ObjectABC(ABC): # noqa: B024
141
142
  try:
142
143
  self.log_request(method, url, body, params)
143
144
  self.request = self._session.request(
144
- method, url, data=body, headers=headers, params=params
145
+ method, url, data=body, headers=headers, params=params, timeout=self.timeout
145
146
  )
146
147
  except (ConnectionError, ProxyError, RetryError): # pragma: no cover
147
148
  handle_error(
@@ -393,6 +394,16 @@ class ObjectABC(ABC): # noqa: B024
393
394
  status = False
394
395
  return status
395
396
 
397
+ @property
398
+ def timeout(self) -> int | None:
399
+ """Return the current timeout value for all requests."""
400
+ return self._timeout
401
+
402
+ @timeout.setter
403
+ def timeout(self, timeout: int | None):
404
+ """Set the current timeout value for all requests."""
405
+ self._timeout = timeout
406
+
396
407
  def update(self, mode: str | None = None, params: dict | None = None) -> Response:
397
408
  """Create or Update the Case Management object.
398
409
 
@@ -47,6 +47,7 @@ class ObjectCollectionABC(ABC): # noqa: B024
47
47
  self.log = _logger
48
48
  self.request: Response
49
49
  self.tql = Tql()
50
+ self._timeout = None
50
51
  self._model = None
51
52
  self.type_ = None # defined in child class
52
53
  self.util = Util()
@@ -121,7 +122,7 @@ class ObjectCollectionABC(ABC): # noqa: B024
121
122
  try:
122
123
  self.log_request(method, url, body, params)
123
124
  self.request = self._session.request(
124
- method, url, data=body, headers=headers, params=params
125
+ method, url, data=body, headers=headers, params=params, timeout=self.timeout
125
126
  )
126
127
  except (ConnectionError, ProxyError, RetryError): # pragma: no cover
127
128
  handle_error(
@@ -275,13 +276,13 @@ class ObjectCollectionABC(ABC): # noqa: B024
275
276
  return status
276
277
 
277
278
  @property
278
- def timeout(self) -> int:
279
- """Return the timeout of the case management object collection."""
279
+ def timeout(self) -> int | None:
280
+ """Return the current timeout value for all requests."""
280
281
  return self._timeout
281
282
 
282
283
  @timeout.setter
283
- def timeout(self, timeout: int):
284
- """Set the timeout of the case management object collection."""
284
+ def timeout(self, timeout: int | None):
285
+ """Set the current timeout value for all requests."""
285
286
  self._timeout = timeout
286
287
 
287
288
  @cached_property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tcex
3
- Version: 4.0.11.dev0
3
+ Version: 4.0.11.dev2
4
4
  Summary: ThreatConnect Exchange App Framework
5
5
  Author-email: ThreatConnect <support@threatconnect.com>
6
6
  License-Expression: Apache-2.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes