linkage 0.1.0.pre → 0.1.0

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.
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