From 187cb2ecd9fd84a5d84d35649e46a3ddec12d25c Mon Sep 17 00:00:00 2001 From: Alex Schworer Date: Wed, 22 May 2013 13:50:15 -0700 Subject: [PATCH 1/3] Add Reports API methods --- test/fixtures/report_all.json | 17 ++++++++++++ test/fixtures/report_live.json | 9 +++++++ test/fixtures/report_vod.json | 6 +++++ test/test_reports.py | 48 ++++++++++++++++++++++++++++++++++ zencoder/core.py | 46 +++++++++++++++++++++++++------- 5 files changed, 117 insertions(+), 9 deletions(-) create mode 100644 test/fixtures/report_all.json create mode 100644 test/fixtures/report_live.json create mode 100644 test/fixtures/report_vod.json create mode 100644 test/test_reports.py diff --git a/test/fixtures/report_all.json b/test/fixtures/report_all.json new file mode 100644 index 0000000..c8f281f --- /dev/null +++ b/test/fixtures/report_all.json @@ -0,0 +1,17 @@ +{ + "total": { + "live": { + "encoded_hours": 5, + "stream_hours": 5 + }, + "vod": { + "encoded_minutes": 6, + "billable_minutes": 8 + } + }, + "statistics": { + "live": { + "length": 2 + } + } +} diff --git a/test/fixtures/report_live.json b/test/fixtures/report_live.json new file mode 100644 index 0000000..76f1445 --- /dev/null +++ b/test/fixtures/report_live.json @@ -0,0 +1,9 @@ +{ + "total": { + "encoded_hours": 5, + "stream_hours": 5 + }, + "statistics": { + "length": 5 + } +} diff --git a/test/fixtures/report_vod.json b/test/fixtures/report_vod.json new file mode 100644 index 0000000..ac9fe85 --- /dev/null +++ b/test/fixtures/report_vod.json @@ -0,0 +1,6 @@ +{ + "total": { + "encoded_minutes": 6, + "billable_minutes": 8 + } +} diff --git a/test/test_reports.py b/test/test_reports.py new file mode 100644 index 0000000..29414d7 --- /dev/null +++ b/test/test_reports.py @@ -0,0 +1,48 @@ +import unittest +from mock import patch + +from test_util import TEST_API_KEY, load_response +from zencoder import Zencoder + +class TestReports(unittest.TestCase): + def setUp(self): + self.zen = Zencoder(api_key=TEST_API_KEY) + + @patch("requests.Session.get") + def test_reports_vod(self, get): + get.return_value = load_response(200, 'fixtures/report_vod.json') + + resp = self.zen.report.vod() + + self.assertEquals(resp.code, 200) + self.assertEquals(resp.body['total']['encoded_minutes'], 6) + self.assertEquals(resp.body['total']['billable_minutes'], 8) + + @patch("requests.Session.get") + def test_reports_live(self, get): + get.return_value = load_response(200, 'fixtures/report_live.json') + + resp = self.zen.report.live() + + self.assertEquals(resp.code, 200) + self.assertEquals(resp.body['total']['stream_hours'], 5) + self.assertEquals(resp.body['total']['encoded_hours'], 5) + self.assertEquals(resp.body['statistics']['length'], 5) + + @patch("requests.Session.get") + def test_reports_all(self, get): + get.return_value = load_response(200, 'fixtures/report_all.json') + + resp = self.zen.report.live() + + self.assertEquals(resp.code, 200) + + self.assertEquals(resp.body['total']['live']['stream_hours'], 5) + self.assertEquals(resp.body['total']['live']['encoded_hours'], 5) + self.assertEquals(resp.body['total']['vod']['encoded_minutes'], 6) + self.assertEquals(resp.body['total']['vod']['billable_minutes'], 8) + self.assertEquals(resp.body['statistics']['live']['length'], 2) + +if __name__ == "__main__": + unittest.main() + diff --git a/zencoder/core.py b/zencoder/core.py index 05b911d..120c2c4 100644 --- a/zencoder/core.py +++ b/zencoder/core.py @@ -340,6 +340,21 @@ def __init__(self, *args, **kwargs): kwargs['resource_name'] = 'reports' super(Report, self).__init__(*args, **kwargs) + def __format(self, start_date=None, end_date=None, grouping=None): + data = {'api_key': self.api_key} + + date_format = '%Y-%m-%d' + if start_date: + data['from'] = datetime.strftime(start_date, date_format) + + if end_date: + data['to'] = datetime.strftime(end_date, date_format) + + if grouping: + data['grouping'] = grouping + + return data + def minutes(self, start_date=None, end_date=None, grouping=None): """ Gets a detailed Report of encoded minutes and billable minutes for a @@ -359,17 +374,30 @@ def minutes(self, start_date=None, end_date=None, grouping=None): yesterday) @param grouping: Minute usage for only one report grouping """ - data = {'api_key': self.api_key} - date_format = '%Y-%m-%d' - if start_date: - data['from'] = datetime.strftime(start_date, date_format) - - if end_date: - data['to'] = datetime.strftime(end_date, date_format) - if grouping: - data['grouping'] = grouping + data = self.__format(start_date, end_date) url = self.base_url + '/minutes' return self.get(url, data=data) + def vod(self, start_date=None, end_date=None, grouping=None): + """ Gets a report of VOD Usage """ + data = self.__format(start_date, end_date, grouping) + + url = self.base_url + '/vod' + return self.get(url, data=data) + + def live(self, start_date=None, end_date=None, grouping=None): + """ Gets a report of Live Usage """ + data = self.__format(start_date, end_date, grouping) + + url = self.base_url + '/live' + return self.get(url, data=data) + + def all(self, start_date=None, end_date=None, grouping=None): + """ Gets a report of both VOD and Live Usage """ + data = self.__format(start_date, end_date, grouping) + + url = self.base_url + '/all' + return self.get(url, data=data) + From d8856a6f473f854f251f648174e46bc3fbe6f8bf Mon Sep 17 00:00:00 2001 From: Alex Schworer Date: Wed, 22 May 2013 14:17:48 -0700 Subject: [PATCH 2/3] Add tests for `start_date` and `end_date` Report filtering --- test/fixtures/report_all_date.json | 38 ++++++++++++++++++++++++++++++ test/test_reports.py | 24 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/report_all_date.json diff --git a/test/fixtures/report_all_date.json b/test/fixtures/report_all_date.json new file mode 100644 index 0000000..d374902 --- /dev/null +++ b/test/fixtures/report_all_date.json @@ -0,0 +1,38 @@ +{ + "statistics": { + "vod": [ + { + "encoded_minutes": 5, + "billable_minutes": 0, + "grouping": null, + "collected_on": "2013-05-13" + } + ], + "live": [ + { + "total_billable_hours": 2, + "stream_hours": 1, + "billable_stream_hours": 0, + "encoded_hours": 2, + "grouping": null, + "collected_on": "2013-05-13", + "billable_encoded_hours": 0, + "total_hours": 2 + } + ] + }, + "total": { + "vod": { + "encoded_minutes": 5, + "billable_minutes": 0 + }, + "live": { + "total_billable_hours": 2, + "stream_hours": 1, + "billable_stream_hours": 0, + "encoded_hours": 2, + "billable_encoded_hours": 0, + "total_hours": 2 + } + } +} diff --git a/test/test_reports.py b/test/test_reports.py index 29414d7..6abb7d4 100644 --- a/test/test_reports.py +++ b/test/test_reports.py @@ -4,6 +4,8 @@ from test_util import TEST_API_KEY, load_response from zencoder import Zencoder +import datetime + class TestReports(unittest.TestCase): def setUp(self): self.zen = Zencoder(api_key=TEST_API_KEY) @@ -33,7 +35,7 @@ def test_reports_live(self, get): def test_reports_all(self, get): get.return_value = load_response(200, 'fixtures/report_all.json') - resp = self.zen.report.live() + resp = self.zen.report.all() self.assertEquals(resp.code, 200) @@ -43,6 +45,26 @@ def test_reports_all(self, get): self.assertEquals(resp.body['total']['vod']['billable_minutes'], 8) self.assertEquals(resp.body['statistics']['live']['length'], 2) + @patch("requests.Session.get") + def test_reports_all_date_filter(self, get): + get.return_value = load_response(200, 'fixtures/report_all_date.json') + + start = datetime.date(2013, 5, 13) + end = datetime.date(2013, 5, 13) + resp = self.zen.report.all(start_date=start, end_date=end) + + self.assertEquals(resp.code, 200) + + self.assertEquals(resp.body['statistics']['vod'][0]['encoded_minutes'], 5) + self.assertEquals(resp.body['statistics']['vod'][0]['billable_minutes'], 0) + self.assertEquals(resp.body['statistics']['live'][0]['stream_hours'], 1) + self.assertEquals(resp.body['statistics']['live'][0]['total_hours'], 2) + + self.assertEquals(resp.body['total']['vod']['encoded_minutes'], 5) + self.assertEquals(resp.body['total']['vod']['billable_minutes'], 0) + self.assertEquals(resp.body['total']['live']['stream_hours'], 1) + self.assertEquals(resp.body['total']['live']['total_hours'], 2) + if __name__ == "__main__": unittest.main() From 92a2af83b12e97d0b5431fcfd41e795bc0db1e95 Mon Sep 17 00:00:00 2001 From: Alex Schworer Date: Wed, 22 May 2013 14:27:56 -0700 Subject: [PATCH 3/3] use `date.strftime` instead of `datetime.strftime` --- zencoder/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zencoder/core.py b/zencoder/core.py index 120c2c4..a1bfd36 100644 --- a/zencoder/core.py +++ b/zencoder/core.py @@ -345,10 +345,10 @@ def __format(self, start_date=None, end_date=None, grouping=None): date_format = '%Y-%m-%d' if start_date: - data['from'] = datetime.strftime(start_date, date_format) + data['from'] = start_date.strftime(date_format) if end_date: - data['to'] = datetime.strftime(end_date, date_format) + data['to'] = end_date.strftime(date_format) if grouping: data['grouping'] = grouping