Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
kbambz committed Feb 24, 2022
1 parent bdc196f commit 5297a34
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 30 deletions.
4 changes: 3 additions & 1 deletion gsheets_fetch/__init__.py
Expand Up @@ -2,11 +2,13 @@

from .exporters import CsvGSheetsExporter
from .exporters import JsonGSheetsExporter
from .exporters import TsvGSheetsExporter
from .exporters import TxtGSheetsExporter

__all__ = [
'GSheets',
'CsvGSheetsExporter',
'JsonGSheetsExporter',
'TxtGSheetsExporter'
'TsvGSheetsExporter',
'TxtGSheetsExporter',
]
15 changes: 14 additions & 1 deletion gsheets_fetch/client.py
Expand Up @@ -46,7 +46,7 @@ def get_metadata(self, spreadsheet_id=None, **kwargs):
fields='properties.title,sheets(properties.title,properties.sheetId)'
).execute()

metadata.setdefault('url', 'https://docs.google.com/spreadsheets/d/{}'.format(spreadsheet_id))
metadata.setdefault('url', f'https://docs.google.com/spreadsheets/d/{spreadsheet_id}')
if 'sheets' in metadata:
metadata['sheets'] = self._filter_sheets(metadata['sheets'], **kwargs)

Expand Down Expand Up @@ -112,6 +112,19 @@ def _get_credentials(client_secrets='credentials.json', storage='token.pickle',
def _get_service(credentials):
return build_service('sheets', 'v4', credentials=credentials)

def __del__(self):
self.cleanup()

def cleanup(self):
# Temp workaround to https://github.com/googleapis/google-api-python-client/issues/618
self._service._http.http.close()

def __enter__(self):
return self

def __exit__(self, type, value, traceback):
self.cleanup()


class Filter(object):

Expand Down
25 changes: 12 additions & 13 deletions gsheets_fetch/scripts/fetch.py
Expand Up @@ -59,17 +59,16 @@ def fetch(spreadsheet_id, client_secrets_filename=None, storage_filename=None,
dirpath=None, filename_template=None, exporter_cls=None,
show_info=False, quiet=False, **kwargs):

gs = GSheets(spreadsheet_id=spreadsheet_id,
with GSheets(spreadsheet_id=spreadsheet_id,
client_secrets=client_secrets_filename,
storage=storage_filename)

if show_info:
metadata = gs.get_metadata(**kwargs)
json_metadata = json.dumps(metadata)
print(json_metadata)
else:
exporter_cls = exporter_cls or CsvGSheetsExporter
exporter = exporter_cls(dirpath=dirpath, filename_template=filename_template)
for filename in exporter.export(gs, **kwargs):
if not quiet:
print(filename)
storage=storage_filename) as gs:
if show_info:
metadata = gs.get_metadata(**kwargs)
json_metadata = json.dumps(metadata)
print(json_metadata)
else:
exporter_cls = exporter_cls or CsvGSheetsExporter
exporter = exporter_cls(dirpath=dirpath, filename_template=filename_template)
for filename in exporter.export(gs, **kwargs):
if not quiet:
print(filename)
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -4,7 +4,7 @@
setup(
name='gsheets_fetch',
description='Download sheets from Google Sheets as CSV, plain text, or JSON files.',
version='0.0.3',
version='0.0.4',
url='https://github.com/kbambz/gsheets-fetch',
author='Kathryn Bambino',
author_email='katie.bambino@gmail.com',
Expand Down
62 changes: 48 additions & 14 deletions test.py
Expand Up @@ -2,24 +2,58 @@
import os.path

from gsheets_fetch.scripts import fetch
from gsheets_fetch import TxtGSheetsExporter


class TestFetch(unittest.TestCase):

def test_fetch_sheet(self):
target_file = 'GSheets Fetch Test - Data1.csv'

if os.path.isfile(target_file):
os.remove(target_file)

spreadsheet_id = '1oJVL8pxdUvbdtD39NASTctzljX-wosUb4nKZhyFYBCs'
fetch(spreadsheet_id,
dirpath='.', filename_template=None, exporter_cls=None,
client_secrets_filename='credentials.json', storage_filename='token.pickle',
show_info=False, quiet=True)

self.assertTrue(os.path.isfile(target_file))
os.remove(target_file)
@property
def target_file(self):
if hasattr(self, '_target_file'):
return self._target_file
else:
return None

@target_file.setter
def target_file(self, value):
if value:
value = os.path.join('tmp', value)
if os.path.isfile(value):
os.remove(value)
self._target_file = value

@classmethod
def setUpClass(cls):
try:
os.mkdir('tmp')
except FileExistsError:
pass

@classmethod
def tearDownClass(cls):
os.rmdir('tmp')

def setUp(self):
self.spreadsheet_id = '1oJVL8pxdUvbdtD39NASTctzljX-wosUb4nKZhyFYBCs'
self.default_kwargs = dict(dirpath='tmp',
client_secrets_filename='credentials.json',
storage_filename='token.pickle',
show_info=False,
quiet=True)

def tearDown(self):
if self.target_file:
os.remove(self.target_file)

def test_fetch_sheet_csv(self):
self.target_file = 'GSheets Fetch Test - Data1.csv'
fetch(self.spreadsheet_id, **self.default_kwargs)
self.assertTrue(os.path.isfile(self.target_file))

def test_fetch_sheet_text(self):
self.target_file = 'GSheets Fetch Test - Data1.txt'
fetch(self.spreadsheet_id, exporter_cls=TxtGSheetsExporter, **self.default_kwargs)
self.assertTrue(os.path.isfile(self.target_file))


if __name__ == '__main__':
Expand Down

0 comments on commit 5297a34

Please sign in to comment.