21 个版本 (7 个重大更新)
0.8.0 | 2021 年 9 月 12 日 |
---|---|
0.6.0 | 2021 年 8 月 30 日 |
0.5.0 | 2021 年 2 月 21 日 |
0.4.3 | 2020 年 9 月 12 日 |
0.1.5 | 2019 年 12 月 24 日 |
#1271 in 命令行实用程序
每月 49 次下载
59KB
1K SLoC
rust_ledger
适用于 Linux 和 macOS 的命令行会计工具
摘要
- 基于 ledger 的精神移植
- 使用复式记账范式
- 支持所有 ISO 4217 货币格式
- 使用
yaml
文件作为数据存储 - 包括将
csv
文件转换为yaml
格式的工具 - 基于典型个人财务管理用例的小功能集
贡献
- 请参阅
CODE_OF_CONDUCT.md
获取指南 - 欢迎并鼓励提出 PR、问题和功能请求
安装
从 Cargo
cargo安装 rust_ledger
Linux 和 macOS 的二进制文件
我们为上述平台提供二进制文件。请参阅 发布 以获取完整列表。
从源代码构建
或者,克隆此仓库并执行以下操作
- 如果您的机器上未安装 Rust,请按照以下说明进行安装: https://rust-lang.net.cn/tools/install
- 运行
cargo build --release
来编译二进制文件 - 将
/target/release/rust_ledger
二进制文件复制到/usr/bin
或您的系统维护应用程序二进制文件的任何位置
测试
cargo测试
用法
rust_ledger --help
将提供所有可用命令和可选参数的菜单。
rust_ledger <version>
Eric Crowder <[email protected]>
USAGE:
rust_ledger [SUBCOMMAND]
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
SUBCOMMANDS:
account account module
balance balance module
budget budget module
csv csv module
help Prints this message or the help of the given subcommand(s)
register register module
rust_ledger yaml
文件格式
该项目使用定义的 yaml
架构,而不是纯文本的 ledger 文件格式。 yaml
具有相对简单的语法,并且能够轻松地表示有用的数据类型,例如列表。
一个示例的账本 yaml
文件可以在 examples/example.yaml
找到。
此外,由于有如 serde
这样的工具,解析 yaml
是非常简单的。这使得我能够跳过编写支持 ledger
纯文本文件格式的解析器,并专注于实现功能。此外,现代格式化工具,如 prettier,可以轻松地维护 yaml
文件,因为它们对底层文件的架构不敏感。
ledger
工具已经被用 许多 编程语言重写。几乎所有这些移植都利用了原始的 ledger
纯文本格式。最重要的是,我认为 rust_ledger
是在保持原始工具核心功能集的同时,使用不同账本文件格式的一种实验。
rust_ledger
使用以下格式的 yaml
文件
currency: USD
accounts:
- account:
amount:
transactions:
- date:
amount:
description:
account:
offset_account:
- date:
description:
transactions:
- amount:
account:
- amount:
account:
账本格式架构是有意设计的轻量级。唯一的要求如下
currency
字段应为一个 ISO 4217 货币代码。account
字段应以以下格式表达:account_classification:account_name
。amount
字段应为一个数字。它可以包含最多两个(2)小数点。date
字段应以下列格式:YYYY-MM-DD
。
交易
交易可以以两种不同的方式表达。一种是仅影响两个账户的“简化”格式
- date: 2020-01-01
amount: 200
offset_account: liability:cc_amex
description: grocery store
account: expense:expense_general
与 offset_account
值相关的符号(借方/贷方)与 amount
字段中的值的符号相反。
在上面的示例交易中,由于 expense_general
被借记了200,因此 cc_amex
账户将被贷记相同金额。
涉及两个以上账户的交易以下述方式表达
- date: 2020-01-01
description: grocery store
transactions:
- amount: 20
account: expense:general
- amount: 180
account: expense:grocery
- amount: -200
account: liability:cc_amex
仅涉及两个账户的交易也可以以上述格式表达。
通过环境变量指定 rust_ledger 文件路径
可选地,可以通过环境变量 RUST_LEDGER_FILE
设置 ledger 文件路径,而不是在程序被调用时指定。如果提供了带有文件路径的 -f
,将使用提供的文件,而不是任何 RUST_LEDGER_FILE
设置。
API
账户
列出账本文件中包含的所有账户。
rust_ledger-account
account module
USAGE:
rust_ledger account [OPTIONS] --filename <filename>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-f, --filename <filename> location of ledger file
示例输出
Account
----------------------------
asset:cash_checking
asset:cash_savings
liability:cc_amex
equity:equity
expense:grocery
expense:general
expense:mortgage
income:general
余额
列出到目前的账户余额。
rust_ledger-balance
balance module
USAGE:
rust_ledger balance [OPTIONS] --filename <filename>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-f, --filename <filename> location of ledger file
示例输出
Account | Balance
---------------------+------------
asset |
asset:cash_checking | $-400.00
asset:cash_savings | $1,000.00
liability |
liability:cc_amex | $-455.00
equity |
equity:equity | $-3,500.00
expense |
expense:grocery | $635.00
expense:general | $1,020.00
expense:mortgage | $2,000.00
income |
income:general | $-300.00
|
check | 0
登记
列出到目前的总账交易。输出可以通过可选参数按任何字段过滤。
rust_ledger-register
register module
USAGE:
rust_ledger register [OPTIONS] --filename <filename>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-f, --filename <filename> location of ledger file
-g, --group <group> group register output by value
-o, --option <option> filter output by optional value
- 登记报告可以可选地通过
group
参数(yearly
、monthly
或daily
)进行汇总 - 如果指定了
group
参数,还必须指定一个option
参数来指示分组值。例如,如果使用yearly
分组参数,则此值可以是2020
;如果使用monthly
分组参数,则此值可以是12
(十二月)。 - 注册报告也可以通过可选的
option
参数进行筛选。所有匹配的Description
、Account
或Amount
值都将包含在输出中。
示例输出
Date | Description | Account | Amount
------------+--------------------+---------------------+------------
2019-12-31 | weekly groceries | expense:grocery | $455.00
2019-12-31 | weekly groceries | liability:cc_amex | $-455.00
2020-01-01 | mortage | expense:mortgage | $2,000.00
2020-01-01 | mortage | asset:cash_checking | $-2,000.00
2020-01-01 | stuff | expense:general | $1,000.00
2020-01-01 | stuff | asset:cash_savings | $-1,000.00
2020-01-01 | grocery store | expense:general | $20.00
2020-01-01 | grocery store | expense:grocery | $180.00
2020-01-01 | grocery store | asset:cash_checking | $-200.00
2020-01-01 | donut sale to dale | asset:cash_checking | $300.00
2020-01-01 | donut sale to dale | income:general | $-300.00
rust_ledger -f RUST_LEDGER_FILE -o grocery
的示例输出
Date | Description | Account | Amount
------------+------------------+---------------------+----------
2019-12-31 | weekly groceries | expense:grocery | $455.00
2020-01-01 | grocery store | expense:general | $20.00
2020-01-01 | grocery store | expense:grocery | $180.00
2020-01-01 | grocery store | asset:cash_checking | -$200.00
rust_ledger -f RUST_LEDGER_FILE -g yearly -o 2020
的示例输出
Date / Account | Total
---------------------+------------
2020 |
expense:grocery | $180.00
expense:mortgage | $2,000.00
asset:cash_checking | -$1,900.00
income:general | -$300.00
asset:cash_savings | -$1,000.00
expense:general | $1,020.00
预算
输出收入报表账户的预算和实际值报告。
rust_ledger-budget
budget module
USAGE:
rust_ledger budget --filename <filename> --group <group> --option <option>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
OPTIONS:
-f, --filename <filename> location of ledger file
-g, --group <group> group budget output by value
-o, --option <option> filter output by optional value
- 预算报告通过
group
参数(yearly
、monthly
或daily
)进行汇总。 - 报告通过
option
参数进行筛选。例如,如果使用yearly
组参数,此值可以是2020
;如果使用monthly
组参数,则可以是12
(十二月)。
以下为rust_ledger budget -f RUST_LEDGER_FILE -g yearly -o 2020
的示例输出
Date / Account | Budget | Actual | Delta
------------------+------------+-----------+------------
2020 | | |
income:general | $0.00 | -$300.00 | $300.00
expense:mortgage | $24,000.00 | $2,000.00 | $22,000.00
expense:grocery | $6,000.00 | $180.00 | $5,820.00
expense:general | $0.00 | $1,020.00 | -$1,020.00
csv
rust_ledger-csv
csv module
USAGE:
rust_ledger csv [OPTIONS] --csv <csv> --filename <filename>
FLAGS:
-h, --help Prints help information
-i, --invert invert amount for each csv transaction
-V, --version Prints version information
OPTIONS:
-c, --csv <csv> path of csv file
-f, --filename <filename> location of ledger file
-o, --offset <offset> offset account for each csv transaction
将csv
文件转换为yaml
格式,该格式是rust_ledger
所期望的。
- 应使用
-f
和-c
参数调用。这些包括rust_ledger文件位置(除非通过环境变量指定),csv文件位置和账户偏移量。 - 可以使用
-i
标志来反转导入的“金额”列值的符号。这对于处理将借方表示为负值、贷方表示为正值的CSV文件很有用。 - 账户偏移量(
-o
参数)将是csv交易应该记录的偏移交易。 - csv工具将寻找具有匹配
description
字段的现有交易,并将任何匹配的适当费用/收入账户填充进去。不匹配的将使用默认值expense:general
或income:general
,这取决于交易中包含的amount
字段(或debit
或credit
)的符号。
CSV工具可以导入具有以下大小写敏感的列名的列
- date
- description
- name
- amount
- debit
- credit
通常,银行将提供两种格式的导出之一:1)金额在一个列中表示,借方和贷方通过负值和正值(或反之)标识;2)借方和贷方有单独的列。CSV导入工具可以处理这两种情况。
CSV文件应包含date
、description
和name
列,因为它们是必需的字段。
依赖项
~7.5MB
~116K SLoC