Metadata-Version: 2.1
Name: ojpacker
Version: 0.1.4
Summary: a script can packer test data for Olympic informatics Online Judge
Home-page: https://github.com/Simon-Chenzw/OJpacker
Author: Simon_Chen
Author-email: 1020359403@qq.com
License: GNU Lesser General Public License v3 (LGPLv3)
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: Implementation :: CPython
Requires-Python: >=3.6.9
Description-Content-Type: text/markdown
Requires-Dist: rich (>=4.1)

# 简介
一个简单的 python 脚本工具，简化生成数据的过程。  
a script can packer test data for Olympic informatics Online Judge

## 简单使用指南
+ 安装: `pip3 install ojpacker`
+ 更新: `pip3 install --upgrade ojpacker`
+ 运行:
    1. 直接在终端中输入 `ojpacker` ，即可在当前目录运行
        * 需要 pip 自动添加的脚本的所在目录在 `PATH` 中，若提示 `ojpacker` 不存在，请检查 `PATH`
    2. 运行 `python3 -m ojpacker`
+ 演示: 运行 `ojpacker demo` 可以生成demo文件夹，内含几个文件，在预配置的编译命令正确的情况下可以直接运行

## 环境要求 (probably)
+ python >= 3.6.9
+ [rich](https://github.com/willmcgugan/rich) >= 4.1

# 文档
## 目录：
1. [工作原理](#工作原理)
2. [命令行参数](#命令行参数)
3. [配置文件及其内容](#配置文件及其内容)

## 工作原理
举个例子，demo里除去配置有三个文件：
+ state
+ make_in
+ make_out  
    注意：以上所有的文件名都可在配置中修改

### 典型流程
一个典型的题目构造流程，主要分为两部分。分别是构造in文件和out文件  
* #### 构造in文件
    本程序将会从 state 中逐行读入，再将读入的数据传递给 make_in  
    而 make_in 则依据读入的数据生成一个in文件
* #### 构造out文件
    本程序将依照配置中对数据点命名的格式，在文件夹中依次查找in文件  
    当文件存在时，将交由 make_out 文件构造一个同样序号的out文件

在这两个流程结束后，将会对生成的数据进行压缩打包，此阶段可以使用命令行参数 `-unzip` 跳过

### 特殊流程
不是所有的构造都需要同时运行两个流程，所以在命令行参数中使用 `-input` 与 `-output` 可以跳过相关的流程，详见命令行参数的对应条目

### 文件要求：
1. state:
    * 每行依次代表了构造in数据点时的所需参数
    * 空行代表没有这个数据点，对应的序号也将跳过
2. make_in 与 make_out:
    * 只需准备源文件， 如有需要会自动编译，但需配置编译命令
    * 输入输出均使用标准输入输出
3. 配置文件
4. 缓存目录：
    * 运行时需要缓存目录 temp，此目录开始时会自动创建，结束时会自动销毁。
    * **若开始运行时目录已存在，将会直接删除！！！**

## 命令行参数
提示：在参数不会产生歧义的情况下，可以只打第一个或者前几个字母。
### 所有命令
1. [主命令](#主命令)
2. [config](#config命令)
3. [demo](#demo命令)

### 主命令
控制运行流程的相关参数
* `-log LEVEL` :
    此命令将会指定运行时输出日志的等级，默认等级为 info，可选等级有：
    * error
    * warning
    * info
    * debug

* `-name FILENAME` :
    指定压缩包、文件夹的名字，不包含后缀名，不指定时使用配置中的默认值 `defalut_zip_name`

* `-show` :
    生成完成 in/out 文件时，打印文件的第一行
    * 选项后可接一个 `input` 或 `output` ，代表仅打印指定的一种

* `-dir directory` :
    当你跳过生成 in文件的阶段时，可以指定一个文件夹，使 make_out 从中读取数据。若未指定，则从 temp 目录读取

* `-input NAME` :
    指定 make_in 文件
    * 这里的NAME不是文件名，而是配置中的代号，详见配置文件的 `input_exec`
    * 若没有这个参数，将会使用配置中的 `input_default_exec`
    * 若 NAME 在配置中不存在，则会跳过此阶段

* `-output NAME` :
    指定 make_out 文件
    * 这里的NAME不是文件名，而是配置中的代号，详见配置文件的 `output_exec`
    * 若没有这个参数，将会使用配置中的 `output_default_exec`
    * 若 NAME 在配置中不存在，则会跳过此阶段

* `-unzip` :
    跳过最后压缩文件夹的过程，将数据保存在一个文件夹中

* `-addzip FILE...` :
    后接参数为文件名，这些文件将会在构造完数据之后一起压缩，或移动至文件夹中

* `-multiprocess [Max]` :
    使用多进程运行 make_in 与 make_out ，Max 为最大进程数，不指定为无上限

### config命令
config 是配置文件相关的命令，单独运行无效果

* `-create` :
    在当前目录中，使用 demo 的配置，创建一个配置文件

* `-copyto user/local` :
    将配置文件从 local 拷贝至 user，或从 user 拷贝至 local 。详见配置文件

### demo命令
直接运行demo，会产生一个文件夹，内含有产生A+B题目的演示

* `-dir [directory]` :
    指定文件名，若 directory 留空则在当前目录创建

## 配置文件及其内容
* 配置文件名为 ojpacker.json
* 配置文件分为两种，当前目录的称为local，`~/.config/` 下的称为user。当local存在时使用local，否则使用user

### json各参数详解
json内容为字典，以下是各个键值的意义

* 字符串：
    * `defalut_zip_name` :
        未使用 `-name` 参数时，所采用的压缩包名、文件夹名

    * `state_name` :
        state 文件的名字

    * `input_data_name` & `output_data_name`:
        in/out 数据的文件名。可使用的宏:
        + `{num}` : 数据点编号，从1开始
        + `{name}` : 题目名字

    * `input_default_exec` :
        默认使用的 make_in 文件代号

    * `output_default_exec` :
        默认使用的 make_out 文件代号
* [execfile](#execfile)：
    * `input_exec` :
        make_in 文件配置，详见下面的[`execfile`](#execfile)

    * `output_exec` :
        make_out 文件配置，详见下面的[`execfile`](#execfile)

### execfile
execfile 的格式为 json 的字典，以 demo 中 C++ 的 make_in 配置为例
```json
"cpp": {
    "src": "make_out.cpp",
    "exe": "make_out.out",
    "compile_cmd": "g++ {src} -o {exe}",
    "execute_cmd": "./{exe}"
}
```
1. `cpp` 是其代号，此代号在命令行参数 `-input` 和 `-output` 以及配置中 `input_default_exec` 与 `output_default_exec` 中使用
2. `src` 源代码文件名
3. `exe` 可执行文件文件名
4. `compile_cmd` 编译命令
5. `execute_cmd` 执行命令  
    注意：
    1. 若所使用的语言没有编译阶段， `exe` 与 `compile_cmd` 可留空
    2. 命令中可以使用 `{src}` 与 `{exe}` 代替相应的文件名

