From 2acdd9b4091766de75209a02136374874a25e349 Mon Sep 17 00:00:00 2001 From: Daniel Grana Date: Mon, 2 Mar 2009 17:29:18 +0000 Subject: [PATCH] utils: add any value to iterable function --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%40952 --- scrapy/trunk/scrapy/tests/test_utils_misc.py | 22 +++++++++++++++++++- scrapy/trunk/scrapy/utils/misc.py | 21 ++++++++++++++----- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/scrapy/trunk/scrapy/tests/test_utils_misc.py b/scrapy/trunk/scrapy/tests/test_utils_misc.py index 3e12c27cf..15f645345 100644 --- a/scrapy/trunk/scrapy/tests/test_utils_misc.py +++ b/scrapy/trunk/scrapy/tests/test_utils_misc.py @@ -1,7 +1,7 @@ import unittest from cStringIO import StringIO -from scrapy.utils.misc import hash_values, items_to_csv, load_object, arg_to_list +from scrapy.utils.misc import hash_values, items_to_csv, load_object, arg_to_list, arg_to_iter from scrapy.item import ScrapedItem class UtilsMiscTestCase(unittest.TestCase): @@ -67,5 +67,25 @@ class UtilsMiscTestCase(unittest.TestCase): self.assertEqual(arg_to_list(100), [100]) self.assertEqual(arg_to_list(('lala', 'poo')), ['lala', 'poo']) + def test_arg_to_list(self): + self.assertEqual(arg_to_list(None), []) + self.assertEqual(arg_to_list('lala'), ['lala']) + self.assertEqual(arg_to_list(100), [100]) + self.assertEqual(arg_to_list(('lala', 'poo')), ['lala', 'poo']) + self.assertEqual(arg_to_list(s for s in ['lala', 'poo']), ['lala', 'poo']) + + def test_arg_to_iter(self): + assert hasattr(arg_to_iter(None), '__iter__') + assert hasattr(arg_to_iter(100), '__iter__') + assert hasattr(arg_to_iter('lala'), '__iter__') + assert hasattr(arg_to_iter([1,2,3]), '__iter__') + assert hasattr(arg_to_iter(l for l in 'abcd'), '__iter__') + + self.assertEqual(list(arg_to_iter(None)), []) + self.assertEqual(list(arg_to_iter('lala')), ['lala']) + self.assertEqual(list(arg_to_iter(100)), [100]) + self.assertEqual(list(arg_to_iter(l for l in 'abc')), ['a', 'b', 'c']) + self.assertEqual(list(arg_to_iter([1,2,3])), [1,2,3]) + if __name__ == "__main__": unittest.main() diff --git a/scrapy/trunk/scrapy/utils/misc.py b/scrapy/trunk/scrapy/utils/misc.py index ef21bf900..4a4c02468 100644 --- a/scrapy/trunk/scrapy/utils/misc.py +++ b/scrapy/trunk/scrapy/utils/misc.py @@ -16,8 +16,8 @@ from scrapy.utils.defer import defer_succeed def arg_to_list(arg): """Convert an argument to list, so that it can be iterated. The argument - can be a None, single value, or an iterable. - + can be a None, single value, or an iterable. + This is meant to be used in functions for arguments which can be either None, single valued or multi-valued. """ @@ -28,6 +28,17 @@ def arg_to_list(arg): else: return [arg] +def arg_to_iter(arg): + """Convert an argument to an iterable. The argument can be a None, single + value, or an iterable. + """ + if arg is None: + return [] + elif hasattr(arg, '__iter__'): + return arg + else: + return [arg] + def dict_updatedefault(D, E, **F): """ updatedefault(D, E, **F) -> None. @@ -101,7 +112,7 @@ load_class = load_object # backwards compatibility, but isnt going to be availab def extract_regex(regex, text, encoding): """Extract a list of unicode strings from the given text/encoding using the following policies: - + * if the regex contains a named group called "extract" that will be returned * if the regex contains multiple numbered groups, all those will be returned (flattened) * if the regex doesn't contain any group the entire regex matching is returned @@ -122,8 +133,8 @@ def extract_regex(regex, text, encoding): return [remove_entities(unicode(s, encoding), keep=['lt', 'amp']) for s in strings] def hash_values(*values): - """Hash a series of non-None values. - + """Hash a series of non-None values. + For example: >>> hash_values('some', 'values', 'to', 'hash') 'f37f5dc65beaaea35af05e16e26d439fd150c576'