7 个版本

0.10.5 2023年8月1日
0.10.4 2023年3月30日
0.9.2 2023年3月13日

115日期和时间

每月 36 次下载

MIT 许可证

185KB
4K SLoC

Jobber

Status Crates.io Documentation Codecov Dependency status

跟踪个人工作时间的命令行工具。

内容

目的

我于2013年开始开发jobber,这是一个用Ruby脚本编写的程序,因为在我看来,常见的工时跟踪工具通常带有糟糕或过于复杂的用户界面。为了方便使用shell的用户,jobber的目标是通过命令行提供其功能。10年后,我仍然觉得它非常有用,尽管这个Ruby脚本非常方便,但它仍然充满了错误,即使它承诺了更复杂的功能,也无法实现。

2021年,我开始学习Rust,因此我决定用那种语言重写jobber,以获得一个真正工作且可持续提供所有功能的版本。经过多次尝试,我发现Rust是一个不错的选择,因为它对边缘情况更加挑剔,并且有一个很好的测试环境,可以防止任何隐藏的错误代码,这可能导致错误的会计。

经过几个月的编码,我现在可以推出一个可测试的第一个版本,它并不完美(我还有一些更多的想法想要实现),但似乎比原始的Ruby版本更有用、更安全。

安装

要安装jobber,您需要通过rustup安装Rust(请参阅https://rustup.rs),然后使用以下命令

▶ cargo install jobber

现在您可以在命令行中使用jobber了。

使用方法

jobber的理念是,您不需要UI,您不需要用鼠标或智能手机触摸屏将您所做的工作输入到表单中,这在大多数情况下对我来说似乎都很糟糕。

因此,总的来说,只需提供以下信息即可跟踪您的工作时间

  • 开始工作的时间
  • 完成工作的时间
  • 关于您所做工作的信息
  • 一些信息来分类您的工作(例如客户、主题)

就是这样。

输入工作时间

基本想法是提供这样的功能,使其易于使用命令行

jobber -s start_time -e end_time -m message -t tags

当然,开始一个工作并在之后完成它是有意义的。因此,您可以使用-s开始一个工作,稍后再次调用jobber使用-e完成它。通常,在您知道您所做的工作时,留下一条信息会更简单,因此您可以在完成工作后提供一条信息。标签也是如此。

如果每次都必须写入完整的日期和时间,那么提供开始和结束时间会变得很困难。因此,您可以将其缩短到所需的内容,例如,今天中午用12:00表示,或者用没有时间表示“现在”。

让我们通过一个例子来说明。

开始新工作

我们使用-s选项开始一个新工作

▶ jobber -s
Beginning new database file 'jobber.json'
Started new job:

    Pos: 1
  Start: Sat Mar 04 2023, 16:25
    End: - open -


Saved database into file 'jobber.json'

如您所见,jobber告诉您它从当前目录中一个名为jobber.json的新数据库开始,并已启动一个新工作,其结束时间尚未确定。它还向您保证已将更改写入该文件。

如果您使用的shell提供颜色,则开始时间将以绿色显示,结束时间将以紫色显示,以便更好地阅读,但在用Markdown格式编写的此README.md中,遗憾的是无法可视化这些颜色。

我们可以使用--l选项(也请参阅后面的查看列表部分)来检查我们所做的工作。

▶ jobber -l 
Loaded database (1 entries) from file 'jobber.json'
    Pos: 1
  Start: Sat Mar 04 2023, 16:25
    End: - open -
  Hours: 0.25


Total: 1 job(s), 0.25 hours

Database unchanged.

Jobber 会打印出所有存储的作业列表,如您所见,这里有一个我们刚刚开始的新作业,由于已经过去了一段时间,所以作业小时数显示为四分之一小时。默认情况下,工作时间的计算分辨率为15分钟。这个分辨率可以改变(见下面的配置部分),但现在我们让它保持默认。

结束开放工作

因此,让我们结束这个作业,假设我们做了些有用的事情,并使用-e选项来结束它。

▶ jobber -e
Loaded database (1 entries) from file 'jobber.json'
You need to enter a message about what you did to finish the job.
Finish input with empty line (or Ctrl+C to cancel):
Did some nice work

Modified job:

    Pos: 1
  Start: Sat Mar 04 2023, 16:25
    End: Sat Mar 04 2023, 16:34
  Hours: 0.15
Message: Did some nice work

Saved database into file 'jobber.json'

如您所见,jobber 检测到我们没有提供关于我们做了什么的描述,因此它要求我们输入一条消息。我们回复了Did some nice work。消息可以是多行的,但现在我们只使用单行。

我们输入消息后,jobber 报告说它已修改了打开的作业,并将其以数据库中存储的当前状态写下。

因此,我们成功地完成了我们的第一个作业。

添加新工作

现在让我们添加我们今天早上做的另一个作业,当时忘记输入了。这次我们通过使用-s-以及在命令行中提供时间和消息选项-来输入消息,而不被询问。

▶ jobber -s 8:15 -e 10:45 -m "What I did this morning"    
Loaded database (1 entries) from file 'jobber.json'
Added new job:

    Pos: 2
  Start: Sat Mar 04 2023, 08:15
    End: Sat Mar 04 2023, 10:45
  Hours: 2.5
Message: What I did this morning

Saved database into file 'jobber.json'

如您所见,这也做得非常出色。

返回工作

您可以用-代替-来继续一个作业。然后,将创建一个新的作业,就像使用-一样,但新作业会自动使用上一个作业的消息和标签。这在你休息后继续工作非常有用。

持续时间

您可以使用-提供作业的结束日期和时间,也可以使用-来提供作业的持续时间(见持续时间部分关于持续时间格式的说明)。

标记工作

如果您想对作业进行分类(例如,将会议与编程作业区分开来)或您为多个客户工作,您可以使用标签来设置。

在创建作业时,只需添加选项-并提供标签列表即可。

▶ jobber -s -t meeting -m "meeting about new design" -d 2:00
Loaded database (2 entries) from file 'jobber.json'
There is one warning you have to omit:

WARNING 1) You have used some tags ( meeting ) which are unknown so far. Continue if you want to create them.
Do you still want to add this job? (y/N)
y
Added new job:

    Pos: 3
  Start: Sun Mar 05 2023, 21:24
    End: Sun Mar 05 2023, 23:24
  Hours: 2
   Tags:  meeting  
Message: meeting about new design

Saved database into file 'jobber.json'

在这里,jobber 询问我们是否要添加未知标签meeting,我们通过输入y回答了是。

添加后,标签会以不同的颜色显示,以便您容易区分它们(您在这里的Markdown文件中看不到这一点)。

您可以通过用逗号分隔来添加多个标签(例如,meeting,design)。

您还可以使用标签来区分客户并为每个客户提供不同的配置(见配置部分)。

修改标记

当您使用---edit时,您可以使用-+与标签名称一起修改标签,而不是一次性替换所有标签。

▶ jobber -b -d 1:00 -t +phone
Loaded database (3 entries) from file 'jobber.json'
There is one warning you have to omit:

WARNING 1) You have used some tags ( phone ) which are unknown so far. Continue if you want to create them.
Do you still want to add this job? (y/N)
y
Added new job:

    Pos: 4
  Start: Sun Mar 05 2023, 21:24
    End: Sun Mar 05 2023, 23:24
  Hours: 2
   Tags:  meeting  ,  phone
Message: meeting about new design

Saved database into file 'jobber.json'

您可以将+-用作前缀或后缀。使用后缀是强制性的,如果您以-开始标签列表,因为jobber 会将其读取为可选参数!。

编辑工作

可以通过使用--edit [<POS>]来编辑工作,然后添加一些-s-e-d-m-t来更改单个属性。唯一可以强制更改为空白的属性是-t。在-t不指定标签的情况下,编辑时会删除标签。

▶ jobber --edit 2 -m "What I did early this morning"
Loaded database (3 entries) from file 'jobber.json'
Modified job:

    Pos: 2
  Start: Sat Mar 04 2023, 08:15
    End: Sat Mar 04 2023, 10:45
  Hours: 2.5
Message: What I did early this morning

Saved database into file 'jobber.json'

删除工作

您可以通过范围(就像您可以使用在-r-l中)来删除工作,删除前将会询问确认。已删除的工作不会从数据库中移除,但会内部标记删除日期和时间(这是为了后续使用)。

任何已删除的工作都不会出现在任何报告中、导出或列表中。

▶ jobber --delete 3-6  
Loaded database (138 entries) from file 'jobber.json'
There ist one warning you have to omit:

WARNING 1) You are about to delete job(s) at the following position(s): 3-6
Do you still want to add this job? (y/N)
y
Deleting job(s) at position(s): 3-6
Saved database into file 'jobber.json'

模拟运行

如果您正在使用jobber并且想要确保数据库不会被任何错误输入损坏,您可以使用-D来执行所谓的Dry Run

Dry Run中,所有操作都像平常一样进行,但数据库不会被保存到文件系统。

▶ jobber -D --delete 3-6
Loaded database (138 entries) from file 'jobber.json'
There ist one warning you have to omit:

WARNING 1) You are about to delete job(s) at the following position(s): 3-6
Do you still want to add this job? (y/N)
y
Deleting job(s) at position(s): 3-6
DRY RUN: Changes were NOT saved into database file 'jobber.json'!

这个例子与上面相同(在删除工作部分),但最后一条消息告诉您,更改没有保存

可视化输入的工作

列出工作

让我们看看今天我们做了什么

▶ jobber -l                                           
Loaded database (2 entries) from file 'jobber.json'
    Pos: 1
  Start: Sat Mar 04 2023, 16:25
    End: Sat Mar 04 2023, 16:34
  Hours: 0.25
Message: Did some nice work

    Pos: 2
  Start: Sat Mar 04 2023, 08:15
    End: Sat Mar 04 2023, 10:45
  Hours: 2.5
Message: What I did early this morning

    Pos: 3
  Start: Sun Mar 05 2023, 21:24
    End: Sun Mar 05 2023, 23:24
  Hours: 2
   Tags:  meeting  
Message: meeting about new design

Total: 3 job(s), 4.75 hours

Database unchanged.

您可以看到jobber列出了我们做的三个工作。

按工作日报告

让我们使用报告选项-r以更炫的方式显示这些信息

▶ jobber -r
Loaded database (2 entries) from file 'jobber.json'
                               3/2023                               
Day     Sun     Mon     Tue     Wed     Thu     Fri     Sat    Week
                                  -       -       -       3       3
  5       2       -       -       -       -       -       -       2
 12       -       -       -       -       -       -       -       0
 19       -       -       -       -       -       -       -       0
 26       -       -       -       -       -                       0
                                                    Mar 2023: 5 hrs.

Total: 3 job(s), 5 hours
Database unchanged.

哇!现在您得到的是工作的月度报告。

让我解释一下如何阅读这个报告:报告的第一行显示了月份和年份3/2023

之后是一个表格,其中第一列显示了每一行的月份日期(除了第一行,总是1)。

接下来七列显示了每天的工时。因为我是在星期六写这个README.md,在sat下,所以您看到我在星期六工作了3小时,星期天工作了2小时。

在最后一列中,总结了每周的工作时间,在表格的末尾,它说我们在整个3月份工作的时间相同,- 虽然在我们的例子中看起来没有用 - 最后它总结了所有显示工作的总工作时间。

筛选视图

您可以在-r后面添加时间范围(请参阅下面的范围部分以了解格式)或使用-t来通过时间或标签过滤工作。

选择数据库

通常jobber使用配置文件中列出的数据库(请参阅下面的配置部分)。使用-f您可以覆盖要使用的数据库文件。

▶ jobber -f ~/my_jobber.json` [...]

日期、时间、持续时间和范围格式

日期和/或时间

日期和时间必须以以下格式之一输入

格式 类型 描述 示例
m/d/y,H:M 月份优先 日期和时间 1/31/2023,1:01
m/d/y 月份优先 日期 1/31/2023
m/d,H:M 月份优先 不包含年份的日期和带时间 1/31,1:01
m/d 月份优先 不包含年份的日期 1/31
d.m.y,H:M 日优先 日期和时间 31.1.2023,1:01
d.m.y 日优先 日期 31.1.2023
d.m.,H:M 日优先 不包含年份的日期和带时间 31.1.,1:01
d.m. 日优先 不包含年份的日期 31.1.
y-m-d,H:M 年优先 日期和时间 2023-1-31,1:01
y-m-d 年优先 日期 2023-1-31
H:M - 时间 1:01

时间格式内不允许有空格,并且日期和时间格式也可以互换为时间然后是日期。

如果日期或时间缺失,将使用当前时间。

如果一起给出开始和结束,只需定义一个日期。

持续时间

持续时间必须以以下格式之一输入

格式 类型 描述 示例
H:M 标准 小时和分钟 1:15
h,fr 带逗号 小时和小时的分数 1,25
h.fr 带小数点 小时和小时的分数 1.25

范围

时间或位置范围必须以以下格式之一输入

格式 描述 示例
f-t 从位置到位置 3-5
f- 从位置开始 3-
p 单个位置 3
~C 计数(从末尾开始) 10
s..u 从时间到时间 1/31,15:00..1.2.
s.. 从时间开始 1/31,15:00..
D 单日 1/31

当使用“从时间到时间”或“从时间”格式与“不包含年份的日期”一起时,请记住三个点将位于中间(例如:31.1...1.2.)。

导入和导出

遗留 CSV 导入

要从旧版本的 Rubyjobber 导入旧数据库格式,可以使用 --legacy-import

▶ jobber --legacy-import ~/my_old_jobber.dat 
Loaded database (2 entries) from file 'jobber.json'
Imported 125 jobs added new tags  consult ,  meeting ,  my_client ,  training .
Saved database into file 'jobber.json'

Jobber 显示它已成功导入 125 项工作,并且这次导入带来了四个新标签(再次说明:标签名称将被着色,但在这里的 Markdown 文本中不会)。

CSV 导出

使用选项 -E,可以将数据库或其部分导出为 CSV 文件,例如从中创建发票。

▶ jobber -E
Loaded database (3 entries) from file 'jobber.json'
"Tags","Start","Hours","Message"
"","03/04/2023 08:15",2.5,"What I did early this morning"
"","03/04/2023 16:25",0.5,"Did some nice work"
"meeting","03/05/2023 21:24",2,"meeting about new design"
Database unchanged.

如你所见,默认输出是一个包含以下列的CSV文件: tagsstarthoursmessage

导出的条目会自动按开始日期和时间排序,方便您使用。

要将输出写入文件,请使用shell的管道功能(例如 jobber -E > out.csv

要更改要导出的列,可以使用选项 --csv(可能的值有

名称 描述
# pos 位置
s start 开始
e end 结束
h hours 小时
m message 消息
t tags 标签
p pay 支付
- max_hours 最大小时
- rate 比率
- resolution 分辨率
▶ jobber -E --csv pos,start,end
Loaded database (3 entries) from file 'jobber.json'
"pos","start","end"
2,"03/04/2023 08:15","03/04/2023 10:45"
1,"03/04/2023 16:25","03/04/2023 16:34"
3,"03/05/2023 21:24","03/05/2023 23:24"
Database unchanged.

在这个例子中,我们只导出了每个工作的 posstarthours

您还可以使用选项 -E 指定范围,就像您创建报告时一样

▶ jobber -E 3/4,0:00..12:00
Loaded database (3 entries) from file 'jobber.json'
"tags","start","hours","message"
"","03/04/2023 08:15",2.5,"What I did early this morning"
Database unchanged.

如您所见,现在只导出了一个工作。

警告

Jobber 对您的命令进行多个合理性检查。每当出现似乎不合适的情况时,您将收到警告,并会被询问是否仍要继续。

您要添加的工作与现有工作重叠

您即将添加一个与另一个工作在时间上重叠的工作。

▶ jobber -s 3/4,9:00 -e 10:00
Loaded database (3 entries) from file 'jobber.json'
There is one warning you have to omit:

WARNING 1) The job you want to add overlaps existing one(s):

Job you want to add:

  Start: Sat Mar 04 2023, 09:00
    End: Sat Mar 04 2023, 10:00
  Hours: 1


Existing overlapping jobs:

    Pos: 2
  Start: Sat Mar 04 2023, 08:15
    End: Sat Mar 04 2023, 10:45
  Hours: 2.5
Message: What I did early this morning

Total: 1 job(s), 2.5 hours

Do you still want to add this job? (y/N)

Jobber 列出您即将添加的工作,然后是与之重叠的工作。

如果您开始一个工作(没有给出结束时间),并且开始时间早于任何现有工作,则假设结束时间可能是现在,因此您可能会收到警告。然后检查您的输入,如果这是故意的,回答 y 以继续或 n 以取消。

您使用了某些未知标记

使用选项 -t 您给出了某些当前未知的标签名称,然后 Jobber 会询问这是否是一个错误,或者您是否想添加新标签

▶ jobber -s -t consulting 
Loaded database (3 entries) from file 'jobber.json'
There is one warning you have to omit:

WARNING 1) You have used some tags ( consulting ) which are unknown so far. Continue if you want to create them.
Do you still want to add this job? (y/N)

在这种情况下,标签 consulting 是未知的。

要列出已知的标签,可以使用选项 -T(见 标签 部分)。

错误

数据库为空

您尝试继续一个现有工作,但数据库为空。

全局配置错误

您的配置(.config/jobber/config.toml)中有一个错误。

I/O 错误

读取或写入文件失败。

JSON 错误

解析 JSON 错误,数据库文件可能已损坏。

还有一个开放的工作

您尝试开始一个新工作,但现在有一个开放的工作需要先结束,然后才能添加新工作。

没有开放的工作

您尝试结束一个开放的工作,但没有任何工作。

工作结束时间早于开始时间

结束和开始时间看起来顺序颠倒了。

用户取消

在询问后,您拒绝了一些内容。

同一工作内不能使用标记,因为它们的配置不同

您使用了具有不同配置的两个标签,这是不允许的。

用户需要输入消息

您需要输入一条消息,但没有输入。

未知列名

在将工作导出到CSV文件时,您声明了一个未知的列名(只有 posstartendhoursmessagetags 是可用的)。

输出文件已存在

尝试写入已存在的输出文件。

日期/时间解析错误

日期和或时间的解析错误。

在指定位置未找到工作

您给出的是一个不在数据库中的位置。

需要一个值

需要为 '-t ' 输入一个值,但没有提供。

数据库中的工作太少,无法处理范围内的操作

您给出的是一个超出数据库范围的定位范围。

范围解析失败

您给出的是一个无法解析的范围。

持续时间解析失败

您给出的是一个无法解析的持续时间。

部分日期和时间的解析失败

您给出的是一个无法解析的部分日期和时间。

配置

数据库位置

在第一次启动时,Jobber 创建一个配置文件(通常在您的家目录中的 .config/jobber/config.toml)。

该文件当前只有一个条目,即

database = 'jobber.json'

如果您想将数据库放在其他地方,请更改数据库路径。

数据库内部配置

jobber数据库中有一些设置可能需要更改

  • 工作时间解析度
  • 您的时薪
  • 每天最大工作时间

jobber中,有一个基本配置,但您也可以通过在更改设置时添加带有-t的标签列表来为不同的客户附加配置,以实现不同客户的配置。

设置基本配置

工作时间解析度

使用-R可以设置工作时间解析度。默认值为0.25,表示半小时。因此,如果您添加一个持续时间为16分钟的工作,这将四舍五入到30分钟。

例如,您可能将基本解析度更改为半小时,如下所示

▶ jobber -R 0.5       
Beginning new database file 'jobber.json'
Changed the following default configuration values:

Resolution: 0.5 hours

Saved database into file 'jobber.json'
每小时工资率

要更改您的时薪,请使用-P。默认值没有设置,因此如果您不设置它,则不会显示任何费率。如果您这样做,jobber在列出时会列出成本。

▶ jobber -P 100
Loaded database (0 entries) from file 'jobber.json'
Changed the following default configuration values:

Payment per hour: 100

Saved database into file 'jobber.json'
每天最大小时数

如果您使用-H设置此值,并且工作天数超过此值,则报告中的这些天数将被标记为黄色。在列出超出此值的工作时,这些工作将被标记为黄色。

因此,如果您想将每天的最大工作时间更改为8小时,请使用以下方法

▶ jobber -H 8  
Loaded database (0 entries) from file 'jobber.json'
Changed the following default configuration values:

Maximum work time: 8 hours

Saved database into file 'jobber.json'

为特定标记设置配置

如果您有多个客户,并且每个客户有不同的支付率,您可以在设置配置时添加标签选项-t

显示配置

要显示您的配置(s),请使用选项-C

▶ jobber -C  
Loaded database (3 entries) from file 'jobber.json'
Base Configuration:

Resolution: 0.5 hours
Payment per hour: 100
Maximum work time: 8 hours

Database unchanged.

依赖项

~6–18MB
~192K SLoC