Skip to content

Commit fab1d4e

Browse files
committed
Turn auto completion modes into an Enum
1 parent eef933f commit fab1d4e

File tree

4 files changed

+68
-29
lines changed

4 files changed

+68
-29
lines changed

bpython/autocomplete.py

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import rlcompleter
3333
import builtins
3434

35+
from enum import Enum
3536
from . import inspection
3637
from . import importcompletion
3738
from . import line as lineparts
@@ -41,11 +42,17 @@
4142

4243

4344
# Autocomplete modes
44-
SIMPLE = "simple"
45-
SUBSTRING = "substring"
46-
FUZZY = "fuzzy"
45+
class AutocompleteModes(Enum):
46+
SIMPLE = "simple"
47+
SUBSTRING = "substring"
48+
FUZZY = "fuzzy"
49+
50+
@classmethod
51+
def from_string(cls, value):
52+
if value in cls.__members__:
53+
return cls.__members__[value]
54+
return None
4755

48-
ALL_MODES = (SIMPLE, SUBSTRING, FUZZY)
4956

5057
MAGIC_METHODS = tuple(
5158
f"__{s}__"
@@ -189,16 +196,16 @@ def method_match_fuzzy(word, size, text):
189196

190197

191198
MODES_MAP = {
192-
SIMPLE: method_match_simple,
193-
SUBSTRING: method_match_substring,
194-
FUZZY: method_match_fuzzy,
199+
AutocompleteModes.SIMPLE: method_match_simple,
200+
AutocompleteModes.SUBSTRING: method_match_substring,
201+
AutocompleteModes.FUZZY: method_match_fuzzy,
195202
}
196203

197204

198205
class BaseCompletionType:
199206
"""Describes different completion types"""
200207

201-
def __init__(self, shown_before_tab=True, mode=SIMPLE):
208+
def __init__(self, shown_before_tab=True, mode=AutocompleteModes.SIMPLE):
202209
self._shown_before_tab = shown_before_tab
203210
self.method_match = MODES_MAP[mode]
204211

@@ -248,7 +255,7 @@ def shown_before_tab(self):
248255
class CumulativeCompleter(BaseCompletionType):
249256
"""Returns combined matches from several completers"""
250257

251-
def __init__(self, completers, mode=SIMPLE):
258+
def __init__(self, completers, mode=AutocompleteModes.SIMPLE):
252259
if not completers:
253260
raise ValueError(
254261
"CumulativeCompleter requires at least one completer"
@@ -289,7 +296,7 @@ def format(self, word):
289296

290297

291298
class FilenameCompletion(BaseCompletionType):
292-
def __init__(self, mode=SIMPLE):
299+
def __init__(self, mode=AutocompleteModes.SIMPLE):
293300
super().__init__(False, mode)
294301

295302
def safe_glob(self, pathname):
@@ -649,7 +656,7 @@ def get_completer(completers, cursor_offset, line, **kwargs):
649656
return [], None
650657

651658

652-
def get_default_completer(mode=SIMPLE):
659+
def get_default_completer(mode=AutocompleteModes.SIMPLE):
653660
return (
654661
DictKeyCompletion(mode=mode),
655662
ImportCompletion(mode=mode),

bpython/config.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
from itertools import chain
55
from configparser import ConfigParser
66

7-
from .autocomplete import SIMPLE as default_completion, ALL_MODES
7+
from .autocomplete import AutocompleteModes
8+
9+
default_completion = AutocompleteModes.SIMPLE
810

911

1012
class Struct:
@@ -234,7 +236,9 @@ def get_key_no_doublebind(command):
234236
struct.complete_magic_methods = config.getboolean(
235237
"general", "complete_magic_methods"
236238
)
237-
struct.autocomplete_mode = config.get("general", "autocomplete_mode")
239+
struct.autocomplete_mode = AutocompleteModes.from_string(
240+
config.get("general", "autocomplete_mode")
241+
)
238242
struct.save_append_py = config.getboolean("general", "save_append_py")
239243

240244
struct.curtsies_list_above = config.getboolean("curtsies", "list_above")
@@ -282,7 +286,7 @@ def get_key_no_doublebind(command):
282286
struct.hist_file = os.path.expanduser(struct.hist_file)
283287

284288
# verify completion mode
285-
if struct.autocomplete_mode not in ALL_MODES:
289+
if struct.autocomplete_mode is None:
286290
struct.autocomplete_mode = default_completion
287291

288292
# set box drawing characters

bpython/curtsiesfrontend/repl.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ def __init__(
347347
else:
348348
banner = None
349349
# only one implemented currently
350-
config.autocomplete_mode = autocomplete.SIMPLE
350+
config.autocomplete_mode = autocomplete.AutocompleteModes.SIMPLE
351351
if config.cli_suggestion_width <= 0 or config.cli_suggestion_width > 1:
352352
config.cli_suggestion_width = 1
353353

bpython/test/test_repl.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,9 @@ def test_push(self):
364364
# COMPLETE TESTS
365365
# 1. Global tests
366366
def test_simple_global_complete(self):
367-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SIMPLE})
367+
self.repl = FakeRepl(
368+
{"autocomplete_mode": autocomplete.AutocompleteModes.SIMPLE}
369+
)
368370
self.set_input_line("d")
369371

370372
self.assertTrue(self.repl.complete())
@@ -375,7 +377,9 @@ def test_simple_global_complete(self):
375377
)
376378

377379
def test_substring_global_complete(self):
378-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SUBSTRING})
380+
self.repl = FakeRepl(
381+
{"autocomplete_mode": autocomplete.AutocompleteModes.SUBSTRING}
382+
)
379383
self.set_input_line("time")
380384

381385
self.assertTrue(self.repl.complete())
@@ -385,7 +389,9 @@ def test_substring_global_complete(self):
385389
)
386390

387391
def test_fuzzy_global_complete(self):
388-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.FUZZY})
392+
self.repl = FakeRepl(
393+
{"autocomplete_mode": autocomplete.AutocompleteModes.FUZZY}
394+
)
389395
self.set_input_line("doc")
390396

391397
self.assertTrue(self.repl.complete())
@@ -397,7 +403,9 @@ def test_fuzzy_global_complete(self):
397403

398404
# 2. Attribute tests
399405
def test_simple_attribute_complete(self):
400-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SIMPLE})
406+
self.repl = FakeRepl(
407+
{"autocomplete_mode": autocomplete.AutocompleteModes.SIMPLE}
408+
)
401409
self.set_input_line("Foo.b")
402410

403411
code = "class Foo():\n\tdef bar(self):\n\t\tpass\n"
@@ -409,7 +417,9 @@ def test_simple_attribute_complete(self):
409417
self.assertEqual(self.repl.matches_iter.matches, ["Foo.bar"])
410418

411419
def test_substring_attribute_complete(self):
412-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SUBSTRING})
420+
self.repl = FakeRepl(
421+
{"autocomplete_mode": autocomplete.AutocompleteModes.SUBSTRING}
422+
)
413423
self.set_input_line("Foo.az")
414424

415425
code = "class Foo():\n\tdef baz(self):\n\t\tpass\n"
@@ -421,7 +431,9 @@ def test_substring_attribute_complete(self):
421431
self.assertEqual(self.repl.matches_iter.matches, ["Foo.baz"])
422432

423433
def test_fuzzy_attribute_complete(self):
424-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.FUZZY})
434+
self.repl = FakeRepl(
435+
{"autocomplete_mode": autocomplete.AutocompleteModes.FUZZY}
436+
)
425437
self.set_input_line("Foo.br")
426438

427439
code = "class Foo():\n\tdef bar(self):\n\t\tpass\n"
@@ -434,7 +446,9 @@ def test_fuzzy_attribute_complete(self):
434446

435447
# 3. Edge cases
436448
def test_updating_namespace_complete(self):
437-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SIMPLE})
449+
self.repl = FakeRepl(
450+
{"autocomplete_mode": autocomplete.AutocompleteModes.SIMPLE}
451+
)
438452
self.set_input_line("foo")
439453
self.repl.push("foobar = 2")
440454

@@ -443,15 +457,19 @@ def test_updating_namespace_complete(self):
443457
self.assertEqual(self.repl.matches_iter.matches, ["foobar"])
444458

445459
def test_file_should_not_appear_in_complete(self):
446-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SIMPLE})
460+
self.repl = FakeRepl(
461+
{"autocomplete_mode": autocomplete.AutocompleteModes.SIMPLE}
462+
)
447463
self.set_input_line("_")
448464
self.assertTrue(self.repl.complete())
449465
self.assertTrue(hasattr(self.repl.matches_iter, "matches"))
450466
self.assertNotIn("__file__", self.repl.matches_iter.matches)
451467

452468
# 4. Parameter names
453469
def test_paremeter_name_completion(self):
454-
self.repl = FakeRepl({"autocomplete_mode": autocomplete.SIMPLE})
470+
self.repl = FakeRepl(
471+
{"autocomplete_mode": autocomplete.AutocompleteModes.SIMPLE}
472+
)
455473
self.set_input_line("foo(ab")
456474

457475
code = "def foo(abc=1, abd=2, xyz=3):\n\tpass\n"
@@ -515,7 +533,9 @@ def test_simple_tab_complete(self):
515533
@unittest.skip("disabled while non-simple completion is disabled")
516534
def test_substring_tab_complete(self):
517535
self.repl.s = "bar"
518-
self.repl.config.autocomplete_mode = autocomplete.FUZZY
536+
self.repl.config.autocomplete_mode = (
537+
autocomplete.AutocompleteModes.FUZZY
538+
)
519539
self.repl.tab()
520540
self.assertEqual(self.repl.s, "foobar")
521541
self.repl.tab()
@@ -524,7 +544,9 @@ def test_substring_tab_complete(self):
524544
@unittest.skip("disabled while non-simple completion is disabled")
525545
def test_fuzzy_tab_complete(self):
526546
self.repl.s = "br"
527-
self.repl.config.autocomplete_mode = autocomplete.FUZZY
547+
self.repl.config.autocomplete_mode = (
548+
autocomplete.AutocompleteModes.FUZZY
549+
)
528550
self.repl.tab()
529551
self.assertEqual(self.repl.s, "foobar")
530552

@@ -561,7 +583,9 @@ def test_back_parameter(self):
561583
def test_fuzzy_attribute_tab_complete(self):
562584
"""Test fuzzy attribute with no text"""
563585
self.repl.s = "Foo."
564-
self.repl.config.autocomplete_mode = autocomplete.FUZZY
586+
self.repl.config.autocomplete_mode = (
587+
autocomplete.AutocompleteModes.FUZZY
588+
)
565589

566590
self.repl.tab()
567591
self.assertEqual(self.repl.s, "Foo.foobar")
@@ -570,7 +594,9 @@ def test_fuzzy_attribute_tab_complete(self):
570594
def test_fuzzy_attribute_tab_complete2(self):
571595
"""Test fuzzy attribute with some text"""
572596
self.repl.s = "Foo.br"
573-
self.repl.config.autocomplete_mode = autocomplete.FUZZY
597+
self.repl.config.autocomplete_mode = (
598+
autocomplete.AutocompleteModes.FUZZY
599+
)
574600

575601
self.repl.tab()
576602
self.assertEqual(self.repl.s, "Foo.foobar")
@@ -588,7 +614,9 @@ def test_simple_expand(self):
588614

589615
@unittest.skip("disabled while non-simple completion is disabled")
590616
def test_substring_expand_forward(self):
591-
self.repl.config.autocomplete_mode = autocomplete.SUBSTRING
617+
self.repl.config.autocomplete_mode = (
618+
autocomplete.AutocompleteModes.SUBSTRING
619+
)
592620
self.repl.s = "ba"
593621
self.repl.tab()
594622
self.assertEqual(self.repl.s, "bar")

0 commit comments

Comments
 (0)