Skip to content

Commit b9386db

Browse files
authored
Merge pull request #5 from bytesview/csv_update
added feature to save csv file
2 parents 0aec05e + a8a30da commit b9386db

4 files changed

Lines changed: 54 additions & 6 deletions

File tree

newsdataapi/helpers.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import time
1+
import time,os,csv
22

33
def get(request_method, URL, URL_parameters_encoded, proxies, request_timeout):
44
if proxies is None:
@@ -13,4 +13,44 @@ def MaxRetries(response, max_retries, retry_delay, request_method, URL, URL_para
1313
if response.status_code!=500:
1414
break
1515
max_retries-=1
16-
return response
16+
return response
17+
18+
19+
class FileHandler:
20+
21+
def __init__(self,folder_path:str=None) -> None:
22+
self.folder_path = folder_path
23+
24+
def generate_csv_file(self,collected_data:list,full_filepath:str):
25+
with open(full_filepath,'w',newline='', encoding='utf-8') as csv_file:
26+
writer = csv.DictWriter(csv_file,fieldnames=list(collected_data[0].keys()))
27+
writer.writeheader()
28+
writer.writerows(collected_data)
29+
30+
31+
def save_to_csv(self, response: dict, folder_path: str=None, filename: str=None)->str:
32+
folder_path = folder_path or self.folder_path
33+
filename = filename or str(time.time_ns())
34+
35+
if not folder_path or not os.path.exists(folder_path):
36+
raise FileNotFoundError(f'Provided folder path not found: {folder_path}')
37+
38+
filename = f'{filename}.csv' if not filename.endswith('.csv') else filename
39+
full_path = os.path.join(folder_path, filename)
40+
41+
if os.path.exists(full_path):
42+
raise FileExistsError(f'Provided file already exists: {filename} in folder: {folder_path}')
43+
44+
results = response.get('results', [])
45+
46+
for result in results:
47+
for k, v in result.items():
48+
if isinstance(v, dict):
49+
result[k] = ','.join(f'{i}:{j}' for i, j in v.items())
50+
elif isinstance(v, list):
51+
result[k] = ','.join(map(str, v))
52+
53+
self.generate_csv_file(results, full_path)
54+
55+
return full_path
56+

newsdataapi/newsdataapi_client.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44
from typing import Optional,Union
55
from datetime import datetime,timezone
66
from urllib.parse import urlencode, quote
7+
from newsdataapi.helpers import FileHandler
78
from requests.exceptions import RequestException
89
from newsdataapi.newsdataapi_exception import NewsdataException
910

10-
class NewsDataApiClient:
11+
class NewsDataApiClient(FileHandler):
1112

1213
def __init__(
1314
self, apikey:str, session:bool= False, max_retries:int= constants.DEFAULT_MAX_RETRIES, retry_delay:int= constants.DEFAULT_RETRY_DELAY,
14-
proxies:Optional[dict]=None, request_timeout:int= constants.DEFAULT_REQUEST_TIMEOUT,max_result:int=10**10, debug:Optional[bool]=False
15+
proxies:Optional[dict]=None, request_timeout:int= constants.DEFAULT_REQUEST_TIMEOUT,max_result:int=10**10, debug:Optional[bool]=False,
16+
folder_path:str=None
1517
):
1618
"""Initializes newsdata client object for access Newsdata APIs."""
1719
self.apikey = apikey
@@ -22,6 +24,7 @@ def __init__(
2224
self.proxies = proxies
2325
self.request_timeout = request_timeout
2426
self.is_debug = debug
27+
super().__init__(folder_path=folder_path)
2528

2629
def set_retries( self, max_retries:int, retry_delay:int)->None:
2730
""" API maximum retry and delay"""
@@ -160,7 +163,7 @@ def news_api(
160163
Sending GET request to the news api.
161164
For more information about parameters and input, Please visit our documentation page: https://newsdata.io/documentation
162165
"""
163-
warn('This method is deprecated and will be removed in upcomming updates, Instead use latest_api()', DeprecationWarning, stacklevel=2)
166+
warn('This method is deprecated and will be removed in upcoming updates, Instead use latest_api()', DeprecationWarning, stacklevel=2)
164167
params = {
165168
'apikey':self.apikey,'q':q,'qInTitle':qInTitle,'country':country,'category':category,'language':language,'domain':domain,'timeframe':str(timeframe) if timeframe else timeframe,
166169
'size':size,'domainurl':domainurl,'excludedomain':excludedomain,'timezone':timezone,'full_content':full_content,'image':image,'video':video,'prioritydomain':prioritydomain,

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
setup(
88
name='newsdataapi',
9-
version='0.1.17',
9+
version='0.1.18',
1010
packages=['newsdataapi'],
1111
description='Python library for newsdata client-API Call',
1212
long_description=long_description,

tests/test_newsdataapi.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ def test_news_api(self):
1212

1313
self.assertEqual(response['status'], "success")
1414

15+
def test_latest_api(self):
16+
response = self.api.latest_api()
17+
18+
self.assertEqual(response['status'], "success")
19+
1520
def test_archive_api(self):
1621
response = self.api.archive_api(q='test')
1722

0 commit comments

Comments
 (0)