From 8fe7347dec4b3939520486a0f27b5ccc1866b16a Mon Sep 17 00:00:00 2001 From: Jason Robinson Date: Sun, 9 Aug 2015 03:28:21 +0300 Subject: [PATCH] Add Post.tags property Retrieves a set of unique tags found in the post. --- federation/entities/base.py | 5 ++++ federation/tests/entities/test_base.py | 8 +++++++ federation/tests/factories/__init__.py | 0 federation/tests/factories/entities.py | 32 ++++++++++++++++++++++++++ setup.py | 3 ++- 5 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 federation/tests/entities/test_base.py create mode 100644 federation/tests/factories/__init__.py create mode 100644 federation/tests/factories/entities.py diff --git a/federation/entities/base.py b/federation/entities/base.py index af16e39..1bd673a 100644 --- a/federation/entities/base.py +++ b/federation/entities/base.py @@ -68,6 +68,11 @@ class Post(GUIDMixin, HandleMixin, PublicMixin, CreatedAtMixin, BaseEntity): super(Post, self).__init__(*args, **kwargs) self._required += ["raw_content"] + @property + def tags(self): + """Returns a `set` of unique tags contained in `raw_content`.""" + return set({word.strip("#") for word in self.raw_content.split() if word.startswith("#")}) + class Image(GUIDMixin, HandleMixin, PublicMixin, CreatedAtMixin, BaseEntity): """Reflects a single image, possibly linked to another object.""" diff --git a/federation/tests/entities/test_base.py b/federation/tests/entities/test_base.py new file mode 100644 index 0000000..d9df275 --- /dev/null +++ b/federation/tests/entities/test_base.py @@ -0,0 +1,8 @@ +from federation.tests.factories.entities import TaggedPostFactory + + +class TestPostEntityTags(object): + + def test_post_entity_returns_list_of_tags(self): + post = TaggedPostFactory() + assert post.tags == {"tagone", "tagtwo", "tagthree"} diff --git a/federation/tests/factories/__init__.py b/federation/tests/factories/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/federation/tests/factories/entities.py b/federation/tests/factories/entities.py new file mode 100644 index 0000000..aedab9b --- /dev/null +++ b/federation/tests/factories/entities.py @@ -0,0 +1,32 @@ +from random import shuffle +import factory +from factory import fuzzy + +from federation.entities.base import Post + + +class GUIDMixinFactory(factory.Factory): + guid = fuzzy.FuzzyText(length=32) + + +class HandleMixinFactory(factory.Factory): + handle = fuzzy.FuzzyText(length=8, suffix="@example.com") + + +class PostFactory(GUIDMixinFactory, HandleMixinFactory, factory.Factory): + class Meta: + model = Post + + raw_content = fuzzy.FuzzyText(length=300) + + +class TaggedPostFactory(PostFactory): + + @factory.lazy_attribute + def raw_content(self): + parts = [] + for tag in ["tagone", "tagtwo", "tagthree", "tagthree"]: # Yes, three is twice for fun + parts.append(fuzzy.FuzzyText(length=50).fuzz()) + parts.append("#%s" % tag) + shuffle(parts) + return " ".join(parts) diff --git a/setup.py b/setup.py index 5755f7e..553cdd3 100644 --- a/setup.py +++ b/setup.py @@ -19,8 +19,9 @@ setup( "python-dateutil==2.4.2", "python-xrd==0.1", ], - test_require=[ + tests_require=[ "pytest==2.7.2", + "factory_boy==2.5.2", ], include_package_data=True, )