haora 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0547d25210e816ce4b8c79a840d98b562375bc6a
4
- data.tar.gz: 17c0b9c91a53c07cd2a52acb69e37d83ff574527
3
+ metadata.gz: 8b50be4b063db3e1bdda7a9319f174e9d65c049e
4
+ data.tar.gz: 38b6246c198ac1cb532ceb0b13ea1bd93eac779a
5
5
  SHA512:
6
- metadata.gz: 31f23994b28746e41264a1862773ca03231d3c0f822bbfebac63491c08736957b77ecfafaaa3b2d8624bb33aece124d31b2e6eb9b0dfd21a7373a9d199a4c43e
7
- data.tar.gz: 8d97505344e4993ee5a752b238f0b7873e4f8ac37733458a959507c794dcf1ea9ef37f7758caad161b1c56621a343ada7f70fd573a44cd95bb13eed27cfd907e
6
+ metadata.gz: 14d5b903d8cf19545c965b89bf0c55912f20db05a4d8434f7566469279c826c48b3a7815c3a2dc9eba0c130149b2537041c3cd57e30f316d443c5bdb57adc543
7
+ data.tar.gz: 9e17772fea15a6b217ccaebb29853229ee5850d4f2c09712115c2e2b6d8487688f7df18496bea8583cad8e0d90b21836faf540131dd4a4b9039e719a3d095f3b
data/bin/haora CHANGED
@@ -32,7 +32,7 @@ command :add do |c|
32
32
  :project => options[:project],
33
33
  :text => args[0]
34
34
  }
35
- Haora::Service.for(file_name).add_task(params)
35
+ print Haora::Service.for(file_name).add_task(params)
36
36
  end
37
37
  end
38
38
 
@@ -48,17 +48,25 @@ command :finish do |c|
48
48
  :project => options[:project],
49
49
  :text => args[0]
50
50
  }
51
- Haora::Service.for(file_name).finish(params)
51
+ print Haora::Service.for(file_name).finish(params)
52
52
  end
53
53
  end
54
54
 
55
55
  desc 'Lists tasks of a day'
56
56
  command :list do |c|
57
+ c.switch :w, :week
57
58
  c.action do |global_actions, options, args|
58
59
  file_name = global_actions[:file]
59
- date = global_actions[:date]
60
- puts Haora::Service.for(file_name).list(date)
60
+ params = {
61
+ :date => global_actions[:date],
62
+ :week => options[:week]
63
+ }
64
+ print Haora::Service.for(file_name).list(params)
61
65
  end
62
66
  end
63
67
 
68
+ def print(output)
69
+ puts output unless output.nil?
70
+ end
71
+
64
72
  exit run(ARGV)
@@ -0,0 +1,21 @@
1
+ module Haora
2
+
3
+ class AddTaskCommand < Command
4
+
5
+ def self.with(workbook)
6
+ AddTaskCommand.new(workbook)
7
+ end
8
+
9
+ def execute
10
+ day(at: date) << Task.new(@params)
11
+ end
12
+
13
+ private
14
+
15
+ def initialize(workbook)
16
+ super(workbook)
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,38 @@
1
+ module Haora
2
+
3
+ class Command
4
+
5
+ def initialize(workbook)
6
+ @workbook = workbook
7
+ end
8
+
9
+ def params(params)
10
+ @params = params
11
+ self
12
+ end
13
+
14
+ def day(date_params)
15
+ @workbook[date_params[:at]]
16
+ end
17
+
18
+ def week(date_params)
19
+ day = day(date_params)
20
+ date = day.date
21
+ [
22
+ day,
23
+ day(at: date.next_day(1)),
24
+ day(at: date.next_day(2)),
25
+ day(at: date.next_day(3)),
26
+ day(at: date.next_day(4)),
27
+ day(at: date.next_day(5)),
28
+ day(at: date.next_day(6)),
29
+ ]
30
+ end
31
+
32
+ def date
33
+ @params[:date]
34
+ end
35
+
36
+ end
37
+
38
+ end
data/lib/haora/day.rb CHANGED
@@ -1,5 +1,14 @@
1
1
  require 'date'
2
2
 
3
+ class Date
4
+
5
+ def prev_wday(wday)
6
+ before = self.prev_day
7
+ before.wday == wday ? before : before.prev_wday(wday)
8
+ end
9
+
10
+ end
11
+
3
12
  module Haora
4
13
 
5
14
  class Day
@@ -14,11 +23,28 @@ module Haora
14
23
  end
15
24
 
16
25
  def hours
17
- tasks.map { |t| t.duration }
26
+ tasks
27
+ .collect { |t| t.duration }
18
28
  .reduce { |acc, d| acc + d }
19
29
  .hours
20
30
  end
21
31
 
32
+ def project_names
33
+ tasks
34
+ .select { |t| not t.project.noname? }
35
+ .collect { |t| t.project.name }
36
+ .uniq
37
+ end
38
+
39
+ def duration(params = {})
40
+ if (project_name = params[:of_project])
41
+ selected_tasks = tasks.select { |t| t.project.name == project_name }
42
+ else
43
+ selected_tasks = tasks
44
+ end
45
+ selected_tasks.reduce(Duration.new) { |acc, t| acc = acc + t.duration }
46
+ end
47
+
22
48
  def <<(task)
23
49
  finish(stop: task.start) if tasks.last&.open?
24
50
  tasks << task
@@ -70,7 +96,53 @@ module Haora
70
96
  class DateParser
71
97
 
72
98
  def self.parse(date)
73
- return Date.strptime(date, '%d.%m.%Y')
99
+ begin
100
+ case date
101
+ when /m([0-9]+)/
102
+ Day.today.prev_day($1.to_i)
103
+ when /([0-9]?[0-9]).([0-9]?[0-9]).([0-9]?[0-9]?[0-9][0-9])/
104
+ return Date.new(year($3), mon($2), mday($1))
105
+ when /([0-9]?[0-9]).([0-9]?[0-9]).?/
106
+ return Date.new(year, mon($2), mday($1))
107
+ when /([0-9]?[0-9]).?/
108
+ return Date.new(year, mon, mday($1))
109
+ when /mon?/
110
+ return Day.today.prev_wday(1)
111
+ when /tue?/
112
+ return Day.today.prev_wday(2)
113
+ when /wed?/
114
+ return Day.today.prev_wday(3)
115
+ when /thu?/
116
+ return Day.today.prev_wday(4)
117
+ when /fri?/
118
+ return Day.today.prev_wday(5)
119
+ when /sat?/
120
+ return Day.today.prev_wday(6)
121
+ when /sun?/
122
+ return Day.today.prev_wday(0)
123
+ else
124
+ return Date.today
125
+ end
126
+ rescue => error
127
+ puts error
128
+ raise ArgumentError, 'invalid date'
129
+ end
130
+ end
131
+
132
+ private
133
+
134
+ def self.year(year_param = Day.today.year)
135
+ year = year_param.to_i
136
+ year = year + 2000 if year < 100 && year + 2000 <= Date.today.year
137
+ year
138
+ end
139
+
140
+ def self.mon(mon_param = Day.today.mon)
141
+ mon_param.to_i
142
+ end
143
+
144
+ def self.mday(mday_param = Day.today.mday)
145
+ mday_param.to_i
74
146
  end
75
147
 
76
148
  end
@@ -0,0 +1,21 @@
1
+ module Haora
2
+
3
+ class FinishCommand < Command
4
+
5
+ def self.with(workbook)
6
+ FinishCommand.new(workbook)
7
+ end
8
+
9
+ def execute
10
+ day(at: date).finish(@params)
11
+ end
12
+
13
+ private
14
+
15
+ def initialize(workbook)
16
+ super(workbook)
17
+ end
18
+
19
+ end
20
+
21
+ end
data/lib/haora/list.rb ADDED
@@ -0,0 +1,29 @@
1
+ module Haora
2
+
3
+ class ListCommand < Command
4
+
5
+ def self.with(workbook)
6
+ ListCommand.new(workbook)
7
+ end
8
+
9
+ def execute
10
+ if week_display?
11
+ WeekRenderer.new.render(week(at: date))
12
+ else
13
+ DayRenderer.new.render(day(at: date))
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def initialize(workbook)
20
+ super(workbook)
21
+ end
22
+
23
+ def week_display?
24
+ @params[:week]
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -1,54 +1,69 @@
1
1
  module Haora
2
2
 
3
- class StandardDayRenderer
3
+ class Renderer
4
+
5
+ private
6
+
7
+ def rendered_timespan(start, stop)
8
+ timespan = '%s - %s' % [start.to_s, stop.nil? ? ' now ' : stop.to_s]
9
+ timespan.prepend(' ') if timespan.length < 13
10
+ timespan
11
+ end
12
+
13
+ def rendered_duration(hours)
14
+ '%5.2f' % hours
15
+ end
16
+
17
+ end
18
+
19
+ class DayRenderer < Renderer
4
20
 
5
21
  def render(day)
6
22
  raise 'none' if day.tasks.empty?
7
- 'Tasks of ' << rendered_date_of(day) << "\n" \
8
- << rendered(day.tasks) << "\n" \
9
- << rendered_total(day)
23
+ %W(#{rendered_date_of(day)} #{rendered(day.tasks)} #{rendered_total(day)}).join($/)
10
24
  end
11
25
 
12
26
  private
13
27
 
14
28
  def rendered_date_of(day)
15
- if day.date == Day.today
16
- 'today'
17
- else
18
- day.date.strftime('%d.%m.%Y')
19
- end
29
+ date = day.date.strftime('%a %d.%m.%Y')
30
+ date << ' (today)' if day.date == Day.today
31
+ date
20
32
  end
21
33
 
22
34
  def rendered(tasks)
23
- tasks.map { |task| rendered_task(task) }.join("\n")
35
+ tasks.map { |task| rendered_task(task, tasks[tasks.index(task) + 1]) }.join($/)
24
36
  end
25
37
 
26
38
  def rendered_total(day)
27
- if day.tasks.empty?
28
- 'none'
29
- else
30
- ' Total = %5.2f' % day.hours
31
- end
39
+ day.project_names
40
+ .collect { |name| rendered_project_total(name, day.duration(of_project: name)) }
41
+ .push(' Total = %5.2f' % day.hours)
42
+ .join($/)
32
43
  end
33
44
 
34
- def rendered_task(task)
45
+ def rendered_project_total(name, duration)
46
+ total = '%s =' % name[0..12]
47
+ '%s %5.2f' % [total.rjust(15), duration.hours]
48
+ end
49
+
50
+ def rendered_task(task, next_task)
35
51
  timespan = rendered_timespan(task.start, task.stop)
36
- duration = rendered_duration(task)
52
+ duration = rendered_duration(task.duration.hours)
37
53
  if task.project.noname?
38
- '%s = %s %s' % [timespan, duration, task.text]
54
+ output = '%s = %s %s' % [timespan, duration, task.text]
39
55
  else
40
- '%s = %s %s: %s' % [timespan, duration, task.project.name, task.text]
56
+ output = '%s = %s %s: %s' % [timespan, duration, task.project.name, task.text]
41
57
  end
58
+ include_rendered_gap(task, next_task, output)
42
59
  end
43
60
 
44
- def rendered_timespan(start, stop)
45
- timespan = '%s - %s' % [start.to_s, stop.nil? ? ' now ' : stop.to_s]
46
- timespan.prepend(' ') if timespan.length < 13
47
- timespan
48
- end
49
-
50
- def rendered_duration(task)
51
- '%5.2f' % task.duration.hours
61
+ def include_rendered_gap(task, next_task, output)
62
+ unless next_task.nil?
63
+ gap = task.gap(to_next: next_task)
64
+ output << "\n %dm" % gap.minutes unless gap.minutes == 0
65
+ end
66
+ output
52
67
  end
53
68
 
54
69
  end
data/lib/haora/task.rb CHANGED
@@ -30,6 +30,11 @@ module Haora
30
30
  (@stop.nil? ? Timestamp.now : @stop) - @start
31
31
  end
32
32
 
33
+ def gap(params)
34
+ next_task = params[:to_next]
35
+ next_task.start - @stop
36
+ end
37
+
33
38
  def <=>(other)
34
39
  @start.to_minutes <=> other.start.to_minutes
35
40
  end
@@ -62,6 +62,10 @@ module Haora
62
62
  minutes / 60.0
63
63
  end
64
64
 
65
+ def ==(other)
66
+ @minutes == other.minutes
67
+ end
68
+
65
69
  def +(other)
66
70
  Duration.of_minutes(@minutes + other.minutes)
67
71
  end
@@ -72,7 +76,7 @@ module Haora
72
76
 
73
77
  private
74
78
 
75
- def initialize(minutes)
79
+ def initialize(minutes = 0)
76
80
  @minutes = minutes
77
81
  end
78
82
 
data/lib/haora/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Haora
2
2
 
3
- VERSION = '0.0.6'
3
+ VERSION = '0.1.0'
4
4
 
5
5
  end
@@ -0,0 +1,43 @@
1
+ module Haora
2
+
3
+ class WeekRenderer < Renderer
4
+
5
+ def render(week_days)
6
+ days = rendered_days(week_days)
7
+ if days.length > 0
8
+ days << $/ << rendered_total(week_days)
9
+ else
10
+ 'none'
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def rendered_days(days)
17
+ days.select { |day| day.tasks.length > 0 }
18
+ .collect { |day| rendered_day(day) }
19
+ .join($/)
20
+ end
21
+
22
+ def rendered_total(days)
23
+ hours = days.select { |day| day.tasks.length > 0 }
24
+ .collect { |day| day.hours }
25
+ .reduce(:+)
26
+ ' Total = %s' % rendered_duration(hours)
27
+ end
28
+
29
+ def rendered_day(day)
30
+ start = day.tasks.first.start
31
+ stop = day.tasks.last.stop
32
+ '%s %s = %s' % [rendered_date(day.date),
33
+ rendered_timespan(start, stop),
34
+ rendered_duration(day.hours)]
35
+ end
36
+
37
+ def rendered_date(date)
38
+ date.strftime('%a %d.%m.%Y')
39
+ end
40
+
41
+ end
42
+
43
+ end
data/lib/haora.rb CHANGED
@@ -4,10 +4,16 @@ require 'haora/task'
4
4
  require 'haora/project'
5
5
  require 'haora/day'
6
6
  require 'haora/renderer'
7
+ require 'haora/week_renderer'
7
8
  require 'haora/workbook'
8
9
  require 'haora/io'
9
10
  require 'haora/file'
10
11
 
12
+ require 'haora/command'
13
+ require 'haora/add_task'
14
+ require 'haora/finish'
15
+ require 'haora/list'
16
+
11
17
  module Haora
12
18
 
13
19
  class Service
@@ -18,22 +24,30 @@ module Haora
18
24
  end
19
25
 
20
26
  def add_task(params)
21
- write {
22
- @workbook[params[:date]] << Task.new(start: params[:start], stop: params[:stop], project: params[:project], text: params[:text])
23
- }
27
+ write do
28
+ AddTaskCommand
29
+ .with(@workbook)
30
+ .params(params)
31
+ .execute
32
+ end
24
33
  end
25
34
 
26
35
  def finish(params)
27
- write {
28
- @workbook[params[:date]].finish(params)
29
- }
36
+ write do
37
+ FinishCommand
38
+ .with(@workbook)
39
+ .params(params)
40
+ .execute
41
+ end
30
42
  end
31
43
 
32
- def list(date = nil)
33
- read {
34
- day = @workbook[date]
35
- StandardDayRenderer.new.render(day)
36
- }
44
+ def list(params)
45
+ read do
46
+ ListCommand
47
+ .with(@workbook)
48
+ .params(params)
49
+ .execute
50
+ end
37
51
  end
38
52
 
39
53
  private
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: haora
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dirk Rademann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-27 00:00:00.000000000 Z
11
+ date: 2017-03-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gli
@@ -89,14 +89,19 @@ extra_rdoc_files: []
89
89
  files:
90
90
  - bin/haora
91
91
  - lib/haora.rb
92
+ - lib/haora/add_task.rb
93
+ - lib/haora/command.rb
92
94
  - lib/haora/day.rb
93
95
  - lib/haora/file.rb
96
+ - lib/haora/finish.rb
94
97
  - lib/haora/io.rb
98
+ - lib/haora/list.rb
95
99
  - lib/haora/project.rb
96
100
  - lib/haora/renderer.rb
97
101
  - lib/haora/task.rb
98
102
  - lib/haora/timestamp.rb
99
103
  - lib/haora/version.rb
104
+ - lib/haora/week_renderer.rb
100
105
  - lib/haora/workbook.rb
101
106
  homepage: http://github.com/drademann/haora-cli
102
107
  licenses: