logbook-ruby 0.1.3 → 0.1.4
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/Guardfile +0 -2
- data/lib/logbook/builder.rb +1 -0
- data/lib/logbook/log_entry.rb +23 -0
- data/lib/logbook/page.rb +24 -2
- data/lib/logbook/parser.rb +14 -10
- data/lib/logbook/task.rb +9 -0
- data/lib/logbook/task_definition.rb +8 -0
- data/lib/logbook/task_entry.rb +20 -0
- data/lib/logbook.rb +4 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bf9e794073c670236e9601796efb0ac9260d2825f409034b3f246dbe65cb4b6
|
4
|
+
data.tar.gz: 88bd820e0f1d5a07fccb6a75161c9d1e751d3d582ed3574ebaa5bdba983da17f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f053d6ec96f78f6214449425e7e89d6f22f35095af529ea499d04ad261498cf52301b721b9a37812aba42e4c2071c49753232fbfc2eba0862508baa308d0e71
|
7
|
+
data.tar.gz: 7a9a11bc868752d1f3e50f59f0b5b99ec9b510f729710c85600f99b810cb490062e0bd2782d7828e32e8ad3f3ad0747c41d916a4aae2df2768de419f3c5d3d30
|
data/Guardfile
CHANGED
@@ -28,8 +28,6 @@ guard :rspec, cmd: "bundle exec rspec" do
|
|
28
28
|
require "guard/rspec/dsl"
|
29
29
|
dsl = Guard::RSpec::Dsl.new(self)
|
30
30
|
|
31
|
-
# Feel free to open issues for suggestions and improvements
|
32
|
-
|
33
31
|
# RSpec files
|
34
32
|
rspec = dsl.rspec
|
35
33
|
watch(rspec.spec_helper) { rspec.spec_dir }
|
data/lib/logbook/builder.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Logbook
|
2
|
+
class LogEntry < Struct.new(:line_number, :time, :note)
|
3
|
+
DATE_PROPERTY_NAME = "Date"
|
4
|
+
|
5
|
+
attr_accessor :properties
|
6
|
+
|
7
|
+
def recorded_at
|
8
|
+
date = self.properties[DATE_PROPERTY_NAME]
|
9
|
+
time = self.time
|
10
|
+
|
11
|
+
DateTime.parse(date + " " + time)
|
12
|
+
rescue ArgumentError
|
13
|
+
end
|
14
|
+
|
15
|
+
def starts_clock?
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def stops_clock?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/logbook/page.rb
CHANGED
@@ -7,11 +7,33 @@ module Logbook
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def add(entry)
|
10
|
-
entries
|
10
|
+
entries << entry
|
11
11
|
end
|
12
12
|
|
13
13
|
def entry_at(line_number)
|
14
|
-
entries.find { |entry| entry.line_number <= line_number }
|
14
|
+
entries.reverse.find { |entry| entry.line_number <= line_number }
|
15
|
+
end
|
16
|
+
|
17
|
+
def total_duration
|
18
|
+
_, duration = entries.inject([nil, Duration.new(0)]) do |(previous_entry, duration), current_entry|
|
19
|
+
if previous_entry && previous_entry.starts_clock?
|
20
|
+
if current_entry.stops_clock?
|
21
|
+
new_duration = Duration.new(duration.minutes + minutes_in_between(previous_entry, current_entry))
|
22
|
+
[current_entry, new_duration]
|
23
|
+
else
|
24
|
+
[previous_entry, duration]
|
25
|
+
end
|
26
|
+
else
|
27
|
+
[current_entry, duration]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
duration
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def minutes_in_between(previous_entry, current_entry)
|
36
|
+
(current_entry.recorded_at.to_time - previous_entry.recorded_at.to_time) / 60
|
15
37
|
end
|
16
38
|
end
|
17
39
|
end
|
data/lib/logbook/parser.rb
CHANGED
@@ -11,11 +11,19 @@ module Logbook
|
|
11
11
|
rule(:label) { match["a-zA-Z"] >> match["a-zA-Z0-9_-"].repeat }
|
12
12
|
|
13
13
|
rule(:property_value) { match("[^\\n\\]\\[]").repeat(1) }
|
14
|
-
rule(:property)
|
14
|
+
rule(:property) do
|
15
|
+
whitespace >> str("[") >> label.as(:name) >> str(":") >> whitespace >>
|
16
|
+
property_value.as(:value) >> str("]") >> whitespace >> newline.maybe
|
17
|
+
end
|
15
18
|
rule(:tag) { whitespace >> str("#") >> label.as(:tag) >> whitespace >> newline.maybe }
|
16
19
|
rule(:property_or_tag_list) { (property.as(:property) | tag).repeat }
|
17
20
|
|
18
|
-
rule(:
|
21
|
+
rule(:time_value) do
|
22
|
+
match["0-9"].repeat(2, 2) >> str(":") >> match["0-9"].repeat(2, 2)
|
23
|
+
end
|
24
|
+
rule(:time) do
|
25
|
+
str("[") >> time_value.as(:time) >> str("]")
|
26
|
+
end
|
19
27
|
rule(:status) { str("[") >> label.as(:status) >> str("]") }
|
20
28
|
rule(:title) { text.repeat }
|
21
29
|
|
@@ -26,18 +34,14 @@ module Logbook
|
|
26
34
|
|
27
35
|
rule(:task_definition) do
|
28
36
|
status >> whitespace >> title.as(:title) >> str("\n") >>
|
29
|
-
|
30
|
-
|
31
|
-
newline.repeat >>
|
32
|
-
note.as(:note)
|
37
|
+
newline.repeat >> property_or_tag_list.as(:properties) >>
|
38
|
+
newline.repeat >> note.as(:note)
|
33
39
|
end
|
34
40
|
|
35
41
|
rule(:task_entry) do
|
36
42
|
time >> whitespace >> status >> whitespace >> title.as(:title) >> str("\n") >>
|
37
|
-
|
38
|
-
|
39
|
-
newline.repeat >>
|
40
|
-
note.as(:note)
|
43
|
+
newline.repeat >> property_or_tag_list.as(:properties) >>
|
44
|
+
newline.repeat >> note.as(:note)
|
41
45
|
end
|
42
46
|
|
43
47
|
rule(:page) do
|
data/lib/logbook/task.rb
ADDED
data/lib/logbook/task_entry.rb
CHANGED
@@ -1,7 +1,27 @@
|
|
1
|
+
require "date"
|
2
|
+
|
1
3
|
module Logbook
|
2
4
|
class TaskEntry < Struct.new(:line_number, :time, :title, :status, :properties, :tags, :note)
|
5
|
+
DATE_PROPERTY_NAME = "Date"
|
6
|
+
|
3
7
|
def merge_page_properties(properties)
|
4
8
|
self.properties = properties.merge(self.properties)
|
5
9
|
end
|
10
|
+
|
11
|
+
def recorded_at
|
12
|
+
date = self.properties[DATE_PROPERTY_NAME]
|
13
|
+
time = self.time
|
14
|
+
|
15
|
+
DateTime.parse(date + " " + time)
|
16
|
+
rescue ArgumentError
|
17
|
+
end
|
18
|
+
|
19
|
+
def starts_clock?
|
20
|
+
[Task::START, Task::RESUME, Task::REOPEN].include?(self.status)
|
21
|
+
end
|
22
|
+
|
23
|
+
def stops_clock?
|
24
|
+
true
|
25
|
+
end
|
6
26
|
end
|
7
27
|
end
|
data/lib/logbook.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
module Logbook
|
2
|
-
VERSION = "0.1.
|
2
|
+
VERSION = "0.1.4"
|
3
3
|
|
4
4
|
require "logbook/builder"
|
5
5
|
require "logbook/page"
|
6
6
|
require "logbook/parser"
|
7
|
+
require "logbook/log_entry"
|
8
|
+
require "logbook/task"
|
7
9
|
require "logbook/task_definition"
|
8
10
|
require "logbook/task_entry"
|
9
11
|
|
12
|
+
Duration = Struct.new(:minutes)
|
10
13
|
Property = Struct.new(:name, :value)
|
11
14
|
Tag = Struct.new(:value)
|
12
|
-
|
13
|
-
LogEntry = Struct.new(:line_number, :time, :note)
|
14
15
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logbook-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Malkas
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,8 +114,10 @@ files:
|
|
114
114
|
- bin/setup
|
115
115
|
- lib/logbook.rb
|
116
116
|
- lib/logbook/builder.rb
|
117
|
+
- lib/logbook/log_entry.rb
|
117
118
|
- lib/logbook/page.rb
|
118
119
|
- lib/logbook/parser.rb
|
120
|
+
- lib/logbook/task.rb
|
119
121
|
- lib/logbook/task_definition.rb
|
120
122
|
- lib/logbook/task_entry.rb
|
121
123
|
- logbook-ruby.gemspec
|