logbook-ruby 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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