Repository: incubator-predictionio-sdk-python Updated Branches: refs/heads/develop cd72584e3 -> 8e35e33da
Add travis test and Refactoring Closes #22 Project: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/commit/8e35e33d Tree: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/tree/8e35e33d Diff: http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/diff/8e35e33d Branch: refs/heads/develop Commit: 8e35e33da89323b8f49d026d7035dac172997cf1 Parents: cd72584 Author: Shinsuke Sugaya <[email protected]> Authored: Sun Sep 10 10:35:50 2017 +0900 Committer: Shinsuke Sugaya <[email protected]> Committed: Sun Sep 10 10:35:50 2017 +0900 ---------------------------------------------------------------------- .travis.yml | 34 ++ README.txt | 122 +++---- predictionio/__init__.py | 14 +- tests-obsolete/conversion_test.py | 16 - tests-obsolete/import_testdata.py | 46 --- tests-obsolete/import_testdata_id_mismatch.py | 46 --- tests-obsolete/import_testdata_special_char.py | 46 --- tests-obsolete/predictionio_itemrec_test.py | 336 ----------------- .../predictionio_itemrec_test_special_char.py | 366 ------------------- tests-obsolete/predictionio_itemsim_test.py | 200 ---------- tests-obsolete/predictionio_test.py | 257 ------------- tests/.keep | 0 tests/after_script.travis.sh | 5 + tests/before_script.travis.sh | 27 ++ tests/engineclient_test.py | 48 +++ tests/eventclient_test.py | 251 +++++++++++++ tests/fileexport_test.py | 74 ++++ tox.ini | 7 +- 18 files changed, 511 insertions(+), 1384 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/.travis.yml ---------------------------------------------------------------------- diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..50d98a9 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,34 @@ +sudo: required + +language: python + +jdk: + - oraclejdk8 + +python: + - 2.7 + - 3.4 + - 3.5 + - 3.6 + +cache: + directories: + - $HOME/.ivy2/cache + - $HOME/.sbt/boot + - $HOME/.sbt/launchers + +install: + - pip install tox tox-travis + - pip install coverage coveralls + +before_script: + - java -version + - ./tests/before_script.travis.sh + - export PATH=$PATH:$PWD/predictionio-setup/predictionio/bin + +script: + - pio status + - tox -r + +after_script: + - ./tests/after_script.travis.sh http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/README.txt ---------------------------------------------------------------------- diff --git a/README.txt b/README.txt index 2a542a0..4740ff5 100644 --- a/README.txt +++ b/README.txt @@ -1,63 +1,59 @@ -PredictionIO Python SDK -======================= - - -Installation -============ - -To install the module from PyPI, you may - - $ pip install predictionio - -or - - $ easy_install predictionio - -If you have cloned the repository and want to install directly from there, -do the following in the root directory of the repository: - - $ python setup.py install - -This will install the "predictionio" module to your Python distribution. - - -Usage -===== - -To use predictionio in your Python script, - - >>> import predictionio - - -Documentation -============= - -The latest documentation is located at http://pythonhosted.org/PredictionIO/ - -If you want to build a local copy, please install Sphinx -(http://sphinx-doc.org/install.html). - -To generate documentation, - - % cd docs - % make html - -To view the generated documentation, go to docs/build/html/index.html. - - -SUPPORT -======= - - -Forum ------ - -https://groups.google.com/group/predictionio-user - - -Issue Tracker -------------- - -https://predictionio.atlassian.net - -If you are unsure whether a behavior is an issue, bringing it up in the forum is highly encouraged. +PredictionIO Python SDK +======================= + + +Installation +============ + +To install the module from PyPI, you may + + $ pip install predictionio + +or + + $ easy_install predictionio + +If you have cloned the repository and want to install directly from there, +do the following in the root directory of the repository: + + $ python setup.py install + +This will install the "predictionio" module to your Python distribution. + + +Usage +===== + +To use predictionio in your Python script, + + >>> import predictionio + + +Documentation +============= + +The latest documentation is located at http://pythonhosted.org/PredictionIO/ + +If you want to build a local copy, please install Sphinx +(http://sphinx-doc.org/install.html). + +To generate documentation, + + % cd docs + % make html + +To view the generated documentation, go to docs/build/html/index.html. + + +SUPPORT +======= + +http://predictionio.incubator.apache.org/support/ + + +Issue Tracker +------------- + +https://issues.apache.org/jira/projects/PIO + +If you are unsure whether a behavior is an issue, bringing it up in the forum is highly encouraged. http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/predictionio/__init__.py ---------------------------------------------------------------------- diff --git a/predictionio/__init__.py b/predictionio/__init__.py index b429b4e..01ac045 100644 --- a/predictionio/__init__.py +++ b/predictionio/__init__.py @@ -21,6 +21,12 @@ except ImportError: # pylint: disable=F0401,E0611 from urllib.parse import urlencode +try: + from urllib import quote +except ImportError: + # pylint: disable=F0401,E0611 + from urllib.parse import quote + import json import urllib @@ -260,7 +266,7 @@ class EventClient(BaseClient): if self.channel is not None: qparam["channel"] = self.channel - enc_event_id = urllib.quote(event_id, "") # replace special char with %xx + enc_event_id = quote(event_id, "") # replace special char with %xx path = "/events/%s.json" % (enc_event_id, ) request = AsyncRequest("GET", path, **qparam) request.set_rfunc(self._aget_resp) @@ -335,7 +341,7 @@ class EventClient(BaseClient): if self.channel is not None: qparam["channel"] = self.channel - enc_event_id = urllib.quote(event_id, "") # replace special char with %xx + enc_event_id = quote(event_id, "") # replace special char with %xx path = "/events/%s.json" % (enc_event_id, ) request = AsyncRequest("DELETE", path, **qparam) request.set_rfunc(self._adelete_resp) @@ -519,7 +525,7 @@ class FileExporter(object): def create_event(self, event, entity_type, entity_id, target_entity_type=None, target_entity_id=None, properties=None, - event_time=None): + event_time=None, ensure_ascii=True): """Create an event and write to the file. (please refer to EventClient's create_event()) """ @@ -544,7 +550,7 @@ class FileExporter(object): et_str = et.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + et.strftime("%z") data["eventTime"] = et_str - j = json.dumps(data) + j = json.dumps(data, ensure_ascii=ensure_ascii) self._file.write(j+"\n") def close(self): http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/conversion_test.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/conversion_test.py b/tests-obsolete/conversion_test.py deleted file mode 100644 index b9dca97..0000000 --- a/tests-obsolete/conversion_test.py +++ /dev/null @@ -1,16 +0,0 @@ -import timeit - -if __name__ == "__main__": - a = True - - t = timeit.Timer("json.dumps(True)", "import json") - - t_bool2json = t.timeit(1000) / 1000 - print("bool 2 json") - print(t_bool2json) - - t = timeit.Timer("str(True).lower()", "") - - t_bool2string = t.timeit(1000) / 1000 - print("bool 2 string") - print(t_bool2string) http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/import_testdata.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/import_testdata.py b/tests-obsolete/import_testdata.py deleted file mode 100644 index e5338c0..0000000 --- a/tests-obsolete/import_testdata.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Import simple test data for testing getting itemrec -""" -import predictionio - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" -API_URL = "http://localhost:7070" - -MIN_VERSION = '0.5.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - -if __name__ == "__main__": - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.create_user("u0") - client.create_user("u1") - client.create_user("u2") - client.create_user("u3") - - client.create_item("i0", ("t1",), {"custom1": "i0c1"}) - client.create_item("i1", ("t1", "t2"), {"custom1": "i1c1", "custom2": "i1c2"}) - client.create_item("i2", ("t1", "t2"), {"custom2": "i2c2"}) - client.create_item("i3", ("t1",)) - - client.identify("u0") - client.record_action_on_item("rate", "i0", {"pio_rate": 2}) - client.record_action_on_item("rate", "i1", {"pio_rate": 3}) - client.record_action_on_item("rate", "i2", {"pio_rate": 4}) - - client.identify("u1") - client.record_action_on_item("rate", "i2", {"pio_rate": 4}) - client.record_action_on_item("rate", "i3", {"pio_rate": 1}) - - client.identify("u2") - client.record_action_on_item("rate", "i1", {"pio_rate": 2}) - client.record_action_on_item("rate", "i2", {"pio_rate": 1}) - client.record_action_on_item("rate", "i3", {"pio_rate": 3}) - - client.identify("u3") - client.record_action_on_item("rate", "i0", {"pio_rate": 5}) - client.record_action_on_item("rate", "i1", {"pio_rate": 3}) - client.record_action_on_item("rate", "i3", {"pio_rate": 2}) - - client.close() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/import_testdata_id_mismatch.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/import_testdata_id_mismatch.py b/tests-obsolete/import_testdata_id_mismatch.py deleted file mode 100644 index 104f75c..0000000 --- a/tests-obsolete/import_testdata_id_mismatch.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Import simple test data for testing getting itemrec -""" -import predictionio - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" -API_URL = "http://localhost:8000" - -MIN_VERSION = '0.5.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - -if __name__ == "__main__": - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.create_user("u0") - client.create_user("u1") - client.create_user("u2") - client.create_user("u3") - - client.create_item("i0", ("t1",), {"custom1": "i0c1"}) - client.create_item("i1", ("t1", "t2"), {"custom1": "i1c1", "custom2": "i1c2"}) - client.create_item("i2", ("t1", "t2"), {"custom2": "i2c2"}) - client.create_item("i3", ("t1",)) - - client.identify("u0x") - client.record_action_on_item("rate", "i0", {"pio_rate": 2}) - client.record_action_on_item("rate", "i1", {"pio_rate": 3}) - client.record_action_on_item("rate", "i2", {"pio_rate": 4}) - - client.identify("u1x") - client.record_action_on_item("rate", "i2", {"pio_rate": 4}) - client.record_action_on_item("rate", "i3", {"pio_rate": 1}) - - client.identify("u2x") - client.record_action_on_item("rate", "i1", {"pio_rate": 2}) - client.record_action_on_item("rate", "i2", {"pio_rate": 1}) - client.record_action_on_item("rate", "i3", {"pio_rate": 3}) - - client.identify("u3x") - client.record_action_on_item("rate", "i0", {"pio_rate": 5}) - client.record_action_on_item("rate", "i1", {"pio_rate": 3}) - client.record_action_on_item("rate", "i3", {"pio_rate": 2}) - - client.close() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/import_testdata_special_char.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/import_testdata_special_char.py b/tests-obsolete/import_testdata_special_char.py deleted file mode 100644 index c047b6a..0000000 --- a/tests-obsolete/import_testdata_special_char.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Import simple test data (id with special characters) for testing getting itemrec -""" -import predictionio - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" -API_URL = "http://localhost:8000" - -MIN_VERSION = '0.5.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - -if __name__ == "__main__": - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.create_user("[email protected]") - client.create_user("[email protected]") - client.create_user("http://u2.com") - client.create_user("[email protected]") - - client.create_item("http://i0.com", ("t1",), {"custom1": "i0c1"}) - client.create_item("i1@i1", ("t1", "t2"), {"custom1": "i1c1", "custom2": "i1c2"}) - client.create_item("i2.org", ("t1", "t2"), {"custom2": "i2c2"}) - client.create_item("i3", ("t1",)) - - client.identify("[email protected]") - client.record_action_on_item("rate", "http://i0.com", {"pio_rate": 2}) - client.record_action_on_item("rate", "i1@i1", {"pio_rate": 3}) - client.record_action_on_item("rate", "i2.org", {"pio_rate": 4}) - - client.identify("[email protected]") - client.record_action_on_item("rate", "i2.org", {"pio_rate": 4}) - client.record_action_on_item("rate", "i3", {"pio_rate": 1}) - - client.identify("http://u2.com") - client.record_action_on_item("rate", "i1@i1", {"pio_rate": 2}) - client.record_action_on_item("rate", "i2.org", {"pio_rate": 1}) - client.record_action_on_item("rate", "i3", {"pio_rate": 3}) - - client.identify("[email protected]") - client.record_action_on_item("rate", "http://i0.com", {"pio_rate": 5}) - client.record_action_on_item("rate", "i1@i1", {"pio_rate": 3}) - client.record_action_on_item("rate", "i3", {"pio_rate": 2}) - - client.close() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/predictionio_itemrec_test.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/predictionio_itemrec_test.py b/tests-obsolete/predictionio_itemrec_test.py deleted file mode 100644 index 3105f0f..0000000 --- a/tests-obsolete/predictionio_itemrec_test.py +++ /dev/null @@ -1,336 +0,0 @@ -""" -Test getting itemrec after algo training completes. -""" - -from __future__ import print_function - -import unittest - -import predictionio - - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" # replace this with your AppKey -API_URL = "http://localhost:8000" # PredictoinIO Server - -DEBUG = True - -MIN_VERSION = '0.6.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - - -class TestPredictionIO(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def test_get_itemrec_exception_deprecated(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - try: - client.get_itemrec("uidwithoutrec", 10, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: # noqa - pass # expected exception - except: - raise - - client.close() - - def test_get_itemrec_exception(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.identify("uidwithoutrec") - - try: - client.get_itemrec_topn("python-itemrec-engine", 10) - except predictionio.ItemRecNotFoundError as e: # noqa - pass # expected exception - except: - raise - - try: - client.get_itemrec_topn("python-itemrec-engine", 10, - {"pio_itypes": ("t1",), "pio_latlng": [1.34, 5.67], "pio_within": 5.0, - "pio_unit": "km", "pio_attributes": ["custom1", "custom2"]}) - except predictionio.ItemRecNotFoundError as e: # noqa - pass # expected exception - except: - raise - - client.close() - - def test_get_itemrec_deprecated(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - # request more - try: - itemrec = client.get_itemrec("u0", 10, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3", "i1", "i0"]}) - - try: - itemrec = client.get_itemrec("u1", 10, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": ["i2", "i1", "i0", "i3"]}) or - (itemrec == {"pio_iids": ["i2", "i0", "i1", "i3"]})) - - try: - itemrec = client.get_itemrec("u2", 10, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertTrue((itemrec == {"pio_iids": ["i3", "i0", "i1", "i2"]}) or - (itemrec == {"pio_iids": ["i3", "i1", "i0", "i2"]})) - - try: - itemrec = client.get_itemrec("u3", 6, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertTrue((itemrec == {"pio_iids": ["i0", "i1", "i2", "i3"]}) or - (itemrec == {"pio_iids": ["i0", "i2", "i1", "i3"]})) - - # request less - try: - itemrec = client.get_itemrec("u0", 1, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2"]}) - - try: - itemrec = client.get_itemrec("u0", 2, "python-itemrec-engine") - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3"]}) - - # request with optional attributes - - # pio_itypes - try: - itemrec = client.get_itemrec("u0", 10, "python-itemrec-engine", pio_itypes=("t1", "t2")) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3", "i1", "i0"]}) - - # subset itypes - try: - itemrec = client.get_itemrec("u0", 10, "python-itemrec-engine", pio_itypes=("t2",)) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i1"]}) - - # nonexisting itypes - try: - itemrec = client.get_itemrec("u0", 10, "python-itemrec-engine", pio_itypes=("other-itype",)) - except predictionio.ItemRecNotFoundError as e: - pass # expected no recommendation - except: - raise - - # pio_attributes - try: - itemrec = client.get_itemrec("u0", 10, "python-itemrec-engine", pio_itypes=("t1",), - pio_attributes=["custom1", "custom2"]) - except predictionio.ItemRecNotFoundError as e: # noqa - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3", "i1", "i0"], "custom1": [None, None, "i1c1", "i0c1"], - "custom2": ["i2c2", None, "i1c2", None]}) - - client.close() - - def test_get_itemrec(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - # request more - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3", "i1", "i0"]}) - - client.identify("u1") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertTrue((itemrec == {"pio_iids": ["i2", "i1", "i0", "i3"]}) or - (itemrec == {"pio_iids": ["i2", "i0", "i1", "i3"]})) - - client.identify("u2") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertTrue((itemrec == {"pio_iids": ["i3", "i0", "i1", "i2"]}) or - (itemrec == {"pio_iids": ["i3", "i1", "i0", "i2"]})) - - client.identify("u3") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 6) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertTrue((itemrec == {"pio_iids": ["i0", "i1", "i2", "i3"]}) or - (itemrec == {"pio_iids": ["i0", "i2", "i1", "i3"]})) - - # request less - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 1) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2"]}) - - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 2) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3"]}) - - # request with optional attributes - - # pio_itypes - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10, {"pio_itypes": ("t1", "t2")}) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3", "i1", "i0"]}) - - # subset itypes - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10, {"pio_itypes": ("t2",)}) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - if DEBUG: - print(itemrec) - self.assertEqual(itemrec, {"pio_iids": ["i2", "i1"]}) - - # nonexisting itypes - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10, {"pio_itypes": ("other-itype",)}) - except predictionio.ItemRecNotFoundError as e: - pass # expected no recommendation - except: - raise - - # pio_attributes - client.identify("u0") - try: - itemrec = client.get_itemrec_topn("python-itemrec-engine", 10, - {"pio_itypes": ("t1",), "pio_attributes": ["custom1", "custom2"]}) - except predictionio.ItemRecNotFoundError as e: # noqa - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": ["i2", "i3", "i1", "i0"], "custom1": [None, None, "i1c1", "i0c1"], - "custom2": ["i2c2", None, "i1c2", None]}) - - # TODO pio_latlng - # TODO pio_within - # TODO pio_unit - - client.close() - - -if __name__ == "__main__": - unittest.main() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/predictionio_itemrec_test_special_char.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/predictionio_itemrec_test_special_char.py b/tests-obsolete/predictionio_itemrec_test_special_char.py deleted file mode 100644 index a622800..0000000 --- a/tests-obsolete/predictionio_itemrec_test_special_char.py +++ /dev/null @@ -1,366 +0,0 @@ -""" -Test getting itemrec after algo training completes. -""" -import unittest - -import predictionio - - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" # replace this with your AppKey -API_URL = "http://localhost:8000" # PredictoinIO Server - -DEBUG = True - -MIN_VERSION = '0.6.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - - -class TestPredictionIO(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def test_get_itemrec_deprecated(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - uid0 = "[email protected]" - uid1 = "[email protected]" - uid2 = "http://u2.com" - uid3 = "[email protected]" - - iid0 = "http://i0.com" - iid1 = "i1@i1" - iid2 = "i2.org" - iid3 = "i3" - - engine_name = "itemrec" - - # request more - try: - itemrec = client.get_itemrec(uid0, 10, engine_name) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3, iid1, iid0]}) - - try: - itemrec = client.get_itemrec(uid1, 10, engine_name) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": [iid2, iid1, iid0, iid3]}) or - (itemrec == {"pio_iids": [iid2, iid0, iid1, iid3]})) - - try: - itemrec = client.get_itemrec(uid2, 10, engine_name) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": [iid3, iid0, iid1, iid2]}) or - (itemrec == {"pio_iids": [iid3, iid1, iid0, iid2]})) - - try: - itemrec = client.get_itemrec(uid3, 6, engine_name) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": [iid0, iid1, iid2, iid3]}) or - (itemrec == {"pio_iids": [iid0, iid2, iid1, iid3]})) - - # request less - try: - itemrec = client.get_itemrec(uid0, 1, engine_name) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2]}) - - try: - itemrec = client.get_itemrec(uid0, 2, engine_name) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3]}) - - # request with optional attributes - - # pio_itypes - try: - itemrec = client.get_itemrec(uid0, 10, engine_name, pio_itypes=("t1", "t2")) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3, iid1, iid0]}) - - # subset itypes - try: - itemrec = client.get_itemrec(uid0, 10, engine_name, pio_itypes=("t2",)) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid1]}) - - # nonexisting itypes - try: - client.get_itemrec(uid0, 10, engine_name, pio_itypes=("other-itype",)) - except predictionio.ItemRecNotFoundError as e: - print(e) - pass # expected no recommendation - except: - raise - - # pio_attributes - try: - itemrec = client.get_itemrec(uid0, 10, engine_name, pio_itypes=("t1",), - pio_attributes=["custom1", "custom2"]) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3, iid1, iid0], "custom1": [None, None, "i1c1", "i0c1"], - "custom2": ["i2c2", None, "i1c2", None]}) - - client.close() - - def test_get_itemrec(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - uid0 = "[email protected]" - uid1 = "[email protected]" - uid2 = "http://u2.com" - uid3 = "[email protected]" - - iid0 = "http://i0.com" - iid1 = "i1@i1" - iid2 = "i2.org" - iid3 = "i3" - - engine_name = "itemrec" - - # request more - client.identify(uid0) - try: - itemrec = client.get_itemrec_topn(engine_name, 10) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3, iid1, iid0]}) - - client.identify(uid1) - try: - itemrec = client.get_itemrec_topn(engine_name, 10) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": [iid2, iid1, iid0, iid3]}) or - (itemrec == {"pio_iids": [iid2, iid0, iid1, iid3]})) - - client.identify(uid2) - try: - itemrec = client.get_itemrec_topn(engine_name, 10) - except predictionio.ItemRecNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": [iid3, iid0, iid1, iid2]}) or - (itemrec == {"pio_iids": [iid3, iid1, iid0, iid2]})) - - client.identify(uid3) - try: - itemrec = client.get_itemrec_topn(engine_name, 6) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertTrue((itemrec == {"pio_iids": [iid0, iid1, iid2, iid3]}) or - (itemrec == {"pio_iids": [iid0, iid2, iid1, iid3]})) - - # request less - client.identify(uid0) - try: - itemrec = client.get_itemrec_topn(engine_name, 1) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2]}) - - client.identify(uid0) - try: - itemrec = client.get_itemrec_topn(engine_name, 2) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3]}) - - # request with optional attributes - - # pio_itypes - client.identify(uid0) - try: - itemrec = client.get_itemrec_topn(engine_name, 10, {"pio_itypes": ("t1", "t2")}) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3, iid1, iid0]}) - - # subset itypes - client.identify(uid0) - try: - itemrec = client.get_itemrec_topn(engine_name, 10, {"pio_itypes": ("t2",)}) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid1]}) - - # nonexisting itypes - client.identify(uid0) - try: - client.get_itemrec_topn(engine_name, 10, {"pio_itypes": ("other-itype",)}) - except predictionio.ItemRecNotFoundError as e: - print(e) - pass # expected no recommendation - except: - raise - - # pio_attributes - client.identify(uid0) - try: - itemrec = client.get_itemrec_topn(engine_name, 10, - {"pio_itypes": ("t1",), "pio_attributes": ["custom1", "custom2"]}) - except predictionio.ItemRecNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemrec) - - self.assertEqual(itemrec, {"pio_iids": [iid2, iid3, iid1, iid0], "custom1": [None, None, "i1c1", "i0c1"], - "custom2": ["i2c2", None, "i1c2", None]}) - - # TODO pio_latlng - # TODO pio_within - # TODO pio_unit - - client.close() - - -if __name__ == "__main__": - unittest.main() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/predictionio_itemsim_test.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/predictionio_itemsim_test.py b/tests-obsolete/predictionio_itemsim_test.py deleted file mode 100644 index 45fa151..0000000 --- a/tests-obsolete/predictionio_itemsim_test.py +++ /dev/null @@ -1,200 +0,0 @@ -""" -Test getting itemsim after algo training completes (pdio-itemsimcf with cosine sim). -""" -import unittest - -import predictionio - - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" # replace this with your AppKey -API_URL = "http://localhost:8000" # PredictoinIO Server - -DEBUG = True - -MIN_VERSION = '0.6.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - - -class TestPredictionIO(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def test_get_itemsim_exception(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - try: - client.get_itemsim_topn("python-itemsim-engine", "iidwithoutsim", 10) - except predictionio.ItemSimNotFoundError as e: - pass # expected exception - except: - raise - - try: - client.get_itemsim_topn("python-itemsim-engine", "iidwithoutsim", 10, - {"pio_itypes": ("t1",), "pio_latlng": [1.34, 5.67], "pio_within": 5.0, - "pio_unit": "km", "pio_attributes": ["custom1", "custom2"]}) - except predictionio.ItemSimNotFoundError as e: - if DEBUG: - print(e) - pass # expected exception - except: - raise - - client.close() - - def test_get_itemsim(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - # request more than what is available - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i0", 10) - except predictionio.ItemSimNotFoundError as e: - print - "ERROR: have you run import_testdata.py and then wait for the algorithm training completion?" - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertTrue((itemsim == {"pio_iids": ["i1", "i2", "i3"]}) or - (itemsim == {"pio_iids": ["i1", "i3", "i2"]})) - - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i1", 10) - except predictionio.ItemSimNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertTrue((itemsim == {"pio_iids": ["i2", "i3", "i0"]})) - - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i2", 10) - except predictionio.ItemSimNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertTrue((itemsim == {"pio_iids": ["i1", "i3", "i0"]})) - - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i3", 10) - except predictionio.ItemSimNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertTrue((itemsim == {"pio_iids": ["i1", "i2", "i0"]})) - - # request less - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i1", 1) - except predictionio.ItemSimNotFoundError as e: - print - "ERROR: have you run import_testdata.py and then wait for the algorithm training completion?" - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertEqual(itemsim, {"pio_iids": ["i2"]}) - - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i1", 2) - except predictionio.ItemSimNotFoundError as e: - print - "ERROR: have you run import_testdata.py and then wait for the algorithm training completion?" - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertEqual(itemsim, {"pio_iids": ["i2", "i3"]}) - - # request with optional attributes - - # pio_itypes - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i1", 10, {"pio_itypes": ("t1", "t2")}) - except predictionio.ItemSimNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertEqual(itemsim, {"pio_iids": ["i2", "i3", "i0"]}) - - # subset itypes - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i1", 10, {"pio_itypes": ("t2",)}) - except predictionio.ItemSimNotFoundError as e: - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertEqual(itemsim, {"pio_iids": ["i2"]}) - - # nonexisting itypes - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i0", 10, {"pio_itypes": ("other-itype",)}) - except predictionio.ItemSimNotFoundError as e: - pass # expected no recommendation - except: - raise - - # pio_attributes - try: - itemsim = client.get_itemsim_topn("python-itemsim-engine", "i1", 10, - {"pio_itypes": ("t1",), "pio_attributes": ["custom1", "custom2"]}) - except predictionio.ItemSimNotFoundError as e: - print(e) - print("ERROR: have you run import_testdata.py and then wait for the algorithm training completion?") - raise - except: - raise - - if DEBUG: - print(itemsim) - - self.assertEqual(itemsim, {"pio_iids": ["i2", "i3", "i0"], "custom1": [None, None, "i0c1"], - "custom2": ["i2c2", None, None]}) - - # TODO pio_latlng - # TODO pio_within - # TODO pio_unit - - client.close() - - -if __name__ == "__main__": - unittest.main() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests-obsolete/predictionio_test.py ---------------------------------------------------------------------- diff --git a/tests-obsolete/predictionio_test.py b/tests-obsolete/predictionio_test.py deleted file mode 100644 index 696718c..0000000 --- a/tests-obsolete/predictionio_test.py +++ /dev/null @@ -1,257 +0,0 @@ -""" -Test Python SDK -""" -import unittest - -import predictionio -import time - - -APP_KEY = "gDx1XuMUC9vu1YWWPRZkLRTftoq7m73mlj2MtnZEjncPlZ1JxUS2s7oajwP9xrZQ" # replace this with your AppKey -API_URL = "http://localhost:8000" # PredictoinIO Server - -MIN_VERSION = '0.6.0' -if predictionio.__version__ < MIN_VERSION: - err = "Require PredictionIO Python SDK version >= %s" % MIN_VERSION - raise Exception(err) - -# print predictionio.__version__ -# predictionio.connection.enable_log() - - -class TestPredictionIO(unittest.TestCase): - def setUp(self): - pass - - def tearDown(self): - pass - - def test_status(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - status = client.get_status() - self.assertEqual(status, "PredictionIO Output API is online.") - client.close() - - def _test_user(self, uids): - client = predictionio.Client(APP_KEY, 1, API_URL) - - uid1 = uids[0] - uid2 = uids[1] - uid3 = uids[2] - uid4 = uids[3] - uid5 = uids[4] - - # create users and get them back - client.create_user(uid1) - # create user with optional attributes - client.create_user(uid2, {"pio_latlng": [1.2, 33.3]}) - client.create_user(uid3, {"pio_latlng": [4.5, 67.8], "pio_inactive": True}) - # create user with custom attributes - client.create_user(uid4, {"pio_latlng": [1.2, 33.3], "custom1": "value1", "custom2": "value2"}) - client.create_user(uid5, {"custom1": "u5c1", "custom2": "u5c2"}) - - user1 = client.get_user(uid1) - user2 = client.get_user(uid2) - user3 = client.get_user(uid3) - user4 = client.get_user(uid4) - user5 = client.get_user(uid5) - - self.assertEqual(user1, {"pio_uid": uid1}) - self.assertEqual(user2, {"pio_uid": uid2, "pio_latlng": [1.2, 33.3]}) - self.assertEqual(user3, {"pio_uid": uid3, "pio_latlng": [4.5, 67.8], "pio_inactive": True}) - self.assertEqual(user4, {"pio_uid": uid4, "pio_latlng": [1.2, 33.3], "custom1": "value1", "custom2": "value2"}) - self.assertEqual(user5, {"pio_uid": uid5, "custom1": "u5c1", "custom2": "u5c2"}) - - # delete user and then try to get it - client.delete_user(uid1) - - try: - client.get_user(uid1) - except predictionio.UserNotFoundError as e: # noqa - pass # expected exception - except: - raise - - # other users still exist - user2 = client.get_user(uid2) - self.assertEqual(user2, {"pio_uid": uid2, "pio_latlng": [1.2, 33.3]}) - - # read, modify, write - user3 = client.get_user(uid3) - self.assertEqual(user3, {"pio_uid": uid3, "pio_latlng": [4.5, 67.8], "pio_inactive": True}) - del user3["pio_uid"] - user3["pio_latlng"] = [5.6, 10.11] - user3["pio_inactive"] = False - user3["custom1"] = "food" - client.create_user(uid3, user3) - updated_user3 = client.get_user(uid3) - self.assertEqual(updated_user3, - {"pio_uid": uid3, "pio_latlng": [5.6, 10.11], "pio_inactive": False, "custom1": "food"}) - - user4 = client.get_user(uid4) - self.assertEqual(user4, {"pio_uid": uid4, "pio_latlng": [1.2, 33.3], "custom1": "value1", "custom2": "value2"}) - del user4["pio_uid"] - user4["custom1"] = "new value" - client.create_user(uid4, user4) - updated_user4 = client.get_user(uid4) - self.assertEqual(updated_user4, - {"pio_uid": uid4, "pio_latlng": [1.2, 33.3], "custom1": "new value", "custom2": "value2"}) - - client.close() - - def test_user(self): - self._test_user(["u1", "u2", "u3", "u4", "u5"]) - # test special characters in uid - self._test_user(["[email protected]", "u2@ap/ple", "[email protected]", "u4/a/b", "&^%$()u5"]) - - def _test_item(self, iids): - client = predictionio.Client(APP_KEY, 1, API_URL) - - iid1 = iids[0] - iid2 = iids[1] - iid3 = iids[2] - iid4 = iids[3] - iid5 = iids[4] - - # create items and read back - client.create_item(iid1, ("t1", "t2", "t3")) - client.create_item(iid2, ("t1",)) - client.create_item(iid3, ("t2",), - {"pio_price": 4.99, "pio_profit": 2.0, "pio_startT": 12345667, "pio_endT": 4567788, - "pio_latlng": [1.345, 9.876], "pio_inactive": True}) - client.create_item(iid4, ("t2",), {"pio_latlng": [1.2345, 10.11], "custom1": "value1"}) - client.create_item(iid5, ("t1", "t2"), {"custom1": "i5value1", "custom2": "i5value2"}) - - item1 = client.get_item(iid1) - item2 = client.get_item(iid2) - item3 = client.get_item(iid3) - item4 = client.get_item(iid4) - item5 = client.get_item(iid5) - - del item1["pio_startT"] # pio_startT is automatically inserted, don't compare - self.assertEqual(item1, {"pio_iid": iid1, "pio_itypes": ("t1", "t2", "t3")}) - del item2["pio_startT"] - self.assertEqual(item2, {"pio_iid": iid2, "pio_itypes": ("t1",)}) - self.assertEqual(item3, {"pio_iid": iid3, "pio_itypes": ("t2",), "pio_price": 4.99, "pio_profit": 2.0, - "pio_startT": 12345667, "pio_endT": 4567788, "pio_latlng": [1.345, 9.876], - "pio_inactive": True}) - del item4["pio_startT"] - self.assertEqual(item4, - {"pio_iid": iid4, "pio_itypes": ("t2",), "pio_latlng": [1.2345, 10.11], "custom1": "value1"}) - del item5["pio_startT"] - self.assertEqual(item5, - {"pio_iid": iid5, "pio_itypes": ("t1", "t2"), "custom1": "i5value1", "custom2": "i5value2"}) - - # delete and then try to get it - client.delete_item(iid2) - - try: - item2 = client.get_item(iid2) - except predictionio.ItemNotFoundError as e: # noqa - pass # expected exception - except: - raise - - # others still exist - item3 = client.get_item(iid3) - self.assertEqual(item3, {"pio_iid": iid3, "pio_itypes": ("t2",), "pio_price": 4.99, "pio_profit": 2.0, - "pio_startT": 12345667, "pio_endT": 4567788, "pio_latlng": [1.345, 9.876], - "pio_inactive": True}) - - # read, modify, write - del item3["pio_iid"] - item3_itypes = item3.pop("pio_itypes") - item3["pio_price"] = 6.99 - item3["custom1"] = "some value" - client.create_item(iid3, item3_itypes, item3) - updated_item3 = client.get_item(iid3) - self.assertEqual(updated_item3, {"pio_iid": iid3, "pio_itypes": ("t2",), "pio_price": 6.99, "pio_profit": 2.0, - "pio_startT": 12345667, "pio_endT": 4567788, "pio_latlng": [1.345, 9.876], - "pio_inactive": True, "custom1": "some value"}) - - client.close() - - def test_item(self): - self._test_item(["i1", "i2", "i3", "i4", "i5"]) - # test special characters in iid - self._test_item(["[email protected]", "i2/f/bar//@@foo", "$$i3%%$~~", "http://www.i4.com", "``i5/apple/"]) - - def test_u2iAction_deprecated(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.user_like_item("u1", "i1") - client.user_dislike_item("u2", "i2") - client.user_view_item("u3", "i3") - client.user_rate_item("u4", "i4", 4) - client.user_conversion_item("u5", "i5") - - client.close() - - def test_u2iAction(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.identify("u101") - - # required param - client.record_action_on_item("like", "i1") - client.record_action_on_item("dislike", "i2") - client.record_action_on_item("view", "i3") - client.record_action_on_item("rate", "i4", {"pio_rate": 1}) - client.record_action_on_item("conversion", "i5") - - client.identify("u102") - - # with optional param - client.record_action_on_item("like", "i1", {"pio_latlng": [1.23, 4.56]}) - client.record_action_on_item("dislike", "i2", {"pio_t": 1234567689}) - client.record_action_on_item("view", "i3", {"pio_latlng": [4.67, 1.44], "pio_t": 3445566778}) - client.record_action_on_item("rate", "i4", {"pio_rate": 1, "pio_latlng": [66.78, 9.10]}) - client.record_action_on_item("conversion", "i5", {"pio_price": 12.5}) - - # uid and iid with special characters - client.identify("[email protected]") - client.record_action_on_item("view", "[email protected]") - client.record_action_on_item("view", "http://www.yahoo.com") - - client.close() - - def test_pending_requests(self): - client = predictionio.Client(APP_KEY, 1, API_URL) - - client.identify("u111") - for i in range(100): - client.arecord_action_on_item("like", str(i)) - - n = 1 - while n > 0: - n = client.pending_requests() - time.sleep(0.1) - # print n - - client.close() - - def test_qsize(self): - client = predictionio.Client(APP_KEY, 1, API_URL, qsize=10) - - client.identify("u222") - for i in range(100): - client.arecord_action_on_item("like", str(i)) - - n = 1 - while n > 0: - n = client.pending_requests() - time.sleep(0.1) - # print n - - client.close() - - -""" -to run individual test: -$ python -m unittest predictionio_test.TestPredictionIO.test_user - -to run ALL tests: -% python predictionio_test.py -""" -if __name__ == "__main__": - unittest.main() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests/.keep ---------------------------------------------------------------------- diff --git a/tests/.keep b/tests/.keep deleted file mode 100644 index e69de29..0000000 http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests/after_script.travis.sh ---------------------------------------------------------------------- diff --git a/tests/after_script.travis.sh b/tests/after_script.travis.sh new file mode 100755 index 0000000..e2ea03f --- /dev/null +++ b/tests/after_script.travis.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +cd predictionio-setup +./bin/pio-setup stop + http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests/before_script.travis.sh ---------------------------------------------------------------------- diff --git a/tests/before_script.travis.sh b/tests/before_script.travis.sh new file mode 100755 index 0000000..a38a6ee --- /dev/null +++ b/tests/before_script.travis.sh @@ -0,0 +1,27 @@ +#!/bin/sh + +mkdir -p predictionio-setup/bin +cd predictionio-setup +curl -o bin/pio-setup https://raw.githubusercontent.com/jpioug/predictionio-setup/master/bin/pio-setup +chmod +x bin/pio-setup + +PIO_GIT_USER=apache PIO_GIT_BRANCH=develop PIO_EVENTDATA_REFRESH=true ./bin/pio-setup deploy +touch target/pio-setup.log +tail -f target/pio-setup.log & + +counter=1 +ret=7 +while [ $ret = 7 -a $counter != 10 ] ; do + ./bin/pio-setup start + sleep 5 + curl -v 127.0.0.1:7070/events.json + ret=$? + echo "Checking Java processes..." + ps aux | grep java + echo "Checking 7070 port..." + netstat | grep 7070 + counter=`expr $counter + 1` +done + +./bin/pio-setup status +tail -f ~/pio.log & http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests/engineclient_test.py ---------------------------------------------------------------------- diff --git a/tests/engineclient_test.py b/tests/engineclient_test.py new file mode 100644 index 0000000..276328b --- /dev/null +++ b/tests/engineclient_test.py @@ -0,0 +1,48 @@ +import random +import subprocess +import unittest + +from predictionio import EventClient + +app_name ='EngineClientApp' +access_key = 'FILE_EXPORT_TEST' + +class EngineClientTest(unittest.TestCase): + + def setUp(self): + subprocess.call(['pio', 'app', 'new', '--access-key', access_key, app_name]) + + def tearDown(self): + subprocess.call(['pio', 'app', 'delete', '-f', app_name]) + + def test_query(self): + random.seed() + + client = EventClient(access_key=access_key, url="http://127.0.0.1:7070") + + # Check status + print("Check status") + print(client.get_status()) + self.assertEqual(client.get_status(), {'status': 'alive'}) + + user_ids = [str(i) for i in range(1, 3)] + for user_id in user_ids: + print("Set user", user_id) + client.set_user(user_id) + # TODO assert + + item_ids = [str(i) for i in range(1, 5)] + for item_id in item_ids: + print("Set item", item_id) + client.set_item(item_id, {"itypes": ['1']}) + # TODO assert + + # each user randomly views 10 items + for user_id in user_ids: + for viewed_item in random.sample(item_ids, 2): + print("User", user_id, "views item", viewed_item) + client.record_user_action_on_item("view", user_id, viewed_item) + # TODO assert + + client.close() + http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests/eventclient_test.py ---------------------------------------------------------------------- diff --git a/tests/eventclient_test.py b/tests/eventclient_test.py new file mode 100644 index 0000000..900c48b --- /dev/null +++ b/tests/eventclient_test.py @@ -0,0 +1,251 @@ +import pytz +import subprocess +import unittest + +from datetime import datetime +from predictionio import EventClient +from predictionio import NotFoundError + +app_name ='EventClientApp' +access_key = 'EVENT_CLIENT_TEST' +channel = 'Test' + +class EventClientTest(unittest.TestCase): + + def setUp(self): + subprocess.call(['pio', 'app', 'new', '--access-key', access_key, app_name]) + subprocess.call(['pio', 'app', 'show', app_name]) + + def tearDown(self): + subprocess.call(['pio', 'app', 'delete', '-f', app_name]) + + def test_eventclient(self): + client = EventClient(access_key=access_key, url="http://127.0.0.1:7070") + + # Check status + print("Check status") + print(client.get_status()) + self.assertEqual(client.get_status(), {'status': 'alive'}) + + # First event + first_event_properties = { + "prop1": 1, + "prop2": "value2", + "prop3": [1, 2, 3], + "prop4": True, + "prop5": ["a", "b", "c"], + "prop6": 4.56, + } + first_event_time = datetime( + 2004, 12, 13, 21, 39, 45, 618000, pytz.timezone('US/Mountain')) + first_event_response = client.create_event( + event="my_event", + entity_type="user", + entity_id="uid", + properties=first_event_properties, + event_time=first_event_time, + ) + print("First Event response") + print(first_event_response) + self.assertEqual(first_event_response.status, 201) + + # Second event + second_event_properties = { + "someProperty": "value1", + "anotherProperty": "value2", + } + second_event_response = client.create_event( + event="my_event", + entity_type="user", + entity_id="uid", + target_entity_type="item", + target_entity_id="iid", + properties=second_event_properties, + event_time=datetime(2014, 12, 13, 21, 38, 45, 618000, pytz.utc)) + print("Second Event response") + print(second_event_response) + self.assertEqual(second_event_response.status, 201) + + + # Get the first event from Event Server + first_event_id = first_event_response.json_body["eventId"] + print("Get Event") + event = client.get_event(first_event_id) + print(event) + self.assertEqual(event.get('eventId'), first_event_id) + + + # Delete the first event from Event Server + print("Delete Event") + delete_response = client.delete_event(first_event_id) + print(delete_response) + self.assertEqual(delete_response.decode('utf-8'), '{"message":"Found"}') + + + # Delete the first event from Event Server again should yield exception. + print("Delete Event Again") + try: + delete_response = client.delete_event(first_event_id) + self.fail() + except NotFoundError as ex: + print("The expected error: {0}".format(ex)) + + + # "user"-helper methods + + # Set user properties implicitly create a user + # This call creates a user "foo", and set the properties of "foo". + print("Create user foo") + foo_properties = {"city": "sunnyvale", "car": "honda fit"} + response = client.set_user("foo", properties=foo_properties) + print(response) + self.assertEqual(response.status, 201) + + # This call overrides the existing properties for user "foo", setting "car" to + # a new "honda odyssey" and create a new property "food" to "seafood". + print("Set new properties") + foo_properties = {"car": "honda odyssey", "food": "seafood"} + response = client.set_user("foo", properties=foo_properties) + print(response) + self.assertEqual(response.status, 201) + + # This call removes the specified properties. It ignores the value of the dict. + # After this call, the "city" will become an unset field. + print("Unset properties") + foo_properties = {"city": "x"} + response = client.unset_user("foo", properties=foo_properties) + print(response) + self.assertEqual(response.status, 201) + + # This call deletes a user + print("Delete user") + response = client.delete_user("foo") + print(response) + self.assertEqual(response.status, 201) + + # The SDK also support specifying the eventTime. It is useful for importing + # events happened in the past. + foo_time = datetime(2014, 8, 31, 4, 56, tzinfo=pytz.timezone('US/Pacific')) + print("Create user at " + str(foo_time)) + response = client.set_user("Jarvis", {}, foo_time) + print(response) + self.assertEqual(response.status, 201) + + # "item"-helper methods + + # Set item properties implicitly create a item + # This call creates a item "bar", and set the properties of "bar". + print("Create item bar") + bar_properties = {"city": "santa clara", "weight": 6.9} + response = client.set_item("bar", properties=bar_properties) + print(response) + self.assertEqual(response.status, 201) + + # Similar to user-methods, we can do the same thing with item + print("Set new properties") + bar_properties = {"weight": 6.2} + response = client.set_item("bar", properties=bar_properties) + print(response) + self.assertEqual(response.status, 201) + + # This call removes the specified properties. It ignores the value of the dict. + # After this call, the "city" will become an unset field. + print("Unset properties") + bar_properties = {"city": None} + response = client.unset_item("bar", properties=bar_properties) + print(response) + self.assertEqual(response.status, 201) + + # This call deletes a item + print("Delete item") + response = client.delete_item("bar") + print(response) + self.assertEqual(response.status, 201) + + + # "record" action helper functions + + # This call creates a event between a user and an item. In particular, this set + # the price of the action + print("Record user action") + action_properties = {"price": 10.0} + response = client.record_user_action_on_item("buy", "foo", "bar", action_properties) + print(response) + self.assertEqual(response.status, 201) + + + def test_eventclient_channel(self): + subprocess.call(['pio', 'app', 'channel-new', app_name, channel]) + + client = EventClient(access_key=access_key, url="http://127.0.0.1:7070", + channel=channel) + + # Check status + print("Check status") + print(client.get_status()) + self.assertEqual(client.get_status(), {'status': 'alive'}) + + # First event + first_event_properties = { + "prop1" : 1, + "prop2" : "value2", + "prop3" : [1, 2, 3], + "prop4" : True, + "prop5" : ["a", "b", "c"], + "prop6" : 4.56 , + } + first_event_time = datetime( + 2004, 12, 13, 21, 39, 45, 618000, pytz.timezone('US/Mountain')) + first_event_response = client.create_event( + event="my_event", + entity_type="user", + entity_id="uid", + properties=first_event_properties, + event_time=first_event_time, + ) + print("First Event response") + print(first_event_response) + self.assertEqual(first_event_response.status, 201) + + # Second event + second_event_properties = { + "someProperty" : "value1", + "anotherProperty" : "value2", + } + second_event_response = client.create_event( + event="my_event", + entity_type="user", + entity_id="uid", + target_entity_type="item", + target_entity_id="iid", + properties=second_event_properties, + event_time=datetime(2014, 12, 13, 21, 38, 45, 618000, pytz.utc)) + print("Second Event response") + print(second_event_response) + self.assertEqual(second_event_response.status, 201) + + + # Get the first event from Event Server + first_event_id = first_event_response.json_body["eventId"] + print("Get Event") + event = client.get_event(first_event_id) + print(event) + self.assertEqual(event.get('eventId'), first_event_id) + + # Delete the first event from Event Server + print("Delete Event") + delete_response = client.delete_event(first_event_id) + print(delete_response) + self.assertEqual(delete_response.decode('utf-8'), '{"message":"Found"}') + + # Delete the first event from Event Server again should yield exception. + print("Delete Event Again") + try: + delete_response = client.delete_event(first_event_id) + self.fail() + except NotFoundError as ex: + print("The expected error: {0}".format(ex)) + + +if __name__ == "__main__": + unittest.main() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tests/fileexport_test.py ---------------------------------------------------------------------- diff --git a/tests/fileexport_test.py b/tests/fileexport_test.py new file mode 100644 index 0000000..0fad97e --- /dev/null +++ b/tests/fileexport_test.py @@ -0,0 +1,74 @@ +import pytz +import re +import subprocess +import unittest + +from datetime import datetime +import predictionio +from predictionio import EventClient + +app_name ='FileExporterApp' +access_key = 'FILE_EXPORT_TEST' +filename = 'export_events.json' + +class FileExporterTest(unittest.TestCase): + + def setUp(self): + subprocess.call(['pio', 'app', 'new', '--access-key', access_key, app_name]) + + def tearDown(self): + subprocess.call(['pio', 'app', 'delete', '-f', app_name]) + + def test_export(self): + app_info = subprocess.check_output(['pio', 'app', 'show', app_name]) + app_id = re.search('App ID: ([0-9]+)', app_info.decode('utf-8')).group(1) + print(app_id) + + exporter = predictionio.FileExporter(file_name=filename) + + first_event_properties = { + "prop1" : 1, + "prop2" : "value2", + "prop3" : [1, 2, 3], + "prop4" : True, + "prop5" : ["a", "b", "c"], + "prop6" : 4.56 , + } + first_event_time = datetime( + 2004, 12, 13, 21, 39, 45, 618000, pytz.timezone('US/Mountain')) + exporter.create_event( + event="my_event", + entity_type="user", + entity_id="uid", + properties=first_event_properties, + event_time=first_event_time, + ) + + # Second event + second_event_properties = { + "someProperty" : "value1", + "anotherProperty" : "value2", + } + exporter.create_event( + event="my_event", + entity_type="user", + entity_id="uid", + target_entity_type="item", + target_entity_id="iid", + properties=second_event_properties, + event_time=datetime(2014, 12, 13, 21, 38, 45, 618000, pytz.utc)) + + exporter.close() + + subprocess.call(['pio', 'import', '--appid', app_id, '--input ', filename]) + + # TODO + # client = EventClient(access_key=access_key, url="http://127.0.0.1:7070") + # + # print("Get Event") + # event = client.get_event(event_id) + # print(event) + # self.assertEqual(event.get('eventId'), event_id) + +if __name__ == "__main__": + unittest.main() http://git-wip-us.apache.org/repos/asf/incubator-predictionio-sdk-python/blob/8e35e33d/tox.ini ---------------------------------------------------------------------- diff --git a/tox.ini b/tox.ini index 87b57e9..6f5cd20 100644 --- a/tox.ini +++ b/tox.ini @@ -1,13 +1,12 @@ [tox] -envlist = py27,py34 +envlist = py27,py34,py35,py36 [testenv] deps = flake8 - pandas +passenv = HOME TRAVIS* +commands = python -m unittest discover --pattern=*.py tests [flake8] ignore = E111 - commands = flake8 --ignore=E501 --filename=*.py --exclude=doc,setup.py,*/tests/* - python -m unittest discover --pattern=*.py tests
