Skip to content

Commit 8012abf

Browse files
authored
Merge pull request #3 from CoderChen01/cjj_dev
The configuration system is initially realized.
2 parents e80ab97 + 7e68d1b commit 8012abf

File tree

16 files changed

+151
-33
lines changed

16 files changed

+151
-33
lines changed

opendigger_pycli/cli/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from .base import opendigger_cmd as opendigger
22
from .base import query_cmd as query
3-
from .config_cmd import config
4-
from .display_cmd import display
5-
from .export_cmd import export
6-
from .monitor_cmd import monitor
7-
from .report_cmd import report
3+
from .commands.config_cmd import config
4+
from .commands.display_cmd import display
5+
from .commands.export_cmd import export
6+
from .commands.monitor_cmd import monitor
7+
from .commands.report_cmd import report
88

99
opendigger.add_command(config)
1010

opendigger_pycli/cli/base.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import typing as t
22

33
import click
4+
from click_plugins import with_plugins
5+
from pkg_resources import iter_entry_points # type: ignore
46

57
from opendigger_pycli.console import CONSOLE
68
from opendigger_pycli.console.print_base_info import (
@@ -84,7 +86,7 @@ def user(env: Environment, usernames: t.List[str]):
8486
if click.get_current_context().invoked_subcommand is None:
8587
env.vlog("[bold green]requesting users info...")
8688
with CONSOLE.status("[bold green]requesting users info..."):
87-
env.dlog(print_user_info(usernames, env.cli_config.github_pat))
89+
env.dlog(print_user_info(usernames, env.cli_config.app_keys.github_pat))
8890
env.vlog("[bold green]end requesting users info...")
8991
return
9092

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

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

137139

140+
@with_plugins(iter_entry_points("opendigger-pycli.plugins")) # type: ignore
138141
@click.group( # type: ignore
139142
chain=True,
140143
help="Query indicators",
File renamed without changes.
File renamed without changes.

opendigger_pycli/cli/display_cmd.py renamed to opendigger_pycli/cli/commands/display_cmd.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from opendigger_pycli.results.display import DisplyCMDResult
88
from opendigger_pycli.utils.decorators import processor
99

10-
from .base import pass_environment
10+
from ..base import pass_environment
1111

1212
if t.TYPE_CHECKING:
1313
from opendigger_pycli.console.print_indicator import SURPPORTED_DISPLAY_FORMAT_TYPE

opendigger_pycli/cli/export_cmd.py renamed to opendigger_pycli/cli/commands/export_cmd.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
import click
44

5-
from ..utils.decorators import processor
6-
from .base import pass_environment
5+
from opendigger_pycli.utils.decorators import processor
6+
7+
from ..base import pass_environment
78

89
if t.TYPE_CHECKING:
9-
from .base import Environment
10+
from ..base import Environment
1011

1112

1213
@click.command("export", help="Export metrics")
File renamed without changes.
File renamed without changes.

opendigger_pycli/cli/config.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import configparser
2+
import typing as t
3+
from dataclasses import dataclass, fields, is_dataclass
4+
from pathlib import Path
5+
6+
import click
7+
from rich import box
8+
from rich.table import Table
9+
10+
from opendigger_pycli.datatypes import ALL_CONFIGS, AppKeyConfig, UserInfoConfig
11+
12+
if t.TYPE_CHECKING:
13+
from rich.console import Console, ConsoleOptions, RenderResult
14+
15+
16+
class OpenDiggerCliConfig:
17+
app_keys: AppKeyConfig
18+
user_info: UserInfoConfig
19+
20+
def __init__(self):
21+
self.__load_config()
22+
23+
@property
24+
def user_config_file_path(self) -> str:
25+
config_dir_str = click.get_app_dir("opendigger-pycli")
26+
config_dir = Path(config_dir_str)
27+
user_config = config_dir / "config.ini"
28+
return str(user_config)
29+
30+
@property
31+
def default_config_file_path(self) -> str:
32+
default_config = Path(__file__).parent / "default_config.ini"
33+
return str(default_config)
34+
35+
@property
36+
def config_file_paths(self) -> t.List[str]:
37+
return [str(self.default_config_file_path), str(self.user_config_file_path)]
38+
39+
def __load_config(self):
40+
parser = configparser.RawConfigParser()
41+
parser.read(self.config_file_paths)
42+
43+
for config_dataclass in ALL_CONFIGS:
44+
if not is_dataclass(config_dataclass):
45+
raise TypeError(f"{config_dataclass} is not a dataclass")
46+
47+
setattr(self, config_dataclass.config_name, config_dataclass())
48+
config_fields = fields(config_dataclass)
49+
for field in config_fields:
50+
data = parser.get(
51+
config_dataclass.config_name, field.name, fallback=field.default
52+
)
53+
setattr(getattr(self, config_dataclass.config_name), field.name, data)
54+
55+
def update_config(self):
56+
parser = configparser.RawConfigParser()
57+
58+
for config_dataclass in ALL_CONFIGS:
59+
if not is_dataclass(config_dataclass):
60+
raise TypeError(f"{config_dataclass} is not a dataclass")
61+
62+
config = getattr(self, config_dataclass.config_name, config_dataclass())
63+
config_fields = fields(config_dataclass)
64+
for field in config_fields:
65+
parser.set(
66+
config_dataclass.config_name,
67+
field.name,
68+
getattr(config, field.name),
69+
)
70+
71+
with open(self.user_config_file_path, "w") as file:
72+
parser.write(file)
73+
74+
def __rich_console__(
75+
self, console: "Console", options: "ConsoleOptions"
76+
) -> "RenderResult":
77+
yield "[b]OpenDigger Python CLI Configs:[/b]"
78+
for config_dataclass in ALL_CONFIGS:
79+
if not is_dataclass(config_dataclass):
80+
raise TypeError(f"{config_dataclass} is not a dataclass")
81+
82+
table = Table(
83+
"Key", "Value", title=config_dataclass.config_name, box=box.HORIZONTALS # type: ignore
84+
)
85+
config = getattr(self, config_dataclass.config_name, config_dataclass()) # type: ignore
86+
config_fields = fields(config_dataclass)
87+
for field in config_fields:
88+
table.add_row(field.name, getattr(config, field.name))
89+
yield table
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[app_keys]
2+
github_pat = ""
3+
openai_key = ""
4+
5+
[user_info]
6+
name = ""
7+
email = ""

0 commit comments

Comments
 (0)