Coverage for mindsdb / integrations / handlers / pypi_handler / api.py: 0%
65 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-21 00:36 +0000
1from os import path
2from typing import Collection, Dict
4import numpy as np
5import pandas as pd
6import requests
8SERVICE_URL = r"https://pypistats.org"
9API_BASE_URL = path.join(SERVICE_URL, "api/packages/")
12class PyPI:
13 def __init__(self, name: str, limit: int = None) -> None:
14 """initializer method
16 Args:
17 name(str): package name
18 """
19 self.name: str = name
20 self.limit = limit
21 self.endpoint: str = path.join(API_BASE_URL, name)
23 def recent(self, period: str = None) -> pd.DataFrame:
24 """recent endpoint
26 Args:
27 period (str, optional): the desired `day` or `week` or `month` period. Defaults to None.
29 Returns:
30 pd.DataFrame: pandas dataframe
31 """
32 endpoint: str = path.join(self.endpoint, "recent")
33 params: Dict = {}
35 if period:
36 params["period"] = period
38 payload = requests.get(endpoint, params=params).json()["data"]
40 df = self.__to_dataframe(payload, [0])
42 return df
44 def overall(self, mirrors: bool = None) -> pd.DataFrame:
45 """overall endpoint
47 Args:
48 mirrors (bool, optional): filter by mirrors. Defaults to None.
50 Returns:
51 pd.DataFrame: pandas dataframe
52 """
53 endpoint: str = path.join(self.endpoint, "overall")
54 params: Dict = {}
56 if mirrors is not None:
57 params["mirrors"] = str(mirrors).lower()
59 payload = requests.get(endpoint, params=params).json()["data"]
60 df = self.__to_dataframe(payload, limit=self.limit)
62 return df
64 def python_major(self, version: str = None) -> pd.DataFrame:
65 """python major endpoint
67 Args:
68 version (str, optional): filter by the major version number. Defaults to None.
70 Returns:
71 pd.DataFrame: pandas dataframe
72 """
73 endpoint: str = path.join(self.endpoint, "python_major")
74 params: Dict = {}
76 if version is not None:
77 params["version"] = version
79 payload = requests.get(endpoint, params=params).json()["data"]
80 df = self.__to_dataframe(payload, limit=self.limit)
82 return df
84 def python_minor(self, version: str = None) -> pd.DataFrame:
85 """python minor endpoint
87 Args:
88 version (str, optional): filter by the minor.patch version number. Defaults to None.
90 Returns:
91 pd.DataFrame: pandas dataframe
92 """
93 endpoint: str = path.join(self.endpoint, "python_minor")
94 params: Dict = {}
96 if version is not None:
97 params["version"] = version
99 payload = requests.get(endpoint, params=params).json()["data"]
100 df = self.__to_dataframe(payload, limit=self.limit)
102 return df
104 def system(self, os: str = None) -> pd.DataFrame:
105 """system endpoint
107 Args:
108 os (str, optional): filter by the operating system. Defaults to None.
110 Returns:
111 pd.DataFrame: pandas dataframe
112 """
113 endpoint: str = path.join(self.endpoint, "system")
114 params: Dict = {}
116 if os is not None:
117 params["os"] = os
119 payload = requests.get(endpoint, params=params).json()["data"]
120 df = self.__to_dataframe(payload, limit=self.limit)
122 return df
124 @staticmethod
125 def __to_dataframe(
126 json_data: Dict,
127 index: Collection = None,
128 limit: int = 20,
129 ) -> pd.DataFrame:
130 """_summary_
132 Args:
133 json_data (Dict): data
134 index (Collection, optional): desired index. Defaults to None.
135 limit (int, optional): limit the output coming from dataframe. Defaults to 20.
137 Returns:
138 pd.DataFrame: _description_
139 """
140 df = pd.DataFrame(json_data, index=index)
141 df.replace("null", np.nan, inplace=True)
142 df = df.dropna()
144 return df.tail(limit)
146 @classmethod
147 def is_connected(cls) -> Dict:
148 try:
149 _ = requests.get(SERVICE_URL, timeout=5).raise_for_status()
150 return {"status": True}
151 except requests.exceptions.RequestException as e:
152 return {"status": False, "message": e}