From 62f24d7d7780a4ce4791c6c662c07f9b1e62ec9e Mon Sep 17 00:00:00 2001 From: JoMingyu Date: Sat, 29 Feb 2020 01:39:09 +0900 Subject: [PATCH] [v0.0.2.2] release - full-featured reviews function --- CHANGES.md | 5 +++ Makefile | 2 +- google_play_scraper/__init__.py | 2 +- google_play_scraper/constants/element.py | 2 + google_play_scraper/features/reviews.py | 9 +++-- tests/e2e_tests/test_reviews.py | 47 +++++++++++++++++++++++- 6 files changed, 60 insertions(+), 7 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index cf1cd9d..36215a6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -51,3 +51,8 @@ ## v0.0.2.1 > Added `filter_score_with` parameter to `reviews` feature - New feature `reviews filtering with score` released. + +## v0.0.2.2 +> `reivews` feature improvement +- New property `reviews` Added. +- Fix bug of `reivews` feature : Bug that occurs when the total number of reviews is less than the `count` argument. diff --git a/Makefile b/Makefile index 1fa0e9c..04d3f19 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ release: - @black ./ + @pipenv run black ./ @rm -rf dist/ @python setup.py sdist @twine upload dist/* diff --git a/google_play_scraper/__init__.py b/google_play_scraper/__init__.py index d672c9c..bb90b4b 100644 --- a/google_play_scraper/__init__.py +++ b/google_play_scraper/__init__.py @@ -2,4 +2,4 @@ from .features.app import app from .features.reviews import reviews -__version__ = "0.0.2.1" +__version__ = "0.0.2.2" diff --git a/google_play_scraper/constants/element.py b/google_play_scraper/constants/element.py index 6b812b2..959047b 100644 --- a/google_play_scraper/constants/element.py +++ b/google_play_scraper/constants/element.py @@ -129,4 +129,6 @@ class ElementSpecs: "thumbsUpCount": ElementSpec(None, [6]), "reviewCreatedVersion": ElementSpec(None, [10]), "at": ElementSpec(None, [5, 0], lambda v: datetime.fromtimestamp(v)), + "replyContent": ElementSpec(None, [7, 1]), + "repliedAt": ElementSpec(None, [7, 2, 0], lambda v: datetime.fromtimestamp(v)), } diff --git a/google_play_scraper/features/reviews.py b/google_play_scraper/features/reviews.py index bc50c58..6d0952d 100644 --- a/google_play_scraper/features/reviews.py +++ b/google_play_scraper/features/reviews.py @@ -1,4 +1,5 @@ import json +from pprint import pprint from typing import Optional from google_play_scraper import Sort @@ -30,9 +31,6 @@ def reviews( app_id, lang="en", country="us", sort=Sort.NEWEST, count=100, filter_score_with=None ): # type: (str, str, str, Sort, int, Optional[int]) -> list - # TODO filtering with device model - # TODO reply data - # TODO refactoring url = Formats.Reviews.build(lang=lang, country=country) @@ -63,8 +61,11 @@ def reviews( if remaining_count_of_reviews_to_fetch == 0: break + if isinstance(pagination_token, list): + break + if remaining_count_of_reviews_to_fetch < 200: - _count = count - len(result) + _count = remaining_count_of_reviews_to_fetch else: continue diff --git a/tests/e2e_tests/test_reviews.py b/tests/e2e_tests/test_reviews.py index 4965e68..78d41c2 100644 --- a/tests/e2e_tests/test_reviews.py +++ b/tests/e2e_tests/test_reviews.py @@ -19,7 +19,8 @@ def test_e2e_scenario_1(self): self.assertTrue(r["content"]) self.assertTrue(r["score"] >= 1) self.assertTrue(r["thumbsUpCount"] >= 0) - self.assertTrue(datetime(2019, 12, 1) < r["at"] < datetime(2040, 1, 1)) + self.assertTrue(datetime(2019, 12, 1) < r["at"] < datetime(2021, 1, 1)) + # TODO change when 2020-12-30 if r["reviewCreatedVersion"]: review_created_version_contained_review_count += 1 @@ -70,3 +71,47 @@ def test_e2e_scenario_4(self): ) self.assertEqual(score * 300, sum([r["score"] for r in result])) + + def test_e2e_scenario_5(self): + """ + tests reply + """ + + result = reviews( + "com.ekkorr.endlessfrontier", + lang="ko", + country="kr", + sort=Sort.MOST_RELEVANT, + ) + + review_count_has_reply = 0 + + for r in result: + reply_content = r["replyContent"] + replied_at = r["repliedAt"] + + if reply_content is not None: + self.assertIn("안녕하세요", reply_content) + self.assertIn("EKKORR", reply_content) + self.assertIn("입니다", reply_content) + self.assertIn("감사합니다", reply_content) + + self.assertTrue(len(reply_content) > 100) + self.assertIsInstance(replied_at, datetime) + self.assertTrue( + datetime(2018, 1, 1) < replied_at < datetime(2021, 1, 1) + ) + # TODO change when 2020-12-30 + + review_count_has_reply += 1 + + self.assertTrue(review_count_has_reply > 50) + + def test_e2e_scenario_6(self): + """ + tests length of results of first request is lower than specified count argument + """ + + result = reviews("com.ekkorr.endlessfrontier") + + self.assertTrue(len(result) < 100)