devlog 0.0.2 → 0.0.3
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/VERSION +1 -1
- data/bin/devlog +34 -36
- data/devlog.gemspec +5 -5
- data/devlog.markdown +14 -1
- data/lib/devlog.rb +138 -11
- data/test/devlog_test.rb +17 -0
- data/test/test_helper.rb +5 -1
- data/test_negative_devlog.markdown +31 -0
- metadata +4 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c17dd2cce02aef60e7d7bc439502746a2fe7ae91
         | 
| 4 | 
            +
              data.tar.gz: 6c6dc8f2d7ecdb2d891680a39505f623dd712d9f
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 380f4bc48f1de2d19d58d5a9a34c46d0150567deb3f4859c0d84fa106daaa4354ff043664df17e20c8e8c9ba3563ee1461f7df578f23115eb665e000352fa2be
         | 
| 7 | 
            +
              data.tar.gz: 3aa058eefadc8f68692ad7d04f2091b52d9e6fcdecb453fa38fb1094d9964f1689054040f93819c66e29b9564eb6104059fa11c27cc49e51e29003380d92367c
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.0. | 
| 1 | 
            +
            0.0.3
         | 
    
        data/bin/devlog
    CHANGED
    
    | @@ -2,15 +2,18 @@ | |
| 2 2 | 
             
            require 'benchmark'
         | 
| 3 3 | 
             
            require File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib devlog.rb]))
         | 
| 4 4 | 
             
            USAGE= <<-EOF
         | 
| 5 | 
            -
             | 
| 5 | 
            +
            #{Devlog.display_version}
         | 
| 6 | 
            +
            This software is intended to parse and present information within devlog.markdown development logs.
         | 
| 6 7 |  | 
| 7 | 
            -
             | 
| 8 | 
            +
            #{'Use it as You'.green} #{'dodo'.pur}.
         | 
| 8 9 |  | 
| 9 | 
            -
             | 
| 10 | 
            +
            Using with a file:
         | 
| 10 11 |  | 
| 11 | 
            -
               | 
| 12 | 
            +
              #{'devlog'.red} /path/to/devlog.markdown
         | 
| 12 13 |  | 
| 13 | 
            -
             | 
| 14 | 
            +
            or just in a folder with a 'devlog.markdown' file:
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              #{'devlog'.green} 
         | 
| 14 17 |  | 
| 15 18 | 
             
            EOF
         | 
| 16 19 | 
             
            #arguments
         | 
| @@ -18,40 +21,35 @@ $:.unshift File.join(File.dirname(__FILE__)) | |
| 18 21 | 
             
            @in_file = ARGV[0]
         | 
| 19 22 | 
             
            def print_usage
         | 
| 20 23 | 
             
              puts USAGE
         | 
| 21 | 
            -
              exit
         | 
| 22 24 | 
             
            end
         | 
| 23 25 | 
             
            def dodo
         | 
| 24 | 
            -
               | 
| 25 | 
            -
             | 
| 26 | 
            -
                 | 
| 26 | 
            +
              include Devlog
         | 
| 27 | 
            +
              time = Benchmark.realtime do 
         | 
| 28 | 
            +
                if @in_file
         | 
| 29 | 
            +
                  puts "Parsing #{@in_file}...".red
         | 
| 27 30 | 
             
                  t = parse_devlog_now(@in_file)
         | 
| 28 | 
            -
                  puts  | 
| 29 | 
            -
                  puts | 
| 30 | 
            -
             | 
| 31 | 
            -
                  puts | 
| 32 | 
            -
                   | 
| 33 | 
            -
                  puts | 
| 34 | 
            -
                  puts | 
| 35 | 
            -
                  puts("Hours per Day       = #{t.per_day} [h]\n")
         | 
| 36 | 
            -
                  puts("Hours per Week      = #{t.per_week} [h]\n")
         | 
| 37 | 
            -
                  puts("Hours per Month     = #{t.per_month} [h]\n")
         | 
| 38 | 
            -
                  puts("Hours last 7 days   = #{t.hours_for_last(7)} [h]\n")
         | 
| 39 | 
            -
                  puts("Hours last 14 days   = #{t.hours_for_last(14)} [h]\n")
         | 
| 40 | 
            -
                  puts("Hours last 28 days   = #{t.hours_for_last(28)} [h]\n")
         | 
| 41 | 
            -
                  puts("\n")
         | 
| 42 | 
            -
                  puts("Devlog Time         = #{t.devlog_days * 24} [hours]\n")
         | 
| 43 | 
            -
                  puts("Devlog Days         = #{t.devlog_days}  [days]\n")
         | 
| 44 | 
            -
                  puts("Devlog Weeks        = #{t.devlog_weeks}  [weeks]\n")
         | 
| 45 | 
            -
                  puts("Devlog Months       = #{t.devlog_months}  [months]\n")
         | 
| 46 | 
            -
                  puts("\n")
         | 
| 47 | 
            -
                  puts("Longest Session     = #{t.longest_session.session_time.round(2)} [hours]\n")
         | 
| 48 | 
            -
                  puts("Shortest Session     = #{t.shortest_session.session_time.round(2)} [hours]\n")
         | 
| 31 | 
            +
                  puts t.validation_string
         | 
| 32 | 
            +
                  puts t.to_info_string
         | 
| 33 | 
            +
                else
         | 
| 34 | 
            +
                  puts "Parsing devlog.markdown in current folder...".green
         | 
| 35 | 
            +
                  t = parse_devlog_now("devlog.markdown") #try default file
         | 
| 36 | 
            +
                  puts t.validation_string
         | 
| 37 | 
            +
                  puts t.to_info_string
         | 
| 49 38 | 
             
                end
         | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 39 | 
            +
             end
         | 
| 40 | 
            +
             puts "\nRealtime used : #{time}sec\n\n"
         | 
| 52 41 | 
             
            end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
               | 
| 42 | 
            +
             | 
| 43 | 
            +
            begin
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              if ARGV.size > 0
         | 
| 46 | 
            +
                dodo
         | 
| 47 | 
            +
              else
         | 
| 48 | 
            +
                  dodo
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            rescue
         | 
| 52 | 
            +
                print_usage
         | 
| 57 53 | 
             
            end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
            #exit
         | 
    
        data/devlog.gemspec
    CHANGED
    
    | @@ -2,16 +2,14 @@ | |
| 2 2 | 
             
            # DO NOT EDIT THIS FILE DIRECTLY
         | 
| 3 3 | 
             
            # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
         | 
| 4 4 | 
             
            # -*- encoding: utf-8 -*-
         | 
| 5 | 
            -
            # stub: devlog 0.0.2 ruby lib
         | 
| 6 5 |  | 
| 7 6 | 
             
            Gem::Specification.new do |s|
         | 
| 8 7 | 
             
              s.name = "devlog"
         | 
| 9 | 
            -
              s.version = "0.0. | 
| 8 | 
            +
              s.version = "0.0.3"
         | 
| 10 9 |  | 
| 11 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 12 | 
            -
              s.require_paths = ["lib"]
         | 
| 13 11 | 
             
              s.authors = ["mihael"]
         | 
| 14 | 
            -
              s.date = "2014- | 
| 12 | 
            +
              s.date = "2014-08-15"
         | 
| 15 13 | 
             
              s.description = "devlog.markdown time&space extractor"
         | 
| 16 14 | 
             
              s.email = "kitschmaster@gmail.com"
         | 
| 17 15 | 
             
              s.executables = ["devlog"]
         | 
| @@ -47,12 +45,14 @@ Gem::Specification.new do |s| | |
| 47 45 | 
             
                "test/devlog_test.rb",
         | 
| 48 46 | 
             
                "test/test_helper.rb",
         | 
| 49 47 | 
             
                "test_devlog.markdown",
         | 
| 48 | 
            +
                "test_negative_devlog.markdown",
         | 
| 50 49 | 
             
                "test_single_devlog.markdown",
         | 
| 51 50 | 
             
                "test_stats_devlog.markdown"
         | 
| 52 51 | 
             
              ]
         | 
| 53 52 | 
             
              s.homepage = "http://github.com/mihael/devlog"
         | 
| 54 53 | 
             
              s.licenses = ["MIT"]
         | 
| 55 | 
            -
              s. | 
| 54 | 
            +
              s.require_paths = ["lib"]
         | 
| 55 | 
            +
              s.rubygems_version = "2.0.14"
         | 
| 56 56 | 
             
              s.summary = "takes devlog.markdown and gives info"
         | 
| 57 57 |  | 
| 58 58 | 
             
              if s.respond_to? :specification_version then
         | 
    
        data/devlog.markdown
    CHANGED
    
    | @@ -1,10 +1,23 @@ | |
| 1 | 
            +
            #15.08.2014 19:14:21 CodingSession::END
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            adding some nice stuff... can now see negative and zero sessions, which are basically error entries with zero or negative time.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            line numbers are recorded, and printed next to the zero and negative sessions...
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            running 'devlog' in a folder where there is a devlog.markdown file present, it will attempt to parse and present info...
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            improved the output...
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            0.0.3 it is
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            #15.08.2014 16:35:49 CodingSession::BEGIN
         | 
| 14 | 
            +
             | 
| 1 15 | 
             
            #03.02.2014 21:02:30 CodingSession::END
         | 
| 2 16 |  | 
| 3 17 | 
             
            added some tests, and some new calculations, the devlog binary prints out better stats... 0.0.1 it is.
         | 
| 4 18 |  | 
| 5 19 | 
             
            #03.02.2014 09:37:36 CodingSession::BEGIN
         | 
| 6 20 |  | 
| 7 | 
            -
             | 
| 8 21 | 
             
            #02.02.2014 17:06:00 CodingSession::END
         | 
| 9 22 |  | 
| 10 23 | 
             
            experiencing some bad weather, which took down an optical cable and cut our village off the internet grid...
         | 
    
        data/lib/devlog.rb
    CHANGED
    
    | @@ -14,7 +14,7 @@ module Devlog | |
| 14 14 | 
             
              # :stopdoc:
         | 
| 15 15 | 
             
              LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
         | 
| 16 16 | 
             
              PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
         | 
| 17 | 
            -
              VERSION = File.open(File.join(File.dirname(__FILE__), %w[.. VERSION]), 'r') | 
| 17 | 
            +
              VERSION = File.open(File.join(File.dirname(__FILE__), %w[.. VERSION]), 'r').read
         | 
| 18 18 | 
             
              # :startdoc:
         | 
| 19 19 | 
             
              # Returns the version string for the library.
         | 
| 20 20 | 
             
              #
         | 
| @@ -48,13 +48,12 @@ module Devlog | |
| 48 48 | 
             
                Dir.glob(search_me).sort.each {|rb| require rb}
         | 
| 49 49 | 
             
              end
         | 
| 50 50 | 
             
              def self.display_version
         | 
| 51 | 
            -
                "\n#{'Devlog'.green} v#{Devlog.version}\n | 
| 51 | 
            +
                "\n#{'Devlog'.green} v#{Devlog.version}\n"
         | 
| 52 52 | 
             
              end
         | 
| 53 53 | 
             
              # Write siple console log
         | 
| 54 54 | 
             
              def self.log(txt)
         | 
| 55 55 | 
             
                puts "#{txt}"
         | 
| 56 56 | 
             
              end
         | 
| 57 | 
            -
             | 
| 58 57 |  | 
| 59 58 | 
             
              def parse_datetime(line)
         | 
| 60 59 | 
             
                parts = line[1..-1].split
         | 
| @@ -63,28 +62,40 @@ module Devlog | |
| 63 62 |  | 
| 64 63 | 
             
              def parse_devlog_now(devlog=nil)
         | 
| 65 64 | 
             
                t = Parsing.new
         | 
| 65 | 
            +
                t.devlog_file = devlog
         | 
| 66 | 
            +
             | 
| 66 67 | 
             
                return t unless devlog
         | 
| 68 | 
            +
                return t unless File.exist?(devlog)
         | 
| 67 69 |  | 
| 68 70 | 
             
                timeEnd = nil
         | 
| 69 71 | 
             
                timeBegin = nil
         | 
| 72 | 
            +
                timeEnd_line_number = nil
         | 
| 73 | 
            +
                timeBegin_line_number = nil
         | 
| 70 74 | 
             
                in_session = false
         | 
| 71 75 | 
             
                temp_zezzion = nil
         | 
| 72 76 |  | 
| 77 | 
            +
                line_number = 0
         | 
| 73 78 | 
             
                File.open(devlog, "r").each do |line|
         | 
| 79 | 
            +
                  line_number+=1 
         | 
| 80 | 
            +
                  
         | 
| 74 81 | 
             
                  if line =~ /-NOCHARGE/
         | 
| 75 82 | 
             
                    in_session = false #do not count nocharge sessions, this is a secret feature
         | 
| 76 83 | 
             
                  elsif line =~ /\A#/ && line =~ /CodingSession::END/
         | 
| 77 84 | 
             
                    in_session = true
         | 
| 78 85 | 
             
                    timeEnd = parse_datetime(line)
         | 
| 86 | 
            +
                    timeEnd_line_number = line_number
         | 
| 79 87 |  | 
| 80 88 | 
             
                    #zezzion
         | 
| 81 89 | 
             
                    temp_zezzion = Zezzion.new
         | 
| 82 90 | 
             
                    temp_zezzion.zzend = timeEnd
         | 
| 91 | 
            +
                    temp_zezzion.zzend_line_number = timeEnd_line_number
         | 
| 83 92 |  | 
| 84 93 | 
             
                  elsif line =~ /\A#/ && line =~ /CodingSession::BEGIN/
         | 
| 85 94 | 
             
                    if in_session
         | 
| 86 95 | 
             
                      in_session = false
         | 
| 87 96 | 
             
                      timeBegin = parse_datetime(line)
         | 
| 97 | 
            +
                      timeBegin_line_number = line_number
         | 
| 98 | 
            +
             | 
| 88 99 | 
             
                      #cs_time += (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
         | 
| 89 100 | 
             
                      delta = (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
         | 
| 90 101 | 
             
                      t.coding_session_time += delta
         | 
| @@ -92,6 +103,7 @@ module Devlog | |
| 92 103 | 
             
                      #zezzion
         | 
| 93 104 | 
             
                      temp_zezzion.coding_session_time += delta
         | 
| 94 105 | 
             
                      temp_zezzion.zzbegin = timeBegin
         | 
| 106 | 
            +
                      temp_zezzion.zzbegin_line_number = timeBegin_line_number
         | 
| 95 107 | 
             
                      t.add_zezzion temp_zezzion
         | 
| 96 108 | 
             
                      temp_zezzion = nil
         | 
| 97 109 |  | 
| @@ -99,22 +111,26 @@ module Devlog | |
| 99 111 | 
             
                  elsif line =~ /\A#/ && line =~ /ComSession::END/
         | 
| 100 112 | 
             
                    in_session = true
         | 
| 101 113 | 
             
                    timeEnd = parse_datetime(line)
         | 
| 114 | 
            +
                    timeEnd_line_number = line_number
         | 
| 102 115 |  | 
| 103 116 | 
             
                    #zezzion
         | 
| 104 117 | 
             
                    temp_zezzion = Zezzion.new(Zezzion::COM)
         | 
| 105 118 | 
             
                    temp_zezzion.zzend = timeEnd
         | 
| 106 | 
            -
             | 
| 119 | 
            +
                    temp_zezzion.zzend_line_number = timeEnd_line_number
         | 
| 107 120 |  | 
| 108 121 | 
             
                  elsif line =~ /\A#/ && line =~ /ComSession::BEGIN/
         | 
| 109 122 | 
             
                    if in_session
         | 
| 110 123 | 
             
                      in_session = false
         | 
| 111 124 | 
             
                      timeBegin = parse_datetime(line)
         | 
| 125 | 
            +
                      timeBegin_line_number = line_number
         | 
| 126 | 
            +
             | 
| 112 127 | 
             
                      delta = (timeEnd - timeBegin).to_f * 24
         | 
| 113 128 | 
             
                      t.com_session_time += delta
         | 
| 114 129 |  | 
| 115 130 | 
             
                      #zezzion
         | 
| 116 131 | 
             
                      temp_zezzion.coding_session_time += delta
         | 
| 117 132 | 
             
                      temp_zezzion.zzbegin = timeBegin
         | 
| 133 | 
            +
                      temp_zezzion.zzbegin_line_number = timeBegin_line_number
         | 
| 118 134 | 
             
                      t.add_zezzion temp_zezzion
         | 
| 119 135 | 
             
                      temp_zezzion = nil
         | 
| 120 136 |  | 
| @@ -200,10 +216,10 @@ module Devlog | |
| 200 216 | 
             
              end
         | 
| 201 217 |  | 
| 202 218 | 
             
              class Parsing
         | 
| 203 | 
            -
                #this is the total time, but each  | 
| 219 | 
            +
                #this is the total time, but each session has these same params
         | 
| 204 220 | 
             
                attr_accessor :coding_session_time, :com_session_time, :payed_time #backward compatible object with Tajm, from devlog 0.0.0
         | 
| 205 221 |  | 
| 206 | 
            -
                attr_accessor :zezzions
         | 
| 222 | 
            +
                attr_accessor :zezzions, :devlog_file
         | 
| 207 223 |  | 
| 208 224 | 
             
                def initialize(viewing_time_current_date=DateTime.now)
         | 
| 209 225 | 
             
                  @viewing_time_current_date = viewing_time_current_date
         | 
| @@ -213,13 +229,15 @@ module Devlog | |
| 213 229 | 
             
                  @coding_session_time = 0.0
         | 
| 214 230 | 
             
                  @com_session_time = 0.0
         | 
| 215 231 | 
             
                  @payed_time = 0.0
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                  @devlog_file = ""
         | 
| 216 234 | 
             
                 end
         | 
| 217 235 |  | 
| 218 236 | 
             
                def add_zezzion(zezzion)
         | 
| 219 237 | 
             
                  @zezzions << zezzion
         | 
| 220 238 | 
             
                end
         | 
| 221 239 |  | 
| 222 | 
            -
                # | 
| 240 | 
            +
                #global devlog start, first entry
         | 
| 223 241 | 
             
                def devlog_begin
         | 
| 224 242 | 
             
                  @zezzions.last.zzbegin
         | 
| 225 243 | 
             
                end
         | 
| @@ -291,14 +309,80 @@ module Devlog | |
| 291 309 | 
             
                  @zezzions.min_by(&:session_time)
         | 
| 292 310 | 
             
                end
         | 
| 293 311 |  | 
| 312 | 
            +
                def negative_sessions
         | 
| 313 | 
            +
                  @zezzions.select{|zezzion| zezzion.session_time<0}
         | 
| 314 | 
            +
                end
         | 
| 315 | 
            +
             | 
| 316 | 
            +
                def zero_sessions
         | 
| 317 | 
            +
                  @zezzions.select{|zezzion| zezzion.session_time==0.0}
         | 
| 318 | 
            +
                end
         | 
| 319 | 
            +
             | 
| 320 | 
            +
                def zero_sessions_to_s
         | 
| 321 | 
            +
                  sessions_to_s(zero_sessions)
         | 
| 322 | 
            +
                end
         | 
| 323 | 
            +
             | 
| 324 | 
            +
                def negative_sessions_to_s
         | 
| 325 | 
            +
                  sessions_to_s(negative_sessions)
         | 
| 326 | 
            +
                end
         | 
| 327 | 
            +
             | 
| 328 | 
            +
                def last_session
         | 
| 329 | 
            +
                  @zezzions.first #devlog_begin
         | 
| 330 | 
            +
                end
         | 
| 331 | 
            +
             | 
| 332 | 
            +
                def first_session
         | 
| 333 | 
            +
                  @zezzions.last #devlog_end
         | 
| 334 | 
            +
                end
         | 
| 335 | 
            +
             | 
| 294 336 | 
             
                #return all sessions
         | 
| 295 337 | 
             
                def devlog_sessions
         | 
| 296 338 | 
             
                  @zezzions
         | 
| 297 339 | 
             
                end
         | 
| 298 340 |  | 
| 341 | 
            +
                def validation_string
         | 
| 342 | 
            +
                  vs = ""
         | 
| 343 | 
            +
                  vs << (@zezzions.any? ? '' : "No sessions recorded, add some first...\n".red)
         | 
| 344 | 
            +
                  vs << (File.exist?(self.devlog_file) ? '' : "No such file #{self.devlog_file}...\n".red)
         | 
| 345 | 
            +
                end
         | 
| 299 346 |  | 
| 347 | 
            +
                def to_info_string
         | 
| 348 | 
            +
                  s = ""
         | 
| 349 | 
            +
                  s <<  "\nSession::Time:      = #{self.session_time} [h]\n"
         | 
| 350 | 
            +
                  s << ("\nCodingSession::Time = %.1f [h]" % self.coding_session_time)
         | 
| 351 | 
            +
                  s << ("\nComSession::Time    = %.1f [h]" % self.com_session_time)
         | 
| 352 | 
            +
                  s << ("\nCharge::Time        = #{self.charge_time} [h]")
         | 
| 353 | 
            +
                  s << ("\nUnpayed::Time       = #{self.unpayed_time.to_s.green} [h]\n")
         | 
| 354 | 
            +
                  s << ("\n")
         | 
| 355 | 
            +
                  s << ("Num of Sessions     = #{self.devlog_sessions.size}\n")
         | 
| 356 | 
            +
                  s << ("Hours per Day       = #{self.per_day} [h]\n")
         | 
| 357 | 
            +
                  s << ("Hours per Week      = #{self.per_week} [h]\n")
         | 
| 358 | 
            +
                  s << ("Hours per Month     = #{self.per_month} [h]\n")
         | 
| 359 | 
            +
                  s << ("Hours last 7 days   = #{self.hours_for_last(7)} [h]\n")
         | 
| 360 | 
            +
                  s << ("Hours last 14 days  = #{self.hours_for_last(14)} [h]\n")
         | 
| 361 | 
            +
                  s << ("Hours last 28 days  = #{self.hours_for_last(28)} [h]\n")
         | 
| 362 | 
            +
                  s << ("\n")
         | 
| 363 | 
            +
                  s << ("Devlog Time         = #{self.devlog_days * 24} [hours]\n")
         | 
| 364 | 
            +
                  s << ("Devlog Days         = #{self.devlog_days}  [days]\n")
         | 
| 365 | 
            +
                  s << ("Devlog Weeks        = #{self.devlog_weeks}  [weeks]\n")
         | 
| 366 | 
            +
                  s << ("Devlog Months       = #{self.devlog_months}  [months]\n")
         | 
| 367 | 
            +
                  if self.negative_sessions.any?
         | 
| 368 | 
            +
                    s << ("\n")
         | 
| 369 | 
            +
                    s << ("#{'Negative Sessions'.red}   = #{self.negative_sessions_to_s}\n")
         | 
| 370 | 
            +
                  end
         | 
| 371 | 
            +
                  if self.zero_sessions.any?
         | 
| 372 | 
            +
                    s << ("\n")
         | 
| 373 | 
            +
                    s << ("#{'Zero Sessions'.blue}       = #{self.zero_sessions_to_s}\n")
         | 
| 374 | 
            +
                  end
         | 
| 375 | 
            +
                  s << ("\n")
         | 
| 376 | 
            +
                  s << ("Longest Session     = #{self.longest_session.session_time.round(2)} [hours]\n")
         | 
| 377 | 
            +
                  s << ("Shortest Session    = #{self.shortest_session.session_time.round(2)} [hours]\n")
         | 
| 378 | 
            +
                  s << ("Last Session        = #{self.devlog_end.ago_in_words}, duration: #{self.last_session.session_time.round(2)} [hours]")
         | 
| 379 | 
            +
                end
         | 
| 300 380 |  | 
| 301 381 | 
             
                private 
         | 
| 382 | 
            +
                  def sessions_to_s(sessions)
         | 
| 383 | 
            +
                    "\n" + sessions.collect{|session| "                      " + session.to_s}.join("\n")
         | 
| 384 | 
            +
                  end
         | 
| 385 | 
            +
             | 
| 302 386 | 
             
                  #count :weeks=>1, or :days=>1, or :years=>1
         | 
| 303 387 | 
             
                  def count_time(options)
         | 
| 304 388 | 
             
                    num = 0
         | 
| @@ -314,10 +398,11 @@ module Devlog | |
| 314 398 |  | 
| 315 399 |  | 
| 316 400 | 
             
              class Zezzion
         | 
| 317 | 
            -
                COM = 1
         | 
| 318 | 
            -
                COD = 0
         | 
| 401 | 
            +
                COM = 1 #communication session
         | 
| 402 | 
            +
                COD = 0 #coding session
         | 
| 319 403 | 
             
                attr_accessor :zzbegin, :zzend, :zzbegin_title, :zzend_title, :zztype
         | 
| 320 404 | 
             
                attr_accessor :coding_session_time, :com_session_time, :payed_time
         | 
| 405 | 
            +
                attr_accessor :zzend_line_number, :zzbegin_line_number
         | 
| 321 406 |  | 
| 322 407 | 
             
                def initialize(zztype=COD)
         | 
| 323 408 | 
             
                  @zztype = zztype
         | 
| @@ -329,6 +414,8 @@ module Devlog | |
| 329 414 | 
             
                  @coding_session_time = 0.0
         | 
| 330 415 | 
             
                  @com_session_time = 0.0
         | 
| 331 416 | 
             
                  @payed_time = 0.0
         | 
| 417 | 
            +
                  @zzbegin_line_number = 0
         | 
| 418 | 
            +
                  @zzend_line_number = 0
         | 
| 332 419 | 
             
                end
         | 
| 333 420 |  | 
| 334 421 | 
             
                #in seconds
         | 
| @@ -354,10 +441,18 @@ module Devlog | |
| 354 441 | 
             
                  session_time/days
         | 
| 355 442 | 
             
                end
         | 
| 356 443 | 
             
                def per_week
         | 
| 357 | 
            -
                  
         | 
| 444 | 
            +
                  #todo
         | 
| 358 445 | 
             
                end
         | 
| 359 446 | 
             
                def per_month
         | 
| 447 | 
            +
                  #todo
         | 
| 448 | 
            +
                end
         | 
| 360 449 |  | 
| 450 | 
            +
                def type
         | 
| 451 | 
            +
                  zztype == 0 ? "CodingSession" : "ComSession"
         | 
| 452 | 
            +
                end
         | 
| 453 | 
            +
             | 
| 454 | 
            +
                def to_s
         | 
| 455 | 
            +
                  "#{type}, begin on line #{@zzbegin_line_number} at #{@zzbegin}, ends on line #{@zzend_line_number} at #{@zzend}, #{session_time.round(2)}[hour]"
         | 
| 361 456 | 
             
                end
         | 
| 362 457 | 
             
              end
         | 
| 363 458 |  | 
| @@ -371,5 +466,37 @@ module Devlog | |
| 371 466 | 
             
                end
         | 
| 372 467 |  | 
| 373 468 | 
             
              end
         | 
| 374 | 
            -
             | 
| 469 | 
            +
             | 
| 470 | 
            +
            end
         | 
| 471 | 
            +
             | 
| 472 | 
            +
            module DateTimeAgoInWords
         | 
| 473 | 
            +
              def ago_in_words
         | 
| 474 | 
            +
                return 'a very very long time ago' if self.year < 1800
         | 
| 475 | 
            +
                secs = Time.now - self
         | 
| 476 | 
            +
                return 'just now' if secs > -1 && secs < 1
         | 
| 477 | 
            +
                return '' if secs <= -1
         | 
| 478 | 
            +
                pair = ago_in_words_pair(secs)
         | 
| 479 | 
            +
                ary = ago_in_words_singularize(pair)
         | 
| 480 | 
            +
                ary.size == 0 ? '' : ary.join(' and ') << ' ago'
         | 
| 481 | 
            +
              end
         | 
| 482 | 
            +
              private
         | 
| 483 | 
            +
              def ago_in_words_pair(secs)
         | 
| 484 | 
            +
                [[60, :seconds], [60, :minutes], [24, :hours], [100_000, :days]].map{ |count, name|
         | 
| 485 | 
            +
                  if secs > 0
         | 
| 486 | 
            +
                    secs, n = secs.divmod(count)
         | 
| 487 | 
            +
                    "#{n.to_i} #{name}"
         | 
| 488 | 
            +
                  end
         | 
| 489 | 
            +
                }.compact.reverse[0..1]
         | 
| 490 | 
            +
              end
         | 
| 491 | 
            +
              def ago_in_words_singularize(pair)
         | 
| 492 | 
            +
                if pair.size == 1
         | 
| 493 | 
            +
                  pair.map! {|part| part[0, 2].to_i == 1 ? part.chomp('s') : part }
         | 
| 494 | 
            +
                else
         | 
| 495 | 
            +
                  pair.map! {|part| part[0, 2].to_i == 1 ? part.chomp('s') : part[0, 2].to_i == 0 ? nil : part }
         | 
| 496 | 
            +
                end
         | 
| 497 | 
            +
                pair.compact
         | 
| 498 | 
            +
              end
         | 
| 499 | 
            +
            end
         | 
| 500 | 
            +
            class DateTime
         | 
| 501 | 
            +
              include DateTimeAgoInWords
         | 
| 375 502 | 
             
            end
         | 
    
        data/test/devlog_test.rb
    CHANGED
    
    | @@ -123,4 +123,21 @@ class DevlogTest < Test::Unit::TestCase | |
| 123 123 | 
             
            		load_devlog_stat
         | 
| 124 124 | 
             
            		assert(@tajm_stat.devlog_sessions.size==8, "should be 8, but is #{@tajm_stat.devlog_sessions.size}")
         | 
| 125 125 | 
             
            	end
         | 
| 126 | 
            +
             | 
| 127 | 
            +
            	def test_negative_sessions
         | 
| 128 | 
            +
            		load_devlog_negative
         | 
| 129 | 
            +
            		assert(@tajm_negative.devlog_sessions.size==5, "should be 5, but is #{@tajm_negative.devlog_sessions.size}")
         | 
| 130 | 
            +
            		shortest_session_time_rounded = @tajm_negative.shortest_session.session_time.round(2)
         | 
| 131 | 
            +
            		assert(shortest_session_time_rounded==-2, "should be -2.0, but is #{shortest_session_time_rounded}")
         | 
| 132 | 
            +
            		assert(@tajm_negative.negative_sessions.size==2, "should be 2, but is #{@tajm_negative.negative_sessions.size}")
         | 
| 133 | 
            +
            	end
         | 
| 134 | 
            +
             | 
| 135 | 
            +
            	def test_zero_sessions
         | 
| 136 | 
            +
            		load_devlog_negative
         | 
| 137 | 
            +
            		assert(@tajm_negative.devlog_sessions.size==5, "should be 5, but is #{@tajm_negative.devlog_sessions.size}")
         | 
| 138 | 
            +
            		zero_session_time_rounded = @tajm_negative.zero_sessions.first.session_time.round(2)
         | 
| 139 | 
            +
            		assert(zero_session_time_rounded==0.0, "should be 0.0, but is #{zero_session_time_rounded}")
         | 
| 140 | 
            +
            		assert(@tajm_negative.zero_sessions.size==1, "should be 1, but is #{@tajm_negative.zero_sessions.size}")
         | 
| 141 | 
            +
            	end
         | 
| 142 | 
            +
             | 
| 126 143 | 
             
            end
         | 
    
        data/test/test_helper.rb
    CHANGED
    
    | @@ -39,4 +39,8 @@ end | |
| 39 39 |  | 
| 40 40 | 
             
            def load_devlog_single
         | 
| 41 41 | 
             
            	@tajm_single = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'test_single_devlog.markdown'))
         | 
| 42 | 
            -
            end
         | 
| 42 | 
            +
            end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            def load_devlog_negative
         | 
| 45 | 
            +
            	@tajm_negative = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'test_negative_devlog.markdown'))
         | 
| 46 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            #03.02.2014 16:20:03 CodingSession::END
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            - 1 hour negative
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            #03.02.2014 17:20:03 CodingSession::BEGIN
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            #02.02.2014 17:20:03 CodingSession::END
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            1 hour positive
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            #02.02.2014 16:20:03 CodingSession::BEGIN
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| 15 | 
            +
            #02.02.2014 08:10:10 ComSession::END
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            -2 hours negative session
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            #02.02.2014 10:10:10 ComSession::BEGIN
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            #01.01.2014 20:21:20 CodingSession::END
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            0 session
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            #01.01.2014 20:21:20 CodingSession::BEGIN
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            #01.01.2014 20:20:20 CodingSession::END
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            1 hour positive session
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            #01.01.2014 16:20:20 CodingSession::BEGIN
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: devlog
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0. | 
| 4 | 
            +
              version: 0.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - mihael
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2014- | 
| 11 | 
            +
            date: 2014-08-15 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: jeweler
         | 
| @@ -74,6 +74,7 @@ files: | |
| 74 74 | 
             
            - test/devlog_test.rb
         | 
| 75 75 | 
             
            - test/test_helper.rb
         | 
| 76 76 | 
             
            - test_devlog.markdown
         | 
| 77 | 
            +
            - test_negative_devlog.markdown
         | 
| 77 78 | 
             
            - test_single_devlog.markdown
         | 
| 78 79 | 
             
            - test_stats_devlog.markdown
         | 
| 79 80 | 
             
            homepage: http://github.com/mihael/devlog
         | 
| @@ -96,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 96 97 | 
             
                  version: '0'
         | 
| 97 98 | 
             
            requirements: []
         | 
| 98 99 | 
             
            rubyforge_project: 
         | 
| 99 | 
            -
            rubygems_version: 2. | 
| 100 | 
            +
            rubygems_version: 2.0.14
         | 
| 100 101 | 
             
            signing_key: 
         | 
| 101 102 | 
             
            specification_version: 4
         | 
| 102 103 | 
             
            summary: takes devlog.markdown and gives info
         |