Repository navigation
Tab completion for dict key causes crash #917
Copy link
Copy link
Closed
Milestone
Description
This issue is not reproducible with several different dicts that I've tried, but it can be reproduced with the dict below.
my_dict = {
'Circle': {'Ellipse',
'Shape',
'ShapeDriver'},
'Ellipse': {'Shape'},
'Rectangle': {'Shape'},
'Shape': {'Circle'},
'ShapeDriver': {'Circle',
'Ellipse',
'Shape'},
'Square': {'Rectangle'}
}
Steps to recreate:
- create new
dict - type
my_dict[ - press key to use tab-completion
- crash
~ % bpython
bpython version 0.21 on top of Python 3.8.2 /Library/Developer/CommandLineTools/usr/bin/python3
>>> my_dict = {
... 'a/Circle': {'Ellipse',
... 'Shape',
... 'ShapeDriver'},
...
... 'a/Ellipse': {'Shape'},
...
... 'a/Rectangle': {'Shape'},
...
... 'a/Shape': {'Circle'},
...
... 'a/ShapeDriver': {'Circle',
... 'Ellipse',
... 'Shape'},
...
... 'a/Square': {'Rectangle'}
... }
>>> my_dict['b/banana']
Traceback (most recent call last):
File "/Users/arian/Library/Python/3.8/bin/bpython", line 8, in <module>
sys.exit(main())
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/curtsies.py", line 201, in main
exit_value = repl.mainloop(True, paste)
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/curtsies.py", line 121, in mainloop
self.process_event_and_paint(e)
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/curtsies.py", line 85, in process_event_and_paint
self.process_event(e)
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/curtsiesfrontend/repl.py", line 615, in process_event
return self.process_key_event(e)
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/curtsiesfrontend/repl.py", line 757, in process_key_event
self.on_tab()
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/curtsiesfrontend/repl.py", line 891, in on_tab
cursor_and_line = self.matches_iter.substitute_cseq()
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/repl.py", line 297, in substitute_cseq
self.update(
File "/Users/arian/Library/Python/3.8/lib/python/site-packages/bpython/repl.py", line 318, in update
self.start, self.end, self.current_word = self.completer.locate(
TypeError: cannot unpack non-iterable NoneType object
Metadata
Metadata
Assignees
Labels
No labels

Activity
thomasballinger commentedon Sep 26, 2021
Thanks for reporting! @arian-deimling you mentioned wanting to work on something earlier, do you want to give this a shot?
arian-deimling commentedon Sep 26, 2021
Sure
arian-deimling commentedon Sep 27, 2021
Hey, I found the issue, it's this line right here
bpython/bpython/line.py
Line 37 in b66a29f
r"""[\w_][\w0-9._]*\[([\w0-9._(), '"]*)"""______________________^^^^^^^^^^^^^^^^ this is the cause of the bugIt's using that regex to capture the current key of the dictionary for which it is showing text completion of keys in the interactive terminal, and the key portion of the dictionary in that regex is too restrictive. The text completion works better with the following regex:
r"""[\w_][\w0-9._]*\[(.*)"""______________________^^ something like this is how to fix the bugDoes this seem like a good adjustment to make?
Also, with this change there is still an issue; now, if you do the following in a bython interactive session, you cannot tab-complete the key for
my_dict:I'll keep working on this to find out why the tab completion isn't working (I'm guessing it's another regex issue).
thomasballinger commentedon Sep 27, 2021
That seems like the right place to be adjusting to me.
(.*)seems too general because it won't stop matching even when you've close the quotes or the square bracket of an index, something like "anything but a single or double quote" would be closer.arian-deimling commentedon Sep 27, 2021
@thomasballinger Got the bug fixed and submitted pull request #920. Please let me know if there is an issue with the pull request; this is my first time contributing to an open source project!