1
1
# pylint:disable=C0111
2
2
import os
3
- from typing import AnyStr , IO , Union
3
+ from typing import IO , AnyStr , Union , cast
4
4
5
- import maxminddb .reader
6
-
7
- try :
8
- import maxminddb .extension
9
- except ImportError :
10
- maxminddb .extension = None # type: ignore
11
-
12
- from maxminddb .const import (
5
+ from .const import (
13
6
MODE_AUTO ,
14
- MODE_MMAP ,
15
- MODE_MMAP_EXT ,
7
+ MODE_FD ,
16
8
MODE_FILE ,
17
9
MODE_MEMORY ,
18
- MODE_FD ,
10
+ MODE_MMAP ,
11
+ MODE_MMAP_EXT ,
19
12
)
20
- from maxminddb .decoder import InvalidDatabaseError
21
- from maxminddb .reader import Reader as PyReader
13
+ from .decoder import InvalidDatabaseError
14
+ from .reader import Reader
15
+
16
+ try :
17
+ # pylint: disable=import-self
18
+ from . import extension as _extension
19
+ except ImportError :
20
+ _extension = None # type: ignore[assignment]
21
+
22
+
23
+ __all__ = [
24
+ "InvalidDatabaseError" ,
25
+ "MODE_AUTO" ,
26
+ "MODE_FD" ,
27
+ "MODE_FILE" ,
28
+ "MODE_MEMORY" ,
29
+ "MODE_MMAP" ,
30
+ "MODE_MMAP_EXT" ,
31
+ "Reader" ,
32
+ "open_database" ,
33
+ ]
22
34
23
35
24
36
def open_database (
25
- database : Union [AnyStr , int , os .PathLike , IO ], mode : int = MODE_AUTO
26
- ) -> Union [PyReader , "maxminddb.extension.Reader" ]:
37
+ database : Union [AnyStr , int , os .PathLike , IO ],
38
+ mode : int = MODE_AUTO ,
39
+ ) -> Reader :
27
40
"""Open a MaxMind DB database
28
41
29
42
Arguments:
@@ -39,21 +52,32 @@ def open_database(
39
52
* MODE_AUTO - tries MODE_MMAP_EXT, MODE_MMAP, MODE_FILE in that
40
53
order. Default mode.
41
54
"""
42
- has_extension = maxminddb .extension and hasattr (maxminddb .extension , "Reader" )
43
- if (mode == MODE_AUTO and has_extension ) or mode == MODE_MMAP_EXT :
44
- if not has_extension :
45
- raise ValueError (
46
- "MODE_MMAP_EXT requires the maxminddb.extension module to be available"
47
- )
48
- return maxminddb .extension .Reader (database )
49
- if mode in (MODE_AUTO , MODE_MMAP , MODE_FILE , MODE_MEMORY , MODE_FD ):
50
- return PyReader (database , mode )
51
- raise ValueError (f"Unsupported open mode: { mode } " )
52
-
53
-
54
- def Reader (database ): # pylint: disable=invalid-name
55
- """This exists for backwards compatibility. Use open_database instead"""
56
- return open_database (database )
55
+ if mode not in (
56
+ MODE_AUTO ,
57
+ MODE_FD ,
58
+ MODE_FILE ,
59
+ MODE_MEMORY ,
60
+ MODE_MMAP ,
61
+ MODE_MMAP_EXT ,
62
+ ):
63
+ raise ValueError (f"Unsupported open mode: { mode } " )
64
+
65
+ has_extension = _extension and hasattr (_extension , "Reader" )
66
+ use_extension = has_extension if mode == MODE_AUTO else mode == MODE_MMAP_EXT
67
+
68
+ if not use_extension :
69
+ return Reader (database , mode )
70
+
71
+ if not has_extension :
72
+ raise ValueError (
73
+ "MODE_MMAP_EXT requires the maxminddb.extension module to be available"
74
+ )
75
+
76
+ # The C type exposes the same API as the Python Reader, so for type
77
+ # checking purposes, pretend it is one. (Ideally this would be a subclass
78
+ # of, or share a common parent class with, the Python Reader
79
+ # implementation.)
80
+ return cast (Reader , _extension .Reader (database , mode ))
57
81
58
82
59
83
__title__ = "maxminddb"
0 commit comments