mirror of
				https://github.com/yt-dlp/yt-dlp.git
				synced 2025-10-31 06:35:12 +00:00 
			
		
		
		
	[utils] traverse_obj: More fixes (#6959)
				
					
				
			- Fix result when branching with `traverse_string`
- Fix `slice` path on `dict`s
- Fix tests and docstrings from 21b5ec86c2
- Add `is_iterable_like` helper function
Authored by: Grub4K
			
			
This commit is contained in:
		| @@ -2016,7 +2016,7 @@ Line 1 | ||||
|                          msg='nested `...` queries should work') | ||||
|         self.assertCountEqual(traverse_obj(_TEST_DATA, (..., ..., 'index')), range(4), | ||||
|                               msg='`...` query result should be flattened') | ||||
|         self.assertEqual(traverse_obj(range(4), ...), list(range(4)), | ||||
|         self.assertEqual(traverse_obj(iter(range(4)), ...), list(range(4)), | ||||
|                          msg='`...` should accept iterables') | ||||
| 
 | ||||
|         # Test function as key | ||||
| @@ -2025,7 +2025,7 @@ Line 1 | ||||
|                          msg='function as query key should perform a filter based on (key, value)') | ||||
|         self.assertCountEqual(traverse_obj(_TEST_DATA, lambda _, x: isinstance(x[0], str)), {'str'}, | ||||
|                               msg='exceptions in the query function should be catched') | ||||
|         self.assertEqual(traverse_obj(range(4), lambda _, x: x % 2 == 0), [0, 2], | ||||
|         self.assertEqual(traverse_obj(iter(range(4)), lambda _, x: x % 2 == 0), [0, 2], | ||||
|                          msg='function key should accept iterables') | ||||
|         if __debug__: | ||||
|             with self.assertRaises(Exception, msg='Wrong function signature should raise in debug'): | ||||
| @@ -2051,6 +2051,17 @@ Line 1 | ||||
|             with self.assertRaises(Exception, msg='Sets with length != 1 should raise in debug'): | ||||
|                 traverse_obj(_TEST_DATA, {str.upper, str}) | ||||
| 
 | ||||
|         # Test `slice` as a key | ||||
|         _SLICE_DATA = [0, 1, 2, 3, 4] | ||||
|         self.assertEqual(traverse_obj(_TEST_DATA, ('dict', slice(1))), None, | ||||
|                          msg='slice on a dictionary should not throw') | ||||
|         self.assertEqual(traverse_obj(_SLICE_DATA, slice(1)), _SLICE_DATA[:1], | ||||
|                          msg='slice key should apply slice to sequence') | ||||
|         self.assertEqual(traverse_obj(_SLICE_DATA, slice(1, 2)), _SLICE_DATA[1:2], | ||||
|                          msg='slice key should apply slice to sequence') | ||||
|         self.assertEqual(traverse_obj(_SLICE_DATA, slice(1, 4, 2)), _SLICE_DATA[1:4:2], | ||||
|                          msg='slice key should apply slice to sequence') | ||||
| 
 | ||||
|         # Test alternative paths | ||||
|         self.assertEqual(traverse_obj(_TEST_DATA, 'fail', 'str'), 'str', | ||||
|                          msg='multiple `paths` should be treated as alternative paths') | ||||
| @@ -2234,6 +2245,12 @@ Line 1 | ||||
|         self.assertEqual(traverse_obj(_TRAVERSE_STRING_DATA, ('str', (0, 2)), | ||||
|                                       traverse_string=True), ['s', 'r'], | ||||
|                          msg='branching should result in list if `traverse_string`') | ||||
|         self.assertEqual(traverse_obj({}, (0, ...), traverse_string=True), [], | ||||
|                          msg='branching should result in list if `traverse_string`') | ||||
|         self.assertEqual(traverse_obj({}, (0, lambda x, y: True), traverse_string=True), [], | ||||
|                          msg='branching should result in list if `traverse_string`') | ||||
|         self.assertEqual(traverse_obj({}, (0, slice(1)), traverse_string=True), [], | ||||
|                          msg='branching should result in list if `traverse_string`') | ||||
| 
 | ||||
|         # Test is_user_input behavior | ||||
|         _IS_USER_INPUT_DATA = {'range8': list(range(8))} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Simon Sawicki
					Simon Sawicki