opendigger_pycli


Nameopendigger_pycli JSON
Version 1.0.3 PyPI version JSON
download
home_pageNone
SummaryAwesome CLI for OpenDigger
upload_time2023-11-18 10:29:11
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords opendigger opendigger-pycli opendigger-cli opendigger-py opensoda open-digger
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # OpenDigger CLI 文档

![opendigger](https://img.shields.io/badge/Data-OpenDigger-2097FF)

- [OpenDigger CLI 文档](#opendigger-cli-文档)
  - [🗺️Big Picture](#️big-picture)
  - [🪛安装](#安装)
    - [基本环境](#基本环境)
    - [从源码安装](#从源码安装)
    - [从PyPI安装](#从pypi安装)
  - [🕹️基本用法](#️基本用法)
    - [开启自动补全](#开启自动补全)
    - [获取Github Personal Access Token](#获取github-personal-access-token)
    - [获取OpenAI key](#获取openai-key)
    - [config 命令](#config-命令)
    - [repo 命令](#repo-命令)
    - [user 命令](#user-命令)
    - [query 命令](#query-命令)
      - [按类型筛选指标](#按类型筛选指标)
      - [按时间筛选指标数据](#按时间筛选指标数据)
      - [对某一指标进行时间筛选](#对某一指标进行时间筛选)
      - [正向筛选指标](#正向筛选指标)
      - [反向筛选指标](#反向筛选指标)
    - [display 命令](#display-命令)
      - [表格格式](#表格格式)
      - [图表格式](#图表格式)
      - [json格式](#json格式)
      - [保存输出结果](#保存输出结果)
    - [export 命令](#export-命令)
      - [数据报告](#数据报告)
      - [原始Json数据](#原始json数据)
    - [组合使用](#组合使用)
  - [👀异常处理](#异常处理)
    - [缺失数据自动反馈](#缺失数据自动反馈)
    - [仓库不存在](#仓库不存在)
    - [用户不存在](#用户不存在)
  - [🔌插件开发](#插件开发)
    - [query的返回数据](#query的返回数据)
    - [插件示例](#插件示例)
    - [示例插件使用](#示例插件使用)
  - [📄筛选条件表达式详解](#筛选条件表达式详解)
  - [End](#end)

## 🗺️Big Picture

<a id="big-picture"></a>

![Big Picture](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/commands_big_picture.png)

## 🪛安装

<a id="安装"></a>

### 基本环境

Python >= 3.8

### 从源码安装

```bash
python3 -m pip install flit

git clone https://github.com/CoderChen01/opendigger-pycli.git

flit install
# 详见:https://github.com/pypa/flit
```

### 从PyPI安装

```bash
pip3 install opendigger_pycli
```

## 🕹️基本用法

<a id="基本用法"></a>

### 开启自动补全

zsh:

```zsh
eval "$(_OPENDIGGER_COMPLETE=zsh_source opendigger)"
```

bash:

```bash
eval "$(_FOO_BAR_COMPLETE=bash_source opendigger)"
```

### 获取Github Personal Access Token

Github Personal Access Token用于访问Github API,获取Github API的权限。通过Github API我们可以获取到Github上的仓库和用户的基本信息和自动反馈缺失数据。

[点击这里](https://github.com/settings/tokens?type=beta) 获取。

具体步骤:

1.点击`Fine-grained tokens` > 点击`Generate new token`

![第一步](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/01.png)

2.设置`Token name`和`Token Expiration`

![第二步](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/02.png)

3.选择仓库权限

![第三步](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/03.png)

4.设置issue的读写权限

注意metadata权限也必须同时设置只读权限

![第四步](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/04.png)

### 获取OpenAI key

OpenAI key用于访问OpenAI API,获取OpenAI API的权限。通过OpenAI API我们可以对指标数据进行分析和生成洞察报告。

[点击这里](https://beta.openai.com/account/api-keys) 获取。

### config 命令

config命令用于配置工具所使用到的第三方API密钥和基本的用户信息。目前工具使用到了Github API和OpenAI API。两者本别用来查询仓库和用户的基本信息,和用来对指标数据进行分析和生成洞察报告。

该命令只有一个参数:

`-s / --set`:用于设置配置项(该参数可以多次使用)

具体使用如下:

```bash
# 配置Github API密钥
opendigger config --set app_keys.github_pat <your_pat>

# 配置OpenAI API密钥
opendigger config -s app_keys.openai_key <your_key>

# 同时配置用户姓名和邮箱
opendigger config -s user_info.name <your_name> -s user_info.email <your_email>
```

<details>
<summary> 演示录屏 </summary>

![config](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/config.gif)
</details>

### repo 命令

repo命令用于查看仓库的指标数据。该命令有一个参数:

`-r / --repo`:用于指定仓库名称。(该参数可以多次使用)

如果多次指定将会查询多个仓库的指标数据。

该命令单独使用时,将会查询仓库的基本信息。基本信息包括仓库主页链接、仓库Owner主页链接、仓库是否是Fork的和仓库的创建时间与最近更新时间。**通过这些信息可以帮助用户快速了解仓库的基本情况。**

具体使用如下:

```bash
# 查询单个仓库的基本信息
opendigger repo -r X-lab2017/open-digger

# 查询多个仓库的基本信息
opendigger repo -r X-lab2017/open-digger -r microsoft/vscode
```

<details>
<summary> 结果截图 </summary>

![repo](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/repo-01.png)

![repo](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/repo-02.png)
</details>

<details>
<summary> 演示录屏 </summary>

![repo](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo.gif)
</details>

### user 命令

user命令用于查看用户的指标数据。该命令有一个参数:

`-u / --username`:用于指定用户名。(该参数可以多次使用)

如果多次指定将会查询多个用户的指标数据。

该命令单独使用时,将会查询用户的基本信息。基本信息包括用户名、用户昵称、用户邮箱、用户主页链接、用户创建时间和用户最近更新时间。**通过这些信息可以帮助用户快速了解用户的基本情况。**

具体使用如下:

```bash
# 查询单个用户的基本信息
opendigger user -u CoderChen01

# 查询多个用户的基本信息
opendigger user -u CoderChen01 -u X-lab2017
```

<details>
<summary> 结果截图 </summary>

![user](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/user-01.png)

![user](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/user-02.png)
</details>

### query 命令

query命令是`repo`和`user`的子命令(⚠️query命令只能够在`repo`和`user`命令之后使用。),用于对仓库或用户的指标数据进行筛选。

当前支持的筛选条件有:

- 按类型筛选指标
- 按时间筛选指标数据
- 对某一指标进行筛选
- 正向筛选指标
- 反向筛选指标

query命令的所有参数如下:

```text
-i, --index                     Select indicators whose type is INDEX.
-m, --metric                    Select indicators whose type is METRIC.
-n, --network                   Select indicators whose type is NETWORK.
-x, --x-lab                     Select indicators whose introducer is X-lab.
-c, --chaoss                    Select indicators whose introducer is
                                CHAOSS.
-s, --select INDICATOR_QUERY    The indicator to select.
-o, --only-select / -N, --no-only-select
                                Only query selected indicators.
-I, --ignore IGNORED_INDICATOR_NAMES
                                The indicators to ignore.
-f, --fileter INDICATOR_QUERY   The query applying to all indicators
```

query 命令有两个子命令:

- `display`: 用于将筛选出来的数据以表格、图表或json格式在终端输出。
- `export`: 用于将筛选出来的数据经过GPT分析后导出数据报告或直接导出原始json数据。

> ⚠️ 特别说明
>
> query命令可以理解为是一个数据下载器,它可以根据用户所传参数从opendigger的数据仓库中下载指定的数据。
> 但是**query命令并不会对数据进行处理**,它只是将数据下载到本地。
> 如果用户需要对数据进行处理,可以使用`query`命令的`display`子命令和`export`子命令。如果用户没有在query后使用`display`或`export`子命令,那么query命令将不会对数据进行任何处理,而是只输出筛选指标的基本信息。
> 用户也可以通过我们提供的接口获取query命令下载并筛选后的数据,开发自定义的命令。具体见[🔌插件开发](#插件开发)。

#### 按类型筛选指标

query命令在**不带任何参数**的情况下,可以输出当前支持的**所有指标**的基本信息。基本信息包括指标名称、指标类型、指标引入者和指标数据示例链接。

具体演示如下:

```bash
# 查看仓库指标的基本信息
opendigger repo -r X-lab2017/open-digger query
```

<details>
<summary> 演示录屏 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query.gif
)
</details>

如果我们需要查看某一类型的指标的基本信息,可以使用`-i`、`-m`和`-n`参数。

如果我们需要查看某一引入者的指标的基本信息,可以使用`-x`和`-c`参数。

同时这些指标可以组合使用,例如:

```bash
# 查看指标类型为index的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -i
# 或者
opendigger repo -r X-lab2017/open-digger query --index

# 查看指标类型为metric的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -m

# 查看指标类型为network的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -n

# 查看指标引入者为X-lab的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -x

# 查看指标引入者为CHAOSS的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -c

# 查看指标类型为metric且引入者为X-lab的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -m -x
# 或者
opendigger repo -r X-lab2017/open-digger query -m --x-lab
# 或者
opendigger repo -r X-lab2017/open-digger query -xm
# 或者
opendigger repo -r X-lab2017/open-digger query --metric --x-lab

# 查看指标类型为metric且引入者为CHAOSS的指标的基本信息
opendigger repo -r X-lab2017/open-digger query -m -c
```

如上所示,我们可以通过组合使用`-i`、`-m`、`-n`、`-x`和`-c`参数来查看我们想要的指标的基本信息。这些参数都不接受值,只需要指定即可。

#### 按时间筛选指标数据

通过上述参数我们可以筛选出我们关注的指标类型,然后我们可以通过`-f`参数对筛选出的指标类型的数据进行时间上的筛选。

`-f`参数接受一个指标筛选条件表达式,详细筛选条件表达式见下方:[📄筛选条件表达式详解](#筛选条件表达式详解)。

下面是一些例子(这里为了便于演示将使用`display`子命令将筛选出来的数据在终端以表格形式输出):

```bash
# 查看仓库X-lab2017/open-digger在2023年的index类型的指标数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -f 2023 display -f table

# 查看仓库X-lab2017/open-digger在2021~2023年的index类型的指标数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -f 2021~2023 display -f table

# 查看仓库X-lab2017/open-digger在2021年3月~2023年3月的index类型的指标数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -f 2021-03~2023-03 display -f table

# 查看仓库X-lab2017/open-digger过去年份3月到8月的index类型的指标数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -f 3~8 display -f table

# 查看仓库X-lab2017/open-digger过去年份3月的index类型的指标数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -f 3 display -f table
```

<details>
<summary> 演示录屏 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-f.gif
)

[query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-f.gif
)
</details>

#### 对某一指标进行时间筛选

基于`-f`参数我们可以对筛选出的指标进行时间上的过滤,但是如果我们需要针对某一个指标进行筛选该怎么办呢?我们可以通过`-s`参数来对某一个指标指定筛选条件。

`-s`参数接受一个指标查询表达式,该表达式由指标名称和筛选条件表达式组成。指标名称和筛选条件表达式之间用`:`分隔。

下面是一些例子(这里为了便于演示将使用`display`子命令将筛选出来的数据在终端以表格形式输出):

```bash
# 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看2023年的数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -s openrank:2023 display -f table

# 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看2021~2022年的数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -s openrank:2021~2022 display -f table

# 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看2021年3月~2022年3月的数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -s openrank:2021-03~2022-03 display -f table

# 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看过去年份3月到8月的数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -s openrank:3~8 display -f table

# 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看过去年份8月的数据,并以表格形式在终端打印
opendigger repo -r X-lab2017/open-digger query -i -s openrank:8 display -f table
```

演示录屏:

<details>
<summary> 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看2023年的数据,并以表格形式在终端打印 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-2023.gif
)
</details>

<details>
<summary> 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看2021~2022年的数据,并以表格形式在终端打印 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-2021~2022.gif
)
</details>

<details>
<summary> 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看2021年3月~2022年3月的数据,并以表格形式在终端打印 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-2021-3~2022-3.gif
)
</details>

<details>
<summary> 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看过去年份3月到8月的数据,并以表格形式在终端打印 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-3~8.gif
)
</details>

<details>
<summary> 查看仓库X-lab2017/open-digger的index类型的指标数据,并对openrank指标进行筛选,只查看过去年份8月的数据,并以表格形式在终端打印 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-08.gif
)
</details>

#### 正向筛选指标

我们已经可以对指标通过类型、时间进行筛选并将其在终端以表格形式输出了,并且我们还能针对某一个指标进行时间上的筛选。但是,query命令默认查询所有的指标,即使我们使用了`-i`, `-m`, `-n`, `-x`和`-c`筛选出特定的指标,通过`-f`和`-s`筛选出特定的指标数据,但是我们仍然会得到大量的指标数据,这些指标数据中可能有我们不关心的指标数据。

我们可以通过`-o / --only-select`参数与`-s`参数配合使用,只查询我们关心的指标数据。

比如我们只查询仓库`X-lab2017/open-digger`的`index`类型的指标数据,并且只查询`openrank`指标的数据,我们可以这样做:

```bash
# 只查看过往年份3~8月的openrank指标数据
opendigger repo -r X-lab2017/open-digger query -i -s openrank:3~8 -o display -f table
# 或者
opendigger repo -r X-lab2017/open-digger query -i -s openrank:3~8 --only-select display -f table
# 或者
opendigger repo -r X-lab2017/open-digger query -i -os openrank:3~8 display -f table
```

<details>
<summary> 演示录屏 </summary>

![query](
    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-3~8-o.gif
)
</details>

我们还可以查询多个指标的数据,比如我们还想查看`openrank`和`issue_age`指标的数据,我们可以这样做:

```bash
# 只查看过往年份3~8月的openrank和过往5~8月的issue_age指标数据
opendigger repo -r X-lab2017/open-digger query -s openrank:3~8 -s issue_age:5~8 -o display -f table
```

#### 反向筛选指标

我们还可以通过`-I / --ignore`参数来反向筛选指标,即我们可以通过`-I / --ignore`参数来忽略某些指标。

比如我们只查询仓库`X-lab2017/open-digger`的`index`类型的指标数据,并且忽略`openrank`指标的数据,我们可以这样做:

```bash
opendigger repo -r X-lab2017/open-digger query -i -I openrank display -f table
```

### display 命令

`display`命令是`query`命令的子命令,用于将筛选出来的数据以表格、图表或json格式在终端输出。该命令在上文演示中已经使用过,不过该命令还支持除了table格式的其他格式。具体支持参数如下:

```text
-f, --format [table|graph|json]
                                Display format  [required]
-s, --save DIRECTORY            Save output to file, you can use this option
                                get a simple report
-p, --paging / --no-paging      Page output like more/less command, you
                                CANNOT use this option and save to file at
                                the same time
-c, --pager-color / --no-pager-color
                                Enable color in pager, Only works when
                                paging is enabled
```

可以通过`-f`参数指定输出格式,并且通过`-s / --save`参数可以将终端输出的内容保存到文件(一个简易版的数据报告)中,通过`-p / --paging`参数可以将终端输出的内容分页显示,通过`-c / --pager-color`参数可以在分页显示时启用颜色。

#### 表格格式

表格格式在上文中已经提及,这里不再赘述。

#### 图表格式

图表格式可以将筛选出来的数据以图表的形式在终端输出。目前支持的图表类型有:

- 横向柱状图
- 热力图

具体使用如下:

**查看仓库X-lab2017/open-digger的index类型的openrank指标数据,只查看2023年的数据,并以图表形式在终端打印:**

```bash
opendigger repo -r X-lab2017/open-digger query -i -os openrank:2023 display -f graph
```

结果截图:

![bar01](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/bar-01.png)

从图中可以看出openrank 2023年每个月的数据变化。

**查看仓库X-lab2017/open-digger的metric类型的active_date_and_time指标数据,只查看2023年的数据,并以图表形式在终端打印:**

```bash
opendigger repo -r X-lab2017/open-digger query -m -os active_date_and_time:2023 display -f graph
```

结果截图:

![heatmap](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/heatmap-01.png)

从图中可以看出2023年每个月的活跃时间段。热力图的横纵坐标标号的含义在图下方也会有相应的说明。

**查看仓库X-lab2017/open-digger的metric类型的summed_code_change_line指标数据,并以图表形式在终端打印:**

```bash
opendigger repo -r X-lab2017/open-digger query -m -os summed_code_change_line display -f graph
```

结果截图:

![bar02](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/bar-02.png)

从图中可以看出summed_code_change_line指标的数据变化。对于负值的数据,我们会将其转换为正值,然后在图表中以红色显示。

#### json格式

我们输出的json格式与原数据不一样,我们对原始数据进行了处理,将年月解析了出来并进行了排序,对于包含`-raw`的字段我们也进行了处理。这样用户直接复制打印出来的json数据为自己所用。

具体使用如下:

查看仓库X-lab2017/open-digger的metric类型的issue_age指标数据,并以json格式在终端打印:

```bash
opendigger repo -r X-lab2017/open-digger query -mos issue_age display -f json
```

<details>
<summary> 演示录屏 </summary>

![json_display](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-mos-issue_age-display-json.gif)
</details>

#### 保存输出结果

我们可以将终端输出的内容保存到文件中,这样我们可以得到一个简易版的数据报告。

比如我们以图表形式输出仓库X-lab2017/open-digger的所有指标数据(除了project_openrank_network指标),并将输出结果保存到文件中:

```bash
opendigger repo -r X-lab2017/open-digger query display -f graph -s .
```

<details>
<summary> 演示录屏 </summary>

https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-dispaly-save.mp4
</details>

### export 命令

`export`命令是`query`命令的子命令,用于将筛选出来的数据经过GPT分析后导出数据报告或直接导出原始json数据。具体支持参数如下:

```text
-f, --format [report|json]  Format to export  [required]
-s, --save-dir DIRECTORY    Directory to save indicators  [required]
--split / --no-split        Save indicators in separate files, ONLY For JSON format
```

可以通过`-f`参数指定输出格式,并且通过`-s / --save-dir`参数可以将数据保存到指定目录中,通过`--split / --no-split`参数可以将数据分别保存到不同的文件中(只对json格式有用)。

#### 数据报告

数据报告是我们对筛选出来的数据进行GPT分析后生成的,该报告包含了筛选出来的数据的分析结果和数据的可视化结果。

具体使用如下:

**查看仓库X-lab2017/open-digger的所有指标数据(除project_openrank_detail指标),并导出数据报告:**

```bash
opendigger repo -r X-lab2017/open-digger query export -f report -s .
```

<details>
<summary> 演示录屏 </summary>

https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-export-report.mp4
</details>

**查看仓库X-lab2017/open-digger的所有指标数据(其中查看2023年8月的project_openrank_detail指标,并导出数据报告:**

```bash
open-digger repo -r X-lab2017/open-digger query -s project_openrank_detail:2023-08 export -f report -s .
```

#### 原始Json数据

我们可以将筛选出来的数据导出为原始的json数据,这样用户可以自行处理数据。

具体使用如下:

```bash
# 查看仓库X-lab2017/open-digger的所有指标数据(其中查看2023年8月的project_openrank_detail的指标),并导出原始json数据
open-digger repo -r X-lab2017/open-digger query -s project_openrank_detail:2023-08 export -f json -s .
```

### 组合使用

query的所有子命令都可以组合使用,比如我们可以先使用`query`命令筛选出我们关心的指标数据,然后使用`display`命令将筛选出来的数据以表格、图表或json格式在终端输出,最后使用`export`命令将筛选出来的数据经过GPT分析后导出数据报告或直接导出原始json数据。如果用户开发了自定义的插件,也可以使用自定义的插件对筛选出来的数据进行处理。

比如我们想要查看仓库`X-lab2017/open-digger`的`index`类型的`openrank`指标数据,并且只查看2023年的数据,并以表格形式在终端打印,最后将筛选出来的数据已json格式导出,我们可以这样做:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank:2023 display -f table export -f json -s .
```

结果截图:

![query-display-export](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/export_display.png)

## 👀异常处理

<a id="异常处理"></a>

### 缺失数据自动反馈

open-digger官方仓库对于一些仓库的指标数据是缺失的。用户查询某个仓库的指标数据时,如果该仓库的指标数据缺失,我们会给出相应的提示,并且会使用用户配置的`github personal access token`调用Github API在`opendigger-pycli`的github上自动提交一个数据缺失的issue。

issue信息如图所示:

![issue](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/issue.png)

如果多个用户重复查询同一个仓库的指标数据,我们不会冗余的提交,而是在原有的issue上添加一个"👀"符号。这样open-digger开发者可以通过定期查看issue来了解用户关注哪些仓库/用户的哪些指标数据。如果关注人数较多,可以决策是否添加该仓库/用户的指标数据。

### 仓库不存在

如果用户输入的仓库/用户不存在,我们会给出相应的提示。

比如我们输入了一个不存在的仓库`X-lab2017/open-digger-404`,我们会给出相应的提示:

```bash
opendigger repo -r X-lab2017/open-digger-404
```

![repo_not_found](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/repo-404.png)

### 用户不存在

如果用户输入的仓库/用户不存在,我们会给出相应的提示。

比如我们输入了一个不存在的用户`CoderChen01-404`,我们会给出相应的提示:

```bash
opendigger user -u CoderChen01-404
```

![repo_not_found](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/user-404.png)

## 🔌插件开发

<a id="插件开发"></a>

插件是opendigger-pycli的一个重要特性,它可以帮助用户快速开发自定义的命令,对筛选出来的数据进行处理。最为重要的就是我们的`query`命令,它利用了`click`库提供的[Mult Command Pipelines](https://click.palletsprojects.com/en/8.1.x/commands/#multi-command-pipelines)特性,可以将筛选出来的数据传递给它的子命令,子命令可以是`display`命令,也可以是用户自定义的命令。

### query的返回数据

```python
@dataclass
class BaseQueryResult:
    type: t.ClassVar[t.Literal["user", "repo"]]
    dataloaders: t.List["DataloaderProto"]
    indicator_queries: t.List[t.Tuple[str, t.Optional["IndicatorQuery"]]]
    uniform_query: t.Optional["IndicatorQuery"]
    data: t.Dict[str, "DataloaderResult"] = field(default_factory=dict, init=False)
    queried_data: t.Dict[str, "DataloaderResult"] = field(
        default_factory=dict, init=False
    )
    failed_query: t.Dict[
        str,
        t.Union[
            t.Optional["IndicatorQuery"],
            t.Dict[str, t.Optional["IndicatorQuery"]],
        ],
    ] = field(default_factory=dict, init=False)


@dataclass
class RepoQueryResult(BaseQueryResult):
    type: t.ClassVar[t.Literal["repo"]] = "repo"
    repo: t.Tuple[str, str]
    org_name: str = field(init=False)
    repo_name: str = field(init=False)

    def __post_init__(self) -> None:
        self.org_name, self.repo_name = self.repo
        run_dataloader(self)
        run_query(self)


@dataclass
class UserQueryResult(BaseQueryResult):
    type: t.ClassVar[t.Literal["user"]] = "user"
    username: str

    def __post_init__(self) -> None:
        run_dataloader(self)
        run_query(self)

```

其中当我们使用`repo`的`query`命令时,`query`命令的返回数据类型为`RepoQueryResult`,当我们使用`user`的`query`命令时,`query`命令的返回数据类型为`UserQueryResult`。

`RepoQueryResult`和`UserQueryResult`都继承自`BaseQueryResult`,`BaseQueryResult`中包含了`query`命令的一些基本信息。

如下是关键属性的介绍(具体用法请见源码:opendigger_pycli/results/display.py):

- `dataloaders`:`query`命令筛选出的指标的数据加载器。
- `indicator_queries`:`-s`参数指定的指标查询表达式。
- `uniform_query`:`-f`参数指定的指标筛选条件表达式。
- `data`:`query`命令下载的原始数据。
- `queried_data`:`query`命令筛选后的数据。
- `failed_query`:`query`命令筛选失败的指标查询表达式。

### 插件示例

该示例插件的功能是将筛选出来的数据基本信息打印到终端。

示例插件命令代码:

```python
# plugin_example/print_result/print_result.py

from __future__ import annotations
import typing as t
import click

from opendigger_pycli.console import CONSOLE
from opendigger_pycli.utils.decorators import processor


if t.TYPE_CHECKING:
    from opendigger_pycli.results.query import QueryResults


@click.command("print-result", help="[Plugin Demo] Print query result to terminal")
@processor
def print_result(results: QueryResults):
    CONSOLE.print(results)
    yield from results  # 这个yield from是必须的,它会将结果传递给其他子命令。
    
```

模块的安装配置如下:

```python
# plugin_example/print_result/setup.py

from setuptools import setup

setup(
    name="opendigger_pycli_print_result",
    version="0.1",
    py_modules=["print_result"],
    install_requires=[
        "click",
    ],
    entry_points="""
        [opendigger_pycli.plugins]
        print-result=print_result:print_result
    """,
)
```

注意`entry_points`的写法,`opendigger_pycli.plugins`是固定的,`print-result`是插件的名称,`print_result:print_result`定位到插件的入口函数。

具体配置见:[click-plugins](https://github.com/click-contrib/click-plugins/tree/master)

### 示例插件使用

进入示例插件的目录,执行如下命令安装插件:

```bash
cd plugin_example/print_result

python3 setup.py install
```

我们运行如下命令:

```bash
opendigger repo -r X-lab2017/open-digger  query  --help
```

![plugin_example](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/plugin.png)

会发现`query`命令的`--help`中多了一个`print-result`子命令。

我们运行如下命令:

```bash
opendigger repo -r X-lab2017/open-digger  query -ios openrank:2023 print-result
```

结果如下:

![plugin_example](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/plugin-result.png)

## 📄筛选条件表达式详解

<a id="筛选条件表达式详解"></a>

筛洗条件表达式主要分为如下几种:

- 年份查询
- 月份查询
- 年月查询
- 年月范围查询
- 年份范围查询
- 年份月份范围查询

我们使用~来表示范围,使用-来表示年月。

通过如下几个示例来说明:

查询2023年的数据:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank -f 2023 display -f table
```

查询2021年到2023年的数据:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank -f 2021~2023 display -f table
```

查询过往年份3月的数据:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank -f 3 display -f table
```

查询过往年份3月到8月的数据:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank -f 3~8 display -f table
```

查询2023年3月的数据:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank -f 2023-03 display -f table
```

查询2022年3月到2023年3月的数据:

```bash
opendigger repo -r X-lab2017/open-digger query -ios openrank -f 2022-03~2023-03 display -f table
```

## End

更多功能等待您的探索...

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "opendigger_pycli",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "opendigger,opendigger-pycli,opendigger-cli,opendigger-py,opensoda,open-digger",
    "author": null,
    "author_email": "CoderChen01 <wwseyy@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/30/70/4bc6e5ef3db311924e393c3810008e57a97879e34af54b6fe70d3382bbae/opendigger_pycli-1.0.3.tar.gz",
    "platform": null,
    "description": "# OpenDigger CLI \u6587\u6863\n\n![opendigger](https://img.shields.io/badge/Data-OpenDigger-2097FF)\n\n- [OpenDigger CLI \u6587\u6863](#opendigger-cli-\u6587\u6863)\n  - [\ud83d\uddfa\ufe0fBig Picture](#\ufe0fbig-picture)\n  - [\ud83e\ude9b\u5b89\u88c5](#\u5b89\u88c5)\n    - [\u57fa\u672c\u73af\u5883](#\u57fa\u672c\u73af\u5883)\n    - [\u4ece\u6e90\u7801\u5b89\u88c5](#\u4ece\u6e90\u7801\u5b89\u88c5)\n    - [\u4ecePyPI\u5b89\u88c5](#\u4ecepypi\u5b89\u88c5)\n  - [\ud83d\udd79\ufe0f\u57fa\u672c\u7528\u6cd5](#\ufe0f\u57fa\u672c\u7528\u6cd5)\n    - [\u5f00\u542f\u81ea\u52a8\u8865\u5168](#\u5f00\u542f\u81ea\u52a8\u8865\u5168)\n    - [\u83b7\u53d6Github Personal Access Token](#\u83b7\u53d6github-personal-access-token)\n    - [\u83b7\u53d6OpenAI key](#\u83b7\u53d6openai-key)\n    - [config \u547d\u4ee4](#config-\u547d\u4ee4)\n    - [repo \u547d\u4ee4](#repo-\u547d\u4ee4)\n    - [user \u547d\u4ee4](#user-\u547d\u4ee4)\n    - [query \u547d\u4ee4](#query-\u547d\u4ee4)\n      - [\u6309\u7c7b\u578b\u7b5b\u9009\u6307\u6807](#\u6309\u7c7b\u578b\u7b5b\u9009\u6307\u6807)\n      - [\u6309\u65f6\u95f4\u7b5b\u9009\u6307\u6807\u6570\u636e](#\u6309\u65f6\u95f4\u7b5b\u9009\u6307\u6807\u6570\u636e)\n      - [\u5bf9\u67d0\u4e00\u6307\u6807\u8fdb\u884c\u65f6\u95f4\u7b5b\u9009](#\u5bf9\u67d0\u4e00\u6307\u6807\u8fdb\u884c\u65f6\u95f4\u7b5b\u9009)\n      - [\u6b63\u5411\u7b5b\u9009\u6307\u6807](#\u6b63\u5411\u7b5b\u9009\u6307\u6807)\n      - [\u53cd\u5411\u7b5b\u9009\u6307\u6807](#\u53cd\u5411\u7b5b\u9009\u6307\u6807)\n    - [display \u547d\u4ee4](#display-\u547d\u4ee4)\n      - [\u8868\u683c\u683c\u5f0f](#\u8868\u683c\u683c\u5f0f)\n      - [\u56fe\u8868\u683c\u5f0f](#\u56fe\u8868\u683c\u5f0f)\n      - [json\u683c\u5f0f](#json\u683c\u5f0f)\n      - [\u4fdd\u5b58\u8f93\u51fa\u7ed3\u679c](#\u4fdd\u5b58\u8f93\u51fa\u7ed3\u679c)\n    - [export \u547d\u4ee4](#export-\u547d\u4ee4)\n      - [\u6570\u636e\u62a5\u544a](#\u6570\u636e\u62a5\u544a)\n      - [\u539f\u59cbJson\u6570\u636e](#\u539f\u59cbjson\u6570\u636e)\n    - [\u7ec4\u5408\u4f7f\u7528](#\u7ec4\u5408\u4f7f\u7528)\n  - [\ud83d\udc40\u5f02\u5e38\u5904\u7406](#\u5f02\u5e38\u5904\u7406)\n    - [\u7f3a\u5931\u6570\u636e\u81ea\u52a8\u53cd\u9988](#\u7f3a\u5931\u6570\u636e\u81ea\u52a8\u53cd\u9988)\n    - [\u4ed3\u5e93\u4e0d\u5b58\u5728](#\u4ed3\u5e93\u4e0d\u5b58\u5728)\n    - [\u7528\u6237\u4e0d\u5b58\u5728](#\u7528\u6237\u4e0d\u5b58\u5728)\n  - [\ud83d\udd0c\u63d2\u4ef6\u5f00\u53d1](#\u63d2\u4ef6\u5f00\u53d1)\n    - [query\u7684\u8fd4\u56de\u6570\u636e](#query\u7684\u8fd4\u56de\u6570\u636e)\n    - [\u63d2\u4ef6\u793a\u4f8b](#\u63d2\u4ef6\u793a\u4f8b)\n    - [\u793a\u4f8b\u63d2\u4ef6\u4f7f\u7528](#\u793a\u4f8b\u63d2\u4ef6\u4f7f\u7528)\n  - [\ud83d\udcc4\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u8be6\u89e3](#\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u8be6\u89e3)\n  - [End](#end)\n\n## \ud83d\uddfa\ufe0fBig Picture\n\n<a id=\"big-picture\"></a>\n\n![Big Picture](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/commands_big_picture.png)\n\n## \ud83e\ude9b\u5b89\u88c5\n\n<a id=\"\u5b89\u88c5\"></a>\n\n### \u57fa\u672c\u73af\u5883\n\nPython >= 3.8\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\n\n```bash\npython3 -m pip install flit\n\ngit clone https://github.com/CoderChen01/opendigger-pycli.git\n\nflit install\n# \u8be6\u89c1\uff1ahttps://github.com/pypa/flit\n```\n\n### \u4ecePyPI\u5b89\u88c5\n\n```bash\npip3 install opendigger_pycli\n```\n\n## \ud83d\udd79\ufe0f\u57fa\u672c\u7528\u6cd5\n\n<a id=\"\u57fa\u672c\u7528\u6cd5\"></a>\n\n### \u5f00\u542f\u81ea\u52a8\u8865\u5168\n\nzsh:\n\n```zsh\neval \"$(_OPENDIGGER_COMPLETE=zsh_source opendigger)\"\n```\n\nbash:\n\n```bash\neval \"$(_FOO_BAR_COMPLETE=bash_source opendigger)\"\n```\n\n### \u83b7\u53d6Github Personal Access Token\n\nGithub Personal Access Token\u7528\u4e8e\u8bbf\u95eeGithub API\uff0c\u83b7\u53d6Github API\u7684\u6743\u9650\u3002\u901a\u8fc7Github API\u6211\u4eec\u53ef\u4ee5\u83b7\u53d6\u5230Github\u4e0a\u7684\u4ed3\u5e93\u548c\u7528\u6237\u7684\u57fa\u672c\u4fe1\u606f\u548c\u81ea\u52a8\u53cd\u9988\u7f3a\u5931\u6570\u636e\u3002\n\n[\u70b9\u51fb\u8fd9\u91cc](https://github.com/settings/tokens?type=beta) \u83b7\u53d6\u3002\n\n\u5177\u4f53\u6b65\u9aa4\uff1a\n\n1.\u70b9\u51fb`Fine-grained tokens` > \u70b9\u51fb`Generate new token`\n\n![\u7b2c\u4e00\u6b65](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/01.png)\n\n2.\u8bbe\u7f6e`Token name`\u548c`Token Expiration`\n\n![\u7b2c\u4e8c\u6b65](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/02.png)\n\n3.\u9009\u62e9\u4ed3\u5e93\u6743\u9650\n\n![\u7b2c\u4e09\u6b65](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/03.png)\n\n4.\u8bbe\u7f6eissue\u7684\u8bfb\u5199\u6743\u9650\n\n\u6ce8\u610fmetadata\u6743\u9650\u4e5f\u5fc5\u987b\u540c\u65f6\u8bbe\u7f6e\u53ea\u8bfb\u6743\u9650\n\n![\u7b2c\u56db\u6b65](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/github_pat/04.png)\n\n### \u83b7\u53d6OpenAI key\n\nOpenAI key\u7528\u4e8e\u8bbf\u95eeOpenAI API\uff0c\u83b7\u53d6OpenAI API\u7684\u6743\u9650\u3002\u901a\u8fc7OpenAI API\u6211\u4eec\u53ef\u4ee5\u5bf9\u6307\u6807\u6570\u636e\u8fdb\u884c\u5206\u6790\u548c\u751f\u6210\u6d1e\u5bdf\u62a5\u544a\u3002\n\n[\u70b9\u51fb\u8fd9\u91cc](https://beta.openai.com/account/api-keys) \u83b7\u53d6\u3002\n\n### config \u547d\u4ee4\n\nconfig\u547d\u4ee4\u7528\u4e8e\u914d\u7f6e\u5de5\u5177\u6240\u4f7f\u7528\u5230\u7684\u7b2c\u4e09\u65b9API\u5bc6\u94a5\u548c\u57fa\u672c\u7684\u7528\u6237\u4fe1\u606f\u3002\u76ee\u524d\u5de5\u5177\u4f7f\u7528\u5230\u4e86Github API\u548cOpenAI API\u3002\u4e24\u8005\u672c\u522b\u7528\u6765\u67e5\u8be2\u4ed3\u5e93\u548c\u7528\u6237\u7684\u57fa\u672c\u4fe1\u606f\uff0c\u548c\u7528\u6765\u5bf9\u6307\u6807\u6570\u636e\u8fdb\u884c\u5206\u6790\u548c\u751f\u6210\u6d1e\u5bdf\u62a5\u544a\u3002\n\n\u8be5\u547d\u4ee4\u53ea\u6709\u4e00\u4e2a\u53c2\u6570\uff1a\n\n`-s / --set`\uff1a\u7528\u4e8e\u8bbe\u7f6e\u914d\u7f6e\u9879\uff08\u8be5\u53c2\u6570\u53ef\u4ee5\u591a\u6b21\u4f7f\u7528\uff09\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n```bash\n# \u914d\u7f6eGithub API\u5bc6\u94a5\nopendigger config --set app_keys.github_pat <your_pat>\n\n# \u914d\u7f6eOpenAI API\u5bc6\u94a5\nopendigger config -s app_keys.openai_key <your_key>\n\n# \u540c\u65f6\u914d\u7f6e\u7528\u6237\u59d3\u540d\u548c\u90ae\u7bb1\nopendigger config -s user_info.name <your_name> -s user_info.email <your_email>\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\n![config](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/config.gif)\n</details>\n\n### repo \u547d\u4ee4\n\nrepo\u547d\u4ee4\u7528\u4e8e\u67e5\u770b\u4ed3\u5e93\u7684\u6307\u6807\u6570\u636e\u3002\u8be5\u547d\u4ee4\u6709\u4e00\u4e2a\u53c2\u6570\uff1a\n\n`-r / --repo`\uff1a\u7528\u4e8e\u6307\u5b9a\u4ed3\u5e93\u540d\u79f0\u3002\uff08\u8be5\u53c2\u6570\u53ef\u4ee5\u591a\u6b21\u4f7f\u7528\uff09\n\n\u5982\u679c\u591a\u6b21\u6307\u5b9a\u5c06\u4f1a\u67e5\u8be2\u591a\u4e2a\u4ed3\u5e93\u7684\u6307\u6807\u6570\u636e\u3002\n\n\u8be5\u547d\u4ee4\u5355\u72ec\u4f7f\u7528\u65f6\uff0c\u5c06\u4f1a\u67e5\u8be2\u4ed3\u5e93\u7684\u57fa\u672c\u4fe1\u606f\u3002\u57fa\u672c\u4fe1\u606f\u5305\u62ec\u4ed3\u5e93\u4e3b\u9875\u94fe\u63a5\u3001\u4ed3\u5e93Owner\u4e3b\u9875\u94fe\u63a5\u3001\u4ed3\u5e93\u662f\u5426\u662fFork\u7684\u548c\u4ed3\u5e93\u7684\u521b\u5efa\u65f6\u95f4\u4e0e\u6700\u8fd1\u66f4\u65b0\u65f6\u95f4\u3002**\u901a\u8fc7\u8fd9\u4e9b\u4fe1\u606f\u53ef\u4ee5\u5e2e\u52a9\u7528\u6237\u5feb\u901f\u4e86\u89e3\u4ed3\u5e93\u7684\u57fa\u672c\u60c5\u51b5\u3002**\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n```bash\n# \u67e5\u8be2\u5355\u4e2a\u4ed3\u5e93\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger\n\n# \u67e5\u8be2\u591a\u4e2a\u4ed3\u5e93\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger -r microsoft/vscode\n```\n\n<details>\n<summary> \u7ed3\u679c\u622a\u56fe </summary>\n\n![repo](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/repo-01.png)\n\n![repo](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/repo-02.png)\n</details>\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\n![repo](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo.gif)\n</details>\n\n### user \u547d\u4ee4\n\nuser\u547d\u4ee4\u7528\u4e8e\u67e5\u770b\u7528\u6237\u7684\u6307\u6807\u6570\u636e\u3002\u8be5\u547d\u4ee4\u6709\u4e00\u4e2a\u53c2\u6570\uff1a\n\n`-u / --username`\uff1a\u7528\u4e8e\u6307\u5b9a\u7528\u6237\u540d\u3002\uff08\u8be5\u53c2\u6570\u53ef\u4ee5\u591a\u6b21\u4f7f\u7528\uff09\n\n\u5982\u679c\u591a\u6b21\u6307\u5b9a\u5c06\u4f1a\u67e5\u8be2\u591a\u4e2a\u7528\u6237\u7684\u6307\u6807\u6570\u636e\u3002\n\n\u8be5\u547d\u4ee4\u5355\u72ec\u4f7f\u7528\u65f6\uff0c\u5c06\u4f1a\u67e5\u8be2\u7528\u6237\u7684\u57fa\u672c\u4fe1\u606f\u3002\u57fa\u672c\u4fe1\u606f\u5305\u62ec\u7528\u6237\u540d\u3001\u7528\u6237\u6635\u79f0\u3001\u7528\u6237\u90ae\u7bb1\u3001\u7528\u6237\u4e3b\u9875\u94fe\u63a5\u3001\u7528\u6237\u521b\u5efa\u65f6\u95f4\u548c\u7528\u6237\u6700\u8fd1\u66f4\u65b0\u65f6\u95f4\u3002**\u901a\u8fc7\u8fd9\u4e9b\u4fe1\u606f\u53ef\u4ee5\u5e2e\u52a9\u7528\u6237\u5feb\u901f\u4e86\u89e3\u7528\u6237\u7684\u57fa\u672c\u60c5\u51b5\u3002**\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n```bash\n# \u67e5\u8be2\u5355\u4e2a\u7528\u6237\u7684\u57fa\u672c\u4fe1\u606f\nopendigger user -u CoderChen01\n\n# \u67e5\u8be2\u591a\u4e2a\u7528\u6237\u7684\u57fa\u672c\u4fe1\u606f\nopendigger user -u CoderChen01 -u X-lab2017\n```\n\n<details>\n<summary> \u7ed3\u679c\u622a\u56fe </summary>\n\n![user](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/user-01.png)\n\n![user](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/user-02.png)\n</details>\n\n### query \u547d\u4ee4\n\nquery\u547d\u4ee4\u662f`repo`\u548c`user`\u7684\u5b50\u547d\u4ee4(\u26a0\ufe0fquery\u547d\u4ee4\u53ea\u80fd\u591f\u5728`repo`\u548c`user`\u547d\u4ee4\u4e4b\u540e\u4f7f\u7528\u3002)\uff0c\u7528\u4e8e\u5bf9\u4ed3\u5e93\u6216\u7528\u6237\u7684\u6307\u6807\u6570\u636e\u8fdb\u884c\u7b5b\u9009\u3002\n\n\u5f53\u524d\u652f\u6301\u7684\u7b5b\u9009\u6761\u4ef6\u6709\uff1a\n\n- \u6309\u7c7b\u578b\u7b5b\u9009\u6307\u6807\n- \u6309\u65f6\u95f4\u7b5b\u9009\u6307\u6807\u6570\u636e\n- \u5bf9\u67d0\u4e00\u6307\u6807\u8fdb\u884c\u7b5b\u9009\n- \u6b63\u5411\u7b5b\u9009\u6307\u6807\n- \u53cd\u5411\u7b5b\u9009\u6307\u6807\n\nquery\u547d\u4ee4\u7684\u6240\u6709\u53c2\u6570\u5982\u4e0b\uff1a\n\n```text\n-i, --index                     Select indicators whose type is INDEX.\n-m, --metric                    Select indicators whose type is METRIC.\n-n, --network                   Select indicators whose type is NETWORK.\n-x, --x-lab                     Select indicators whose introducer is X-lab.\n-c, --chaoss                    Select indicators whose introducer is\n                                CHAOSS.\n-s, --select INDICATOR_QUERY    The indicator to select.\n-o, --only-select / -N, --no-only-select\n                                Only query selected indicators.\n-I, --ignore IGNORED_INDICATOR_NAMES\n                                The indicators to ignore.\n-f, --fileter INDICATOR_QUERY   The query applying to all indicators\n```\n\nquery \u547d\u4ee4\u6709\u4e24\u4e2a\u5b50\u547d\u4ee4\uff1a\n\n- `display`: \u7528\u4e8e\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u4ee5\u8868\u683c\u3001\u56fe\u8868\u6216json\u683c\u5f0f\u5728\u7ec8\u7aef\u8f93\u51fa\u3002\n- `export`: \u7528\u4e8e\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u7ecf\u8fc7GPT\u5206\u6790\u540e\u5bfc\u51fa\u6570\u636e\u62a5\u544a\u6216\u76f4\u63a5\u5bfc\u51fa\u539f\u59cbjson\u6570\u636e\u3002\n\n> \u26a0\ufe0f \u7279\u522b\u8bf4\u660e\n>\n> query\u547d\u4ee4\u53ef\u4ee5\u7406\u89e3\u4e3a\u662f\u4e00\u4e2a\u6570\u636e\u4e0b\u8f7d\u5668\uff0c\u5b83\u53ef\u4ee5\u6839\u636e\u7528\u6237\u6240\u4f20\u53c2\u6570\u4eceopendigger\u7684\u6570\u636e\u4ed3\u5e93\u4e2d\u4e0b\u8f7d\u6307\u5b9a\u7684\u6570\u636e\u3002\n> \u4f46\u662f**query\u547d\u4ee4\u5e76\u4e0d\u4f1a\u5bf9\u6570\u636e\u8fdb\u884c\u5904\u7406**\uff0c\u5b83\u53ea\u662f\u5c06\u6570\u636e\u4e0b\u8f7d\u5230\u672c\u5730\u3002\n> \u5982\u679c\u7528\u6237\u9700\u8981\u5bf9\u6570\u636e\u8fdb\u884c\u5904\u7406\uff0c\u53ef\u4ee5\u4f7f\u7528`query`\u547d\u4ee4\u7684`display`\u5b50\u547d\u4ee4\u548c`export`\u5b50\u547d\u4ee4\u3002\u5982\u679c\u7528\u6237\u6ca1\u6709\u5728query\u540e\u4f7f\u7528`display`\u6216`export`\u5b50\u547d\u4ee4\uff0c\u90a3\u4e48query\u547d\u4ee4\u5c06\u4e0d\u4f1a\u5bf9\u6570\u636e\u8fdb\u884c\u4efb\u4f55\u5904\u7406\uff0c\u800c\u662f\u53ea\u8f93\u51fa\u7b5b\u9009\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\u3002\n> \u7528\u6237\u4e5f\u53ef\u4ee5\u901a\u8fc7\u6211\u4eec\u63d0\u4f9b\u7684\u63a5\u53e3\u83b7\u53d6query\u547d\u4ee4\u4e0b\u8f7d\u5e76\u7b5b\u9009\u540e\u7684\u6570\u636e\uff0c\u5f00\u53d1\u81ea\u5b9a\u4e49\u7684\u547d\u4ee4\u3002\u5177\u4f53\u89c1[\ud83d\udd0c\u63d2\u4ef6\u5f00\u53d1](#\u63d2\u4ef6\u5f00\u53d1)\u3002\n\n#### \u6309\u7c7b\u578b\u7b5b\u9009\u6307\u6807\n\nquery\u547d\u4ee4\u5728**\u4e0d\u5e26\u4efb\u4f55\u53c2\u6570**\u7684\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u8f93\u51fa\u5f53\u524d\u652f\u6301\u7684**\u6240\u6709\u6307\u6807**\u7684\u57fa\u672c\u4fe1\u606f\u3002\u57fa\u672c\u4fe1\u606f\u5305\u62ec\u6307\u6807\u540d\u79f0\u3001\u6307\u6807\u7c7b\u578b\u3001\u6307\u6807\u5f15\u5165\u8005\u548c\u6307\u6807\u6570\u636e\u793a\u4f8b\u94fe\u63a5\u3002\n\n\u5177\u4f53\u6f14\u793a\u5982\u4e0b\uff1a\n\n```bash\n# \u67e5\u770b\u4ed3\u5e93\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query.gif\n)\n</details>\n\n\u5982\u679c\u6211\u4eec\u9700\u8981\u67e5\u770b\u67d0\u4e00\u7c7b\u578b\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\uff0c\u53ef\u4ee5\u4f7f\u7528`-i`\u3001`-m`\u548c`-n`\u53c2\u6570\u3002\n\n\u5982\u679c\u6211\u4eec\u9700\u8981\u67e5\u770b\u67d0\u4e00\u5f15\u5165\u8005\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\uff0c\u53ef\u4ee5\u4f7f\u7528`-x`\u548c`-c`\u53c2\u6570\u3002\n\n\u540c\u65f6\u8fd9\u4e9b\u6307\u6807\u53ef\u4ee5\u7ec4\u5408\u4f7f\u7528\uff0c\u4f8b\u5982\uff1a\n\n```bash\n# \u67e5\u770b\u6307\u6807\u7c7b\u578b\u4e3aindex\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -i\n# \u6216\u8005\nopendigger repo -r X-lab2017/open-digger query --index\n\n# \u67e5\u770b\u6307\u6807\u7c7b\u578b\u4e3ametric\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -m\n\n# \u67e5\u770b\u6307\u6807\u7c7b\u578b\u4e3anetwork\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -n\n\n# \u67e5\u770b\u6307\u6807\u5f15\u5165\u8005\u4e3aX-lab\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -x\n\n# \u67e5\u770b\u6307\u6807\u5f15\u5165\u8005\u4e3aCHAOSS\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -c\n\n# \u67e5\u770b\u6307\u6807\u7c7b\u578b\u4e3ametric\u4e14\u5f15\u5165\u8005\u4e3aX-lab\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -m -x\n# \u6216\u8005\nopendigger repo -r X-lab2017/open-digger query -m --x-lab\n# \u6216\u8005\nopendigger repo -r X-lab2017/open-digger query -xm\n# \u6216\u8005\nopendigger repo -r X-lab2017/open-digger query --metric --x-lab\n\n# \u67e5\u770b\u6307\u6807\u7c7b\u578b\u4e3ametric\u4e14\u5f15\u5165\u8005\u4e3aCHAOSS\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\nopendigger repo -r X-lab2017/open-digger query -m -c\n```\n\n\u5982\u4e0a\u6240\u793a\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u7ec4\u5408\u4f7f\u7528`-i`\u3001`-m`\u3001`-n`\u3001`-x`\u548c`-c`\u53c2\u6570\u6765\u67e5\u770b\u6211\u4eec\u60f3\u8981\u7684\u6307\u6807\u7684\u57fa\u672c\u4fe1\u606f\u3002\u8fd9\u4e9b\u53c2\u6570\u90fd\u4e0d\u63a5\u53d7\u503c\uff0c\u53ea\u9700\u8981\u6307\u5b9a\u5373\u53ef\u3002\n\n#### \u6309\u65f6\u95f4\u7b5b\u9009\u6307\u6807\u6570\u636e\n\n\u901a\u8fc7\u4e0a\u8ff0\u53c2\u6570\u6211\u4eec\u53ef\u4ee5\u7b5b\u9009\u51fa\u6211\u4eec\u5173\u6ce8\u7684\u6307\u6807\u7c7b\u578b\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7`-f`\u53c2\u6570\u5bf9\u7b5b\u9009\u51fa\u7684\u6307\u6807\u7c7b\u578b\u7684\u6570\u636e\u8fdb\u884c\u65f6\u95f4\u4e0a\u7684\u7b5b\u9009\u3002\n\n`-f`\u53c2\u6570\u63a5\u53d7\u4e00\u4e2a\u6307\u6807\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\uff0c\u8be6\u7ec6\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u89c1\u4e0b\u65b9\uff1a[\ud83d\udcc4\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u8be6\u89e3](#\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u8be6\u89e3)\u3002\n\n\u4e0b\u9762\u662f\u4e00\u4e9b\u4f8b\u5b50\uff08\u8fd9\u91cc\u4e3a\u4e86\u4fbf\u4e8e\u6f14\u793a\u5c06\u4f7f\u7528`display`\u5b50\u547d\u4ee4\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u5728\u7ec8\u7aef\u4ee5\u8868\u683c\u5f62\u5f0f\u8f93\u51fa\uff09\uff1a\n\n```bash\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u57282023\u5e74\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -f 2023 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u57282021~2023\u5e74\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -f 2021~2023 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u57282021\u5e743\u6708~2023\u5e743\u6708\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -f 2021-03~2023-03 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u8fc7\u53bb\u5e74\u4efd3\u6708\u52308\u6708\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -f 3~8 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u8fc7\u53bb\u5e74\u4efd3\u6708\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -f 3 display -f table\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-f.gif\n)\n\n[query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-f.gif\n)\n</details>\n\n#### \u5bf9\u67d0\u4e00\u6307\u6807\u8fdb\u884c\u65f6\u95f4\u7b5b\u9009\n\n\u57fa\u4e8e`-f`\u53c2\u6570\u6211\u4eec\u53ef\u4ee5\u5bf9\u7b5b\u9009\u51fa\u7684\u6307\u6807\u8fdb\u884c\u65f6\u95f4\u4e0a\u7684\u8fc7\u6ee4\uff0c\u4f46\u662f\u5982\u679c\u6211\u4eec\u9700\u8981\u9488\u5bf9\u67d0\u4e00\u4e2a\u6307\u6807\u8fdb\u884c\u7b5b\u9009\u8be5\u600e\u4e48\u529e\u5462\uff1f\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7`-s`\u53c2\u6570\u6765\u5bf9\u67d0\u4e00\u4e2a\u6307\u6807\u6307\u5b9a\u7b5b\u9009\u6761\u4ef6\u3002\n\n`-s`\u53c2\u6570\u63a5\u53d7\u4e00\u4e2a\u6307\u6807\u67e5\u8be2\u8868\u8fbe\u5f0f\uff0c\u8be5\u8868\u8fbe\u5f0f\u7531\u6307\u6807\u540d\u79f0\u548c\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u7ec4\u6210\u3002\u6307\u6807\u540d\u79f0\u548c\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u4e4b\u95f4\u7528`:`\u5206\u9694\u3002\n\n\u4e0b\u9762\u662f\u4e00\u4e9b\u4f8b\u5b50\uff08\u8fd9\u91cc\u4e3a\u4e86\u4fbf\u4e8e\u6f14\u793a\u5c06\u4f7f\u7528`display`\u5b50\u547d\u4ee4\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u5728\u7ec8\u7aef\u4ee5\u8868\u683c\u5f62\u5f0f\u8f93\u51fa\uff09\uff1a\n\n```bash\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b2023\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:2023 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b2021~2022\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:2021~2022 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b2021\u5e743\u6708~2022\u5e743\u6708\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:2021-03~2022-03 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b\u8fc7\u53bb\u5e74\u4efd3\u6708\u52308\u6708\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:3~8 display -f table\n\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b\u8fc7\u53bb\u5e74\u4efd8\u6708\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:8 display -f table\n```\n\n\u6f14\u793a\u5f55\u5c4f\uff1a\n\n<details>\n<summary> \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b2023\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370 </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-2023.gif\n)\n</details>\n\n<details>\n<summary> \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b2021~2022\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370 </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-2021~2022.gif\n)\n</details>\n\n<details>\n<summary> \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b2021\u5e743\u6708~2022\u5e743\u6708\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370 </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-2021-3~2022-3.gif\n)\n</details>\n\n<details>\n<summary> \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b\u8fc7\u53bb\u5e74\u4efd3\u6708\u52308\u6708\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370 </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-3~8.gif\n)\n</details>\n\n<details>\n<summary> \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u5bf9openrank\u6307\u6807\u8fdb\u884c\u7b5b\u9009\uff0c\u53ea\u67e5\u770b\u8fc7\u53bb\u5e74\u4efd8\u6708\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370 </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-08.gif\n)\n</details>\n\n#### \u6b63\u5411\u7b5b\u9009\u6307\u6807\n\n\u6211\u4eec\u5df2\u7ecf\u53ef\u4ee5\u5bf9\u6307\u6807\u901a\u8fc7\u7c7b\u578b\u3001\u65f6\u95f4\u8fdb\u884c\u7b5b\u9009\u5e76\u5c06\u5176\u5728\u7ec8\u7aef\u4ee5\u8868\u683c\u5f62\u5f0f\u8f93\u51fa\u4e86\uff0c\u5e76\u4e14\u6211\u4eec\u8fd8\u80fd\u9488\u5bf9\u67d0\u4e00\u4e2a\u6307\u6807\u8fdb\u884c\u65f6\u95f4\u4e0a\u7684\u7b5b\u9009\u3002\u4f46\u662f\uff0cquery\u547d\u4ee4\u9ed8\u8ba4\u67e5\u8be2\u6240\u6709\u7684\u6307\u6807\uff0c\u5373\u4f7f\u6211\u4eec\u4f7f\u7528\u4e86`-i`, `-m`, `-n`, `-x`\u548c`-c`\u7b5b\u9009\u51fa\u7279\u5b9a\u7684\u6307\u6807\uff0c\u901a\u8fc7`-f`\u548c`-s`\u7b5b\u9009\u51fa\u7279\u5b9a\u7684\u6307\u6807\u6570\u636e\uff0c\u4f46\u662f\u6211\u4eec\u4ecd\u7136\u4f1a\u5f97\u5230\u5927\u91cf\u7684\u6307\u6807\u6570\u636e\uff0c\u8fd9\u4e9b\u6307\u6807\u6570\u636e\u4e2d\u53ef\u80fd\u6709\u6211\u4eec\u4e0d\u5173\u5fc3\u7684\u6307\u6807\u6570\u636e\u3002\n\n\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7`-o / --only-select`\u53c2\u6570\u4e0e`-s`\u53c2\u6570\u914d\u5408\u4f7f\u7528\uff0c\u53ea\u67e5\u8be2\u6211\u4eec\u5173\u5fc3\u7684\u6307\u6807\u6570\u636e\u3002\n\n\u6bd4\u5982\u6211\u4eec\u53ea\u67e5\u8be2\u4ed3\u5e93`X-lab2017/open-digger`\u7684`index`\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4e14\u53ea\u67e5\u8be2`openrank`\u6307\u6807\u7684\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u505a\uff1a\n\n```bash\n# \u53ea\u67e5\u770b\u8fc7\u5f80\u5e74\u4efd3~8\u6708\u7684openrank\u6307\u6807\u6570\u636e\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:3~8 -o display -f table\n# \u6216\u8005\nopendigger repo -r X-lab2017/open-digger query -i -s openrank:3~8 --only-select display -f table\n# \u6216\u8005\nopendigger repo -r X-lab2017/open-digger query -i -os openrank:3~8 display -f table\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\n![query](\n    https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-i-s-openrank-3~8-o.gif\n)\n</details>\n\n\u6211\u4eec\u8fd8\u53ef\u4ee5\u67e5\u8be2\u591a\u4e2a\u6307\u6807\u7684\u6570\u636e\uff0c\u6bd4\u5982\u6211\u4eec\u8fd8\u60f3\u67e5\u770b`openrank`\u548c`issue_age`\u6307\u6807\u7684\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u505a\uff1a\n\n```bash\n# \u53ea\u67e5\u770b\u8fc7\u5f80\u5e74\u4efd3~8\u6708\u7684openrank\u548c\u8fc7\u5f805~8\u6708\u7684issue_age\u6307\u6807\u6570\u636e\nopendigger repo -r X-lab2017/open-digger query -s openrank:3~8 -s issue_age:5~8 -o display -f table\n```\n\n#### \u53cd\u5411\u7b5b\u9009\u6307\u6807\n\n\u6211\u4eec\u8fd8\u53ef\u4ee5\u901a\u8fc7`-I / --ignore`\u53c2\u6570\u6765\u53cd\u5411\u7b5b\u9009\u6307\u6807\uff0c\u5373\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7`-I / --ignore`\u53c2\u6570\u6765\u5ffd\u7565\u67d0\u4e9b\u6307\u6807\u3002\n\n\u6bd4\u5982\u6211\u4eec\u53ea\u67e5\u8be2\u4ed3\u5e93`X-lab2017/open-digger`\u7684`index`\u7c7b\u578b\u7684\u6307\u6807\u6570\u636e\uff0c\u5e76\u4e14\u5ffd\u7565`openrank`\u6307\u6807\u7684\u6570\u636e\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u505a\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -i -I openrank display -f table\n```\n\n### display \u547d\u4ee4\n\n`display`\u547d\u4ee4\u662f`query`\u547d\u4ee4\u7684\u5b50\u547d\u4ee4\uff0c\u7528\u4e8e\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u4ee5\u8868\u683c\u3001\u56fe\u8868\u6216json\u683c\u5f0f\u5728\u7ec8\u7aef\u8f93\u51fa\u3002\u8be5\u547d\u4ee4\u5728\u4e0a\u6587\u6f14\u793a\u4e2d\u5df2\u7ecf\u4f7f\u7528\u8fc7\uff0c\u4e0d\u8fc7\u8be5\u547d\u4ee4\u8fd8\u652f\u6301\u9664\u4e86table\u683c\u5f0f\u7684\u5176\u4ed6\u683c\u5f0f\u3002\u5177\u4f53\u652f\u6301\u53c2\u6570\u5982\u4e0b\uff1a\n\n```text\n-f, --format [table|graph|json]\n                                Display format  [required]\n-s, --save DIRECTORY            Save output to file, you can use this option\n                                get a simple report\n-p, --paging / --no-paging      Page output like more/less command, you\n                                CANNOT use this option and save to file at\n                                the same time\n-c, --pager-color / --no-pager-color\n                                Enable color in pager, Only works when\n                                paging is enabled\n```\n\n\u53ef\u4ee5\u901a\u8fc7`-f`\u53c2\u6570\u6307\u5b9a\u8f93\u51fa\u683c\u5f0f\uff0c\u5e76\u4e14\u901a\u8fc7`-s / --save`\u53c2\u6570\u53ef\u4ee5\u5c06\u7ec8\u7aef\u8f93\u51fa\u7684\u5185\u5bb9\u4fdd\u5b58\u5230\u6587\u4ef6(\u4e00\u4e2a\u7b80\u6613\u7248\u7684\u6570\u636e\u62a5\u544a)\u4e2d\uff0c\u901a\u8fc7`-p / --paging`\u53c2\u6570\u53ef\u4ee5\u5c06\u7ec8\u7aef\u8f93\u51fa\u7684\u5185\u5bb9\u5206\u9875\u663e\u793a\uff0c\u901a\u8fc7`-c / --pager-color`\u53c2\u6570\u53ef\u4ee5\u5728\u5206\u9875\u663e\u793a\u65f6\u542f\u7528\u989c\u8272\u3002\n\n#### \u8868\u683c\u683c\u5f0f\n\n\u8868\u683c\u683c\u5f0f\u5728\u4e0a\u6587\u4e2d\u5df2\u7ecf\u63d0\u53ca\uff0c\u8fd9\u91cc\u4e0d\u518d\u8d58\u8ff0\u3002\n\n#### \u56fe\u8868\u683c\u5f0f\n\n\u56fe\u8868\u683c\u5f0f\u53ef\u4ee5\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u4ee5\u56fe\u8868\u7684\u5f62\u5f0f\u5728\u7ec8\u7aef\u8f93\u51fa\u3002\u76ee\u524d\u652f\u6301\u7684\u56fe\u8868\u7c7b\u578b\u6709\uff1a\n\n- \u6a2a\u5411\u67f1\u72b6\u56fe\n- \u70ed\u529b\u56fe\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n**\u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684index\u7c7b\u578b\u7684openrank\u6307\u6807\u6570\u636e\uff0c\u53ea\u67e5\u770b2023\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u56fe\u8868\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370:**\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -i -os openrank:2023 display -f graph\n```\n\n\u7ed3\u679c\u622a\u56fe\uff1a\n\n![bar01](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/bar-01.png)\n\n\u4ece\u56fe\u4e2d\u53ef\u4ee5\u770b\u51faopenrank 2023\u5e74\u6bcf\u4e2a\u6708\u7684\u6570\u636e\u53d8\u5316\u3002\n\n**\u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684metric\u7c7b\u578b\u7684active_date_and_time\u6307\u6807\u6570\u636e\uff0c\u53ea\u67e5\u770b2023\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u56fe\u8868\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370:**\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -m -os active_date_and_time:2023 display -f graph\n```\n\n\u7ed3\u679c\u622a\u56fe\uff1a\n\n![heatmap](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/heatmap-01.png)\n\n\u4ece\u56fe\u4e2d\u53ef\u4ee5\u770b\u51fa2023\u5e74\u6bcf\u4e2a\u6708\u7684\u6d3b\u8dc3\u65f6\u95f4\u6bb5\u3002\u70ed\u529b\u56fe\u7684\u6a2a\u7eb5\u5750\u6807\u6807\u53f7\u7684\u542b\u4e49\u5728\u56fe\u4e0b\u65b9\u4e5f\u4f1a\u6709\u76f8\u5e94\u7684\u8bf4\u660e\u3002\n\n**\u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684metric\u7c7b\u578b\u7684summed_code_change_line\u6307\u6807\u6570\u636e\uff0c\u5e76\u4ee5\u56fe\u8868\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370:**\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -m -os summed_code_change_line display -f graph\n```\n\n\u7ed3\u679c\u622a\u56fe\uff1a\n\n![bar02](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/bar-02.png)\n\n\u4ece\u56fe\u4e2d\u53ef\u4ee5\u770b\u51fasummed_code_change_line\u6307\u6807\u7684\u6570\u636e\u53d8\u5316\u3002\u5bf9\u4e8e\u8d1f\u503c\u7684\u6570\u636e\uff0c\u6211\u4eec\u4f1a\u5c06\u5176\u8f6c\u6362\u4e3a\u6b63\u503c\uff0c\u7136\u540e\u5728\u56fe\u8868\u4e2d\u4ee5\u7ea2\u8272\u663e\u793a\u3002\n\n#### json\u683c\u5f0f\n\n\u6211\u4eec\u8f93\u51fa\u7684json\u683c\u5f0f\u4e0e\u539f\u6570\u636e\u4e0d\u4e00\u6837\uff0c\u6211\u4eec\u5bf9\u539f\u59cb\u6570\u636e\u8fdb\u884c\u4e86\u5904\u7406\uff0c\u5c06\u5e74\u6708\u89e3\u6790\u4e86\u51fa\u6765\u5e76\u8fdb\u884c\u4e86\u6392\u5e8f\uff0c\u5bf9\u4e8e\u5305\u542b`-raw`\u7684\u5b57\u6bb5\u6211\u4eec\u4e5f\u8fdb\u884c\u4e86\u5904\u7406\u3002\u8fd9\u6837\u7528\u6237\u76f4\u63a5\u590d\u5236\u6253\u5370\u51fa\u6765\u7684json\u6570\u636e\u4e3a\u81ea\u5df1\u6240\u7528\u3002\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n\u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684metric\u7c7b\u578b\u7684issue_age\u6307\u6807\u6570\u636e,\u5e76\u4ee5json\u683c\u5f0f\u5728\u7ec8\u7aef\u6253\u5370:\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -mos issue_age display -f json\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\n![json_display](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-mos-issue_age-display-json.gif)\n</details>\n\n#### \u4fdd\u5b58\u8f93\u51fa\u7ed3\u679c\n\n\u6211\u4eec\u53ef\u4ee5\u5c06\u7ec8\u7aef\u8f93\u51fa\u7684\u5185\u5bb9\u4fdd\u5b58\u5230\u6587\u4ef6\u4e2d\uff0c\u8fd9\u6837\u6211\u4eec\u53ef\u4ee5\u5f97\u5230\u4e00\u4e2a\u7b80\u6613\u7248\u7684\u6570\u636e\u62a5\u544a\u3002\n\n\u6bd4\u5982\u6211\u4eec\u4ee5\u56fe\u8868\u5f62\u5f0f\u8f93\u51fa\u4ed3\u5e93X-lab2017/open-digger\u7684\u6240\u6709\u6307\u6807\u6570\u636e(\u9664\u4e86project_openrank_network\u6307\u6807)\uff0c\u5e76\u5c06\u8f93\u51fa\u7ed3\u679c\u4fdd\u5b58\u5230\u6587\u4ef6\u4e2d\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query display -f graph -s .\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\nhttps://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-dispaly-save.mp4\n</details>\n\n### export \u547d\u4ee4\n\n`export`\u547d\u4ee4\u662f`query`\u547d\u4ee4\u7684\u5b50\u547d\u4ee4\uff0c\u7528\u4e8e\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u7ecf\u8fc7GPT\u5206\u6790\u540e\u5bfc\u51fa\u6570\u636e\u62a5\u544a\u6216\u76f4\u63a5\u5bfc\u51fa\u539f\u59cbjson\u6570\u636e\u3002\u5177\u4f53\u652f\u6301\u53c2\u6570\u5982\u4e0b\uff1a\n\n```text\n-f, --format [report|json]  Format to export  [required]\n-s, --save-dir DIRECTORY    Directory to save indicators  [required]\n--split / --no-split        Save indicators in separate files, ONLY For JSON format\n```\n\n\u53ef\u4ee5\u901a\u8fc7`-f`\u53c2\u6570\u6307\u5b9a\u8f93\u51fa\u683c\u5f0f\uff0c\u5e76\u4e14\u901a\u8fc7`-s / --save-dir`\u53c2\u6570\u53ef\u4ee5\u5c06\u6570\u636e\u4fdd\u5b58\u5230\u6307\u5b9a\u76ee\u5f55\u4e2d\uff0c\u901a\u8fc7`--split / --no-split`\u53c2\u6570\u53ef\u4ee5\u5c06\u6570\u636e\u5206\u522b\u4fdd\u5b58\u5230\u4e0d\u540c\u7684\u6587\u4ef6\u4e2d(\u53ea\u5bf9json\u683c\u5f0f\u6709\u7528)\u3002\n\n#### \u6570\u636e\u62a5\u544a\n\n\u6570\u636e\u62a5\u544a\u662f\u6211\u4eec\u5bf9\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u8fdb\u884cGPT\u5206\u6790\u540e\u751f\u6210\u7684\uff0c\u8be5\u62a5\u544a\u5305\u542b\u4e86\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u7684\u5206\u6790\u7ed3\u679c\u548c\u6570\u636e\u7684\u53ef\u89c6\u5316\u7ed3\u679c\u3002\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n**\u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684\u6240\u6709\u6307\u6807\u6570\u636e\uff08\u9664project_openrank_detail\u6307\u6807\uff09\uff0c\u5e76\u5bfc\u51fa\u6570\u636e\u62a5\u544a\uff1a**\n\n```bash\nopendigger repo -r X-lab2017/open-digger query export -f report -s .\n```\n\n<details>\n<summary> \u6f14\u793a\u5f55\u5c4f </summary>\n\nhttps://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/demos/repo-query-export-report.mp4\n</details>\n\n**\u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684\u6240\u6709\u6307\u6807\u6570\u636e(\u5176\u4e2d\u67e5\u770b2023\u5e748\u6708\u7684project_openrank_detail\u6307\u6807\uff0c\u5e76\u5bfc\u51fa\u6570\u636e\u62a5\u544a\uff1a**\n\n```bash\nopen-digger repo -r X-lab2017/open-digger query -s project_openrank_detail:2023-08 export -f report -s .\n```\n\n#### \u539f\u59cbJson\u6570\u636e\n\n\u6211\u4eec\u53ef\u4ee5\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u5bfc\u51fa\u4e3a\u539f\u59cb\u7684json\u6570\u636e\uff0c\u8fd9\u6837\u7528\u6237\u53ef\u4ee5\u81ea\u884c\u5904\u7406\u6570\u636e\u3002\n\n\u5177\u4f53\u4f7f\u7528\u5982\u4e0b\uff1a\n\n```bash\n# \u67e5\u770b\u4ed3\u5e93X-lab2017/open-digger\u7684\u6240\u6709\u6307\u6807\u6570\u636e(\u5176\u4e2d\u67e5\u770b2023\u5e748\u6708\u7684project_openrank_detail\u7684\u6307\u6807)\uff0c\u5e76\u5bfc\u51fa\u539f\u59cbjson\u6570\u636e\nopen-digger repo -r X-lab2017/open-digger query -s project_openrank_detail:2023-08 export -f json -s .\n```\n\n### \u7ec4\u5408\u4f7f\u7528\n\nquery\u7684\u6240\u6709\u5b50\u547d\u4ee4\u90fd\u53ef\u4ee5\u7ec4\u5408\u4f7f\u7528\uff0c\u6bd4\u5982\u6211\u4eec\u53ef\u4ee5\u5148\u4f7f\u7528`query`\u547d\u4ee4\u7b5b\u9009\u51fa\u6211\u4eec\u5173\u5fc3\u7684\u6307\u6807\u6570\u636e\uff0c\u7136\u540e\u4f7f\u7528`display`\u547d\u4ee4\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u4ee5\u8868\u683c\u3001\u56fe\u8868\u6216json\u683c\u5f0f\u5728\u7ec8\u7aef\u8f93\u51fa\uff0c\u6700\u540e\u4f7f\u7528`export`\u547d\u4ee4\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u7ecf\u8fc7GPT\u5206\u6790\u540e\u5bfc\u51fa\u6570\u636e\u62a5\u544a\u6216\u76f4\u63a5\u5bfc\u51fa\u539f\u59cbjson\u6570\u636e\u3002\u5982\u679c\u7528\u6237\u5f00\u53d1\u4e86\u81ea\u5b9a\u4e49\u7684\u63d2\u4ef6\uff0c\u4e5f\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u63d2\u4ef6\u5bf9\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u8fdb\u884c\u5904\u7406\u3002\n\n\u6bd4\u5982\u6211\u4eec\u60f3\u8981\u67e5\u770b\u4ed3\u5e93`X-lab2017/open-digger`\u7684`index`\u7c7b\u578b\u7684`openrank`\u6307\u6807\u6570\u636e\uff0c\u5e76\u4e14\u53ea\u67e5\u770b2023\u5e74\u7684\u6570\u636e\uff0c\u5e76\u4ee5\u8868\u683c\u5f62\u5f0f\u5728\u7ec8\u7aef\u6253\u5370\uff0c\u6700\u540e\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u5df2json\u683c\u5f0f\u5bfc\u51fa\uff0c\u6211\u4eec\u53ef\u4ee5\u8fd9\u6837\u505a\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank:2023 display -f table export -f json -s .\n```\n\n\u7ed3\u679c\u622a\u56fe\uff1a\n\n![query-display-export](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/export_display.png)\n\n## \ud83d\udc40\u5f02\u5e38\u5904\u7406\n\n<a id=\"\u5f02\u5e38\u5904\u7406\"></a>\n\n### \u7f3a\u5931\u6570\u636e\u81ea\u52a8\u53cd\u9988\n\nopen-digger\u5b98\u65b9\u4ed3\u5e93\u5bf9\u4e8e\u4e00\u4e9b\u4ed3\u5e93\u7684\u6307\u6807\u6570\u636e\u662f\u7f3a\u5931\u7684\u3002\u7528\u6237\u67e5\u8be2\u67d0\u4e2a\u4ed3\u5e93\u7684\u6307\u6807\u6570\u636e\u65f6\uff0c\u5982\u679c\u8be5\u4ed3\u5e93\u7684\u6307\u6807\u6570\u636e\u7f3a\u5931\uff0c\u6211\u4eec\u4f1a\u7ed9\u51fa\u76f8\u5e94\u7684\u63d0\u793a\uff0c\u5e76\u4e14\u4f1a\u4f7f\u7528\u7528\u6237\u914d\u7f6e\u7684`github personal access token`\u8c03\u7528Github API\u5728`opendigger-pycli`\u7684github\u4e0a\u81ea\u52a8\u63d0\u4ea4\u4e00\u4e2a\u6570\u636e\u7f3a\u5931\u7684issue\u3002\n\nissue\u4fe1\u606f\u5982\u56fe\u6240\u793a\uff1a\n\n![issue](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/issue.png)\n\n\u5982\u679c\u591a\u4e2a\u7528\u6237\u91cd\u590d\u67e5\u8be2\u540c\u4e00\u4e2a\u4ed3\u5e93\u7684\u6307\u6807\u6570\u636e\uff0c\u6211\u4eec\u4e0d\u4f1a\u5197\u4f59\u7684\u63d0\u4ea4\uff0c\u800c\u662f\u5728\u539f\u6709\u7684issue\u4e0a\u6dfb\u52a0\u4e00\u4e2a\"\ud83d\udc40\"\u7b26\u53f7\u3002\u8fd9\u6837open-digger\u5f00\u53d1\u8005\u53ef\u4ee5\u901a\u8fc7\u5b9a\u671f\u67e5\u770bissue\u6765\u4e86\u89e3\u7528\u6237\u5173\u6ce8\u54ea\u4e9b\u4ed3\u5e93/\u7528\u6237\u7684\u54ea\u4e9b\u6307\u6807\u6570\u636e\u3002\u5982\u679c\u5173\u6ce8\u4eba\u6570\u8f83\u591a\uff0c\u53ef\u4ee5\u51b3\u7b56\u662f\u5426\u6dfb\u52a0\u8be5\u4ed3\u5e93/\u7528\u6237\u7684\u6307\u6807\u6570\u636e\u3002\n\n### \u4ed3\u5e93\u4e0d\u5b58\u5728\n\n\u5982\u679c\u7528\u6237\u8f93\u5165\u7684\u4ed3\u5e93/\u7528\u6237\u4e0d\u5b58\u5728\uff0c\u6211\u4eec\u4f1a\u7ed9\u51fa\u76f8\u5e94\u7684\u63d0\u793a\u3002\n\n\u6bd4\u5982\u6211\u4eec\u8f93\u5165\u4e86\u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u4ed3\u5e93`X-lab2017/open-digger-404`\uff0c\u6211\u4eec\u4f1a\u7ed9\u51fa\u76f8\u5e94\u7684\u63d0\u793a\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger-404\n```\n\n![repo_not_found](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/repo-404.png)\n\n### \u7528\u6237\u4e0d\u5b58\u5728\n\n\u5982\u679c\u7528\u6237\u8f93\u5165\u7684\u4ed3\u5e93/\u7528\u6237\u4e0d\u5b58\u5728\uff0c\u6211\u4eec\u4f1a\u7ed9\u51fa\u76f8\u5e94\u7684\u63d0\u793a\u3002\n\n\u6bd4\u5982\u6211\u4eec\u8f93\u5165\u4e86\u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u7528\u6237`CoderChen01-404`\uff0c\u6211\u4eec\u4f1a\u7ed9\u51fa\u76f8\u5e94\u7684\u63d0\u793a\uff1a\n\n```bash\nopendigger user -u CoderChen01-404\n```\n\n![repo_not_found](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/user-404.png)\n\n## \ud83d\udd0c\u63d2\u4ef6\u5f00\u53d1\n\n<a id=\"\u63d2\u4ef6\u5f00\u53d1\"></a>\n\n\u63d2\u4ef6\u662fopendigger-pycli\u7684\u4e00\u4e2a\u91cd\u8981\u7279\u6027\uff0c\u5b83\u53ef\u4ee5\u5e2e\u52a9\u7528\u6237\u5feb\u901f\u5f00\u53d1\u81ea\u5b9a\u4e49\u7684\u547d\u4ee4\uff0c\u5bf9\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u8fdb\u884c\u5904\u7406\u3002\u6700\u4e3a\u91cd\u8981\u7684\u5c31\u662f\u6211\u4eec\u7684`query`\u547d\u4ee4\uff0c\u5b83\u5229\u7528\u4e86`click`\u5e93\u63d0\u4f9b\u7684[Mult Command Pipelines](https://click.palletsprojects.com/en/8.1.x/commands/#multi-command-pipelines)\u7279\u6027\uff0c\u53ef\u4ee5\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u4f20\u9012\u7ed9\u5b83\u7684\u5b50\u547d\u4ee4\uff0c\u5b50\u547d\u4ee4\u53ef\u4ee5\u662f`display`\u547d\u4ee4\uff0c\u4e5f\u53ef\u4ee5\u662f\u7528\u6237\u81ea\u5b9a\u4e49\u7684\u547d\u4ee4\u3002\n\n### query\u7684\u8fd4\u56de\u6570\u636e\n\n```python\n@dataclass\nclass BaseQueryResult:\n    type: t.ClassVar[t.Literal[\"user\", \"repo\"]]\n    dataloaders: t.List[\"DataloaderProto\"]\n    indicator_queries: t.List[t.Tuple[str, t.Optional[\"IndicatorQuery\"]]]\n    uniform_query: t.Optional[\"IndicatorQuery\"]\n    data: t.Dict[str, \"DataloaderResult\"] = field(default_factory=dict, init=False)\n    queried_data: t.Dict[str, \"DataloaderResult\"] = field(\n        default_factory=dict, init=False\n    )\n    failed_query: t.Dict[\n        str,\n        t.Union[\n            t.Optional[\"IndicatorQuery\"],\n            t.Dict[str, t.Optional[\"IndicatorQuery\"]],\n        ],\n    ] = field(default_factory=dict, init=False)\n\n\n@dataclass\nclass RepoQueryResult(BaseQueryResult):\n    type: t.ClassVar[t.Literal[\"repo\"]] = \"repo\"\n    repo: t.Tuple[str, str]\n    org_name: str = field(init=False)\n    repo_name: str = field(init=False)\n\n    def __post_init__(self) -> None:\n        self.org_name, self.repo_name = self.repo\n        run_dataloader(self)\n        run_query(self)\n\n\n@dataclass\nclass UserQueryResult(BaseQueryResult):\n    type: t.ClassVar[t.Literal[\"user\"]] = \"user\"\n    username: str\n\n    def __post_init__(self) -> None:\n        run_dataloader(self)\n        run_query(self)\n\n```\n\n\u5176\u4e2d\u5f53\u6211\u4eec\u4f7f\u7528`repo`\u7684`query`\u547d\u4ee4\u65f6\uff0c`query`\u547d\u4ee4\u7684\u8fd4\u56de\u6570\u636e\u7c7b\u578b\u4e3a`RepoQueryResult`\uff0c\u5f53\u6211\u4eec\u4f7f\u7528`user`\u7684`query`\u547d\u4ee4\u65f6\uff0c`query`\u547d\u4ee4\u7684\u8fd4\u56de\u6570\u636e\u7c7b\u578b\u4e3a`UserQueryResult`\u3002\n\n`RepoQueryResult`\u548c`UserQueryResult`\u90fd\u7ee7\u627f\u81ea`BaseQueryResult`\uff0c`BaseQueryResult`\u4e2d\u5305\u542b\u4e86`query`\u547d\u4ee4\u7684\u4e00\u4e9b\u57fa\u672c\u4fe1\u606f\u3002\n\n\u5982\u4e0b\u662f\u5173\u952e\u5c5e\u6027\u7684\u4ecb\u7ecd\uff08\u5177\u4f53\u7528\u6cd5\u8bf7\u89c1\u6e90\u7801\uff1aopendigger_pycli/results/display.py\uff09\uff1a\n\n- `dataloaders`\uff1a`query`\u547d\u4ee4\u7b5b\u9009\u51fa\u7684\u6307\u6807\u7684\u6570\u636e\u52a0\u8f7d\u5668\u3002\n- `indicator_queries`\uff1a`-s`\u53c2\u6570\u6307\u5b9a\u7684\u6307\u6807\u67e5\u8be2\u8868\u8fbe\u5f0f\u3002\n- `uniform_query`\uff1a`-f`\u53c2\u6570\u6307\u5b9a\u7684\u6307\u6807\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u3002\n- `data`\uff1a`query`\u547d\u4ee4\u4e0b\u8f7d\u7684\u539f\u59cb\u6570\u636e\u3002\n- `queried_data`\uff1a`query`\u547d\u4ee4\u7b5b\u9009\u540e\u7684\u6570\u636e\u3002\n- `failed_query`\uff1a`query`\u547d\u4ee4\u7b5b\u9009\u5931\u8d25\u7684\u6307\u6807\u67e5\u8be2\u8868\u8fbe\u5f0f\u3002\n\n### \u63d2\u4ef6\u793a\u4f8b\n\n\u8be5\u793a\u4f8b\u63d2\u4ef6\u7684\u529f\u80fd\u662f\u5c06\u7b5b\u9009\u51fa\u6765\u7684\u6570\u636e\u57fa\u672c\u4fe1\u606f\u6253\u5370\u5230\u7ec8\u7aef\u3002\n\n\u793a\u4f8b\u63d2\u4ef6\u547d\u4ee4\u4ee3\u7801\uff1a\n\n```python\n# plugin_example/print_result/print_result.py\n\nfrom __future__ import annotations\nimport typing as t\nimport click\n\nfrom opendigger_pycli.console import CONSOLE\nfrom opendigger_pycli.utils.decorators import processor\n\n\nif t.TYPE_CHECKING:\n    from opendigger_pycli.results.query import QueryResults\n\n\n@click.command(\"print-result\", help=\"[Plugin Demo] Print query result to terminal\")\n@processor\ndef print_result(results: QueryResults):\n    CONSOLE.print(results)\n    yield from results  # \u8fd9\u4e2ayield from\u662f\u5fc5\u987b\u7684\uff0c\u5b83\u4f1a\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u5176\u4ed6\u5b50\u547d\u4ee4\u3002\n    \n```\n\n\u6a21\u5757\u7684\u5b89\u88c5\u914d\u7f6e\u5982\u4e0b\uff1a\n\n```python\n# plugin_example/print_result/setup.py\n\nfrom setuptools import setup\n\nsetup(\n    name=\"opendigger_pycli_print_result\",\n    version=\"0.1\",\n    py_modules=[\"print_result\"],\n    install_requires=[\n        \"click\",\n    ],\n    entry_points=\"\"\"\n        [opendigger_pycli.plugins]\n        print-result=print_result:print_result\n    \"\"\",\n)\n```\n\n\u6ce8\u610f`entry_points`\u7684\u5199\u6cd5\uff0c`opendigger_pycli.plugins`\u662f\u56fa\u5b9a\u7684\uff0c`print-result`\u662f\u63d2\u4ef6\u7684\u540d\u79f0\uff0c`print_result:print_result`\u5b9a\u4f4d\u5230\u63d2\u4ef6\u7684\u5165\u53e3\u51fd\u6570\u3002\n\n\u5177\u4f53\u914d\u7f6e\u89c1\uff1a[click-plugins](https://github.com/click-contrib/click-plugins/tree/master)\n\n### \u793a\u4f8b\u63d2\u4ef6\u4f7f\u7528\n\n\u8fdb\u5165\u793a\u4f8b\u63d2\u4ef6\u7684\u76ee\u5f55\uff0c\u6267\u884c\u5982\u4e0b\u547d\u4ee4\u5b89\u88c5\u63d2\u4ef6\uff1a\n\n```bash\ncd plugin_example/print_result\n\npython3 setup.py install\n```\n\n\u6211\u4eec\u8fd0\u884c\u5982\u4e0b\u547d\u4ee4\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger  query  --help\n```\n\n![plugin_example](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/plugin.png)\n\n\u4f1a\u53d1\u73b0`query`\u547d\u4ee4\u7684`--help`\u4e2d\u591a\u4e86\u4e00\u4e2a`print-result`\u5b50\u547d\u4ee4\u3002\n\n\u6211\u4eec\u8fd0\u884c\u5982\u4e0b\u547d\u4ee4\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger  query -ios openrank:2023 print-result\n```\n\n\u7ed3\u679c\u5982\u4e0b\uff1a\n\n![plugin_example](https://atomgit.com/opendigger-pycli/opendigger-pycli/raw/cjj_dev/docs/assets/result_screenshots/plugin-result.png)\n\n## \ud83d\udcc4\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u8be6\u89e3\n\n<a id=\"\u7b5b\u9009\u6761\u4ef6\u8868\u8fbe\u5f0f\u8be6\u89e3\"></a>\n\n\u7b5b\u6d17\u6761\u4ef6\u8868\u8fbe\u5f0f\u4e3b\u8981\u5206\u4e3a\u5982\u4e0b\u51e0\u79cd\uff1a\n\n- \u5e74\u4efd\u67e5\u8be2\n- \u6708\u4efd\u67e5\u8be2\n- \u5e74\u6708\u67e5\u8be2\n- \u5e74\u6708\u8303\u56f4\u67e5\u8be2\n- \u5e74\u4efd\u8303\u56f4\u67e5\u8be2\n- \u5e74\u4efd\u6708\u4efd\u8303\u56f4\u67e5\u8be2\n\n\u6211\u4eec\u4f7f\u7528~\u6765\u8868\u793a\u8303\u56f4\uff0c\u4f7f\u7528-\u6765\u8868\u793a\u5e74\u6708\u3002\n\n\u901a\u8fc7\u5982\u4e0b\u51e0\u4e2a\u793a\u4f8b\u6765\u8bf4\u660e\uff1a\n\n\u67e5\u8be22023\u5e74\u7684\u6570\u636e\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank -f 2023 display -f table\n```\n\n\u67e5\u8be22021\u5e74\u52302023\u5e74\u7684\u6570\u636e\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank -f 2021~2023 display -f table\n```\n\n\u67e5\u8be2\u8fc7\u5f80\u5e74\u4efd3\u6708\u7684\u6570\u636e\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank -f 3 display -f table\n```\n\n\u67e5\u8be2\u8fc7\u5f80\u5e74\u4efd3\u6708\u52308\u6708\u7684\u6570\u636e\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank -f 3~8 display -f table\n```\n\n\u67e5\u8be22023\u5e743\u6708\u7684\u6570\u636e\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank -f 2023-03 display -f table\n```\n\n\u67e5\u8be22022\u5e743\u6708\u52302023\u5e743\u6708\u7684\u6570\u636e\uff1a\n\n```bash\nopendigger repo -r X-lab2017/open-digger query -ios openrank -f 2022-03~2023-03 display -f table\n```\n\n## End\n\n\u66f4\u591a\u529f\u80fd\u7b49\u5f85\u60a8\u7684\u63a2\u7d22...\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Awesome CLI for OpenDigger",
    "version": "1.0.3",
    "project_urls": {
        "AuthorGithub": "https://github.com/CoderChen01",
        "Documentation": "https://github.com/CoderChen01/opendigger-pycli/blob/main/README.md",
        "Source": "https://github.com/CoderChen01/opendigger-pycli/"
    },
    "split_keywords": [
        "opendigger",
        "opendigger-pycli",
        "opendigger-cli",
        "opendigger-py",
        "opensoda",
        "open-digger"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "be49a059f23c278c2b9719b7e2fb55fb37046aad6fc3b3da6fb9bf5e909a6d9e",
                "md5": "ce1f1bc7280a884285f83f047839d351",
                "sha256": "8cde044b528afebaa3040b11cc648458929cb73286241309ed7c046ea071aa0f"
            },
            "downloads": -1,
            "filename": "opendigger_pycli-1.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ce1f1bc7280a884285f83f047839d351",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 82415,
            "upload_time": "2023-11-18T10:29:06",
            "upload_time_iso_8601": "2023-11-18T10:29:06.999505Z",
            "url": "https://files.pythonhosted.org/packages/be/49/a059f23c278c2b9719b7e2fb55fb37046aad6fc3b3da6fb9bf5e909a6d9e/opendigger_pycli-1.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "30704bc6e5ef3db311924e393c3810008e57a97879e34af54b6fe70d3382bbae",
                "md5": "b2af1fc3a3a6f8cda862940d1d77b3e1",
                "sha256": "9ae71071a3bac1f49837fb72493dfe1ab90a26c9e93a639afbc2b5db6e76ca4a"
            },
            "downloads": -1,
            "filename": "opendigger_pycli-1.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "b2af1fc3a3a6f8cda862940d1d77b3e1",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 6202945,
            "upload_time": "2023-11-18T10:29:11",
            "upload_time_iso_8601": "2023-11-18T10:29:11.186444Z",
            "url": "https://files.pythonhosted.org/packages/30/70/4bc6e5ef3db311924e393c3810008e57a97879e34af54b6fe70d3382bbae/opendigger_pycli-1.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-11-18 10:29:11",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "CoderChen01",
    "github_project": "opendigger-pycli",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "opendigger_pycli"
}
        
Elapsed time: 0.16473s