linkage 0.0.4 → 0.0.5

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/Gemfile CHANGED
@@ -3,9 +3,9 @@ source "http://rubygems.org"
3
3
  gem "sequel"
4
4
 
5
5
  group :development do
6
- gem "bundler", "~> 1.0.0"
7
- gem "jeweler", "~> 1.6.4"
8
- gem "test-unit", "2.3.2"
6
+ gem "bundler"
7
+ gem "jeweler"
8
+ gem "test-unit"
9
9
  gem "mocha"
10
10
  gem "sqlite3"
11
11
  gem "yard"
data/Gemfile.lock CHANGED
@@ -2,10 +2,10 @@ GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
4
  blockenspiel (0.4.3)
5
- coderay (0.9.8)
5
+ coderay (1.0.5)
6
6
  ffi (1.0.11)
7
7
  git (1.2.5)
8
- guard (1.0.0)
8
+ guard (1.0.1)
9
9
  ffi (>= 0.5.0)
10
10
  thor (~> 0.14.6)
11
11
  guard-test (0.4.3)
@@ -14,43 +14,42 @@ GEM
14
14
  guard-yard (1.0.2)
15
15
  guard (>= 0.2.2)
16
16
  yard (>= 0.7.0)
17
- jeweler (1.6.4)
17
+ jeweler (1.8.3)
18
18
  bundler (~> 1.0)
19
19
  git (>= 1.2.5)
20
20
  rake
21
+ rdoc
22
+ json (1.6.6)
21
23
  metaclass (0.0.1)
22
- method_source (0.6.7)
23
- ruby_parser (>= 2.3.1)
24
- mocha (0.10.3)
24
+ method_source (0.7.1)
25
+ mocha (0.10.5)
25
26
  metaclass (~> 0.0.1)
26
27
  mysql2 (0.3.11)
27
- pry (0.9.7.4)
28
- coderay (~> 0.9.8)
29
- method_source (~> 0.6.7)
30
- ruby_parser (>= 2.3.1)
31
- slop (~> 2.1.0)
28
+ pry (0.9.8.4)
29
+ coderay (~> 1.0.5)
30
+ method_source (~> 0.7.1)
31
+ slop (>= 2.4.4, < 3)
32
32
  rake (0.9.2.2)
33
33
  rdiscount (1.6.8)
34
- ruby_parser (2.3.1)
35
- sexp_processor (~> 3.0)
36
- sequel (3.31.0)
37
- sexp_processor (3.0.10)
38
- slop (2.1.0)
34
+ rdoc (3.12)
35
+ json (~> 1.4)
36
+ sequel (3.33.0)
37
+ slop (2.4.4)
39
38
  sqlite3 (1.3.5)
40
- test-unit (2.3.2)
39
+ test-unit (2.4.8)
41
40
  thor (0.14.6)
42
- versionomy (0.4.1)
43
- blockenspiel (>= 0.4.1)
44
- yard (0.7.4)
41
+ versionomy (0.4.2)
42
+ blockenspiel (>= 0.4.3)
43
+ yard (0.7.5)
45
44
 
46
45
  PLATFORMS
47
46
  ruby
48
47
 
49
48
  DEPENDENCIES
50
- bundler (~> 1.0.0)
49
+ bundler
51
50
  guard-test
52
51
  guard-yard
53
- jeweler (~> 1.6.4)
52
+ jeweler
54
53
  mocha
55
54
  mysql2
56
55
  pry
@@ -58,6 +57,6 @@ DEPENDENCIES
58
57
  rdiscount
59
58
  sequel
60
59
  sqlite3
61
- test-unit (= 2.3.2)
60
+ test-unit
62
61
  versionomy
63
62
  yard
data/Guardfile CHANGED
@@ -9,3 +9,5 @@ end
9
9
  guard 'yard' do
10
10
  watch(%r{lib/[^.].*\.rb$})
11
11
  end
12
+
13
+ notification :notifysend, :u => :normal
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -81,8 +81,8 @@ module Linkage
81
81
  raise "Wonky filter"
82
82
  end
83
83
 
84
- arg1 = target.data.to_expr
85
- arg2 = other.is_a?(DataWrapper) ? other.data.to_expr : other
84
+ arg1 = target.to_expr(@side)
85
+ arg2 = other.is_a?(DataWrapper) ? other.to_expr(@side) : other
86
86
  @filter_expr =
87
87
  case @operator
88
88
  when :==
@@ -116,7 +116,7 @@ module Linkage
116
116
  raise "Wonky expectation"
117
117
  end
118
118
 
119
- expr = target.data.to_expr
119
+ expr = target.to_expr(side)
120
120
  aliased_expr = expr
121
121
  if expr != merged_field.name
122
122
  aliased_expr = expr.as(merged_field.name)
@@ -169,6 +169,10 @@ module Linkage
169
169
  def data
170
170
  @dataset.field_set[@name]
171
171
  end
172
+
173
+ def to_expr(side = nil)
174
+ data.to_expr
175
+ end
172
176
  end
173
177
 
174
178
  class FunctionWrapper < DataWrapper
@@ -193,6 +197,11 @@ module Linkage
193
197
  @data ||= @klass.new(*@args.collect { |arg| arg.kind_of?(DataWrapper) ? arg.data : arg })
194
198
  end
195
199
 
200
+ def to_expr(side)
201
+ dataset = side == :lhs ? @dsl.lhs : @dsl.rhs
202
+ data.to_expr(dataset.dataset.adapter_scheme)
203
+ end
204
+
196
205
  def name
197
206
  data.name
198
207
  end
@@ -222,6 +231,8 @@ module Linkage
222
231
  end
223
232
 
224
233
  class DatasetWrapper
234
+ attr_reader :dataset
235
+
225
236
  def initialize(dsl, side, dataset)
226
237
  @dsl = dsl
227
238
  @dataset = dataset
data/lib/linkage/data.rb CHANGED
@@ -28,7 +28,7 @@ module Linkage
28
28
  raise NotImplementedError
29
29
  end
30
30
 
31
- def to_expr
31
+ def to_expr(adapter = nil)
32
32
  raise NotImplementedError
33
33
  end
34
34
 
@@ -54,6 +54,9 @@ module Linkage
54
54
  # type
55
55
  if type_1 != type_2
56
56
  result_type = first_common_type(type_1, type_2)
57
+ if result_type.nil?
58
+ raise "Can't merge #{type_1} (#{name}) with #{type_2} (#{other.name})"
59
+ end
57
60
  end
58
61
 
59
62
  # text
data/lib/linkage/field.rb CHANGED
@@ -70,7 +70,7 @@ module Linkage
70
70
  @ruby_type
71
71
  end
72
72
 
73
- def to_expr
73
+ def to_expr(adapter = nil)
74
74
  @name
75
75
  end
76
76
 
@@ -12,5 +12,19 @@ module Linkage
12
12
  end
13
13
  end
14
14
  end
15
+
16
+ def has_key?(key)
17
+ !fetch_key(key).nil?
18
+ end
19
+
20
+ def fetch_key(key)
21
+ string_key = key.to_s
22
+ keys.detect { |k| k.to_s.casecmp(string_key) == 0 }
23
+ end
24
+
25
+ def [](key)
26
+ k = fetch_key(key)
27
+ k ? super(k) : nil
28
+ end
15
29
  end
16
30
  end
@@ -62,7 +62,7 @@ module Linkage
62
62
  end
63
63
 
64
64
  # @return [Sequel::SQL::Function]
65
- def to_expr
65
+ def to_expr(adapter = nil)
66
66
  self.class.function_name.to_sym.sql_function(*@values)
67
67
  end
68
68
 
@@ -81,7 +81,7 @@ module Linkage
81
81
  @names << arg.name
82
82
  @static &&= arg.static?
83
83
  type = arg.ruby_type[:type]
84
- value = arg.is_a?(Field) ? arg.name : arg.to_expr
84
+ value = arg.to_expr
85
85
  else
86
86
  @names << arg.to_s.gsub(/\W/, "")
87
87
  type = arg.class
@@ -0,0 +1,32 @@
1
+ module Linkage
2
+ module Functions
3
+ class Strftime < Function
4
+ def self.function_name
5
+ "strftime"
6
+ end
7
+
8
+ def self.parameters
9
+ [[Date, Time, DateTime], [String]]
10
+ end
11
+
12
+ def ruby_type
13
+ # TODO: string length needed
14
+ {:type => String}
15
+ end
16
+
17
+ def to_expr(adapter = nil)
18
+ case adapter
19
+ when :mysql, :mysql2
20
+ :date_format.sql_function(*@values)
21
+ when :sqlite
22
+ :strftime.sql_function(@values[1], @values[0])
23
+ when :postgres
24
+ :to_char.sql_function(*@values)
25
+ else
26
+ :strftime.sql_function(@values[0], @values[1])
27
+ end
28
+ end
29
+ end
30
+ Function.register(Strftime)
31
+ end
32
+ end
data/linkage.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "linkage"
8
- s.version = "0.0.4"
8
+ s.version = "0.0.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jeremy Stephens"]
12
- s.date = "2012-03-20"
12
+ s.date = "2012-03-30"
13
13
  s.description = "Performs record linkage between one or two datasets, using Sequel on the backend"
14
14
  s.email = "jeremy.f.stephens@vanderbilt.edu"
15
15
  s.extra_rdoc_files = [
@@ -33,6 +33,7 @@ Gem::Specification.new do |s|
33
33
  "lib/linkage/field.rb",
34
34
  "lib/linkage/field_set.rb",
35
35
  "lib/linkage/function.rb",
36
+ "lib/linkage/functions/strftime.rb",
36
37
  "lib/linkage/functions/trim.rb",
37
38
  "lib/linkage/group.rb",
38
39
  "lib/linkage/import_buffer.rb",
@@ -47,7 +48,9 @@ Gem::Specification.new do |s|
47
48
  "test/integration/test_cross_linkage.rb",
48
49
  "test/integration/test_dataset.rb",
49
50
  "test/integration/test_dual_linkage.rb",
51
+ "test/integration/test_functions.rb",
50
52
  "test/integration/test_self_linkage.rb",
53
+ "test/unit/functions/test_strftime.rb",
51
54
  "test/unit/functions/test_trim.rb",
52
55
  "test/unit/runner/test_single_threaded.rb",
53
56
  "test/unit/test_configuration.rb",
@@ -66,7 +69,7 @@ Gem::Specification.new do |s|
66
69
  s.homepage = "http://github.com/coupler/linkage"
67
70
  s.licenses = ["MIT"]
68
71
  s.require_paths = ["lib"]
69
- s.rubygems_version = "1.3.9.4"
72
+ s.rubygems_version = "1.8.18"
70
73
  s.summary = "Record linkage library"
71
74
 
72
75
  if s.respond_to? :specification_version then
@@ -74,9 +77,9 @@ Gem::Specification.new do |s|
74
77
 
75
78
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
76
79
  s.add_runtime_dependency(%q<sequel>, [">= 0"])
77
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
78
- s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
79
- s.add_development_dependency(%q<test-unit>, ["= 2.3.2"])
80
+ s.add_development_dependency(%q<bundler>, [">= 0"])
81
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
82
+ s.add_development_dependency(%q<test-unit>, [">= 0"])
80
83
  s.add_development_dependency(%q<mocha>, [">= 0"])
81
84
  s.add_development_dependency(%q<sqlite3>, [">= 0"])
82
85
  s.add_development_dependency(%q<yard>, [">= 0"])
@@ -89,9 +92,9 @@ Gem::Specification.new do |s|
89
92
  s.add_development_dependency(%q<guard-yard>, [">= 0"])
90
93
  else
91
94
  s.add_dependency(%q<sequel>, [">= 0"])
92
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
93
- s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
94
- s.add_dependency(%q<test-unit>, ["= 2.3.2"])
95
+ s.add_dependency(%q<bundler>, [">= 0"])
96
+ s.add_dependency(%q<jeweler>, [">= 0"])
97
+ s.add_dependency(%q<test-unit>, [">= 0"])
95
98
  s.add_dependency(%q<mocha>, [">= 0"])
96
99
  s.add_dependency(%q<sqlite3>, [">= 0"])
97
100
  s.add_dependency(%q<yard>, [">= 0"])
@@ -105,9 +108,9 @@ Gem::Specification.new do |s|
105
108
  end
106
109
  else
107
110
  s.add_dependency(%q<sequel>, [">= 0"])
108
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
109
- s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
110
- s.add_dependency(%q<test-unit>, ["= 2.3.2"])
111
+ s.add_dependency(%q<bundler>, [">= 0"])
112
+ s.add_dependency(%q<jeweler>, [">= 0"])
113
+ s.add_dependency(%q<test-unit>, [">= 0"])
111
114
  s.add_dependency(%q<mocha>, [">= 0"])
112
115
  s.add_dependency(%q<sqlite3>, [">= 0"])
113
116
  s.add_dependency(%q<yard>, [">= 0"])
@@ -0,0 +1,65 @@
1
+ require 'helper'
2
+
3
+ module IntegrationTests
4
+ class TestFunctions < Test::Unit::TestCase
5
+ def setup
6
+ @tmpdir = Dir.mktmpdir('linkage')
7
+ @tmpuri = "sqlite://" + File.join(@tmpdir, "foo")
8
+ end
9
+
10
+ def database(options = {}, &block)
11
+ Sequel.connect(@tmpuri, options, &block)
12
+ end
13
+
14
+ def teardown
15
+ FileUtils.remove_entry_secure(@tmpdir)
16
+ end
17
+
18
+ test "match functions" do
19
+ # insert the test data
20
+ database do |db|
21
+ db.create_table(:foo) { primary_key(:id); String(:bar) }
22
+ db[:foo].import([:id, :bar],
23
+ Array.new(100) { |i| [i, "bar%s" % (" " * (i % 10))] })
24
+ end
25
+
26
+ ds = Linkage::Dataset.new(@tmpuri, "foo", :single_threaded => true)
27
+ tmpuri = @tmpuri
28
+ conf = ds.link_with(ds) do
29
+ trim(lhs[:bar]).must == trim(rhs[:bar])
30
+ save_results_in(tmpuri)
31
+ end
32
+ assert_equal :self, conf.linkage_type
33
+ runner = Linkage::SingleThreadedRunner.new(conf)
34
+ runner.execute
35
+
36
+ database do |db|
37
+ assert_equal 1, db[:groups].count
38
+ end
39
+ end
40
+
41
+ test "strftime in sqlite" do
42
+ logger = Logger.new(STDERR)
43
+ database(:logger => logger) do |db|
44
+ db.create_table(:foo) { primary_key(:id); Date(:foo_date) }
45
+ db.create_table(:bar) { primary_key(:id); String(:bar_string) }
46
+ db[:foo].insert({:id => 1, :foo_date => Date.today})
47
+ db[:bar].insert({:id => 1, :bar_string => Date.today.strftime("%Y-%m-%d")})
48
+ end
49
+
50
+ ds_1 = Linkage::Dataset.new(@tmpuri, "foo", :single_threaded => true, :logger => logger)
51
+ ds_2 = Linkage::Dataset.new(@tmpuri, "bar", :single_threaded => true, :logger => logger)
52
+ tmpuri = @tmpuri
53
+ conf = ds_1.link_with(ds_2) do
54
+ strftime(lhs[:foo_date], "%Y-%m-%d").must == rhs[:bar_string]
55
+ save_results_in(tmpuri, :logger => logger)
56
+ end
57
+ runner = Linkage::SingleThreadedRunner.new(conf)
58
+ runner.execute
59
+
60
+ database do |db|
61
+ assert_equal 1, db[:groups].count
62
+ end
63
+ end
64
+ end
65
+ end
@@ -218,28 +218,5 @@ module IntegrationTests
218
218
  end
219
219
  end
220
220
  end
221
-
222
- test "match functions" do
223
- # insert the test data
224
- database do |db|
225
- db.create_table(:foo) { primary_key(:id); String(:bar) }
226
- db[:foo].import([:id, :bar],
227
- Array.new(100) { |i| [i, "bar%s" % (" " * (i % 10))] })
228
- end
229
-
230
- ds = Linkage::Dataset.new(@tmpuri, "foo", :single_threaded => true)
231
- tmpuri = @tmpuri
232
- conf = ds.link_with(ds) do
233
- trim(lhs[:bar]).must == trim(rhs[:bar])
234
- save_results_in(tmpuri)
235
- end
236
- assert_equal :self, conf.linkage_type
237
- runner = Linkage::SingleThreadedRunner.new(conf)
238
- runner.execute
239
-
240
- database do |db|
241
- assert_equal 1, db[:groups].count
242
- end
243
- end
244
221
  end
245
222
  end
@@ -0,0 +1,56 @@
1
+ require 'helper'
2
+
3
+ class UnitTests::TestStrftime < Test::Unit::TestCase
4
+ def self.const_missing(name)
5
+ if Linkage::Functions.const_defined?(name)
6
+ Linkage::Functions.const_get(name)
7
+ else
8
+ super
9
+ end
10
+ end
11
+
12
+ test "subclass of Function" do
13
+ assert_equal Linkage::Function, Linkage::Functions::Strftime.superclass
14
+ end
15
+
16
+ test "ruby_type" do
17
+ expected = {:type => String}
18
+ format = "%Y-%m-%d"
19
+ assert_equal(expected, Linkage::Functions::Strftime.new(Time.now, format).ruby_type)
20
+ field = stub_field('field 1', :name => :bar, :ruby_type => {:type => Time})
21
+ assert_equal(expected, Linkage::Functions::Strftime.new(field, format).ruby_type)
22
+ func = new_function('foo', {:type => Time, :opts => {:junk => '123'}})
23
+ assert_equal(expected, Linkage::Functions::Strftime.new(func.new, format).ruby_type)
24
+ end
25
+
26
+ test "parameters" do
27
+ assert_equal [[Date, Time, DateTime], [String]], Linkage::Functions::Strftime.parameters
28
+ end
29
+
30
+ test "name" do
31
+ assert_equal "strftime", Linkage::Functions::Strftime.function_name
32
+ end
33
+
34
+ test "registers itself" do
35
+ assert_equal Linkage::Function["strftime"], Linkage::Functions::Strftime
36
+ end
37
+
38
+ test "to_expr for sqlite" do
39
+ args = [Time.now, "%Y-%m-%d"]
40
+ func = Strftime.new(*args)
41
+ assert_equal :strftime.sql_function(args[1], args[0]), func.to_expr(:sqlite)
42
+ end
43
+
44
+ test "to_expr for mysql" do
45
+ args = [Time.now, "%Y-%m-%d"]
46
+ func = Strftime.new(*args)
47
+ assert_equal :date_format.sql_function(*args), func.to_expr(:mysql)
48
+ assert_equal :date_format.sql_function(*args), func.to_expr(:mysql2)
49
+ end
50
+
51
+ test "to_expr for postgresql" do
52
+ args = [Time.now, "%Y-%m-%d"]
53
+ func = Strftime.new(*args)
54
+ assert_equal :to_char.sql_function(*args), func.to_expr(:postgres)
55
+ end
56
+ end
@@ -128,10 +128,10 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
128
128
  end
129
129
 
130
130
  test "dynamic database function" do
131
- dataset_1 = stub('dataset')
131
+ dataset_1 = stub('dataset', :adapter_scheme => :sqlite)
132
132
  field_1 = stub('field 1')
133
133
  dataset_1.stubs(:field_set).returns({:foo => field_1})
134
- dataset_2 = stub('dataset')
134
+ dataset_2 = stub('dataset', :adapter_scheme => :mysql2)
135
135
  field_2 = stub('field 2', :to_expr => :foo)
136
136
  dataset_2.stubs(:field_set).returns({:foo => field_2})
137
137
 
@@ -157,10 +157,10 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
157
157
  end
158
158
 
159
159
  test "static database function" do
160
- dataset_1 = stub('dataset')
160
+ dataset_1 = stub('dataset', :adapter_scheme => :sqlite)
161
161
  field_1 = stub('field 1', :to_expr => :foo)
162
162
  dataset_1.stubs(:field_set).returns({:foo => field_1})
163
- dataset_2 = stub('dataset')
163
+ dataset_2 = stub('dataset', :adapter_scheme => :mysql)
164
164
  field_2 = stub('field 2')
165
165
  dataset_2.stubs(:field_set).returns({:foo => field_2})
166
166
 
@@ -196,4 +196,19 @@ class UnitTests::TestConfiguration < Test::Unit::TestCase
196
196
  Linkage::ResultSet.expects(:new).with(c).returns(result_set)
197
197
  assert_equal result_set, c.result_set
198
198
  end
199
+
200
+ test "case insensitive field names" do
201
+ field_1 = stub('field_1', :to_expr => :foo)
202
+ field_2 = stub('field_2', :to_expr => :bar)
203
+ field_set = {:foo => field_1, :bar => :field_2}
204
+ field_set.expects(:has_key?).with(:Foo).returns(true)
205
+ field_set.expects(:has_key?).with(:baR).returns(true)
206
+ dataset = stub('dataset', :field_set => field_set)
207
+ c = Linkage::Configuration.new(dataset, dataset)
208
+ assert_nothing_raised do
209
+ c.configure do
210
+ lhs[:Foo].must == rhs[:baR]
211
+ end
212
+ end
213
+ end
199
214
  end
@@ -392,4 +392,10 @@ class UnitTests::TestData < Test::Unit::TestCase
392
392
  result_data = data_2.merge(data_1, 'foo')
393
393
  assert_equal :foo, result_data.name
394
394
  end
395
+
396
+ test "merge a string field and a date field" do
397
+ data_1 = new_data(:foo, {:type => String})
398
+ data_2 = new_data(:foo, {:type => Date})
399
+ assert_raises { data_1.merge(data_2).ruby_type }
400
+ end
395
401
  end
@@ -42,4 +42,9 @@ class UnitTests::TestField < Test::Unit::TestCase
42
42
  field = Linkage::Field.new(:id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
43
43
  assert_equal :id, field.to_expr
44
44
  end
45
+
46
+ test "to_expr ignores adapter argument" do
47
+ field = Linkage::Field.new(:id, {:allow_null=>true, :default=>nil, :primary_key=>true, :db_type=>"integer", :type=>:integer, :ruby_default=>nil})
48
+ assert_equal :id, field.to_expr(:foo)
49
+ end
45
50
  end
@@ -28,4 +28,19 @@ class UnitTests::TestFieldSet < Test::Unit::TestCase
28
28
  assert_equal field_2, fs[:first_name]
29
29
  assert_equal field_3, fs[:last_name]
30
30
  end
31
+
32
+ test "case-insensitive names" do
33
+ field_1 = stub('id field')
34
+ field_2 = stub('first_name field')
35
+ field_3 = stub('last_name field')
36
+ Linkage::Field.stubs(:new).with(:id, @schema[:id]).returns(field_1)
37
+ Linkage::Field.stubs(:new).with(:first_name, @schema[:first_name]).returns(field_2)
38
+ Linkage::Field.stubs(:new).with(:last_name, @schema[:last_name]).returns(field_3)
39
+
40
+ fs = Linkage::FieldSet.new(@schema)
41
+ assert_equal field_1, fs.primary_key
42
+ assert_equal field_1, fs[:Id]
43
+ assert_equal field_2, fs[:fIrst_name]
44
+ assert_equal field_3, fs[:laSt_name]
45
+ end
31
46
  end
@@ -55,7 +55,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
55
55
 
56
56
  test "function with field" do
57
57
  klass = new_function('foo', {:type => String})
58
- field = stub_field('field', :name => :bar, :ruby_type => {:type => String})
58
+ field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
59
59
  f = klass.new(field)
60
60
  assert_equal :foo_bar, f.name
61
61
  assert_equal :foo.sql_function(:bar), f.to_expr
@@ -66,7 +66,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
66
66
  klass_1 = new_function('foo', {:type => String})
67
67
  klass_2 = new_function('bar', {:type => String})
68
68
 
69
- field = stub_field('field', :name => :baz, :ruby_type => {:type => String})
69
+ field = stub_field('field', :name => :baz, :to_expr => :baz, :ruby_type => {:type => String})
70
70
  func_1 = klass_1.new(field)
71
71
  assert_equal :foo_baz, func_1.name
72
72
  assert !func_1.static?
@@ -100,7 +100,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
100
100
  assert_equal :foo_123, func_1.name
101
101
  assert func_1.static?
102
102
 
103
- field = stub_field('field', :name => :quux, :ruby_type => {:type => String})
103
+ field = stub_field('field', :name => :quux, :to_expr => :quux, :ruby_type => {:type => String})
104
104
  func_2 = klass_2.new(field)
105
105
  assert_equal :bar_quux, func_2.name
106
106
  assert !func_2.static?
@@ -113,8 +113,8 @@ class UnitTests::TestFunction < Test::Unit::TestCase
113
113
 
114
114
  test "function with multiple fields" do
115
115
  klass = new_function('foo', {:type => String})
116
- field_1 = stub_field('field', :name => :bar, :ruby_type => {:type => String})
117
- field_2 = stub_field('field', :name => :baz, :ruby_type => {:type => String})
116
+ field_1 = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
117
+ field_2 = stub_field('field', :name => :baz, :to_expr => :baz, :ruby_type => {:type => String})
118
118
  func = klass.new(field_1, field_2)
119
119
  assert_equal :foo_bar_baz, func.name
120
120
  assert_equal :foo.sql_function(:bar, :baz), func.to_expr
@@ -123,7 +123,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
123
123
 
124
124
  test "function with multiple mixed arguments" do
125
125
  klass = new_function('foo', {:type => String})
126
- field = stub_field('field', :name => :bar, :ruby_type => {:type => String})
126
+ field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
127
127
  f = klass.new(field, 123, 'abc')
128
128
  assert_equal :foo_bar_123_abc, f.name
129
129
  assert_equal :foo.sql_function(:bar, 123, 'abc'), f.to_expr
@@ -138,7 +138,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
138
138
  test "valid parameters" do
139
139
  func = new_function('foo', {:type => String}, [[String]])
140
140
  assert_equal :foo.sql_function("foo"), func.new("foo").to_expr
141
- field = stub_field('field', :name => :bar, :ruby_type => {:type => String})
141
+ field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => String})
142
142
  assert_equal :foo.sql_function(:bar), func.new(field).to_expr
143
143
  assert_equal :foo.sql_function(:foo.sql_function("hey")), func.new(func.new("hey")).to_expr
144
144
  end
@@ -148,7 +148,7 @@ class UnitTests::TestFunction < Test::Unit::TestCase
148
148
  assert_raises(TypeError) do
149
149
  func.new(123)
150
150
  end
151
- field = stub_field('field', :name => :bar, :ruby_type => {:type => Integer})
151
+ field = stub_field('field', :name => :bar, :to_expr => :bar, :ruby_type => {:type => Integer})
152
152
  assert_raises(TypeError) do
153
153
  func.new(field)
154
154
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linkage
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-03-20 00:00:00.000000000 -05:00
13
- default_executable:
12
+ date: 2012-03-30 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: sequel
17
- requirement: &6839080 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
18
17
  none: false
19
18
  requirements:
20
19
  - - ! '>='
@@ -22,43 +21,63 @@ dependencies:
22
21
  version: '0'
23
22
  type: :runtime
24
23
  prerelease: false
25
- version_requirements: *6839080
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
26
30
  - !ruby/object:Gem::Dependency
27
31
  name: bundler
28
- requirement: &6837220 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
29
33
  none: false
30
34
  requirements:
31
- - - ~>
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
- version: 1.0.0
37
+ version: '0'
34
38
  type: :development
35
39
  prerelease: false
36
- version_requirements: *6837220
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
37
46
  - !ruby/object:Gem::Dependency
38
47
  name: jeweler
39
- requirement: &6848560 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
40
49
  none: false
41
50
  requirements:
42
- - - ~>
51
+ - - ! '>='
43
52
  - !ruby/object:Gem::Version
44
- version: 1.6.4
53
+ version: '0'
45
54
  type: :development
46
55
  prerelease: false
47
- version_requirements: *6848560
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
48
62
  - !ruby/object:Gem::Dependency
49
63
  name: test-unit
50
- requirement: &6843960 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
51
65
  none: false
52
66
  requirements:
53
- - - =
67
+ - - ! '>='
54
68
  - !ruby/object:Gem::Version
55
- version: 2.3.2
69
+ version: '0'
56
70
  type: :development
57
71
  prerelease: false
58
- version_requirements: *6843960
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
59
78
  - !ruby/object:Gem::Dependency
60
79
  name: mocha
61
- requirement: &7697360 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
62
81
  none: false
63
82
  requirements:
64
83
  - - ! '>='
@@ -66,10 +85,15 @@ dependencies:
66
85
  version: '0'
67
86
  type: :development
68
87
  prerelease: false
69
- version_requirements: *7697360
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
70
94
  - !ruby/object:Gem::Dependency
71
95
  name: sqlite3
72
- requirement: &7735360 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
73
97
  none: false
74
98
  requirements:
75
99
  - - ! '>='
@@ -77,10 +101,15 @@ dependencies:
77
101
  version: '0'
78
102
  type: :development
79
103
  prerelease: false
80
- version_requirements: *7735360
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
81
110
  - !ruby/object:Gem::Dependency
82
111
  name: yard
83
- requirement: &7747140 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
84
113
  none: false
85
114
  requirements:
86
115
  - - ! '>='
@@ -88,10 +117,15 @@ dependencies:
88
117
  version: '0'
89
118
  type: :development
90
119
  prerelease: false
91
- version_requirements: *7747140
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
92
126
  - !ruby/object:Gem::Dependency
93
127
  name: rake
94
- requirement: &7744260 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
95
129
  none: false
96
130
  requirements:
97
131
  - - ! '>='
@@ -99,10 +133,15 @@ dependencies:
99
133
  version: '0'
100
134
  type: :development
101
135
  prerelease: false
102
- version_requirements: *7744260
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
103
142
  - !ruby/object:Gem::Dependency
104
143
  name: versionomy
105
- requirement: &7756060 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
106
145
  none: false
107
146
  requirements:
108
147
  - - ! '>='
@@ -110,10 +149,15 @@ dependencies:
110
149
  version: '0'
111
150
  type: :development
112
151
  prerelease: false
113
- version_requirements: *7756060
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
114
158
  - !ruby/object:Gem::Dependency
115
159
  name: mysql2
116
- requirement: &7754660 !ruby/object:Gem::Requirement
160
+ requirement: !ruby/object:Gem::Requirement
117
161
  none: false
118
162
  requirements:
119
163
  - - ! '>='
@@ -121,10 +165,15 @@ dependencies:
121
165
  version: '0'
122
166
  type: :development
123
167
  prerelease: false
124
- version_requirements: *7754660
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
125
174
  - !ruby/object:Gem::Dependency
126
175
  name: pry
127
- requirement: &7752840 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
128
177
  none: false
129
178
  requirements:
130
179
  - - ! '>='
@@ -132,10 +181,15 @@ dependencies:
132
181
  version: '0'
133
182
  type: :development
134
183
  prerelease: false
135
- version_requirements: *7752840
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
136
190
  - !ruby/object:Gem::Dependency
137
191
  name: rdiscount
138
- requirement: &7749720 !ruby/object:Gem::Requirement
192
+ requirement: !ruby/object:Gem::Requirement
139
193
  none: false
140
194
  requirements:
141
195
  - - ! '>='
@@ -143,10 +197,15 @@ dependencies:
143
197
  version: '0'
144
198
  type: :development
145
199
  prerelease: false
146
- version_requirements: *7749720
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
147
206
  - !ruby/object:Gem::Dependency
148
207
  name: guard-test
149
- requirement: &7764320 !ruby/object:Gem::Requirement
208
+ requirement: !ruby/object:Gem::Requirement
150
209
  none: false
151
210
  requirements:
152
211
  - - ! '>='
@@ -154,10 +213,15 @@ dependencies:
154
213
  version: '0'
155
214
  type: :development
156
215
  prerelease: false
157
- version_requirements: *7764320
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
158
222
  - !ruby/object:Gem::Dependency
159
223
  name: guard-yard
160
- requirement: &7760020 !ruby/object:Gem::Requirement
224
+ requirement: !ruby/object:Gem::Requirement
161
225
  none: false
162
226
  requirements:
163
227
  - - ! '>='
@@ -165,7 +229,12 @@ dependencies:
165
229
  version: '0'
166
230
  type: :development
167
231
  prerelease: false
168
- version_requirements: *7760020
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ none: false
234
+ requirements:
235
+ - - ! '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
169
238
  description: Performs record linkage between one or two datasets, using Sequel on
170
239
  the backend
171
240
  email: jeremy.f.stephens@vanderbilt.edu
@@ -191,6 +260,7 @@ files:
191
260
  - lib/linkage/field.rb
192
261
  - lib/linkage/field_set.rb
193
262
  - lib/linkage/function.rb
263
+ - lib/linkage/functions/strftime.rb
194
264
  - lib/linkage/functions/trim.rb
195
265
  - lib/linkage/group.rb
196
266
  - lib/linkage/import_buffer.rb
@@ -205,7 +275,9 @@ files:
205
275
  - test/integration/test_cross_linkage.rb
206
276
  - test/integration/test_dataset.rb
207
277
  - test/integration/test_dual_linkage.rb
278
+ - test/integration/test_functions.rb
208
279
  - test/integration/test_self_linkage.rb
280
+ - test/unit/functions/test_strftime.rb
209
281
  - test/unit/functions/test_trim.rb
210
282
  - test/unit/runner/test_single_threaded.rb
211
283
  - test/unit/test_configuration.rb
@@ -220,7 +292,6 @@ files:
220
292
  - test/unit/test_result_set.rb
221
293
  - test/unit/test_runner.rb
222
294
  - test/unit/test_utils.rb
223
- has_rdoc: true
224
295
  homepage: http://github.com/coupler/linkage
225
296
  licenses:
226
297
  - MIT
@@ -236,7 +307,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
236
307
  version: '0'
237
308
  segments:
238
309
  - 0
239
- hash: 3920524836542711484
310
+ hash: -1705215583013388953
240
311
  required_rubygems_version: !ruby/object:Gem::Requirement
241
312
  none: false
242
313
  requirements:
@@ -245,7 +316,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
316
  version: '0'
246
317
  requirements: []
247
318
  rubyforge_project:
248
- rubygems_version: 1.3.9.4
319
+ rubygems_version: 1.8.18
249
320
  signing_key:
250
321
  specification_version: 3
251
322
  summary: Record linkage library