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
9 changes: 7 additions & 2 deletions swift/dataset/register.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ def _register_d_info(d_info: Dict[str, Any], *, base_dir: Optional[str] = None)
return dataset_meta


def register_dataset_info(dataset_info: Union[str, List[str], None] = None) -> List[DatasetMeta]:
def register_dataset_info(dataset_info: Union[str, list, None] = None) -> List[DatasetMeta]:
"""Register dataset from the `dataset_info.json` or a custom dataset info file
This is used to deal with the datasets defined in the json info file.

Expand All @@ -103,13 +103,18 @@ def register_dataset_info(dataset_info: Union[str, List[str], None] = None) -> L
dataset_info = json.load(f)
else:
dataset_info = json.loads(dataset_info) # json
if not isinstance(dataset_info, list):
raise ValueError(f'`dataset_info` should be a JSON list of dataset entries (e.g. `[{{...}}]`), but got '
f'type `{type(dataset_info).__name__}`. Please wrap the entry in a list.')
if len(dataset_info) == 0:
return []
res = []
for d_info in dataset_info:
res.append(_register_d_info(d_info, base_dir=base_dir))

if log_msg is None:
log_msg = dataset_info if len(dataset_info) < 5 else list(dataset_info.keys())
# dataset_info is a list here; slice it (the old `.keys()` dated to when
# it was a dict and now raises AttributeError for 5+ entries).
log_msg = dataset_info if len(dataset_info) < 5 else dataset_info[:5]
logger.info(f'Successfully registered `{log_msg}`.')
return res
25 changes: 25 additions & 0 deletions tests/general/test_dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,31 @@ def test_cls():
_test_dataset(['simpleai/HC3-Chinese:baike_cls'])


def test_register_dataset_info_rejects_non_list():
import json
import os
import tempfile

from swift.dataset import register_dataset_info

# A single entry written as a top-level object instead of a one-element list is a
# common mistake; it must fail with a clear message rather than a cryptic
# "'str' object does not support item assignment" from iterating the dict keys.
with tempfile.NamedTemporaryFile('w', suffix='.json', delete=False, encoding='utf-8') as f:
json.dump({'ms_dataset_id': 'swift/self-cognition'}, f)
path = f.name

try:
try:
register_dataset_info(path)
except ValueError as e:
assert 'list' in str(e)
else:
raise AssertionError('expected ValueError for a non-list dataset_info')
finally:
os.remove(path)


if __name__ == '__main__':
# test_sft()
# test_agent()
Expand Down
Loading