Skip to content

Commit

Permalink
Rename get_class_field_meta -> get_field_meta_from_class
Browse files Browse the repository at this point in the history
  • Loading branch information
elacuesta committed Sep 14, 2020
1 parent a6af34a commit 3a00e9d
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 22 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,9 @@ _`itemadapter.utils.is_item(obj: Any) -> bool`_
Return `True` if the given object belongs to one of the supported types,
`False` otherwise.

### `get_class_field_meta` function
### `get_field_meta_from_class` function

_`itemadapter.utils.get_class_field_meta(item_class: type, field_name: str) -> MappingProxyType`_
_`itemadapter.utils.get_field_meta_from_class(item_class: type, field_name: str) -> MappingProxyType`_

Given an item class and a field name, return a
[`MappingProxyType`](https://docs.python.org/3/library/types.html#types.MappingProxyType)
Expand All @@ -178,7 +178,7 @@ support field metadata, or there is no metadata for the given field, an empty ob
`scrapy.item.Item`, `dataclass` and `attrs` objects allow the inclusion of
arbitrary field metadata. This can be retrieved from an item instance with the
`itemadapter.adapter.ItemAdapter.get_field_meta` method, or from an item class
with the `itemadapter.utils.get_class_field_meta` function.
with the `itemadapter.utils.get_field_meta_from_class` function.
The definition procedure depends on the underlying type.

#### `scrapy.item.Item` objects
Expand Down
2 changes: 1 addition & 1 deletion itemadapter/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .adapter import ItemAdapter # noqa: F401
from .utils import is_item, get_class_field_meta # noqa: F401
from .utils import is_item, get_field_meta_from_class # noqa: F401


__version__ = "0.1.0"
4 changes: 2 additions & 2 deletions itemadapter/adapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from typing import Any, Iterator

from .utils import (
get_class_field_meta,
get_field_meta_from_class,
is_attrs_instance,
is_dataclass_instance,
is_item,
Expand Down Expand Up @@ -92,7 +92,7 @@ def get_field_meta(self, field_name: str) -> MappingProxyType:
The returned value is an instance of types.MappingProxyType, i.e. a dynamic read-only view
of the original mapping, which gets automatically updated if the original mapping changes.
"""
return get_class_field_meta(self.item.__class__, field_name)
return get_field_meta_from_class(self.item.__class__, field_name)

def field_names(self) -> KeysView:
"""
Expand Down
4 changes: 2 additions & 2 deletions itemadapter/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


__all__ = [
"get_class_field_meta",
"get_field_meta_from_class",
"is_attrs_instance",
"is_dataclass_instance",
"is_item",
Expand Down Expand Up @@ -89,7 +89,7 @@ def is_item(obj: Any) -> bool:
)


def get_class_field_meta(item_class: type, field_name: str) -> MappingProxyType:
def get_field_meta_from_class(item_class: type, field_name: str) -> MappingProxyType:
"""
Return a read-only mapping with metadata for the given field name, within the given item class.
If there is no metadata for the field, or the item class does not support field metadata,
Expand Down
29 changes: 15 additions & 14 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from types import MappingProxyType

from itemadapter.utils import (
get_class_field_meta,
get_field_meta_from_class,
is_attrs_instance,
is_dataclass_instance,
is_item,
Expand All @@ -20,9 +20,9 @@ def mocked_import(name, *args, **kwargs):
class InvalidItemClassTestCase(unittest.TestCase):
def test_invalid_item_class(self):
with self.assertRaises(TypeError, msg="1 is not a valid item class"):
get_class_field_meta(1, "field")
get_field_meta_from_class(1, "field")
with self.assertRaises(TypeError, msg="list is not a valid item class"):
get_class_field_meta(list, "field")
get_field_meta_from_class(list, "field")


class ItemLikeTestCase(unittest.TestCase):
Expand Down Expand Up @@ -80,18 +80,18 @@ def test_false(self):
def test_module_not_available(self):
self.assertFalse(is_attrs_instance(AttrsItem(name="asdf", value=1234)))
with self.assertRaises(TypeError, msg="AttrsItem is not a valid item class"):
get_class_field_meta(AttrsItem, "name")
get_field_meta_from_class(AttrsItem, "name")

@unittest.skipIf(not AttrsItem, "attrs module is not available")
def test_true(self):
self.assertTrue(is_attrs_instance(AttrsItem()))
self.assertTrue(is_attrs_instance(AttrsItem(name="asdf", value=1234)))
# field metadata
self.assertEqual(
get_class_field_meta(AttrsItem, "name"), MappingProxyType({"serializer": str})
get_field_meta_from_class(AttrsItem, "name"), MappingProxyType({"serializer": str})
)
self.assertEqual(
get_class_field_meta(AttrsItem, "value"), MappingProxyType({"serializer": int})
get_field_meta_from_class(AttrsItem, "value"), MappingProxyType({"serializer": int})
)


Expand All @@ -117,18 +117,19 @@ def test_false(self):
def test_module_not_available(self):
self.assertFalse(is_dataclass_instance(DataClassItem(name="asdf", value=1234)))
with self.assertRaises(TypeError, msg="DataClassItem is not a valid item class"):
get_class_field_meta(DataClassItem, "name")
get_field_meta_from_class(DataClassItem, "name")

@unittest.skipIf(not DataClassItem, "dataclasses module is not available")
def test_true(self):
self.assertTrue(is_dataclass_instance(DataClassItem()))
self.assertTrue(is_dataclass_instance(DataClassItem(name="asdf", value=1234)))
# field metadata
self.assertEqual(
get_class_field_meta(DataClassItem, "name"), MappingProxyType({"serializer": str})
get_field_meta_from_class(DataClassItem, "name"), MappingProxyType({"serializer": str})
)
self.assertEqual(
get_class_field_meta(DataClassItem, "value"), MappingProxyType({"serializer": int})
get_field_meta_from_class(DataClassItem, "value"),
MappingProxyType({"serializer": int}),
)


Expand All @@ -152,7 +153,7 @@ def test_false(self):
def test_module_not_available(self):
self.assertFalse(is_scrapy_item(ScrapySubclassedItem(name="asdf", value=1234)))
with self.assertRaises(TypeError, msg="ScrapySubclassedItem is not a valid item class"):
get_class_field_meta(ScrapySubclassedItem, "name")
get_field_meta_from_class(ScrapySubclassedItem, "name")

@unittest.skipIf(not ScrapySubclassedItem, "scrapy module is not available")
def test_true(self):
Expand All @@ -161,11 +162,11 @@ def test_true(self):
self.assertTrue(is_scrapy_item(ScrapySubclassedItem(name="asdf", value=1234)))
# field metadata
self.assertEqual(
get_class_field_meta(ScrapySubclassedItem, "name"),
get_field_meta_from_class(ScrapySubclassedItem, "name"),
MappingProxyType({"serializer": str}),
)
self.assertEqual(
get_class_field_meta(ScrapySubclassedItem, "value"),
get_field_meta_from_class(ScrapySubclassedItem, "value"),
MappingProxyType({"serializer": int}),
)

Expand Down Expand Up @@ -215,10 +216,10 @@ class MockItemModule:
with mock.patch("scrapy.item", MockItemModule):
self.assertFalse(is_scrapy_item(dict()))
self.assertEqual(
get_class_field_meta(ScrapySubclassedItem, "name"),
get_field_meta_from_class(ScrapySubclassedItem, "name"),
MappingProxyType({"serializer": str}),
)
self.assertEqual(
get_class_field_meta(ScrapySubclassedItem, "value"),
get_field_meta_from_class(ScrapySubclassedItem, "value"),
MappingProxyType({"serializer": int}),
)

0 comments on commit 3a00e9d

Please sign in to comment.