tempo-cli 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/tempo +5 -0
- data/lib/tempo/controllers/report_controller.rb +1 -1
- data/lib/tempo/controllers/update_controller.rb +3 -2
- data/lib/tempo/version.rb +1 -1
- data/lib/tempo/views/base.rb +5 -0
- data/lib/tempo/views/formatters/base.rb +26 -4
- data/lib/tempo/views/formatters/screen.rb +12 -2
- data/lib/tempo/views/report_view.rb +42 -3
- data/lib/tempo/views/reporter.rb +2 -2
- data/lib/tempo/views/time_record_view.rb +3 -2
- data/lib/tempo/views/view_records/base.rb +8 -2
- data/lib/tempo/views/view_records/container.rb +68 -0
- data/test/lib/tempo/views/formatters/screen_test.rb +20 -11
- data/test/lib/tempo/views/view_records/base_test.rb +7 -1
- data/test/lib/tempo/views/view_records/container_test.rb +47 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59fac2395c13e4a0a58701053e5ed9696146bb44
|
4
|
+
data.tar.gz: 42df9a9ed12b2a50771cd0b9e64500f346bacef7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 26a42ed193477f0dde232ef0209d70899d1fdc1b338e27779c5714d73f1f6b8499db8d1de0f0f81955783067f97ed2b533d336f61aafd3f11a016a18a3fa26d5
|
7
|
+
data.tar.gz: 77f7093821bd7a097f7cc7df90a7ea4426ff81acf10c776e3799af78a2ec6315744a82eb4e5ffedc7c556d76a32ea65c55bc64096afcfaaff8d5581e5db50d84
|
data/bin/tempo
CHANGED
@@ -377,6 +377,11 @@ command [:report, :r] do |c|
|
|
377
377
|
c.default_value 'today'
|
378
378
|
c.flag [:t, :to]
|
379
379
|
|
380
|
+
c.desc 'order reports by date or project'
|
381
|
+
c.arg_name '[project, date]'
|
382
|
+
c.default_value 'date'
|
383
|
+
c.flag [:o, :order]
|
384
|
+
|
380
385
|
c.action do |global_options, options, args|
|
381
386
|
controller = Tempo::Controllers::Report
|
382
387
|
|
@@ -43,7 +43,9 @@ module Tempo
|
|
43
43
|
record = @time_records.find_by_id( options[:id], day )
|
44
44
|
return Views.no_match_error( "time record on #{day.strftime('%m/%d/%Y')}", "id = #{options[:id]}", false ) if !record
|
45
45
|
else
|
46
|
-
|
46
|
+
# TODO: this will still not pick the days last entry
|
47
|
+
# by time if ids are out of order and none are running.
|
48
|
+
record = @time_records.current || @time_records.index.last
|
47
49
|
return Views.no_items( "time records on #{day.strftime('%m/%d/%Y')}", :error ) if ! record
|
48
50
|
end
|
49
51
|
|
@@ -66,7 +68,6 @@ module Tempo
|
|
66
68
|
if options[:start]
|
67
69
|
start_time = Time.parse options[:start]
|
68
70
|
return Views.no_match_error( "valid timeframe", options[:at], false ) if start_time.nil?
|
69
|
-
|
70
71
|
if record.valid_start_time? start_time
|
71
72
|
record.start_time = start_time
|
72
73
|
|
data/lib/tempo/version.rb
CHANGED
data/lib/tempo/views/base.rb
CHANGED
@@ -22,10 +22,15 @@ module Tempo
|
|
22
22
|
view_opts[:tags] = options[:tag] || options[:untag] ? true : false
|
23
23
|
view_opts[:id] = global_options[:id] || options[:id] ? true : false
|
24
24
|
end
|
25
|
+
when :report, :r
|
26
|
+
if /^p(roject)?$/.match(options[:order]) && ! global_options[:verbose]
|
27
|
+
view_opts[:bullet_report] = true
|
28
|
+
end
|
25
29
|
end
|
26
30
|
Tempo::Views::Reporter.add_options view_opts
|
27
31
|
end
|
28
32
|
|
33
|
+
# called in the preblock when verbose = true
|
29
34
|
def options_report(command, global_options, options, args)
|
30
35
|
globals_list = "global options: "
|
31
36
|
global_options.each {|k,v| globals_list += "#{k} = #{v}, " if k.kind_of? String and k.length > 1 and !v.nil? }
|
@@ -13,16 +13,38 @@ module Tempo
|
|
13
13
|
|
14
14
|
class Base
|
15
15
|
|
16
|
+
def initialize(options={})
|
17
|
+
@options = options
|
18
|
+
end
|
19
|
+
|
20
|
+
def report(record)
|
21
|
+
class_block = "#{record.type}_block"
|
22
|
+
|
23
|
+
# We handle containers separately
|
24
|
+
if /container/.match class_block
|
25
|
+
format_records_container(record)
|
26
|
+
else
|
27
|
+
send(class_block, record) if respond_to? class_block
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
16
31
|
# Here we check if our class methods include a proc block to handle the particular
|
17
32
|
# record type. See View Records for all possible record types. See screen formatter
|
18
33
|
# for examples of proc blocks.
|
19
34
|
#
|
20
|
-
def format_records(records
|
21
|
-
@options = options
|
35
|
+
def format_records(records)
|
22
36
|
records.each do |record|
|
23
|
-
|
24
|
-
|
37
|
+
report record
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Records containers handle nested records
|
42
|
+
def format_records_container(container)
|
43
|
+
report container.pre if container.pre
|
44
|
+
container.records.each do |record|
|
45
|
+
report record
|
25
46
|
end
|
47
|
+
report container.post if container.post
|
26
48
|
end
|
27
49
|
end
|
28
50
|
end
|
@@ -31,6 +31,8 @@ module Tempo
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
# PARTIALS --------------------------------------------------------------------/
|
35
|
+
|
34
36
|
# spacer for project titles, active project marked with *
|
35
37
|
def active_indicator(project)
|
36
38
|
indicator = project.current ? "* " : " "
|
@@ -54,6 +56,9 @@ module Tempo
|
|
54
56
|
@options[:id] ? "[#{id}] ".rjust(6, ' ') : ""
|
55
57
|
end
|
56
58
|
|
59
|
+
# PARTIALS --------------------------------------------------------------------/
|
60
|
+
|
61
|
+
|
57
62
|
def project_block(record)
|
58
63
|
|
59
64
|
record.format do |r|
|
@@ -72,11 +77,16 @@ module Tempo
|
|
72
77
|
end
|
73
78
|
|
74
79
|
def timerecord_block(record)
|
80
|
+
#require 'pry'; binding.pry
|
75
81
|
record.format do |r|
|
76
82
|
id = id_partial r.id
|
77
83
|
running = r.running ? "*" : " "
|
78
|
-
|
79
|
-
|
84
|
+
if @options[:bullet_report]
|
85
|
+
view = " * #{r.description}"
|
86
|
+
else
|
87
|
+
description = r.description.empty? ? "#{r.project}" : "#{r.project}: #{r.description}"
|
88
|
+
view = "#{id}#{r.start_time.strftime('%H:%M')} - #{r.end_time.strftime('%H:%M')}#{running} [#{r.duration.format}] #{description}"
|
89
|
+
end
|
80
90
|
puts view
|
81
91
|
end
|
82
92
|
end
|
@@ -4,20 +4,59 @@ module Tempo
|
|
4
4
|
|
5
5
|
def report_records_view(options={})
|
6
6
|
|
7
|
+
# Haven't we already checked for this?
|
7
8
|
projects = options.fetch(:projects, Tempo::Model::Project.index)
|
8
9
|
return no_items("projects") if projects.empty?
|
9
10
|
|
11
|
+
# TODO: Document here days index structure, give example of sending in subsets
|
12
|
+
# so the Records Controller can manage the organization of the records.
|
10
13
|
time_records = options.fetch( :time_records, Tempo::Model::TimeRecord.days_index )
|
14
|
+
|
15
|
+
# It this going to break if 1 of X record containers is empty?
|
16
|
+
# Or should the controller not send empty records and this is good to check for?
|
17
|
+
# Maybe No time records for <date>?
|
11
18
|
return no_items("time records") if time_records.empty?
|
12
19
|
|
20
|
+
if options[:order] == "date" || options[:order] == "d"
|
21
|
+
order_by_date time_records
|
22
|
+
elsif options[:order] == "project" || options[:order] == "p"
|
23
|
+
order_by_project projects, time_records
|
24
|
+
else
|
25
|
+
return error "Unable to report time records sorted by '#{options[:order]}'"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def order_by_date(time_records)
|
13
32
|
time_records.each do |d_id, days_record|
|
14
33
|
|
15
34
|
day = Tempo::Model::TimeRecord.day_id_to_time d_id
|
16
|
-
|
17
|
-
ViewRecords::
|
35
|
+
|
36
|
+
container = ViewRecords::TimeRecordContainer.new
|
37
|
+
container.pre = ViewRecords::Message.new day.strftime("Records for %m/%d/%Y:\n\n"), postpone: true
|
18
38
|
|
19
39
|
days_record.each do |time_record|
|
20
|
-
time_record_view time_record
|
40
|
+
container.add(time_record_view time_record, postpone: true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def order_by_project(projects, time_records)
|
46
|
+
project_records = Hash.new {|this_hash, nonexistent_key| this_hash[nonexistent_key] = [] }
|
47
|
+
time_records.each do |d_id, days_records|
|
48
|
+
days_records.each do |days_record|
|
49
|
+
# TODO: if project in projects (for filtering)
|
50
|
+
project_records[days_record.project] << days_record
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
project_records.each do |pr,time_records|
|
55
|
+
container = ViewRecords::TimeRecordContainer.new
|
56
|
+
#require 'pry'; binding.pry
|
57
|
+
container.pre = ViewRecords::Message.new "Records for #{Model::Project.find_by_id(pr).title}\n", postpone: true
|
58
|
+
time_records.each do |time_record|
|
59
|
+
container.add(time_record_view time_record, postpone: true)
|
21
60
|
end
|
22
61
|
end
|
23
62
|
end
|
data/lib/tempo/views/reporter.rb
CHANGED
@@ -61,8 +61,8 @@ module Tempo
|
|
61
61
|
|
62
62
|
def report
|
63
63
|
# TODO send records to added formatters
|
64
|
-
screen_formatter = Formatters::Screen.new
|
65
|
-
screen_formatter.format_records view_records
|
64
|
+
screen_formatter = Formatters::Screen.new(options)
|
65
|
+
screen_formatter.format_records view_records
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
@@ -2,8 +2,9 @@ module Tempo
|
|
2
2
|
module Views
|
3
3
|
class << self
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
# Container sends postpone: true through options
|
6
|
+
def time_record_view(time_record, options={})
|
7
|
+
ViewRecords::TimeRecord.new time_record, options
|
7
8
|
end
|
8
9
|
|
9
10
|
def start_time_record_view(time_record)
|
@@ -27,6 +27,9 @@ module Tempo
|
|
27
27
|
# category :error will raise an error after all viewRecords
|
28
28
|
# have been run through the reporters
|
29
29
|
#
|
30
|
+
# Containers send :pospone => true in options in order to manage
|
31
|
+
# triggering the message themselves
|
32
|
+
#
|
30
33
|
class Message
|
31
34
|
attr_accessor :type, :message, :category
|
32
35
|
|
@@ -34,7 +37,7 @@ module Tempo
|
|
34
37
|
@message = message
|
35
38
|
@category = options.fetch( :category, :info )
|
36
39
|
@type = "message"
|
37
|
-
Reporter.add_view_record self
|
40
|
+
Reporter.add_view_record self unless options[:postpone]
|
38
41
|
end
|
39
42
|
|
40
43
|
def format(&block)
|
@@ -93,6 +96,9 @@ module Tempo
|
|
93
96
|
# tempo model without error, but most likely won't be as useful as a child class
|
94
97
|
# taylored to the specifics of the actual model's child class.
|
95
98
|
#
|
99
|
+
# Containers send :pospone => true in options in order to manage
|
100
|
+
# triggering the message themselves
|
101
|
+
#
|
96
102
|
class Model
|
97
103
|
attr_accessor :id, :type
|
98
104
|
|
@@ -101,7 +107,7 @@ module Tempo
|
|
101
107
|
|
102
108
|
# example: Tempo::Model::Something => "something"
|
103
109
|
@type = /Tempo::Model::(.*)$/.match( model.class.to_s )[1].downcase
|
104
|
-
Reporter.add_view_record self
|
110
|
+
Reporter.add_view_record self unless options[:postpone]
|
105
111
|
end
|
106
112
|
|
107
113
|
def format(&block)
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Wrapper object for ViewRecords, able to collect multiple viewrecords
|
2
|
+
# this allows for a begining and end record, collecting total duration, etc.
|
3
|
+
|
4
|
+
# @pre = Optional record which is sent to the formatter before the collection
|
5
|
+
# @post = Optionsal record which is sent to the formatter after the collection
|
6
|
+
module Tempo
|
7
|
+
module Views
|
8
|
+
module ViewRecords
|
9
|
+
|
10
|
+
class Container
|
11
|
+
attr_accessor :type, :pre, :post
|
12
|
+
|
13
|
+
def initialize(options={})
|
14
|
+
# TODO: add error checking for pre and post, better handling nil values
|
15
|
+
@pre = options.fetch( :pre, nil )
|
16
|
+
@post = options.fetch( :post, nil )
|
17
|
+
@type = "container"
|
18
|
+
@collection = [] # handle records on init?
|
19
|
+
Reporter.add_view_record self unless options[:postpone]
|
20
|
+
end
|
21
|
+
|
22
|
+
# add a splat?
|
23
|
+
def add(record)
|
24
|
+
@collection << record
|
25
|
+
end
|
26
|
+
|
27
|
+
#TODO: Implement pre and post method with logic to handle both
|
28
|
+
# views reocrds and strings. See post in TimeRecordContainer
|
29
|
+
# for use case
|
30
|
+
|
31
|
+
def records
|
32
|
+
@collection
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
module Tempo
|
41
|
+
module Views
|
42
|
+
module ViewRecords
|
43
|
+
|
44
|
+
# Handle a collection of time records
|
45
|
+
# Pre can hold the title of the collection (date, project, etc.)
|
46
|
+
# postreturns the total duration of all contained records
|
47
|
+
class TimeRecordContainer < ViewRecords::Container
|
48
|
+
attr_accessor :duration
|
49
|
+
|
50
|
+
def initialize(options={})
|
51
|
+
super options
|
52
|
+
@type = "time_record_container"
|
53
|
+
@duration = Duration.new
|
54
|
+
end
|
55
|
+
|
56
|
+
def add(record)
|
57
|
+
# TODO: fail if not a time record
|
58
|
+
super record
|
59
|
+
@duration.add record.duration.total
|
60
|
+
end
|
61
|
+
|
62
|
+
def post
|
63
|
+
ViewRecords::Message.new "Total: ------- [#{duration.format}] --------------------------------\n\n", postpone: true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -7,20 +7,21 @@ describe Tempo do
|
|
7
7
|
|
8
8
|
before do
|
9
9
|
view_records_factory
|
10
|
-
@formatter = Tempo::Views::Formatters::Screen.new
|
11
10
|
end
|
12
11
|
|
13
12
|
describe "Message View Records" do
|
14
13
|
|
15
14
|
it "outputs the message" do
|
16
15
|
records = [@message_1, @message_2]
|
17
|
-
|
16
|
+
formatter = Tempo::Views::Formatters::Screen.new
|
17
|
+
out = capture_stdout { formatter.format_records records }
|
18
18
|
|
19
19
|
assert_equal "All The Things I Did\non a busy busy day\n", out.string
|
20
20
|
end
|
21
21
|
|
22
22
|
it "raises an error when type error" do
|
23
|
-
|
23
|
+
formatter = Tempo::Views::Formatters::Screen.new
|
24
|
+
proc { formatter.format_records [@error] }.must_raise RuntimeError
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -28,7 +29,8 @@ describe Tempo do
|
|
28
29
|
|
29
30
|
it "outputs the duration" do
|
30
31
|
records = [@duration]
|
31
|
-
|
32
|
+
formatter = Tempo::Views::Formatters::Screen.new
|
33
|
+
out = capture_stdout { formatter.format_records records }
|
32
34
|
|
33
35
|
assert_equal "2:40\n", out.string
|
34
36
|
end
|
@@ -38,14 +40,16 @@ describe Tempo do
|
|
38
40
|
|
39
41
|
it "outputs the project title" do
|
40
42
|
records = [@project_1]
|
41
|
-
|
43
|
+
formatter = Tempo::Views::Formatters::Screen.new
|
44
|
+
out = capture_stdout { formatter.format_records records }
|
42
45
|
|
43
46
|
assert_equal "sheep herding\n", out.string
|
44
47
|
end
|
45
48
|
|
46
49
|
it "accepts option to include tags with spacing" do
|
47
50
|
records = [@project_1, @project_2]
|
48
|
-
|
51
|
+
formatter = Tempo::Views::Formatters::Screen.new tags: true
|
52
|
+
out = capture_stdout { formatter.format_records records }
|
49
53
|
|
50
54
|
assert_equal "sheep herding tags: none\n" +
|
51
55
|
"horticulture - basement mushrooms tags: [farming, fungi]\n", out.string
|
@@ -53,7 +57,8 @@ describe Tempo do
|
|
53
57
|
|
54
58
|
it "accepts option to include id" do
|
55
59
|
records = [@project_2]
|
56
|
-
|
60
|
+
formatter = Tempo::Views::Formatters::Screen.new id: true
|
61
|
+
out = capture_stdout { formatter.format_records records }
|
57
62
|
|
58
63
|
assert_equal " [2] horticulture - basement mushrooms\n", out.string
|
59
64
|
end
|
@@ -61,14 +66,16 @@ describe Tempo do
|
|
61
66
|
it "accepts option to indent projects to proper depth" do
|
62
67
|
@project_1.depth = 3
|
63
68
|
records = [@project_1]
|
64
|
-
|
69
|
+
formatter = Tempo::Views::Formatters::Screen.new depth: true
|
70
|
+
out = capture_stdout { formatter.format_records records}
|
65
71
|
|
66
72
|
assert_equal " sheep herding\n", out.string
|
67
73
|
end
|
68
74
|
|
69
75
|
it "indicates active project" do
|
70
76
|
records = [@project_1, @project_2]
|
71
|
-
|
77
|
+
formatter = Tempo::Views::Formatters::Screen.new active: true
|
78
|
+
out = capture_stdout { formatter.format_records records }
|
72
79
|
assert_equal " sheep herding\n* horticulture - basement mushrooms\n", out.string
|
73
80
|
end
|
74
81
|
end
|
@@ -76,14 +83,16 @@ describe Tempo do
|
|
76
83
|
describe "TimeRecord View Records" do
|
77
84
|
it "has start/end time, duration, project and description" do
|
78
85
|
records = [@time_record_1]
|
79
|
-
|
86
|
+
formatter = Tempo::Views::Formatters::Screen.new
|
87
|
+
out = capture_stdout { formatter.format_records records }
|
80
88
|
|
81
89
|
assert_equal "07:00 - 07:30 [0:30] sheep herding: day 1 pet the sheep\n", out.string
|
82
90
|
end
|
83
91
|
|
84
92
|
it "outputs a running indicator" do
|
85
93
|
records = [@time_record_6]
|
86
|
-
|
94
|
+
formatter = Tempo::Views::Formatters::Screen.new
|
95
|
+
out = capture_stdout { formatter.format_records records }
|
87
96
|
|
88
97
|
assert_match /17:00 - \d{2}:\d{2}\*/, out.string
|
89
98
|
end
|
@@ -26,6 +26,12 @@ describe Tempo do
|
|
26
26
|
record = Tempo::Views::ViewRecords::Message.new "a message view record"
|
27
27
|
Tempo::Views::Reporter.view_records.length.must_equal length_before + 1
|
28
28
|
end
|
29
|
+
|
30
|
+
it "doesn't add itself with options postpone" do
|
31
|
+
length_before = Tempo::Views::Reporter.view_records.length
|
32
|
+
record = Tempo::Views::ViewRecords::Message.new "a message view record", postpone: true
|
33
|
+
Tempo::Views::Reporter.view_records.length.must_equal length_before
|
34
|
+
end
|
29
35
|
end
|
30
36
|
|
31
37
|
describe "Duration" do
|
@@ -74,4 +80,4 @@ describe Tempo do
|
|
74
80
|
end
|
75
81
|
end
|
76
82
|
end
|
77
|
-
end
|
83
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
describe Tempo do
|
4
|
+
describe "Views" do
|
5
|
+
describe "ViewRecords" do
|
6
|
+
|
7
|
+
describe "Container" do
|
8
|
+
|
9
|
+
it "has a type, pre,and post attribute" do
|
10
|
+
pre = Tempo::Views::ViewRecords::Message.new "pre message"
|
11
|
+
post = Tempo::Views::ViewRecords::Message.new "post message"
|
12
|
+
container = Tempo::Views::ViewRecords::Container.new pre: pre, post: post
|
13
|
+
container.type.must_equal "container"
|
14
|
+
container.pre.message.must_equal "pre message"
|
15
|
+
container.post.message.must_equal "post message"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "has adds and contains a collection of view records" do
|
19
|
+
container = Tempo::Views::ViewRecords::Container.new
|
20
|
+
m1 = Tempo::Views::ViewRecords::Message.new "first message", postpone: true
|
21
|
+
m2 = Tempo::Views::ViewRecords::Message.new "second message", postpone: true
|
22
|
+
m3 = Tempo::Views::ViewRecords::Message.new "third message", postpone: true
|
23
|
+
[m1, m2, m3].each { |m| container.add m }
|
24
|
+
container.records.must_equal [m1,m2,m3]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "adds itself to the Reporter" do
|
28
|
+
length_before = Tempo::Views::Reporter.view_records.length
|
29
|
+
record = Tempo::Views::ViewRecords::Container.new
|
30
|
+
Tempo::Views::Reporter.view_records.length.must_equal length_before + 1
|
31
|
+
end
|
32
|
+
|
33
|
+
it "doesn't add itself with options postpone" do
|
34
|
+
length_before = Tempo::Views::Reporter.view_records.length
|
35
|
+
record = Tempo::Views::ViewRecords::Message.new "a message view record", postpone: true
|
36
|
+
Tempo::Views::Reporter.view_records.length.must_equal length_before
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "TimeRecordContainer" do
|
41
|
+
# TODO: Write ViewRecord Time Record tests first
|
42
|
+
# then add time records to a time records container
|
43
|
+
# test the total time is accurate
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tempo-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Gabel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- lib/tempo/views/time_record_view.rb
|
166
166
|
- lib/tempo/views/view_records/base.rb
|
167
167
|
- lib/tempo/views/view_records/composite.rb
|
168
|
+
- lib/tempo/views/view_records/container.rb
|
168
169
|
- lib/tempo/views/view_records/log.rb
|
169
170
|
- lib/tempo/views/view_records/project.rb
|
170
171
|
- lib/tempo/views/view_records/time_record.rb
|
@@ -186,6 +187,7 @@ files:
|
|
186
187
|
- test/lib/tempo/views/reporter_test.rb
|
187
188
|
- test/lib/tempo/views/view_records/base_test.rb
|
188
189
|
- test/lib/tempo/views/view_records/composite_test.rb
|
190
|
+
- test/lib/tempo/views/view_records/container_test.rb
|
189
191
|
- test/lib/tempo/views/view_records/log_test.rb
|
190
192
|
- test/lib/tempo/views/view_records/project_test.rb
|
191
193
|
- test/lib/tempo/views/view_records/time_record_test.rb
|