timert 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/bin/timert +8 -0
- data/lib/timert.rb +10 -0
- data/lib/timert/application.rb +73 -0
- data/lib/timert/argument_parser.rb +53 -0
- data/lib/timert/database.rb +62 -0
- data/lib/timert/database_file.rb +20 -0
- data/lib/timert/date_util.rb +22 -0
- data/lib/timert/day.rb +109 -0
- data/lib/timert/duration.rb +24 -0
- data/lib/timert/help.rb +21 -0
- data/lib/timert/report.rb +104 -0
- data/lib/timert/timer.rb +38 -0
- data/spec/application_spec.rb +148 -0
- data/spec/argument_parser_spec.rb +47 -0
- data/spec/database_file_spec.rb +21 -0
- data/spec/database_spec.rb +58 -0
- data/spec/date_util_spec.rb +19 -0
- data/spec/day_spec.rb +220 -0
- data/spec/duration_spec.rb +40 -0
- data/spec/report_spec.rb +83 -0
- data/spec/timer_spec.rb +63 -0
- metadata +117 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative '../lib/timert/duration'
|
2
|
+
|
3
|
+
describe Timert::Duration do
|
4
|
+
|
5
|
+
it 'should have a method that returns the number of hours' do
|
6
|
+
expect(Timert::Duration.new(3 * 60 * 60 + 2 * 60).hours).to eq(3)
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should have a method that returns the number of minutes' do
|
10
|
+
expect(Timert::Duration.new(3 * 60 * 60 + 2 * 60).minutes).to eq(2)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should have a method that returns the number of seconds' do
|
14
|
+
expect(Timert::Duration.new(2 * 60 + 55).seconds).to eq(55)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should have a method that creates new object from given hours, minutes and seconds' do
|
18
|
+
expect(Timert::Duration.from(2, 5, 10).hours).to eq(2)
|
19
|
+
expect(Timert::Duration.from(2, 5, 10).minutes).to eq(5)
|
20
|
+
expect(Timert::Duration.from(2, 5, 10).seconds).to eq(10)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should return formatted total elapsed time' do
|
24
|
+
expect(Timert::Duration.from(5, 45, 5).to_s).to eq("5h 45min 5sec")
|
25
|
+
expect(Timert::Duration.from(15, 0, 56).to_s).to eq("15h 0min 56sec")
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have a method that returns rounded duration when a full-hour duration is passed' do
|
29
|
+
expect(Timert::Duration.from(4, 0, 0).round).to eq("4.0")
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should have a method that returns rounded, decimal duration' do
|
33
|
+
expect(Timert::Duration.from(5, 13, 12).round).to eq("5.0")
|
34
|
+
expect(Timert::Duration.from(5, 15, 12).round).to eq("5.5")
|
35
|
+
expect(Timert::Duration.from(5, 35, 12).round).to eq("5.5")
|
36
|
+
expect(Timert::Duration.from(5, 46, 12).round).to eq("6.0")
|
37
|
+
expect(Timert::Duration.from(5, 59, 12).round).to eq("6.0")
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/spec/report_spec.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'timecop'
|
2
|
+
|
3
|
+
require_relative '../lib/timert/report'
|
4
|
+
|
5
|
+
describe Timert::Report do
|
6
|
+
let(:today) { Date.new(2013, 2, 20) }
|
7
|
+
let(:yesteday) { Date.new(2013, 2, 19) }
|
8
|
+
let(:database) { double }
|
9
|
+
|
10
|
+
let(:first_day) do
|
11
|
+
double(total_elapsed_time: 3.5 * 3600,
|
12
|
+
date: today,
|
13
|
+
tasks: ["emails", "meeting"],
|
14
|
+
intervals: [
|
15
|
+
{"start" => time(today, 16), "stop" => time(today, 18, 30)},
|
16
|
+
{"start" => time(today, 19), "stop" => time(today, 20)}
|
17
|
+
])
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:second_day) do
|
21
|
+
double(total_elapsed_time: 7 * 3600,
|
22
|
+
date: yesteday,
|
23
|
+
tasks: ["reports", "bugs"],
|
24
|
+
intervals: [
|
25
|
+
{"start" => time(yesteday, 11, 30), "stop" => time(yesteday, 16)},
|
26
|
+
{"start" => time(yesteday, 16, 30), "stop" => time(yesteday, 19, 30)}
|
27
|
+
])
|
28
|
+
end
|
29
|
+
|
30
|
+
before(:each) do
|
31
|
+
Timecop.freeze(today)
|
32
|
+
end
|
33
|
+
|
34
|
+
after(:each) do
|
35
|
+
Timecop.return
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should generate report for today' do
|
39
|
+
database.should_receive(:day).with(today).and_return(first_day)
|
40
|
+
|
41
|
+
report = Timert::Report.generate(database)
|
42
|
+
expect(report.include?("2013-02-20")).to eq(true)
|
43
|
+
expect(report.include?("emails")).to eq(true)
|
44
|
+
expect(report.include?("meeting")).to eq(true)
|
45
|
+
expect(report.include?("3.5")).to eq(true)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should generate report for any past day' do
|
49
|
+
database.should_receive(:day).with(yesteday).and_return(second_day)
|
50
|
+
|
51
|
+
report = Timert::Report.generate(database, -1)
|
52
|
+
expect(report.include?("2013-02-19")).to eq(true)
|
53
|
+
expect(report.include?("reports")).to eq(true)
|
54
|
+
expect(report.include?("bugs")).to eq(true)
|
55
|
+
expect(report.include?("7")).to eq(true)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should generate report for this week' do
|
59
|
+
database.should_receive(:days).and_return([first_day, second_day])
|
60
|
+
|
61
|
+
report = Timert::Report.generate(database, "week")
|
62
|
+
expect(report.include?("WEEK")).to eq(true)
|
63
|
+
expect(report.include?("2013-02-19")).to eq(true)
|
64
|
+
expect(report.include?("2013-02-20")).to eq(true)
|
65
|
+
expect(report.include?("Total")).to eq(true)
|
66
|
+
expect(report.include?("10.5")).to eq(true)
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should generate report for this month' do
|
70
|
+
database.should_receive(:days).and_return([first_day, second_day])
|
71
|
+
|
72
|
+
report = Timert::Report.generate(database, "month")
|
73
|
+
expect(report.include?("MONTH")).to eq(true)
|
74
|
+
expect(report.include?("2013-02-19")).to eq(true)
|
75
|
+
expect(report.include?("2013-02-20")).to eq(true)
|
76
|
+
expect(report.include?("Total")).to eq(true)
|
77
|
+
expect(report.include?("10.5")).to eq(true)
|
78
|
+
end
|
79
|
+
|
80
|
+
def time(day, hours, minutes = 0, seconds = 0)
|
81
|
+
day.to_time.to_i + hours * 3600 + minutes * 60 + seconds
|
82
|
+
end
|
83
|
+
end
|
data/spec/timer_spec.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'timecop'
|
3
|
+
require_relative '../lib/timert/timer'
|
4
|
+
require_relative '../lib/timert/day'
|
5
|
+
|
6
|
+
describe Timert::Timer do
|
7
|
+
before(:each) do
|
8
|
+
@today = Timert::Day.new
|
9
|
+
@timer = Timert::Timer.new(@today)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return start time when started' do
|
13
|
+
Timecop.freeze(Time.new(2013, 2, 14, 22, 0)) do
|
14
|
+
expect(@timer.start[:time]).to eq(Time.now.to_i)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'while running' do
|
19
|
+
before do
|
20
|
+
Timecop.freeze(Time.new(2013, 2, 14, 22, 0))
|
21
|
+
@timer.start
|
22
|
+
end
|
23
|
+
|
24
|
+
after do
|
25
|
+
Timecop.return
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should not start again until it's stopped" do
|
29
|
+
time = Time.now.to_i
|
30
|
+
expect(@timer.start(time)[:started]).not_to eq(true)
|
31
|
+
expect(@timer.start(time + 10)[:started]).not_to eq(true)
|
32
|
+
@timer.stop
|
33
|
+
expect(@timer.start(time + 10)[:started]).to eq(true)
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'and then stopped' do
|
37
|
+
it 'should return stop time' do
|
38
|
+
Timecop.freeze(Time.new(2013, 2, 14, 23, 0)) do
|
39
|
+
expect(@timer.stop[:time]).to eq(Time.now.to_i)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'while not running' do
|
46
|
+
it "should not stop until it's started" do
|
47
|
+
expect(@timer.stop[:stopped]).not_to eq(true)
|
48
|
+
@timer.start
|
49
|
+
expect(@timer.stop[:stopped]).to eq(true)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should be able to start with given time' do
|
54
|
+
time = Time.now.to_i
|
55
|
+
expect(@timer.start(time)[:time]).to eq(time)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should be able to stop with given time' do
|
59
|
+
@timer.start
|
60
|
+
time = Time.now.to_i + 500
|
61
|
+
expect(@timer.stop(time)[:time]).to eq(time)
|
62
|
+
end
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: timert
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gosia Kwidzinska
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-07-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ! '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ! '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: timecop
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ! '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colorize
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Timert is a simple time tracking tool for the console. If necessary you
|
56
|
+
can specify a time you want the timer to start or to stop. The tool provides also
|
57
|
+
summary reports for a given day, week or month
|
58
|
+
email: g.kwidzinska@gmail.com
|
59
|
+
executables:
|
60
|
+
- timert
|
61
|
+
extensions: []
|
62
|
+
extra_rdoc_files: []
|
63
|
+
files:
|
64
|
+
- bin/timert
|
65
|
+
- lib/timert.rb
|
66
|
+
- lib/timert/duration.rb
|
67
|
+
- lib/timert/help.rb
|
68
|
+
- lib/timert/database_file.rb
|
69
|
+
- lib/timert/day.rb
|
70
|
+
- lib/timert/timer.rb
|
71
|
+
- lib/timert/application.rb
|
72
|
+
- lib/timert/report.rb
|
73
|
+
- lib/timert/argument_parser.rb
|
74
|
+
- lib/timert/date_util.rb
|
75
|
+
- lib/timert/database.rb
|
76
|
+
- spec/day_spec.rb
|
77
|
+
- spec/application_spec.rb
|
78
|
+
- spec/timer_spec.rb
|
79
|
+
- spec/duration_spec.rb
|
80
|
+
- spec/report_spec.rb
|
81
|
+
- spec/database_file_spec.rb
|
82
|
+
- spec/argument_parser_spec.rb
|
83
|
+
- spec/date_util_spec.rb
|
84
|
+
- spec/database_spec.rb
|
85
|
+
homepage: http://rubygems.org/gems/timert
|
86
|
+
licenses: []
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
requirements: []
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 2.0.3
|
105
|
+
signing_key:
|
106
|
+
specification_version: 4
|
107
|
+
summary: Timert is a simple time tracking tool for the console.
|
108
|
+
test_files:
|
109
|
+
- spec/day_spec.rb
|
110
|
+
- spec/application_spec.rb
|
111
|
+
- spec/timer_spec.rb
|
112
|
+
- spec/duration_spec.rb
|
113
|
+
- spec/report_spec.rb
|
114
|
+
- spec/database_file_spec.rb
|
115
|
+
- spec/argument_parser_spec.rb
|
116
|
+
- spec/date_util_spec.rb
|
117
|
+
- spec/database_spec.rb
|