Skip to content

Commit 4bdfc97

Browse files
committed
Add lazyness metadata to plugins
1 parent c04e957 commit 4bdfc97

23 files changed

Lines changed: 63 additions & 4 deletions

rows/plugins/dicts.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ def import_from_dicts(data, samples=None, *args, **kwargs):
5252
return create_table(chain([headers], data_rows), meta=meta, *args, **kwargs)
5353

5454

55+
import_from_dicts.is_lazy = False
56+
57+
5558
def export_to_dicts(table, *args, **kwargs):
5659
"""Export a `rows.Table` to a list of dicts"""
5760
field_names = table.field_names

rows/plugins/ods.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,10 @@ def import_from_ods(filename_or_fobj, index=0, *args, **kwargs):
103103

104104
max_length = max(len(row) for row in table_rows)
105105
full_rows = complete_with_None(table_rows, max_length)
106+
106107
meta = {'imported_from': 'ods', 'filename': filename,}
108+
107109
return create_table(full_rows, meta=meta, *args, **kwargs)
110+
111+
112+
import_from_ods.is_lazy = False

rows/plugins/plugin_csv.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ def import_from_csv(filename_or_fobj, encoding='utf-8', dialect=None,
118118
return create_table(reader, meta=meta, *args, **kwargs)
119119

120120

121+
import_from_csv.is_lazy = True
122+
123+
121124
def export_to_csv(table, filename_or_fobj=None, encoding='utf-8',
122125
dialect=unicodecsv.excel, batch_size=100, callback=None,
123126
*args, **kwargs):

rows/plugins/plugin_html.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ def import_from_html(filename_or_fobj, encoding='utf-8', index=0,
9797
return create_table(table_rows, meta=meta, *args, **kwargs)
9898

9999

100+
import_from_html.is_lazy = False
101+
102+
100103
def export_to_html(table, filename_or_fobj=None, encoding='utf-8', *args,
101104
**kwargs):
102105
"""Export and return rows.Table data to HTML file."""
@@ -106,6 +109,7 @@ def export_to_html(table, filename_or_fobj=None, encoding='utf-8', *args,
106109
header = [' <th> {} </th>\n'.format(field) for field in fields]
107110
result.extend(header)
108111
result.extend([' </tr>\n', ' </thead>\n', '\n', ' <tbody>\n', '\n'])
112+
# TODO: could be lazy so we don't need to store the whole table into memory
109113
for index, row in enumerate(serialized_table, start=1):
110114
css_class = 'odd' if index % 2 == 1 else 'even'
111115
result.append(' <tr class="{}">\n'.format(css_class))

rows/plugins/plugin_json.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ def import_from_json(filename_or_fobj, encoding='utf-8', *args, **kwargs):
3535
filename, fobj = get_filename_and_fobj(filename_or_fobj)
3636

3737
json_obj = json.load(fobj, encoding=encoding)
38+
# TODO: may use import_from_dicts here
3839
field_names = list(json_obj[0].keys())
3940
table_rows = [[item[key] for key in field_names] for item in json_obj]
4041

@@ -44,6 +45,9 @@ def import_from_json(filename_or_fobj, encoding='utf-8', *args, **kwargs):
4445
return create_table([field_names] + table_rows, meta=meta, *args, **kwargs)
4546

4647

48+
import_from_json.is_lazy = False
49+
50+
4751
def _convert(value, field_type, *args, **kwargs):
4852
if value is None or field_type in (
4953
fields.BinaryField,
@@ -74,6 +78,8 @@ def export_to_json(table, filename_or_fobj=None, encoding='utf-8', indent=None,
7478
fields = table.fields
7579
prepared_table = prepare_to_export(table, *args, **kwargs)
7680
field_names = next(prepared_table)
81+
82+
# TODO: could be lazy so we don't need to store the whole table into memory
7783
data = [{field_name: _convert(value, fields[field_name], *args, **kwargs)
7884
for field_name, value in zip(field_names, row)}
7985
for row in prepared_table]

rows/plugins/plugin_parquet.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,12 @@ def import_from_parquet(filename_or_fobj, *args, **kwargs):
5252
for schema in parquet._read_footer(fobj).schema
5353
if schema.type is not None])
5454
header = list(types.keys())
55-
table_rows = list(parquet.reader(fobj)) # TODO: be lazy
55+
# TODO: make it lazy
56+
table_rows = list(parquet.reader(fobj))
5657

5758
meta = {'imported_from': 'parquet', 'filename': filename,}
5859
return create_table([header] + table_rows, meta=meta, force_types=types,
5960
*args, **kwargs)
61+
62+
63+
import_from_parquet.is_lazy = False

rows/plugins/sqlite.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ def import_from_sqlite(filename_or_connection, table_name='table1', query=None,
133133
return create_table(data, meta=meta, *args, **kwargs)
134134

135135

136+
import_from_sqlite.is_lazy = True
137+
138+
136139
def export_to_sqlite(table, filename_or_connection, table_name=None,
137140
table_name_format='table{index}', batch_size=100,
138141
callback=None, *args, **kwargs):

rows/plugins/txt.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,9 @@ def import_from_txt(filename_or_fobj, encoding='utf-8',
175175
return create_table(table_rows, meta=meta, *args, **kwargs)
176176

177177

178+
import_from_txt.is_lazy = False
179+
180+
178181
def export_to_txt(table, filename_or_fobj=None, encoding=None,
179182
frame_style="ASCII", safe_none_frame=True, *args, **kwargs):
180183
"""Export a `rows.Table` to text.

rows/plugins/utils.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,10 @@ def func(rows_data):
149149
def create_table(data, meta=None, fields=None, skip_header=True,
150150
import_fields=None, samples=None, force_types=None,
151151
lazy=False, *args, **kwargs):
152+
# TODO: change samples to be a fixed number
153+
# TODO: may change samples logic (`float('inf')` or `all`)
152154
# TODO: add auto_detect_types=True parameter
155+
153156
table_rows = iter(data)
154157
sample_rows = []
155158

@@ -171,6 +174,9 @@ def create_table(data, meta=None, fields=None, skip_header=True,
171174
if not isinstance(fields, OrderedDict):
172175
raise ValueError('`fields` must be an `OrderedDict`')
173176

177+
# TODO: if `fields` is set, we're going to have the wrong order,
178+
# compared to the first row (header).
179+
174180
if skip_header:
175181
next(table_rows)
176182

@@ -195,6 +201,7 @@ def create_table(data, meta=None, fields=None, skip_header=True,
195201

196202
if not lazy:
197203
table = Table(fields=fields, meta=meta)
204+
198205
# TODO: put this inside Table.__init__
199206
for row in chain(sample_rows, table_rows):
200207
table.append({field_name: value

rows/plugins/xls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,9 @@ def import_from_xls(filename_or_fobj, sheet_name=None, sheet_index=0,
163163
return create_table(table_rows, meta=meta, *args, **kwargs)
164164

165165

166+
import_from_xls.is_lazy = False
167+
168+
166169
def export_to_xls(table, filename_or_fobj=None, sheet_name='Sheet1', *args,
167170
**kwargs):
168171
"""Export the rows.Table to XLS file and return the saved file."""

0 commit comments

Comments
 (0)