tempo-cli 0.1.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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +56 -0
- data/README.md +326 -0
- data/Rakefile +65 -0
- data/bin/tempo +477 -0
- data/features/arrange.feature +43 -0
- data/features/checkout.feature +63 -0
- data/features/end.feature +65 -0
- data/features/project.feature +246 -0
- data/features/report.feature +62 -0
- data/features/start.feature +87 -0
- data/features/step_definitions/tempo_steps.rb +138 -0
- data/features/support/env.rb +26 -0
- data/features/tempo.feature +13 -0
- data/features/update.feature +69 -0
- data/lib/file_record/directory.rb +11 -0
- data/lib/file_record/directory_structure/tempo/README.txt +4 -0
- data/lib/file_record/directory_structure/tempo/tempo_projects.yaml +6 -0
- data/lib/file_record/record.rb +120 -0
- data/lib/tempo/controllers/arrange_controller.rb +52 -0
- data/lib/tempo/controllers/base.rb +117 -0
- data/lib/tempo/controllers/checkout_controller.rb +42 -0
- data/lib/tempo/controllers/end_controller.rb +42 -0
- data/lib/tempo/controllers/projects_controller.rb +107 -0
- data/lib/tempo/controllers/records_controller.rb +21 -0
- data/lib/tempo/controllers/report_controller.rb +55 -0
- data/lib/tempo/controllers/start_controller.rb +42 -0
- data/lib/tempo/controllers/update_controller.rb +78 -0
- data/lib/tempo/models/base.rb +176 -0
- data/lib/tempo/models/composite.rb +71 -0
- data/lib/tempo/models/log.rb +194 -0
- data/lib/tempo/models/project.rb +73 -0
- data/lib/tempo/models/time_record.rb +235 -0
- data/lib/tempo/version.rb +3 -0
- data/lib/tempo/views/arrange_view.rb +27 -0
- data/lib/tempo/views/base.rb +82 -0
- data/lib/tempo/views/formatters/base.rb +30 -0
- data/lib/tempo/views/formatters/screen.rb +86 -0
- data/lib/tempo/views/projects_view.rb +82 -0
- data/lib/tempo/views/report_view.rb +26 -0
- data/lib/tempo/views/reporter.rb +70 -0
- data/lib/tempo/views/time_record_view.rb +30 -0
- data/lib/tempo/views/view_records/base.rb +117 -0
- data/lib/tempo/views/view_records/composite.rb +40 -0
- data/lib/tempo/views/view_records/log.rb +28 -0
- data/lib/tempo/views/view_records/project.rb +32 -0
- data/lib/tempo/views/view_records/time_record.rb +48 -0
- data/lib/tempo.rb +26 -0
- data/lib/time_utilities.rb +30 -0
- data/tempo-cli.gemspec +26 -0
- data/test/lib/file_record/directory_test.rb +30 -0
- data/test/lib/file_record/record_test.rb +106 -0
- data/test/lib/tempo/controllers/base_controller_test.rb +60 -0
- data/test/lib/tempo/controllers/project_controller_test.rb +24 -0
- data/test/lib/tempo/models/base_test.rb +173 -0
- data/test/lib/tempo/models/composite_test.rb +76 -0
- data/test/lib/tempo/models/log_test.rb +171 -0
- data/test/lib/tempo/models/project_test.rb +105 -0
- data/test/lib/tempo/models/time_record_test.rb +212 -0
- data/test/lib/tempo/views/base_test.rb +31 -0
- data/test/lib/tempo/views/formatters/base_test.rb +13 -0
- data/test/lib/tempo/views/formatters/screen_test.rb +94 -0
- data/test/lib/tempo/views/reporter_test.rb +40 -0
- data/test/lib/tempo/views/view_records/base_test.rb +77 -0
- data/test/lib/tempo/views/view_records/composite_test.rb +57 -0
- data/test/lib/tempo/views/view_records/log_test.rb +28 -0
- data/test/lib/tempo/views/view_records/project_test.rb +0 -0
- data/test/lib/tempo/views/view_records/time_record_test.rb +0 -0
- data/test/support/factories.rb +177 -0
- data/test/support/helpers.rb +69 -0
- data/test/test_helper.rb +31 -0
- metadata +230 -0
@@ -0,0 +1,177 @@
|
|
1
|
+
module Tempo
|
2
|
+
module Model
|
3
|
+
class Base
|
4
|
+
def self.clear_all()
|
5
|
+
@ids = []
|
6
|
+
@index = []
|
7
|
+
@id_counter = 1
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Animal < Tempo::Model::Base
|
12
|
+
attr_accessor :genious, :species
|
13
|
+
|
14
|
+
def initialize( options={} )
|
15
|
+
super options
|
16
|
+
@genious = options[:genious]
|
17
|
+
@species = options.fetch(:species, @genious)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Tree < Tempo::Model::Composite
|
22
|
+
attr_accessor :position
|
23
|
+
|
24
|
+
def initialize( options={})
|
25
|
+
super options
|
26
|
+
@position = options[:position]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Log
|
31
|
+
def self.clear_all()
|
32
|
+
@ids = {}
|
33
|
+
@index = []
|
34
|
+
@days_index = {}
|
35
|
+
@id_counter = {}
|
36
|
+
@current = nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class MessageLog < Tempo::Model::Log
|
41
|
+
attr_accessor :message
|
42
|
+
|
43
|
+
def initialize( options={} )
|
44
|
+
super options
|
45
|
+
@message = options[:message]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def pantherinae_factory
|
53
|
+
Tempo::Model::Animal.clear_all
|
54
|
+
pantherinae = [ { genious: "Panthera", species: "p. tigris" },
|
55
|
+
{ genious: "Panthera", species: "p. leo"},
|
56
|
+
{ genious: "Panthera", species: "p. onca"},
|
57
|
+
{ genious: "Panthera", species: "p. pardus"},
|
58
|
+
{ genious: "Panthera", species: "p. zdanskyi"}]
|
59
|
+
|
60
|
+
pantherinae.each do |p|
|
61
|
+
Tempo::Model::Animal.new(p)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def frog_factory
|
66
|
+
Tempo::Model::Animal.clear_all
|
67
|
+
@gray_tree_frog = Tempo::Model::Animal.new( { genious: "hyla", species: "h. versicolor" } )
|
68
|
+
@copes_gray_tree_frog = Tempo::Model::Animal.new( { genious: "hyla", species: "h. chrysoscelis"})
|
69
|
+
@pine_barrens_tree_frog = Tempo::Model::Animal.new( { genious: "hyla", species: "h. andersonii", id: 4 } )
|
70
|
+
@bird_voiced_tree_frog = Tempo::Model::Animal.new( { genious: "hyla", species: "h. avivoca"} )
|
71
|
+
@chinese_tree_frog = Tempo::Model::Animal.new( { genious: "hyla", species: "h. chinensis"} )
|
72
|
+
end
|
73
|
+
|
74
|
+
def tree_factory
|
75
|
+
Tempo::Model::Tree.clear_all
|
76
|
+
@forest = []
|
77
|
+
|
78
|
+
trees = [{ position: "root1"},
|
79
|
+
{ position: "root2"},
|
80
|
+
{ position: "branch1"},
|
81
|
+
{ position: "branch2"},
|
82
|
+
{ position: "branch3"},
|
83
|
+
{ position: "branch4"},
|
84
|
+
{ position: "leaf1"},
|
85
|
+
{ position: "leaf2"}]
|
86
|
+
trees.each do |t|
|
87
|
+
@forest << Tempo::Model::Tree.new(t)
|
88
|
+
end
|
89
|
+
|
90
|
+
@forest[0] << @forest[2]
|
91
|
+
@forest[2] << @forest[6]
|
92
|
+
@forest[2] << @forest[7]
|
93
|
+
@forest[1] << @forest[3]
|
94
|
+
@forest[1] << @forest[4]
|
95
|
+
@forest[4] << @forest[5]
|
96
|
+
end
|
97
|
+
|
98
|
+
def project_factory
|
99
|
+
Tempo::Model::Project.clear_all
|
100
|
+
@project_1 = Tempo::Model::Project.new title: 'sheep herding'
|
101
|
+
@project_2 = Tempo::Model::Project.new({ title: 'horticulture - basement mushrooms', tags: [ "fungi", "farming" ], current: true})
|
102
|
+
@project_3 = Tempo::Model::Project.new({ title: 'horticulture - backyard bonsai', tags: [ "trees", "farming", "miniaturization" ]})
|
103
|
+
@project_4 = Tempo::Model::Project.new title: 'gardening'
|
104
|
+
@project_4 << @project_2
|
105
|
+
@project_4 << @project_3
|
106
|
+
end
|
107
|
+
|
108
|
+
def log_factory
|
109
|
+
Tempo::Model::MessageLog.clear_all
|
110
|
+
@log_1 = Tempo::Model::MessageLog.new({ message: "day 1 pet the sheep", start_time: Time.new(2014, 1, 1, 7 ) })
|
111
|
+
@log_2 = Tempo::Model::MessageLog.new({ message: "day 1 drinking coffee, check on the mushrooms", start_time: Time.new(2014, 1, 1, 7, 30 ) })
|
112
|
+
@log_3 = Tempo::Model::MessageLog.new({ message: "day 1 water the bonsai", start_time: Time.new(2014, 1, 1, 12, 30 ) })
|
113
|
+
|
114
|
+
@log_4 = Tempo::Model::MessageLog.new({ message: "day 2 pet the sheep", start_time: Time.new(2014, 1, 2, 7, 15 ) })
|
115
|
+
@log_5 = Tempo::Model::MessageLog.new({ message: "day 2 drinking coffee, check on the mushrooms", start_time: Time.new(2014, 1, 2, 7, 45 ) })
|
116
|
+
@log_6 = Tempo::Model::MessageLog.new({ message: "day 2 water the bonsai", start_time: Time.new(2014, 1, 2, 12, 00 ) })
|
117
|
+
end
|
118
|
+
|
119
|
+
def save_record_to_file file, file_lines
|
120
|
+
|
121
|
+
File.open( file,'a' ) do |f|
|
122
|
+
file_lines.each do |l|
|
123
|
+
f.puts l
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# For creating a file to load records from
|
129
|
+
def log_record_factory
|
130
|
+
Tempo::Model::MessageLog.clear_all
|
131
|
+
test_dir = File.join(ENV['HOME'],'tempo','tempo_message_logs')
|
132
|
+
|
133
|
+
FileUtils.rm_r test_dir if File.exists?(test_dir)
|
134
|
+
Dir.mkdir(test_dir, 0700) unless File.exists?(test_dir)
|
135
|
+
file_lines = ["---", ":start_time: 2014-01-01 07:15:00.000000000 -05:00",
|
136
|
+
":id: 1", ":message: day 1 pet the sheep",
|
137
|
+
"---", ":start_time: 2014-01-01 07:45:00.000000000 -05:00",
|
138
|
+
":id: 2", ":message: day 1 drinking coffee, check on the mushrooms",
|
139
|
+
"---", ":start_time: 2014-01-01 17:00:00.000000000 -05:00",
|
140
|
+
":id: 3", ":message: day 1 water the bonsai"]
|
141
|
+
test_file = File.join(test_dir, "20140101.yaml")
|
142
|
+
save_record_to_file test_file, file_lines
|
143
|
+
|
144
|
+
file_lines = ["---", ":start_time: 2014-01-02 08:15:00.000000000 -05:00",
|
145
|
+
":id: 1", ":message: day 2 pet the sheep",
|
146
|
+
"---", ":start_time: 2014-01-02 08:45:00.000000000 -05:00",
|
147
|
+
":id: 2", ":message: day 2 drinking coffee, check on the mushrooms",
|
148
|
+
"---", ":start_time: 2014-01-02 13:00:00.000000000 -05:00",
|
149
|
+
":id: 3", ":message: day 2 water the bonsai"]
|
150
|
+
test_file = File.join(test_dir, "20140102.yaml")
|
151
|
+
save_record_to_file test_file, file_lines
|
152
|
+
end
|
153
|
+
|
154
|
+
def time_record_factory
|
155
|
+
project_factory
|
156
|
+
Tempo::Model::TimeRecord.clear_all
|
157
|
+
@record_1 = Tempo::Model::TimeRecord.new({ project: @project_1, description: "day 1 pet the sheep", start_time: Time.new(2014, 1, 1, 7 ) })
|
158
|
+
@record_2 = Tempo::Model::TimeRecord.new({ project: @project_2, description: "day 1 drinking coffee, check on the mushrooms", start_time: Time.new(2014, 1, 1, 7, 30 ) })
|
159
|
+
@record_3 = Tempo::Model::TimeRecord.new({ project: @project_3,description: "day 1 water the bonsai", start_time: Time.new(2014, 1, 1, 17, 30 ), tags: ["horticulture", "trees"] })
|
160
|
+
|
161
|
+
@record_4 = Tempo::Model::TimeRecord.new({ project: @project_1, description: "day 2 pet the sheep", start_time: Time.new(2014, 1, 2, 7, 15 ) })
|
162
|
+
@record_5 = Tempo::Model::TimeRecord.new({ project: @project_2, description: "day 2 drinking coffee, check on the mushrooms", start_time: Time.new(2014, 1, 2, 7, 45 ) })
|
163
|
+
@record_6 = Tempo::Model::TimeRecord.new({ project: @project_3, description: "day 2 water the bonsai", start_time: Time.new(2014, 1, 2, 17, 00 ) })
|
164
|
+
end
|
165
|
+
|
166
|
+
def view_records_factory
|
167
|
+
time_record_factory
|
168
|
+
@message_1 = Tempo::Views::ViewRecords::Message.new "All The Things I Did", class: :title
|
169
|
+
@message_2 = Tempo::Views::ViewRecords::Message.new "on a busy busy day", class: :title
|
170
|
+
@error = Tempo::Views::ViewRecords::Message.new "raising an error", category: :error
|
171
|
+
@duration = Tempo::Views::ViewRecords::Duration.new 9600 # 2 hours and 40 minutes
|
172
|
+
@project_1 = Tempo::Views::ViewRecords::Project.new @project_1
|
173
|
+
@project_2 = Tempo::Views::ViewRecords::Project.new @project_2
|
174
|
+
@time_record_1 = Tempo::Views::ViewRecords::TimeRecord.new @record_1
|
175
|
+
@time_record_6 = Tempo::Views::ViewRecords::TimeRecord.new @record_6
|
176
|
+
#@records = [@message, @project, @time_record]
|
177
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
def eval_file_as_array( file )
|
2
|
+
contents = []
|
3
|
+
File.open(file, "r") do |f|
|
4
|
+
f.readlines.each do |line|
|
5
|
+
contents << line.chomp
|
6
|
+
end
|
7
|
+
end
|
8
|
+
contents
|
9
|
+
end
|
10
|
+
|
11
|
+
def has_attr_reader?(obj, attribute)
|
12
|
+
obj.class.instance_methods(false).include?(attribute)
|
13
|
+
end
|
14
|
+
|
15
|
+
def has_attr_writer?(obj, attribute)
|
16
|
+
attribute_writer = ( attribute.to_s + "=" ).to_sym
|
17
|
+
is_writable = obj.class.instance_methods(false).include?(attribute_writer)
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_attr_accessor?( obj, attribute)
|
21
|
+
has_attr_reader?(obj, attribute) && has_attr_writer?(obj, attribute)
|
22
|
+
end
|
23
|
+
|
24
|
+
def has_attr_read_only?( obj, attribute)
|
25
|
+
has_attr_reader?(obj, attribute) && !has_attr_writer?(obj, attribute)
|
26
|
+
end
|
27
|
+
|
28
|
+
def inherits_attr_reader?(obj, attribute)
|
29
|
+
obj.class.instance_methods(true).include?(attribute)
|
30
|
+
end
|
31
|
+
|
32
|
+
def inherits_attr_writer?(obj, attribute)
|
33
|
+
attribute_writer = ( attribute.to_s + "=" ).to_sym
|
34
|
+
is_writable = obj.class.instance_methods(false).include?(attribute_writer)
|
35
|
+
end
|
36
|
+
|
37
|
+
def inherits_attr_read_only?( obj, attribute)
|
38
|
+
inherits_attr_reader?(obj, attribute) && !inherits_attr_writer?(obj, attribute)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Test output resulting from any puts method
|
42
|
+
# Used to test the view formatter output.
|
43
|
+
#
|
44
|
+
# http://thinkingdigitally.com/archive/capturing-output-from-puts-in-ruby/
|
45
|
+
#
|
46
|
+
require 'stringio'
|
47
|
+
|
48
|
+
module Kernel
|
49
|
+
|
50
|
+
def capture_stdout
|
51
|
+
out = StringIO.new
|
52
|
+
$stdout = out
|
53
|
+
yield
|
54
|
+
return out
|
55
|
+
ensure
|
56
|
+
$stdout = STDOUT
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Alter reporter to clear cash from previous tests
|
61
|
+
module Tempo
|
62
|
+
module Views
|
63
|
+
class Reporter
|
64
|
+
def self.clear_records
|
65
|
+
@@view_records = []
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
# Use turn gem, if installed
|
5
|
+
begin
|
6
|
+
require 'turn/autorun'
|
7
|
+
Turn.config do |c|
|
8
|
+
# use one of output formats:
|
9
|
+
# :outline - turn's original case/test outline mode [default]
|
10
|
+
# :progress - indicates progress with progress bar
|
11
|
+
# :dotted - test/unit's traditional dot-progress mode
|
12
|
+
# :pretty - new pretty reporter
|
13
|
+
# :marshal - dump output as YAML (normal run mode only)
|
14
|
+
# :cue - interactive testing
|
15
|
+
c.format = :outline
|
16
|
+
# turn on invoke/execute tracing, enable full backtrace
|
17
|
+
c.trace = false
|
18
|
+
# use humanized test names (works only with :outline format)
|
19
|
+
c.natural = true
|
20
|
+
end
|
21
|
+
rescue LoadError
|
22
|
+
end
|
23
|
+
|
24
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
25
|
+
|
26
|
+
require "./lib/tempo.rb"
|
27
|
+
require "support/helpers"
|
28
|
+
require "support/factories"
|
29
|
+
|
30
|
+
# to run a single test file, load the path:
|
31
|
+
# bundle exec rake test TEST=test/lib/tempo/models/time_record_test.rb
|
metadata
ADDED
@@ -0,0 +1,230 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tempo-cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Jonathan Gabel
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-11-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rdoc
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: aruba
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: turn
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.9.6
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.6
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: pry
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.9.12.2
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.9.12.2
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: gli
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - '='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 2.6.1
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - '='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 2.6.1
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: chronic
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.10.2
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.10.2
|
126
|
+
description: Record and report time spent by project
|
127
|
+
email: hello@jonathangabel.com
|
128
|
+
executables:
|
129
|
+
- tempo
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- .gitignore
|
134
|
+
- Gemfile
|
135
|
+
- Gemfile.lock
|
136
|
+
- README.md
|
137
|
+
- Rakefile
|
138
|
+
- bin/tempo
|
139
|
+
- features/arrange.feature
|
140
|
+
- features/checkout.feature
|
141
|
+
- features/end.feature
|
142
|
+
- features/project.feature
|
143
|
+
- features/report.feature
|
144
|
+
- features/start.feature
|
145
|
+
- features/step_definitions/tempo_steps.rb
|
146
|
+
- features/support/env.rb
|
147
|
+
- features/tempo.feature
|
148
|
+
- features/update.feature
|
149
|
+
- lib/file_record/directory.rb
|
150
|
+
- lib/file_record/directory_structure/tempo/README.txt
|
151
|
+
- lib/file_record/directory_structure/tempo/tempo_projects.yaml
|
152
|
+
- lib/file_record/record.rb
|
153
|
+
- lib/tempo.rb
|
154
|
+
- lib/tempo/controllers/arrange_controller.rb
|
155
|
+
- lib/tempo/controllers/base.rb
|
156
|
+
- lib/tempo/controllers/checkout_controller.rb
|
157
|
+
- lib/tempo/controllers/end_controller.rb
|
158
|
+
- lib/tempo/controllers/projects_controller.rb
|
159
|
+
- lib/tempo/controllers/records_controller.rb
|
160
|
+
- lib/tempo/controllers/report_controller.rb
|
161
|
+
- lib/tempo/controllers/start_controller.rb
|
162
|
+
- lib/tempo/controllers/update_controller.rb
|
163
|
+
- lib/tempo/models/base.rb
|
164
|
+
- lib/tempo/models/composite.rb
|
165
|
+
- lib/tempo/models/log.rb
|
166
|
+
- lib/tempo/models/project.rb
|
167
|
+
- lib/tempo/models/time_record.rb
|
168
|
+
- lib/tempo/version.rb
|
169
|
+
- lib/tempo/views/arrange_view.rb
|
170
|
+
- lib/tempo/views/base.rb
|
171
|
+
- lib/tempo/views/formatters/base.rb
|
172
|
+
- lib/tempo/views/formatters/screen.rb
|
173
|
+
- lib/tempo/views/projects_view.rb
|
174
|
+
- lib/tempo/views/report_view.rb
|
175
|
+
- lib/tempo/views/reporter.rb
|
176
|
+
- lib/tempo/views/time_record_view.rb
|
177
|
+
- lib/tempo/views/view_records/base.rb
|
178
|
+
- lib/tempo/views/view_records/composite.rb
|
179
|
+
- lib/tempo/views/view_records/log.rb
|
180
|
+
- lib/tempo/views/view_records/project.rb
|
181
|
+
- lib/tempo/views/view_records/time_record.rb
|
182
|
+
- lib/time_utilities.rb
|
183
|
+
- tempo-cli.gemspec
|
184
|
+
- test/lib/file_record/directory_test.rb
|
185
|
+
- test/lib/file_record/record_test.rb
|
186
|
+
- test/lib/tempo/controllers/base_controller_test.rb
|
187
|
+
- test/lib/tempo/controllers/project_controller_test.rb
|
188
|
+
- test/lib/tempo/models/base_test.rb
|
189
|
+
- test/lib/tempo/models/composite_test.rb
|
190
|
+
- test/lib/tempo/models/log_test.rb
|
191
|
+
- test/lib/tempo/models/project_test.rb
|
192
|
+
- test/lib/tempo/models/time_record_test.rb
|
193
|
+
- test/lib/tempo/views/base_test.rb
|
194
|
+
- test/lib/tempo/views/formatters/base_test.rb
|
195
|
+
- test/lib/tempo/views/formatters/screen_test.rb
|
196
|
+
- test/lib/tempo/views/reporter_test.rb
|
197
|
+
- test/lib/tempo/views/view_records/base_test.rb
|
198
|
+
- test/lib/tempo/views/view_records/composite_test.rb
|
199
|
+
- test/lib/tempo/views/view_records/log_test.rb
|
200
|
+
- test/lib/tempo/views/view_records/project_test.rb
|
201
|
+
- test/lib/tempo/views/view_records/time_record_test.rb
|
202
|
+
- test/support/factories.rb
|
203
|
+
- test/support/helpers.rb
|
204
|
+
- test/test_helper.rb
|
205
|
+
homepage: http://jonathangabel.com
|
206
|
+
licenses: []
|
207
|
+
post_install_message:
|
208
|
+
rdoc_options: []
|
209
|
+
require_paths:
|
210
|
+
- lib
|
211
|
+
- lib
|
212
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
213
|
+
none: false
|
214
|
+
requirements:
|
215
|
+
- - ! '>='
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '0'
|
218
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
219
|
+
none: false
|
220
|
+
requirements:
|
221
|
+
- - ! '>='
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
version: '0'
|
224
|
+
requirements: []
|
225
|
+
rubyforge_project:
|
226
|
+
rubygems_version: 1.8.23
|
227
|
+
signing_key:
|
228
|
+
specification_version: 3
|
229
|
+
summary: A command line time tracker for recording by day or by project
|
230
|
+
test_files: []
|