flow.record 3.15.dev12__tar.gz → 3.15.dev13__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 (81) hide show
  1. {flow.record-3.15.dev12/flow.record.egg-info → flow.record-3.15.dev13}/PKG-INFO +1 -1
  2. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/base.py +21 -1
  3. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/version.py +2 -2
  4. {flow.record-3.15.dev12 → flow.record-3.15.dev13/flow.record.egg-info}/PKG-INFO +1 -1
  5. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_record.py +13 -0
  6. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/COPYRIGHT +0 -0
  7. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/LICENSE +0 -0
  8. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/MANIFEST.in +0 -0
  9. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/README.md +0 -0
  10. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/examples/filesystem.py +0 -0
  11. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/examples/passivedns.py +0 -0
  12. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/examples/records.json +0 -0
  13. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/examples/tcpconn.py +0 -0
  14. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/__init__.py +0 -0
  15. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/__init__.py +0 -0
  16. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/archive.py +0 -0
  17. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/avro.py +0 -0
  18. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/broker.py +0 -0
  19. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/csvfile.py +0 -0
  20. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/duckdb.py +0 -0
  21. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/elastic.py +0 -0
  22. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/jsonfile.py +0 -0
  23. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/line.py +0 -0
  24. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/mongo.py +0 -0
  25. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/split.py +0 -0
  26. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/splunk.py +0 -0
  27. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/sqlite.py +0 -0
  28. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/stream.py +0 -0
  29. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/text.py +0 -0
  30. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/adapter/xlsx.py +0 -0
  31. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/exceptions.py +0 -0
  32. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/__init__.py +0 -0
  33. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/credential.py +0 -0
  34. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/net/__init__.py +0 -0
  35. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/net/ip.py +0 -0
  36. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/net/ipv4.py +0 -0
  37. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/net/tcp.py +0 -0
  38. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/fieldtypes/net/udp.py +0 -0
  39. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/jsonpacker.py +0 -0
  40. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/packer.py +0 -0
  41. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/selector.py +0 -0
  42. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/stream.py +0 -0
  43. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/tools/__init__.py +0 -0
  44. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/tools/geoip.py +0 -0
  45. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/tools/rdump.py +0 -0
  46. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/utils.py +0 -0
  47. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow/record/whitelist.py +0 -0
  48. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow.record.egg-info/SOURCES.txt +0 -0
  49. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow.record.egg-info/dependency_links.txt +0 -0
  50. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow.record.egg-info/entry_points.txt +0 -0
  51. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow.record.egg-info/requires.txt +0 -0
  52. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/flow.record.egg-info/top_level.txt +0 -0
  53. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/pyproject.toml +0 -0
  54. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/setup.cfg +0 -0
  55. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/__init__.py +0 -0
  56. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/_utils.py +0 -0
  57. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/docs/Makefile +0 -0
  58. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/docs/conf.py +0 -0
  59. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/docs/index.rst +0 -0
  60. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/selector_explain_example.py +0 -0
  61. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/standalone_test.py +0 -0
  62. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_avro.py +0 -0
  63. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_avro_adapter.py +0 -0
  64. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_compiled_selector.py +0 -0
  65. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_csv_adapter.py +0 -0
  66. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_deprecations.py +0 -0
  67. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_fieldtype_ip.py +0 -0
  68. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_fieldtypes.py +0 -0
  69. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_json_packer.py +0 -0
  70. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_json_record_adapter.py +0 -0
  71. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_multi_timestamp.py +0 -0
  72. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_packer.py +0 -0
  73. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_rdump.py +0 -0
  74. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_record_adapter.py +0 -0
  75. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_record_descriptor.py +0 -0
  76. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_regression.py +0 -0
  77. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_selector.py +0 -0
  78. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_splunk_adapter.py +0 -0
  79. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/test_sqlite_duckdb_adapter.py +0 -0
  80. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tests/utils_inspect.py +0 -0
  81. {flow.record-3.15.dev12 → flow.record-3.15.dev13}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flow.record
3
- Version: 3.15.dev12
3
+ Version: 3.15.dev13
4
4
  Summary: A library for defining and creating structured data (called records) that can be streamed to disk or piped to other tools that use flow.record
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -201,7 +201,27 @@ class Record:
201
201
  return result
202
202
 
203
203
  def __hash__(self) -> int:
204
- return hash(self._pack(excluded_fields=IGNORE_FIELDS_FOR_COMPARISON))
204
+ desc_identifier, values = self._pack(excluded_fields=IGNORE_FIELDS_FOR_COMPARISON)
205
+ if not any((isinstance(value, list) for value in values)):
206
+ return hash((desc_identifier, values))
207
+
208
+ # Lists have to be converted to tuples to be able to hash them
209
+ record_values = []
210
+ for value in values:
211
+ if not isinstance(value, list):
212
+ record_values.append(value)
213
+ continue
214
+ list_values = []
215
+ for list_value in value:
216
+ if isinstance(list_value, dict):
217
+ # List values that are dicts must be converted to tuples
218
+ dict_as_tuple = tuple(list_value.items())
219
+ list_values.append(dict_as_tuple)
220
+ else:
221
+ list_values.append(list_value)
222
+ record_values.append(tuple(list_values))
223
+
224
+ return hash((desc_identifier, tuple(record_values)))
205
225
 
206
226
  def __repr__(self):
207
227
  return "<{} {}>".format(
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.15.dev12'
16
- __version_tuple__ = version_tuple = (3, 15, 'dev12')
15
+ __version__ = version = '3.15.dev13'
16
+ __version_tuple__ = version_tuple = (3, 15, 'dev13')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flow.record
3
- Version: 3.15.dev12
3
+ Version: 3.15.dev13
4
4
  Summary: A library for defining and creating structured data (called records) that can be streamed to disk or piped to other tools that use flow.record
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -922,3 +922,16 @@ def test_ignore_fields_for_comparision_contextmanager():
922
922
  # test reset again
923
923
  assert len(set(records)) == len(records)
924
924
  assert records[0] != records[1]
925
+
926
+
927
+ def test_list_field_type_hashing():
928
+ TestRecord = RecordDescriptor(
929
+ "test/record",
930
+ [
931
+ ("string[]", "stringlist"),
932
+ ("dictlist", "dictlist"),
933
+ ],
934
+ )
935
+
936
+ test_record = TestRecord(stringlist=["a", "b", "c", "d"], dictlist=[{"a": "b", "c": "d"}, {"foo": "bar"}])
937
+ assert isinstance(hash(test_record), int)