def test_valid_json(self) -> None: # Arrange package = "pip" mocked_url = "https://pypistats.org/api/packages/pip/recent?&period=day" mocked_response = """ {"data": {"last_day": 1956060}, "package": "pip", "type": "recent_downloads"} """ # Act respx.get(mocked_url).respond(content=mocked_response) output = pypistats.recent(package, period="day", format="json") # Assert # Should not raise any errors eg. TypeError json.loads(output) assert json.loads(output) == json.loads(mocked_response)
def test_recent_tabular(self, test_format, expected_output) -> None: # Arrange package = "pip" mocked_url = "https://pypistats.org/api/packages/pip/recent" mocked_response = """{ "data": {"last_day": 2295765, "last_month": 67759913, "last_week": 15706750}, "package": "pip", "type": "recent_downloads" }""" # Act respx.get(mocked_url).respond(content=mocked_response) output = pypistats.recent(package, format=test_format) # Assert assert output.strip() == expected_output.strip()
def test_valid_json(self): # Arrange package = "pip" mocked_url = "https://pypistats.org/api/packages/pip/recent?&period=day" mocked_response = """ {"data": {"last_day": 1956060}, "package": "pip", "type": "recent_downloads"} """ # Act with requests_mock.Mocker() as m: m.get(mocked_url, text=mocked_response) output = pypistats.recent(package, period="day", format="json") # Assert # Should not raise any errors eg. TypeError json.loads(output) self.assertEqual(json.loads(output), json.loads(mocked_response))
def main(): parser = argparse.ArgumentParser() parser.add_argument('--packages', nargs='+', required=True) parsed = parser.parse_args() metrics = [] for package in parsed.packages: pypi_data = json.loads(pypistats.recent(package, format='json'))['data'] metrics.append(make_metric(package, 'last_day', pypi_data['last_day'])) metrics.append( make_metric(package, 'last_week', pypi_data['last_week'])) metrics.append( make_metric(package, 'last_month', pypi_data['last_month'])) overall_data = json.loads(pypistats.overall(package, format='json'))['data'] total_downloads = sum(val['downloads'] for val in overall_data) metrics.append(make_metric(package, 'all_time', total_downloads)) print(json.dumps(metrics))
def test_recent_tabular(self): # Arrange package = "pip" mocked_url = "https://pypistats.org/api/packages/pip/recent" mocked_response = """{ "data": {"last_day": 2295765, "last_month": 67759913, "last_week": 15706750}, "package": "pip", "type": "recent_downloads" }""" expected_output = """ | last_day | last_month | last_week | | --------: | ---------: | ---------: | | 2,295,765 | 67,759,913 | 15,706,750 | """ # Act respx.get(mocked_url).respond(content=mocked_response) output = pypistats.recent(package) # Assert assert output.strip() == expected_output.strip()
def test_recent_tabular(self): # Arrange package = "pip" mocked_url = "https://pypistats.org/api/packages/pip/recent" mocked_response = """{ "data": {"last_day": 2295765, "last_month": 67759913, "last_week": 15706750}, "package": "pip", "type": "recent_downloads" }""" expected_output = """ | last_day | last_month | last_week | |----------:|-----------:|-----------:| | 2,295,765 | 67,759,913 | 15,706,750 | """ # Act with requests_mock.Mocker() as m: m.get(mocked_url, text=mocked_response) output = pypistats.recent(package) # Assert self.assertEqual(output.strip(), expected_output.strip())
def get_package_metadata(dependency): """ Retrieve the downloads, categories, and modified date for a package """ version_symbol_index = dependency.rfind('@') name_index = dependency.find('/') + 1 dependency_name = dependency[name_index:version_symbol_index] entry = dict() entry['name'] = dependency result = json.loads( pypistats.recent(dependency_name, "month", format="json")) print(result) entry['downloads_last_month'] = result['data']['last_month'] request_url = f'{PYPI_DEPENDENCY_META_URL}{dependency_name}/{dependency[version_symbol_index+1:]}/json' json_result = requests.get(request_url) print(request_url) print(json_result) return entry
def recent(args): # pragma: no cover print( pypistats.recent( args.package, period=args.period, format=args.format, verbose=args.verbose ) )
import argparse from pprint import pprint # noqa: F401 import pypistats if __name__ == "__main__": parser = argparse.ArgumentParser( description="Example use of pypistats", formatter_class=argparse.ArgumentDefaultsHelpFormatter, ) args = parser.parse_args() # Example use # Call the API print(pypistats.recent("pillow")) # print(pypistats.recent("pillow", "day", format="markdown")) # pprint(pypistats.recent("pillow", "week", format="json")) # print(pypistats.recent("pillow", "month")) # print(pypistats.overall("pillow")) # print(pypistats.overall("pillow", mirrors=True, format="markdown")) # pprint(pypistats.overall("pillow", mirrors=False, format="json")) # print(pypistats.python_major("pillow")) # print(pypistats.python_major("pillow", version=2, format="markdown")) # pprint(pypistats.python_major("pillow", version="3", format="json")) # print(pypistats.python_minor("pillow")) # print(pypistats.python_minor("pillow", version=2.7, format="markdown")) # pprint(pypistats.python_minor("pillow", version="3.7", format="json"))
def recent(args: argparse.Namespace) -> None: # pragma: no cover print( pypistats.recent(args.package, period=args.period, format=args.format, verbose=args.verbose))