devlog 0.2.0 → 0.3.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/.travis.yml +2 -0
- data/Gemfile +2 -2
- data/Gemfile.lock +2 -2
- data/VERSION +1 -1
- data/bin/devlog +39 -27
- data/devlog.gemspec +37 -31
- data/devlog.markdown +32 -0
- data/lib/devlog.rb +108 -140
- data/lib/devlog_settings.rb +44 -0
- data/test/devlog_file_test.rb +14 -0
- data/test/devlog_settings_test.rb +40 -0
- data/test/devlog_test.rb +18 -11
- data/test/test_devlogs/.devlog.yml +1 -0
- data/{empty_devlog.markdown → test/test_devlogs/empty_devlog.markdown} +0 -0
- data/{test_devlog.markdown → test/test_devlogs/test_devlog.markdown} +0 -0
- data/{test_devlog_export.markdown → test/test_devlogs/test_devlog_export.markdown} +0 -0
- data/test/test_devlogs/test_invalid_date_devlog.markdown +11 -0
- data/{test_negative_devlog.markdown → test/test_devlogs/test_negative_devlog.markdown} +0 -0
- data/{test_open_devlog.markdown → test/test_devlogs/test_open_devlog.markdown} +0 -0
- data/test/test_devlogs/test_settings.yml +5 -0
- data/{test_single_devlog.markdown → test/test_devlogs/test_single_devlog.markdown} +0 -0
- data/{test_stats_devlog.markdown → test/test_devlogs/test_stats_devlog.markdown} +0 -0
- data/test/test_helper.rb +17 -14
- data/tmp/.gitignore +4 -0
- metadata +23 -17
- data/sublime_text/.DS_Store +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 839f5c63004556d46fb81536bb83d211f35fba56
|
4
|
+
data.tar.gz: e24ff4540d187bec26a6f8879a329d2bb7266f47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 420cc743b4dd152b7f3e57f77738e23d7b55b6aa6eb211a290a9d90bfa3fc54c9433d12cefc1739ca80630a59b3ed895e68e7a9013a03d434ffd5d135437e3ca
|
7
|
+
data.tar.gz: 851b1462545d70be06f06dfbe1fbca097ea24cb1c92452e1295a6f2cc6286c5469d31c8d59b715ad503bc418c9d1dbcf7386dbb412c252f70d139f2c89bf0f2f
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/devlog
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'benchmark'
|
3
3
|
require File.expand_path(File.join(File.dirname(__FILE__), %w[.. lib devlog.rb]))
|
4
|
-
USAGE= <<-EOF
|
4
|
+
USAGE = <<-EOF
|
5
5
|
#{Devlog.display_version}
|
6
6
|
This software is intended to parse and present information within devlog.markdown development logs. It also helps You to write the devlog.
|
7
7
|
|
@@ -13,7 +13,7 @@ Using with a file, for parsing and seeing the information summary:
|
|
13
13
|
|
14
14
|
or in a folder with a 'devlog.markdown' file in it:
|
15
15
|
|
16
|
-
#{'devlog'.green}
|
16
|
+
#{'devlog'.green}
|
17
17
|
|
18
18
|
write commands for the current folder, the top three:
|
19
19
|
|
@@ -32,40 +32,54 @@ exporting devlog into a book, which can be read top down, like normal books:
|
|
32
32
|
#{'devlog'.green} x ~ exports into devlog.txt
|
33
33
|
|
34
34
|
EOF
|
35
|
-
|
35
|
+
|
36
|
+
# arguments
|
36
37
|
$:.unshift File.join(File.dirname(__FILE__))
|
37
38
|
@in_file_or_cmd = ARGV[0]
|
39
|
+
|
40
|
+
def print_backtrace(exception)
|
41
|
+
exception.backtrace.join("\n\t").to_s.blue
|
42
|
+
end
|
43
|
+
|
38
44
|
def print_usage
|
39
45
|
puts USAGE
|
40
46
|
end
|
41
|
-
|
47
|
+
|
48
|
+
def parse_now(devlog_file = 'devlog.markdown', msg = '')
|
42
49
|
puts msg
|
43
50
|
t = parse_devlog_now(devlog_file)
|
44
51
|
puts t.validation_string
|
45
52
|
puts t.to_info_string
|
46
53
|
puts is_session_open(devlog_file) ? "\nSession is open...".yellow : "\nNo open session.".green
|
47
54
|
end
|
48
|
-
|
55
|
+
|
56
|
+
def export_now(devlog_file = 'devlog.markdown', msg = '')
|
49
57
|
puts msg
|
50
58
|
exported_file = export_devlog_now(devlog_file)
|
51
59
|
puts "\nExported to #{exported_file}.".yellow
|
52
60
|
end
|
61
|
+
|
62
|
+
include Devlog
|
63
|
+
|
53
64
|
def dodo
|
54
|
-
|
65
|
+
load_settings('.devlog.yml')
|
66
|
+
default_devlog_file = devlog_file_setting
|
55
67
|
time = Benchmark.realtime do
|
56
|
-
|
57
|
-
|
68
|
+
if @in_file_or_cmd =~ /.(markdown|md)$/ # devlog_file is passed directly via CLI
|
69
|
+
@settings = nil
|
70
|
+
parse_now(@in_file_or_cmd, "Parsing #{@in_file_or_cmd}!".red)
|
71
|
+
elsif @in_file_or_cmd == 'help'
|
58
72
|
print_usage
|
59
73
|
elsif @in_file_or_cmd == 'x'
|
60
|
-
export_now(
|
74
|
+
export_now(default_devlog_file, "Exporting #{default_devlog_file}...".green)
|
61
75
|
elsif @in_file_or_cmd == 'commit'
|
62
76
|
`git commit -am 'devlog';git push`
|
63
77
|
elsif @in_file_or_cmd == 'b'
|
64
78
|
puts "CodingSession::BEGIN"
|
65
|
-
start_coding_session(
|
79
|
+
start_coding_session(default_devlog_file)
|
66
80
|
elsif @in_file_or_cmd == 'e'
|
67
81
|
puts "CodingSession::END"
|
68
|
-
stop_coding_session(
|
82
|
+
stop_coding_session(default_devlog_file)
|
69
83
|
elsif @in_file_or_cmd == 'i'
|
70
84
|
puts "Save info.markdown"
|
71
85
|
save_info("devlog.markdown")
|
@@ -77,29 +91,27 @@ def dodo
|
|
77
91
|
`git push`
|
78
92
|
elsif @in_file_or_cmd == 'save'
|
79
93
|
puts "Save info.markdown and Commit and push git"
|
80
|
-
save_info(
|
94
|
+
save_info(default_devlog_file)
|
81
95
|
`git commit -am "devlog" && git push`
|
82
96
|
elsif @in_file_or_cmd == 'saver'
|
83
97
|
puts "Save info.markdown, copy devlog to README.markdown and Commit and push git"
|
84
|
-
save_info(
|
85
|
-
save_to_readme(
|
98
|
+
save_info(default_devlog_file)
|
99
|
+
save_to_readme(default_devlog_file)
|
86
100
|
`git commit -am "devlog" && git push`
|
87
101
|
elsif @in_file_or_cmd == 's'
|
88
|
-
puts is_session_open(
|
89
|
-
elsif @in_file_or_cmd =~ /markdown/
|
90
|
-
parse_now(@in_file_or_cmd, "Parsing #{@in_file_or_cmd}...".red)
|
102
|
+
puts is_session_open(default_devlog_file) ? "Session is open..." : "No open session."
|
91
103
|
else
|
92
|
-
parse_now(
|
104
|
+
parse_now(default_devlog_file, "Parsing #{default_devlog_file}...".green)
|
93
105
|
end
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
#puts "\nRealtime: #{time}sec\n\n"
|
106
|
+
end
|
107
|
+
puts "\n\n"
|
108
|
+
puts "\nRealtime: #{time}sec\n\n"
|
98
109
|
end
|
99
|
-
|
110
|
+
|
111
|
+
# devlog run
|
100
112
|
begin
|
101
113
|
dodo
|
102
|
-
rescue
|
103
|
-
|
104
|
-
|
105
|
-
end
|
114
|
+
rescue StandardError => e
|
115
|
+
puts "\nRuntime exception: #{e.message.to_s.blue}\nBacktrace:\n#{print_backtrace(e)}"
|
116
|
+
print_usage
|
117
|
+
end
|
data/devlog.gemspec
CHANGED
@@ -2,19 +2,19 @@
|
|
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.
|
5
|
+
# stub: devlog 0.3.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name = "devlog"
|
9
|
-
s.version = "0.
|
8
|
+
s.name = "devlog".freeze
|
9
|
+
s.version = "0.3.0"
|
10
10
|
|
11
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
-
s.require_paths = ["lib"]
|
13
|
-
s.authors = ["mihael"]
|
14
|
-
s.date = "
|
15
|
-
s.description = "devlog.markdown time&space extractor"
|
16
|
-
s.email = "kitschmaster@gmail.com"
|
17
|
-
s.executables = ["devlog"]
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["mihael".freeze]
|
14
|
+
s.date = "2018-01-08"
|
15
|
+
s.description = "devlog.markdown time&space extractor".freeze
|
16
|
+
s.email = "kitschmaster@gmail.com".freeze
|
17
|
+
s.executables = ["devlog".freeze]
|
18
18
|
s.extra_rdoc_files = [
|
19
19
|
"LICENSE",
|
20
20
|
"README.md"
|
@@ -32,9 +32,8 @@ Gem::Specification.new do |s|
|
|
32
32
|
"bin/devlog",
|
33
33
|
"devlog.gemspec",
|
34
34
|
"devlog.markdown",
|
35
|
-
"empty_devlog.markdown",
|
36
35
|
"lib/devlog.rb",
|
37
|
-
"
|
36
|
+
"lib/devlog_settings.rb",
|
38
37
|
"sublime_text/devlog.tmbundle/Snippets/begin.tmSnippet",
|
39
38
|
"sublime_text/devlog.tmbundle/Snippets/combegin.tmSnippet",
|
40
39
|
"sublime_text/devlog.tmbundle/Snippets/comend.tmSnippet",
|
@@ -45,36 +44,43 @@ Gem::Specification.new do |s|
|
|
45
44
|
"sublime_text/devlog.tmbundle/Snippets/tu.tmSnippet",
|
46
45
|
"sublime_text/devlog.tmbundle/info.plist",
|
47
46
|
"sublime_text/tu.py",
|
47
|
+
"test/devlog_file_test.rb",
|
48
|
+
"test/devlog_settings_test.rb",
|
48
49
|
"test/devlog_test.rb",
|
50
|
+
"test/test_devlogs/.devlog.yml",
|
51
|
+
"test/test_devlogs/empty_devlog.markdown",
|
52
|
+
"test/test_devlogs/test_devlog.markdown",
|
53
|
+
"test/test_devlogs/test_devlog_export.markdown",
|
54
|
+
"test/test_devlogs/test_invalid_date_devlog.markdown",
|
55
|
+
"test/test_devlogs/test_negative_devlog.markdown",
|
56
|
+
"test/test_devlogs/test_open_devlog.markdown",
|
57
|
+
"test/test_devlogs/test_settings.yml",
|
58
|
+
"test/test_devlogs/test_single_devlog.markdown",
|
59
|
+
"test/test_devlogs/test_stats_devlog.markdown",
|
49
60
|
"test/test_helper.rb",
|
50
|
-
"
|
51
|
-
"test_devlog_export.markdown",
|
52
|
-
"test_negative_devlog.markdown",
|
53
|
-
"test_open_devlog.markdown",
|
54
|
-
"test_single_devlog.markdown",
|
55
|
-
"test_stats_devlog.markdown"
|
61
|
+
"tmp/.gitignore"
|
56
62
|
]
|
57
|
-
s.homepage = "http://github.com/mihael/devlog"
|
58
|
-
s.licenses = ["MIT"]
|
59
|
-
s.rubygems_version = "2.5.
|
60
|
-
s.summary = "takes devlog.markdown and gives info"
|
63
|
+
s.homepage = "http://github.com/mihael/devlog".freeze
|
64
|
+
s.licenses = ["MIT".freeze]
|
65
|
+
s.rubygems_version = "2.5.2".freeze
|
66
|
+
s.summary = "takes devlog.markdown and gives info".freeze
|
61
67
|
|
62
68
|
if s.respond_to? :specification_version then
|
63
69
|
s.specification_version = 4
|
64
70
|
|
65
71
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
66
|
-
s.add_runtime_dependency(%q<activesupport
|
67
|
-
s.add_development_dependency(%q<test-unit
|
68
|
-
s.add_development_dependency(%q<jeweler
|
72
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, ["~> 4.1"])
|
73
|
+
s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.1"])
|
74
|
+
s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.0"])
|
69
75
|
else
|
70
|
-
s.add_dependency(%q<activesupport
|
71
|
-
s.add_dependency(%q<test-unit
|
72
|
-
s.add_dependency(%q<jeweler
|
76
|
+
s.add_dependency(%q<activesupport>.freeze, ["~> 4.1"])
|
77
|
+
s.add_dependency(%q<test-unit>.freeze, ["~> 3.1"])
|
78
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.0"])
|
73
79
|
end
|
74
80
|
else
|
75
|
-
s.add_dependency(%q<activesupport
|
76
|
-
s.add_dependency(%q<test-unit
|
77
|
-
s.add_dependency(%q<jeweler
|
81
|
+
s.add_dependency(%q<activesupport>.freeze, ["~> 4.1"])
|
82
|
+
s.add_dependency(%q<test-unit>.freeze, ["~> 3.1"])
|
83
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.0"])
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
data/devlog.markdown
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
#08.01.2018 21:56:04 CodingSession::END
|
2
|
+
|
3
|
+
doing some more work on settings.
|
4
|
+
|
5
|
+
the idea is to optionally have a file with the following name `.devlog.yml` in a folder where You want to work with devlog. this allows writing the devlog in an arbitrary folder relative to the settings file.
|
6
|
+
|
7
|
+
ii was also thinking about doing convention, simply always look for a `devlog.markdown` in the current folder, and then one up and so on... but ended up going with a setting. so by default `devlog.markdown` is expected to live in the folder where the CLI command is spawned: `devlog`. if there's a settings file instead, and it overrides `devlog_file` path, then that is used instead (but only if it exists).
|
8
|
+
|
9
|
+
done. this is already nice, now I can finally run `devlog` from the project folder and keep my devlog out of it.
|
10
|
+
|
11
|
+
now, it would be good to also publish this to the world.
|
12
|
+
|
13
|
+
so let's see... this time I can actually create a PR and reference an [issue](https://github.com/mihael/devlog/issues/7) for it.
|
14
|
+
|
15
|
+
the new version will be 0.3.0.
|
16
|
+
|
17
|
+
#08.01.2018 20:01:28 CodingSession::BEGIN
|
18
|
+
|
19
|
+
#14.06.2017 00:28:08 CodingSession::END
|
20
|
+
|
21
|
+
ah, well, still not done. cleaning up some more...
|
22
|
+
|
23
|
+
#14.06.2017 00:00:01 CodingSession::BEGIN
|
24
|
+
|
25
|
+
#13.06.2017 23:59:11 CodingSession::END
|
26
|
+
|
27
|
+
doing some cleanup... have a bunch of Issues that need to be implemented.
|
28
|
+
|
29
|
+
but starting with invalid date parsing problem, want to see the line that caused it. done.
|
30
|
+
|
31
|
+
#13.06.2017 22:30:56 CodingSession::BEGIN
|
32
|
+
|
1
33
|
#24.01.2016 20:44:45 CodingSession::END
|
2
34
|
|
3
35
|
ii can now export the devlog. the top session becomes the bottom one, and a human can read the devlog like a book: top down...
|
data/lib/devlog.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#require "time"
|
2
2
|
#require "date"
|
3
3
|
require "active_support/all"
|
4
|
+
require_relative "./devlog_settings"
|
4
5
|
|
6
|
+
# Colors for devlog
|
5
7
|
class String
|
6
8
|
def red; colorize(self, "\e[1m\e[31m"); end
|
7
9
|
def green; colorize(self, "\e[1m\e[32m"); end
|
@@ -12,59 +14,70 @@ class String
|
|
12
14
|
def pur; colorize(self, "\e[1m\e[35m"); end
|
13
15
|
def colorize(text, color_code) "#{color_code}#{text}\e[0m" end
|
14
16
|
end
|
17
|
+
|
18
|
+
# The devlog module with all the mumbo
|
15
19
|
module Devlog
|
16
20
|
# :stopdoc:
|
17
21
|
LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
|
18
22
|
PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
|
19
23
|
VERSION = File.open(File.join(File.dirname(__FILE__), %w[.. VERSION]), 'r').read
|
24
|
+
|
20
25
|
# :startdoc:
|
21
26
|
# Returns the version string for the library.
|
22
27
|
#
|
23
28
|
def self.version
|
24
29
|
VERSION
|
25
30
|
end
|
31
|
+
|
26
32
|
# Returns the library path for the module. If any arguments are given,
|
27
33
|
# they will be joined to the end of the libray path using
|
28
34
|
# <tt>File.join</tt>.
|
29
35
|
#
|
30
|
-
def self.libpath(
|
36
|
+
def self.libpath(*args)
|
31
37
|
args.empty? ? LIBPATH : ::File.join(LIBPATH, args.flatten)
|
32
38
|
end
|
39
|
+
|
33
40
|
# Returns the lpath for the module. If any arguments are given,
|
34
41
|
# they will be joined to the end of the path using
|
35
42
|
# <tt>File.join</tt>.
|
36
43
|
#
|
37
|
-
def self.path(
|
44
|
+
def self.path(*args)
|
38
45
|
args.empty? ? PATH : ::File.join(PATH, args.flatten)
|
39
46
|
end
|
47
|
+
|
40
48
|
# Utility method used to require all files ending in .rb that lie in the
|
41
49
|
# directory below this file that has the same name as the filename passed
|
42
50
|
# in. Optionally, a specific _directory_ name can be passed in such that
|
43
51
|
# the _filename_ does not have to be equivalent to the directory.
|
44
52
|
#
|
45
|
-
def self.require_all_libs_relative_to(
|
53
|
+
def self.require_all_libs_relative_to(fname, dir = nil)
|
46
54
|
dir ||= ::File.basename(fname, '.*')
|
47
55
|
search_me = ::File.expand_path(
|
48
|
-
|
56
|
+
::File.join(::File.dirname(fname), dir, '**', '*.rb')
|
57
|
+
)
|
49
58
|
|
50
|
-
Dir.glob(search_me).sort.each {|rb| require rb}
|
59
|
+
Dir.glob(search_me).sort.each { |rb| require rb }
|
51
60
|
end
|
61
|
+
|
52
62
|
def self.display_version
|
53
63
|
"\n#{'Devlog'.green} v#{Devlog.version}\n"
|
54
64
|
end
|
55
|
-
|
65
|
+
|
66
|
+
# Write simple console log
|
56
67
|
def self.log(txt)
|
57
68
|
puts "#{txt}"
|
58
69
|
end
|
59
70
|
|
60
|
-
#
|
61
|
-
DATETIME_FORMAT =
|
71
|
+
# Parsing datetime
|
72
|
+
DATETIME_FORMAT = '%d.%m.%Y %H:%M:%S'.freeze
|
62
73
|
def parse_datetime(line)
|
63
74
|
parts = line[1..-1].split
|
64
75
|
DateTime.strptime("#{parts[0]} #{parts[1]}", DATETIME_FORMAT)
|
76
|
+
rescue StandardError
|
77
|
+
abort "\nError\nCan not parse line with invalid date:\n\n#{line}".to_s.blue
|
65
78
|
end
|
66
79
|
|
67
|
-
def parse_devlog_now(devlog=nil)
|
80
|
+
def parse_devlog_now(devlog = nil)
|
68
81
|
t = Parsing.new
|
69
82
|
t.devlog_file = devlog
|
70
83
|
|
@@ -79,17 +92,17 @@ module Devlog
|
|
79
92
|
temp_zezzion = nil
|
80
93
|
|
81
94
|
line_number = 0
|
82
|
-
File.open(devlog,
|
83
|
-
line_number+=1
|
95
|
+
File.open(devlog, 'r').each do |line|
|
96
|
+
line_number += 1
|
84
97
|
|
85
98
|
if line =~ /-NOCHARGE/
|
86
|
-
in_session = false #do not count nocharge sessions, this is a secret feature
|
99
|
+
in_session = false # do not count nocharge sessions, this is a secret feature
|
87
100
|
elsif line =~ /\A#/ && line =~ /CodingSession::END/
|
88
101
|
in_session = true
|
89
102
|
timeEnd = parse_datetime(line)
|
90
103
|
timeEnd_line_number = line_number
|
91
104
|
|
92
|
-
#zezzion
|
105
|
+
# zezzion
|
93
106
|
temp_zezzion = Zezzion.new
|
94
107
|
temp_zezzion.zzend = timeEnd
|
95
108
|
temp_zezzion.zzend_line_number = timeEnd_line_number
|
@@ -100,11 +113,11 @@ module Devlog
|
|
100
113
|
timeBegin = parse_datetime(line)
|
101
114
|
timeBegin_line_number = line_number
|
102
115
|
|
103
|
-
#cs_time += (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
|
116
|
+
# cs_time += (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
|
104
117
|
delta = (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
|
105
118
|
t.coding_session_time += delta
|
106
119
|
|
107
|
-
#zezzion
|
120
|
+
# zezzion
|
108
121
|
temp_zezzion.coding_session_time += delta
|
109
122
|
temp_zezzion.zzbegin = timeBegin
|
110
123
|
temp_zezzion.zzbegin_line_number = timeBegin_line_number
|
@@ -117,7 +130,7 @@ module Devlog
|
|
117
130
|
timeEnd = parse_datetime(line)
|
118
131
|
timeEnd_line_number = line_number
|
119
132
|
|
120
|
-
#zezzion
|
133
|
+
# zezzion
|
121
134
|
temp_zezzion = Zezzion.new(Zezzion::COM)
|
122
135
|
temp_zezzion.zzend = timeEnd
|
123
136
|
temp_zezzion.zzend_line_number = timeEnd_line_number
|
@@ -131,7 +144,7 @@ module Devlog
|
|
131
144
|
delta = (timeEnd - timeBegin).to_f * 24
|
132
145
|
t.com_session_time += delta
|
133
146
|
|
134
|
-
#zezzion
|
147
|
+
# zezzion
|
135
148
|
temp_zezzion.coding_session_time += delta
|
136
149
|
temp_zezzion.zzbegin = timeBegin
|
137
150
|
temp_zezzion.zzbegin_line_number = timeBegin_line_number
|
@@ -143,7 +156,7 @@ module Devlog
|
|
143
156
|
delta = line.to_f
|
144
157
|
t.com_session_time += delta
|
145
158
|
|
146
|
-
#zezzion
|
159
|
+
# zezzion
|
147
160
|
if temp_zezzion
|
148
161
|
temp_zezzion.com_session_time += delta
|
149
162
|
else
|
@@ -153,7 +166,7 @@ module Devlog
|
|
153
166
|
delta = (line.to_f / 60)
|
154
167
|
t.com_session_time += delta
|
155
168
|
|
156
|
-
#zezzion
|
169
|
+
# zezzion
|
157
170
|
if temp_zezzion
|
158
171
|
temp_zezzion.com_session_time += delta
|
159
172
|
else
|
@@ -163,77 +176,32 @@ module Devlog
|
|
163
176
|
delta = (line.to_f)
|
164
177
|
t.payed_time += delta
|
165
178
|
|
166
|
-
#zezzion
|
179
|
+
# zezzion
|
167
180
|
if temp_zezzion
|
168
181
|
temp_zezzion.payed_time += delta
|
169
182
|
else
|
170
183
|
puts "error adding temp_zezzion delta time at line: #{line}"
|
171
184
|
end
|
172
185
|
end
|
173
|
-
|
174
186
|
end
|
175
|
-
#return the Parsing object
|
187
|
+
# return the Parsing object
|
176
188
|
t
|
177
189
|
end
|
178
190
|
|
179
|
-
#
|
180
|
-
def parse_devlog(devlog=nil)
|
181
|
-
t = Tajm.new
|
182
|
-
return t unless devlog
|
183
|
-
|
184
|
-
timeEnd = nil
|
185
|
-
timeBegin = nil
|
186
|
-
in_session = false
|
191
|
+
# Workflow methods
|
187
192
|
|
188
|
-
|
189
|
-
|
190
|
-
in_session = false #do not count nocharge sessions
|
191
|
-
elsif line =~ /\A#/ && line =~ /CodingSession::END/
|
192
|
-
in_session = true
|
193
|
-
timeEnd = parse_datetime(line)
|
194
|
-
elsif line =~ /\A#/ && line =~ /CodingSession::BEGIN/
|
195
|
-
if in_session
|
196
|
-
in_session = false
|
197
|
-
timeBegin = parse_datetime(line)
|
198
|
-
#cs_time += (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
|
199
|
-
t.coding_session_time += (timeEnd - timeBegin).to_f * 24 #hours *60 #minutes *60 #seconds
|
200
|
-
end
|
201
|
-
elsif line =~ /\A#/ && line =~ /ComSession::END/
|
202
|
-
in_session = true
|
203
|
-
timeEnd = parse_datetime(line)
|
204
|
-
elsif line =~ /\A#/ && line =~ /ComSession::BEGIN/
|
205
|
-
if in_session
|
206
|
-
in_session = false
|
207
|
-
timeBegin = parse_datetime(line)
|
208
|
-
t.com_session_time += (timeEnd - timeBegin).to_f * 24
|
209
|
-
end
|
210
|
-
elsif line =~ /\A\+[0-9]+[h]/
|
211
|
-
t.com_session_time += line.to_f
|
212
|
-
elsif line =~ /\A\+[0-9]+[m]/
|
213
|
-
t.com_session_time += (line.to_f / 60)
|
214
|
-
elsif line =~ /\A\-[0-9]+[h]/
|
215
|
-
t.payed_time += (line.to_f)
|
216
|
-
end
|
217
|
-
|
218
|
-
end
|
219
|
-
#return the Tajm object
|
220
|
-
t
|
221
|
-
end
|
222
|
-
|
223
|
-
#workflow methods
|
224
|
-
|
225
|
-
#helper for the time entries
|
226
|
-
def devlog_session_entry(session_type='Coding', begin_end='BEGIN')
|
193
|
+
# Helper for the time entries
|
194
|
+
def devlog_session_entry(session_type = 'Coding', begin_end = 'BEGIN')
|
227
195
|
"\n##{Time.now.strftime(DATETIME_FORMAT)} #{session_type}Session::#{begin_end}\n"
|
228
196
|
end
|
229
197
|
|
230
|
-
#
|
231
|
-
#def prepend_string(t="\n", devlog_file='devlog.markdown')
|
232
|
-
#
|
233
|
-
#end
|
198
|
+
# Prepend a string to a text file
|
199
|
+
# def prepend_string(t="\n", devlog_file='devlog.markdown')
|
200
|
+
# system "echo '#{t}' | cat - #{devlog_file} > #{devlog_file}.tmp && mv #{devlog_file}.tmp #{devlog_file}"
|
201
|
+
# end
|
234
202
|
|
235
203
|
require 'tempfile'
|
236
|
-
def prepend_string(string="\n"
|
204
|
+
def prepend_string(path, string = "\n")
|
237
205
|
Tempfile.open File.basename(path) do |tempfile|
|
238
206
|
tempfile << string
|
239
207
|
File.open(path, 'r+') do |file|
|
@@ -245,17 +213,17 @@ module Devlog
|
|
245
213
|
end
|
246
214
|
|
247
215
|
#insert a new session
|
248
|
-
def start_coding_session(devlog_file='devlog.markdown')
|
249
|
-
prepend_string(devlog_session_entry('Coding', 'BEGIN')
|
216
|
+
def start_coding_session(devlog_file = 'devlog.markdown')
|
217
|
+
prepend_string(devlog_file, devlog_session_entry('Coding', 'BEGIN'))
|
250
218
|
end
|
251
219
|
|
252
220
|
#close the current session, if any
|
253
|
-
def stop_coding_session(devlog_file='devlog.markdown')
|
254
|
-
prepend_string(devlog_session_entry('Coding', 'END')
|
221
|
+
def stop_coding_session(devlog_file = 'devlog.markdown')
|
222
|
+
prepend_string(devlog_file, devlog_session_entry('Coding', 'END'))
|
255
223
|
save_info(devlog_file)
|
256
224
|
end
|
257
225
|
|
258
|
-
def save_info(devlog_file='devlog.markdown', info_file='info.markdown')
|
226
|
+
def save_info(devlog_file = 'devlog.markdown', info_file = 'info.markdown')
|
259
227
|
info = parse_devlog_now(devlog_file)
|
260
228
|
if info.has_info?
|
261
229
|
File.open(File.join(File.dirname(devlog_file), info_file), 'w') {|f| f.write(info.to_info_string(short=true)) }
|
@@ -264,17 +232,17 @@ module Devlog
|
|
264
232
|
end
|
265
233
|
end
|
266
234
|
|
267
|
-
def save_to_readme(devlog_file='devlog.markdown')
|
235
|
+
def save_to_readme(devlog_file = 'devlog.markdown')
|
268
236
|
`cp #{devlog_file} #{File.join(File.dirname(devlog_file), 'README.markdown')}`
|
269
237
|
end
|
270
238
|
|
271
|
-
#
|
272
|
-
def is_session_open(devlog_file='devlog.markdown')
|
239
|
+
# If the first non empty line is not and END entry then session is open (or malformed file)
|
240
|
+
def is_session_open(devlog_file = 'devlog.markdown')
|
273
241
|
is_open = true
|
274
242
|
File.open(devlog_file, 'r') do |f|
|
275
243
|
loop do
|
276
|
-
break if not line = f.gets #exit on end of file, read line
|
277
|
-
if (line.strip.size>0) #non empty line
|
244
|
+
break if not line = f.gets # exit on end of file, read line
|
245
|
+
if (line.strip.size>0) # non empty line
|
278
246
|
if (line =~ /Session::END/)
|
279
247
|
is_open = false
|
280
248
|
break
|
@@ -287,21 +255,21 @@ module Devlog
|
|
287
255
|
is_open
|
288
256
|
end
|
289
257
|
|
290
|
-
def export_devlog_now(devlog_file='devlog.markdown')
|
258
|
+
def export_devlog_now(devlog_file = 'devlog.markdown')
|
291
259
|
devlog_export_file = File.join(File.dirname(devlog_file), 'devlog_book.markdown')
|
292
|
-
|
293
|
-
#so need to parse all sessions and print them out in reverse!
|
260
|
+
# `sed -n '1!G;h;$p' #{devlog_file} > #{devlog_export_file}` #not what we want! , we want just the sessions upside down, but text intact
|
261
|
+
# so need to parse all sessions and print them out in reverse!
|
294
262
|
|
295
263
|
sessionEnd = ''
|
296
264
|
sessionMidd = ''
|
297
265
|
sessionBegin = ''
|
298
266
|
in_session = false
|
299
267
|
|
300
|
-
#
|
268
|
+
# The ends are the begins, the begins are the ends
|
301
269
|
|
302
270
|
File.new(devlog_export_file, 'wb')
|
303
271
|
|
304
|
-
File.open(devlog_file,
|
272
|
+
File.open(devlog_file, 'r').each do |line|
|
305
273
|
if line =~ /-NOCHARGE/
|
306
274
|
in_session = false #do not export nocharge sessions
|
307
275
|
elsif line =~ /\A#/ && (line =~ /CodingSession::END/ || line =~ /ComSession::END/ )
|
@@ -312,8 +280,8 @@ module Devlog
|
|
312
280
|
in_session = false
|
313
281
|
sessionBegin = line
|
314
282
|
s = sessionBegin + sessionMidd + sessionEnd
|
315
|
-
#system "echo '#{s}' | cat - #{devlog_export_file} > #{devlog_export_file}.tmp && mv #{devlog_export_file}.tmp #{devlog_export_file}"
|
316
|
-
prepend_string(
|
283
|
+
# system "echo '#{s}' | cat - #{devlog_export_file} > #{devlog_export_file}.tmp && mv #{devlog_export_file}.tmp #{devlog_export_file}"
|
284
|
+
prepend_string(devlog_export_file, s)
|
317
285
|
sessionEnd = ''
|
318
286
|
sessionMidd = ''
|
319
287
|
sessionBegin = ''
|
@@ -326,23 +294,23 @@ module Devlog
|
|
326
294
|
devlog_export_file
|
327
295
|
end
|
328
296
|
|
329
|
-
#
|
297
|
+
# The parsing object
|
330
298
|
class Parsing
|
331
|
-
#this is the total time, but each session has these same params
|
299
|
+
# this is the total time, but each session has these same params
|
332
300
|
attr_accessor :coding_session_time, :com_session_time, :payed_time #backward compatible object with Tajm, from devlog 0.0.0
|
333
301
|
|
334
302
|
attr_accessor :zezzions, :devlog_file
|
335
303
|
|
336
|
-
def initialize(viewing_time_current_date=DateTime.now)
|
304
|
+
def initialize(viewing_time_current_date = DateTime.now)
|
337
305
|
@viewing_time_current_date = viewing_time_current_date
|
338
306
|
@zezzions = []
|
339
307
|
|
340
|
-
#backward compatible object with Tajm, from devlog 0.0.0
|
308
|
+
# backward compatible object with Tajm, from devlog 0.0.0
|
341
309
|
@coding_session_time = 0.0
|
342
310
|
@com_session_time = 0.0
|
343
311
|
@payed_time = 0.0
|
344
312
|
|
345
|
-
@devlog_file =
|
313
|
+
@devlog_file = ''
|
346
314
|
end
|
347
315
|
|
348
316
|
def has_info?
|
@@ -353,68 +321,70 @@ module Devlog
|
|
353
321
|
@zezzions << zezzion
|
354
322
|
end
|
355
323
|
|
356
|
-
#global devlog start, first entry
|
324
|
+
# global devlog start, first entry
|
357
325
|
def devlog_begin
|
358
326
|
@zezzions.last.zzbegin
|
359
327
|
end
|
360
328
|
|
361
|
-
#global devlog end, last entry
|
329
|
+
# global devlog end, last entry
|
362
330
|
def devlog_end
|
363
331
|
@zezzions.first.zzend
|
364
332
|
end
|
365
333
|
|
366
|
-
#how much time between first session begin and last session end
|
367
|
-
#in seconds
|
368
|
-
#def devlog_time
|
369
|
-
#
|
370
|
-
#end
|
334
|
+
# how much time between first session begin and last session end
|
335
|
+
# in seconds
|
336
|
+
# def devlog_time
|
337
|
+
# (self.devlog_end.to_time - self.devlog_begin.to_time)/60.0/60.0
|
338
|
+
# end
|
371
339
|
|
372
340
|
def session_time
|
373
|
-
@zezzions.inject(
|
341
|
+
@zezzions.inject(0) { |time, zezzion| time + zezzion.session_time }.round(2)
|
374
342
|
end
|
375
343
|
|
376
|
-
#how many days devlog spans
|
344
|
+
# how many days devlog spans
|
377
345
|
def devlog_days
|
378
|
-
count_time(:days=>1)
|
379
|
-
#(self.devlog_end - self.devlog_begin).to_i + 1 #counting days like this, would not account for daylight saving changes
|
346
|
+
count_time( :days => 1)
|
347
|
+
# (self.devlog_end - self.devlog_begin).to_i + 1 #counting days like this, would not account for daylight saving changes
|
380
348
|
end
|
381
349
|
|
382
|
-
#how many weeks devlog spans
|
350
|
+
# how many weeks devlog spans
|
383
351
|
def devlog_weeks
|
384
352
|
(devlog_days/7.0).round(2)
|
385
353
|
end
|
386
354
|
|
387
355
|
def devlog_months
|
388
|
-
count_time(:months=>1)
|
356
|
+
count_time( :months => 1)
|
389
357
|
end
|
390
358
|
|
391
|
-
#hours per day
|
359
|
+
# hours per day
|
392
360
|
def per_day
|
393
361
|
(self.session_time/self.devlog_days).round(2)
|
394
362
|
end
|
363
|
+
|
395
364
|
def per_week
|
396
365
|
(self.session_time/self.devlog_weeks).round(2)
|
397
366
|
end
|
367
|
+
|
398
368
|
def per_month
|
399
369
|
(self.session_time/self.devlog_months).round(2)
|
400
370
|
end
|
401
371
|
|
402
|
-
#total charge time in hours, coding plus communication sessions
|
372
|
+
# total charge time in hours, coding plus communication sessions
|
403
373
|
def charge_time
|
404
374
|
(coding_session_time + com_session_time).round(2)
|
405
375
|
end
|
406
376
|
|
407
|
-
#total charge time in hours, coding plus communication sessions - payed hours
|
377
|
+
# total charge time in hours, coding plus communication sessions - payed hours
|
408
378
|
def unpayed_time
|
409
379
|
(coding_session_time + com_session_time + payed_time).round(2)
|
410
380
|
end
|
411
381
|
|
412
|
-
#return hours worked for the last X days, from beginTime
|
413
|
-
def hours_for_last(days, beginTime=DateTime.now)
|
382
|
+
# return hours worked for the last X days, from beginTime
|
383
|
+
def hours_for_last(days, beginTime = DateTime.now)
|
414
384
|
endTime = beginTime.to_time - days.days
|
415
|
-
selected_zezzions = @zezzions.select{|z| z.zzbegin.to_time<beginTime && z.zzend>=endTime}
|
416
|
-
#puts("Selected sessons from #{beginTime} to #{endTime}: #{selected_zezzions.size}")
|
417
|
-
selected_zezzions.inject(
|
385
|
+
selected_zezzions = @zezzions.select { |z| z.zzbegin.to_time < beginTime && z.zzend >= endTime }
|
386
|
+
# puts("Selected sessons from #{beginTime} to #{endTime}: #{selected_zezzions.size}")
|
387
|
+
selected_zezzions.inject(0) { |time, z| time + z.session_time }.round(2)
|
418
388
|
end
|
419
389
|
|
420
390
|
def longest_session
|
@@ -442,26 +412,26 @@ module Devlog
|
|
442
412
|
end
|
443
413
|
|
444
414
|
def last_session
|
445
|
-
@zezzions.first #devlog_begin
|
415
|
+
@zezzions.first # devlog_begin
|
446
416
|
end
|
447
417
|
|
448
418
|
def first_session
|
449
|
-
@zezzions.last #devlog_end
|
419
|
+
@zezzions.last # devlog_end
|
450
420
|
end
|
451
421
|
|
452
|
-
#return all sessions
|
422
|
+
# return all sessions
|
453
423
|
def devlog_sessions
|
454
424
|
@zezzions
|
455
425
|
end
|
456
426
|
|
457
427
|
def validation_string
|
458
|
-
vs =
|
428
|
+
vs = ''
|
459
429
|
vs << (@zezzions.any? ? '' : "No sessions recorded, add some first...\n".red)
|
460
|
-
vs << (File.exist?(
|
430
|
+
vs << (File.exist?(devlog_file) ? '' : "No such file #{devlog_file}...\n".red)
|
461
431
|
end
|
462
432
|
|
463
433
|
def to_info_string(short=false)
|
464
|
-
s =
|
434
|
+
s = ''
|
465
435
|
s << "\nSession::Time: = #{self.session_time} [h]\n"
|
466
436
|
s << ("\nCodingSession::Time = %.1f [h]\n" % self.coding_session_time)
|
467
437
|
s << ("\nComSession::Time = %.1f [h]\n" % self.com_session_time)
|
@@ -498,11 +468,12 @@ module Devlog
|
|
498
468
|
end
|
499
469
|
|
500
470
|
private
|
471
|
+
|
501
472
|
def sessions_to_s(sessions)
|
502
473
|
"\n" + sessions.collect{|session| " " + session.to_s}.join("\n")
|
503
474
|
end
|
504
475
|
|
505
|
-
#count :weeks=>1, or :days=>1, or :years=>1
|
476
|
+
# count :weeks=>1, or :days=>1, or :years=>1
|
506
477
|
def count_time(options)
|
507
478
|
num = 0
|
508
479
|
cur = self.devlog_begin
|
@@ -510,20 +481,18 @@ module Devlog
|
|
510
481
|
num += 1
|
511
482
|
cur = cur.advance(options)
|
512
483
|
end
|
513
|
-
|
484
|
+
num
|
514
485
|
end
|
515
|
-
|
516
486
|
end
|
517
487
|
|
518
|
-
|
519
488
|
class Zezzion
|
520
|
-
COM = 1 #communication session
|
521
|
-
COD = 0 #coding session
|
489
|
+
COM = 1 # communication session
|
490
|
+
COD = 0 # coding session
|
522
491
|
attr_accessor :zzbegin, :zzend, :zzbegin_title, :zzend_title, :zztype
|
523
492
|
attr_accessor :coding_session_time, :com_session_time, :payed_time
|
524
493
|
attr_accessor :zzend_line_number, :zzbegin_line_number
|
525
494
|
|
526
|
-
def initialize(zztype=COD)
|
495
|
+
def initialize(zztype = COD)
|
527
496
|
@zztype = zztype
|
528
497
|
@zzbegin = nil
|
529
498
|
@zzend = nil
|
@@ -537,33 +506,33 @@ module Devlog
|
|
537
506
|
@zzend_line_number = 0
|
538
507
|
end
|
539
508
|
|
540
|
-
#in seconds
|
509
|
+
# in seconds
|
541
510
|
def time
|
542
511
|
@zzend.to_time - @zzbegin.to_time
|
543
512
|
end
|
544
513
|
|
545
|
-
#zezzion_time in days
|
514
|
+
# zezzion_time in days
|
546
515
|
def days
|
547
516
|
min = self.time / 60
|
548
517
|
hours = min / 60
|
549
518
|
days = hours / 24
|
550
519
|
end
|
551
520
|
|
552
|
-
#the whole coding session time
|
521
|
+
# the whole coding session time
|
553
522
|
def session_time
|
554
523
|
@coding_session_time + @com_session_time #in seconds
|
555
524
|
end
|
556
525
|
|
557
|
-
#hours per day
|
526
|
+
# hours per day
|
558
527
|
def per_day
|
559
|
-
#whole time over number of days the parsing covers
|
528
|
+
# whole time over number of days the parsing covers
|
560
529
|
session_time/days
|
561
530
|
end
|
562
531
|
def per_week
|
563
|
-
#todo
|
532
|
+
# todo
|
564
533
|
end
|
565
534
|
def per_month
|
566
|
-
#todo
|
535
|
+
# todo
|
567
536
|
end
|
568
537
|
|
569
538
|
def type
|
@@ -583,9 +552,7 @@ module Devlog
|
|
583
552
|
@com_session_time = 0.0
|
584
553
|
@payed_time = 0.0
|
585
554
|
end
|
586
|
-
|
587
555
|
end
|
588
|
-
|
589
556
|
end
|
590
557
|
|
591
558
|
module DateTimeAgoInWords
|
@@ -616,6 +583,7 @@ module DateTimeAgoInWords
|
|
616
583
|
pair.compact
|
617
584
|
end
|
618
585
|
end
|
586
|
+
|
619
587
|
class DateTime
|
620
588
|
include DateTimeAgoInWords
|
621
|
-
end
|
589
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'ostruct'
|
3
|
+
# require 'pry'
|
4
|
+
|
5
|
+
#
|
6
|
+
module Devlog
|
7
|
+
# Settings - keeping it simple.
|
8
|
+
# Allow settings.key besides settings[:key]
|
9
|
+
# If the method name exists as a key within this Hash, fetch it.
|
10
|
+
class Settings < Hash
|
11
|
+
def method_missing(m, *args, &block)
|
12
|
+
if key?(m)
|
13
|
+
fetch m
|
14
|
+
elsif key?(m.to_s)
|
15
|
+
fetch m.to_s
|
16
|
+
else
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_settings(file)
|
23
|
+
yaml = YAML.load_file(file)
|
24
|
+
@settings = yaml ? Settings[yaml] : Settings.new
|
25
|
+
end
|
26
|
+
|
27
|
+
def settings
|
28
|
+
@settings
|
29
|
+
end
|
30
|
+
|
31
|
+
# The default is the current folder with devlog.markdown in it.
|
32
|
+
DEVLOG_FILE = 'devlog.markdown'.freeze
|
33
|
+
|
34
|
+
# Calculate a devlog_file path.
|
35
|
+
def devlog_file_setting
|
36
|
+
return DEVLOG_FILE unless @settings
|
37
|
+
devlog_file_setting = @settings['devlog_file']
|
38
|
+
if devlog_file_setting && File.exists?(File.join(Dir.pwd, devlog_file_setting))
|
39
|
+
devlog_file_setting
|
40
|
+
else
|
41
|
+
DEVLOG_FILE
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# Test the devlog_file_setting override
|
4
|
+
class DevlogFileTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
load_settings(File.join(File.dirname(__FILE__),
|
7
|
+
TEST_FILES_PATH, '.devlog.yml'))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_devlog_file_returns_the_overriden_devlog_file
|
11
|
+
x = "overridden setting should be returned, but was #{devlog_file_setting}"
|
12
|
+
assert(devlog_file_setting == 'test/test_devlogs/test_devlog.markdown', x)
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
# Test the settings
|
4
|
+
class DevlogSettingsTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
load_settings(File.join(File.dirname(__FILE__),
|
7
|
+
TEST_FILES_PATH, 'test_settings.yml'))
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_settings
|
11
|
+
assert(settings.is_a?(Settings) == true, 'settings is a Hash')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_adding_setting
|
15
|
+
settings[:new_setting] = 'added'
|
16
|
+
assert(settings.new_setting == 'added', 'new_setting should be defined')
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_changing_setting_on_the_fly
|
20
|
+
settings[:new_setting] = 'added'
|
21
|
+
assert(settings.new_setting == 'added', 'new_setting should be defined')
|
22
|
+
settings[:new_setting] = 'mod'
|
23
|
+
assert(settings.new_setting == 'mod', 'new_setting should be modified')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_loading_from_yaml
|
27
|
+
assert(settings.devlog_file == 'development_log.markdown',
|
28
|
+
'example setting should be loaded')
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_devlog_file_setting_returns_default_when_overriden_devlog_file_does_not_exist
|
32
|
+
assert(devlog_file_setting == 'devlog.markdown',
|
33
|
+
'default setting should be returned, since the example setting does not exist')
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_nested_settings_are_possible_but_not_encouraged
|
37
|
+
assert_raise(NoMethodError) { settings.nested.setting == 'xyz' }
|
38
|
+
assert(settings.nested['setting'] == 'xyz', 'xyz should be defined')
|
39
|
+
end
|
40
|
+
end
|
data/test/devlog_test.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class DevlogTest < Test::Unit::TestCase
|
4
|
-
|
5
4
|
def test_empty_devlog
|
6
|
-
@tajm =
|
5
|
+
@tajm = parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'empty_devlog.markdown'))
|
7
6
|
puts "#{@tajm.coding_session_time} #{@tajm.com_session_time} #{@tajm.payed_time}"
|
8
7
|
assert(@tajm.coding_session_time==0, "time is money is love")
|
9
8
|
assert(@tajm.com_session_time==0, "selftalk")
|
@@ -35,6 +34,12 @@ class DevlogTest < Test::Unit::TestCase
|
|
35
34
|
assert(@tajm_test.charge_time==5.5, "wrong charge wrong")
|
36
35
|
end
|
37
36
|
|
37
|
+
def test_devlog_invalid_date
|
38
|
+
assert_raise(SystemExit) do
|
39
|
+
parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_invalid_date_devlog.markdown'))
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
38
43
|
def test_p_session_time
|
39
44
|
p = Parsing.new
|
40
45
|
zezzion = Zezzion.new
|
@@ -111,7 +116,6 @@ class DevlogTest < Test::Unit::TestCase
|
|
111
116
|
load_devlog_stat
|
112
117
|
hours = @tajm_stat.hours_for_last(1, parse_datetime("#09.03.2014 11:00:00"))
|
113
118
|
assert(hours==1, "should be 1, but is #{hours}")
|
114
|
-
|
115
119
|
end
|
116
120
|
|
117
121
|
def test_session_count
|
@@ -136,7 +140,7 @@ class DevlogTest < Test::Unit::TestCase
|
|
136
140
|
end
|
137
141
|
|
138
142
|
def test_start_coding_session
|
139
|
-
@empty_devlog = File.join(File.dirname(__FILE__),
|
143
|
+
@empty_devlog = File.join(File.dirname(__FILE__), TEMP_PATH, 'tmp1_devlog.markdown')
|
140
144
|
File.open(@empty_devlog, 'w') {|f| f.puts('empty')}
|
141
145
|
start_coding_session(@empty_devlog)
|
142
146
|
assert(File.readlines(@empty_devlog).grep(/CodingSession::BEGIN/).size>0, "should insert CodingSession::BEGIN at top of file")
|
@@ -145,7 +149,7 @@ class DevlogTest < Test::Unit::TestCase
|
|
145
149
|
end
|
146
150
|
|
147
151
|
def test_stop_coding_session
|
148
|
-
@empty_devlog = File.join(File.dirname(__FILE__),
|
152
|
+
@empty_devlog = File.join(File.dirname(__FILE__), TEMP_PATH, 'tmp2_devlog.markdown')
|
149
153
|
File.delete(@empty_devlog) if File.exist?(@empty_devlog)
|
150
154
|
File.open(@empty_devlog, 'w') {|f| f.puts('empty')}
|
151
155
|
stop_coding_session(@empty_devlog)
|
@@ -155,14 +159,14 @@ class DevlogTest < Test::Unit::TestCase
|
|
155
159
|
end
|
156
160
|
|
157
161
|
def test_save_info_after_stop_coding_session
|
158
|
-
@devlog_info = File.join(File.dirname(__FILE__),
|
159
|
-
@empty_devlog = File.join(File.dirname(__FILE__),
|
162
|
+
@devlog_info = File.join(File.dirname(__FILE__), TEMP_PATH, 'info.markdown')
|
163
|
+
@empty_devlog = File.join(File.dirname(__FILE__), TEMP_PATH, 'tmp3_devlog.markdown')
|
160
164
|
#File.delete(@empty_devlog) if File.exist?(@empty_devlog)
|
161
165
|
File.new(@empty_devlog, 'w').puts('\n')
|
162
166
|
start_coding_session(@empty_devlog)
|
163
167
|
assert(File.readlines(@empty_devlog).grep(/CodingSession::BEGIN/).size>0, "should insert CodingSession::BEGIN at top of file")
|
164
168
|
assert(is_session_open(@empty_devlog)==true, "should be true, session should be open after starting")
|
165
|
-
prepend_string('+1h'
|
169
|
+
prepend_string(@empty_devlog, '+1h')
|
166
170
|
sleep(1)
|
167
171
|
stop_coding_session(@empty_devlog)
|
168
172
|
assert(File.readlines(@empty_devlog).grep(/CodingSession::END/).size>0, "should insert CodingSession::END at top of file")
|
@@ -177,14 +181,14 @@ class DevlogTest < Test::Unit::TestCase
|
|
177
181
|
end
|
178
182
|
|
179
183
|
def test_is_session_open
|
180
|
-
@closed_devlog = File.join(File.dirname(__FILE__),
|
184
|
+
@closed_devlog = File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_devlog.markdown')
|
181
185
|
assert(is_session_open(@closed_devlog)==false, "should be false, session should be closed")
|
182
|
-
@open_devlog = File.join(File.dirname(__FILE__),
|
186
|
+
@open_devlog = File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_open_devlog.markdown')
|
183
187
|
assert(is_session_open(@open_devlog)==true, "should be true, session should be open")
|
184
188
|
end
|
185
189
|
|
186
190
|
def test_devlog_export
|
187
|
-
@exported_devlog = export_devlog_now(File.join(File.dirname(__FILE__),
|
191
|
+
@exported_devlog = export_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_devlog_export.markdown'))
|
188
192
|
assert(File.exists?(@exported_devlog))
|
189
193
|
assert(File.size(@exported_devlog)>0, "file should not be empty")
|
190
194
|
File.open(@exported_devlog, "r") do |f|
|
@@ -200,4 +204,7 @@ class DevlogTest < Test::Unit::TestCase
|
|
200
204
|
File.delete(@exported_devlog) if File.exist?(@exported_devlog)
|
201
205
|
end
|
202
206
|
|
207
|
+
def test_default_devlog_file_setting
|
208
|
+
assert(devlog_file_setting == 'devlog.markdown', 'should return default')
|
209
|
+
end
|
203
210
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
devlog_file: "test/test_devlogs/test_devlog.markdown"
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/test/test_helper.rb
CHANGED
@@ -9,38 +9,41 @@ class Test::Unit::TestCase
|
|
9
9
|
include Devlog
|
10
10
|
end
|
11
11
|
|
12
|
+
TEST_FILES_PATH = 'test_devlogs'.freeze
|
13
|
+
TEMP_PATH = '../tmp'.freeze
|
14
|
+
|
12
15
|
def load_devlog
|
13
|
-
@tajm =
|
16
|
+
@tajm = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'devlog.markdown'))
|
14
17
|
puts "#{@tajm.coding_session_time} #{@tajm.com_session_time} #{@tajm.payed_time}"
|
15
|
-
assert(@tajm.coding_session_time>0, "
|
16
|
-
assert(@tajm.com_session_time>0, "
|
17
|
-
assert(@tajm.payed_time<0, "
|
18
|
+
assert(@tajm.coding_session_time>0, "truth love simplicity")
|
19
|
+
assert(@tajm.com_session_time>0, "selftalk")
|
20
|
+
assert(@tajm.payed_time<0, "selfpay")
|
18
21
|
end
|
19
22
|
|
20
23
|
def load_devlog_now
|
21
24
|
@tajm_now = parse_devlog_now(File.join(File.dirname(__FILE__), '..', 'devlog.markdown'))
|
22
25
|
puts "#{@tajm_now.coding_session_time} #{@tajm_now.com_session_time} #{@tajm_now.payed_time}"
|
23
|
-
assert(@tajm_now.coding_session_time>0, "
|
24
|
-
assert(@tajm_now.com_session_time>0, "
|
25
|
-
assert(@tajm_now.payed_time<0, "
|
26
|
+
assert(@tajm_now.coding_session_time>0, "truth love simplicity")
|
27
|
+
assert(@tajm_now.com_session_time>0, "selftalk")
|
28
|
+
assert(@tajm_now.payed_time<0, "selfpay")
|
26
29
|
end
|
27
30
|
|
28
31
|
def load_devlog_test
|
29
|
-
@tajm_test = parse_devlog_now(File.join(File.dirname(__FILE__),
|
32
|
+
@tajm_test = parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_devlog.markdown'))
|
30
33
|
puts "#{@tajm_test.coding_session_time} #{@tajm_test.com_session_time} #{@tajm_test.payed_time}"
|
31
|
-
assert(@tajm_test.coding_session_time>0, "
|
32
|
-
assert(@tajm_test.com_session_time>0, "
|
33
|
-
assert(@tajm_test.payed_time<0, "
|
34
|
+
assert(@tajm_test.coding_session_time>0, "truth love simplicity")
|
35
|
+
assert(@tajm_test.com_session_time>0, "selftalk")
|
36
|
+
assert(@tajm_test.payed_time<0, "selfpay")
|
34
37
|
end
|
35
38
|
|
36
39
|
def load_devlog_stat
|
37
|
-
@tajm_stat = parse_devlog_now(File.join(File.dirname(__FILE__),
|
40
|
+
@tajm_stat = parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_stats_devlog.markdown'))
|
38
41
|
end
|
39
42
|
|
40
43
|
def load_devlog_single
|
41
|
-
@tajm_single = parse_devlog_now(File.join(File.dirname(__FILE__),
|
44
|
+
@tajm_single = parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_single_devlog.markdown'))
|
42
45
|
end
|
43
46
|
|
44
47
|
def load_devlog_negative
|
45
|
-
@tajm_negative = parse_devlog_now(File.join(File.dirname(__FILE__),
|
48
|
+
@tajm_negative = parse_devlog_now(File.join(File.dirname(__FILE__), TEST_FILES_PATH, 'test_negative_devlog.markdown'))
|
46
49
|
end
|
data/tmp/.gitignore
ADDED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devlog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mihael
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: test-unit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.1'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: jeweler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -73,9 +73,8 @@ files:
|
|
73
73
|
- bin/devlog
|
74
74
|
- devlog.gemspec
|
75
75
|
- devlog.markdown
|
76
|
-
- empty_devlog.markdown
|
77
76
|
- lib/devlog.rb
|
78
|
-
-
|
77
|
+
- lib/devlog_settings.rb
|
79
78
|
- sublime_text/devlog.tmbundle/Snippets/begin.tmSnippet
|
80
79
|
- sublime_text/devlog.tmbundle/Snippets/combegin.tmSnippet
|
81
80
|
- sublime_text/devlog.tmbundle/Snippets/comend.tmSnippet
|
@@ -86,14 +85,21 @@ files:
|
|
86
85
|
- sublime_text/devlog.tmbundle/Snippets/tu.tmSnippet
|
87
86
|
- sublime_text/devlog.tmbundle/info.plist
|
88
87
|
- sublime_text/tu.py
|
88
|
+
- test/devlog_file_test.rb
|
89
|
+
- test/devlog_settings_test.rb
|
89
90
|
- test/devlog_test.rb
|
91
|
+
- test/test_devlogs/.devlog.yml
|
92
|
+
- test/test_devlogs/empty_devlog.markdown
|
93
|
+
- test/test_devlogs/test_devlog.markdown
|
94
|
+
- test/test_devlogs/test_devlog_export.markdown
|
95
|
+
- test/test_devlogs/test_invalid_date_devlog.markdown
|
96
|
+
- test/test_devlogs/test_negative_devlog.markdown
|
97
|
+
- test/test_devlogs/test_open_devlog.markdown
|
98
|
+
- test/test_devlogs/test_settings.yml
|
99
|
+
- test/test_devlogs/test_single_devlog.markdown
|
100
|
+
- test/test_devlogs/test_stats_devlog.markdown
|
90
101
|
- test/test_helper.rb
|
91
|
-
-
|
92
|
-
- test_devlog_export.markdown
|
93
|
-
- test_negative_devlog.markdown
|
94
|
-
- test_open_devlog.markdown
|
95
|
-
- test_single_devlog.markdown
|
96
|
-
- test_stats_devlog.markdown
|
102
|
+
- tmp/.gitignore
|
97
103
|
homepage: http://github.com/mihael/devlog
|
98
104
|
licenses:
|
99
105
|
- MIT
|
@@ -114,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
120
|
version: '0'
|
115
121
|
requirements: []
|
116
122
|
rubyforge_project:
|
117
|
-
rubygems_version: 2.5.
|
123
|
+
rubygems_version: 2.5.2
|
118
124
|
signing_key:
|
119
125
|
specification_version: 4
|
120
126
|
summary: takes devlog.markdown and gives info
|
data/sublime_text/.DS_Store
DELETED
Binary file
|