tempo-cli 0.2.6 → 1.0.1

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.
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