Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions opendigger_pycli/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from .base import opendigger_cmd as opendigger
from .base import query_cmd as query
from .config_cmd import config
from .display_cmd import display
from .export_cmd import export
from .monitor_cmd import monitor
from .report_cmd import report
from .commands.config_cmd import config
from .commands.display_cmd import display
from .commands.export_cmd import export
from .commands.monitor_cmd import monitor
from .commands.report_cmd import report

opendigger.add_command(config)

Expand Down
7 changes: 5 additions & 2 deletions opendigger_pycli/cli/base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import typing as t

import click
from click_plugins import with_plugins
from pkg_resources import iter_entry_points # type: ignore

from opendigger_pycli.console import CONSOLE
from opendigger_pycli.console.print_base_info import (
Expand Down Expand Up @@ -84,7 +86,7 @@ def user(env: Environment, usernames: t.List[str]):
if click.get_current_context().invoked_subcommand is None:
env.vlog("[bold green]requesting users info...")
with CONSOLE.status("[bold green]requesting users info..."):
env.dlog(print_user_info(usernames, env.cli_config.github_pat))
env.dlog(print_user_info(usernames, env.cli_config.app_keys.github_pat))
env.vlog("[bold green]end requesting users info...")
return

Expand Down Expand Up @@ -122,7 +124,7 @@ def repo(env: Environment, repos: t.List[t.Tuple[str, str]]):
if click.get_current_context().invoked_subcommand is None:
env.vlog("[bold green]fetching repos info...")
with CONSOLE.status("[bold green]fetching repos info..."):
env.dlog(print_repo_info(repos, env.cli_config.github_pat))
env.dlog(print_repo_info(repos, env.cli_config.app_keys.github_pat))
env.vlog("[bold green]end fetching repos info...")
return

Expand All @@ -135,6 +137,7 @@ def repo(env: Environment, repos: t.List[t.Tuple[str, str]]):
env.vlog("Set params to env")


@with_plugins(iter_entry_points("opendigger-pycli.plugins")) # type: ignore
@click.group( # type: ignore
chain=True,
help="Query indicators",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from opendigger_pycli.results.display import DisplyCMDResult
from opendigger_pycli.utils.decorators import processor

from .base import pass_environment
from ..base import pass_environment

if t.TYPE_CHECKING:
from opendigger_pycli.console.print_indicator import SURPPORTED_DISPLAY_FORMAT_TYPE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@

import click

from ..utils.decorators import processor
from .base import pass_environment
from opendigger_pycli.utils.decorators import processor

from ..base import pass_environment

if t.TYPE_CHECKING:
from .base import Environment
from ..base import Environment


@click.command("export", help="Export metrics")
Expand Down
89 changes: 89 additions & 0 deletions opendigger_pycli/cli/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import configparser
import typing as t
from dataclasses import dataclass, fields, is_dataclass
from pathlib import Path

import click
from rich import box
from rich.table import Table

from opendigger_pycli.datatypes import ALL_CONFIGS, AppKeyConfig, UserInfoConfig

if t.TYPE_CHECKING:
from rich.console import Console, ConsoleOptions, RenderResult


class OpenDiggerCliConfig:
app_keys: AppKeyConfig
user_info: UserInfoConfig

def __init__(self):
self.__load_config()

@property
def user_config_file_path(self) -> str:
config_dir_str = click.get_app_dir("opendigger-pycli")
config_dir = Path(config_dir_str)
user_config = config_dir / "config.ini"
return str(user_config)

@property
def default_config_file_path(self) -> str:
default_config = Path(__file__).parent / "default_config.ini"
return str(default_config)

@property
def config_file_paths(self) -> t.List[str]:
return [str(self.default_config_file_path), str(self.user_config_file_path)]

def __load_config(self):
parser = configparser.RawConfigParser()
parser.read(self.config_file_paths)

for config_dataclass in ALL_CONFIGS:
if not is_dataclass(config_dataclass):
raise TypeError(f"{config_dataclass} is not a dataclass")

setattr(self, config_dataclass.config_name, config_dataclass())
config_fields = fields(config_dataclass)
for field in config_fields:
data = parser.get(
config_dataclass.config_name, field.name, fallback=field.default
)
setattr(getattr(self, config_dataclass.config_name), field.name, data)

def update_config(self):
parser = configparser.RawConfigParser()

for config_dataclass in ALL_CONFIGS:
if not is_dataclass(config_dataclass):
raise TypeError(f"{config_dataclass} is not a dataclass")

config = getattr(self, config_dataclass.config_name, config_dataclass())
config_fields = fields(config_dataclass)
for field in config_fields:
parser.set(
config_dataclass.config_name,
field.name,
getattr(config, field.name),
)

with open(self.user_config_file_path, "w") as file:
parser.write(file)

def __rich_console__(
self, console: "Console", options: "ConsoleOptions"
) -> "RenderResult":
yield "[b]OpenDigger Python CLI Configs:[/b]"
for config_dataclass in ALL_CONFIGS:
if not is_dataclass(config_dataclass):
raise TypeError(f"{config_dataclass} is not a dataclass")

table = Table(
"Key", "Value", title=config_dataclass.config_name, box=box.HORIZONTALS # type: ignore
)
config = getattr(self, config_dataclass.config_name, config_dataclass()) # type: ignore
config_fields = fields(config_dataclass)
for field in config_fields:
table.add_row(field.name, getattr(config, field.name))
yield table
7 changes: 7 additions & 0 deletions opendigger_pycli/cli/default_config.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[app_keys]
github_pat = ""
openai_key = ""

[user_info]
name = ""
email = ""
16 changes: 6 additions & 10 deletions opendigger_pycli/cli/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import click
from rich.logging import RichHandler

from opendigger_pycli.config.cli_config import OpenDiggerCliConfig
from opendigger_pycli.cli.config import OpenDiggerCliConfig
from opendigger_pycli.console import CONSOLE

FORMAT = "%(message)s"
Expand All @@ -29,8 +29,7 @@ def __init__(self):
self.verbose = False
self.home = os.getcwd()
self.params = []

self.load_configs()
self.logger = logging.getLogger("opendigger-pycli")

def log(
self,
Expand Down Expand Up @@ -77,12 +76,8 @@ def dlog(self, *msg):

def load_configs(self) -> bool:
try:
if self.verbose:
with CONSOLE.status("[bold green]loading configs..."):
self.cli_config = OpenDiggerCliConfig()
self.cli_config.print()
else:
self.cli_config = OpenDiggerCliConfig()
self.vlog("[bold green]loading configs...")
self.cli_config = OpenDiggerCliConfig()
return True
except Exception as e:
self.log(f"[bold red]load configs failed: {e}")
Expand All @@ -106,8 +101,9 @@ def set_log_level(
self.verbose = False
else:
self.verbose = True
self.logger = logging.getLogger("opendigger-pycli")
self.logger.setLevel(log_level)
RICH_LOGGER_HANDLER.setLevel(log_level)
CONSOLE.quiet = True
self.log("[bold green]verbose mode enabled")

self.load_configs()
11 changes: 0 additions & 11 deletions opendigger_pycli/config/cli_config.py

This file was deleted.

1 change: 1 addition & 0 deletions opendigger_pycli/datatypes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
TrivialIndicatorData,
TrivialNetworkIndicatorData,
)
from .config import ALL_CONFIGS, AppKeyConfig, UserInfoConfig
from .dataloader import DataloaderProto, DataloaderResult
from .indices import ActivityData, AttentionData, OpenRankData
from .metrics import (
Expand Down
24 changes: 24 additions & 0 deletions opendigger_pycli/datatypes/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import typing as t
from dataclasses import dataclass


@dataclass
class BaseConfig:
config_name: t.ClassVar[str]


@dataclass
class AppKeyConfig(BaseConfig):
config_name: t.ClassVar[str] = "app_keys"
openai_key: str = ""
github_pat: str = ""


@dataclass
class UserInfoConfig(BaseConfig):
config_name: t.ClassVar[str] = "user_info"
name: str = ""
email: str = ""


ALL_CONFIGS: t.List[t.Type[BaseConfig]] = [AppKeyConfig, UserInfoConfig]
8 changes: 8 additions & 0 deletions opendigger_pycli/datatypes/tests/test_config_data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from dataclasses import fields

from opendigger_pycli.datatypes import AppKeyConfig, UserInfoConfig


def test_config_data():
print(fields(AppKeyConfig))
print(fields(UserInfoConfig))
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ classifiers = [
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
]
dependencies = ["click", "rich", "requests", "types-requests"]
dependencies = ["click", "rich", "requests", "types-requests", "click-plugins"]
dynamic = ["version", "description"]

[project.urls]
Expand Down