tempo-cli 0.2.6 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile.lock +64 -39
  3. data/README.md +16 -7
  4. data/Rakefile +3 -3
  5. data/bin/tempo +28 -0
  6. data/features/step_definitions/tempo_steps.rb +14 -14
  7. data/features/support/env.rb +1 -1
  8. data/lib/file_record/directory.rb +104 -1
  9. data/lib/file_record/file_utility.rb +50 -8
  10. data/lib/file_record/record.rb +11 -10
  11. data/lib/tempo/controllers/end_controller.rb +1 -1
  12. data/lib/tempo/controllers/projects_controller.rb +1 -1
  13. data/lib/tempo/controllers/records_controller.rb +56 -4
  14. data/lib/tempo/controllers/report_controller.rb +1 -1
  15. data/lib/tempo/controllers/start_controller.rb +2 -2
  16. data/lib/tempo/exceptions.rb +11 -0
  17. data/lib/tempo/models/log.rb +20 -3
  18. data/lib/tempo/models/time_record.rb +7 -1
  19. data/lib/tempo/version.rb +1 -1
  20. data/lib/tempo/views/base.rb +3 -3
  21. data/lib/tempo/views/formatters/interactive.rb +44 -0
  22. data/lib/tempo/views/formatters/screen.rb +9 -10
  23. data/lib/tempo/views/interactive.rb +32 -0
  24. data/lib/tempo/views/reporter.rb +15 -0
  25. data/lib/tempo/views/view_records/base.rb +24 -0
  26. data/lib/tempo/views/view_records/time_record.rb +1 -1
  27. data/tempo-cli.gemspec +6 -8
  28. data/test/lib/file_record/directory_test.rb +17 -14
  29. data/test/lib/file_record/record_test.rb +11 -8
  30. data/test/lib/tempo/models/base_test.rb +3 -3
  31. data/test/lib/tempo/models/composite_test.rb +2 -2
  32. data/test/lib/tempo/models/log_test.rb +17 -7
  33. data/test/lib/tempo/models/project_test.rb +1 -1
  34. data/test/lib/tempo/models/time_record_test.rb +4 -4
  35. data/test/lib/tempo/views/formatters/console_test.rb +32 -0
  36. data/test/lib/tempo/views/reporter_test.rb +7 -1
  37. data/test/support/factories.rb +9 -17
  38. metadata +25 -31
@@ -7,17 +7,69 @@ module Tempo
7
7
 
8
8
  def initialize_from_records(options, args)
9
9
 
10
- dir = File.join( options.fetch( :directory, ENV['HOME']))
11
-
12
- if File.exists?(File.join(dir, 'tempo'))
10
+ dir = options.fetch( :directory, ENV['HOME'])
13
11
 
12
+ if File.exist?(File.join(dir, 'tempo'))
14
13
  Tempo::Controllers::Projects.load directory: dir
15
-
16
14
  else
17
15
  FileRecord::Directory.create_new directory: dir
18
16
  end
19
17
  end
20
18
 
19
+ def backup_records(options, args)
20
+ dir = options.fetch( :directory, ENV['HOME'])
21
+ Views::interactive_progress "\nBacking up #{dir}/tempo"
22
+
23
+ if File.exist?(File.join(dir, 'tempo'))
24
+ dest = FileRecord::Directory.backup directory: dir
25
+ Views::interactive_progress "Sucessfully created #{dest}"
26
+ else
27
+ Views::no_items("directory #{dir}/tempo", :error)
28
+ end
29
+ end
30
+
31
+ def old_records_present?(options)
32
+ file_utility = FileRecord::FileUtility.new(Tempo::Model::TimeRecord, options)
33
+ file_utility.old_style_log_records_exists?
34
+ end
35
+
36
+ def move_old_records(options)
37
+ file_utility = FileRecord::FileUtility.new(Tempo::Model::TimeRecord, options)
38
+ file_utility.move_old_records
39
+ end
40
+
41
+ def clean_records(options, args)
42
+ dir = File.join( options.fetch( :directory, ENV['HOME']), "tempo", "tempo_time_records")
43
+
44
+ if old_records_present? options
45
+
46
+ confirm = Tempo::Views::interactive_confirm_move_old_records
47
+
48
+ if confirm.positive_response?
49
+ move_old_records options
50
+ end
51
+ end
52
+
53
+ Views::interactive_progress "Loading records from #{dir}"
54
+
55
+ days = Model::TimeRecord.record_d_ids(options)
56
+
57
+ days.each do |d_id|
58
+ begin
59
+ date = "#{d_id[4..5].to_i}/#{d_id[6..7]}/#{d_id[0..3]}"
60
+ Views::interactive_progress_partial date
61
+ Model::TimeRecord.load_day_record(d_id, options)
62
+ Model::TimeRecord.save_to_file(options)
63
+ Model::TimeRecord.clear_all
64
+ rescue TimeConflictError => e
65
+ Views::message " exiting on error..."
66
+ Views::message "\nAn error occurred which prevented cleaning all the records on #{date}"
67
+ Views::message "Please repair the records in file #{dir}/#{Model::TimeRecord.file(d_id)}"
68
+ return Views::error e
69
+ end
70
+ end
71
+ Views::message "\nSuccess -- all files are clean!"
72
+ end
21
73
  end #class << self
22
74
  end
23
75
  end
@@ -11,7 +11,7 @@ module Tempo
11
11
  return Tempo::Views.project_assistance if Tempo::Model::Project.index.empty?
12
12
 
13
13
  # A from flag has been supplied by the user
14
- # and possible a to flag as well,
14
+ # and possibly a to flag,
15
15
  # so we return a period of day records
16
16
  #
17
17
  if options[:from] != "last record"
@@ -13,14 +13,14 @@ module Tempo
13
13
  return Views.project_assistance if Model::Project.index.empty?
14
14
 
15
15
  if not options[:at]
16
- start_time = Time.new()
16
+ start_time = Time.new().round()
17
17
  else
18
18
  start_time = Time.parse options[:at]
19
19
  end
20
20
 
21
21
  return Views.no_match_error( "valid timeframe", options[:at], false ) if start_time.nil?
22
22
 
23
- if start_time > Time.new()
23
+ if start_time > Time.new().round()
24
24
  Views.warning("WARNING: logging time in the future may cause trouble maintaining running records")
25
25
  end
26
26
 
@@ -70,4 +70,15 @@ module Tempo
70
70
  @message
71
71
  end
72
72
  end
73
+
74
+ class DuplicateRecordError < Exception
75
+
76
+ def initialize(file)
77
+ @message = "The file #{file} already exists"
78
+ end
79
+
80
+ def to_s
81
+ @message
82
+ end
83
+ end
73
84
  end
@@ -46,9 +46,13 @@ module Tempo
46
46
  FileRecord::FileUtility.new(self, {time: time}).filename
47
47
  end
48
48
 
49
+ def d_id_from_file(file)
50
+ /(\d+)\.yaml/.match(file)[1]
51
+ end
52
+
49
53
  # Returns the immediate directory for the log
50
54
  # Tempo::Model::MessageLog => tempo_message_logs
51
- def dir
55
+ def dir(time)
52
56
  FileRecord::FileUtility.new(self).log_directory
53
57
  end
54
58
 
@@ -58,6 +62,10 @@ module Tempo
58
62
  FileRecord::FileUtility.new(self, options).log_records
59
63
  end
60
64
 
65
+ def record_d_ids(options={})
66
+ records(options).each_with_object(Array.new) {|file,d_ids| d_ids << d_id_from_file(file)}
67
+ end
68
+
61
69
  # returns the loaded record with the latest start time
62
70
  # Only loads records if options[:load] is true,
63
71
  # otherwise assumes records are already loaded
@@ -102,10 +110,9 @@ module Tempo
102
110
 
103
111
  # Return a Time object for the last record's date
104
112
  def last_day(options={})
105
- reg = /(\d+)\.yaml/
106
113
  recs = records options
107
114
  if recs.last
108
- d_id = reg.match(recs.last)[1]
115
+ d_id = d_id_from_file(recs.last)
109
116
  time = day_id_to_time d_id if d_id
110
117
  return time
111
118
  end
@@ -131,6 +138,16 @@ module Tempo
131
138
  FileRecord::FileUtility.new(self, options).file_path
132
139
  end
133
140
 
141
+ # Normally not necessary to perform, only
142
+ # used when cleaning (and testing) records
143
+ def clear_all
144
+ @ids = {}
145
+ @index = []
146
+ @days_index = {}
147
+ @id_counter = {}
148
+ @current = nil
149
+ end
150
+
134
151
  # takes and integer, and time or day_id
135
152
  # and returns the instance that matches both
136
153
  # the id and d_id
@@ -41,6 +41,12 @@ module Tempo
41
41
  # super handles start_time, not end time
42
42
  options[:start_time] ||= Time.now
43
43
  @end_time = options.fetch :end_time, :running
44
+
45
+ if ! options[:exact_time]
46
+ options[:start_time] = options[:start_time].round unless options[:start_time] == :running
47
+ @end_time = @end_time.round unless @end_time == :running
48
+ end
49
+
44
50
  verify_times options[:start_time], @end_time
45
51
 
46
52
  super options
@@ -146,7 +152,7 @@ module Tempo
146
152
  if @end_time.kind_of? Time
147
153
  end_time = @end_time
148
154
  else
149
- end_time = Time.now()
155
+ end_time = Time.now().round
150
156
  end
151
157
  end_time.to_i - @start_time.to_i
152
158
  end
data/lib/tempo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tempo
2
- VERSION = '0.2.6'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -48,13 +48,13 @@ module Tempo
48
48
  def no_items(items, category=:info)
49
49
  ViewRecords::Message.new "no #{items} exist", category: category
50
50
  if items == "projects"
51
- ViewRecords::Message.new "You must at least one project before you can begin tracking time"
51
+ ViewRecords::Message.new "You must create at least one project before you can begin tracking time"
52
52
  ViewRecords::Message.new "run `tempo project --help` for more information"
53
53
  end
54
54
  end
55
55
 
56
- def message(message)
57
- ViewRecords::Message.new message, category: :info
56
+ def message(message, category=:info)
57
+ ViewRecords::Message.new message, category: category
58
58
  end
59
59
 
60
60
  def warning(message)
@@ -0,0 +1,44 @@
1
+ # The Console block handles interactive queries and progress reports.
2
+ # It is required when reporting must be done in 'real time' rather than compiled
3
+ # during runtime and then presented at the end (see Views::Screen). It is the only
4
+ # formatter that receives blocks as soon as they are handed to the Reporter
5
+
6
+ module Tempo
7
+ module Views
8
+ module Formatters
9
+
10
+ class Interactive < Tempo::Views::Formatters::Base
11
+
12
+
13
+ def message_block(record)
14
+ record.format do |m|
15
+ case m.category
16
+ when :immediate
17
+ puts "#{m.message}"
18
+ when :progress
19
+ puts "#{m.message}..."
20
+ when :progress_partial
21
+ $stdout.sync = true
22
+ print "#{m.message}..."
23
+ end
24
+ m.message
25
+ end
26
+ end
27
+
28
+ def query_block(query)
29
+ query.format do |q|
30
+ puts q.query
31
+ response = Readline.readline('> ', true)
32
+ end
33
+ end
34
+
35
+ def format_records_container(container)
36
+ # Pass through over-ride
37
+ # We don't allow interactive containers at this time because they
38
+ # would need to be able to detect when the container is complete.
39
+ # (report containers raised errors on nil durations).
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,11 +1,10 @@
1
- # Tempo View Formatters are triggered by the View Reporter.
2
- # The View Reporter sends it's stored view messages to each
3
- # of it's formatters. It calls the method process records and
4
- # passes in the view records. If the formatter has a class method
5
- # that handles the type of block passed in, it will process
6
- # that view record. These class methods take the name "<record type>_block"
7
- # where record type can be any child class of ViewRecord::Base
8
- # see <TODO> for an example of proc blocks.
1
+ # Tempo View Formatters are triggered by the View Reporter, and all inherit from
2
+ # Views::Base
3
+ #
4
+ # The screen formatter is the primary formatter for reporting results back to the
5
+ # screen. All formatting is handled after the main processes, when the Reporter is
6
+ # invoked during the post block. (If immediate feedback is needed,
7
+ # see Formatters::Console)
9
8
 
10
9
  module Tempo
11
10
  module Views
@@ -31,7 +30,7 @@ module Tempo
31
30
  end
32
31
  end
33
32
 
34
- # PARTIALS --------------------------------------------------------------------/
33
+ # PARTIALS vv-----------------------------------------------------------------vv
35
34
 
36
35
  # spacer for project titles, active project marked with *
37
36
  def active_indicator(project)
@@ -56,7 +55,7 @@ module Tempo
56
55
  @options[:id] ? "[#{id}] ".rjust(6, ' ') : ""
57
56
  end
58
57
 
59
- # PARTIALS --------------------------------------------------------------------/
58
+ # PARTIALS ^^-----------------------------------------------------------------^^
60
59
 
61
60
 
62
61
  def project_block(record)
@@ -0,0 +1,32 @@
1
+ module Tempo
2
+ module Views
3
+ class << self
4
+
5
+ # Must be allowed to return results
6
+ def interactive_query(query)
7
+ ViewRecords::Query.new query
8
+ end
9
+
10
+ def interactive_progress(message)
11
+ ViewRecords::Message.new message, category: :progress
12
+ end
13
+
14
+ def interactive_progress_partial(message)
15
+ ViewRecords::Message.new message, category: :progress_partial
16
+ end
17
+
18
+ def interactive_confirm_clean
19
+ query = "\nCleaning Tempo records resaves all records, looking for errors.\n" +
20
+ "In the event that a record cannot be corrected, you wil be prompted to repair the record manually.\n" +
21
+ "A backup of the records will also be created before any changes are made.\n\n" +
22
+ "Do you wish to continue? [YyNn]"
23
+ interactive_query(query)
24
+ end
25
+
26
+ def interactive_confirm_move_old_records
27
+ query = "\nYou have files which match an older file structure, do you want to move them so they will be included in your records? [YyNn]"
28
+ interactive_query(query)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -6,6 +6,11 @@
6
6
  #
7
7
  # class instance variables:
8
8
  #
9
+ # @@console
10
+ # A shell formtter which receives view records as they are created and can
11
+ # intercept messages that should be displayed in real time, as well as interactive
12
+ # prompts
13
+ #
9
14
  # @@formats
10
15
  # an array of formatters, which will be passed the view records on exit
11
16
  # Reporter will always run the error formater first, to check for errors in
@@ -20,6 +25,7 @@ module Tempo
20
25
  module Views
21
26
 
22
27
  class Reporter
28
+ @@console
23
29
  @@formats
24
30
  @@view_records
25
31
  @@options
@@ -40,6 +46,12 @@ module Tempo
40
46
  @@options ||= {}
41
47
  end
42
48
 
49
+ # All records are sent directly to the console, so it can decide if
50
+ # action is required immediately based on the type of record
51
+ def console
52
+ @@console ||= Formatters::Interactive.new(options)
53
+ end
54
+
43
55
  def add_options(options)
44
56
  @@options ||= {}
45
57
  @@options.merge! options
@@ -50,6 +62,9 @@ module Tempo
50
62
 
51
63
  if /Views::ViewRecords/.match record.class.name
52
64
  @@view_records << record
65
+
66
+ # console must be able to return a value
67
+ return console.report record
53
68
  else
54
69
  raise InvalidViewRecordError
55
70
  end
@@ -46,6 +46,30 @@ module Tempo
46
46
  end
47
47
  end
48
48
 
49
+ # Query records are handled by the console formatter,
50
+ # returning results from a call to Readline
51
+ class Query
52
+ attr_accessor :type, :query, :match, :response
53
+
54
+ def initialize(query, options={})
55
+ @query = query
56
+ @type = "query"
57
+ @match = options.fetch(:match, /(y|Y)(es)?/)
58
+ @response = Reporter.add_view_record self
59
+ end
60
+
61
+ def positive_response?
62
+ true if @response.match(@match)
63
+ end
64
+
65
+ def format(&block)
66
+ # TODO: should we create an interactive default? using:
67
+ # confirm = Readline.readline('> ', true).match(/(y|Y)(es)?/)
68
+ block ||= lambda { |q| puts "#{q.query}"; Readline.readline('> ', true) }
69
+ response = block.call self
70
+ end
71
+ end
72
+
49
73
  # Specifically for managing a time duration, nested in other
50
74
  # view records. This can be used with a start and end time,
51
75
  # or used to manage a sum of times.
@@ -27,7 +27,7 @@ module Tempo
27
27
  @description = model.description
28
28
  @description ||= ""
29
29
  @duration = Duration.new model.duration
30
- @end_time = model.end_time == :running ? Time.now() : model.end_time
30
+ @end_time = model.end_time == :running ? Time.now().round : model.end_time
31
31
  @project = model.project_title
32
32
  @running = model.running?
33
33
  self.class.max_description_length @description.length
data/tempo-cli.gemspec CHANGED
@@ -12,14 +12,12 @@ spec = Gem::Specification.new do |s|
12
12
  s.description = 'tempo-cli is a command line time tracking application. Record time spent on projects in YAML files, and manage them from the command line.'
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.require_paths << 'lib'
15
- s.has_rdoc = true
16
15
  s.bindir = 'bin'
17
16
  s.executables << 'tempo'
18
- s.add_development_dependency('rake', '~> 10.3')
19
- s.add_development_dependency('rdoc', '~> 4.1')
20
- s.add_development_dependency('aruba', '~> 0.5')
21
- s.add_development_dependency('turn', '~> 0.9')
22
- s.add_development_dependency('pry','~> 0.9')
23
- s.add_runtime_dependency('gli', '~> 2.10')
24
- s.add_runtime_dependency "chronic", "~> 0.10"
17
+ s.add_development_dependency 'rake', '~> 10.3'
18
+ s.add_development_dependency 'aruba', '~> 2.2'
19
+ s.add_development_dependency 'turn', '~> 0.9.7'
20
+ s.add_development_dependency 'pry','~> 0.14.2'
21
+ s.add_runtime_dependency 'gli', '~> 2.21', '>= 2.21.1'
22
+ s.add_runtime_dependency 'chronic', '~> 0.10.2'
25
23
  end
@@ -2,41 +2,44 @@ require 'test_helper'
2
2
 
3
3
  describe FileRecord do
4
4
 
5
- before do
5
+ def setup
6
6
  @dir = File.join(Dir.home,"tempo")
7
7
  @alt_dir = File.join(Dir.home, "testdir", "tempo")
8
- FileUtils.rm_r @dir if File.exists?(@dir)
8
+ FileUtils.rm_r @dir if File.exist?(@dir)
9
9
  end
10
10
 
11
- after do
12
- FileUtils.rm_r @dir if File.exists?(@dir)
13
- FileUtils.rm_r @alt_dir if File.exists?(@alt_dir)
11
+ def teardown
12
+ FileUtils.rm_r @dir if File.exist?(@dir)
13
+ FileUtils.rm_r @alt_dir if File.exist?(@alt_dir)
14
14
  end
15
15
 
16
-
17
16
  describe "Directory" do
18
17
 
19
18
  describe "initialize" do
20
19
 
21
- it "should initialize a new directory structure" do
20
+ it "initializes a new directory structure" do
22
21
  project_file = File.join(@dir, "tempo_projects.yaml")
23
22
  readme = File.join(@dir, "README.txt")
24
23
 
25
24
  FileRecord::Directory.create_new
26
- File.exists?( @dir ).must_equal true
27
- File.exists?( project_file ).must_equal true
28
- File.exists?( readme ).must_equal true
25
+ File.exist?( @dir ).must_equal true
26
+ File.exist?( project_file ).must_equal true
27
+ File.exist?( readme ).must_equal true
29
28
  end
30
29
 
31
- it "should take an optional directory parameter" do
30
+ it "takes an optional directory parameter" do
32
31
  project_file = File.join(@alt_dir, "tempo_projects.yaml")
33
32
  readme = File.join(@alt_dir, "README.txt")
34
33
  dir = File.join(Dir.home, "testdir")
35
34
 
36
35
  FileRecord::Directory.create_new directory: dir
37
- File.exists?( @alt_dir ).must_equal true
38
- File.exists?( project_file ).must_equal true
39
- File.exists?( readme ).must_equal true
36
+ File.exist?( @alt_dir ).must_equal true
37
+ File.exist?( project_file ).must_equal true
38
+ File.exist?( readme ).must_equal true
39
+ end
40
+
41
+ it "creates a zipped backup directory" do
42
+
40
43
  end
41
44
  end
42
45
  end
@@ -5,9 +5,9 @@ describe FileRecord do
5
5
  before do
6
6
  # See Rakefile for directory prep and cleanup
7
7
  dir = File.join(Dir.home,"tempo")
8
- Dir.mkdir(dir, 0700) unless File.exists?(dir)
8
+ Dir.mkdir(dir, 0700) unless File.exist?(dir)
9
9
  @dir = File.join(Dir.home,"tempo", "tempo_unit_tests")
10
- Dir.mkdir(@dir, 0700) unless File.exists?(@dir)
10
+ Dir.mkdir(@dir, 0700) unless File.exist?(@dir)
11
11
  end
12
12
 
13
13
  describe "Record" do
@@ -16,7 +16,7 @@ describe FileRecord do
16
16
 
17
17
  it "should create a record of all instances" do
18
18
  test_file = File.join(ENV['HOME'],'tempo','tempo_animals.yaml')
19
- File.delete( test_file ) if File.exists?( test_file )
19
+ File.delete( test_file ) if File.exist?( test_file )
20
20
  pantherinae_factory
21
21
  FileRecord::Record.save_model( Tempo::Model::Animal )
22
22
  contents = eval_file_as_array( test_file )
@@ -28,13 +28,13 @@ describe FileRecord do
28
28
  end
29
29
  end
30
30
 
31
- describe "redording a Tempo Log" do
31
+ describe "recording a Tempo Log" do
32
32
 
33
33
  it "should create daily records containing each instance" do
34
- test_file_1 = File.join(ENV['HOME'],'tempo','tempo_message_logs', '20140101.yaml')
35
- File.delete( test_file ) if File.exists?( test_file_1 )
36
- test_file_2 = File.join(ENV['HOME'],'tempo','tempo_message_logs', '20140102.yaml')
37
- File.delete( test_file ) if File.exists?( test_file_2 )
34
+ test_file_1 = File.join(ENV['HOME'],'tempo','tempo_message_logs', '2014', '20140101.yaml')
35
+ File.delete( test_file_1 ) if File.exist?( test_file_1 )
36
+ test_file_2 = File.join(ENV['HOME'],'tempo','tempo_message_logs', '2014', '20140102.yaml')
37
+ File.delete( test_file_2 ) if File.exist?( test_file_2 )
38
38
 
39
39
  log_factory
40
40
  FileRecord::Record.save_log(Tempo::Model::MessageLog)
@@ -67,5 +67,8 @@ describe FileRecord do
67
67
  ":message: day 2 water the bonsai"]
68
68
  end
69
69
  end
70
+
71
+ describe "reading a Tempo Log" do
72
+ end
70
73
  end
71
74
  end
@@ -19,7 +19,7 @@ describe Tempo do
19
19
  before do
20
20
  # See Rakefile for directory prep and cleanup
21
21
  @dir = File.join( Dir.home,"tempo" )
22
- Dir.mkdir(@dir, 0700) unless File.exists?(@dir)
22
+ Dir.mkdir(@dir, 0700) unless File.exist?(@dir)
23
23
  end
24
24
 
25
25
  def after_teardown
@@ -57,7 +57,7 @@ describe Tempo do
57
57
  it "grants children the ability to write to a file" do
58
58
  frog_factory
59
59
  test_file = File.join(ENV['HOME'],'tempo','tempo_animals.yaml')
60
- File.delete(test_file) if File.exists?( test_file )
60
+ File.delete(test_file) if File.exist?( test_file )
61
61
  contents = Tempo::Model::Animal.save_to_file
62
62
  contents = eval_file_as_array( test_file )
63
63
  contents.must_equal ["---", ":id: 1", ":genious: hyla", ":species: h. versicolor",
@@ -69,7 +69,7 @@ describe Tempo do
69
69
 
70
70
  it "grants children ability to read from a file" do
71
71
  test_file = File.join(ENV['HOME'],'tempo','tempo_animals.yaml')
72
- File.delete(test_file) if File.exists?( test_file )
72
+ File.delete(test_file) if File.exist?( test_file )
73
73
  file_lines = [ "---", ":id: 11", ":genious: hyla", ":species: h. versicolor",
74
74
  "---", ":id: 12", ":genious: hyla", ":species: h. chrysoscelis",
75
75
  "---", ":id: 14", ":genious: hyla", ":species: h. andersonii",
@@ -5,7 +5,7 @@ describe Tempo do
5
5
  before do
6
6
  # See Rakefile for directory prep and cleanup
7
7
  @dir = File.join( Dir.home,"tempo" )
8
- Dir.mkdir(@dir, 0700) unless File.exists?(@dir)
8
+ Dir.mkdir(@dir, 0700) unless File.exist?(@dir)
9
9
  end
10
10
 
11
11
  describe "Model::Composite" do
@@ -44,7 +44,7 @@ describe Tempo do
44
44
  it "should revive a tree structure from a file" do
45
45
  tree_factory
46
46
  test_file = File.join(ENV['HOME'],'tempo','tempo_trees.yaml')
47
- File.delete(test_file) if File.exists?( test_file )
47
+ File.delete(test_file) if File.exist?( test_file )
48
48
  contents = Tempo::Model::Tree.save_to_file
49
49
  Tempo::Model::Tree.clear_all
50
50
  Tempo::Model::Tree.read_from_file
@@ -5,11 +5,11 @@ describe Tempo do
5
5
  before do
6
6
  # See Rakefile for directory prep and cleanup
7
7
  @dir = File.join( Dir.home,"tempo" )
8
- Dir.mkdir(@dir, 0700) unless File.exists?(@dir)
8
+ Dir.mkdir(@dir, 0700) unless File.exist?(@dir)
9
9
  end
10
10
 
11
11
  after do
12
- FileUtils.rm_r(@dir) if File.exists?(@dir)
12
+ FileUtils.rm_r(@dir) if File.exist?(@dir)
13
13
  end
14
14
 
15
15
  describe "Model::Log" do
@@ -34,8 +34,8 @@ describe Tempo do
34
34
  end
35
35
 
36
36
  it "knows which directory to save to" do
37
- log_factory
38
- Tempo::Model::MessageLog.dir.must_equal "tempo_message_logs"
37
+ date = Time.new(2021,1,1)
38
+ Tempo::Model::MessageLog.dir(date).must_equal "tempo_message_logs"
39
39
  end
40
40
 
41
41
  it "knows which file name to save to" do
@@ -44,13 +44,14 @@ describe Tempo do
44
44
  Tempo::Model::MessageLog.file(date).must_equal "20140101.yaml"
45
45
  end
46
46
 
47
+ #TODO-NEW-LOG-DIR
47
48
  it "grants children the ability to write to a file" do
48
49
  log_factory
49
50
  test_dir = File.join(ENV['HOME'],'tempo','tempo_message_logs')
50
- FileUtils.rm_r test_dir if File.exists?(test_dir)
51
+ FileUtils.rm_r test_dir if File.exist?(test_dir)
51
52
  Tempo::Model::MessageLog.save_to_file
52
- test_file_1 = File.join(test_dir, "20140101.yaml")
53
- test_file_2 = File.join(test_dir, "20140102.yaml")
53
+ test_file_1 = File.join(test_dir, "2014/20140101.yaml")
54
+ test_file_2 = File.join(test_dir, "2014/20140102.yaml")
54
55
  contents = eval_file_as_array( test_file_1 )
55
56
  # testing with regex because time zone will be different on different computers,
56
57
  # ex: ":start_time: 2014-01-02 07:15:00.000000000 -05:00"
@@ -92,6 +93,15 @@ describe Tempo do
92
93
  Tempo::Model::MessageLog.index[0].message.must_equal "day 1 pet the sheep"
93
94
  end
94
95
 
96
+ it "can clear records out after load" do
97
+ log_record_factory
98
+ time = Time.new(2014, 1, 1)
99
+ Tempo::Model::MessageLog.load_day_record time
100
+ Tempo::Model::MessageLog.ids( time ).must_equal [1,2,3]
101
+ Tempo::Model::MessageLog.clear_all
102
+ Tempo::Model::MessageLog.ids( time ).must_equal []
103
+ end
104
+
95
105
  it "knows the date of the last record" do
96
106
  log_record_factory
97
107
  last_day = Tempo::Model::MessageLog.last_day
@@ -5,7 +5,7 @@ describe Tempo do
5
5
  before do
6
6
  # See Rakefile for directory prep and cleanup
7
7
  @dir = File.join( Dir.home,"tempo" )
8
- Dir.mkdir(@dir, 0700) unless File.exists?(@dir)
8
+ Dir.mkdir(@dir, 0700) unless File.exist?(@dir)
9
9
  end
10
10
 
11
11
  describe "Model::Project" do