achoo 0.4.1 → 0.4.2

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.
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ 2010-05-11: version 0.4.2
2
+
3
+ - Fixed problem with identifying the halt event in the awake log.
4
+
5
+ - Improved command line argument handling in the ical binary.
6
+
1
7
  2010-04-20: version 0.4.1
2
8
 
3
9
  - Bug fixes
data/Rakefile CHANGED
@@ -1,7 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'rake/gempackagetask'
4
- require 'rake/rdoctask'
5
4
  require 'rake/testtask'
6
5
  require 'rubygems'
7
6
 
@@ -37,30 +36,99 @@ namespace 'test' do
37
36
  t.test_files = FileList['test/acceptance/test*.rb']
38
37
  end
39
38
 
39
+ end
40
+
41
+ namespace 'metrics' do
42
+
43
+ begin
44
+ require 'code_stats'
45
+ CodeStats::Tasks.new
46
+ rescue LoadError => e
47
+ warn "Package code_stats required for the metrics:code_stats task to be available."
48
+ end
49
+
40
50
  desc 'Measures test coverage'
41
51
  task :coverage do
42
52
  rm_f('coverage')
43
- system("rcov -T -Ilib test/unit/test_*.rb")
53
+ system("rcov -T -Ilib:test/lib test/unit/test_*.rb")
44
54
  end
45
55
 
46
56
  end
47
57
 
58
+
59
+ begin
60
+ require 'metric_fu'
61
+ MetricFu::Configuration.run do |config|
62
+ dirs = %w(lib bin)
63
+
64
+ # Define which metrics you want to use.
65
+ # [:churn, :saikuro, :stats, :flog, :flay, :reek, :roodi, :rcov]
66
+ # - :stats only works for rails applications
67
+ config.metrics = [:churn, :saikuro, :flog, :flay, :reek, :roodi, :rcov]
68
+
69
+ # [:flog, :flay, :reek, :roodi, :rcov]
70
+ config.graphs = [:flog, :flay, :reek, :roodi, :rcov]
71
+
72
+ config.flay = {
73
+ :dirs_to_flay => dirs,
74
+ :minimum_score => 0,
75
+ }
76
+ config.flog = { :dirs_to_flog => dirs }
77
+ config.reek = { :dirs_to_reek => dirs }
78
+ config.roodi = { :dirs_to_roodi => dirs }
79
+ config.saikuro = {
80
+ :output_directory => 'scratch_directory/saikuro',
81
+ :input_directory => dirs,
82
+ :cyclo => "",
83
+ :filter_cyclo => "0",
84
+ :warn_cyclo => "5",
85
+ :error_cyclo => "7",
86
+ :formater => "text" #this needs to be set to "text"
87
+ }
88
+ config.churn = {
89
+ :start_date => "1 year ago",
90
+ :minimum_churn_count => 10
91
+ }
92
+ config.rcov = {
93
+ :environment => '',
94
+ :test_files => ['test/unit/**/test_*.rb'],
95
+ :rcov_opts => ["--sort coverage",
96
+ "--no-html",
97
+ "--text-coverage",
98
+ "--no-color",
99
+ "--profile",
100
+ "--exclude /gems/,/test/",
101
+ "--include lib:test/lib",
102
+ ]}
103
+
104
+ # :bluff or :gchart
105
+ config.graph_engine = :bluff
106
+ end
107
+ rescue LoadError => e
108
+ warn "Package metric_fu required for the metrics:all task to be available."
109
+ end
110
+
111
+
48
112
  namespace 'doc' do
49
113
 
114
+ begin
115
+ require 'hanna/rdoctask'
116
+ rescue LoadError => e
117
+ warn "Package hanna recommended for better rdoc output."
118
+ require 'rake/rdoctask'
119
+ end
50
120
  Rake::RDocTask.new do |rd|
51
121
  rd.title = 'Achoo --- The Achievo CLI'
52
122
  rd.main = "README.rdoc"
53
123
  rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
54
- rd.template = `allison --path`.chop + '.rb'
55
124
  rd.options << '--line-numbers' << '--inline-source'
56
125
  rd.rdoc_dir = 'doc'
57
126
  end
58
-
59
127
  end
60
128
 
61
129
  desc 'Install development dependencies'
62
130
  task :setup do
63
- system 'gem install shoulda rack thin redgreen allison'
131
+ system 'gem install shoulda rack thin redgreen metric_fu code_stats hanna'
64
132
  end
65
133
 
66
134
  desc 'Remove generated files and folders'
data/bin/ical CHANGED
@@ -9,8 +9,22 @@ include Achoo::RCLoader
9
9
  def main
10
10
  load_rc
11
11
 
12
+ options = {
13
+ :date => Date.today,
14
+ }
15
+
16
+ optparse = OptionParser.new do|opts|
17
+ opts.banner = "Usage: $0 [options]"
18
+
19
+ opts.on( '-d', '--date [DATE]', 'FIX' ) do |date|
20
+ options[:date] = Date.parse(date)
21
+ end
22
+ end
23
+
24
+ optparse.parse!
25
+
12
26
  RC[:ical].each do |config|
13
- Achoo::ICal.from_http_request(config).print_events(Date.parse(ARGV[0]))
27
+ Achoo::ICal.from_http_request(config).print_events(options[:date])
14
28
  end
15
29
  end
16
30
 
data/lib/achoo/achievo.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'achoo'
2
+ require 'achoo/achievo/date_field'
2
3
 
3
4
  module Achoo
4
5
  module Achievo
5
- autoload :Form, 'achoo/achievo/form.rb'
6
6
  autoload :HourAdministrationForm, 'achoo/achievo/hour_administration_form.rb'
7
7
  autoload :HourRegistrationForm, 'achoo/achievo/hour_registration_form.rb'
8
8
  autoload :HourRegistrationFormRanged, 'achoo/achievo/hour_registration_form_ranged.rb'
@@ -0,0 +1,35 @@
1
+ require 'achoo/achievo'
2
+
3
+ module Achoo
4
+ module Achievo
5
+
6
+ def self.DateField(attr_name, field_name)
7
+ Module.new do
8
+ define_method("#{attr_name}=") do |date|
9
+ # Day and month must be prefixed with '0' if single
10
+ # digit. Date.day and Date.month doesn't do this. Use strftime
11
+ send("#{attr_name}_day_field=", date.strftime('%d'))
12
+ send("#{attr_name}_month_field=", date.strftime('%m'))
13
+ send("#{attr_name}_year_field=", date.year)
14
+ end
15
+
16
+ define_method("#{attr_name}") do
17
+ Date.new(*[send("#{attr_name}_year_field"),
18
+ send("#{attr_name}_month_field"),
19
+ send("#{attr_name}_day_field")].collect {|e| e.to_i})
20
+ end
21
+
22
+ %w(day month year).each do |e|
23
+ define_method("#{attr_name}_#{e}_field") do
24
+ @form.field_with(:name => "#{field_name}[#{e}]").value
25
+ end
26
+
27
+ define_method("#{attr_name}_#{e}_field=") do |val|
28
+ @form.field_with(:name => "#{field_name}[#{e}]").value = val
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -3,7 +3,9 @@ require 'achoo/term/table'
3
3
 
4
4
  module Achoo
5
5
  module Achievo
6
- class HourAdministrationForm < Form
6
+ class HourAdministrationForm
7
+
8
+ include Achievo::DateField('date', 'viewdate')
7
9
 
8
10
  def initialize(agent)
9
11
  @agent = agent
@@ -74,18 +76,6 @@ module Achoo
74
76
  @page = @form.submit
75
77
  end
76
78
 
77
- def day_field
78
- @form.field_with(:name => 'viewdate[day]')
79
- end
80
-
81
- def month_field
82
- @form.field_with(:name => 'viewdate[month]')
83
- end
84
-
85
- def year_field
86
- @form.field_with(:name => 'viewdate[year]')
87
- end
88
-
89
79
  end
90
80
  end
91
81
  end
@@ -2,7 +2,9 @@ require 'achoo/achievo'
2
2
 
3
3
  module Achoo
4
4
  module Achievo
5
- class HourRegistrationForm < Form
5
+ class HourRegistrationForm
6
+
7
+ include Achievo::DateField('date', 'activitydate')
6
8
 
7
9
  def initialize(agent)
8
10
  @agent = agent
@@ -65,10 +67,17 @@ module Achoo
65
67
  @form.billpercent = "billpercent.id='#{billing}'"
66
68
  end
67
69
 
68
-
69
70
  def worktime_periods
70
- @form.field_with(:name => 'workperiod').options.collect do |opt|
71
- [opt.value.match(/workperiod\.id='(\d+)'/)[1], opt.text]
71
+ collect_options('workperiod')
72
+ end
73
+
74
+ def billing_options
75
+ collect_options('billpercent')
76
+ end
77
+
78
+ def collect_options(field_name, pattern)
79
+ @form.field_with(:name => field_name).options.collect do |opt|
80
+ [opt.value.match(/#{field_name}\.id='(\d+)'/)[1], opt.text]
72
81
  end
73
82
  end
74
83
 
@@ -178,18 +187,6 @@ module Achoo
178
187
  body, nil, @agent)
179
188
  end
180
189
 
181
- def day_field
182
- @form.field_with(:name => 'activitydate[day]')
183
- end
184
-
185
- def month_field
186
- @form.field_with(:name => 'activitydate[month]')
187
- end
188
-
189
- def year_field
190
- @form.field_with(:name => 'activitydate[year]')
191
- end
192
-
193
190
  def extract_number_from_projectid(projectid)
194
191
  projectid.match(/project\.id='(\d+)'/)[1]
195
192
  end
@@ -4,42 +4,25 @@ module Achoo
4
4
  module Achievo
5
5
  class HourRegistrationFormRanged < HourRegistrationForm
6
6
 
7
+ include Achievo::DateField('to_date', 'todate')
8
+
7
9
  def initialize(agent)
8
10
  super
9
-
10
11
  @page = @agent.get(atk_submit_to_url(@page.link_with(:text => 'Select range').href))
11
12
  @form = @page.form('entryform')
12
13
  end
13
14
 
14
15
  def date=(date_range)
15
16
  super(date_range[0])
16
-
17
- to_day_field.value = date_range[1].strftime('%d')
18
- to_month_field.value = date_range[1].strftime('%m')
19
- to_year_field.value = date_range[1].year
17
+ self.to_date = date_range[1]
20
18
  end
21
19
 
22
20
  def date
23
- start = super
24
- finish = Date.new(to_year_field.value.to_i, to_month_field.value.to_i,
25
- to_day_field.value.to_i)
26
- [start, finish]
21
+ [super, to_date()]
27
22
  end
28
23
 
29
24
  private
30
25
 
31
- def to_day_field
32
- @form.field_with(:name => 'todate[day]')
33
- end
34
-
35
- def to_month_field
36
- @form.field_with(:name => 'todate[month]')
37
- end
38
-
39
- def to_year_field
40
- @form.field_with(:name => 'todate[year]')
41
- end
42
-
43
26
  def date_to_s
44
27
  date.map {|d| d.strftime("%Y-%m-%d")}.join(" -> ")
45
28
  end
data/lib/achoo/awake.rb CHANGED
@@ -7,7 +7,7 @@ module Achoo
7
7
  class Awake
8
8
 
9
9
  def initialize
10
- log = wtmp.merge!(suspend)
10
+ log = wtmp.merge!(suspend).reverse
11
11
  log.unshift(System::LogEntry.new(Time.now, :now))
12
12
  @sessions = sessions(log)
13
13
  end
@@ -69,16 +69,11 @@ module Achoo
69
69
  end
70
70
 
71
71
  def suspend
72
- log = System::PMSuspend.new.reverse
73
- new_log = []
74
- log.each do |entry|
75
- new_log << System::LogEntry.new(entry.time, entry.event == 'Awake.' ? :awake : :suspend)
76
- end
77
- new_log
72
+ System::PMSuspend.new
78
73
  end
79
74
 
80
75
  def wtmp
81
- log = System::Wtmp.new.reverse
76
+ log = System::Wtmp.new
82
77
  new_log = []
83
78
  log.each do |entry|
84
79
  if entry.boot_event?
@@ -1,8 +1,12 @@
1
1
  class Array
2
2
 
3
+ %w(merge!).each do |method|
4
+ raise "Method already defined: #{name}\##{method}" \
5
+ if method_defined?(method)
6
+ end
7
+
3
8
  #
4
- # Useful for merging two sorted arrays with Comparable
5
- # elements.
9
+ # Useful for merging two sorted arrays with Comparable elements.
6
10
  #
7
11
  # The content of the two input arrays should not be trusted after
8
12
  # being mistreated by this method.
@@ -22,3 +26,22 @@ class Array
22
26
  end
23
27
 
24
28
  end
29
+
30
+
31
+ class Integer
32
+
33
+ %w(day days hour hours minute minutes).each do |method|
34
+ raise "Method already defined: #{name}\##{method}" \
35
+ if method_defined?(method)
36
+ end
37
+
38
+ def day; self * 86400; end
39
+ alias days day
40
+
41
+ def hour; self * 3600; end
42
+ alias hours hour
43
+
44
+ def minute; self * 60; end
45
+ alias minutes minute
46
+
47
+ end
@@ -16,7 +16,7 @@ module Achoo
16
16
  next unless l =~ /Awake|performing suspend/
17
17
  time, event = *l.split(': ')
18
18
  time = Time.parse(time)
19
- self << LogEntry.new(time, event)
19
+ self << LogEntry.new(time, event == 'Awake.' ? :awake : :suspend)
20
20
  end
21
21
  end
22
22
  end
@@ -56,7 +56,7 @@ module Achoo
56
56
  end
57
57
 
58
58
  def halt_event?
59
- record_type_symbol == :term && device_name == ':0'
59
+ record_type_symbol == :run_lvl && username == 'shutdown'
60
60
  end
61
61
 
62
62
  end
@@ -17,6 +17,10 @@ module Achoo
17
17
  end
18
18
  end
19
19
 
20
+ def to_s
21
+ inject('') {|str, e| str << e.to_s << "\n"}
22
+ end
23
+
20
24
  end
21
25
  end
22
26
  end
@@ -3,51 +3,30 @@ require 'time'
3
3
 
4
4
  module Achoo
5
5
  module Temporal
6
- class Timespan
7
-
8
- SECONDS_IN_A_DAY = 86400
9
- SECONDS_IN_AN_HOUR = 3600
10
- SECONDS_IN_A_MINUTE = 60
11
-
12
- attr :start
13
- attr :end
6
+ class Timespan < Range
14
7
 
15
8
  def initialize(start, end_)
16
9
  raise ArgumentError.new('Nil in parameters not allowed') if start.nil? || end_.nil?
17
10
 
18
- self.start = start
19
- self.end = end_
20
- end
21
-
22
- def start=(timeish)
23
- @start = to_time(timeish)
24
- end
25
-
26
- def end=(timeish)
27
- @end = to_time(timeish)
11
+ super(to_time(start), to_time(end_))
28
12
  end
29
13
 
30
14
  def to_s
31
- duration = duration_string
32
- from_to = from_to_string
33
-
34
- sprintf("(%s) %s", duration, from_to)
15
+ "(%s) %s" % [duration_string, from_to_string]
35
16
  end
36
17
 
37
18
  def contains?(timeish_or_timespan)
38
19
  if timeish_or_timespan.is_a? Timespan
39
- timespan = timeish_or_timespan
40
- return start <= timespan.start && self.end >= timespan.end
20
+ time = timeish_or_timespan
21
+ include?(time.first) && include?(time.last)
41
22
  else
42
- time = to_time(timeish_or_timespan)
43
- return start <= time && self.end >= time
23
+ include?(to_time(timeish_or_timespan))
44
24
  end
45
25
  end
46
26
 
47
27
  def overlaps?(timespan)
48
- start <= timespan.start && self.end >= timespan.start \
49
- || start <= timespan.end && self.end >= timespan.end \
50
- || contains?(timespan) || timespan.contains?(self)
28
+ include?(timespan.first) || include?(timespan.last) ||
29
+ timespan.contains?(self)
51
30
  end
52
31
 
53
32
  private
@@ -69,25 +48,33 @@ module Achoo
69
48
  end
70
49
  end
71
50
 
72
-
73
51
  def duration_string
74
- delta = @end - @start
75
- d = delta.to_i / SECONDS_IN_A_DAY
52
+ "%d+%02d:%02d" % duration
53
+ end
76
54
 
77
- delta = delta - d*SECONDS_IN_A_DAY
78
- h = delta.to_i / SECONDS_IN_AN_HOUR
55
+ def duration
56
+ delta = last - first
57
+ d = delta.to_i / 1.day
79
58
 
80
- delta = delta - h*SECONDS_IN_AN_HOUR
81
- m = delta.to_i / SECONDS_IN_A_MINUTE
59
+ delta = delta - d.days
60
+ h = delta.to_i / 1.hour
82
61
 
83
- sprintf "%d+%02d:%02d", d, h, m
62
+ delta = delta - h.hours
63
+ m = delta.to_i / 1.minute
64
+
65
+ return [d, h, m]
84
66
  end
85
67
 
86
68
  def from_to_string
87
69
  today = Date.today
88
- start_date = start.send(:to_date)
89
- end_date = self.end.send(:to_date)
70
+ start_date = first.send(:to_date)
71
+ end_date = last.send(:to_date)
72
+
73
+ "%s - %s" % [from_as_string(start_date, today),
74
+ to_as_string(start_date, end_date, today)]
75
+ end
90
76
 
77
+ def from_as_string(start_date, today)
91
78
  format = if start_date == today
92
79
  "Today"
93
80
  elsif start_date.month == today.month &&
@@ -98,8 +85,10 @@ module Achoo
98
85
  else
99
86
  "%a %e. %b %Y"
100
87
  end
101
- from = start.strftime(format << " %R")
88
+ from = first.strftime(format << " %R")
89
+ end
102
90
 
91
+ def to_as_string(start_date, end_date, today)
103
92
  format = if end_date == start_date
104
93
  "%R"
105
94
  elsif end_date == today
@@ -112,11 +101,10 @@ module Achoo
112
101
  else
113
102
  "%a %e. %b %Y %R"
114
103
  end
115
- to = self.end.strftime(format)
116
-
117
- sprintf "%s - %s", from, to
104
+ to = last.strftime(format)
118
105
  end
119
106
 
120
107
  end
121
108
  end
122
109
  end
110
+
data/lib/achoo/term.rb CHANGED
@@ -8,13 +8,17 @@ module Achoo
8
8
  autoload :Menu, 'achoo/term/menu'
9
9
  autoload :Table, 'achoo/term/table'
10
10
 
11
- def self.bold(text); "\e[1m#{text}\e[0m"; end
12
-
13
- def self.underline(text); "\e[4m#{text}\e[0m"; end
11
+ BOLD = 1
12
+ UNDERLINE = 4
13
+ RED = 31
14
+ YELLOW = 33
14
15
 
15
- def self.warn(text); "\e[1;33m#{text}\e[0m"; end
16
+ def self.effect(code, text); "\e[#{code}m#{text}\e[0m"; end
16
17
 
17
- def self.fatal(text); "\e[1;31m#{text}\e[0m"; end
18
+ def self.bold(text); effect(BOLD, text); end
19
+ def self.underline(text); effect(UNDERLINE, text); end
20
+ def self.warn(text); effect(YELLOW, text); end
21
+ def self.fatal(text); effect(RED, text); end
18
22
 
19
23
  def self.password
20
24
  `stty -echo`
@@ -47,27 +47,9 @@ module Achoo
47
47
 
48
48
 
49
49
  def phase_chooser(form)
50
- phases = form.phases_for_selected_project
51
- puts "Phases"
52
- answer = Term.choose('Phase', phases.collect {|p| p[1] })
53
- phases[answer.to_i-1][0]
54
- end
55
-
56
-
57
- def workperiod_chooser(form)
58
- periods = form.worktime_periods
59
- puts "Worktime periods"
60
- answer = Term.choose('Period [1]', periods.collect {|p| p[1] }, nil, [''])
61
- answer = '1' if answer.empty?
62
- periods[answer.to_i-1][0]
63
- end
64
-
65
- def billing_chooser(form)
66
- options = form.billing_options
67
- puts "Billing options"
68
- answer = Term.choose('Billing [1]', options.collect {|p| p[1] }, nil, [''])
69
- answer = '1' if answer.empty?
70
- options[answer.to_i-1][0]
50
+ chooser_helper(form.phases_for_selected_project,
51
+ "Phases",
52
+ 'Phase')
71
53
  end
72
54
 
73
55
 
@@ -87,6 +69,19 @@ module Achoo
87
69
  return answer == '' ? '7.5' : answer
88
70
  end
89
71
 
72
+ def workperiod_chooser(form)
73
+ chooser_helper(form.worktime_periods,
74
+ "Worktime periods",
75
+ 'Period [1]',
76
+ true)
77
+ end
78
+
79
+ def billing_chooser(form)
80
+ chooser_helper(form.billing_options,
81
+ "Billing options",
82
+ 'Billing [1]',
83
+ true)
84
+ end
90
85
 
91
86
  def print_remark_help(date)
92
87
  puts "VCS logs for #{date}:"
@@ -128,12 +123,21 @@ module Achoo
128
123
  end
129
124
 
130
125
 
126
+
131
127
  def all_projects_chooser(form)
132
- projects = form.all_projects
133
- answer = Term.choose('Project', projects.collect { |p| p[1] })
134
- projects[answer.to_i-1][0]
128
+ chooser_helper(form.all_projects,
129
+ 'All projects',
130
+ 'Project')
135
131
  end
136
-
132
+
133
+ def chooser_helper(options, heading, prompt, empty_allowed=false)
134
+ puts heading
135
+ extra = empty_allowed ? [''] : []
136
+ answer = Achoo::Term.choose(prompt, options.collect {|p| p[1] }, nil, [''])
137
+ answer = '1' if answer.empty?
138
+ options[answer.to_i-1][0]
139
+ end
140
+
137
141
  end
138
142
  end
139
143
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: achoo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Kjell-Magne \xC3\x98ierud"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-04-20 00:00:00 +02:00
12
+ date: 2010-05-11 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -58,12 +58,12 @@ files:
58
58
  - lib/achoo/ui/optionally_ranged_date_chooser.rb
59
59
  - lib/achoo/ui/date_choosers.rb
60
60
  - lib/achoo/ui/register_hours.rb
61
- - lib/achoo/achievo/form.rb
62
61
  - lib/achoo/achievo/lock_month_form.rb
63
62
  - lib/achoo/achievo/login_form.rb
64
63
  - lib/achoo/achievo/hour_registration_form.rb
65
64
  - lib/achoo/achievo/hour_administration_form.rb
66
65
  - lib/achoo/achievo/hour_registration_form_ranged.rb
66
+ - lib/achoo/achievo/date_field.rb
67
67
  - lib/achoo/achievo/table.rb
68
68
  - lib/achoo/system.rb
69
69
  - lib/achoo/system/log_entry.rb
@@ -1,22 +0,0 @@
1
- require 'achoo/achievo'
2
-
3
- module Achoo
4
- module Achievo
5
- class Form
6
-
7
- def date=(date)
8
- # Day and month must be prefixed with '0' if single
9
- # digit. Date.day and Date.month doesn't do this. Use strftime
10
- day_field.value = date.strftime('%d')
11
- month_field.value = date.strftime('%m')
12
- year_field.value = date.year
13
- end
14
-
15
- def date
16
- Date.new(year_field.value.to_i, month_field.value.to_i,
17
- day_field.value.to_i)
18
- end
19
-
20
- end
21
- end
22
- end