linkage 0.1.0.pre → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -0
  3. data/Guardfile +0 -1
  4. data/TODO +2 -0
  5. data/lib/linkage.rb +1 -0
  6. data/lib/linkage/comparator.rb +12 -2
  7. data/lib/linkage/comparators/strcompare.rb +68 -16
  8. data/lib/linkage/configuration.rb +112 -8
  9. data/lib/linkage/dataset.rb +124 -9
  10. data/lib/linkage/exceptions.rb +5 -0
  11. data/lib/linkage/field.rb +55 -18
  12. data/lib/linkage/field_set.rb +20 -0
  13. data/lib/linkage/helpers.rb +7 -0
  14. data/lib/linkage/helpers/csv.rb +28 -0
  15. data/lib/linkage/helpers/database.rb +47 -0
  16. data/lib/linkage/import_buffer.rb +3 -3
  17. data/lib/linkage/match_recorder.rb +4 -0
  18. data/lib/linkage/match_set.rb +51 -13
  19. data/lib/linkage/match_sets/csv.rb +36 -9
  20. data/lib/linkage/match_sets/database.rb +43 -2
  21. data/lib/linkage/matcher.rb +49 -3
  22. data/lib/linkage/result_set.rb +60 -22
  23. data/lib/linkage/result_sets/csv.rb +46 -28
  24. data/lib/linkage/result_sets/database.rb +44 -26
  25. data/lib/linkage/runner.rb +10 -0
  26. data/lib/linkage/score_recorder.rb +5 -0
  27. data/lib/linkage/score_set.rb +78 -20
  28. data/lib/linkage/score_sets/csv.rb +41 -15
  29. data/lib/linkage/score_sets/database.rb +43 -5
  30. data/lib/linkage/version.rb +1 -1
  31. data/linkage.gemspec +2 -0
  32. data/misc/uml/linkage.dia +0 -0
  33. data/misc/uml/linkage.png +0 -0
  34. data/misc/uml/linkage.svg +197 -0
  35. data/test/helper.rb +2 -11
  36. data/test/integration/test_database_result_set.rb +4 -2
  37. data/test/unit/comparators/test_strcompare.rb +29 -0
  38. data/test/unit/match_sets/test_csv.rb +44 -13
  39. data/test/unit/match_sets/test_database.rb +42 -1
  40. data/test/unit/result_sets/test_csv.rb +9 -69
  41. data/test/unit/result_sets/test_database.rb +20 -11
  42. data/test/unit/score_sets/test_csv.rb +68 -25
  43. data/test/unit/score_sets/test_database.rb +57 -1
  44. data/test/unit/test_comparator.rb +8 -0
  45. data/test/unit/test_configuration.rb +33 -6
  46. data/test/unit/test_dataset.rb +0 -7
  47. data/test/unit/test_matcher.rb +52 -3
  48. data/test/unit/test_result_set.rb +8 -14
  49. metadata +66 -32
@@ -4,6 +4,54 @@ class UnitTests::TestScoreSets::TestDatabase < Test::Unit::TestCase
4
4
  def setup
5
5
  @dataset = stub('dataset')
6
6
  @database = stub('database', :[] => @dataset)
7
+ Sequel::Database.stubs(:===).with(@database).returns(true)
8
+ end
9
+
10
+ test "open_for_writing with uri string" do
11
+ Sequel.expects(:connect).with('foo://bar').returns(@database)
12
+ score_set = Linkage::ScoreSets::Database.new('foo://bar')
13
+ @database.stubs(:table_exists?).with(:scores).returns(false)
14
+ @database.expects(:create_table).with(:scores)
15
+ @database.expects(:[]).with(:scores).returns(@dataset)
16
+ score_set.open_for_writing
17
+ end
18
+
19
+ test "open_for_writing with database object" do
20
+ score_set = Linkage::ScoreSets::Database.new(@database)
21
+ @database.stubs(:table_exists?).with(:scores).returns(false)
22
+ @database.expects(:create_table).with(:scores)
23
+ @database.expects(:[]).with(:scores).returns(@dataset)
24
+ score_set.open_for_writing
25
+ end
26
+
27
+ test "open_for_writing with filename option" do
28
+ Sequel.expects(:connect).with(:adapter => :sqlite, :database => 'foo.db').returns(@database)
29
+ score_set = Linkage::ScoreSets::Database.new(:filename => 'foo.db')
30
+ @database.stubs(:table_exists?).with(:scores).returns(false)
31
+ @database.expects(:create_table).with(:scores)
32
+ @database.expects(:[]).with(:scores).returns(@dataset)
33
+ score_set.open_for_writing
34
+ end
35
+
36
+ test "open_for_writing with default options" do
37
+ Sequel.expects(:connect).with(:adapter => :sqlite, :database => 'scores.db').returns(@database)
38
+ score_set = Linkage::ScoreSets::Database.new
39
+ @database.stubs(:table_exists?).with(:scores).returns(false)
40
+ @database.expects(:create_table).with(:scores)
41
+ @database.expects(:[]).with(:scores).returns(@dataset)
42
+ score_set.open_for_writing
43
+ end
44
+
45
+ test "open_for_writing with directory option" do
46
+ expected_directory = File.expand_path('foo')
47
+ FileUtils.expects(:mkdir_p).with(expected_directory)
48
+ expected_filename = File.join(expected_directory, 'scores.db')
49
+ Sequel.expects(:connect).with(:adapter => :sqlite, :database => expected_filename).returns(@database)
50
+ score_set = Linkage::ScoreSets::Database.new(:dir => 'foo')
51
+ @database.stubs(:table_exists?).with(:scores).returns(false)
52
+ @database.expects(:create_table).with(:scores)
53
+ @database.expects(:[]).with(:scores).returns(@dataset)
54
+ score_set.open_for_writing
7
55
  end
8
56
 
9
57
  test "open_for_writing for database with no scores table" do
@@ -106,7 +154,6 @@ class UnitTests::TestScoreSets::TestDatabase < Test::Unit::TestCase
106
154
  test "each_pair" do
107
155
  score_set = Linkage::ScoreSets::Database.new(@database)
108
156
  @database.stubs(:table_exists?).with(:scores).returns(true)
109
- score_set.open_for_reading
110
157
 
111
158
  @dataset.expects(:order).with(:id_1, :id_2, :comparator_id).returns(@dataset)
112
159
  @dataset.expects(:each).multiple_yields(
@@ -119,7 +166,9 @@ class UnitTests::TestScoreSets::TestDatabase < Test::Unit::TestCase
119
166
  [{:comparator_id => 3, :id_1 => '4', :id_2 => '5', :score => 0}]
120
167
  )
121
168
  pairs = []
169
+ score_set.open_for_reading
122
170
  score_set.each_pair { |*args| pairs << args }
171
+ score_set.close
123
172
  assert_equal 4, pairs.length
124
173
 
125
174
  pair_1 = pairs.detect { |pair| pair[0] == "1" && pair[1] == "2" }
@@ -143,6 +192,13 @@ class UnitTests::TestScoreSets::TestDatabase < Test::Unit::TestCase
143
192
  assert_equal expected_4, pair_4[2]
144
193
  end
145
194
 
195
+ test "each_pair when not open for reading" do
196
+ score_set = Linkage::ScoreSets::Database.new(@database)
197
+ assert_raise_message("not in read mode") do
198
+ score_set.each_pair { |*args| }
199
+ end
200
+ end
201
+
146
202
  test "registers itself" do
147
203
  assert_equal Linkage::ScoreSets::Database, Linkage::ScoreSet['database']
148
204
  end
@@ -84,4 +84,12 @@ class UnitTests::TestComparator < Test::Unit::TestCase
84
84
  observer.expects(:update).with(instance, record_1, record_2, 1)
85
85
  instance.score_and_notify(record_1, record_2)
86
86
  end
87
+
88
+ test "weigh requires numeric types" do
89
+ comparator = Linkage::Comparator.new
90
+ weight = stub('weight', :name => :foo, :ruby_type => { :type => String })
91
+ assert_raises do
92
+ comparator.weigh(weight)
93
+ end
94
+ end
87
95
  end
@@ -5,12 +5,12 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
5
5
  @pk_1 = stub('primary key 1', :name => :id)
6
6
  @field_1 = stub('field 1')
7
7
  @field_set_1 = stub('field set 1', :primary_key => @pk_1, :[] => @field_1)
8
- @dataset_1 = stub('dataset 1', :field_set => @field_set_1)
8
+ @dataset_1 = stub_dataset(:field_set => @field_set_1)
9
9
  @pk_2 = stub('primary key 2', :name => :id)
10
10
  @field_2 = stub('field 2')
11
11
  @field_set_2 = stub('field set 2', :primary_key => @pk_2, :[] => @field_2)
12
- @dataset_2 = stub('dataset 2', :field_set => @field_set_2)
13
- @score_set = stub('score set')
12
+ @dataset_2 = stub_dataset(:field_set => @field_set_2)
13
+ @score_set = stub_instance(Linkage::ScoreSet)
14
14
  @match_set = stub('match set')
15
15
  @result_set = stub('result set', :score_set => @score_set, :match_set => @match_set)
16
16
  @compare = stub('compare')
@@ -24,6 +24,14 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
24
24
  assert_equal @result_set, config.result_set
25
25
  end
26
26
 
27
+ test "init with single dataset, score set, and match set" do
28
+ Linkage::ResultSet.expects(:new).with(@score_set, @match_set).returns(@result_set)
29
+ config = Linkage::Configuration.new(@dataset_1, @score_set, @match_set)
30
+ assert_equal @dataset_1, config.dataset_1
31
+ assert_nil config.dataset_2
32
+ assert_equal @result_set, config.result_set
33
+ end
34
+
27
35
  test "init with two datasets and result set" do
28
36
  config = Linkage::Configuration.new(@dataset_1, @dataset_2, @result_set)
29
37
  assert_equal @dataset_1, config.dataset_1
@@ -31,14 +39,23 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
31
39
  assert_equal @result_set, config.result_set
32
40
  end
33
41
 
42
+ test "init with two datasets, score set, and match set" do
43
+ Linkage::ResultSet.expects(:new).with(@score_set, @match_set).returns(@result_set)
44
+ config = Linkage::Configuration.new(@dataset_1, @dataset_2, @score_set, @match_set)
45
+ assert_equal @dataset_1, config.dataset_1
46
+ assert_equal @dataset_2, config.dataset_2
47
+ assert_equal @result_set, config.result_set
48
+ end
49
+
34
50
  test "adding comparator with set arguments and two datasets" do
35
51
  config = Linkage::Configuration.new(@dataset_1, @dataset_2, @result_set)
36
52
 
37
53
  @field_set_1.expects(:[]).with(:foo).returns(@field_1)
38
54
  @field_set_2.expects(:[]).with(:foo).returns(@field_2)
39
55
  Linkage::Comparators::Compare.expects(:new).with([@field_1], [@field_2], :equal).returns(@compare)
40
- config.compare([:foo], [:foo], :equal)
56
+ comp = config.compare([:foo], [:foo], :equal)
41
57
  assert_equal @compare, config.comparators[0]
58
+ assert_equal config.comparators[0], comp
42
59
  end
43
60
 
44
61
  test "adding comparator with set arguments and one datasets" do
@@ -47,8 +64,9 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
47
64
  @field_set_1.expects(:[]).with(:foo).returns(@field_1)
48
65
  @field_set_1.expects(:[]).with(:bar).returns(@field_2)
49
66
  Linkage::Comparators::Compare.expects(:new).with([@field_1], [@field_2], :equal).returns(@compare)
50
- config.compare([:foo], [:bar], :equal)
67
+ comp = config.compare([:foo], [:bar], :equal)
51
68
  assert_equal @compare, config.comparators[0]
69
+ assert_equal config.comparators[0], comp
52
70
  end
53
71
 
54
72
  test "adding comparator with scalar arguments and two datasets" do
@@ -58,8 +76,9 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
58
76
  @field_set_2.expects(:[]).with(:foo).returns(@field_2)
59
77
  within = stub('within')
60
78
  Linkage::Comparators::Within.expects(:new).with(@field_1, @field_2, 5).returns(within)
61
- config.within(:foo, :foo, 5)
79
+ comp = config.within(:foo, :foo, 5)
62
80
  assert_equal within, config.comparators[0]
81
+ assert_equal config.comparators[0], comp
63
82
  end
64
83
 
65
84
  test "score_recorder with two datasets" do
@@ -115,6 +134,14 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
115
134
  assert_equal matcher, config.matcher
116
135
  end
117
136
 
137
+ test "threshold requires numeric types" do
138
+ config = Linkage::Configuration.new(@dataset_1, @dataset_2, @result_set)
139
+ config.compare([:foo], [:bar], :equal)
140
+ assert_raises do
141
+ config.threshold = 'dog'
142
+ end
143
+ end
144
+
118
145
  test "match_recorder" do
119
146
  config = Linkage::Configuration.new(@dataset_1, @dataset_2, @result_set)
120
147
 
@@ -71,13 +71,6 @@ class UnitTests::TestDataset < Test::Unit::TestCase
71
71
  assert_equal @schema, ds.schema
72
72
  end
73
73
 
74
- test "database_type" do
75
- ds = Linkage::Dataset.new('foo:/bar', "foo", {:foo => 'bar'})
76
- @dataset.stubs(:db).returns(@database)
77
- @database.expects(:database_type).returns(:foo)
78
- assert_equal :foo, ds.database_type
79
- end
80
-
81
74
  test "primary key" do
82
75
  ds = Linkage::Dataset.new('foo:/bar', "foo", {:foo => 'bar'})
83
76
  pk = stub('primary key field')
@@ -3,7 +3,7 @@ require 'helper'
3
3
  class UnitTests::TestMatcher < Test::Unit::TestCase
4
4
  def setup
5
5
  @score_set = stub('score set')
6
- @comparators = [stub('comparator 1'), stub('comparator 2'), stub('comparator 3')]
6
+ @comparators = [stub('comparator 1', :weight => nil), stub('comparator 2', :weight => nil), stub('comparator 3', :weight => nil)]
7
7
  end
8
8
 
9
9
  test "finding matches with mean and threshold" do
@@ -19,7 +19,10 @@ class UnitTests::TestMatcher < Test::Unit::TestCase
19
19
  [3, 4, {1 => 0, 2 => 1, 3 => 1}],
20
20
  [4, 5, {1 => 1, 2 => 1, 3 => 1}]
21
21
  ]
22
- @score_set.expects(:each_pair).multiple_yields(*pairs)
22
+ seq = sequence("mean")
23
+ @score_set.expects(:open_for_reading).in_sequence(seq)
24
+ @score_set.expects(:each_pair).multiple_yields(*pairs).in_sequence(seq)
25
+ @score_set.expects(:close).in_sequence(seq)
23
26
 
24
27
  matcher.run
25
28
  end
@@ -37,7 +40,53 @@ class UnitTests::TestMatcher < Test::Unit::TestCase
37
40
  [3, 4, {2 => 1, 3 => 1}],
38
41
  [4, 5, {1 => 1, 2 => 1, 3 => 1}]
39
42
  ]
40
- @score_set.expects(:each_pair).multiple_yields(*pairs)
43
+ seq = sequence("mean")
44
+ @score_set.expects(:open_for_reading).in_sequence(seq)
45
+ @score_set.expects(:each_pair).multiple_yields(*pairs).in_sequence(seq)
46
+ @score_set.expects(:close).in_sequence(seq)
47
+
48
+ matcher.run
49
+ end
50
+
51
+ test "finding matches with sum and threshold with missing scores" do
52
+ matcher = Linkage::Matcher.new(@comparators, @score_set, :sum, 2)
53
+ observer = stub('observer')
54
+ observer.expects(:update).with(3, 4, 2)
55
+ observer.expects(:update).with(4, 5, 3)
56
+ matcher.add_observer(observer)
57
+
58
+ pairs = [
59
+ [1, 2, {1 => 1, 3 => 0}],
60
+ [2, 3, {1 => 0, 2 => 0, 3 => 0}],
61
+ [3, 4, {2 => 1, 3 => 1}],
62
+ [4, 5, {1 => 1, 2 => 1, 3 => 1}]
63
+ ]
64
+ seq = sequence("sum")
65
+ @score_set.expects(:open_for_reading).in_sequence(seq)
66
+ @score_set.expects(:each_pair).multiple_yields(*pairs).in_sequence(seq)
67
+ @score_set.expects(:close).in_sequence(seq)
68
+
69
+ matcher.run
70
+ end
71
+
72
+ test "finding weighted matches with sum and threshold with missing scores" do
73
+ comparators = [stub('comparator 1', :weight => 0.50), stub('comparator 2', :weight => 0.25), stub('comparator 3', :weight => 0.25)]
74
+ matcher = Linkage::Matcher.new(comparators, @score_set, :sum, 0.75)
75
+ observer = stub('observer')
76
+ observer.expects(:update).with(1, 2, 0.75)
77
+ observer.expects(:update).with(4, 5, 1)
78
+ matcher.add_observer(observer)
79
+
80
+ pairs = [
81
+ [1, 2, {1 => 1, 3 => 1}],
82
+ [2, 3, {1 => 0, 2 => 0, 3 => 0}],
83
+ [3, 4, {2 => 1, 3 => 1}],
84
+ [4, 5, {1 => 1, 2 => 1, 3 => 1}]
85
+ ]
86
+ seq = sequence("sum")
87
+ @score_set.expects(:open_for_reading).in_sequence(seq)
88
+ @score_set.expects(:each_pair).multiple_yields(*pairs).in_sequence(seq)
89
+ @score_set.expects(:close).in_sequence(seq)
41
90
 
42
91
  matcher.run
43
92
  end
@@ -1,18 +1,12 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestResultSet < Test::Unit::TestCase
4
- test "score_set raises NotImplementedError" do
5
- result_set = Linkage::ResultSet.new
6
- assert_raises(NotImplementedError) do
7
- result_set.score_set
8
- end
9
- end
10
-
11
- test "match_set raises NotImplementedError" do
12
- result_set = Linkage::ResultSet.new
13
- assert_raises(NotImplementedError) do
14
- result_set.match_set
15
- end
4
+ test "default result set" do
5
+ score_set = stub('score set')
6
+ match_set = stub('match set')
7
+ result_set = Linkage::ResultSet.new(score_set, match_set)
8
+ assert_same score_set, result_set.score_set
9
+ assert_same match_set, result_set.match_set
16
10
  end
17
11
 
18
12
  test "getting a registered class" do
@@ -23,14 +17,14 @@ class TestResultSet < Test::Unit::TestCase
23
17
 
24
18
  test "registered classes required to define score_set" do
25
19
  klass = new_result_set do
26
- remove_method :score_set
20
+ undef :score_set
27
21
  end
28
22
  assert_raises(ArgumentError) { Linkage::ResultSet.register('foo', klass) }
29
23
  end
30
24
 
31
25
  test "registered classes required to define match_set" do
32
26
  klass = new_result_set do
33
- remove_method :match_set
27
+ undef :match_set
34
28
  end
35
29
  assert_raises(ArgumentError) { Linkage::ResultSet.register('foo', klass) }
36
30
  end
metadata CHANGED
@@ -1,167 +1,195 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linkage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Stephens
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-02 00:00:00.000000000 Z
11
+ date: 2015-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sequel
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: hashery
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: test-unit
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: mocha
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: versionomy
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: sqlite3
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: mysql2
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: guard-test
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - '>='
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - '>='
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: guard-yard
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - '>='
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - '>='
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: redcarpet
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: yard-redcarpet-ext
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
165
193
  - !ruby/object:Gem::Version
166
194
  version: '0'
167
195
  description: Performs record linkage between one or two datasets, using Sequel on
@@ -172,10 +200,10 @@ executables: []
172
200
  extensions: []
173
201
  extra_rdoc_files: []
174
202
  files:
175
- - .document
176
- - .gitignore
177
- - .vimrc
178
- - .yardopts
203
+ - ".document"
204
+ - ".gitignore"
205
+ - ".vimrc"
206
+ - ".yardopts"
179
207
  - Gemfile
180
208
  - Gemfile-java
181
209
  - Guardfile
@@ -194,6 +222,9 @@ files:
194
222
  - lib/linkage/exceptions.rb
195
223
  - lib/linkage/field.rb
196
224
  - lib/linkage/field_set.rb
225
+ - lib/linkage/helpers.rb
226
+ - lib/linkage/helpers/csv.rb
227
+ - lib/linkage/helpers/database.rb
197
228
  - lib/linkage/import_buffer.rb
198
229
  - lib/linkage/match_recorder.rb
199
230
  - lib/linkage/match_set.rb
@@ -211,6 +242,9 @@ files:
211
242
  - lib/linkage/version.rb
212
243
  - linkage.gemspec
213
244
  - linkage.gemspec-java
245
+ - misc/uml/linkage.dia
246
+ - misc/uml/linkage.png
247
+ - misc/uml/linkage.svg
214
248
  - test/config.yml
215
249
  - test/helper.rb
216
250
  - test/integration/test_cross_linkage.rb
@@ -255,17 +289,17 @@ require_paths:
255
289
  - lib
256
290
  required_ruby_version: !ruby/object:Gem::Requirement
257
291
  requirements:
258
- - - '>='
292
+ - - ">="
259
293
  - !ruby/object:Gem::Version
260
294
  version: '1.9'
261
295
  required_rubygems_version: !ruby/object:Gem::Requirement
262
296
  requirements:
263
- - - '>'
297
+ - - ">="
264
298
  - !ruby/object:Gem::Version
265
- version: 1.3.1
299
+ version: '0'
266
300
  requirements: []
267
301
  rubyforge_project:
268
- rubygems_version: 2.0.3
302
+ rubygems_version: 2.4.5.1
269
303
  signing_key:
270
304
  specification_version: 4
271
305
  summary: Record linkage library