fix edge cases, add tests
This commit is contained in:
parent
0f70f51724
commit
b06e8cefde
2 changed files with 19 additions and 7 deletions
|
|
@ -66,8 +66,12 @@ class TestListToString(TestCase):
|
||||||
[1,2,3] -> '1, 2, 3'
|
[1,2,3] -> '1, 2, 3'
|
||||||
with sep==';' and endsep==';':
|
with sep==';' and endsep==';':
|
||||||
[1,2,3] -> '1; 2; 3'
|
[1,2,3] -> '1; 2; 3'
|
||||||
|
with sep=='or':
|
||||||
|
[1,2,3] -> '1 or 2, and 3'
|
||||||
with endsep=='and':
|
with endsep=='and':
|
||||||
[1,2,3] -> '1, 2 and 3'
|
[1,2,3] -> '1, 2 and 3'
|
||||||
|
with endsep=='; and':
|
||||||
|
[1,2,3] -> '1, 2; and 3'
|
||||||
with endsep=='':
|
with endsep=='':
|
||||||
[1,2,3] -> '1, 2 3'
|
[1,2,3] -> '1, 2 3'
|
||||||
with addquote and endsep="and"
|
with addquote and endsep="and"
|
||||||
|
|
@ -80,6 +84,8 @@ class TestListToString(TestCase):
|
||||||
self.assertEqual("1, 2 and 3", utils.list_to_string([1, 2, 3], endsep="and"))
|
self.assertEqual("1, 2 and 3", utils.list_to_string([1, 2, 3], endsep="and"))
|
||||||
self.assertEqual("1, 2 3", utils.list_to_string([1, 2, 3], endsep=""))
|
self.assertEqual("1, 2 3", utils.list_to_string([1, 2, 3], endsep=""))
|
||||||
self.assertEqual("1; 2; 3", utils.list_to_string([1, 2, 3], sep=";", endsep=";"))
|
self.assertEqual("1; 2; 3", utils.list_to_string([1, 2, 3], sep=";", endsep=";"))
|
||||||
|
self.assertEqual("1 or 2, and 3", utils.list_to_string([1, 2, 3], sep="or"))
|
||||||
|
self.assertEqual("1, 2; and 3", utils.list_to_string([1, 2, 3], endsep="; and"))
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
'"1", "2", "3"', utils.list_to_string([1, 2, 3], endsep=",", addquote=True)
|
'"1", "2", "3"', utils.list_to_string([1, 2, 3], endsep=",", addquote=True)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ from collections import OrderedDict, defaultdict
|
||||||
from inspect import getmembers, getmodule, getmro, ismodule, trace
|
from inspect import getmembers, getmodule, getmro, ismodule, trace
|
||||||
from os.path import join as osjoin
|
from os.path import join as osjoin
|
||||||
from unicodedata import east_asian_width
|
from unicodedata import east_asian_width
|
||||||
|
from string import punctuation
|
||||||
|
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
@ -403,18 +404,23 @@ def iter_to_str(iterable, sep=",", endsep=", and", addquote=False):
|
||||||
if not iterable:
|
if not iterable:
|
||||||
return ""
|
return ""
|
||||||
len_iter = len(iterable)
|
len_iter = len(iterable)
|
||||||
|
|
||||||
if addquote:
|
if addquote:
|
||||||
iterable = tuple(f'"{val}"' for val in iterable)
|
iterable = tuple(f'"{val}"' for val in iterable)
|
||||||
else:
|
else:
|
||||||
iterable = tuple(str(val) for val in iterable)
|
iterable = tuple(str(val) for val in iterable)
|
||||||
|
|
||||||
if endsep.startswith(sep):
|
if endsep:
|
||||||
# oxford comma alternative
|
if endsep.startswith(sep):
|
||||||
endsep = endsep[1:] if len_iter < 3 else endsep
|
# oxford comma alternative
|
||||||
elif endsep:
|
endsep = endsep[1:] if len_iter < 3 else endsep
|
||||||
# normal space-separated end separator
|
elif endsep[0] not in punctuation:
|
||||||
endsep = " " + str(endsep).strip()
|
# add a leading space if endsep is a word
|
||||||
|
endsep = " " + str(endsep).strip()
|
||||||
|
|
||||||
|
# also add a leading space if separator is a word
|
||||||
|
if sep not in punctuation:
|
||||||
|
sep = " "+sep
|
||||||
|
|
||||||
if len_iter == 1:
|
if len_iter == 1:
|
||||||
return str(iterable[0])
|
return str(iterable[0])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue