flow.record 3.21.dev8__tar.gz → 3.21.dev9__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 (93) hide show
  1. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/PKG-INFO +1 -1
  2. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/jsonpacker.py +2 -1
  3. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/version.py +3 -3
  4. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow.record.egg-info/PKG-INFO +1 -1
  5. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_sqlite_duckdb.py +2 -1
  6. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/packer/test_json_packer.py +26 -0
  7. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/.git-blame-ignore-revs +0 -0
  8. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/.gitattributes +0 -0
  9. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/COPYRIGHT +0 -0
  10. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/LICENSE +0 -0
  11. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/MANIFEST.in +0 -0
  12. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/README.md +0 -0
  13. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/examples/__init__.py +0 -0
  14. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/examples/filesystem.py +0 -0
  15. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/examples/passivedns.py +0 -0
  16. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/examples/records.json +0 -0
  17. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/examples/selectors.py +0 -0
  18. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/examples/tcpconn.py +0 -0
  19. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/__init__.py +0 -0
  20. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/__init__.py +0 -0
  21. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/archive.py +0 -0
  22. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/avro.py +0 -0
  23. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/broker.py +0 -0
  24. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/csvfile.py +0 -0
  25. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/duckdb.py +0 -0
  26. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/elastic.py +0 -0
  27. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/jsonfile.py +0 -0
  28. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/line.py +0 -0
  29. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/mongo.py +0 -0
  30. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/split.py +0 -0
  31. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/splunk.py +0 -0
  32. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/sqlite.py +0 -0
  33. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/stream.py +0 -0
  34. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/text.py +0 -0
  35. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/adapter/xlsx.py +0 -0
  36. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/base.py +0 -0
  37. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/exceptions.py +0 -0
  38. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/__init__.py +0 -0
  39. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/credential.py +0 -0
  40. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/net/__init__.py +0 -0
  41. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/net/ip.py +0 -0
  42. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/net/ipv4.py +0 -0
  43. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/net/tcp.py +0 -0
  44. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/fieldtypes/net/udp.py +0 -0
  45. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/packer.py +0 -0
  46. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/selector.py +0 -0
  47. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/stream.py +0 -0
  48. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/tools/__init__.py +0 -0
  49. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/tools/geoip.py +0 -0
  50. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/tools/rdump.py +0 -0
  51. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/utils.py +0 -0
  52. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow/record/whitelist.py +0 -0
  53. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow.record.egg-info/SOURCES.txt +0 -0
  54. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow.record.egg-info/dependency_links.txt +0 -0
  55. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow.record.egg-info/entry_points.txt +0 -0
  56. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow.record.egg-info/requires.txt +0 -0
  57. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/flow.record.egg-info/top_level.txt +0 -0
  58. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/pyproject.toml +0 -0
  59. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/setup.cfg +0 -0
  60. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/__init__.py +0 -0
  61. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/_data/.gitkeep +0 -0
  62. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/_docs/Makefile +0 -0
  63. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/_docs/conf.py +0 -0
  64. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/_docs/index.rst +0 -0
  65. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/_utils.py +0 -0
  66. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/__init__.py +0 -0
  67. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_avro.py +0 -0
  68. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_csv.py +0 -0
  69. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_elastic.py +0 -0
  70. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_json.py +0 -0
  71. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_line.py +0 -0
  72. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_splunk.py +0 -0
  73. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_text.py +0 -0
  74. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/adapter/test_xlsx.py +0 -0
  75. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/fieldtypes/__init__.py +0 -0
  76. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/fieldtypes/test_fieldtypes.py +0 -0
  77. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/fieldtypes/test_ip.py +0 -0
  78. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/packer/__init__.py +0 -0
  79. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/packer/test_packer.py +0 -0
  80. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/record/__init__.py +0 -0
  81. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/record/test_adapter.py +0 -0
  82. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/record/test_descriptor.py +0 -0
  83. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/record/test_multi_timestamp.py +0 -0
  84. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/record/test_record.py +0 -0
  85. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/selector/__init__.py +0 -0
  86. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/selector/test_compiled.py +0 -0
  87. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/selector/test_selectors.py +0 -0
  88. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/test_deprecations.py +0 -0
  89. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/test_regressions.py +0 -0
  90. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/test_utils.py +0 -0
  91. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/tools/__init__.py +0 -0
  92. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tests/tools/test_rdump.py +0 -0
  93. {flow_record-3.21.dev8 → flow_record-3.21.dev9}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flow.record
3
- Version: 3.21.dev8
3
+ Version: 3.21.dev9
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
@@ -97,7 +97,8 @@ class JsonRecordPacker:
97
97
  del obj["_type"]
98
98
  for field_type, field_name in record_descriptor.get_field_tuples():
99
99
  if field_type == "bytes":
100
- obj[field_name] = base64.b64decode(obj[field_name])
100
+ value = obj[field_name]
101
+ obj[field_name] = base64.b64decode(value) if value is not None else None
101
102
  return record_descriptor.recordType(**obj)
102
103
  if _type == "recorddescriptor":
103
104
  data = obj["_data"]
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '3.21.dev8'
32
- __version_tuple__ = version_tuple = (3, 21, 'dev8')
31
+ __version__ = version = '3.21.dev9'
32
+ __version_tuple__ = version_tuple = (3, 21, 'dev9')
33
33
 
34
- __commit_id__ = commit_id = 'g820113cc3'
34
+ __commit_id__ = commit_id = 'ge2333a654'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flow.record
3
- Version: 3.21.dev8
3
+ Version: 3.21.dev9
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
@@ -169,11 +169,12 @@ def test_read_from_sqlite(tmp_path: Path, db: Database) -> None:
169
169
  """
170
170
  )
171
171
  for i in range(1, 30):
172
+ dt_isoformat = datetime(2023, 10, i, 13, 37, tzinfo=timezone.utc).isoformat()
172
173
  con.execute(
173
174
  """
174
175
  INSERT INTO 'test/record' VALUES (?, ?, ?, ?)
175
176
  """,
176
- (f"record{i}", f"foobar{i}".encode(), datetime(2023, 10, i, 13, 37, tzinfo=timezone.utc), 3.14 + i),
177
+ (f"record{i}", f"foobar{i}".encode(), dt_isoformat, 3.14 + i),
177
178
  )
178
179
 
179
180
  # Read the SQLite database using flow.record
@@ -112,3 +112,29 @@ def test_record_pack_surrogateescape() -> None:
112
112
 
113
113
  # pack the json string back to a record and make sure it is the same as before
114
114
  assert packer.unpack(data) == record
115
+
116
+
117
+ def test_json_packer_bytes_type() -> None:
118
+ TestRecord = RecordDescriptor(
119
+ "test/bytes",
120
+ [
121
+ ("bytes", "data"),
122
+ ],
123
+ )
124
+
125
+ packer = JsonRecordPacker()
126
+
127
+ record = TestRecord(b"hello world")
128
+ data = packer.pack(record)
129
+ assert data.startswith('{"data": "aGVsbG8gd29ybGQ="')
130
+ assert packer.unpack(data) == record
131
+
132
+ record = TestRecord(data=None)
133
+ data = packer.pack(record)
134
+ assert data.startswith('{"data": null')
135
+ assert packer.unpack(data) == record
136
+
137
+ record = TestRecord(data=b"")
138
+ data = packer.pack(record)
139
+ assert data.startswith('{"data": ""')
140
+ assert packer.unpack(data) == record
File without changes
File without changes