Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Test failures on Python 3.12

Open
#123 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
python
Domain
tooling

Research direction

Start by reproducing the failures in pyannotate_runtime/tests/test_collect_types.py and tests/integration_test.py under Python 3.12. Compare the reported NoReturnType and UnknownType results with the expected annotations, then trace the relevant runtime type-collection entry points. Done means the affected tests and integration tests pass on Python 3.12 without regressing existing behavior.

Written by the indexing model from the issue text.

Description

Python 3.12 seems to have some changes incompatible with pyannotate 1.2.0:

[   20s] =========================== short test summary info ============================
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_callee_star_args
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_caller_star_args
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_recursive_function
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_run_a_bunch_of_tests
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_star_star_args
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_type_collection_on_main_thread
[   20s] FAILED pyannotate_runtime/tests/test_collect_types.py::TestCollectTypes::test_yield_empty
[   20s] FAILED tests/integration_test.py::IntegrationTest::test_package - AssertionEr...
[   20s] FAILED tests/integration_test.py::IntegrationTest::test_simple - AssertionErr...
[   20s] FAILED tests/integration_test.py::IntegrationTest::test_subdir - AssertionErr...
[   20s] FAILED tests/integration_test.py::IntegrationTest::test_subdir_w_class - Asse...
[   20s] =================== 11 failed, 74 passed, 1 warning in 1.48s ===================

All details:

[   20s] =================================== FAILURES ===================================
[   20s] ____________________ TestCollectTypes.test_callee_star_args ____________________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_callee_star_args>
[   20s] 
[   20s]     def test_callee_star_args(self):
[   20s]         # type: () -> None
[   20s]     
[   20s]         def callee_star_args(x, *y):
[   20s]             # type: (Any, *Any) -> Any
[   20s]             return 0
[   20s]     
[   20s]         with self.collecting_types():
[   20s]             callee_star_args(0)
[   20s]             callee_star_args(1, '')
[   20s]             callee_star_args(slice(1), 1.1, True)
[   20s]             callee_star_args(*(False, 1.1, ''))
[   20s] >       self.assert_type_comments('callee_star_args', ['(int) -> int',
[   20s]                                                        '(int, *str) -> int',
[   20s]                                                        '(slice, *Union[bool, float]) -> int',
[   20s]                                                        '(bool, *Union[float, str]) -> int'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:484: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_callee_star_args>
[   20s] func_name = 'callee_star_args'
[   20s] comments = ['(int) -> int', '(int, *str) -> int', '(slice, *Union[bool, float]) -> int', '(bool, *Union[float, str]) -> int']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'(bool, *Uni...NoReturnType'} == {'(bool, *Uni...oat]) -> int'}
[   20s] E             Extra items in the left set:
[   20s] E             '(bool, *Union[float, str]) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             '(int, *str) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             '(slice, *Union[bool, float]) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             '(int) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '(int, *str) -> int'...
[   20s] E             
[   20s] E             ...Full output truncated (16 lines hidden), use '-vv' to show
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] Actual:
[   20s]     (bool, *Union[float, str]) -> pyannotate_runtime.collect_types.NoReturnType
[   20s]     (int) -> pyannotate_runtime.collect_types.NoReturnType
[   20s]     (int, *str) -> pyannotate_runtime.collect_types.NoReturnType
[   20s]     (slice, *Union[bool, float]) -> pyannotate_runtime.collect_types.NoReturnType
[   20s] Expected:
[   20s]     (bool, *Union[float, str]) -> int
[   20s]     (int) -> int
[   20s]     (int, *str) -> int
[   20s]     (slice, *Union[bool, float]) -> int
[   20s] ____________________ TestCollectTypes.test_caller_star_args ____________________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_caller_star_args>
[   20s] 
[   20s]     def test_caller_star_args(self):
[   20s]         # type: () -> None
[   20s]     
[   20s]         def caller_star_args(x, y=None):
[   20s]             # type: (Any, Any) -> Any
[   20s]             return 0
[   20s]     
[   20s]         with self.collecting_types():
[   20s]             caller_star_args(*(1,))
[   20s]             caller_star_args(*('', 1.1))
[   20s] >       self.assert_type_comments('caller_star_args', ['(int, None) -> int',
[   20s]                                                        '(str, float) -> int'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:499: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_caller_star_args>
[   20s] func_name = 'caller_star_args'
[   20s] comments = ['(int, None) -> int', '(str, float) -> int']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'(int, None)...NoReturnType'} == {'(int, None)...loat) -> int'}
[   20s] E             Extra items in the left set:
[   20s] E             '(int, None) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             '(str, float) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '(int, None) -> int'
[   20s] E             '(str, float) -> int'
[   20s] E             Full diff:...
[   20s] E             
[   20s] E             ...Full output truncated (6 lines hidden), use '-vv' to show
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] Actual:
[   20s]     (int, None) -> pyannotate_runtime.collect_types.NoReturnType
[   20s]     (str, float) -> pyannotate_runtime.collect_types.NoReturnType
[   20s] Expected:
[   20s]     (int, None) -> int
[   20s]     (str, float) -> int
[   20s] ___________________ TestCollectTypes.test_recursive_function ___________________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_recursive_function>
[   20s] 
[   20s]     def test_recursive_function(self):
[   20s]         # type: () -> None
[   20s]     
[   20s]         def recurse(x):
[   20s]             # type: (Any) -> Any
[   20s]             if len(x) == 0:
[   20s]                 return 1.1
[   20s]             else:
[   20s]                 recurse(x[1:])
[   20s]                 return x[0]
[   20s]     
[   20s]         with self.collecting_types():
[   20s]             recurse((1, '', True))
[   20s] >       self.assert_type_comments(
[   20s]             'recurse',
[   20s]             ['(Tuple[]) -> float',
[   20s]              '(Tuple[bool]) -> pyannotate_runtime.collect_types.UnknownType',
[   20s]              '(Tuple[str, bool]) -> pyannotate_runtime.collect_types.UnknownType',
[   20s]              '(Tuple[int, str, bool]) -> pyannotate_runtime.collect_types.UnknownType'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:542: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_recursive_function>
[   20s] func_name = 'recurse'
[   20s] comments = ['(Tuple[]) -> float', '(Tuple[bool]) -> pyannotate_runtime.collect_types.UnknownType', '(Tuple[str, bool]) -> pyannotate_runtime.collect_types.UnknownType', '(Tuple[int, str, bool]) -> pyannotate_runtime.collect_types.UnknownType']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'(Tuple[]) -....UnknownType'} == {'(Tuple[]) -....UnknownType'}
[   20s] E             Extra items in the left set:
[   20s] E             '(Tuple[]) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '(Tuple[]) -> float'
[   20s] E             Full diff:
[   20s] E               {
[   20s] E             -  '(Tuple[]) -> float',...
[   20s] E             
[   20s] E             ...Full output truncated (5 lines hidden), use '-vv' to show
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] Actual:
[   20s]     (Tuple[]) -> pyannotate_runtime.collect_types.NoReturnType
[   20s]     (Tuple[bool]) -> pyannotate_runtime.collect_types.UnknownType
[   20s]     (Tuple[int, str, bool]) -> pyannotate_runtime.collect_types.UnknownType
[   20s]     (Tuple[str, bool]) -> pyannotate_runtime.collect_types.UnknownType
[   20s] Expected:
[   20s]     (Tuple[]) -> float
[   20s]     (Tuple[bool]) -> pyannotate_runtime.collect_types.UnknownType
[   20s]     (Tuple[int, str, bool]) -> pyannotate_runtime.collect_types.UnknownType
[   20s]     (Tuple[str, bool]) -> pyannotate_runtime.collect_types.UnknownType
[   20s] __________________ TestCollectTypes.test_run_a_bunch_of_tests __________________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_run_a_bunch_of_tests>
[   20s] 
[   20s]     def test_run_a_bunch_of_tests(self):
[   20s]         # type: () -> None
[   20s]         with self.collecting_types():
[   20s]             to = FooObject()
[   20s]             wc = WorkerClass(42, to)
[   20s]             s = sched.scheduler(time.time, time.sleep)
[   20s]             event_source = EventfulHappenings()
[   20s]             s.enter(.001, 1, wc.do_work, ([52, 'foo,', 32], FooNamedTuple('ab', 97)))
[   20s]             s.enter(.002, 1, wc.do_work, ([52, 32], FooNamedTuple('bc', 98)))
[   20s]             s.enter(.003, 1, wc.do_work_clsmthd, (52, FooNamedTuple('de', 99)))
[   20s]             s.enter(.004, 1, event_source.add_handler, (i_care_about_whats_happening,))
[   20s]             s.enter(.005, 1, event_source.add_handler, (lambda a, b: print_int(a),))
[   20s]             s.enter(.006, 1, event_source.something_happened, (1, 'tada'))
[   20s]             s.run()
[   20s]     
[   20s]             takes_different_lists([42, 'as', 323, 'a'])
[   20s]             takes_int_lists([42, 323, 3231])
[   20s]             takes_int_float_lists([42, 323.2132, 3231])
[   20s]             takes_int_to_str_dict({2: 'a', 4: 'd'})
[   20s]             takes_int_to_multiple_val_dict({3: 'a', 4: None, 5: 232})
[   20s]             recursive_dict({3: {3: 'd'}, 4: {3: 'd'}})
[   20s]     
[   20s]             empty_then_not_dict({})
[   20s]             empty_then_not_dict({3: {3: 'd'}, 4: {3: 'd'}})
[   20s]             empty_then_not_list([])
[   20s]             empty_then_not_list([1, 2])
[   20s]             empty_then_not_list([1, 2])
[   20s]             tuple_verify((1, '4'))
[   20s]             tuple_verify((1, '4'))
[   20s]     
[   20s]             problematic_dup(u'ha', False)
[   20s]             problematic_dup(u'ha', False)
[   20s]     
[   20s]             OldStyleClass().foo(10)
[   20s]     
[   20s]             discard(FooObject.FooNested())
[   20s]     
[   20s]         # TODO(svorobev): add checks for the rest of the functions
[   20s]         # print_int,
[   20s] >       self.assert_type_comments(
[   20s]             'WorkerClass.__init__',
[   20s]             ['(int, pyannotate_runtime.tests.test_collect_types.FooObject) -> None'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:326: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_run_a_bunch_of_tests>
[   20s] func_name = 'WorkerClass.__init__'
[   20s] comments = ['(int, pyannotate_runtime.tests.test_collect_types.FooObject) -> None']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'(int, pyann...NoReturnType'} == {'(int, pyann...ect) -> None'}
[   20s] E             Extra items in the left set:
[   20s] E             '(int, pyannotate_runtime.tests.test_collect_types.FooObject) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '(int, pyannotate_runtime.tests.test_collect_types.FooObject) -> None'
[   20s] E             Full diff:
[   20s] E               {
[   20s] E             -  '(int, pyannotate_runtime.tests.test_collect_types.FooObject) -> None',...
[   20s] E             
[   20s] E             ...Full output truncated (4 lines hidden), use '-vv' to show
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] [52, 'foo,', 32]
[   20s] [52, 32]
[   20s] 52
[   20s] 1
[   20s] tada
[   20s] 1
[   20s] Actual:
[   20s]     (int, pyannotate_runtime.tests.test_collect_types.FooObject) -> pyannotate_runtime.collect_types.NoReturnType
[   20s] Expected:
[   20s]     (int, pyannotate_runtime.tests.test_collect_types.FooObject) -> None
[   20s] _____________________ TestCollectTypes.test_star_star_args _____________________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_star_star_args>
[   20s] 
[   20s]     def test_star_star_args(self):
[   20s]         # type: () -> None
[   20s]     
[   20s]         def star_star_args(x, **kw):
[   20s]             # type: (Any, **Any) -> Any
[   20s]             return 0
[   20s]     
[   20s]         with self.collecting_types():
[   20s]             star_star_args(1, y='', z=True)
[   20s]             star_star_args(**{'x': True, 'a': 1.1})
[   20s] >       self.assert_type_comments('star_star_args', ['(int) -> int',
[   20s]                                                      '(bool) -> int'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:512: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_star_star_args>
[   20s] func_name = 'star_star_args', comments = ['(int) -> int', '(bool) -> int']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'(bool) -> p...NoReturnType'} == {'(bool) -> i...(int) -> int'}
[   20s] E             Extra items in the left set:
[   20s] E             '(int) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             '(bool) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '(bool) -> int'
[   20s] E             '(int) -> int'
[   20s] E             Full diff:...
[   20s] E             
[   20s] E             ...Full output truncated (6 lines hidden), use '-vv' to show
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] Actual:
[   20s]     (bool) -> pyannotate_runtime.collect_types.NoReturnType
[   20s]     (int) -> pyannotate_runtime.collect_types.NoReturnType
[   20s] Expected:
[   20s]     (bool) -> int
[   20s]     (int) -> int
[   20s] _____________ TestCollectTypes.test_type_collection_on_main_thread _____________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_type_collection_on_main_thread>
[   20s] 
[   20s]     def test_type_collection_on_main_thread(self):
[   20s]         # type: () -> None
[   20s]         with self.collecting_types():
[   20s]             self.foo(2, ['1', '2'])
[   20s] >       self.assert_type_comments('TestCollectTypes.foo', ['(int, List[str]) -> None'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:264: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_type_collection_on_main_thread>
[   20s] func_name = 'TestCollectTypes.foo', comments = ['(int, List[str]) -> None']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'(int, List[...NoReturnType'} == {'(int, List[str]) -> None'}
[   20s] E             Extra items in the left set:
[   20s] E             '(int, List[str]) -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '(int, List[str]) -> None'
[   20s] E             Full diff:
[   20s] E             - {'(int, List[str]) -> None'}
[   20s] E             + {'(int, List[str]) -> pyannotate_runtime.collect_types.NoReturnType'}
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] Actual:
[   20s]     (int, List[str]) -> pyannotate_runtime.collect_types.NoReturnType
[   20s] Expected:
[   20s]     (int, List[str]) -> None
[   20s] ______________________ TestCollectTypes.test_yield_empty _______________________
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_yield_empty>
[   20s] 
[   20s]     def test_yield_empty(self):
[   20s]         # type: () -> None
[   20s]         def gen():
[   20s]             if False:
[   20s]                 yield
[   20s]     
[   20s]         with self.collecting_types():
[   20s]             list(gen())
[   20s]     
[   20s] >       self.assert_type_comments('gen', ['() -> Iterator'])
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:655: 
[   20s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
[   20s] 
[   20s] self = <pyannotate_runtime.tests.test_collect_types.TestCollectTypes testMethod=test_yield_empty>
[   20s] func_name = 'gen', comments = ['() -> Iterator']
[   20s] 
[   20s]     def assert_type_comments(self, func_name, comments):
[   20s]         # type: (str, List[str]) -> None
[   20s]         """Assert that we generated expected comment for the func_name function in self.stats"""
[   20s]         stat_items = [item for item in self.stats if item.get('func_name') == func_name]
[   20s]         if not comments and not stat_items:
[   20s]             # If we expect no comments, it's okay if nothing was collected.
[   20s]             return
[   20s]         assert len(stat_items) == 1
[   20s]         item = stat_items[0]
[   20s]         if set(item['type_comments']) != set(comments):
[   20s]             print('Actual:')
[   20s]             for comment in sorted(item['type_comments']):
[   20s]                 print('    ' + comment)
[   20s]             print('Expected:')
[   20s]             for comment in sorted(comments):
[   20s]                 print('    ' + comment)
[   20s] >           assert set(item['type_comments']) == set(comments)
[   20s] E           AssertionError: assert {'() -> pyann...NoReturnType'} == {'() -> Iterator'}
[   20s] E             Extra items in the left set:
[   20s] E             '() -> pyannotate_runtime.collect_types.NoReturnType'
[   20s] E             Extra items in the right set:
[   20s] E             '() -> Iterator'
[   20s] E             Full diff:
[   20s] E             - {'() -> Iterator'}
[   20s] E             + {'() -> pyannotate_runtime.collect_types.NoReturnType'}
[   20s] 
[   20s] pyannotate_runtime/tests/test_collect_types.py:230: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] Actual:
[   20s]     () -> pyannotate_runtime.collect_types.NoReturnType
[   20s] Expected:
[   20s]     () -> Iterator
[   20s] _________________________ IntegrationTest.test_package _________________________
[   20s] 
[   20s] self = <integration_test.IntegrationTest testMethod=test_package>
[   20s] 
[   20s]     def test_package(self):
[   20s]         os.makedirs('foo')
[   20s]         with open('foo/__init__.py', 'w') as f:
[   20s]             pass
[   20s]         with open('foo/gcd.py', 'w') as f:
[   20s]             f.write(example)
[   20s]         with open('driver.py', 'w') as f:
[   20s]             f.write('from foo.gcd import main\n')
[   20s]             f.write(driver)
[   20s]         subprocess.check_call([sys.executable, 'driver.py'])
[   20s]         output = subprocess.check_output([sys.executable, '-m', 'pyannotate_tools.annotations', 'foo/gcd.py'])
[   20s]         lines = output.splitlines()
[   20s] >       assert b'+    # type: () -> None' in lines
[   20s] E       AssertionError: assert b'+    # type: () -> None' in [b'--- foo/gcd.py\t(original)', b'+++ foo/gcd.py\t(refactored)', b'@@ -1,9 +1,12 @@', b'+from mypy_extensions import NoReturn', b' ', b' def main():', ...]
[   20s] 
[   20s] tests/integration_test.py:101: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] 5
[   20s] 3
[   20s] ----------------------------- Captured stderr call -----------------------------
[   20s] /home/abuild/rpmbuild/BUILD/pyannotate-1.2.0/pyannotate_tools/annotations/__main__.py:9: DeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
[   20s]   from lib2to3.main import StdoutRefactoringTool
[   20s] Refactored foo/gcd.py
[   20s] Files that need to be modified:
[   20s] foo/gcd.py
[   20s] NOTE: this was a dry run; use -w to write files
[   20s] _________________________ IntegrationTest.test_simple __________________________
[   20s] 
[   20s] self = <integration_test.IntegrationTest testMethod=test_simple>
[   20s] 
[   20s]     def test_simple(self):
[   20s]         with open('gcd.py', 'w') as f:
[   20s]             f.write(example)
[   20s]         with open('driver.py', 'w') as f:
[   20s]             f.write('from gcd import main\n')
[   20s]             f.write(driver)
[   20s]         subprocess.check_call([sys.executable, 'driver.py'])
[   20s]         output = subprocess.check_output([sys.executable, '-m', 'pyannotate_tools.annotations', 'gcd.py'])
[   20s]         lines = output.splitlines()
[   20s] >       assert b'+    # type: () -> None' in lines
[   20s] E       AssertionError: assert b'+    # type: () -> None' in [b'--- gcd.py\t(original)', b'+++ gcd.py\t(refactored)', b'@@ -1,9 +1,12 @@', b'+from mypy_extensions import NoReturn', b' ', b' def main():', ...]
[   20s] 
[   20s] tests/integration_test.py:65: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] 5
[   20s] 3
[   20s] ----------------------------- Captured stderr call -----------------------------
[   20s] /home/abuild/rpmbuild/BUILD/pyannotate-1.2.0/pyannotate_tools/annotations/__main__.py:9: DeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
[   20s]   from lib2to3.main import StdoutRefactoringTool
[   20s] Refactored gcd.py
[   20s] Files that need to be modified:
[   20s] gcd.py
[   20s] NOTE: this was a dry run; use -w to write files
[   20s] _________________________ IntegrationTest.test_subdir __________________________
[   20s] 
[   20s] self = <integration_test.IntegrationTest testMethod=test_subdir>
[   20s] 
[   20s]     def test_subdir(self):
[   20s]         os.makedirs('foo')
[   20s]         with open('foo/gcd.py', 'w') as f:
[   20s]             f.write(example)
[   20s]         with open('driver.py', 'w') as f:
[   20s]             f.write('import sys\n')
[   20s]             f.write('sys.path.insert(0, "foo")\n')
[   20s]             f.write('from gcd import main\n')
[   20s]             f.write(driver)
[   20s]         subprocess.check_call([sys.executable, 'driver.py'])
[   20s]         output = subprocess.check_output([sys.executable, '-m', 'pyannotate_tools.annotations',
[   20s]                                           # Construct platform-correct pathname:
[   20s]                                           os.path.join('foo', 'gcd.py')])
[   20s]         lines = output.splitlines()
[   20s] >       assert b'+    # type: () -> None' in lines
[   20s] E       AssertionError: assert b'+    # type: () -> None' in [b'--- foo/gcd.py\t(original)', b'+++ foo/gcd.py\t(refactored)', b'@@ -1,9 +1,12 @@', b'+from mypy_extensions import NoReturn', b' ', b' def main():', ...]
[   20s] 
[   20s] tests/integration_test.py:118: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] 5
[   20s] 3
[   20s] ----------------------------- Captured stderr call -----------------------------
[   20s] /home/abuild/rpmbuild/BUILD/pyannotate-1.2.0/pyannotate_tools/annotations/__main__.py:9: DeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+
[   20s]   from lib2to3.main import StdoutRefactoringTool
[   20s] Refactored foo/gcd.py
[   20s] Files that need to be modified:
[   20s] foo/gcd.py
[   20s] NOTE: this was a dry run; use -w to write files
[   20s] _____________________ IntegrationTest.test_subdir_w_class ______________________
[   20s] 
[   20s] self = <integration_test.IntegrationTest testMethod=test_subdir_w_class>
[   20s] 
[   20s]     def test_subdir_w_class(self):
[   20s]         os.makedirs('foo')
[   20s]         with open('foo/bar.py', 'w') as f:
[   20s]             f.write(class_example)
[   20s]         with open('driver.py', 'w') as f:
[   20s]             f.write('import sys\n')
[   20s]             f.write('sys.path.insert(0, "foo")\n')
[   20s]             f.write('from bar import main\n')
[   20s]             f.write(driver)
[   20s]         subprocess.check_call([sys.executable, 'driver.py'])
[   20s]         output = subprocess.check_output([sys.executable, '-m', 'pyannotate_tools.annotations',
[   20s]                                           # Construct platform-correct pathname:
[   20s]                                           os.path.join('foo', 'bar.py')])
[   20s]         lines = output.splitlines()
[   20s]         print(b'\n'.join(lines).decode())
[   20s] >       assert b'+    # type: () -> None' in lines
[   20s] E       AssertionError: assert b'+    # type: () -> None' in [b'--- foo/bar.py\t(original)', b'+++ foo/bar.py\t(refactored)', b'@@ -1,9 +1,12 @@', b'+from mypy_extensions import NoReturn', b' ', b' class A(object): pass', ...]
[   20s] 
[   20s] tests/integration_test.py:136: AssertionError
[   20s] ----------------------------- Captured stdout call -----------------------------
[   20s] --- foo/bar.py	(original)
[   20s] +++ foo/bar.py	(refactored)
[   20s] @@ -1,9 +1,12 @@
[   20s] +from mypy_extensions import NoReturn
[   20s]  
[   20s]  class A(object): pass
[   20s]  
[   20s]  def f(x):
[   20s] +    # type: (A) -> A
[   20s]      return x
[   20s]  
[   20s]  def main():
[   20s] +    # type: () -> NoReturn
[   20s]      f(A())
[   20s]      f(A())
[   20s] ----------------------------- Captured stderr call -----------------------------
Dominant language
Python
Stars
1.4k
Forks
59
PR merge metrics
No merged PRs in 30d

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from dropbox/pyannotate

All issues in dropbox/pyannotate

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.