Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/tablib/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@
:license: MIT, see LICENSE for more details.
"""

from copy import copy
from operator import itemgetter

from .exceptions import (
HeadersNeeded,
InvalidDatasetIndex,
Expand Down Expand Up @@ -638,6 +635,8 @@ def filter(self, tag):
"""Returns a new instance of the :class:`Dataset`, excluding any rows
that do not contain the given :ref:`tags <tags>`.
"""
import copy

_dset = copy(self)
_dset._data = [row for row in _dset._data if row.has_tag(tag)]

Expand All @@ -651,6 +650,7 @@ def sort(self, col, reverse=False):
Returns a new :class:`Dataset` instance where columns have been
sorted.
"""
from operator import itemgetter

if isinstance(col, str):

Expand Down Expand Up @@ -745,6 +745,8 @@ def stack(self, other):
raise InvalidDimensions

# Copy the source data
from copy import copy

_dset = copy(self)

rows_to_stack = [row for row in _dset._data]
Expand Down
6 changes: 5 additions & 1 deletion src/tablib/formats/_csv.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
""" Tablib - *SV Support.
"""

import csv
from io import StringIO


Expand All @@ -14,6 +13,8 @@ class CSVFormat:
@classmethod
def export_stream_set(cls, dataset, **kwargs):
"""Returns CSV representation of Dataset as file-like."""
import csv

stream = StringIO()

kwargs.setdefault('delimiter', cls.DEFAULT_DELIMITER)
Expand All @@ -35,6 +36,7 @@ def export_set(cls, dataset, **kwargs):
@classmethod
def import_set(cls, dset, in_stream, headers=True, skip_lines=0, **kwargs):
"""Returns dataset from CSV stream."""
import csv

dset.wipe()

Expand All @@ -54,6 +56,8 @@ def import_set(cls, dset, in_stream, headers=True, skip_lines=0, **kwargs):
@classmethod
def detect(cls, stream, delimiter=None):
"""Returns True if given stream is valid CSV."""
import csv

try:
csv.Sniffer().sniff(stream.read(2048), delimiters=delimiter or cls.DEFAULT_DELIMITER)
return True
Expand Down
15 changes: 11 additions & 4 deletions src/tablib/formats/_json.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
""" Tablib - JSON Support
"""
import decimal
import json
from uuid import UUID

import tablib


def serialize_objects_handler(obj):
import decimal
from uuid import UUID

if isinstance(obj, (decimal.Decimal, UUID)):
return str(obj)
elif hasattr(obj, 'isoformat'):
Expand All @@ -23,27 +22,33 @@ class JSONFormat:
@classmethod
def export_set(cls, dataset):
"""Returns JSON representation of Dataset."""
import json

return json.dumps(
dataset.dict, default=serialize_objects_handler, ensure_ascii=False
)

@classmethod
def export_book(cls, databook):
"""Returns JSON representation of Databook."""
import json

return json.dumps(
databook._package(), default=serialize_objects_handler, ensure_ascii=False
)

@classmethod
def import_set(cls, dset, in_stream):
"""Returns dataset from JSON stream."""
import json

dset.wipe()
dset.dict = json.load(in_stream)

@classmethod
def import_book(cls, dbook, in_stream):
"""Returns databook from JSON stream."""
import json

dbook.wipe()
for sheet in json.load(in_stream):
Expand All @@ -55,6 +60,8 @@ def import_book(cls, dbook, in_stream):
@classmethod
def detect(cls, stream):
"""Returns True if given stream is valid JSON."""
import json

try:
json.load(stream)
return True
Expand Down
Loading