Skip to content

Commit

Permalink
chore: Remove cyclic imports in meltano.cli (meltano#7493)
Browse files Browse the repository at this point in the history
Co-authored-by: Edgar R. M. <edgar@meltano.com>
  • Loading branch information
WillDaSilva and edgarrmondragon committed Apr 5, 2023
1 parent f02ce37 commit 6c39412
Show file tree
Hide file tree
Showing 28 changed files with 83 additions and 73 deletions.
5 changes: 5 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -577,6 +577,7 @@ select = [
"PT", # flake8-pytest-style
"RSE", # flake8-raise
"SIM", # flake8-simplify
"TID", # flake8-tidy-imports
"UP", # pyupgrade
"W", # pycodestyle (warning)
]
Expand All @@ -600,3 +601,7 @@ required-imports = ["from __future__ import annotations"]

[tool.ruff.pydocstyle]
convention = "google"

[tool.ruff.flake8-tidy-imports.banned-api]
"meltano.cli.cli.command".msg = "Use `click.command` and `meltano.cli.cli.add_command` instead"
"meltano.cli.cli.group".msg = "Use `click.group` and `meltano.cli.cli.add_command` instead"
44 changes: 31 additions & 13 deletions src/meltano/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,8 @@
import sys
import typing as t

from meltano.cli.utils import CliError
from meltano.core.error import MeltanoError, ProjectReadonly
from meltano.core.logging import setup_logging

# TODO: Importing the cli.cli module breaks other cli module imports
# This suggests a cyclic dependency or a poorly structured interface.
# This should be investigated and resolved to avoid implicit behavior
# based solely on import order.
from meltano.cli.cli import cli # isort:skip
from meltano.cli import ( # isort:skip # noqa: WPS235
from meltano.cli import ( # noqa: WPS235
add,
compile,
config,
discovery,
dragon,
Expand All @@ -27,24 +17,52 @@
initialize,
install,
invoke,
job,
lock,
remove,
repl,
run,
schedule,
schema,
select,
state,
ui,
upgrade,
user,
run,
validate,
job,
)
from meltano.cli import compile as compile_module
from meltano.cli.cli import cli
from meltano.cli.utils import CliError
from meltano.core.error import MeltanoError, ProjectReadonly
from meltano.core.logging import setup_logging

if t.TYPE_CHECKING:
from meltano.core.tracking.tracker import Tracker

cli.add_command(add.add)
cli.add_command(compile_module.compile_command)
cli.add_command(config.config)
cli.add_command(discovery.discover)
cli.add_command(dragon.dragon)
cli.add_command(elt.elt)
cli.add_command(environment.meltano_environment)
cli.add_command(initialize.init)
cli.add_command(install.install)
cli.add_command(invoke.invoke)
cli.add_command(lock.lock)
cli.add_command(remove.remove)
cli.add_command(repl.repl)
cli.add_command(schedule.schedule)
cli.add_command(schema.schema)
cli.add_command(select.select)
cli.add_command(state.meltano_state)
cli.add_command(ui.ui)
cli.add_command(upgrade.upgrade)
cli.add_command(user.user)
cli.add_command(run.run)
cli.add_command(validate.test)
cli.add_command(job.job)

# Holds the exit code for error reporting during process exiting. In
# particular, a function registered by the `atexit` module uses this value.
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/add.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import (
CliError,
Expand All @@ -27,7 +26,7 @@
from meltano.core.tracking import Tracker


@cli.command( # noqa: WPS238
@click.command( # noqa: WPS238
cls=PartialInstrumentedCmd,
short_help="Add a plugin to your project.",
)
Expand Down
9 changes: 6 additions & 3 deletions src/meltano/cli/compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import CliError, InstrumentedCmd
from meltano.core.environment import Environment
Expand All @@ -21,7 +20,11 @@
from meltano.core.tracking import Tracker


@cli.command(cls=InstrumentedCmd, short_help="Compile a Meltano manifest. (beta)")
@click.command(
"compile",
cls=InstrumentedCmd,
short_help="Compile a Meltano manifest. (beta)",
)
@click.option(
"--directory",
default=".meltano/manifests",
Expand Down Expand Up @@ -49,7 +52,7 @@
)
@click.pass_context
@pass_project(migrate=True)
def compile( # noqa: WPS125
def compile_command(
project: Project,
ctx: click.Context,
directory: Path,
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import click
import dotenv

from meltano.cli import cli
from meltano.cli.interactive import InteractiveConfig
from meltano.cli.params import pass_project
from meltano.cli.utils import (
Expand Down Expand Up @@ -113,7 +112,7 @@ def get_label(metadata) -> str:
return f"from {source.label}"


@cli.group(
@click.group(
cls=InstrumentedGroup,
invoke_without_command=True,
short_help="Display Meltano or plugin configuration.",
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import InstrumentedCmd
from meltano.core.plugin import PluginType
Expand All @@ -15,7 +14,7 @@
from meltano.core.project import Project


@cli.command(
@click.command(
cls=InstrumentedCmd,
short_help="List the available plugins in Meltano Hub and their variants.",
)
Expand Down
4 changes: 1 addition & 3 deletions src/meltano/cli/dragon.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
MELTY,
)

from . import cli


@cli.command(short_help="Summon a dragon!")
@click.command(short_help="Summon a dragon!")
@click.pass_context
def dragon(ctx):
"""Summon a dragon."""
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/elt.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
import click
from structlog import stdlib as structlog_stdlib

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import CliEnvironmentBehavior, CliError, PartialInstrumentedCmd
from meltano.core.db import project_engine
Expand Down Expand Up @@ -43,7 +42,7 @@
logger = structlog_stdlib.get_logger(__name__)


@cli.command(
@click.command(
cls=PartialInstrumentedCmd,
short_help="Run an ELT pipeline to Extract, Load, and Transform data.",
environment_behavior=CliEnvironmentBehavior.environment_optional_use_default,
Expand Down
7 changes: 5 additions & 2 deletions src/meltano/cli/environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import InstrumentedGroup, PartialInstrumentedCmd
from meltano.core.environment_service import EnvironmentService
Expand All @@ -18,7 +17,11 @@
ENVIRONMENT_SERVICE_KEY = "environment_service"


@cli.group(cls=InstrumentedGroup, name="environment", short_help="Manage environments.")
@click.group(
cls=InstrumentedGroup,
name="environment",
short_help="Manage environments.",
)
@click.pass_context
@pass_project(migrate=True)
def meltano_environment(project: Project, ctx: click.Context):
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/initialize.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import database_uri_option
from meltano.cli.utils import InstrumentedCmd
from meltano.core.project_init_service import ProjectInitService
Expand All @@ -23,7 +22,7 @@
path_type = click.Path(file_okay=False, path_type=Path)


@cli.command(cls=InstrumentedCmd, short_help="Create a new Meltano project.")
@click.command(cls=InstrumentedCmd, short_help="Create a new Meltano project.")
@click.pass_context
@click.argument("project_directory", required=False, type=path_type)
@click.option(
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import CliError, PartialInstrumentedCmd, install_plugins
from meltano.core.plugin import PluginType
Expand All @@ -17,7 +16,7 @@
from meltano.core.tracking import Tracker


@cli.command(cls=PartialInstrumentedCmd, short_help="Install project dependencies.")
@click.command(cls=PartialInstrumentedCmd, short_help="Install project dependencies.")
@click.argument(
"plugin_type",
type=click.Choice(PluginType.cli_arguments()),
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/invoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import (
CliEnvironmentBehavior,
Expand Down Expand Up @@ -37,7 +36,7 @@
logger = logging.getLogger(__name__)


@cli.command(
@click.command(
cls=PartialInstrumentedCmd,
context_settings={"ignore_unknown_options": True, "allow_interspersed_args": False},
short_help="Invoke a plugin.",
Expand Down
4 changes: 2 additions & 2 deletions src/meltano/cli/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
import click
import structlog

from meltano.cli import CliError, cli
from meltano.cli.params import pass_project
from meltano.cli.utils import (
CliEnvironmentBehavior,
CliError,
InstrumentedGroup,
PartialInstrumentedCmd,
)
Expand Down Expand Up @@ -93,7 +93,7 @@ def _list_all_jobs(
tracker.track_command_event(CliEvent.completed)


@cli.group(
@click.group(
cls=InstrumentedGroup,
short_help="Manage jobs.",
environment_behavior=CliEnvironmentBehavior.environment_optional_ignore_default,
Expand Down
5 changes: 2 additions & 3 deletions src/meltano/cli/lock.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
import click
import structlog

from meltano.cli import CliError, cli
from meltano.cli.params import pass_project
from meltano.cli.utils import PartialInstrumentedCmd
from meltano.cli.utils import CliError, PartialInstrumentedCmd
from meltano.core.plugin import PluginType
from meltano.core.plugin_lock_service import (
LockfileAlreadyExistsError,
Expand All @@ -27,7 +26,7 @@
logger = structlog.get_logger(__name__)


@cli.command(cls=PartialInstrumentedCmd, short_help="Lock plugin definitions.")
@click.command(cls=PartialInstrumentedCmd, short_help="Lock plugin definitions.")
@click.option(
"--all",
"all_plugins",
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/remove.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import InstrumentedCmd
from meltano.core.plugin import PluginType
Expand All @@ -15,7 +14,7 @@
from meltano.core.plugin_remove_service import PluginRemoveService


@cli.command(cls=InstrumentedCmd, short_help="Remove plugins from your project.")
@click.command(cls=InstrumentedCmd, short_help="Remove plugins from your project.")
@click.argument("plugin_type", type=click.Choice(PluginType.cli_arguments()))
@click.argument("plugin_names", nargs=-1, required=True)
@pass_project()
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/repl.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@

import click

from meltano.cli.cli import cli
from meltano.cli.params import database_uri_option
from meltano.cli.utils import InstrumentedCmd


@cli.command(cls=InstrumentedCmd, hidden=True)
@click.command(cls=InstrumentedCmd, hidden=True)
@database_uri_option
@click.pass_context
def repl(ctx: click.Context):
Expand Down
5 changes: 2 additions & 3 deletions src/meltano/cli/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@
import click
import structlog

from meltano.cli import CliError, cli
from meltano.cli.params import pass_project
from meltano.cli.utils import CliEnvironmentBehavior, PartialInstrumentedCmd
from meltano.cli.utils import CliEnvironmentBehavior, CliError, PartialInstrumentedCmd
from meltano.core.block.blockset import BlockSet
from meltano.core.block.parser import BlockParser, validate_block_sets
from meltano.core.block.plugin_command import PluginCommandBlock
Expand All @@ -27,7 +26,7 @@
logger = structlog.getLogger(__name__)


@cli.command(
@click.command(
cls=PartialInstrumentedCmd,
short_help="Run a set of plugins in series.",
environment_behavior=CliEnvironmentBehavior.environment_required,
Expand Down
3 changes: 1 addition & 2 deletions src/meltano/cli/schedule.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import click

from meltano.cli import cli
from meltano.cli.params import pass_project
from meltano.cli.utils import (
CliEnvironmentBehavior,
Expand All @@ -29,7 +28,7 @@
from meltano.core.task_sets import TaskSets


@cli.group(
@click.group(
cls=InstrumentedDefaultGroup,
default="add",
short_help="Manage pipeline schedules.",
Expand Down
8 changes: 3 additions & 5 deletions src/meltano/cli/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,12 @@

import click

from meltano.cli.params import pass_project
from meltano.cli.utils import InstrumentedCmd, InstrumentedGroup
from meltano.core.db import ensure_schema_exists, project_engine

from . import cli
from .params import pass_project
from .utils import InstrumentedCmd, InstrumentedGroup


@cli.group(cls=InstrumentedGroup, short_help="Manage system DB schema.")
@click.group(cls=InstrumentedGroup, short_help="Manage system DB schema.")
def schema():
"""Manage system DB schema."""

Expand Down

0 comments on commit 6c39412

Please sign in to comment.