Skip to content

Commit efcf49c

Browse files
authored
Sheet writer interface (#87)
* 🔥 code reuse * 🎉 update available plugins * 🐛 update missing file * 💚 update test cases * ✨ outline the plugin sheet writer interface. well, break the old interface * 🚜 break the old interface * 🔥 remove useless metaphor
1 parent 27ba606 commit efcf49c

File tree

5 files changed

+59
-73
lines changed

5 files changed

+59
-73
lines changed

pyexcel_io/database/importers/django.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,17 @@
1010
import logging
1111

1212
import pyexcel_io.constants as constants
13-
from pyexcel_io.sheet import SheetWriter
1413
from pyexcel_io.utils import is_empty_array, swap_empty_string_for_none
14+
from pyexcel_io.plugin_api.abstract_sheet import ISheetWriter
1515
from pyexcel_io.plugin_api.abstract_writer import IWriter
1616

1717
log = logging.getLogger(__name__)
1818

1919

20-
class DjangoModelWriter(SheetWriter):
20+
class DjangoModelWriter(ISheetWriter):
2121
""" import data into a django model """
2222

2323
def __init__(self, importer, adapter, batch_size=None, bulk_save=True):
24-
SheetWriter.__init__(self, importer, adapter, adapter.name)
2524
self.__batch_size = batch_size
2625
self.__model = adapter.model
2726
self.__column_names = adapter.column_names

pyexcel_io/database/importers/sqlalchemy.py

+14-15
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
:license: New BSD License, see LICENSE for more details
99
"""
1010
import pyexcel_io.constants as constants
11-
from pyexcel_io.sheet import SheetWriter
1211
from pyexcel_io.utils import is_empty_array, swap_empty_string_for_none
12+
from pyexcel_io.plugin_api.abstract_sheet import ISheetWriter
1313
from pyexcel_io.plugin_api.abstract_writer import IWriter
1414

1515

@@ -22,18 +22,17 @@ class PyexcelSQLSkipRowException(Exception):
2222
pass
2323

2424

25-
class SQLTableWriter(SheetWriter):
25+
class SQLTableWriter(ISheetWriter):
2626
"""Write to a table"""
2727

2828
def __init__(
2929
self, importer, adapter, auto_commit=True, bulk_size=1000, **keywords
3030
):
31-
SheetWriter.__init__(
32-
self, importer, adapter, adapter.get_name(), **keywords
33-
)
3431
self.__auto_commit = auto_commit
3532
self.__count = 0
3633
self.__bulk_size = bulk_size
34+
self.adapter = adapter
35+
self.importer = importer
3736

3837
def write_row(self, array):
3938
if is_empty_array(array):
@@ -47,29 +46,29 @@ def write_row(self, array):
4746
print(new_array)
4847

4948
def _write_row(self, array):
50-
row = dict(zip(self._native_sheet.column_names, array))
49+
row = dict(zip(self.adapter.column_names, array))
5150
obj = None
52-
if self._native_sheet.row_initializer:
51+
if self.adapter.row_initializer:
5352
# allow initinalizer to return None
5453
# if skipping is needed
55-
obj = self._native_sheet.row_initializer(row)
54+
obj = self.adapter.row_initializer(row)
5655
if obj is None:
57-
obj = self._native_sheet.table()
58-
for name in self._native_sheet.column_names:
59-
if self._native_sheet.column_name_mapping_dict is not None:
60-
key = self._native_sheet.column_name_mapping_dict[name]
56+
obj = self.adapter.table()
57+
for name in self.adapter.column_names:
58+
if self.adapter.column_name_mapping_dict is not None:
59+
key = self.adapter.column_name_mapping_dict[name]
6160
else:
6261
key = name
6362
setattr(obj, key, row[name])
64-
self._native_book.session.add(obj)
63+
self.importer.session.add(obj)
6564
if self.__auto_commit and self.__bulk_size != float("inf"):
6665
self.__count += 1
6766
if self.__count % self.__bulk_size == 0:
68-
self._native_book.session.commit()
67+
self.importer.session.commit()
6968

7069
def close(self):
7170
if self.__auto_commit:
72-
self._native_book.session.commit()
71+
self.importer.session.commit()
7372

7473

7574
class SQLBookWriter(IWriter):

pyexcel_io/plugin_api/abstract_sheet.py

+9
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,12 @@ def to_array(self):
77
my_row.append(element)
88
data.append(my_row)
99
return data
10+
11+
12+
class ISheetWriter(object):
13+
def write_array(self, table):
14+
"""
15+
For standalone usage, write an array
16+
"""
17+
for row in table:
18+
self.write_row(row)

pyexcel_io/writers/csv_sheet.py

+26-47
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
import csv
1111

1212
import pyexcel_io.constants as constants
13-
from pyexcel_io.sheet import SheetWriter
13+
from pyexcel_io.plugin_api.abstract_sheet import ISheetWriter
1414

1515

16-
class CSVSheetWriter(SheetWriter):
16+
class CSVFileWriter(ISheetWriter):
1717
"""
1818
csv file writer
1919
@@ -30,85 +30,64 @@ def __init__(
3030
):
3131
self._encoding = encoding
3232
self._sheet_name = name
33+
if self._sheet_name is None or single_sheet_in_book:
34+
self._sheet_name = constants.DEFAULT_SHEET_NAME
3335
self._single_sheet_in_book = single_sheet_in_book
3436
self.__line_terminator = constants.DEFAULT_CSV_NEWLINE
37+
self._keywords = keywords
3538
if constants.KEYWORD_LINE_TERMINATOR in keywords:
3639
self.__line_terminator = keywords.get(
3740
constants.KEYWORD_LINE_TERMINATOR
3841
)
39-
if single_sheet_in_book:
40-
self._sheet_name = None
4142
self._sheet_index = sheet_index
42-
self.writer = None
4343
self.file_handle = None
44-
SheetWriter.__init__(
45-
self, filename, self._sheet_name, self._sheet_name, **keywords
46-
)
47-
48-
def write_row(self, array):
49-
"""
50-
write a row into the file
51-
"""
52-
self.writer.writerow(array)
53-
44+
self._native_book = filename
5445

55-
class CSVFileWriter(CSVSheetWriter):
56-
""" Write csv to a physical file """
46+
self.writer = self.get_writer()
5747

58-
def close(self):
59-
self.file_handle.close()
60-
61-
def set_sheet_name(self, name):
62-
if name != constants.DEFAULT_SHEET_NAME:
48+
def get_writer(self):
49+
if self._sheet_name != constants.DEFAULT_SHEET_NAME:
6350
names = self._native_book.split(".")
6451
file_name = "%s%s%s%s%s.%s" % (
6552
names[0],
6653
constants.DEFAULT_MULTI_CSV_SEPARATOR,
67-
name, # sheet name
54+
self._sheet_name, # sheet name
6855
constants.DEFAULT_MULTI_CSV_SEPARATOR,
6956
self._sheet_index, # sheet index
7057
names[1],
7158
)
7259
else:
7360
file_name = self._native_book
61+
7462
self.file_handle = open(
7563
file_name, "w", newline="", encoding=self._encoding
7664
)
77-
self.writer = csv.writer(self.file_handle, **self._keywords)
65+
return csv.writer(self.file_handle, **self._keywords)
66+
67+
def write_row(self, array):
68+
"""
69+
write a row into the file
70+
"""
71+
self.writer.writerow(array)
7872

73+
def close(self):
74+
self.file_handle.close()
7975

80-
class CSVMemoryWriter(CSVSheetWriter):
81-
""" Write csv to a memory stream """
8276

83-
def __init__(
84-
self,
85-
filename,
86-
name,
87-
encoding="utf-8",
88-
single_sheet_in_book=False,
89-
sheet_index=None,
90-
**keywords
91-
):
92-
CSVSheetWriter.__init__(
93-
self,
94-
filename,
95-
name,
96-
encoding=encoding,
97-
single_sheet_in_book=single_sheet_in_book,
98-
sheet_index=sheet_index,
99-
**keywords
100-
)
77+
class CSVMemoryWriter(CSVFileWriter):
78+
""" Write csv to a memory stream """
10179

102-
def set_sheet_name(self, name):
80+
def get_writer(self):
10381
self.file_handle = self._native_book
104-
self.writer = csv.writer(self.file_handle, **self._keywords)
82+
writer = csv.writer(self.file_handle, **self._keywords)
10583
if not self._single_sheet_in_book:
106-
self.writer.writerow(
84+
writer.writerow(
10785
[
10886
constants.DEFAULT_CSV_STREAM_FILE_FORMATTER
10987
% (self._sheet_name, "")
11088
]
11189
)
90+
return writer
11291

11392
def close(self):
11493
if self._single_sheet_in_book:

pyexcel_io/writers/csvz_sheet.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,26 @@
77
:copyright: (c) 2014-2020 by Onni Software Ltd.
88
:license: New BSD License, see LICENSE for more details
99
"""
10+
import csv
11+
1012
from pyexcel_io._compact import StringIO
11-
from pyexcel_io.writers.csv_sheet import CSVSheetWriter
13+
from pyexcel_io.writers.csv_sheet import CSVFileWriter
1214

1315

14-
class CSVZipSheetWriter(CSVSheetWriter):
16+
class CSVZipSheetWriter(CSVFileWriter):
1517
""" handle the zipfile interface """
1618

1719
def __init__(self, zipfile, sheetname, file_extension, **keywords):
1820
self.file_extension = file_extension
1921
keywords["single_sheet_in_book"] = False
20-
CSVSheetWriter.__init__(self, zipfile, sheetname, **keywords)
21-
22-
def set_sheet_name(self, name):
2322
self.content = StringIO()
24-
import csv
23+
super().__init__(zipfile, sheetname, **keywords)
2524

26-
self.writer = csv.writer(self.content, **self._keywords)
25+
def get_writer(self):
26+
return csv.writer(self.content, **self._keywords)
2727

2828
def close(self):
29-
file_name = "%s.%s" % (self._native_sheet, self.file_extension)
29+
file_name = "%s.%s" % (self._sheet_name, self.file_extension)
3030
self.content.seek(0)
3131
self._native_book.writestr(file_name, self.content.read())
3232
self.content.close()

0 commit comments

Comments
 (0)