Skip to content

Commit dfeafc4

Browse files
authored
Merge pull request #40 from thombashi/develop
Develop
2 parents 4d552de + 82ccbe7 commit dfeafc4

File tree

4 files changed

+69
-15
lines changed

4 files changed

+69
-15
lines changed

setup.py

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

2424
setuptools.setup(
2525
name="SimpleSQLite",
26-
version="0.4.5",
26+
version="0.4.6",
2727
url="https://github.com/thombashi/SimpleSQLite",
2828
bugtrack_url="https://github.com/thombashi/SimpleSQLite/issues",
2929

simplesqlite/core.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -994,9 +994,9 @@ def create_table_with_data(
994994
:py:meth:`.create_index_list`
995995
"""
996996

997-
validate_table_name(table_name)
998-
999997
self.validate_access_permission(["w", "a"])
998+
validate_table_name(table_name)
999+
self.__validate_attr_name_list(attribute_name_list)
10001000

10011001
if dataproperty.is_empty_sequence(data_matrix):
10021002
raise ValueError("input data is null: '{:s} ({:s})'".format(
@@ -1185,6 +1185,15 @@ def __verify_sqlite_db_file(self, database_path):
11851185
connection = sqlite3.connect(database_path)
11861186
connection.close()
11871187

1188+
@staticmethod
1189+
def __validate_attr_name_list(attr_name_list):
1190+
if dataproperty.is_empty_sequence(attr_name_list):
1191+
raise ValueError("attribute name list is empty")
1192+
1193+
for attr_name in attr_name_list:
1194+
if dataproperty.is_empty_string(attr_name):
1195+
raise ValueError("attribute name includes an empty string")
1196+
11881197
@staticmethod
11891198
def __verify_value_matrix(field_list, value_matrix):
11901199
"""

simplesqlite/loader/spreadsheet/gsloader.py

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from ..error import InvalidDataError
1414
from ..data import TableData
1515
from .core import SpreadSheetLoader
16+
from ..._func import connect_sqlite_db_mem
1617

1718

1819
class GoogleSheetsTableLoader(SpreadSheetLoader):
@@ -93,16 +94,22 @@ def load(self):
9394
gc = gspread.authorize(credentials)
9495
for worksheet in gc.open(self.title).worksheets():
9596
self._worksheet = worksheet
96-
self.__all_values = worksheet.get_all_values()
97+
self.__all_values = [row for row in worksheet.get_all_values()]
9798

9899
if self._is_empty_sheet():
99100
continue
100101

101-
self.__strip_empty_col()
102+
try:
103+
self.__strip_empty_col()
104+
except ValueError:
105+
continue
102106

103107
value_matrix = self.__all_values[self._get_start_row_idx():]
104-
header_list = value_matrix[0]
105-
record_list = value_matrix[1:]
108+
try:
109+
header_list = value_matrix[0]
110+
record_list = value_matrix[1:]
111+
except IndexError:
112+
continue
106113

107114
yield TableData(self.make_table_name(), header_list, record_list)
108115

@@ -127,16 +134,31 @@ def _validate_title(self):
127134
raise ValueError("spreadsheet title is empty")
128135

129136
def __strip_empty_col(self):
130-
col_idx = 0
131-
t_value_matrix = zip(*self.__all_values)
132-
133-
for col_value_list in t_value_matrix:
137+
from ...sqlquery import SqlQuery
138+
139+
con = connect_sqlite_db_mem()
140+
141+
tmp_table_name = "tmp"
142+
header_list = [
143+
"a{:d}".format(i)
144+
for i in range(len(self.__all_values[0]))
145+
]
146+
con.create_table_with_data(
147+
tmp_table_name, header_list, self.__all_values)
148+
for col_idx, header in enumerate(header_list):
149+
result = con.select(
150+
select=SqlQuery.to_attr_str(header), table_name=tmp_table_name)
134151
if any([
135-
dataproperty.is_not_empty_string(value)
136-
for value in col_value_list
152+
dataproperty.is_not_empty_string(record[0])
153+
for record in result.fetchall()
137154
]):
138155
break
139156

140-
col_idx += 1
157+
strip_header_list = header_list[col_idx:]
158+
if dataproperty.is_empty_sequence(strip_header_list):
159+
raise ValueError()
141160

142-
self.__all_values = zip(*t_value_matrix[col_idx:])
161+
result = con.select(
162+
select=",".join(SqlQuery.to_attr_str_list(strip_header_list)),
163+
table_name=tmp_table_name)
164+
self.__all_values = result.fetchall()

test/test_simplesqlite.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,29 @@ def test_normal(
748748
assert len(result_matrix) == 3
749749
assert con.get_attr_type(table_name) == expected_attr
750750

751+
@pytest.mark.parametrize(
752+
[
753+
"attr_name_list", "data_matrix",
754+
"index_attr_list", "expected",
755+
],
756+
[
757+
[
758+
[""], [["a"], ["bb"], ["ccc"]],
759+
[], ValueError,
760+
],
761+
]
762+
)
763+
def test_exception_empty_header(
764+
self, tmpdir, attr_name_list, data_matrix, index_attr_list,
765+
expected):
766+
p = tmpdir.join("tmp.db")
767+
con = SimpleSQLite(str(p), "w")
768+
table_name = TEST_TABLE_NAME
769+
770+
with pytest.raises(expected):
771+
con.create_table_with_data(
772+
table_name, attr_name_list, data_matrix, index_attr_list)
773+
751774
def test_null(self, con_null):
752775
with pytest.raises(NullDatabaseConnectionError):
753776
con_null.create_table_with_data(

0 commit comments

Comments
 (0)