devlog 0.3.3 → 0.4.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 +4 -4
- data/.github/workflows/devlog_test.yml +30 -0
- data/.ruby-version +1 -3
- data/CHANGELOG.md +7 -0
- data/Gemfile +9 -6
- data/LICENSE.txt +21 -0
- data/README.md +21 -6
- data/Rakefile +8 -54
- data/bin/console +11 -0
- data/bin/setup +8 -0
- data/devlog.gemspec +50 -49
- data/devlog.markdown +16 -1
- data/{bin → exe}/devlog +4 -0
- data/lib/devlog/date_time_ago_in_words.rb +34 -0
- data/lib/{devlog_settings.rb → devlog/settings.rb} +11 -1
- data/lib/devlog/utils.rb +18 -0
- data/lib/devlog/version.rb +5 -0
- data/lib/devlog.rb +118 -90
- data/test/devlog_settings_test.rb +2 -0
- data/test/devlog_test.rb +50 -18
- data/test/test_devlogs/.devlog.yml +2 -1
- data/test/test_devlogs/test_invalid_date_devlog.markdown +1 -1
- data/test/test_devlogs/test_settings.yml +1 -1
- data/test/test_helper.rb +46 -48
- metadata +44 -47
- data/.travis.yml +0 -8
- data/LICENSE +0 -3
- data/VERSION +0 -1
data/lib/devlog.rb
CHANGED
@@ -1,26 +1,17 @@
|
|
1
|
-
#require "time"
|
2
|
-
#require "date"
|
3
1
|
require "active_support/all"
|
4
|
-
require_relative "
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
def yellow; colorize(self, "\e[1m\e[33m"); end
|
12
|
-
def blue; colorize(self, "\e[1m\e[34m"); end
|
13
|
-
def dark_blue; colorize(self, "\e[34m"); end
|
14
|
-
def pur; colorize(self, "\e[1m\e[35m"); end
|
15
|
-
def colorize(text, color_code) "#{color_code}#{text}\e[0m" end
|
16
|
-
end
|
2
|
+
require_relative "devlog/date_time_ago_in_words"
|
3
|
+
require_relative "devlog/version"
|
4
|
+
require_relative "devlog/utils"
|
5
|
+
require_relative "devlog/settings"
|
6
|
+
|
7
|
+
# DEPRECATION WARNING: to_time will always preserve the timezone offset of the receiver in Rails 8.0. To opt in to the new behavior, set `ActiveSupport.to_time_preserves_timezone = true`
|
8
|
+
ActiveSupport.to_time_preserves_timezone = true
|
17
9
|
|
18
10
|
# The devlog module with all the mumbo
|
19
11
|
module Devlog
|
20
12
|
# :stopdoc:
|
21
13
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
22
14
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
23
|
-
VERSION = File.open(File.join(File.dirname(__FILE__), %w[.. VERSION]), 'r').read
|
24
15
|
|
25
16
|
# :startdoc:
|
26
17
|
# Returns the version string for the library.
|
@@ -69,10 +60,21 @@ module Devlog
|
|
69
60
|
end
|
70
61
|
|
71
62
|
# Parsing datetime
|
63
|
+
def time_with_zone
|
64
|
+
if !Time.zone
|
65
|
+
tz = devlog_timezone_setting
|
66
|
+
puts "Setting timezone to: #{tz}"
|
67
|
+
Time.zone = tz
|
68
|
+
end
|
69
|
+
Time.zone
|
70
|
+
end
|
71
|
+
|
72
72
|
DATETIME_FORMAT = '%d.%m.%Y %H:%M:%S'.freeze
|
73
73
|
def parse_datetime(line)
|
74
74
|
parts = line[1..-1].split
|
75
|
-
|
75
|
+
result = time_with_zone.strptime("#{parts[0]} #{parts[1]}", DATETIME_FORMAT)
|
76
|
+
# puts "parse_datetime: #{line} => #{result}\n"
|
77
|
+
result
|
76
78
|
rescue StandardError
|
77
79
|
abort "\nError\nCan not parse line with invalid date:\n\n#{line}".to_s.blue
|
78
80
|
end
|
@@ -114,9 +116,13 @@ module Devlog
|
|
114
116
|
timeBegin_line_number = line_number
|
115
117
|
|
116
118
|
# cs_time += (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
|
117
|
-
delta = (timeEnd - timeBegin)
|
119
|
+
delta = (timeEnd - timeBegin) #.to_f * 24 #hours *60 #minutes *60 #seconds
|
118
120
|
t.coding_session_time += delta
|
119
121
|
|
122
|
+
#puts "timeBegin: #{timeBegin.class} #{timeEnd.to_i - timeBegin.to_i}"
|
123
|
+
#puts "timeEnd: #{timeEnd}"
|
124
|
+
#puts "delta: #{delta}"
|
125
|
+
|
120
126
|
# zezzion
|
121
127
|
temp_zezzion.coding_session_time += delta
|
122
128
|
temp_zezzion.zzbegin = timeBegin
|
@@ -141,7 +147,7 @@ module Devlog
|
|
141
147
|
timeBegin = parse_datetime(line)
|
142
148
|
timeBegin_line_number = line_number
|
143
149
|
|
144
|
-
delta = (timeEnd - timeBegin)
|
150
|
+
delta = (timeEnd - timeBegin) #.to_f * 24
|
145
151
|
t.com_session_time += delta
|
146
152
|
|
147
153
|
# zezzion
|
@@ -163,7 +169,7 @@ module Devlog
|
|
163
169
|
puts "error adding temp_zezzion com_session_time at line: #{line}"
|
164
170
|
end
|
165
171
|
elsif line =~ /\A\+[0-9]+[m]/
|
166
|
-
delta = (line.to_f
|
172
|
+
delta = (line.to_f * 60)
|
167
173
|
t.com_session_time += delta
|
168
174
|
|
169
175
|
# zezzion
|
@@ -173,7 +179,7 @@ module Devlog
|
|
173
179
|
puts "error adding temp_zezzion com_session_time at line: #{line}"
|
174
180
|
end
|
175
181
|
elsif line =~ /\A\-[0-9]+[h]/
|
176
|
-
delta = (line.to_f)
|
182
|
+
delta = (line.to_f * 60 * 60)
|
177
183
|
t.payed_time += delta
|
178
184
|
|
179
185
|
# zezzion
|
@@ -192,7 +198,7 @@ module Devlog
|
|
192
198
|
|
193
199
|
# Helper for the time entries
|
194
200
|
def devlog_session_entry(session_type = 'Coding', begin_end = 'BEGIN')
|
195
|
-
"\n##{
|
201
|
+
"\n##{time_with_zone.now.strftime(DATETIME_FORMAT)} #{session_type}Session::#{begin_end}\n"
|
196
202
|
end
|
197
203
|
|
198
204
|
# Prepend a string to a text file
|
@@ -296,7 +302,7 @@ module Devlog
|
|
296
302
|
|
297
303
|
def weekly_pdf(tajm, weeks_from_now = 0, devlog_file = 'devlog.markdown')
|
298
304
|
require 'erb'
|
299
|
-
devlog_file = settings.
|
305
|
+
devlog_file = settings.devlog_file_setting || devlog_file
|
300
306
|
template = settings.has?(:weekly_timesheet_template) ? settings.weekly_timesheet_template : File.join(Devlog.path, 'templates', 'weekly_timesheet.erb.html')
|
301
307
|
convert_command = settings.has?(:convert_to_pdf_command) ? settings.convert_to_pdf_command : 'wkhtmltopdf'
|
302
308
|
puts "Using weekly template: #{template} #{settings.has?(:weekly_timesheet_template)}".green
|
@@ -321,7 +327,7 @@ module Devlog
|
|
321
327
|
|
322
328
|
module SevendaysTotal
|
323
329
|
def total_hours
|
324
|
-
all.inject(0) { |time, zezzion| time + zezzion.session_time }.round(2)
|
330
|
+
((all.inject(0) { |time, zezzion| time + zezzion.session_time }) / 60 / 60).round(2)
|
325
331
|
end
|
326
332
|
|
327
333
|
def total_hours_string
|
@@ -329,7 +335,7 @@ module Devlog
|
|
329
335
|
|
330
336
|
return "" if total <= 0
|
331
337
|
|
332
|
-
"#{total}h"
|
338
|
+
"#{total} [h]"
|
333
339
|
end
|
334
340
|
end
|
335
341
|
|
@@ -400,13 +406,15 @@ module Devlog
|
|
400
406
|
all.first.zzbegin.strftime("%Y/%m/%d")
|
401
407
|
end
|
402
408
|
|
409
|
+
def ends_at
|
410
|
+
all.last.zzend.strftime("%Y/%m/%d")
|
411
|
+
end
|
412
|
+
|
403
413
|
def date
|
404
414
|
DateTime.current.strftime("%Y/%m/%d")
|
405
415
|
end
|
406
416
|
|
407
417
|
DAYS.each do |day|
|
408
|
-
attr_accessor day
|
409
|
-
|
410
418
|
define_method(day) do
|
411
419
|
value = Day.new(day, all.select { |zezzion| zezzion.zzbegin.send("#{day.to_s}?") } )
|
412
420
|
instance_variable_set("@__#{day.to_s}", value) unless instance_variable_get("@__#{day.to_s}")&.any?
|
@@ -452,14 +460,13 @@ module Devlog
|
|
452
460
|
@zezzions.first.zzend
|
453
461
|
end
|
454
462
|
|
455
|
-
#
|
456
|
-
# in seconds
|
457
|
-
# def devlog_time
|
458
|
-
# (self.devlog_end.to_time - self.devlog_begin.to_time)/60.0/60.0
|
459
|
-
# end
|
460
|
-
|
463
|
+
# total session time
|
461
464
|
def session_time
|
462
|
-
@zezzions.inject(0) { |time, zezzion| time + zezzion.session_time }
|
465
|
+
@zezzions.inject(0) { |time, zezzion| time + zezzion.session_time }
|
466
|
+
end
|
467
|
+
|
468
|
+
def session_time_h
|
469
|
+
session_time.rounded_hours
|
463
470
|
end
|
464
471
|
|
465
472
|
# how many days devlog spans
|
@@ -477,35 +484,55 @@ module Devlog
|
|
477
484
|
count_time( :months => 1)
|
478
485
|
end
|
479
486
|
|
480
|
-
#
|
487
|
+
# seconds per day
|
481
488
|
def per_day
|
482
|
-
|
489
|
+
self.session_time/self.devlog_days
|
490
|
+
end
|
491
|
+
|
492
|
+
def per_day_h
|
493
|
+
per_day.rounded_hours
|
483
494
|
end
|
484
495
|
|
485
496
|
def per_week
|
486
|
-
|
497
|
+
self.session_time/self.devlog_weeks
|
498
|
+
end
|
499
|
+
|
500
|
+
def per_week_h
|
501
|
+
per_week.rounded_hours
|
487
502
|
end
|
488
503
|
|
489
504
|
def per_month
|
490
|
-
|
505
|
+
self.session_time/self.devlog_months
|
506
|
+
end
|
507
|
+
|
508
|
+
def per_month_h
|
509
|
+
per_month.rounded_hours
|
491
510
|
end
|
492
511
|
|
493
512
|
# total charge time in hours, coding plus communication sessions
|
494
513
|
def charge_time
|
495
|
-
|
514
|
+
coding_session_time + com_session_time
|
515
|
+
end
|
516
|
+
|
517
|
+
def charge_time_h
|
518
|
+
charge_time.rounded_hours
|
496
519
|
end
|
497
520
|
|
498
521
|
# total charge time in hours, coding plus communication sessions - payed hours
|
499
522
|
def unpayed_time
|
500
|
-
|
523
|
+
coding_session_time + com_session_time + payed_time
|
524
|
+
end
|
525
|
+
|
526
|
+
def unpayed_time_h
|
527
|
+
unpayed_time.rounded_hours
|
501
528
|
end
|
502
529
|
|
503
530
|
# return hours worked for the last X days, from current_time
|
504
531
|
def hours_for_last(days, current_time = DateTime.now)
|
505
532
|
endTime = current_time.to_time - days.days
|
506
533
|
selected_zezzions = @zezzions.select { |z| z.zzbegin.to_time < current_time && z.zzend >= endTime }
|
507
|
-
|
508
|
-
selected_zezzions.inject(0) { |time, z| time + z.session_time }.
|
534
|
+
|
535
|
+
selected_zezzions.inject(0) { |time, z| time + z.session_time }.to_f.rounded_hours
|
509
536
|
end
|
510
537
|
|
511
538
|
# from time to time select some zezzions
|
@@ -563,11 +590,27 @@ module Devlog
|
|
563
590
|
@zezzions.last # devlog_end
|
564
591
|
end
|
565
592
|
|
593
|
+
def last_payed_session
|
594
|
+
@zezzions.select{|zezzion| zezzion.payed_time<0}.first
|
595
|
+
end
|
596
|
+
|
566
597
|
# return all sessions
|
567
598
|
def devlog_sessions
|
568
599
|
@zezzions
|
569
600
|
end
|
570
601
|
|
602
|
+
def coding_session_time_h
|
603
|
+
coding_session_time.rounded_hours
|
604
|
+
end
|
605
|
+
|
606
|
+
def com_session_time_h
|
607
|
+
com_session_time.rounded_hours
|
608
|
+
end
|
609
|
+
|
610
|
+
def payed_time_h
|
611
|
+
payed_time.rounded_hours
|
612
|
+
end
|
613
|
+
|
571
614
|
def validation_string
|
572
615
|
vs = ''
|
573
616
|
vs << (@zezzions.any? ? '' : "No sessions recorded, add some first...\n".red)
|
@@ -576,17 +619,17 @@ module Devlog
|
|
576
619
|
|
577
620
|
def to_info_string(short=false)
|
578
621
|
s = ''
|
579
|
-
s << "\nSession::Time: = #{
|
580
|
-
s << ("\nCodingSession::Time = %.1f [h]\n" %
|
581
|
-
s << ("\nComSession::Time = %.1f [h]\n" %
|
582
|
-
s << ("\nCharge::Time = #{
|
583
|
-
s << ("\nUnpayed::Time = #{
|
622
|
+
s << "\nSession::Time: = #{session_time_h} [h]\n"
|
623
|
+
s << ("\nCodingSession::Time = %.1f [h]\n" % coding_session_time_h)
|
624
|
+
s << ("\nComSession::Time = %.1f [h]\n" % com_session_time_h)
|
625
|
+
s << ("\nCharge::Time = #{charge_time_h} [h]\n")
|
626
|
+
s << ("\nUnpayed::Time = #{unpayed_time_h} [h]\n")
|
584
627
|
s << ("\n")
|
585
628
|
unless short
|
586
629
|
s << ("Num of Sessions = #{self.devlog_sessions.size}\n")
|
587
|
-
s << ("Hours per Day = #{self.
|
588
|
-
s << ("Hours per Week = #{self.
|
589
|
-
s << ("Hours per Month = #{self.
|
630
|
+
s << ("Hours per Day = #{self.per_day_h} [h]\n")
|
631
|
+
s << ("Hours per Week = #{self.per_week_h} [h]\n")
|
632
|
+
s << ("Hours per Month = #{self.per_month_h} [h]\n")
|
590
633
|
s << ("Hours last 7 days = #{self.hours_for_last(7)} [h]\n")
|
591
634
|
s << ("Hours last 14 days = #{self.hours_for_last(14)} [h]\n")
|
592
635
|
s << ("Hours last 28 days = #{self.hours_for_last(28)} [h]\n")
|
@@ -605,8 +648,8 @@ module Devlog
|
|
605
648
|
end
|
606
649
|
s << ("\n")
|
607
650
|
s << ("Longest Session = #{self.longest_session.to_s}\n")
|
608
|
-
s << ("Shortest Session = #{self.shortest_session.
|
609
|
-
s << ("Last Session = #{self.devlog_end.ago_in_words}, duration: #{self.last_session.
|
651
|
+
s << ("Shortest Session = #{self.shortest_session.to_s_in_seconds}\n")
|
652
|
+
s << ("Last Session = #{self.devlog_end.ago_in_words}, duration: #{self.last_session.in_hours} [h]")
|
610
653
|
s << ("\n")
|
611
654
|
s << ("Weekly Sessions\n")
|
612
655
|
s << ("\n")
|
@@ -620,13 +663,23 @@ module Devlog
|
|
620
663
|
sevendays_total += current_day_total_hours
|
621
664
|
s << ("#{dayname.upcase}\n")
|
622
665
|
s << ("begins at: #{current_day.begins_at}\n")
|
623
|
-
s << ("breaks: #{current_day.breaks_at}\n")
|
624
|
-
s << ("
|
625
|
-
s << ("sum: #{current_day_total_hours}\n")
|
666
|
+
s << ("breaks at: #{current_day.breaks_at}\n")
|
667
|
+
s << ("ends at: #{current_day.ends_at}\n")
|
668
|
+
s << ("sum: #{current_day_total_hours} [h]\n")
|
626
669
|
s << ("\n")
|
627
670
|
end
|
628
671
|
end
|
629
|
-
|
672
|
+
|
673
|
+
0.upto(5) do |week|
|
674
|
+
weekly_zezzions = zezzions_for_week(week, DateTime.current)
|
675
|
+
if weekly_zezzions.any?
|
676
|
+
sevendays = Sevendays.new(weekly_zezzions)
|
677
|
+
s << ("#{sevendays.begins_at}->#{sevendays.ends_at}: #{sevendays.total_hours_string}\n")
|
678
|
+
else
|
679
|
+
s << "No weekly sessions for week #{week}.\n"
|
680
|
+
end
|
681
|
+
end
|
682
|
+
s << "Last payed: #{last_payed_session.zzend.to_s}" if last_payed_session
|
630
683
|
end
|
631
684
|
s
|
632
685
|
end
|
@@ -711,7 +764,15 @@ module Devlog
|
|
711
764
|
end
|
712
765
|
|
713
766
|
def to_s
|
714
|
-
"#{session_time.round(3)} [h] #{type}, begin on line #{@zzbegin_line_number} at #{@zzbegin}, ends on line #{@zzend_line_number} at #{@zzend}"
|
767
|
+
"#{(session_time / 60 / 60).round(3)} [h] #{type}, begin on line #{@zzbegin_line_number} at #{@zzbegin}, ends on line #{@zzend_line_number} at #{@zzend}"
|
768
|
+
end
|
769
|
+
|
770
|
+
def to_s_in_seconds
|
771
|
+
"#{session_time.round(3)} [s] #{type}, begin on line #{@zzbegin_line_number} at #{@zzbegin}, ends on line #{@zzend_line_number} at #{@zzend}"
|
772
|
+
end
|
773
|
+
|
774
|
+
def in_hours
|
775
|
+
(session_time / 60 / 60).round(3)
|
715
776
|
end
|
716
777
|
end
|
717
778
|
|
@@ -725,36 +786,3 @@ module Devlog
|
|
725
786
|
end
|
726
787
|
end
|
727
788
|
end
|
728
|
-
|
729
|
-
module DateTimeAgoInWords
|
730
|
-
def ago_in_words
|
731
|
-
return 'a very very long time ago' if self.year < 1800
|
732
|
-
secs = Time.now - self
|
733
|
-
return 'just over' if secs > -1 && secs < 1
|
734
|
-
return 'now' if secs <= -1
|
735
|
-
pair = ago_in_words_pair(secs)
|
736
|
-
ary = ago_in_words_singularize(pair)
|
737
|
-
ary.size == 0 ? '' : ary.join(' and ') << ' ago'
|
738
|
-
end
|
739
|
-
private
|
740
|
-
def ago_in_words_pair(secs)
|
741
|
-
[[60, :seconds], [60, :minutes], [24, :hours], [100_000, :days]].map{ |count, name|
|
742
|
-
if secs > 0
|
743
|
-
secs, n = secs.divmod(count)
|
744
|
-
"#{n.to_i} #{name}"
|
745
|
-
end
|
746
|
-
}.compact.reverse[0..1]
|
747
|
-
end
|
748
|
-
def ago_in_words_singularize(pair)
|
749
|
-
if pair.size == 1
|
750
|
-
pair.map! {|part| part[0, 2].to_i == 1 ? part.chomp('s') : part }
|
751
|
-
else
|
752
|
-
pair.map! {|part| part[0, 2].to_i == 1 ? part.chomp('s') : part[0, 2].to_i == 0 ? nil : part }
|
753
|
-
end
|
754
|
-
pair.compact
|
755
|
-
end
|
756
|
-
end
|
757
|
-
|
758
|
-
class DateTime
|
759
|
-
include DateTimeAgoInWords
|
760
|
-
end
|
@@ -26,6 +26,8 @@ class DevlogSettingsTest < Test::Unit::TestCase
|
|
26
26
|
def test_loading_from_yaml
|
27
27
|
assert(settings.devlog_file == 'development_log.markdown',
|
28
28
|
'example setting should be loaded')
|
29
|
+
assert(settings.timezone == 'Amsterdam',
|
30
|
+
'example setting should be loaded')
|
29
31
|
end
|
30
32
|
|
31
33
|
def test_devlog_file_setting_returns_default_when_overriden_devlog_file_does_not_exist
|
data/test/devlog_test.rb
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DevlogTest < Test::Unit::TestCase
|
4
|
+
def test_version
|
5
|
+
assert ::Devlog.const_defined?(:VERSION)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_devlog_session_entry
|
9
|
+
dse = devlog_session_entry
|
10
|
+
tajmstring = "\n##{Time.zone.now.strftime(DATETIME_FORMAT)} CodingSession::BEGIN\n"
|
11
|
+
|
12
|
+
assert_equal tajmstring, dse
|
13
|
+
end
|
14
|
+
|
4
15
|
def test_empty_devlog
|
5
16
|
@tajm = parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'empty_devlog.markdown'))
|
6
17
|
puts "#{@tajm.coding_session_time} #{@tajm.com_session_time} #{@tajm.payed_time}"
|
@@ -13,25 +24,34 @@ class DevlogTest < Test::Unit::TestCase
|
|
13
24
|
load_devlog
|
14
25
|
load_devlog_now
|
15
26
|
|
16
|
-
assert(@tajm.coding_session_time==@tajm_now.coding_session_time, "not equal coding times")
|
27
|
+
assert(@tajm.coding_session_time==@tajm_now.coding_session_time, "not equal coding times #{@tajm.coding_session_time} #{@tajm_now.coding_session_time}")
|
17
28
|
assert(@tajm.com_session_time==@tajm_now.com_session_time, "selftalk not repeated")
|
18
29
|
assert(@tajm.payed_time==@tajm_now.payed_time, "selfpay not equal")
|
19
30
|
|
20
31
|
assert(@tajm_now.zezzions.size>0, "where are the seeds of zezzions?")
|
21
|
-
assert(@tajm_now.unpayed_time<0, "let's make sure opensource is free to develop it self")
|
32
|
+
assert(@tajm_now.unpayed_time<0, "let's make sure opensource is free to develop it self #{@tajm_now.unpayed_time} should be less than zero")
|
22
33
|
assert(@tajm_now.zezzions.size>4, "at least 4 recorded sessions must there be?")
|
23
|
-
assert(@tajm_now.devlog_begin.to_s=="2014-01-
|
24
|
-
assert(@tajm_now.devlog_begin.to_time.to_i ==
|
34
|
+
assert(@tajm_now.devlog_begin.to_s=="2014-01-19 10:16:08 +0100", "a historycal moment in the akashic records was deleted, what?")
|
35
|
+
assert(@tajm_now.devlog_begin.to_time.to_i == 1390122968, "or just a random number in a random dream...")
|
25
36
|
end
|
26
37
|
|
27
38
|
def test_devlog_test
|
28
39
|
load_devlog_test
|
29
40
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
41
|
+
assert_equal 16200.0, @tajm_test.coding_session_time, "wrong coding session time in seconds"
|
42
|
+
assert_equal 4.5, @tajm_test.coding_session_time_h , "wrong coding session time in hours"
|
43
|
+
|
44
|
+
assert_equal 3600.0, @tajm_test.com_session_time, "wrong com session time in seconds"
|
45
|
+
assert_equal 1.0, @tajm_test.com_session_time_h, "wrong com session time in hours"
|
46
|
+
|
47
|
+
assert_equal (-3600.0), @tajm_test.payed_time, "wrong payed time in seconds"
|
48
|
+
assert_equal (-1.0), @tajm_test.payed_time_h, "wrong payed time in hours"
|
49
|
+
|
50
|
+
assert_equal 16200.0, @tajm_test.unpayed_time, "wrong unpayed time in seconds"
|
51
|
+
assert_equal 4.5, @tajm_test.unpayed_time_h, "wrong unpayed time in hours"
|
52
|
+
|
53
|
+
assert_equal 19800.0, @tajm_test.charge_time, "wrong charge time in seconds"
|
54
|
+
assert_equal 5.5, @tajm_test.charge_time_h, "wrong charge time in hours"
|
35
55
|
end
|
36
56
|
|
37
57
|
def test_devlog_invalid_date
|
@@ -57,14 +77,17 @@ class DevlogTest < Test::Unit::TestCase
|
|
57
77
|
|
58
78
|
def test_how_much_per_day
|
59
79
|
load_devlog_stat
|
80
|
+
|
60
81
|
assert(@tajm_stat.per_day>0, "the middle day value, not the mean")
|
61
|
-
|
82
|
+
assert_equal 3600.0, @tajm_stat.per_day, "per day should be 3600.0 but is #{@tajm_stat.per_day}"
|
83
|
+
assert_equal 1.0, @tajm_stat.per_day_h, "per day in hours should be 1.0 but is #{@tajm_stat.per_day_h}"
|
62
84
|
end
|
63
85
|
|
64
86
|
def test_how_much_per_week
|
65
87
|
load_devlog_stat
|
66
88
|
assert(@tajm_stat.per_week>0, "the middle week value, not the mean")
|
67
|
-
|
89
|
+
assert_equal 7.02, @tajm_stat.per_week_h, "per week in hours should be 7.02 but is #{@tajm_stat.per_week_h}"
|
90
|
+
assert(@tajm_stat.per_week>=25263.15, "per week in seconds should be 25263.16 but is #{@tajm_stat.per_week}")
|
68
91
|
end
|
69
92
|
|
70
93
|
def test_devlog_weeks
|
@@ -74,7 +97,9 @@ class DevlogTest < Test::Unit::TestCase
|
|
74
97
|
|
75
98
|
def test_how_much_per_month
|
76
99
|
load_devlog_stat
|
77
|
-
assert(@tajm_stat.
|
100
|
+
assert(@tajm_stat.per_month>0, "the middle month value, not the mean")
|
101
|
+
assert_equal 8.0, @tajm_stat.per_month_h, "per month in hours should be 8.0 but is #{@tajm_stat.per_month_h}"
|
102
|
+
assert_equal 28800.0, @tajm_stat.per_month, "per month in seconds should be 28800.0 but is #{@tajm_stat.per_month}"
|
78
103
|
end
|
79
104
|
|
80
105
|
def test_devlog_days_0
|
@@ -84,22 +109,24 @@ class DevlogTest < Test::Unit::TestCase
|
|
84
109
|
|
85
110
|
def test_devlog_days_1
|
86
111
|
load_devlog_stat
|
87
|
-
|
112
|
+
assert_equal 8, @tajm_stat.devlog_days, "should be 8 devlog days"
|
88
113
|
end
|
89
114
|
|
90
115
|
def test_devlog_days_2
|
91
116
|
load_devlog_single
|
92
|
-
|
117
|
+
assert_equal 1, @tajm_single.devlog_days, "should be 1 devlog day"
|
93
118
|
end
|
94
119
|
|
95
120
|
def test_devlog_begin
|
96
121
|
load_devlog_stat
|
97
|
-
|
122
|
+
|
123
|
+
assert_equal "2014-03-01 10:00:00 +0100", @tajm_stat.devlog_begin.to_s, "devlog begin is wrong"
|
98
124
|
end
|
99
125
|
|
100
126
|
def test_devlog_end
|
101
127
|
load_devlog_stat
|
102
|
-
|
128
|
+
|
129
|
+
assert_equal "2014-03-08 11:00:00 +0100", @tajm_stat.devlog_end.to_s, "devlog end is wrong"
|
103
130
|
end
|
104
131
|
|
105
132
|
def test_hours_for_last0
|
@@ -107,11 +134,13 @@ class DevlogTest < Test::Unit::TestCase
|
|
107
134
|
hours = @tajm_stat.hours_for_last(0, parse_datetime("#09.03.2014 11:00:00"))
|
108
135
|
assert(hours==0, "should be 0, but is #{hours}")
|
109
136
|
end
|
137
|
+
|
110
138
|
def test_hours_for_last7
|
111
139
|
load_devlog_stat
|
112
140
|
hours = @tajm_stat.hours_for_last(7, parse_datetime("#09.03.2014 11:00:00"))
|
113
141
|
assert(hours==7, "should be 7, but is #{hours}")
|
114
142
|
end
|
143
|
+
|
115
144
|
def test_hours_for_last1
|
116
145
|
load_devlog_stat
|
117
146
|
hours = @tajm_stat.hours_for_last(1, parse_datetime("#09.03.2014 11:00:00"))
|
@@ -125,9 +154,12 @@ class DevlogTest < Test::Unit::TestCase
|
|
125
154
|
|
126
155
|
def test_negative_sessions
|
127
156
|
load_devlog_negative
|
157
|
+
|
128
158
|
assert(@tajm_negative.devlog_sessions.size==5, "should be 5, but is #{@tajm_negative.devlog_sessions.size}")
|
159
|
+
|
129
160
|
shortest_session_time_rounded = @tajm_negative.shortest_session.session_time.round(2)
|
130
|
-
|
161
|
+
|
162
|
+
assert_equal (-7200.0), shortest_session_time_rounded, "should be -7200.0, but is #{shortest_session_time_rounded}"
|
131
163
|
assert(@tajm_negative.negative_sessions.size==2, "should be 2, but is #{@tajm_negative.negative_sessions.size}")
|
132
164
|
end
|
133
165
|
|
@@ -171,7 +203,7 @@ class DevlogTest < Test::Unit::TestCase
|
|
171
203
|
stop_coding_session(@empty_devlog)
|
172
204
|
assert(File.readlines(@empty_devlog).grep(/CodingSession::END/).size>0, "should insert CodingSession::END at top of file")
|
173
205
|
assert(is_session_open(@empty_devlog)==false, "should be false, session should be closed after stopping")
|
174
|
-
assert(File.
|
206
|
+
assert(File.exist?(@devlog_info)==true, "should exist")
|
175
207
|
hasinfo = parse_devlog_now(@empty_devlog).has_info?
|
176
208
|
assert(hasinfo==true, 'should have info')
|
177
209
|
assert(File.readlines(@devlog_info).grep(/Session::Time/).size>0, "should have info about Session::Time")
|
@@ -1 +1,2 @@
|
|
1
|
-
devlog_file: "test/test_devlogs/test_devlog.markdown"
|
1
|
+
devlog_file: "test/test_devlogs/test_devlog.markdown"
|
2
|
+
timezone: 'Ljubljana'
|
data/test/test_helper.rb
CHANGED
@@ -1,57 +1,55 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
|
4
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
3
|
require 'devlog'
|
7
|
-
|
8
|
-
class Test::Unit::TestCase
|
9
|
-
include Devlog
|
10
|
-
end
|
4
|
+
require 'test/unit'
|
11
5
|
|
12
6
|
TEST_FILES_PATH = 'test_devlogs'.freeze
|
13
7
|
TEMP_PATH = '../tmp'.freeze
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
def load_devlog
|
20
|
-
@tajm = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'devlog.markdown'))
|
21
|
-
puts "#{@tajm.coding_session_time} #{@tajm.com_session_time} #{@tajm.payed_time}"
|
22
|
-
assert(@tajm.coding_session_time>0, "truth")
|
23
|
-
assert(@tajm.com_session_time>0, "love")
|
24
|
-
assert(@tajm.payed_time<0, "simplicity")
|
25
|
-
end
|
26
|
-
|
27
|
-
def load_devlog_now
|
28
|
-
@tajm_now = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'devlog.markdown'))
|
29
|
-
puts "#{@tajm_now.coding_session_time} #{@tajm_now.com_session_time} #{@tajm_now.payed_time}"
|
30
|
-
assert(@tajm_now.coding_session_time>0, "truth")
|
31
|
-
assert(@tajm_now.com_session_time>0, "love")
|
32
|
-
assert(@tajm_now.payed_time<0, "simplicity")
|
33
|
-
end
|
34
|
-
|
35
|
-
def load_devlog_test
|
36
|
-
@tajm_test = parse_test_devlog('test_devlog.markdown')
|
37
|
-
puts "#{@tajm_test.coding_session_time} #{@tajm_test.com_session_time} #{@tajm_test.payed_time}"
|
38
|
-
assert(@tajm_test.coding_session_time>0, "truth")
|
39
|
-
assert(@tajm_test.com_session_time>0, "love")
|
40
|
-
assert(@tajm_test.payed_time<0, "simplicity")
|
41
|
-
end
|
42
|
-
|
43
|
-
def load_devlog_stat
|
44
|
-
@tajm_stat = parse_test_devlog('test_stats_devlog.markdown')
|
45
|
-
end
|
46
|
-
|
47
|
-
def load_devlog_single
|
48
|
-
@tajm_single = parse_test_devlog('test_single_devlog.markdown')
|
49
|
-
end
|
50
|
-
|
51
|
-
def load_devlog_negative
|
52
|
-
@tajm_negative = parse_test_devlog('test_negative_devlog.markdown')
|
53
|
-
end
|
9
|
+
class Test::Unit::TestCase
|
10
|
+
include Devlog
|
54
11
|
|
55
|
-
def
|
56
|
-
|
12
|
+
def parse_test_devlog(filename)
|
13
|
+
parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, filename))
|
14
|
+
end
|
15
|
+
|
16
|
+
def load_devlog
|
17
|
+
@tajm = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'devlog.markdown'))
|
18
|
+
puts "#{@tajm.coding_session_time} #{@tajm.com_session_time} #{@tajm.payed_time}"
|
19
|
+
assert(@tajm.coding_session_time>0, "truth")
|
20
|
+
assert(@tajm.com_session_time>0, "love")
|
21
|
+
assert(@tajm.payed_time<0, "simplicity")
|
22
|
+
end
|
23
|
+
|
24
|
+
def load_devlog_now
|
25
|
+
@tajm_now = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'devlog.markdown'))
|
26
|
+
puts "#{@tajm_now.coding_session_time} #{@tajm_now.com_session_time} #{@tajm_now.payed_time}"
|
27
|
+
assert(@tajm_now.coding_session_time>0, "truth")
|
28
|
+
assert(@tajm_now.com_session_time>0, "love")
|
29
|
+
assert(@tajm_now.payed_time<0, "simplicity")
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_devlog_test
|
33
|
+
@tajm_test = parse_test_devlog('test_devlog.markdown')
|
34
|
+
puts "#{@tajm_test.coding_session_time} #{@tajm_test.com_session_time} #{@tajm_test.payed_time}"
|
35
|
+
assert(@tajm_test.coding_session_time>0, "truth")
|
36
|
+
assert(@tajm_test.com_session_time>0, "love")
|
37
|
+
assert(@tajm_test.payed_time<0, "simplicity")
|
38
|
+
end
|
39
|
+
|
40
|
+
def load_devlog_stat
|
41
|
+
@tajm_stat = parse_test_devlog('test_stats_devlog.markdown')
|
42
|
+
end
|
43
|
+
|
44
|
+
def load_devlog_single
|
45
|
+
@tajm_single = parse_test_devlog('test_single_devlog.markdown')
|
46
|
+
end
|
47
|
+
|
48
|
+
def load_devlog_negative
|
49
|
+
@tajm_negative = parse_test_devlog('test_negative_devlog.markdown')
|
50
|
+
end
|
51
|
+
|
52
|
+
def load_devlog_weekly
|
53
|
+
@tajm_weekly = parse_test_devlog('test_weekly_devlog.markdown')
|
54
|
+
end
|
57
55
|
end
|