tempo-cli 0.1.6 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile.lock +3 -3
  3. data/README.md +9 -3
  4. data/bin/tempo +20 -2
  5. data/features/arrange.feature +1 -1
  6. data/features/directory.feature +108 -0
  7. data/features/project.feature +2 -2
  8. data/features/report.feature +3 -2
  9. data/features/start.feature +0 -1
  10. data/features/step_definitions/tempo_steps.rb +99 -20
  11. data/features/update.feature +7 -1
  12. data/lib/file_record/directory.rb +19 -3
  13. data/lib/file_record/file_utility.rb +122 -0
  14. data/lib/file_record/record.rb +36 -83
  15. data/lib/tempo/controllers/arrange_controller.rb +5 -5
  16. data/lib/tempo/controllers/base.rb +8 -8
  17. data/lib/tempo/controllers/checkout_controller.rb +4 -4
  18. data/lib/tempo/controllers/end_controller.rb +4 -5
  19. data/lib/tempo/controllers/projects_controller.rb +13 -10
  20. data/lib/tempo/controllers/records_controller.rb +8 -5
  21. data/lib/tempo/controllers/report_controller.rb +4 -4
  22. data/lib/tempo/controllers/start_controller.rb +4 -3
  23. data/lib/tempo/controllers/update_controller.rb +22 -8
  24. data/lib/tempo/exceptions.rb +2 -2
  25. data/lib/tempo/models/base.rb +26 -18
  26. data/lib/tempo/models/composite.rb +5 -3
  27. data/lib/tempo/models/log.rb +61 -38
  28. data/lib/tempo/models/project.rb +9 -6
  29. data/lib/tempo/models/time_record.rb +14 -14
  30. data/lib/tempo/version.rb +1 -1
  31. data/lib/tempo/views/arrange_view.rb +4 -4
  32. data/lib/tempo/views/base.rb +10 -23
  33. data/lib/tempo/views/formatters/base.rb +2 -2
  34. data/lib/tempo/views/formatters/screen.rb +7 -7
  35. data/lib/tempo/views/projects_view.rb +8 -8
  36. data/lib/tempo/views/report_view.rb +5 -5
  37. data/lib/tempo/views/reporter.rb +4 -4
  38. data/lib/tempo/views/time_record_view.rb +5 -5
  39. data/lib/tempo/views/view_records/base.rb +8 -8
  40. data/lib/tempo/views/view_records/composite.rb +4 -4
  41. data/lib/tempo/views/view_records/log.rb +3 -3
  42. data/lib/tempo/views/view_records/project.rb +3 -3
  43. data/lib/tempo/views/view_records/time_record.rb +5 -5
  44. data/lib/tempo.rb +3 -0
  45. data/lib/time_utilities.rb +4 -4
  46. data/tempo-cli.gemspec +8 -7
  47. data/test/lib/file_record/directory_test.rb +14 -1
  48. data/test/lib/file_record/record_test.rb +40 -75
  49. data/test/lib/tempo/models/base_test.rb +2 -2
  50. data/test/lib/tempo/models/composite_test.rb +9 -9
  51. data/test/lib/tempo/models/log_test.rb +31 -16
  52. data/test/lib/tempo/models/time_record_test.rb +29 -19
  53. data/test/support/factories.rb +5 -0
  54. data/test/support/helpers.rb +7 -7
  55. metadata +40 -53
@@ -17,11 +17,12 @@ describe Tempo do
17
17
  it "inherits the freeze-dry method" do
18
18
  log_factory
19
19
  frozen = @log_4.freeze_dry
20
+ binding.pry if @log_4.id != 1
20
21
  frozen.must_equal({ :start_time=>Time.new(2014, 01, 02, 07, 15),
21
22
  :id=>1, :message=>"day 2 pet the sheep"})
22
23
  end
23
24
 
24
- it "inherits the same indexing method" do
25
+ it "inherits the base indexing method" do
25
26
  log_factory
26
27
  Tempo::Model::MessageLog.index.length.must_equal 6
27
28
  end
@@ -33,7 +34,12 @@ describe Tempo do
33
34
  Tempo::Model::MessageLog.days_index[:"20140102"].length.must_equal 3
34
35
  end
35
36
 
36
- it "creates a file name to save to" do
37
+ it "knows which directory to save to" do
38
+ log_factory
39
+ Tempo::Model::MessageLog.dir.must_equal "tempo_message_logs"
40
+ end
41
+
42
+ it "knows which file name to save to" do
37
43
  log_factory
38
44
  date = Time.new(2014,1,1)
39
45
  Tempo::Model::MessageLog.file(date).must_equal "20140101.yaml"
@@ -42,25 +48,34 @@ describe Tempo do
42
48
  it "grants children the ability to write to a file" do
43
49
  log_factory
44
50
  test_dir = File.join(ENV['HOME'],'tempo','tempo_message_logs')
45
- # FileUtils.rm_r test_dir if File.exists?(test_dir)
51
+ FileUtils.rm_r test_dir if File.exists?(test_dir)
46
52
  Tempo::Model::MessageLog.save_to_file
47
53
  test_file_1 = File.join(test_dir, "20140101.yaml")
48
54
  test_file_2 = File.join(test_dir, "20140102.yaml")
49
55
  contents = eval_file_as_array( test_file_1 )
50
- contents.must_equal [ "---", ":start_time: 2014-01-01 07:00:00.000000000 -05:00",
51
- ":id: 1", ":message: day 1 pet the sheep",
52
- "---", ":start_time: 2014-01-01 07:30:00.000000000 -05:00",
53
- ":id: 2", ":message: day 1 drinking coffee, check on the mushrooms",
54
- "---", ":start_time: 2014-01-01 12:30:00.000000000 -05:00",
55
- ":id: 3", ":message: day 1 water the bonsai"]
56
+ # testing with regex because time zone will be different on different computers,
57
+ # ex: ":start_time: 2014-01-02 07:15:00.000000000 -05:00"
58
+ eval = [ /---/, /:start_time: 2014-01-01 07:00:00.000000000/,
59
+ /:id: 1/, /:message: day 1 pet the sheep/,
60
+ /---/, /:start_time: 2014-01-01 07:30:00.000000000/,
61
+ /:id: 2/, /:message: day 1 drinking coffee, check on the mushrooms/,
62
+ /---/, /:start_time: 2014-01-01 12:30:00.000000000/,
63
+ /:id: 3/, /:message: day 1 water the bonsai/]
64
+ contents.each_with_index do |c, i|
65
+ c.must_match eval[i]
66
+ end
67
+
56
68
  contents = eval_file_as_array( test_file_2 )
57
- contents.must_equal [ "---", ":start_time: 2014-01-02 07:15:00.000000000 -05:00",
58
- ":id: 1", ":message: day 2 pet the sheep",
59
- "---", ":start_time: 2014-01-02 07:45:00.000000000 -05:00",
60
- ":id: 2", ":message: day 2 drinking coffee, check on the mushrooms",
61
- "---", ":start_time: 2014-01-02 12:00:00.000000000 -05:00",
62
- ":id: 3", ":message: day 2 water the bonsai"]
63
- end
69
+ eval = [ /---/, /:start_time: 2014-01-02 07:15:00.000000000/,
70
+ /:id: 1/, /:message: day 2 pet the sheep/,
71
+ /---/, /:start_time: 2014-01-02 07:45:00.000000000/,
72
+ /:id: 2/, /:message: day 2 drinking coffee, check on the mushrooms/,
73
+ /---/, /:start_time: 2014-01-02 12:00:00.000000000/,
74
+ /:id: 3/, /:message: day 2 water the bonsai/]
75
+ contents.each_with_index do |c, i|
76
+ c.must_match eval[i]
77
+ end
78
+ end
64
79
 
65
80
  it "grants children ability to read from a file" do
66
81
  log_record_factory
@@ -265,26 +265,36 @@ describe Tempo do
265
265
  test_file_1 = File.join(ENV['HOME'],'tempo/tempo_time_records/20140101.yaml')
266
266
  test_file_2 = File.join(ENV['HOME'],'tempo/tempo_time_records/20140102.yaml')
267
267
  contents = eval_file_as_array( test_file_1 )
268
- contents.must_equal [ "---", ":project_title: sheep herding", ":description: day 1 pet the sheep",
269
- ":start_time: 2014-01-01 07:00:00.000000000 -05:00", ":end_time: 2014-01-01 07:30:00.000000000 -05:00",
270
- ":id: 1", ":project: 1", ":tags: []",
271
- "---", ":project_title: horticulture - basement mushrooms", ":description: day 1 drinking coffee, check on the mushrooms",
272
- ":start_time: 2014-01-01 07:30:00.000000000 -05:00", ":end_time: 2014-01-01 17:30:00.000000000 -05:00",
273
- ":id: 2", ":project: 2", ":tags: []",
274
- "---", ":project_title: horticulture - backyard bonsai", ":description: day 1 water the bonsai",
275
- ":start_time: 2014-01-01 17:30:00.000000000 -05:00", ":end_time: 2014-01-01 23:59:00.000000000 -05:00",
276
- ":id: 3", ":project: 3", ":tags:", "- horticulture", "- trees"]
268
+
269
+ # testing with regex because time zone will be different on different computers,
270
+ # ex: ":start_time: 2014-01-02 07:15:00.000000000 -05:00"
271
+ eval = [ /---/, /:project_title: sheep herding/, /:description: day 1 pet the sheep/,
272
+ /:start_time: 2014-01-01 07:00:00.000000000/, /:end_time: 2014-01-01 07:30:00.000000000/,
273
+ /:id: 1/, /:project: 1/, /:tags: \[\]/,
274
+ /---/, /:project_title: horticulture - basement mushrooms/, /:description: day 1 drinking coffee, check on the mushrooms/,
275
+ /:start_time: 2014-01-01 07:30:00.000000000/, /:end_time: 2014-01-01 17:30:00.000000000/,
276
+ /:id: 2/, /:project: 2/, /:tags: \[\]/,
277
+ /---/, /:project_title: horticulture - backyard bonsai/, /:description: day 1 water the bonsai/,
278
+ /:start_time: 2014-01-01 17:30:00.000000000/, /:end_time: 2014-01-01 23:59:00.000000000/,
279
+ /:id: 3/, /:project: 3/, /:tags:/, /- horticulture/, /- trees/ ]
280
+ contents.each_with_index do |c, i|
281
+ c.must_match eval[i]
282
+ end
283
+
277
284
  contents = eval_file_as_array( test_file_2 )
278
- # TODO: test this one too when stable
279
- contents.must_equal ["---", ":project_title: sheep herding", ":description: day 2 pet the sheep",
280
- ":start_time: 2014-01-02 07:15:00.000000000 -05:00", ":end_time: 2014-01-02 07:45:00.000000000 -05:00",
281
- ":id: 1", ":project: 1", ":tags: []",
282
- "---", ":project_title: horticulture - basement mushrooms", ":description: day 2 drinking coffee, check on the mushrooms",
283
- ":start_time: 2014-01-02 07:45:00.000000000 -05:00", ":end_time: 2014-01-02 17:00:00.000000000 -05:00",
284
- ":id: 2", ":project: 2", ":tags: []",
285
- "---", ":project_title: horticulture - backyard bonsai", ":description: day 2 water the bonsai",
286
- ":start_time: 2014-01-02 17:00:00.000000000 -05:00", ":end_time: :running",
287
- ":id: 3", ":project: 3", ":tags: []"]
285
+ eval = [/---/, /:project_title: sheep herding/, /:description: day 2 pet the sheep/,
286
+ /:start_time: 2014-01-02 07:15:00.000000000/, /:end_time: 2014-01-02 07:45:00.000000000/,
287
+ /:id: 1/, /:project: 1/, /:tags: \[\]/,
288
+ /---/, /:project_title: horticulture - basement mushrooms/, /:description: day 2 drinking coffee, check on the mushrooms/,
289
+ /:start_time: 2014-01-02 07:45:00.000000000/, /:end_time: 2014-01-02 17:00:00.000000000/,
290
+ /:id: 2/, /:project: 2/, /:tags: \[\]/,
291
+ /---/, /:project_title: horticulture - backyard bonsai/, /:description: day 2 water the bonsai/,
292
+ /:start_time: 2014-01-02 17:00:00.000000000/, /:end_time: :running/,
293
+ /:id: 3/, /:project: 3/, /:tags: \[\]/]
294
+
295
+ contents.each_with_index do |c, i|
296
+ c.must_match eval[i]
297
+ end
288
298
  end
289
299
  end
290
300
  end
@@ -106,6 +106,11 @@ def project_factory
106
106
  end
107
107
 
108
108
  def log_factory
109
+
110
+ # delete all records so they aren't loaded when new logs are created
111
+ test_dir = File.join(ENV['HOME'],'tempo','tempo_message_logs')
112
+ FileUtils.rm_r test_dir if File.exists?(test_dir)
113
+
109
114
  Tempo::Model::MessageLog.clear_all
110
115
  @log_1 = Tempo::Model::MessageLog.new({ message: "day 1 pet the sheep", start_time: Time.new(2014, 1, 1, 7 ) })
111
116
  @log_2 = Tempo::Model::MessageLog.new({ message: "day 1 drinking coffee, check on the mushrooms", start_time: Time.new(2014, 1, 1, 7, 30 ) })
@@ -1,4 +1,4 @@
1
- def eval_file_as_array( file )
1
+ def eval_file_as_array(file)
2
2
  contents = []
3
3
  File.open(file, "r") do |f|
4
4
  f.readlines.each do |line|
@@ -13,15 +13,15 @@ def has_attr_reader?(obj, attribute)
13
13
  end
14
14
 
15
15
  def has_attr_writer?(obj, attribute)
16
- attribute_writer = ( attribute.to_s + "=" ).to_sym
16
+ attribute_writer = (attribute.to_s + "=").to_sym
17
17
  is_writable = obj.class.instance_methods(false).include?(attribute_writer)
18
18
  end
19
19
 
20
- def has_attr_accessor?( obj, attribute)
20
+ def has_attr_accessor?(obj, attribute)
21
21
  has_attr_reader?(obj, attribute) && has_attr_writer?(obj, attribute)
22
22
  end
23
23
 
24
- def has_attr_read_only?( obj, attribute)
24
+ def has_attr_read_only?(obj, attribute)
25
25
  has_attr_reader?(obj, attribute) && !has_attr_writer?(obj, attribute)
26
26
  end
27
27
 
@@ -30,11 +30,11 @@ def inherits_attr_reader?(obj, attribute)
30
30
  end
31
31
 
32
32
  def inherits_attr_writer?(obj, attribute)
33
- attribute_writer = ( attribute.to_s + "=" ).to_sym
33
+ attribute_writer = (attribute.to_s + "=").to_sym
34
34
  is_writable = obj.class.instance_methods(false).include?(attribute_writer)
35
35
  end
36
36
 
37
- def inherits_attr_read_only?( obj, attribute)
37
+ def inherits_attr_read_only?(obj, attribute)
38
38
  inherits_attr_reader?(obj, attribute) && !inherits_attr_writer?(obj, attribute)
39
39
  end
40
40
 
@@ -66,4 +66,4 @@ module Tempo
66
66
  end
67
67
  end
68
68
  end
69
- end
69
+ end
metadata CHANGED
@@ -1,128 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tempo-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
5
- prerelease:
4
+ version: 0.2.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jonathan Gabel
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-12-15 00:00:00.000000000 Z
11
+ date: 2014-06-09 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: '0'
19
+ version: '10.3'
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: '0'
26
+ version: '10.3'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rdoc
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: '0'
33
+ version: '4.1'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: '0'
40
+ version: '4.1'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: aruba
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: '0.5'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: '0'
54
+ version: '0.5'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: turn
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: 0.9.6
61
+ version: '0.9'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: 0.9.6
68
+ version: '0.9'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: pry
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ~>
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
- version: 0.9.12.2
75
+ version: '0.9'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ~>
80
+ - - "~>"
92
81
  - !ruby/object:Gem::Version
93
- version: 0.9.12.2
82
+ version: '0.9'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: gli
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - '='
87
+ - - "~>"
100
88
  - !ruby/object:Gem::Version
101
- version: 2.6.1
89
+ version: '2.10'
102
90
  type: :runtime
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - '='
94
+ - - "~>"
108
95
  - !ruby/object:Gem::Version
109
- version: 2.6.1
96
+ version: '2.10'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: chronic
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ~>
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: 0.10.2
103
+ version: '0.10'
118
104
  type: :runtime
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ~>
108
+ - - "~>"
124
109
  - !ruby/object:Gem::Version
125
- version: 0.10.2
110
+ version: '0.10'
126
111
  description: tempo-cli is a command line time tracking application. Record time spent
127
112
  on projects in YAML files, and manage them from the command line.
128
113
  email: hello@jonathangabel.com
@@ -131,7 +116,7 @@ executables:
131
116
  extensions: []
132
117
  extra_rdoc_files: []
133
118
  files:
134
- - .gitignore
119
+ - ".gitignore"
135
120
  - Gemfile
136
121
  - Gemfile.lock
137
122
  - README.md
@@ -139,6 +124,7 @@ files:
139
124
  - bin/tempo
140
125
  - features/arrange.feature
141
126
  - features/checkout.feature
127
+ - features/directory.feature
142
128
  - features/end.feature
143
129
  - features/project.feature
144
130
  - features/report.feature
@@ -150,6 +136,7 @@ files:
150
136
  - lib/file_record/directory.rb
151
137
  - lib/file_record/directory_structure/tempo/README.txt
152
138
  - lib/file_record/directory_structure/tempo/tempo_projects.yaml
139
+ - lib/file_record/file_utility.rb
153
140
  - lib/file_record/record.rb
154
141
  - lib/tempo.rb
155
142
  - lib/tempo/controllers/arrange_controller.rb
@@ -206,28 +193,28 @@ files:
206
193
  - test/support/helpers.rb
207
194
  - test/test_helper.rb
208
195
  homepage: https://github.com/josankapo/tempo-cli
209
- licenses: []
196
+ licenses:
197
+ - MIT
198
+ metadata: {}
210
199
  post_install_message:
211
200
  rdoc_options: []
212
201
  require_paths:
213
202
  - lib
214
203
  - lib
215
204
  required_ruby_version: !ruby/object:Gem::Requirement
216
- none: false
217
205
  requirements:
218
- - - ! '>='
206
+ - - ">="
219
207
  - !ruby/object:Gem::Version
220
208
  version: '0'
221
209
  required_rubygems_version: !ruby/object:Gem::Requirement
222
- none: false
223
210
  requirements:
224
- - - ! '>='
211
+ - - ">="
225
212
  - !ruby/object:Gem::Version
226
213
  version: '0'
227
214
  requirements: []
228
215
  rubyforge_project:
229
- rubygems_version: 1.8.23
216
+ rubygems_version: 2.2.2
230
217
  signing_key:
231
- specification_version: 3
218
+ specification_version: 4
232
219
  summary: A command line time tracker for recording by day and by project
233
220
  test_files: []