Skip to content

Commit

Permalink
Providers private package (AnalogJ#1689)
Browse files Browse the repository at this point in the history
* Prepare context manager

* Prepare tests

* Move providers in a private package

* Remove self.action state

* Fix tests

* Better types

* Update documentation

* Thread safety

* Implement cleanup(), fully document deprecation

* Fix issue

* Update lockfile

* Fix deprecation

* Document

* Define complete _private package

* Fix mocks

* Cleanup and prepare deprecation messages
  • Loading branch information
adferrand authored Aug 12, 2023
1 parent dc3d0d6 commit 58cf9eb
Show file tree
Hide file tree
Showing 105 changed files with 234 additions and 182 deletions.
30 changes: 26 additions & 4 deletions src/lexicon/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,26 @@
"""
lexicon - a DNS provider agnostic api to manipulate records.
"""
__author__ = "Jason Kulatunga"
import sys
import warnings
from types import ModuleType

from lexicon._private import cli as _cli
from lexicon._private import discovery as _discovery
from lexicon._private import parser as _parser


class DeprecatedModule(ModuleType):
def __init__(self, module: ModuleType, name: str):
super().__init__(name)
self._module = module

def __getattr__(self, item):
warnings.warn(
f"Module {self.__name__} is deprecated and will be removed in Lexicon 4>=",
DeprecationWarning,
stacklevel=2,
)
return getattr(self._module, item)


sys.modules["lexicon.cli"] = DeprecatedModule(_cli, "lexicon.cli")
sys.modules["lexicon.parser"] = DeprecatedModule(_parser, "lexicon.parser")
sys.modules["lexicon.discovery"] = DeprecatedModule(_discovery, "lexicon.discovery")
Empty file.
4 changes: 2 additions & 2 deletions src/lexicon/cli.py → src/lexicon/_private/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
import logging
import os
import sys
from typing import Dict, List, Optional, Union
import warnings
from typing import Dict, List, Optional, Union

from lexicon._private.parser import generate_cli_main_parser
from lexicon.client import Client
from lexicon.config import ConfigResolver
from lexicon.parser import generate_cli_main_parser

logger = logging.getLogger(__name__)

Expand Down
10 changes: 8 additions & 2 deletions src/lexicon/discovery.py → src/lexicon/_private/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,26 @@
* what are the providers installed, and available
* what is the version of Lexicon
"""
import importlib
import pkgutil
import re
from types import ModuleType
from typing import Dict

try:
from importlib.metadata import Distribution, PackageNotFoundError
except ModuleNotFoundError:
from importlib_metadata import Distribution, PackageNotFoundError # type: ignore[assignment]

from lexicon import providers
from lexicon._private import providers as _providers


def find_providers() -> Dict[str, bool]:
"""Find all providers registered in Lexicon, and their availability"""
providers_list = sorted(
{
modname
for (_, modname, _) in pkgutil.iter_modules(providers.__path__) # type: ignore
for (_, modname, _) in pkgutil.iter_modules(_providers.__path__) # type: ignore
if modname != "base"
}
)
Expand All @@ -36,6 +38,10 @@ def find_providers() -> Dict[str, bool]:
}


def load_provider_module(provider_name: str) -> ModuleType:
return importlib.import_module(f"{_providers.__name__}.{provider_name}")


def lexicon_version() -> str:
"""Retrieve current Lexicon version"""
try:
Expand Down
15 changes: 9 additions & 6 deletions src/lexicon/parser.py → src/lexicon/_private/parser.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
"""Parsers definition for the Lexicon command-line interface"""
import argparse
import importlib
import os
from typing import Type

from lexicon import discovery
from lexicon.providers.base import Provider
from lexicon._private.discovery import (
find_providers,
lexicon_version,
load_provider_module,
)
from lexicon.interfaces import Provider


def generate_base_provider_parser() -> argparse.ArgumentParser:
Expand Down Expand Up @@ -63,7 +66,7 @@ def generate_cli_main_parser() -> argparse.ArgumentParser:
"--version",
help="show the current version of lexicon",
action="version",
version=f"%(prog)s {discovery.lexicon_version()}",
version=f"%(prog)s {lexicon_version()}",
)
parser.add_argument("--delegated", help="specify the delegated domain")
parser.add_argument(
Expand All @@ -78,8 +81,8 @@ def generate_cli_main_parser() -> argparse.ArgumentParser:
)
subparsers.required = True

for provider, available in discovery.find_providers().items():
provider_module = importlib.import_module("lexicon.providers." + provider)
for provider, available in find_providers().items():
provider_module = load_provider_module(provider)
provider_class: Type[Provider] = getattr(provider_module, "Provider")

subparser = subparsers.add_parser(
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
"""Module provider for auto"""
import importlib
import logging
import pkgutil
import re
Expand All @@ -10,8 +9,9 @@
import tldextract # type: ignore

from lexicon import config as helper_config
from lexicon import providers
from lexicon.providers.base import Provider as BaseProvider
from lexicon._private import providers
from lexicon._private.discovery import load_provider_module
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand All @@ -21,9 +21,7 @@ def _get_available_providers():
for _, modname, _ in pkgutil.iter_modules(providers.__path__):
if modname not in ("base", "auto"):
try:
available_providers[modname] = importlib.import_module(
"lexicon.providers." + modname
)
available_providers[modname] = load_provider_module(modname)
except ImportError:
LOGGER.warning(
"Warning, the provider %s cannot be loaded due "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from cryptography.hazmat.primitives import hashes

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import requests

from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from cryptography.hazmat.primitives import hashes

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

# dnspython is an optional dependency of lexicon; do not throw an ImportError if
# the dependency is unmet.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import requests

from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from requests.auth import HTTPBasicAuth

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from urllib3.util.retry import Retry # type: ignore

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

try:
import dns.name
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from bs4 import BeautifulSoup, Tag # type: ignore
from requests import Response, Session

from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import requests

from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import requests

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

try:
import xmlrpclib # type: ignore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from requests.auth import HTTPBasicAuth

from lexicon.exceptions import AuthenticationError
from lexicon.providers.base import Provider as BaseProvider
from lexicon.interfaces import Provider as BaseProvider

LOGGER = logging.getLogger(__name__)

Expand Down
Loading

0 comments on commit 58cf9eb

Please sign in to comment.