1- import requests
21import datetime
2+ import requests
33from dateutil import parser
4- from currentsapi .authentication import ApiAuth
5- from currentsapi import constants
64
7- class APIException (Exception ):
5+ from currentsapi import constants
6+ from currentsapi .authentication import ApiAuth
87
9- def __init__ (self , exception ):
10- self .exception = exception
118
12- def get_exception ( self ):
13- return self . exception
9+ class CurrentsAPIError ( Exception ):
10+ """Raised when the Currents API returns an error response."""
1411
15- def get_status (self ):
16- if self .exception [ "status" ]:
17- return self . exception [ "status" ]
12+ def __init__ (self , response ):
13+ self .response = response
14+ super (). __init__ ( str ( response ))
1815
19- def get_code ( self ):
20- if self . exception [ "code" ] :
21- return self .exception [ "code" ]
16+ @ property
17+ def status ( self ) :
18+ return self .response . get ( "status" )
2219
23- def get_message ( self ):
24- if self . exception [ "message" ] :
25- return self .exception [ "message" ]
20+ @ property
21+ def code ( self ) :
22+ return self .response . get ( "code" )
2623
24+ @property
25+ def message (self ):
26+ return self .response .get ("message" )
2727
28- class CurrentsAPI ():
2928
30- def __init__ (self , api_key ,
31- domain = constants .DOMAIN , version = constants .VERSION , timeout = 30 ):
29+ class CurrentsAPI :
30+ def __init__ (
31+ self ,
32+ api_key ,
33+ domain = constants .DOMAIN ,
34+ version = constants .VERSION ,
35+ timeout = 30 ,
36+ ):
3237 if not isinstance (api_key , str ):
33- raise ValueError (' api_key must be string' )
38+ raise ValueError (" api_key must be a string" )
3439 self .api_key = ApiAuth (api_key )
3540 self .latest_endpoint = constants .LATEST_NEWS_URL % (domain , version )
3641 self .search_endpoint = constants .SEARCH_URL % (domain , version )
42+ self .available_languages_endpoint = constants .AVAILABLE_LANGUAGES_URL % (domain , version )
43+ self .available_regions_endpoint = constants .AVAILABLE_REGIONS_URL % (domain , version )
44+ self .available_category_endpoint = constants .AVAILABLE_CATEGORIES_URL % (domain , version )
3745 self .timeout = timeout
3846
39- def latest_news (self ):
40- r = requests .get (self .latest_endpoint , auth = self .api_key , timeout = self .timeout )
47+ def _get (self , endpoint , params = None ):
48+ r = requests .get (
49+ endpoint ,
50+ auth = self .api_key ,
51+ timeout = self .timeout ,
52+ params = params or {},
53+ )
4154 if r .status_code != requests .codes .ok :
42- raise APIException (r .json ())
55+ raise CurrentsAPIError (r .json ())
4356 return r .json ()
44-
4557
46- def search (self , country = None , language = None , keywords = None , category = None ,
47- page_number = None , limit = None , start_date = None , end_date = None , has_image = None , has_description = None ):
48- payload = {}
58+ def latest_news (self , language = None ):
59+ params = {}
60+ if language :
61+ if not isinstance (language , str ):
62+ raise ValueError ("language must be a string" )
63+ params ["language" ] = language
64+ return self ._get (self .latest_endpoint , params )
65+
66+ def search (
67+ self ,
68+ language = None ,
69+ keywords = None ,
70+ country = None ,
71+ category = None ,
72+ start_date = None ,
73+ end_date = None ,
74+ ):
75+ params = {}
4976
5077 if keywords :
5178 if not isinstance (keywords , str ):
52- raise ValueError ('keywords should be string' )
53- payload ['keywords' ] = keywords
54-
79+ raise ValueError ("keywords must be a string" )
80+ params ["keywords" ] = keywords
5581
5682 if country :
5783 if not isinstance (country , str ):
58- raise ValueError (' country should be string' )
59- payload [ ' country' ] = country
84+ raise ValueError (" country must be a string" )
85+ params [ " country" ] = country
6086
6187 if language :
6288 if not isinstance (language , str ):
63- raise ValueError (' language should be string' )
64- payload [ ' language' ] = language
89+ raise ValueError (" language must be a string" )
90+ params [ " language" ] = language
6591
6692 if category :
67- if not isinstance (category , str ) and not isinstance (category , list ):
68- raise ValueError ('category should be string' )
69- if isinstance (category , list ):
70- payload ['category' ] = ',' .join (category )
71- else :
72- payload ['category' ] = category
73-
74- if page_number :
75- if not int (page_number ) == page_number :
76- raise ValueError ('page_number should be integer' )
77- payload ['page_number' ] = page_number
78-
79- if limit :
80- if not int (limit ) == limit :
81- raise ValueError ('limit should be integer' )
82- payload ['limit' ] = limit
83-
93+ if not isinstance (category , str ):
94+ raise ValueError ("category must be a string" )
95+ params ["category" ] = category
8496
8597 if start_date :
86- if isinstance (start_date , str ):
87- date = parser (start_date )
88- elif isinstance (end_date , datetime .date ):
89- date = end_date
90- else :
91- raise ValueError ('start_date must be string parsable by dateutil or datetime object' )
92- payload ['start_date' ] = date .strftime ('%Y-%m-%dT%H:%M:%SZ' )
98+ date = self ._parse_date (start_date , "start_date" )
99+ params ["start_date" ] = date .strftime ("%Y-%m-%dT%H:%M:%SZ" )
93100
94101 if end_date :
95- if isinstance (end_date , str ):
96- date = parser (end_date )
97- elif isinstance (end_date , datetime .date ):
98- date = end_date
99- else :
100- raise ValueError ('end_date must be string parsable by dateutil or datetime object' )
101- payload ['end_date' ] = date .strftime ('%Y-%m-%dT%H:%M:%SZ' )
102-
103- if has_image :
104- payload ['has_image' ] = 'true' if has_image else 'false'
105-
106- if has_description :
107- payload ['has_description' ] = 'true' if has_description else 'false'
108- r = requests .get (self .search_endpoint , auth = self .api_key ,
109- timeout = self .timeout ,
110- params = payload )
111-
112- if r .status_code != requests .codes .ok :
113- raise APIException (r .json ())
114-
115- return r .json ()
102+ date = self ._parse_date (end_date , "end_date" )
103+ params ["end_date" ] = date .strftime ("%Y-%m-%dT%H:%M:%SZ" )
104+
105+ return self ._get (self .search_endpoint , params )
106+
107+ def available_languages (self ):
108+ return self ._get (self .available_languages_endpoint )
109+
110+ def available_regions (self ):
111+ return self ._get (self .available_regions_endpoint )
112+
113+ def available_category (self ):
114+ return self ._get (self .available_category_endpoint )
115+
116+ @staticmethod
117+ def _parse_date (date_value , param_name ):
118+ if isinstance (date_value , str ):
119+ return parser .parse (date_value )
120+ elif isinstance (date_value , datetime .date ):
121+ return date_value
122+ else :
123+ raise ValueError (
124+ "{} must be a string parsable by dateutil or a datetime/date object" .format (
125+ param_name
126+ )
127+ )
0 commit comments