|
1 | | -import json |
2 | | -from io import BytesIO |
3 | 1 | from collections import defaultdict |
| 2 | +from itemadapter import ItemAdapter |
4 | 3 |
|
5 | 4 | from scrapy.exceptions import DropItem, NotConfigured |
6 | 5 | from scrapy.utils.misc import load_object |
7 | | -from scrapy.exporters import JsonLinesItemExporter |
8 | 6 | from scrapy import Field, Item |
9 | | -from scrapy.utils.python import to_unicode |
10 | 7 |
|
11 | 8 | from spidermon.contrib.validation import SchematicsValidator, JSONSchemaValidator |
12 | 9 | from spidermon.contrib.validation.jsonschema.tools import get_schema_from |
@@ -136,25 +133,16 @@ def find_validators(self, item): |
136 | 133 | return find(item.__class__) or find(Item) |
137 | 134 |
|
138 | 135 | def _convert_item_to_dict(self, item): |
139 | | - serialized_json = BytesIO() |
140 | | - exporter = JsonLinesItemExporter(serialized_json) |
141 | | - exporter.export_item(item) |
142 | | - data = json.loads(to_unicode(serialized_json.getvalue(), exporter.encoding)) |
143 | | - serialized_json.close() |
144 | | - return data |
| 136 | + data = ItemAdapter(item) |
| 137 | + return data.asdict() |
145 | 138 |
|
146 | 139 | def _add_errors_to_item(self, item, errors): |
147 | | - try: |
148 | | - if self.errors_field not in item.__class__.fields: |
149 | | - item.__class__.fields[self.errors_field] = Field() |
150 | | - if self.errors_field not in item._values: |
151 | | - item[self.errors_field] = defaultdict(list) |
152 | | - except AttributeError: |
153 | | - # The item is just a dict object instead of a Scrapy.Item object |
154 | | - if self.errors_field not in item: |
155 | | - item[self.errors_field] = defaultdict(list) |
| 140 | + data = ItemAdapter(item) |
| 141 | + if self.errors_field not in data.keys(): |
| 142 | + item[self.errors_field] = defaultdict(list) |
| 143 | + |
156 | 144 | for field_name, messages in errors.items(): |
157 | | - item[self.errors_field][field_name] += messages |
| 145 | + data[self.errors_field][field_name] += messages |
158 | 146 |
|
159 | 147 | def _drop_item(self, item, errors): |
160 | 148 | """ |
|
0 commit comments