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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22484a3be0fb4cd2f9fe9a65e3cbcc6ce6d684d50ca2c564f5a596902845b6d4
4
- data.tar.gz: 576504fd44a95ff28812db23766035b6eefb9176419ba53573faeefef0313ec8
3
+ metadata.gz: 4bf9e794073c670236e9601796efb0ac9260d2825f409034b3f246dbe65cb4b6
4
+ data.tar.gz: 88bd820e0f1d5a07fccb6a75161c9d1e751d3d582ed3574ebaa5bdba983da17f
5
5
  SHA512:
6
- metadata.gz: 6078139e9177245c0eab5dbad8c5b8fe5d4ce3f09217e0d92ff96a1b39ea6d9df428670d4d40c72217eb72a3aec310b3b8b155f3b7e447b01c9d3ca414e03622
7
- data.tar.gz: 2a1bd31a73c1d826a576f0c8cc1a944d125fe66143e8198897f5ae8098d50142ce101399fddb8adf6a07c16fa545f22a9e5989e72f52ca1f8661562192208389
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 }
@@ -47,6 +47,7 @@ module Logbook
47
47
  page.add(entry_or_property)
48
48
  page
49
49
  when LogEntry
50
+ entry_or_property.properties = current_properties.dup
50
51
  page.add(entry_or_property)
51
52
  page
52
53
  else
@@ -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.unshift(entry)
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
@@ -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) { whitespace >> str("[") >> label.as(:name) >> str(":") >> whitespace >> property_value.as(:value) >> str("]") >> whitespace >> newline.maybe }
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(:time) { str("[") >> (match["0-9"].repeat(2, 2) >> str(":") >> match["0-9"].repeat(2, 2)).as(:time) >> str("]") }
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
- newline.repeat >>
30
- property_or_tag_list.as(:properties) >>
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
- newline.repeat >>
38
- property_or_tag_list.as(:properties) >>
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
@@ -0,0 +1,9 @@
1
+ module Logbook
2
+ class Task
3
+ DONE = "Done"
4
+ PAUSE = "Pause"
5
+ REOPEN = "Reopen"
6
+ RESUME = "Resume"
7
+ START = "Start"
8
+ end
9
+ end
@@ -3,5 +3,13 @@ module Logbook
3
3
  def merge_page_properties(properties)
4
4
  self.properties = properties.merge(self.properties)
5
5
  end
6
+
7
+ def starts_clock?
8
+ false
9
+ end
10
+
11
+ def stops_clock?
12
+ false
13
+ end
6
14
  end
7
15
  end
@@ -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.3"
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.3
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-21 00:00:00.000000000 Z
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