jpalardy-forgetful 0.0.5 → 0.0.6

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/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2008 Jonathan Palardy
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README.rdoc ADDED
@@ -0,0 +1,74 @@
1
+ = Forgetful
2
+
3
+ A minimal command-line app implementing the SuperMemo 2 algorithm.
4
+
5
+ The SuperMemo algorithm is designed to refresh your memory at
6
+ intervals based on how well you remembered something.
7
+
8
+ Put question-answer pairs in a file. Everyday, feed the file to forgetful and
9
+ it will quiz you on what you need to remember today. Based on your
10
+ self-evaluation, forgetful will reschedule at an appropriate time in the
11
+ future.
12
+
13
+
14
+ == Install
15
+
16
+ gem install forgetful
17
+
18
+
19
+ == Usage
20
+
21
+ forgetful filename.csv [more filenames]
22
+
23
+ The CSV files are formatted very simply:
24
+
25
+ question,answer
26
+
27
+ The interaction goes as follow:
28
+
29
+ forgetful: shows question
30
+ you: press enter
31
+ forgetful: shows answer
32
+ forgetful: asks for self-evaluation
33
+ you: type a number, press enter
34
+
35
+ You will be asked all of today's questions. After you will be asked, again, the
36
+ questions for which you scored less than 4.
37
+
38
+ Self-evaluation values:
39
+
40
+ 5 - perfect response
41
+ 4 - correct response after a hesitation
42
+ 3 - correct response recalled with serious difficulty
43
+ 2 - incorrect response; where the correct one seemed easy to recall
44
+ 1 - incorrect response; the correct one remembered
45
+ 0 - complete blackout.
46
+
47
+ WARNING: Statistics are written back to the input file. This is a feature. Put
48
+ your CSV files under source control to keep a history.
49
+
50
+ Enjoy!
51
+
52
+
53
+ == License
54
+
55
+ Copyright (c) 2008 Jonathan Palardy
56
+
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of this software and associated documentation files (the
59
+ "Software"), to deal in the Software without restriction, including
60
+ without limitation the rights to use, copy, modify, merge, publish,
61
+ distribute, sublicense, and/or sell copies of the Software, and to
62
+ permit persons to whom the Software is furnished to do so, subject to
63
+ the following conditions:
64
+
65
+ The above copyright notice and this permission notice shall be
66
+ included in all copies or substantial portions of the Software.
67
+
68
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
69
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
70
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
71
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
72
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
73
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
74
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/bin/forgetful CHANGED
@@ -25,9 +25,11 @@ end
25
25
  #-------------------------------------------------
26
26
 
27
27
  def ask_about(reminder, i, n)
28
- ask("#{i}/#{n}. Q: #{reminder.question}")
29
- puts " A: #{reminder.answer}"
30
- q = ask_grade(" ? ")
28
+ width = "#{n}/#{n}. ".size
29
+ padding = " " * width
30
+ ask "#{i}/#{n}. ".rjust(width) + "Q: #{reminder.question}"
31
+ puts padding + "A: #{reminder.answer}"
32
+ q = ask_grade padding + "? "
31
33
  puts
32
34
  return q
33
35
  end
@@ -46,14 +48,14 @@ end
46
48
 
47
49
  def process_file(filename)
48
50
  #--------------------- quiz ----------------------
49
- reminders = Reminder.load_csv(filename)
51
+ reminders = Reminder.read_csv(filename)
50
52
 
51
53
  dues, not_dues = reminders.partition {|reminder| reminder.execute_on <= Date.today}
52
54
 
53
55
  puts "### QUIZ: #{filename}"
54
56
  gradeds = quiz(dues.sort_by { rand })
55
57
 
56
- Reminder.save_csv(filename, (gradeds + not_dues).sort)
58
+ Reminder.write_csv(filename, (gradeds + not_dues).sort)
57
59
 
58
60
  #-------------------- review ---------------------
59
61
  faileds = gradeds.select {|reminder| reminder.review? }
data/forgetful.gemspec CHANGED
@@ -1,23 +1,23 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{forgetful}
3
- s.version = "0.0.5"
3
+ s.version = "0.0.6"
4
4
 
5
5
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
6
6
  s.authors = ["Jonathan Palardy"]
7
- s.date = %q{2008-11-12}
7
+ s.date = %q{2008-11-13}
8
8
  s.default_executable = %q{forgetful}
9
9
  s.description = %q{A minimal command-line implementation of the SuperMemo 2 algorithm.}
10
10
  s.email = %q{jonathan.palardy@gmail.com}
11
11
  s.executables = ["forgetful"]
12
- s.extra_rdoc_files = ["bin/forgetful", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "README"]
13
- s.files = ["bin/forgetful", "examples/katakana_romanji.csv", "examples/romanji_katakana.csv", "forgetful.gemspec", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "Manifest", "README", "test/test_forgetful.rb"]
12
+ s.extra_rdoc_files = ["bin/forgetful", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "README.rdoc"]
13
+ s.files = ["bin/forgetful", "examples/katakana_romanji.csv", "examples/romanji_katakana.csv", "lib/csv_ext/reminder.rb", "lib/forgetful.rb", "lib/reminder.rb", "Manifest", "MIT-LICENSE", "README.rdoc", "test/test_reminder.rb", "test/test_reminder_csv.rb", "forgetful.gemspec"]
14
14
  s.homepage = %q{http://github.com/jpalardy/forgetful}
15
- s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Forgetful", "--main", "README"]
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Forgetful", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{forgetful}
18
18
  s.rubygems_version = %q{1.2.0}
19
19
  s.summary = %q{A minimal command-line implementation of the SuperMemo 2 algorithm.}
20
- s.test_files = ["test/test_forgetful.rb"]
20
+ s.test_files = ["test/test_reminder.rb", "test/test_reminder_csv.rb"]
21
21
 
22
22
  if s.respond_to? :specification_version then
23
23
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
@@ -4,19 +4,43 @@ require 'fastercsv'
4
4
 
5
5
  class Reminder
6
6
 
7
- def self.load_csv(filename)
8
- identity = lambda {|x| x}
7
+ def self.read_csv(filename)
8
+ File.open(filename) do |file|
9
+ self.parse_csv(file)
10
+ end
11
+ end
9
12
 
10
- # question answer next ef i interval q
11
- FasterCSV.read(filename, :converters => [identity, identity, :date, :float, :integer, :integer, :integer]).collect do |list|
13
+ def self.parse_csv(io)
14
+ converters = [lambda {|question| question},
15
+ lambda {|answer| answer},
16
+ lambda {|execute_on| Date.parse(execute_on)},
17
+ lambda {|ef| ef.to_f},
18
+ lambda {|i| i.to_i},
19
+ lambda {|interval| interval.to_i},
20
+ lambda {|q| q.nil? ? q : q.to_i}]
21
+
22
+ FasterCSV.parse(io, :skip_blanks => true).collect do |list|
23
+ list = list.zip(converters).collect {|col, converter| converter[col]}
12
24
  self.new(*list)
13
25
  end
14
26
  end
15
27
 
16
- def self.save_csv(filename, reminders)
17
- FasterCSV.open(filename, "w") do |csv|
28
+ ############################################################
29
+
30
+ def self.write_csv(filename, reminders)
31
+ File.open(filename, "w") do |file|
32
+ file.write(generate_csv(reminders))
33
+ end
34
+ end
35
+
36
+ def self.generate_csv(reminders)
37
+ FasterCSV.generate do |csv|
18
38
  reminders.each do |reminder|
19
- csv << reminder.to_a
39
+ if reminder.to_a.last.nil? # future reminder, never graded
40
+ csv << reminder.to_a.first(3)
41
+ else
42
+ csv << reminder.to_a
43
+ end
20
44
  end
21
45
  end
22
46
  end
@@ -0,0 +1,128 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../lib/forgetful"
4
+
5
+
6
+ class TestReminder < Test::Unit::TestCase
7
+
8
+ def assert_raise_message(error, re)
9
+ exception = assert_raise(error) do
10
+ yield
11
+ end
12
+ assert_match re, exception.message
13
+ end
14
+
15
+ #-------------------------------------------------
16
+
17
+ def assert_equal_inspect(expected, actual)
18
+ assert_equal expected.inspect, actual.inspect
19
+ end
20
+
21
+ def setup
22
+ @carbon_question = Reminder.new 'carbon', '6'
23
+ end
24
+
25
+ #-------------------------------------------------
26
+
27
+ def test_empty
28
+ assert_raise_message ArgumentError, /wrong number of arguments \(0 for 2\)/ do
29
+ Reminder.new
30
+ end
31
+ end
32
+
33
+ def test_just_question
34
+ assert_raise_message ArgumentError, /wrong number of arguments \(1 for 2\)/ do
35
+ Reminder.new 'carbon'
36
+ end
37
+ end
38
+
39
+ #-------------------------------------------------
40
+
41
+ def test_minimum
42
+ assert_equal 'carbon', @carbon_question.question
43
+ assert_equal '6', @carbon_question.answer
44
+ assert_equal Date.today, @carbon_question.execute_on
45
+ assert_equal 2.5, @carbon_question.ef
46
+ assert_equal 0, @carbon_question.i
47
+ assert_equal 0, @carbon_question.interval
48
+ assert_equal nil, @carbon_question.q
49
+ end
50
+
51
+ def test_minium_array
52
+ assert_equal ['carbon', '6', Date.today, 2.5, 0, 0, nil], [@carbon_question.question, @carbon_question.answer, @carbon_question.execute_on, @carbon_question.ef, @carbon_question.i, @carbon_question.interval, @carbon_question.q]
53
+ end
54
+
55
+ #-------------------------------------------------
56
+
57
+ def test_next
58
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 0, 1, 0], @carbon_question.next(0).to_a
59
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 0, 1, 1], @carbon_question.next(1).to_a
60
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 0, 1, 2], @carbon_question.next(2).to_a
61
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.36, 1, 1, 3], @carbon_question.next(3).to_a
62
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.5, 1, 1, 4], @carbon_question.next(4).to_a
63
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.6, 1, 1, 5], @carbon_question.next(5).to_a
64
+ end
65
+
66
+ def test_next_after_0
67
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 0], @carbon_question.next(0).next(0).to_a
68
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 1], @carbon_question.next(0).next(1).to_a
69
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.38, 0, 1, 2], @carbon_question.next(0).next(2).to_a
70
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.56, 1, 1, 3], @carbon_question.next(0).next(3).to_a
71
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 1, 1, 4], @carbon_question.next(0).next(4).to_a
72
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.8, 1, 1, 5], @carbon_question.next(0).next(5).to_a
73
+ end
74
+
75
+ def test_next_after_1
76
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.3, 0, 1, 0], @carbon_question.next(1).next(0).to_a
77
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.42, 0, 1, 1], @carbon_question.next(1).next(1).to_a
78
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.64, 0, 1, 2], @carbon_question.next(1).next(2).to_a
79
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.82, 1, 1, 3], @carbon_question.next(1).next(3).to_a
80
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 1, 1, 4], @carbon_question.next(1).next(4).to_a
81
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.06, 1, 1, 5], @carbon_question.next(1).next(5).to_a
82
+ end
83
+
84
+ def test_next_after_2
85
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.38, 0, 1, 0], @carbon_question.next(2).next(0).to_a
86
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.64, 0, 1, 1], @carbon_question.next(2).next(1).to_a
87
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.86, 0, 1, 2], @carbon_question.next(2).next(2).to_a
88
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.04, 1, 1, 3], @carbon_question.next(2).next(3).to_a
89
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 1, 1, 4], @carbon_question.next(2).next(4).to_a
90
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.28, 1, 1, 5], @carbon_question.next(2).next(5).to_a
91
+ end
92
+
93
+ def test_next_after_3
94
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.56, 0, 1, 0], @carbon_question.next(3).next(0).to_a
95
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.82, 0, 1, 1], @carbon_question.next(3).next(1).to_a
96
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.04, 0, 1, 2], @carbon_question.next(3).next(2).to_a
97
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.22, 2, 6, 3], @carbon_question.next(3).next(3).to_a
98
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.36, 2, 6, 4], @carbon_question.next(3).next(4).to_a
99
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.46, 2, 6, 5], @carbon_question.next(3).next(5).to_a
100
+ end
101
+
102
+ def test_next_after_4
103
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.7, 0, 1, 0], @carbon_question.next(4).next(0).to_a
104
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.96, 0, 1, 1], @carbon_question.next(4).next(1).to_a
105
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.18, 0, 1, 2], @carbon_question.next(4).next(2).to_a
106
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.36, 2, 6, 3], @carbon_question.next(4).next(3).to_a
107
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.5, 2, 6, 4], @carbon_question.next(4).next(4).to_a
108
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.6, 2, 6, 5], @carbon_question.next(4).next(5).to_a
109
+ end
110
+
111
+ def test_next_after_5
112
+ assert_equal_inspect ['carbon', '6', Date.today+1, 1.8, 0, 1, 0], @carbon_question.next(5).next(0).to_a
113
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.06, 0, 1, 1], @carbon_question.next(5).next(1).to_a
114
+ assert_equal_inspect ['carbon', '6', Date.today+1, 2.28, 0, 1, 2], @carbon_question.next(5).next(2).to_a
115
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.46, 2, 6, 3], @carbon_question.next(5).next(3).to_a
116
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.6, 2, 6, 4], @carbon_question.next(5).next(4).to_a
117
+ assert_equal_inspect ['carbon', '6', Date.today+6, 2.7, 2, 6, 5], @carbon_question.next(5).next(5).to_a
118
+ end
119
+
120
+ #-------------------------------------------------
121
+
122
+ # will ask tomorrow?
123
+ def test_fail_after_long_interval
124
+ oxygen_question = Reminder.new('oxygen', '8', Date.today, 3.2, 7, 393)
125
+ assert_equal_inspect ['oxygen', '8', Date.today+1, 2.4, 0, 1, 0], oxygen_question.next(0).to_a
126
+ end
127
+
128
+ end
@@ -0,0 +1,103 @@
1
+
2
+ require 'test/unit'
3
+ require "#{File.dirname(__FILE__)}/../lib/forgetful"
4
+
5
+
6
+ class TestReminderCSV < Test::Unit::TestCase
7
+
8
+ def assert_equal_inspect(expected, actual)
9
+ assert_equal expected.inspect, actual.inspect
10
+ end
11
+
12
+ #-------------------------------------------------
13
+
14
+ def test_parse_csv_bare
15
+ csv = <<END
16
+ carbon,6
17
+ nitrogen,7
18
+ oxygen,8
19
+ END
20
+
21
+ reminders = Reminder.parse_csv(csv)
22
+
23
+ assert_equal 3, reminders.length
24
+
25
+ assert_equal_inspect ['carbon', '6',Date.today, 2.5, 0, 0, nil], reminders[0].to_a
26
+ assert_equal_inspect ['nitrogen','7',Date.today, 2.5, 0, 0, nil], reminders[1].to_a
27
+ assert_equal_inspect ['oxygen', '8',Date.today, 2.5, 0, 0, nil], reminders[2].to_a
28
+ end
29
+
30
+ def test_parse_csv_with_dates
31
+ csv = <<END
32
+ carbon,6,2008-11-11
33
+ nitrogen,7,2008-11-11
34
+ oxygen,8,2008-11-11
35
+ END
36
+
37
+ reminders = Reminder.parse_csv(csv)
38
+
39
+ assert_equal 3, reminders.length
40
+
41
+ assert_equal_inspect ['carbon', '6',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[0].to_a
42
+ assert_equal_inspect ['nitrogen','7',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[1].to_a
43
+ assert_equal_inspect ['oxygen', '8',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[2].to_a
44
+ end
45
+
46
+ def test_parse_csv_full
47
+ csv = <<END
48
+ carbon,6,2008-11-11,2.5,0,0,
49
+ nitrogen,7,2008-11-11,2.5,0,0,
50
+ oxygen,8,2008-11-11,2.5,0,0,
51
+ END
52
+
53
+ reminders = Reminder.parse_csv(csv)
54
+
55
+ assert_equal 3, reminders.length
56
+
57
+ assert_equal_inspect ['carbon', '6',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[0].to_a
58
+ assert_equal_inspect ['nitrogen','7',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[1].to_a
59
+ assert_equal_inspect ['oxygen', '8',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[2].to_a
60
+ end
61
+
62
+ def test_parse_csv_full_with_spaces
63
+ csv = <<END
64
+
65
+ carbon,6,2008-11-11,2.5,0,0,
66
+
67
+
68
+ nitrogen,7,2008-11-11,2.5,0,0,
69
+ oxygen,8,2008-11-11,2.5,0,0,
70
+
71
+ END
72
+
73
+ reminders = Reminder.parse_csv(csv)
74
+
75
+ assert_equal 3, reminders.length
76
+
77
+ assert_equal_inspect ['carbon', '6',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[0].to_a
78
+ assert_equal_inspect ['nitrogen','7',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[1].to_a
79
+ assert_equal_inspect ['oxygen', '8',Date.parse('2008-11-11'), 2.5, 0, 0, nil], reminders[2].to_a
80
+ end
81
+
82
+ ############################################################
83
+
84
+ def test_generate_csv
85
+ reminders = []
86
+ reminders << Reminder.new('carbon','6')
87
+ reminders << Reminder.new('nitrogen','7').next(5).next(5).next(5)
88
+ reminders << Reminder.new('oxygen','8').next(1).next(1).next(1)
89
+ reminders << Reminder.new('fluorine','9').next(1).next(5).next(1).next(5)
90
+ reminders << Reminder.new('neon','10',Date.today+5)
91
+
92
+ expected =<<END
93
+ carbon,6,#{Date.today}
94
+ nitrogen,7,#{(Date.today+16)},2.8,3,16,5
95
+ oxygen,8,#{(Date.today+1)},1.3,0,1,1
96
+ fluorine,9,#{(Date.today+1)},1.62,1,1,5
97
+ neon,10,#{(Date.today+5)}
98
+ END
99
+
100
+ assert_equal expected, Reminder.generate_csv(reminders)
101
+ end
102
+
103
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jpalardy-forgetful
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Palardy
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-12 00:00:00 -08:00
12
+ date: 2008-11-13 00:00:00 -08:00
13
13
  default_executable: forgetful
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -35,18 +35,20 @@ extra_rdoc_files:
35
35
  - lib/csv_ext/reminder.rb
36
36
  - lib/forgetful.rb
37
37
  - lib/reminder.rb
38
- - README
38
+ - README.rdoc
39
39
  files:
40
40
  - bin/forgetful
41
41
  - examples/katakana_romanji.csv
42
42
  - examples/romanji_katakana.csv
43
- - forgetful.gemspec
44
43
  - lib/csv_ext/reminder.rb
45
44
  - lib/forgetful.rb
46
45
  - lib/reminder.rb
47
46
  - Manifest
48
- - README
49
- - test/test_forgetful.rb
47
+ - MIT-LICENSE
48
+ - README.rdoc
49
+ - test/test_reminder.rb
50
+ - test/test_reminder_csv.rb
51
+ - forgetful.gemspec
50
52
  has_rdoc: false
51
53
  homepage: http://github.com/jpalardy/forgetful
52
54
  post_install_message:
@@ -56,7 +58,7 @@ rdoc_options:
56
58
  - --title
57
59
  - Forgetful
58
60
  - --main
59
- - README
61
+ - README.rdoc
60
62
  require_paths:
61
63
  - lib
62
64
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -79,4 +81,5 @@ signing_key:
79
81
  specification_version: 2
80
82
  summary: A minimal command-line implementation of the SuperMemo 2 algorithm.
81
83
  test_files:
82
- - test/test_forgetful.rb
84
+ - test/test_reminder.rb
85
+ - test/test_reminder_csv.rb
data/README DELETED
@@ -1,51 +0,0 @@
1
-
2
- A minimal command-line app implementing the SuperMemo 2 algorithm.
3
-
4
- The SuperMemo algorithm is designed to refresh your memory at
5
- intervals based on how well you remembered something.
6
-
7
- Put question-answer pairs in a file. Everyday, feed the file to forgetful and
8
- it will quiz you on what you need to remember today. Based on your
9
- self-evaluation, forgetful will reschedule at an appropriate time in the
10
- future.
11
-
12
- Usage:
13
-
14
- forgetful filename.csv [more filenames]
15
-
16
- Format:
17
-
18
- A CSV file to contain your questions and answers, in the following format:
19
-
20
- question,answer
21
-
22
- Flow:
23
-
24
- 1. shows question (press enter)
25
- 2. shows answer
26
- 3. asks for self-evaluation (type number, and enter)
27
- 4. repeats for all questions
28
- 5. repeats for questions that scored less than 4
29
-
30
- Self-evaluation:
31
-
32
- 5 - perfect response
33
- 4 - correct response after a hesitation
34
- 3 - correct response recalled with serious difficulty
35
- 2 - incorrect response; where the correct one seemed easy to recall
36
- 1 - incorrect response; the correct one remembered
37
- 0 - complete blackout.
38
-
39
- WARNING:
40
-
41
- Statistics are written back to the input file. This is a feature. Put your CSV
42
- files under source control to keep a history.
43
-
44
- Enjoy!
45
-
46
- ############################################################
47
-
48
- The article that sparked my interest: http://www.wired.com/medtech/health/magazine/16-05/ff_wozniak
49
-
50
- The algorithm itself: http://www.supermemo.com/english/ol/sm2.htm
51
-
File without changes