Test failures on Python 3.12
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
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
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dropbox/pyannotate
-
Difficulty 4/5 3-5 days Newbie friendliness 35/100
dropbox/pyannotate#124 · 3 reactions ·
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
dropbox/pyannotate#115 ·
-
Difficulty 3/5 1-2 days Newbie friendliness 35/100
dropbox/pyannotate#109 ·
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
dropbox/pyannotate#103 · 6 comments · 1 reaction ·
-
Difficulty 4/5 3-5 days Newbie friendliness 42/100
dropbox/pyannotate#102 ·
All issues in dropbox/pyannotate
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
UKGovernmentBEIS/inspect_ai#5781 ·
Maintainers usually reply within 2 days
-
Bump .cicd to wamp-cicd 4c2f9ac: `just land` refuses open A18 decisions, `just where` lists themOpen
Difficulty 1/5 Under an hour Newbie friendliness 82/100
crossbario/cfxdb#139 ·
-
Bump .cicd to wamp-cicd 4c2f9ac: `just land` refuses open A18 decisions, `just where` lists themOpen
Difficulty 1/5 Under an hour Newbie friendliness 84/100
crossbario/txaio#241 ·
-
UX
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
mediajunkie/piper-morgan-product#1963 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 64/100