Skip to content

Commit 284dae9

Browse files
authored
Fix: Resolve pylint naming convention warnings in provider modules (#273)
* Fix pylint naming convention issues in provider modules - Rename module-level variables from _UPPERCASE to _lowercase - Add pylint disable comments for CI compatibility - Variables are not constants as they're modified at runtime * Trigger CI re-run
1 parent 6e36c37 commit 284dae9

File tree

4 files changed

+46
-46
lines changed

4 files changed

+46
-46
lines changed

langextract/providers/__init__.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
]
4545

4646
# Track provider loading for lazy initialization
47-
_PLUGINS_LOADED = False
48-
_BUILTINS_LOADED = False
47+
_plugins_loaded = False # pylint: disable=invalid-name
48+
_builtins_loaded = False # pylint: disable=invalid-name
4949

5050

5151
def load_builtins_once() -> None:
@@ -56,9 +56,9 @@ def load_builtins_once() -> None:
5656
can be re-registered after registry.clear() even if their modules
5757
are already in sys.modules.
5858
"""
59-
global _BUILTINS_LOADED # pylint: disable=global-statement
59+
global _builtins_loaded # pylint: disable=global-statement
6060

61-
if _BUILTINS_LOADED:
61+
if _builtins_loaded:
6262
return
6363

6464
# Register built-ins lazily so they can be re-registered after a registry.clear()
@@ -70,7 +70,7 @@ def load_builtins_once() -> None:
7070
priority=config['priority'],
7171
)
7272

73-
_BUILTINS_LOADED = True
73+
_builtins_loaded = True
7474

7575

7676
def load_plugins_once() -> None:
@@ -79,8 +79,8 @@ def load_plugins_once() -> None:
7979
Discovers and loads langextract provider plugins using entry points.
8080
This function is idempotent - multiple calls have no effect.
8181
"""
82-
global _PLUGINS_LOADED # pylint: disable=global-statement
83-
if _PLUGINS_LOADED:
82+
global _plugins_loaded # pylint: disable=global-statement
83+
if _plugins_loaded:
8484
return
8585

8686
# Check if plugin loading is disabled
@@ -90,7 +90,7 @@ def load_plugins_once() -> None:
9090
'yes',
9191
):
9292
logging.info('Plugin loading disabled via LANGEXTRACT_DISABLE_PLUGINS')
93-
_PLUGINS_LOADED = True
93+
_plugins_loaded = True
9494
return
9595

9696
# Load built-in providers first
@@ -144,14 +144,14 @@ def load_plugins_once() -> None:
144144
except Exception as e:
145145
logging.warning('Error discovering provider plugins: %s', e)
146146

147-
_PLUGINS_LOADED = True
147+
_plugins_loaded = True
148148

149149

150150
def _reset_for_testing() -> None:
151151
"""Reset plugin loading state for testing. Should only be used in tests."""
152-
global _PLUGINS_LOADED, _BUILTINS_LOADED # pylint: disable=global-statement
153-
_PLUGINS_LOADED = False
154-
_BUILTINS_LOADED = False
152+
global _plugins_loaded, _builtins_loaded # pylint: disable=global-statement
153+
_plugins_loaded = False
154+
_builtins_loaded = False
155155

156156

157157
def __getattr__(name: str):
@@ -160,8 +160,8 @@ def __getattr__(name: str):
160160
return importlib.import_module('langextract.providers.router')
161161
elif name == 'schemas':
162162
return importlib.import_module('langextract.providers.schemas')
163-
elif name == '_PLUGINS_LOADED':
164-
return _PLUGINS_LOADED
165-
elif name == '_BUILTINS_LOADED':
166-
return _BUILTINS_LOADED
163+
elif name == '_plugins_loaded':
164+
return _plugins_loaded
165+
elif name == '_builtins_loaded':
166+
return _builtins_loaded
167167
raise AttributeError(f'module {__name__!r} has no attribute {name!r}')

langextract/providers/router.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class _Entry:
4646
priority: int
4747

4848

49-
_ENTRIES: list[_Entry] = []
50-
_ENTRY_KEYS: set[tuple[str, tuple[str, ...], int]] = (
49+
_entries: list[_Entry] = [] # pylint: disable=invalid-name
50+
_entry_keys: set[tuple[str, tuple[str, ...], int]] = ( # pylint: disable=invalid-name
5151
set()
5252
) # (provider_id, patterns, priority)
5353

@@ -61,7 +61,7 @@ def _add_entry(
6161
) -> None:
6262
"""Add an entry to the registry with deduplication."""
6363
key = (provider_id, tuple(p.pattern for p in patterns), priority)
64-
if key in _ENTRY_KEYS:
64+
if key in _entry_keys:
6565
logging.debug(
6666
"Skipping duplicate registration for %s with patterns %s at"
6767
" priority %d",
@@ -70,8 +70,8 @@ def _add_entry(
7070
priority,
7171
)
7272
return
73-
_ENTRY_KEYS.add(key)
74-
_ENTRIES.append(_Entry(patterns=patterns, loader=loader, priority=priority))
73+
_entry_keys.add(key)
74+
_entries.append(_Entry(patterns=patterns, loader=loader, priority=priority))
7575
logging.debug(
7676
"Registered provider %s with patterns %s at priority %d",
7777
provider_id,
@@ -151,13 +151,13 @@ def resolve(model_id: str) -> type[base_model.BaseLanguageModel]:
151151
# Providers should be loaded by the caller (e.g., factory.create_model)
152152
# Router doesn't load providers to avoid circular dependencies
153153

154-
sorted_entries = sorted(_ENTRIES, key=lambda e: e.priority, reverse=True)
154+
sorted_entries = sorted(_entries, key=lambda e: e.priority, reverse=True)
155155

156156
for entry in sorted_entries:
157157
if any(pattern.search(model_id) for pattern in entry.patterns):
158158
return entry.loader()
159159

160-
available_patterns = [str(p.pattern) for e in _ENTRIES for p in e.patterns]
160+
available_patterns = [str(p.pattern) for e in _entries for p in e.patterns]
161161
raise exceptions.InferenceConfigError(
162162
f"No provider registered for model_id={model_id!r}. "
163163
f"Available patterns: {available_patterns}\n"
@@ -185,12 +185,12 @@ class name (e.g., "GeminiLanguageModel").
185185
# Providers should be loaded by the caller (e.g., factory.create_model)
186186
# Router doesn't load providers to avoid circular dependencies
187187

188-
for entry in _ENTRIES:
188+
for entry in _entries:
189189
for pattern in entry.patterns:
190190
if pattern.pattern == f"^{re.escape(provider_name)}$":
191191
return entry.loader()
192192

193-
for entry in _ENTRIES:
193+
for entry in _entries:
194194
try:
195195
provider_class = entry.loader()
196196
class_name = provider_class.__name__
@@ -201,7 +201,7 @@ class name (e.g., "GeminiLanguageModel").
201201

202202
try:
203203
pattern = re.compile(f"^{provider_name}$", re.IGNORECASE)
204-
for entry in _ENTRIES:
204+
for entry in _entries:
205205
for entry_pattern in entry.patterns:
206206
if pattern.pattern == entry_pattern.pattern:
207207
return entry.loader()
@@ -216,9 +216,9 @@ class name (e.g., "GeminiLanguageModel").
216216

217217
def clear() -> None:
218218
"""Clear all registered providers. Mainly for testing."""
219-
global _ENTRIES # pylint: disable=global-statement
220-
_ENTRIES = []
221-
_ENTRY_KEYS.clear() # Also clear dedup keys to allow re-registration
219+
global _entries # pylint: disable=global-statement
220+
_entries = []
221+
_entry_keys.clear() # Also clear dedup keys to allow re-registration
222222
resolve.cache_clear()
223223
resolve_provider.cache_clear()
224224

@@ -231,7 +231,7 @@ def list_providers() -> list[tuple[tuple[str, ...], int]]:
231231
"""
232232
return [
233233
(tuple(p.pattern for p in entry.patterns), entry.priority)
234-
for entry in _ENTRIES
234+
for entry in _entries
235235
]
236236

237237

@@ -241,4 +241,4 @@ def list_entries() -> list[tuple[list[str], int]]:
241241
Returns:
242242
List of (patterns, priority) tuples.
243243
"""
244-
return [([p.pattern for p in e.patterns], e.priority) for e in _ENTRIES]
244+
return [([p.pattern for p in e.patterns], e.priority) for e in _entries]

tests/factory_test.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def setUp(self):
7272
router.clear()
7373
import langextract.providers as providers_module # pylint: disable=import-outside-toplevel
7474

75-
providers_module._PLUGINS_LOADED = True
75+
providers_module._plugins_loaded = True
7676
# Use direct registration for test providers to avoid module path issues
7777
router.register(r"^gemini", priority=100)(FakeGeminiProvider)
7878
router.register(r"^gpt", r"^o1", priority=100)(FakeOpenAIProvider)
@@ -82,7 +82,7 @@ def tearDown(self):
8282
router.clear()
8383
import langextract.providers as providers_module # pylint: disable=import-outside-toplevel
8484

85-
providers_module._PLUGINS_LOADED = False
85+
providers_module._plugins_loaded = False
8686

8787
def test_create_model_basic(self):
8888
"""Test basic model creation."""
@@ -341,8 +341,8 @@ def test_raises_error_when_neither_model_id_nor_provider_specified(self):
341341

342342
def test_gemini_vertexai_parameters_accepted(self):
343343
"""Test that Vertex AI parameters are properly passed to Gemini provider."""
344-
original_entries = router._ENTRIES.copy() # pylint: disable=protected-access
345-
original_keys = router._ENTRY_KEYS.copy() # pylint: disable=protected-access
344+
original_entries = router._entries.copy() # pylint: disable=protected-access
345+
original_keys = router._entry_keys.copy() # pylint: disable=protected-access
346346

347347
try:
348348

@@ -385,13 +385,13 @@ def infer(self, batch_prompts, **kwargs):
385385
self.assertEqual(model.location, "us-central1")
386386
self.assertIsNone(model.api_key)
387387
finally:
388-
router._ENTRIES = original_entries # pylint: disable=protected-access
389-
router._ENTRY_KEYS = original_keys # pylint: disable=protected-access
388+
router._entries = original_entries # pylint: disable=protected-access
389+
router._entry_keys = original_keys # pylint: disable=protected-access
390390

391391
def test_gemini_vertexai_with_credentials(self):
392392
"""Test that Vertex AI credentials can be passed through."""
393-
original_entries = router._ENTRIES.copy() # pylint: disable=protected-access
394-
original_keys = router._ENTRY_KEYS.copy() # pylint: disable=protected-access
393+
original_entries = router._entries.copy() # pylint: disable=protected-access
394+
original_keys = router._entry_keys.copy() # pylint: disable=protected-access
395395

396396
try:
397397

@@ -417,8 +417,8 @@ def infer(self, batch_prompts, **kwargs):
417417

418418
self.assertEqual(model.credentials, mock_credentials)
419419
finally:
420-
router._ENTRIES = original_entries # pylint: disable=protected-access
421-
router._ENTRY_KEYS = original_keys # pylint: disable=protected-access
420+
router._entries = original_entries # pylint: disable=protected-access
421+
router._entry_keys = original_keys # pylint: disable=protected-access
422422

423423

424424
if __name__ == "__main__":

tests/provider_plugin_test.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def test_plugin_priority_override_core_provider(self):
218218
"""Plugin with higher priority should override core provider on conflicts."""
219219

220220
lx.providers.registry.clear()
221-
lx.providers._PLUGINS_LOADED = False
221+
lx.providers._plugins_loaded = False
222222

223223
def _ep_load():
224224
@lx.providers.registry.register(r"^gemini", priority=50)
@@ -250,7 +250,7 @@ def test_resolve_provider_for_plugin(self):
250250
"""resolve_provider should find plugin by class name and name-insensitive."""
251251

252252
lx.providers.registry.clear()
253-
lx.providers._PLUGINS_LOADED = False
253+
lx.providers._plugins_loaded = False
254254

255255
def _ep_load():
256256
@lx.providers.registry.register(r"^plugin-resolve")
@@ -437,9 +437,9 @@ def infer(self, batch_prompts, **kwargs):
437437

438438
# Clear and set up registry
439439
lx.providers.registry.clear()
440-
lx.providers._PLUGINS_LOADED = False
440+
lx.providers._plugins_loaded = False
441441
self.addCleanup(lx.providers.registry.clear)
442-
self.addCleanup(setattr, lx.providers, "_PLUGINS_LOADED", False)
442+
self.addCleanup(setattr, lx.providers, "_plugins_loaded", False)
443443

444444
with mock.patch.object(
445445
metadata, "entry_points", return_value=_create_mock_entry_points([ep])
@@ -673,7 +673,7 @@ def infer(self, batch_prompts, **kwargs):
673673
)
674674

675675
lx.providers.registry.clear()
676-
lx.providers._PLUGINS_LOADED = False
676+
lx.providers._plugins_loaded = False
677677
lx.providers.load_plugins_once()
678678

679679
with self.assertRaisesRegex(

0 commit comments

Comments
 (0)