timetrap 1.8.2 → 1.8.3.beta1

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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- Timetrap
1
+ Timetrap [![Build Status](https://secure.travis-ci.org/samg/timetrap.png)](http://travis-ci.org/samg/timetrap)
2
2
  ========
3
3
 
4
4
  Timetrap is a simple command line time tracker written in ruby. It provides an
@@ -353,14 +353,20 @@ See ``t configure`` for details. Currently supported options are:
353
353
 
354
354
  **database_file**: The file path of the sqlite database
355
355
 
356
- **append_notes_delimiter**: delimiter used when appending notes via `t edit --append`
356
+ **append_notes_delimiter**: delimiter used when appending notes via
357
+ `t edit --append`
357
358
 
358
- **formatter_search_paths**: an array of directories to search for user defined fomatter classes
359
+ **formatter_search_paths**: an array of directories to search for user
360
+ defined fomatter classes
359
361
 
360
- **default_formatter**: The format to use when display is invoked without a `--format` option
362
+ **default_formatter**: The format to use when display is invoked without a
363
+ `--format` option
361
364
 
362
365
  **default_command**: The default command to invoke when you call `t`
363
366
 
367
+ **sheets_are_exclusive**: Only allow one running entry at a time. Defaults to
368
+ false which allows one running entry per sheet.
369
+
364
370
  Special Thanks
365
371
  --------------
366
372
 
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- require 'rake/rdoctask'
1
+ require 'rdoc/task'
2
2
  require 'rubygems/package_task'
3
3
  require 'rspec/core/rake_task'
4
4
  begin
data/VERSION.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  ---
2
2
  :major: 1
3
3
  :minor: 8
4
- :patch: 2
4
+ :patch: 3
5
+ :build: beta1
data/lib/timetrap/cli.rb CHANGED
@@ -225,6 +225,11 @@ COMMAND is one of:
225
225
  end
226
226
 
227
227
  def in
228
+ if Config['sheets_are_exclusive']
229
+ Timer.stop_other_sheets(args['-a']).each do |checked_out_of|
230
+ warn "Checked out of sheet #{checked_out_of.sheet.inspect}."
231
+ end
232
+ end
228
233
  Timer.start unused_args, args['-a']
229
234
  warn "Checked into sheet #{Timer.current_sheet.inspect}."
230
235
  end
@@ -24,7 +24,10 @@ module Timetrap
24
24
  # formatter to use when display is invoked without a --format option
25
25
  'default_formatter' => 'text',
26
26
  # the default command to when you run `t`. default to printing usage.
27
- 'default_command' => nil
27
+ 'default_command' => nil,
28
+ # only allow one running entry at a time.
29
+ # when set to false it is possible to have one running entry per sheet.
30
+ 'sheets_are_exclusive' => false
28
31
  }
29
32
  end
30
33
 
@@ -87,8 +87,19 @@ module Timetrap
87
87
  Entry.filter(:end => nil)
88
88
  end
89
89
 
90
- def stop sheet, time = nil
91
- if a = active_entry(sheet)
90
+ def stop_other_sheets(time = nil)
91
+ running_entries.all.select{ |e| stop(e, time) unless current_sheet == e.sheet }
92
+ end
93
+
94
+ def stop sheet_or_entry, time = nil
95
+ a = case sheet_or_entry
96
+ when Entry
97
+ sheet_or_entry
98
+ when String
99
+ active_entry(sheet_or_entry)
100
+ end
101
+
102
+ if a
92
103
  time ||= Time.now
93
104
  a.end = time
94
105
  a.save
@@ -12,9 +12,10 @@ def local_time_cli(str)
12
12
  end
13
13
 
14
14
  module Timetrap::StubConfig
15
- def with_stubbed_config options
16
- options.each do |k, v|
17
- Timetrap::Config.stub(:[]).with(k).and_return v
15
+ def with_stubbed_config options = {}
16
+ defaults = Timetrap::Config.defaults.dup
17
+ Timetrap::Config.stub(:[]).and_return do |k|
18
+ defaults.merge(options)[k]
18
19
  end
19
20
  yield if block_given?
20
21
  end
@@ -22,6 +23,9 @@ end
22
23
 
23
24
  describe Timetrap do
24
25
  include Timetrap::StubConfig
26
+ before do
27
+ with_stubbed_config
28
+ end
25
29
  def create_entry atts = {}
26
30
  Timetrap::Entry.create({
27
31
  :sheet => 'default',
@@ -515,6 +519,53 @@ END:VCALENDAR
515
519
  Timetrap::Entry.order_by(:id).last.should be_nil
516
520
  $stderr.string.should =~ /\w+/
517
521
  end
522
+
523
+ describe "with sheets_are_exclusive config option set" do
524
+ before do
525
+ with_stubbed_config 'sheets_are_exclusive' => true
526
+ end
527
+
528
+ it "should check in normally if nothing else is running" do
529
+ Timetrap::Timer.should_not be_running #precondition
530
+ invoke 'in'
531
+ Timetrap::Timer.should be_running
532
+ end
533
+
534
+ describe "with a running entry on current sheet" do
535
+ before do
536
+ invoke 'sheet sheet1'
537
+ invoke 'in first task'
538
+ end
539
+
540
+ it "should tell you you're already checked in" do
541
+ entry = Timetrap::Timer.active_entry('sheet1')
542
+ invoke 'in second task'
543
+ Timetrap::Timer.active_entry('sheet1').should == entry
544
+ end
545
+ end
546
+
547
+ describe "with a running entry on another sheet" do
548
+ before do
549
+ invoke 'sheet sheet1'
550
+ invoke 'in first task'
551
+ invoke 'sheet sheet2'
552
+ end
553
+
554
+ it "should check out of the running entry" do
555
+ Timetrap::Timer.active_entry('sheet1').should be_a(Timetrap::Entry)
556
+ invoke 'in second task'
557
+ Timetrap::Timer.active_entry('sheet1').should be nil
558
+ end
559
+
560
+ it "should check out of the running entry at another time" do
561
+ now = Time.at(Time.now - 5 * 60) # 5 minutes ago
562
+ entry = Timetrap::Timer.active_entry('sheet1')
563
+ entry.should be_a(Timetrap::Entry)
564
+ invoke "in -a '#{now}' second task"
565
+ entry.reload.end.to_s.should == now.to_s
566
+ end
567
+ end
568
+ end
518
569
  end
519
570
 
520
571
  describe "kill" do
data/timetrap.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "timetrap"
8
- s.version = "1.8.2"
8
+ s.version = "1.8.3.beta1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Sam Goldstein"]
12
- s.date = "2012-10-27"
12
+ s.date = "2012-11-06"
13
13
  s.description = "Command line time tracker"
14
14
  s.email = "sgrock@gmail.com"
15
15
  s.executables = ["t"]
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timetrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.2
5
- prerelease:
4
+ version: 1.8.3.beta1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sam Goldstein
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-27 00:00:00.000000000 Z
12
+ date: 2012-11-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sequel
@@ -251,15 +251,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
251
251
  - - ! '>='
252
252
  - !ruby/object:Gem::Version
253
253
  version: '0'
254
- segments:
255
- - 0
256
- hash: 799045396901513239
257
254
  required_rubygems_version: !ruby/object:Gem::Requirement
258
255
  none: false
259
256
  requirements:
260
- - - ! '>='
257
+ - - ! '>'
261
258
  - !ruby/object:Gem::Version
262
- version: '0'
259
+ version: 1.3.1
263
260
  requirements: []
264
261
  rubyforge_project:
265
262
  rubygems_version: 1.8.24