Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🔨 提取GitHub相关操作 #1609

Merged
merged 2 commits into from
Sep 8, 2024

Conversation

AkashiCoin
Copy link
Collaborator

@AkashiCoin AkashiCoin commented Sep 7, 2024

Summary by Sourcery

将与 GitHub 相关的操作重构到一个专用的实用程序模块中,增强模块化和可重用性。更新自动更新和 Web UI 资产管理流程以使用新的实用程序函数,提高一致性和可维护性。调整测试以符合重构后的代码。

增强功能:

  • 将与 GitHub 相关的操作重构到一个单独的实用程序模块中,以提高模块化和可重用性。
  • 通过使用统一的方法从 GitHub 获取版本信息和下载 URL 来改进更新机制。
  • 通过动态确定要挂载的文件夹和改进日志记录来增强 Web UI 资产管理。
  • 通过删除硬编码的 GitHub URL 和模式并使用默认的 GitHub URL 来简化配置。

测试:

  • 更新测试以反映 GitHub URL 处理的变化,并确保与新的实用程序函数兼容。
Original summary in English

Summary by Sourcery

Refactor GitHub-related operations into a dedicated utility module, enhancing modularity and reusability. Update the auto-update and web UI asset management processes to use the new utility functions, improving consistency and maintainability. Adjust tests to align with the refactored code.

Enhancements:

  • Refactor GitHub-related operations into a separate utility module for better modularity and reusability.
  • Improve the update mechanism by using a unified method to fetch version information and download URLs from GitHub.
  • Enhance the web UI asset management by dynamically determining folders to mount and improving logging.
  • Simplify the configuration by removing hardcoded GitHub URLs and patterns, and using a default GitHub URL.

Tests:

  • Update tests to reflect changes in GitHub URL handling and ensure compatibility with the new utility functions.

Copy link
Contributor

sourcery-ai bot commented Sep 7, 2024

审核指南由 Sourcery 提供

此拉取请求将与 GitHub 相关的操作重构到一个单独的实用程序模块中,更新了自动更新和插件商店功能以使用新的实用程序,并对 WebUI 资产管理进行了一些调整。更改旨在改善代码组织、可重用性和可维护性。

文件级更改

更改 详情 文件
将与 GitHub 相关的操作提取到一个新的实用程序模块中
  • 为 GitHub 实用程序创建了新文件:models.py, func.py, consts.py 和 init.py
  • 实现了用于处理存储库信息的 RepoInfo 类
  • 添加了用于获取不同 GitHub 资源的最快下载 URL 的函数
  • 将与 GitHub 操作相关的常量和模式移动到 consts.py
zhenxun/utils/github_utils/models.py
zhenxun/utils/github_utils/func.py
zhenxun/utils/github_utils/consts.py
zhenxun/utils/github_utils/__init__.py
更新自动更新功能以使用新的 GitHub 实用程序
  • 使用 RepoInfo 替换硬编码的 URL 以动态生成 URL
  • 更新版本获取逻辑以使用新的 GitHub 实用程序
  • 通过使用新的实用程序函数简化更新过程
zhenxun/builtin_plugins/auto_update/_data_source.py
zhenxun/builtin_plugins/auto_update/config.py
重构插件商店以使用新的 GitHub 实用程序
  • 更新插件安装过程以使用 RepoInfo 进行 URL 生成
  • 删除与 GitHub 操作相关的冗余代码
  • 简化获取插件信息和文件的过程
zhenxun/builtin_plugins/plugin_store/data_source.py
zhenxun/builtin_plugins/plugin_store/config.py
更新 WebUI 资产管理
  • 将 WebUI 相关的常量移动到配置文件中
  • 更新资产下载过程以使用新的 GitHub 实用程序
  • 改进 WebUI 初始化过程中的错误处理和日志记录
zhenxun/builtin_plugins/web_ui/public/__init__.py
zhenxun/builtin_plugins/web_ui/public/data_source.py
zhenxun/builtin_plugins/web_ui/config.py
更新测试以适应新的 GitHub 实用程序
  • 为新的 GitHub 实用程序函数添加了模拟的 API 调用
  • 更新测试用例以使用新的 RepoInfo 类和实用程序函数
tests/builtin_plugins/auto_update/test_check_update.py

提示
  • 通过在拉取请求上评论 @sourcery-ai review 来触发新的 Sourcery 审核。
  • 通过直接回复审核评论继续与 Sourcery 的讨论。
  • 您可以随时通过访问您的仪表板更改您的审核设置:
    • 启用或禁用 Sourcery 生成的拉取请求摘要或审核指南;
    • 更改审核语言;
  • 如果您有任何问题或反馈,您可以随时联系我们
Original review guide in English

Reviewer's Guide by Sourcery

This pull request refactors GitHub-related operations into a separate utility module, updates the auto-update and plugin store functionalities to use the new utility, and makes some adjustments to the WebUI asset management. The changes aim to improve code organization, reusability, and maintainability.

File-Level Changes

Change Details Files
Extracted GitHub-related operations into a new utility module
  • Created new files for GitHub utilities: models.py, func.py, consts.py, and init.py
  • Implemented RepoInfo class for handling repository information
  • Added functions for getting fastest download URLs for different GitHub resources
  • Moved constants and patterns related to GitHub operations to consts.py
zhenxun/utils/github_utils/models.py
zhenxun/utils/github_utils/func.py
zhenxun/utils/github_utils/consts.py
zhenxun/utils/github_utils/__init__.py
Updated auto-update functionality to use the new GitHub utilities
  • Replaced hardcoded URLs with dynamic URL generation using RepoInfo
  • Updated version fetching logic to use the new GitHub utilities
  • Simplified the update process by using the new utility functions
zhenxun/builtin_plugins/auto_update/_data_source.py
zhenxun/builtin_plugins/auto_update/config.py
Refactored plugin store to use the new GitHub utilities
  • Updated plugin installation process to use RepoInfo for URL generation
  • Removed redundant code related to GitHub operations
  • Simplified the process of fetching plugin information and files
zhenxun/builtin_plugins/plugin_store/data_source.py
zhenxun/builtin_plugins/plugin_store/config.py
Updated WebUI asset management
  • Moved WebUI-related constants to the config file
  • Updated the asset download process to use the new GitHub utilities
  • Improved error handling and logging in the WebUI initialization process
zhenxun/builtin_plugins/web_ui/public/__init__.py
zhenxun/builtin_plugins/web_ui/public/data_source.py
zhenxun/builtin_plugins/web_ui/config.py
Updated tests to accommodate the new GitHub utilities
  • Added mocked API calls for the new GitHub utility functions
  • Updated test cases to use the new RepoInfo class and utility functions
tests/builtin_plugins/auto_update/test_check_update.py

Tips
  • Trigger a new Sourcery review by commenting @sourcery-ai review on the pull request.
  • Continue your discussion with Sourcery by replying directly to review comments.
  • You can change your review settings at any time by accessing your dashboard:
    • Enable or disable the Sourcery-generated pull request summary or reviewer's guide;
    • Change the review language;
  • You can always contact us if you have any questions or feedback.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AkashiCoin - 我已经审查了你的更改,它们看起来很棒!

这是我在审查期间查看的内容
  • 🟡 一般问题:发现3个问题
  • 🟡 安全性:发现1个问题
  • 🟡 测试:发现1个问题
  • 🟡 复杂性:发现1个问题
  • 🟢 文档:一切看起来都很好

Sourcery对开源项目免费 - 如果你喜欢我们的审查,请考虑分享它们 ✨
帮助我变得更有用!请点击每条评论上的👍或👎告诉我它是否有帮助。
Original comment in English

Hey @AkashiCoin - I've reviewed your changes and they look great!

Here's what I looked at during the review
  • 🟡 General issues: 3 issues found
  • 🟡 Security: 1 issue found
  • 🟡 Testing: 1 issue found
  • 🟡 Complexity: 1 issue found
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment to tell me if it was helpful.

]


def parse_github_url(github_url: str) -> "RepoInfo":
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议: 考虑在parse_github_url中提供更具信息性的错误消息

与其仅仅说“github地址格式错误”,不如提供更多关于URL具体错误的上下文信息。这将帮助开发人员更容易地调试问题。

def parse_github_url(github_url: str) -> "RepoInfo":
    try:
        # 解析逻辑在此
        pass
    except ValueError as e:
        raise ValueError(f"无效的GitHub URL格式:{e}。预期格式:https://github.com/owner/repo")
Original comment in English

suggestion: Consider providing more informative error messages in parse_github_url

Instead of just saying 'github地址格式错误', provide more context about what specifically was wrong with the URL. This will help developers debug issues more easily.

def parse_github_url(github_url: str) -> "RepoInfo":
    try:
        # Parsing logic here
        pass
    except ValueError as e:
        raise ValueError(f"Invalid GitHub URL format: {e}. Expected format: https://github.com/owner/repo")

@@ -247,7 +244,7 @@ async def __get_latest_data(cls) -> dict:
return {}

@classmethod
async def __get_version_from_branch(cls, branch: str) -> str:
async def __get_version_from_repo(cls, repo_info: RepoInfo) -> str:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议: 改进__get_version_from_repo方法中的错误处理

考虑重试请求或以不同方式处理特定类型的异常。这可以使更新过程更加稳健。例如,您可能希望在网络错误时重试,但在身份验证错误时不重试。

    async def __get_version_from_repo(cls, repo_info: RepoInfo) -> str:
        max_retries = 3
        retry_delay = 1

        for attempt in range(max_retries):
            try:
                return await cls.__fetch_version(repo_info)
            except aiohttp.ClientError as e:
                if attempt == max_retries - 1:
                    raise
                await asyncio.sleep(retry_delay)
Original comment in English

suggestion: Improve error handling in __get_version_from_repo method

Consider retrying the request or handling specific types of exceptions differently. This could make the update process more robust. For example, you might want to retry on network errors but not on authentication errors.

    async def __get_version_from_repo(cls, repo_info: RepoInfo) -> str:
        max_retries = 3
        retry_delay = 1

        for attempt in range(max_retries):
            try:
                return await cls.__fetch_version(repo_info)
            except aiohttp.ClientError as e:
                if attempt == max_retries - 1:
                    raise
                await asyncio.sleep(retry_delay)

app.include_router(router)
for pathname in ["css", "js", "fonts", "img"]:
for pathname in folders:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚨 问题(安全性): 挂载静态文件时的潜在安全风险

遍历PUBLIC_PATH中的所有文件夹并挂载它们,如果存在意外的文件夹,可能会带来安全风险。考虑明确列出允许的文件夹。

Original comment in English

🚨 issue (security): Potential security risk in mounting static files

Iterating over all folders in PUBLIC_PATH and mounting them could be a security risk if unexpected folders are present. Consider explicitly listing the allowed folders instead.

app.include_router(router)
for pathname in ["css", "js", "fonts", "img"]:
for pathname in folders:
logger.debug(f"挂载文件夹: {pathname}")
app.mount(
f"/{pathname}",
StaticFiles(directory=PUBLIC_PATH / pathname, check_dir=True),
name=f"public_{pathname}",
)
except Exception as e:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议(bug风险): 避免使用裸except子句

通常最好捕获特定的异常,而不是使用裸except。这允许更精确的错误处理,并避免意外捕获和抑制未预料的错误。

Suggested change
except Exception as e:
except (ValueError, TypeError, AttributeError) as e:
Original comment in English

suggestion (bug_risk): Avoid using bare except clauses

It's generally better to catch specific exceptions rather than using a bare except. This allows for more precise error handling and avoids accidentally catching and suppressing unexpected errors.

Suggested change
except Exception as e:
except (ValueError, TypeError, AttributeError) as e:

mocked_api.head(
url="https://raw.githubusercontent.com/",
name="head_raw",
).respond(text="")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

建议(测试): 为与GitHub相关的URL添加新的模拟响应

这些新的模拟响应针对raw.githubusercontent.com、github.com和codeload.github.com,改进了与GitHub相关操作的测试覆盖率。考虑添加断言以验证在测试期间这些端点是否按预期被调用。

Original comment in English

suggestion (testing): New mock responses added for GitHub-related URLs

These new mock responses for raw.githubusercontent.com, github.com, and codeload.github.com improve the test coverage for GitHub-related operations. Consider adding assertions to verify that these endpoints are called as expected during the tests.

def get_files(cls, module_path: str, is_dir) -> list[str]: ...


class JsdelivrAPI(BaseAPI):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

问题(复杂性): 考虑简化JsdelivrAPI类并使用策略模式进行API实现。

当前的实现引入了不必要的复杂性,特别是在JsdelivrAPI类中。以下是一些简化代码同时保持功能的建议:

  1. 合并full_files_pathrecurrence_files方法:
class JsdelivrAPI(BaseAPI):
    # ...

    def get_file_paths(self, module_path: str, is_dir: bool = True) -> list[str]:
        paths = module_path.split("/")
        cur_file = self
        for path in paths[:-1]:  # 导航到正确的目录
            cur_file = next((f for f in cur_file.files if f.type == FileType.DIR and f.name == path), None)
            if not cur_file:
                raise ValueError(f"模块路径{module_path}不存在")

        def collect_files(file, current_path):
            if file.type == FileType.FILE:
                return [f"{current_path}/{file.name}"]
            elif file.type == FileType.DIR and file.files:
                return [path for f in file.files for path in collect_files(f, f"{current_path}/{file.name}")]
            return []

        return collect_files(cur_file, "/".join(paths[:-1]))
  1. 考虑使用策略模式而不是继承进行API实现:
from typing import Protocol

class APIStrategy(Protocol):
    async def parse_repo_info(self, repo_info: RepoInfo) -> dict:
        ...

    def get_files(self, module_path: str, is_dir: bool) -> list[str]:
        ...

class RepoAPI:
    def __init__(self, strategy: APIStrategy):
        self.strategy = strategy

    async def parse_repo_info(self, repo_info: RepoInfo) -> dict:
        return await self.strategy.parse_repo_info(repo_info)

    def get_files(self, module_path: str, is_dir: bool) -> list[str]:
        return self.strategy.get_files(module_path, is_dir)

# 为不同的API实现策略
class JsdelivrStrategy:
    # 实现JsdelivrAPI特定的方法

class GitHubStrategy:
    # 实现GitHubAPI特定的方法

# 使用
jsdelivr_api = RepoAPI(JsdelivrStrategy())
github_api = RepoAPI(GitHubStrategy())

这些更改简化了代码结构,减少了嵌套,并使得在不增加复杂性的情况下更容易添加新的API实现。策略模式允许在不使用深层继承层次结构的情况下更灵活地组合行为。

Original comment in English

issue (complexity): Consider simplifying the JsdelivrAPI class and using a strategy pattern for API implementations.

The current implementation introduces unnecessary complexity, particularly in the JsdelivrAPI class. Here are some suggestions to simplify the code while maintaining functionality:

  1. Combine full_files_path and recurrence_files methods:
class JsdelivrAPI(BaseAPI):
    # ...

    def get_file_paths(self, module_path: str, is_dir: bool = True) -> list[str]:
        paths = module_path.split("/")
        cur_file = self
        for path in paths[:-1]:  # Navigate to the correct directory
            cur_file = next((f for f in cur_file.files if f.type == FileType.DIR and f.name == path), None)
            if not cur_file:
                raise ValueError(f"Module path {module_path} does not exist")

        def collect_files(file, current_path):
            if file.type == FileType.FILE:
                return [f"{current_path}/{file.name}"]
            elif file.type == FileType.DIR and file.files:
                return [path for f in file.files for path in collect_files(f, f"{current_path}/{file.name}")]
            return []

        return collect_files(cur_file, "/".join(paths[:-1]))
  1. Consider using a strategy pattern instead of inheritance for API implementations:
from typing import Protocol

class APIStrategy(Protocol):
    async def parse_repo_info(self, repo_info: RepoInfo) -> dict:
        ...

    def get_files(self, module_path: str, is_dir: bool) -> list[str]:
        ...

class RepoAPI:
    def __init__(self, strategy: APIStrategy):
        self.strategy = strategy

    async def parse_repo_info(self, repo_info: RepoInfo) -> dict:
        return await self.strategy.parse_repo_info(repo_info)

    def get_files(self, module_path: str, is_dir: bool) -> list[str]:
        return self.strategy.get_files(module_path, is_dir)

# Implement strategies for different APIs
class JsdelivrStrategy:
    # Implement JsdelivrAPI-specific methods

class GitHubStrategy:
    # Implement GitHubAPI-specific methods

# Usage
jsdelivr_api = RepoAPI(JsdelivrStrategy())
github_api = RepoAPI(GitHubStrategy())

These changes simplify the code structure, reduce nesting, and make it easier to add new API implementations without increasing complexity. The strategy pattern allows for more flexible composition of behaviors without deep inheritance hierarchies.

@AkashiCoin AkashiCoin merged commit bf7caf7 into HibiKier:dev Sep 8, 2024
1 check passed
@AkashiCoin AkashiCoin deleted the refactor/github_utils branch September 8, 2024 01:38
AkashiCoin added a commit that referenced this pull request Sep 8, 2024
* 🔨 提取GitHub相关操作

* 🔨 重构API策略
AkashiCoin added a commit that referenced this pull request Sep 8, 2024
* 🔨 提取GitHub相关操作

* 🔨 重构API策略
HibiKier added a commit that referenced this pull request Sep 30, 2024
* ✨ 父级插件加载

* ✅ 添加测试:更新与添加插件 (#1594)

* ✅ 测试更新与添加插件

* ✅ Sourcery建议

* 👷 添加pytest

* 🎨 优化代码

* 🐛 bug修复

* 🐛修复添加插件返回403的问题 (#1595)

* 完善测试方法
* vscode测试配置
* 重构插件安装过程

* 🎨 修改readme

* Update README.md

* 🐛 修改bug与版本锁定

* 🐛 修复超级用户对群组功能开关

* 🐛 修复插件商店检查插件更新问题 (#1597)

* 🐛 修复插件商店检查插件更新问题

* 🐛 恶意命令检测问题

* 🐛 增加插件状态检查 (#1598)

* ✅ 优化测试用例

* 🐛 更改插件更新与安装逻辑

* 🐛 修复更新群组成员信息

* 🎨 代码优化

* 🚀 更新Dockerfile (#1599)

* 🎨 更新requirements

* ➕ 添加依赖aiocache

* ⚡ 添加github镜像

* ✨ 添加仓库目录多获取渠道

* 🐛 修复测试用例

* ✨ 添加API缓存

* 🎨 采取Sourcery建议

* 🐛 文件下载逻辑修改

* 🎨 优化代码

* 🐛 修复插件开关有时出现错误

* ✨ 重构自检ui

* 🐛 自检html修正

* 修复签到逻辑bug,并使代码更灵活以适应签到好感度等级配置 (#1606)

* 修复签到功能已知问题

* 修复签到功能已知问题

* 修改参数名称

* 修改uid判断

---------

Co-authored-by: HibiKier <[email protected]>

* 🎨 代码结构优化

* 🐛 私聊时修改插件时删除私聊帮助

* 🐛 过滤父插件

* 🐛 修复自检在ARM上的问题 (#1607)

* 🐛 修复自检在ARM上的问题

* ✅ 优化测试

* ✨ 支持mysql,psql,sqlite随机函数

* 🔧 VSCode配置修改

* 🔧 VSCode配置修改

* ✨ 添加金币排行

Co-Authored-By: HibiKier <[email protected]>

* 📝 修改README

Co-Authored-By: HibiKier <[email protected]>

* 🔨 提取GitHub相关操作 (#1609)

* 🔨 提取GitHub相关操作

* 🔨 重构API策略

* ✨ 签到/金币排行限制最大数量 (#1616)

* ✨ 签到/金币排行限制最大数量

* 🐛 修复超级用户id获取问题

* 🐛 修复路径解压与挂载 (#1619)

* 🐛 修复功能少时zhenxun帮助图片排序问题 (#1620)

* 🐛 签到文本适应 (#1622)

* 🐛 好感度排行提供默认值 (#1624)

* 🎈 优先使用github api (#1625)

* ✨ 重构帮助,限制普通用户查询管理插件 (#1626)

* 🐛 修复群权限与插件等级匹配 (#1627)

* ✨ 当管理员尝试ban真寻时将被反杀 (#1628)

* ✨ 群组发言时间检测提供开关配置 (#1630)

* 🐳 chore: 支持自动修改版本号 (#1629)

* 🎈 perf(github_utils): 支持github url下载遍历 (#1632)

* 🎈 perf(github_utils): 支持github url下载遍历

* 🐞 fix(http_utils): 修复一些下载问题

* 🦄 refactor(http_utils): 部分重构

* chore(version): Update version to v0.2.2-e6f17c4

---------

Co-authored-by: AkashiCoin <[email protected]>

* 🧪 test(auto_update): 修复测试用例 (#1633)

* 🐛 修复商店商品为空时报错 (#1634)

* 🐛 修复群权限与插件等级匹配 (#1635)

* ✨ message_build支持AtAll (#1639)

* 🎈 perf: 使用commit号下载插件 (#1641)

* 🎈 perf: 使用commit号下载插件

* chore(version): Update version to v0.2.2-f9c7360

---------

Co-authored-by: AkashiCoin <[email protected]>

* 🐳 chore: 修改运行检查触发路径 (#1642)

* 🐳 chore: 修改运行检查触发路径

* 🐳 chore: 添加tests目录

* ✨ 重构qq群事件处理 (#1643)

* 🐛 签到名称自适应 (#1644)

* 🎨  更新README (#1645)

* 🐛 fix(http_utils): 流式下载Content-Length错误 (#1647)

* 🐛 修复群组中帮助功能状态显示问题 (#1650)

* 🐛 修复群欢迎消息设置 (#1651)

* 🐛 修复webui下载后首次启动错误 (#1652)

* 🐛 修复webui下载后首次启动错误

* chore(version): Update version to v0.2.2-4a8ef85

---------

Co-authored-by: HibiKier <[email protected]>

* ✨ 移除默认图片文件夹:爬 (#1653)

* ✨ 安装/移除插件提供插件安装/卸载方法用于插件初始化 (#1654)

* ✨ 新增超级用户与管理员帮助模板 (#1655)

* ✨ 新增个人信息命令 (#1657)

* ✨ 修改个人信息菜单名称 (#1658)

* ✨ 新增插件商店api (#1659)

* ✨ 新增插件商店api

* chore(version): Update version to v0.2.2-7e15f20

---------

Co-authored-by: HibiKier <[email protected]>

* ✨ 将cd,block,count限制复原配置文件 (#1662)

* 🎨 修改README (#1663)

* 🎨 修改版本号 (#1664)

* 🎨 修改requirements (#1665)

---------

Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: fanyinrumeng <[email protected]>
Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: Elaga <[email protected]>
Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: HibiKier <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant