Skip to content

Commit 0acac11

Browse files
authored
Merge pull request #1 from maxhoheiser/feature/dockerHubImageStats
2 parents f609440 + 853fc48 commit 0acac11

File tree

6 files changed

+87
-0
lines changed

6 files changed

+87
-0
lines changed

src/__init__.py

Whitespace-only changes.

src/dockerHubStats/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import logging
2+
from typing import Tuple
3+
4+
import requests
5+
6+
logger = logging.getLogger(__name__)
7+
8+
9+
class DockerHubService:
10+
"""
11+
Handles read and write DockerHub API operations
12+
"""
13+
14+
def __init__(self, user_name: str, image_name: str) -> None:
15+
self.user_name = user_name
16+
self.image_name = image_name
17+
18+
def get_dockerhub_image_stats(self) -> Tuple[int, int]:
19+
api_url = f"https://hub.docker.com/v2/repositories/{self.user_name}/{self.image_name}/"
20+
21+
try:
22+
response = requests.get(api_url)
23+
except Exception as e:
24+
logger.error(f"Error: Unable to fetch data. Exception: {e}")
25+
raise
26+
27+
if response.status_code == 200:
28+
image_data = response.json()
29+
pull_count = image_data["pull_count"]
30+
star_count = image_data["star_count"]
31+
return pull_count, star_count
32+
else:
33+
logger.error(
34+
f"Error: Unable to fetch data. Status Code: {response.status_code}"
35+
)
36+
raise
37+
38+
39+
if __name__ == "__main__":
40+
user_name = "localstack"
41+
image_name = "localstack"
42+
43+
LocalStackDockerHubService = DockerHubService(user_name, image_name)
44+
pull_count, star_count = LocalStackDockerHubService.get_dockerhub_image_stats()
45+
46+
if pull_count is not None and star_count is not None:
47+
print(f"Pull Count: {pull_count}")
48+
print(f"Star Count: {star_count}")

tests/__init__.py

Whitespace-only changes.

tests/unit/__init__.py

Whitespace-only changes.
+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import unittest
2+
from typing import Any, Dict
3+
from unittest.mock import MagicMock, patch
4+
5+
from src.dockerHubStats.dockerHubStatsService import DockerHubService
6+
7+
USER_NAME: str = "localstack"
8+
IMAGE_NAME: str = "localstack"
9+
10+
11+
class TestDockerHubService(unittest.TestCase):
12+
def setUp(self) -> None:
13+
self.user_name: str = USER_NAME
14+
self.image_name: str = IMAGE_NAME
15+
self.service: DockerHubService = DockerHubService(
16+
self.user_name, self.image_name
17+
)
18+
19+
@patch("src.dockerHubStats.dockerHubStatsService.requests.get")
20+
def test_get_dockerhub_image_stats_success(self, mock_get: MagicMock) -> None:
21+
mock_response: Dict[str, Any] = {"pull_count": 100, "star_count": 50}
22+
mock_get.return_value.status_code = 200
23+
mock_get.return_value.json.return_value = mock_response
24+
25+
pull_count, star_count = self.service.get_dockerhub_image_stats()
26+
27+
self.assertEqual(pull_count, 100)
28+
self.assertEqual(star_count, 50)
29+
30+
@patch("src.dockerHubStats.dockerHubStatsService.requests.get")
31+
def test_get_dockerhub_image_stats_error(self, mock_get: MagicMock) -> None:
32+
mock_get.return_value.status_code = 404
33+
34+
with self.assertRaises(Exception):
35+
self.service.get_dockerhub_image_stats()
36+
37+
38+
if __name__ == "__main__":
39+
unittest.main()

0 commit comments

Comments
 (0)