forgetful 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.4.0
data/bin/forgetful CHANGED
@@ -6,34 +6,64 @@ require 'optparse'
6
6
 
7
7
  #-------------------------------------------------
8
8
 
9
+ class FormatException < RuntimeError; end
10
+
11
+ #-------------------------------------------------
12
+
13
+ def parse_range(value)
14
+ case value
15
+ when /\A(\d+)\Z/
16
+ min = 0
17
+ max = Integer($1)
18
+ when /\A(\d+)\.\.(\d+)\Z/
19
+ min = Integer($1)
20
+ max = Integer($2)
21
+ else
22
+ raise FormatException.new("unrecognized format: '#{value}'")
23
+ end
24
+
25
+ raise FormatException.new("min cannot be larger than max: '#{value}'") if min > max
26
+
27
+ min..max
28
+ end
29
+
9
30
  def parse(args)
10
31
  options = { :filenames => [],
11
32
  :verbose => false,
12
- :action => :quiz }
33
+ :action => :quiz,
34
+ :delay => 0..0 }
13
35
 
14
36
  args.options do |arg|
15
37
  arg.banner = "Usage: forgetful [OPTION]... [FILE]..."
16
38
  arg.separator ""
17
39
  arg.separator "Specific options:"
18
40
 
19
- arg.on( '-t', '--touch', "Validate filename(s) and write back in full CSV format") do
41
+ arg.on( '-t', '--touch', "Validate filename(s) and write back in full CSV format") do
20
42
  options[:action] = :touch
21
43
  end
22
44
 
45
+ arg.on( '-d', '--delay VALUE', "Delay range (in days) to add to unscheduled items (used with --touch)") do |value|
46
+ begin
47
+ options[:delay] = parse_range(value)
48
+ rescue FormatException => e
49
+ arg.abort(e.message)
50
+ end
51
+ end
52
+
23
53
  arg.separator ""
24
54
  arg.separator "Common options:"
25
55
 
26
- arg.on( '-v', '--verbose', "Show more information") do
56
+ arg.on( '-v', '--verbose', "Show more information") do
27
57
  options[:verbose] = true
28
58
  end
29
59
 
30
- arg.on( '--version', "Show version") do
60
+ arg.on( '--version', "Show version") do
31
61
  puts File.read(File.join(File.dirname(__FILE__), "..", "VERSION"))
32
62
  exit
33
63
  end
34
64
 
35
- arg.on_tail('-h', '--help', "Show this message") do
36
- puts arg
65
+ arg.on_tail('-h', '--help', "Show this message") do
66
+ warn(arg)
37
67
  exit
38
68
  end
39
69
 
@@ -52,7 +82,7 @@ options = parse(ARGV)
52
82
 
53
83
  begin
54
84
  options[:filenames].each do |filename|
55
- ReminderFile.new(filename, options[:verbose]).send(options[:action])
85
+ ReminderFile.new(filename, options[:verbose], options[:delay]).send(options[:action])
56
86
  end
57
87
  rescue Interrupt
58
88
  puts
data/lib/forgetful/cli.rb CHANGED
@@ -1,25 +1,25 @@
1
1
 
2
2
  class ReminderFile
3
- attr_reader :filename, :verbose
3
+ attr_reader :filename, :verbose, :delay
4
4
 
5
- def initialize(filename, verbose=false)
5
+ def initialize(filename, verbose=false, delay=0..0)
6
6
  @filename = filename
7
7
  @verbose = verbose
8
+ @delay = delay
8
9
  end
9
10
 
10
11
  def reminders
11
- @reminders ||= Reminder.read_csv(filename)
12
+ @reminders ||= Reminder.read_csv(filename, delay)
12
13
  end
13
14
 
14
15
  def write(reminders)
15
16
  raise "Writing back a different number of reminders than read from file (#{reminders.size} != #{@reminders.size})" if reminders.size != @reminders.size
16
- Reminder.write_csv(filename, reminders.sort)
17
+ Reminder.write_csv(filename, reminders)
17
18
  end
18
19
 
19
20
  # subtle -- reading and writing back a file will:
20
21
  # 1. validate the file
21
22
  # 2. add the date column
22
- # 3. sort the rows
23
23
  def touch
24
24
  puts "### TOUCH: #{filename}"
25
25
  write(reminders)
@@ -16,13 +16,13 @@ class Reminder
16
16
  end
17
17
  end
18
18
 
19
- def self.read_csv(filename)
19
+ def self.read_csv(filename, delay=0..0)
20
20
  File.open(filename) do |file|
21
- self.parse_csv(file)
21
+ self.parse_csv(file, delay)
22
22
  end
23
23
  end
24
24
 
25
- def self.parse_csv(io)
25
+ def self.parse_csv(io, delay=0..0)
26
26
  converters = [lambda { |question| question },
27
27
  lambda { |answer| answer },
28
28
  lambda { |due_on| Date.parse(due_on) },
@@ -30,6 +30,7 @@ class Reminder
30
30
 
31
31
  CSV.parse(io, :skip_blanks => true).map do |list|
32
32
  list = list.zip(converters).map { |col, converter| converter[col] }
33
+ list << Date.today + Random.new.rand(delay) if list.length == 2 # missing date
33
34
  new(*list)
34
35
  end
35
36
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 3
8
- - 3
9
- version: 0.3.3
7
+ - 4
8
+ - 0
9
+ version: 0.4.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jonathan Palardy
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-11-05 00:00:00 -04:00
17
+ date: 2011-04-19 00:00:00 -04:00
18
18
  default_executable: forgetful
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -42,7 +42,6 @@ extra_rdoc_files:
42
42
  - LICENSE
43
43
  - README.rdoc
44
44
  files:
45
- - .gitignore
46
45
  - LICENSE
47
46
  - README.rdoc
48
47
  - Rakefile
@@ -65,8 +64,8 @@ homepage: http://github.com/jpalardy/forgetful
65
64
  licenses: []
66
65
 
67
66
  post_install_message:
68
- rdoc_options:
69
- - --charset=UTF-8
67
+ rdoc_options: []
68
+
70
69
  require_paths:
71
70
  - lib
72
71
  required_ruby_version: !ruby/object:Gem::Requirement
data/.gitignore DELETED
@@ -1,2 +0,0 @@
1
- Manifest
2
- pkg