class ValidatorTests(unittest.TestCase): def setUp(self): self.validator = Validator() def test_language_validator_sanity(self): self.assertTrue(self.validator.language_validator("CSS")) def test_language_validator_sanity_test_invalid_input(self): self.assertFalse(self.validator.language_validator("abcd454")) expected = {'error_code': 1, 'error': "invalid language"} extracted = self.validator.get_error() self.assertEqual(expected, extracted) def test_creation_date_sanity(self): self.assertTrue(self.validator.creation_date_validator("past-week")) def test_creation_date_sanity_test_invalid_input(self): self.assertFalse(self.validator.creation_date_validator("abcd454")) expected = {'error_code': 2, 'error': "invalid creation date"} extracted = self.validator.get_error() self.assertEqual(expected, extracted)
class GithubApiView(View): """ The main API handler (Works for HTTP GET). """ methods = ['GET'] DATE_FORMAT = '%Y-%m-%d' MAX_RESULTS = 10 def __init__(self): self.validator = Validator() def dispatch_request(self): """ Validates & Parses user input, then queries github API and returns either an object (or an error object, if any). """ language = request.args.get('language') or 'Any' creation_date = request.args.get('created') if not self.validator.validate(language, creation_date): return json.dumps(self.validator.get_error()) query = 'language:{0}+created:{1}'.format(language, self._parse_creation_date(creation_date)) repositories = requests.get(GITHUB_API_URL.format(query=query)).json()['items'][:self.MAX_RESULTS] results = [self._build_repository_object(r) for r in repositories] return json.dumps({'error_code': 0, 'error': None, 'results': results}) def _parse_creation_date(self, creation_date): now = datetime.datetime.now() date = {'past-week': '>=' + (now - relativedelta(weeks=1)).strftime(self.DATE_FORMAT), 'past-month': '>=' + (now - relativedelta(months=1)).strftime(self.DATE_FORMAT), 'past-year': '>=' + (now - relativedelta(years=1)).strftime(self.DATE_FORMAT), None: '<=' + now.strftime(self.DATE_FORMAT)} return date[creation_date] @staticmethod def _build_repository_object(repository): return {'id': repository['id'], 'full_name': repository['full_name'], 'html_url': repository['html_url'], 'description': repository['description'], 'private': repository['private'], 'created_at': repository['created_at'], 'updated_at': repository['updated_at'], 'clone_url': repository['clone_url'], 'size': repository['size'], 'stargazers_count': repository['stargazers_count'], 'language': repository['language'], 'forks_count': repository['forks_count']}