nametrainer 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -0
- data/bin/nametrainer +1 -3
- data/lib/nametrainer.rb +5 -2
- data/lib/nametrainer/collection.rb +18 -10
- data/lib/nametrainer/gui.rb +8 -4
- data/lib/nametrainer/optionparser.rb +11 -4
- data/lib/nametrainer/version.rb +3 -3
- data/nametrainer.gemspec +1 -1
- data/test/test_collection.rb +18 -8
- data/test/test_optionparser.rb +18 -1
- metadata +43 -61
data/README.md
CHANGED
@@ -35,6 +35,8 @@ Additional settings:
|
|
35
35
|
|
36
36
|
These settings facilitate quick recapitulation of already learned names
|
37
37
|
or learning of new names.
|
38
|
+
Starting the application with `nametrainer --learning-mode` or with
|
39
|
+
`nametrainer -l` activates both settings.
|
38
40
|
|
39
41
|
Collections
|
40
42
|
-----------
|
data/bin/nametrainer
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
#!/usr/bin/ruby -w
|
2
2
|
|
3
|
-
require 'Qt'
|
4
|
-
|
5
3
|
require 'nametrainer'
|
6
4
|
|
7
5
|
SRCPATH = File.dirname(__FILE__)
|
@@ -34,5 +32,5 @@ end
|
|
34
32
|
|
35
33
|
# start
|
36
34
|
app = Qt::Application.new ARGV
|
37
|
-
Nametrainer::GUI.new(options
|
35
|
+
Nametrainer::GUI.new(options)
|
38
36
|
app.exec
|
data/lib/nametrainer.rb
CHANGED
@@ -16,7 +16,10 @@
|
|
16
16
|
#
|
17
17
|
# == Options
|
18
18
|
#
|
19
|
-
# -d, --demo::
|
19
|
+
# -d, --[no-]demo:: Start the application with a demo collection.
|
20
|
+
#
|
21
|
+
# -l, --[no-]learning-mode:: Start the application in `learning-mode':
|
22
|
+
# use non-random order, display names at once.
|
20
23
|
#
|
21
24
|
# -h, --help:: Prints a brief help message and exits.
|
22
25
|
#
|
@@ -35,7 +38,7 @@ require 'nametrainer/optionparser'
|
|
35
38
|
require 'nametrainer/statistics'
|
36
39
|
require 'nametrainer/version'
|
37
40
|
|
38
|
-
# This module contains the classes for the +nametrainer+ tool
|
41
|
+
# This module contains the classes for the +nametrainer+ tool.
|
39
42
|
module Nametrainer
|
40
43
|
|
41
44
|
FILE_EXTENSIONS = %w{png jpg jpeg}
|
@@ -105,25 +105,33 @@ module Nametrainer
|
|
105
105
|
|
106
106
|
# Returns a random index, preferring smaller indices.
|
107
107
|
def weighted_random_index
|
108
|
-
|
109
|
-
weighting_factor = 6 # index 0 will be about weighting_factor times more probable than max_index
|
110
|
-
|
111
|
-
# construct an array with indices by repeatedly adding different parts of a range of indices
|
112
|
-
indices = Array.new
|
113
|
-
range = Array.new(self.size) {|i| i }
|
114
|
-
1.upto(weighting_factor) do
|
115
|
-
|i| indices += range[0..(i.to_f/weighting_factor * max_index).ceil]
|
116
|
-
end
|
108
|
+
indices = indices_urn(:size => self.size, :weighting_factor => 6)
|
117
109
|
|
118
110
|
indices[rand(indices.size)]
|
119
111
|
end
|
120
112
|
|
113
|
+
# Returns an array of all indices from 0 to :size - 1, where lower indices are
|
114
|
+
# more frequent than higher indices. Index 0 will be about :weighting_factor
|
115
|
+
# times more probable then the highest index.
|
116
|
+
def indices_urn(options)
|
117
|
+
size = options[:size]
|
118
|
+
weighting_factor = options[:weighting_factor]
|
119
|
+
urn = Array.new
|
120
|
+
# repeatedly add partial ranges of indices to urn
|
121
|
+
1.upto(weighting_factor) do |i|
|
122
|
+
count = (i.to_f/weighting_factor * size).ceil
|
123
|
+
urn += (0...count).to_a
|
124
|
+
end
|
125
|
+
|
126
|
+
urn
|
127
|
+
end
|
128
|
+
|
121
129
|
# class methods
|
122
130
|
|
123
131
|
# Load a collection. Returns an array of Person instances.
|
124
132
|
def self.load(directory, extensions)
|
125
133
|
extension_list = extensions.join(',')
|
126
|
-
files = Dir.glob("#{directory}/*.{#{extension_list}}")
|
134
|
+
files = Dir.glob("#{directory}/*.{#{extension_list}}").sort
|
127
135
|
result = Array.new
|
128
136
|
files.each do |file|
|
129
137
|
name = get_name(file, extensions)
|
data/lib/nametrainer/gui.rb
CHANGED
@@ -10,7 +10,7 @@ module Nametrainer
|
|
10
10
|
# You can specify a collection that is loaded at startup.
|
11
11
|
#
|
12
12
|
# +collection_dir+ - path to collection
|
13
|
-
def initialize(
|
13
|
+
def initialize(options)
|
14
14
|
super()
|
15
15
|
|
16
16
|
set_window_title 'Name Trainer'
|
@@ -31,9 +31,15 @@ module Nametrainer
|
|
31
31
|
@ordered_checkbox = Qt::CheckBox.new 'Non-random order'
|
32
32
|
@display_checkbox = Qt::CheckBox.new "Display name at once"
|
33
33
|
|
34
|
+
if options[:learning_mode]
|
35
|
+
@ordered_checkbox.set_checked true
|
36
|
+
@display_checkbox.set_checked true
|
37
|
+
end
|
38
|
+
|
34
39
|
init_gui
|
35
40
|
show
|
36
41
|
|
42
|
+
collection_dir = options[:collection]
|
37
43
|
init_collection File.expand_path(collection_dir) unless collection_dir.nil?
|
38
44
|
end
|
39
45
|
|
@@ -95,9 +101,6 @@ module Nametrainer
|
|
95
101
|
answer_buttons.add_widget @correct
|
96
102
|
answer_buttons.add_widget @wrong
|
97
103
|
|
98
|
-
@ordered_checkbox.set_checked false
|
99
|
-
@display_checkbox.set_checked false
|
100
|
-
|
101
104
|
right = Qt::VBoxLayout.new
|
102
105
|
right.add_widget @show
|
103
106
|
right.add_layout answer_buttons
|
@@ -143,6 +146,7 @@ module Nametrainer
|
|
143
146
|
@collection_label.set_text "Collection: #{File.basename(@collection_dir)}"
|
144
147
|
@statistics.reset
|
145
148
|
@statistics_label.set_text @statistics.to_s
|
149
|
+
@person = nil
|
146
150
|
choose_person
|
147
151
|
end
|
148
152
|
|
@@ -18,8 +18,9 @@ module Nametrainer
|
|
18
18
|
def self.parse!(argv)
|
19
19
|
|
20
20
|
options = {
|
21
|
-
:collection
|
22
|
-
:demo
|
21
|
+
:collection => nil,
|
22
|
+
:demo => false,
|
23
|
+
:learning_mode => false
|
23
24
|
}
|
24
25
|
|
25
26
|
opt_parser = OptionParser.new do |opt|
|
@@ -48,8 +49,14 @@ module Nametrainer
|
|
48
49
|
exit
|
49
50
|
end
|
50
51
|
|
51
|
-
opt.on('-d', '--demo', '
|
52
|
-
options[:demo] =
|
52
|
+
opt.on('-d', '--[no-]demo', 'Start the application with a demo collection.') do |d|
|
53
|
+
options[:demo] = d
|
54
|
+
end
|
55
|
+
|
56
|
+
opt.on('-l', '--[no-]learning-mode',
|
57
|
+
"Start the application in `learning-mode':",
|
58
|
+
'use non-random order, display names at once.') do |l|
|
59
|
+
options[:learning_mode] = l
|
53
60
|
end
|
54
61
|
|
55
62
|
opt.separator ''
|
data/lib/nametrainer/version.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
module Nametrainer
|
2
2
|
|
3
3
|
PROGNAME = 'nametrainer'
|
4
|
-
VERSION = '0.
|
5
|
-
DATE = '2012-
|
4
|
+
VERSION = '0.2.0'
|
5
|
+
DATE = '2012-09-22'
|
6
6
|
HOMEPAGE = 'https://github.com/stomar/nametrainer/'
|
7
7
|
|
8
8
|
COPYRIGHT = "Copyright (C) 2012 Marcus Stollsteimer.\n" +
|
9
|
-
"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html
|
9
|
+
"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.\n" +
|
10
10
|
"This is free software: you are free to change and redistribute it.\n" +
|
11
11
|
"There is NO WARRANTY, to the extent permitted by law."
|
12
12
|
|
data/nametrainer.gemspec
CHANGED
data/test/test_collection.rb
CHANGED
@@ -55,14 +55,6 @@ describe Nametrainer::Collection do
|
|
55
55
|
@collection.sort.last.name.must_equal 'Albert Einstein'
|
56
56
|
end
|
57
57
|
|
58
|
-
it 'can return a random index' do
|
59
|
-
samples = 100
|
60
|
-
indices = Array.new(samples) { @collection.send(:weighted_random_index) }
|
61
|
-
indices.size.must_equal samples
|
62
|
-
indices.sort.first.must_be :>=, 0
|
63
|
-
indices.sort.last.must_be :<, @collection.size
|
64
|
-
end
|
65
|
-
|
66
58
|
it 'can return a random person' do
|
67
59
|
@collection.sample.must_be_instance_of Nametrainer::Person
|
68
60
|
end
|
@@ -82,4 +74,22 @@ describe Nametrainer::Collection do
|
|
82
74
|
person.increase_score
|
83
75
|
@collection.last.score.must_equal 1
|
84
76
|
end
|
77
|
+
|
78
|
+
# private methods
|
79
|
+
it 'can return a weighted index list' do
|
80
|
+
expected = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
|
81
|
+
3, 3, 3, 4, 4, 4, 5, 5, 5,
|
82
|
+
6, 6, 7, 7, 8, 8,
|
83
|
+
9, 10, 11]
|
84
|
+
indices = @collection.send(:indices_urn, :size => 12, :weighting_factor => 4)
|
85
|
+
indices.sort.must_equal expected
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns random indices in the correct range' do
|
89
|
+
samples = 100
|
90
|
+
indices = Array.new(samples) { @collection.send(:weighted_random_index) }
|
91
|
+
indices.size.must_equal samples
|
92
|
+
indices.sort.first.must_be :>=, 0
|
93
|
+
indices.sort.last.must_be :<, @collection.size
|
94
|
+
end
|
85
95
|
end
|
data/test/test_optionparser.rb
CHANGED
@@ -9,7 +9,8 @@ describe Nametrainer::Optionparser do
|
|
9
9
|
options = Nametrainer::Optionparser.parse!(['collection'])
|
10
10
|
expected = {
|
11
11
|
:collection => 'collection',
|
12
|
-
:demo => false
|
12
|
+
:demo => false,
|
13
|
+
:learning_mode => false
|
13
14
|
}
|
14
15
|
options.must_equal expected
|
15
16
|
end
|
@@ -20,6 +21,22 @@ describe Nametrainer::Optionparser do
|
|
20
21
|
options[:demo].must_equal true
|
21
22
|
end
|
22
23
|
|
24
|
+
it 'should recognize the --no-demo option' do
|
25
|
+
options = Nametrainer::Optionparser.parse!(['--no-demo'])
|
26
|
+
options[:demo].must_equal false
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should recognize the -l option' do
|
30
|
+
options = Nametrainer::Optionparser.parse!(['-l'])
|
31
|
+
options[:collection].must_be_nil
|
32
|
+
options[:learning_mode].must_equal true
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should recognize the --no-learning-mode option' do
|
36
|
+
options = Nametrainer::Optionparser.parse!(['--no-learning-mode'])
|
37
|
+
options[:learning_mode].must_equal false
|
38
|
+
end
|
39
|
+
|
23
40
|
it 'should not accept wrong number of arguments' do
|
24
41
|
lambda { Nametrainer::Optionparser.parse!(['collection1', 'collection2']) }.must_raise ArgumentError
|
25
42
|
lambda { Nametrainer::Optionparser.parse!(['']) }.must_raise ArgumentError
|
metadata
CHANGED
@@ -1,59 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: nametrainer
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 0
|
10
|
-
version: 0.1.0
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Marcus Stollsteimer
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-09-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rake
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &72380950 !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :development
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: minitest
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: *72380950
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: minitest
|
27
|
+
requirement: &72379800 !ruby/object:Gem::Requirement
|
38
28
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
46
33
|
type: :development
|
47
|
-
|
48
|
-
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *72379800
|
36
|
+
description: nametrainer is a name learning trainer using the Qt GUI toolkit. It will
|
37
|
+
assist you in learning people's names from a collection of images.
|
49
38
|
email: sto.mar@web.de
|
50
|
-
executables:
|
39
|
+
executables:
|
51
40
|
- nametrainer
|
52
41
|
extensions: []
|
53
|
-
|
54
42
|
extra_rdoc_files: []
|
55
|
-
|
56
|
-
files:
|
43
|
+
files:
|
57
44
|
- README.md
|
58
45
|
- Rakefile
|
59
46
|
- nametrainer.gemspec
|
@@ -85,40 +72,35 @@ files:
|
|
85
72
|
- test/collection/002.JPG
|
86
73
|
- test/collection/nametrainer.dat
|
87
74
|
homepage: https://github.com/stomar/nametrainer/
|
88
|
-
licenses:
|
75
|
+
licenses:
|
89
76
|
- GPL-3
|
90
77
|
post_install_message:
|
91
|
-
rdoc_options:
|
78
|
+
rdoc_options:
|
92
79
|
- --charset=UTF-8
|
93
|
-
require_paths:
|
80
|
+
require_paths:
|
94
81
|
- lib
|
95
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
83
|
none: false
|
97
|
-
requirements:
|
98
|
-
- -
|
99
|
-
- !ruby/object:Gem::Version
|
100
|
-
|
101
|
-
|
102
|
-
- 0
|
103
|
-
version: "0"
|
104
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
89
|
none: false
|
106
|
-
requirements:
|
107
|
-
- -
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
|
110
|
-
|
111
|
-
- 0
|
112
|
-
version: "0"
|
113
|
-
requirements:
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
requirements:
|
114
95
|
- the Qt toolkit and Qt bindings for Ruby
|
115
96
|
rubyforge_project: nametrainer
|
116
|
-
rubygems_version: 1.
|
97
|
+
rubygems_version: 1.8.11
|
117
98
|
signing_key:
|
118
99
|
specification_version: 3
|
119
100
|
summary: nametrainer is a name learning trainer using the Qt GUI toolkit.
|
120
|
-
test_files:
|
101
|
+
test_files:
|
121
102
|
- test/test_person.rb
|
122
103
|
- test/test_statistics.rb
|
123
104
|
- test/test_collection.rb
|
124
105
|
- test/test_optionparser.rb
|
106
|
+
has_rdoc:
|