upsert 1.1.7 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YTE3MDYwZTVkNjkyOWUwOTc4MmNjYTFmOWI4OGNhZjFkYjk5ZjE0YQ==
5
+ data.tar.gz: !binary |-
6
+ MzY5ZDAzZGViY2E5NzQ4NThjOTJiNTg3ZmQ1NTEyMjhmMjRjMjVlNw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MzZjZjlmYmI4Y2QxZWMxMDAwYTcwMjUwMDc1YTZhMzU3MTA0YTY4MWQzNWE4
10
+ OWMyZDBlOTVmZGNmNTQzZTQ5MzM4NjgxNTFkNzA0MTNhYzIyYWI0N2VmYTY2
11
+ MDA1YjQ4NjY3Mzg5NWVjMDQ0YmViMzA2NmM1NDZjNmIxNWM2MGM=
12
+ data.tar.gz: !binary |-
13
+ MDM2ZTY0YTRlYTVhMmExZGZmMTAyYTEzMjc5YTFmYWVjNjY2MDIxZTg2ODMw
14
+ YzQ2OWExNmNhNmRjZmQ2YTAxNjdjOTY3NWRhZDQwMjZjNzA2Mzg0NDY0NjBj
15
+ ZDUzMzhhZjQzNTY5YjE5YmU3NzI0OTkzMTNlZjdmZDg0YjQ4NDE=
data/CHANGELOG CHANGED
@@ -1,3 +1,17 @@
1
+ 1.2.0 / 2013-04-04
2
+
3
+ * Breaking changes
4
+
5
+ * columns named "created_at" and "created_on" will only be set if it's a new row - thanks @derekharmel! https://github.com/seamusabshere/upsert/pull/15
6
+
7
+ * Enhancements
8
+
9
+ * Detect invalid columns passed in either selector or setter - inspired by @atandrau, thanks! https://github.com/seamusabshere/upsert/issues/18
10
+
11
+ * Bug fixes
12
+
13
+ * Always convert symbols to strings when used as bind vars - thanks @towerhe! - https://github.com/seamusabshere/upsert/pull/16
14
+
1
15
  1.1.7 / 2013-01-15
2
16
 
3
17
  * Enhancements
data/Gemfile CHANGED
@@ -3,6 +3,3 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in upsert.gemspec
4
4
 
5
5
  gemspec
6
- if RUBY_PLATFORM == 'java'
7
- gem 'activerecord-jdbc-adapter', github: 'jruby/activerecord-jdbc-adapter'
8
- end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Brighter Planet, Inc.
1
+ Copyright (c) 2013 Seamus Abshere
2
2
 
3
3
  MIT License
4
4
 
@@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
19
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
20
  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
21
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -25,9 +25,11 @@ connection = Mysql2::Client.new([...])
25
25
  table_name = :pets
26
26
  upsert = Upsert.new connection, table_name
27
27
  # N times...
28
- upsert.row({:name => 'Jerry'}, :breed => 'beagle')
28
+ upsert.row({:name => 'Jerry'}, :breed => 'beagle', :created_at => Time.now)
29
29
  ```
30
30
 
31
+ The `created_at` and `created_on` columns are used for inserts, but ignored on updates.
32
+
31
33
  So just to reiterate you've got a __selector__ and a __setter__:
32
34
 
33
35
  ```ruby
@@ -156,6 +156,7 @@ class Upsert
156
156
  'PGConn' => 'PG::Connection',
157
157
  'org.sqlite.Conn' => 'Java::OrgSqliteConn' # for some reason, org.sqlite.Conn doesn't have a ruby class name
158
158
  }
159
+ CREATED_COL_REGEX = /\Acreated_(at|on)\Z/
159
160
 
160
161
  # @return [Upsert::Connection]
161
162
  attr_reader :connection
@@ -0,0 +1,27 @@
1
+ class Upsert
2
+ class ColumnDefinition
3
+ # @private
4
+ class Sqlite3 < ColumnDefinition
5
+ class << self
6
+ def all(connection, table_name)
7
+ # activerecord-3.2.13/lib/active_record/connection_adapters/sqlite_adapter.rb
8
+ connection.execute("PRAGMA table_info(#{connection.quote_ident(table_name)})").map do |row|#, 'SCHEMA').to_hash
9
+ default = case row["dflt_value"]
10
+ when /^null$/i
11
+ nil
12
+ when /^'(.*)'$/
13
+ $1.gsub(/''/, "'")
14
+ when /^"(.*)"$/
15
+ $1.gsub(/""/, '"')
16
+ else
17
+ row["dflt_value"]
18
+ end
19
+ new connection, row['name'], row['type'], default
20
+ end.sort_by do |cd|
21
+ cd.name
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -26,6 +26,8 @@ class Upsert
26
26
  Upsert.utc_iso8601 v
27
27
  when Date
28
28
  v.strftime ISO8601_DATE
29
+ when Symbol
30
+ v.to_s
29
31
  else
30
32
  v
31
33
  end
@@ -10,12 +10,8 @@ class Upsert
10
10
  't'
11
11
  when FalseClass
12
12
  'f'
13
- when Time, DateTime
14
- Upsert.utc_iso8601 v
15
- when Date
16
- v.strftime ISO8601_DATE
17
13
  else
18
- v
14
+ super
19
15
  end
20
16
  end
21
17
  end
@@ -46,6 +46,7 @@ class Upsert
46
46
  @controller = controller
47
47
  @selector_keys = selector_keys
48
48
  @setter_keys = setter_keys
49
+ validate!
49
50
  create! unless assume_function_exists
50
51
  end
51
52
 
@@ -68,5 +69,15 @@ class Upsert
68
69
  def column_definitions
69
70
  controller.column_definitions
70
71
  end
72
+
73
+ private
74
+
75
+ def validate!
76
+ possible = column_definitions.map(&:name)
77
+ invalid = (setter_keys + selector_keys).uniq - possible
78
+ if invalid.any?
79
+ raise ArgumentError, "[Upsert] Invalid column(s): #{invalid.map(&:inspect).join(', ')}"
80
+ end
81
+ end
71
82
  end
72
83
  end
@@ -22,6 +22,7 @@ class Upsert
22
22
  Upsert.logger.info "[upsert] Creating or replacing database function #{name.inspect} on table #{table_name.inspect} for selector #{selector_keys.map(&:inspect).join(', ')} and setter #{setter_keys.map(&:inspect).join(', ')}"
23
23
  selector_column_definitions = column_definitions.select { |cd| selector_keys.include?(cd.name) }
24
24
  setter_column_definitions = column_definitions.select { |cd| setter_keys.include?(cd.name) }
25
+ update_column_definitions = setter_column_definitions.select { |cd| cd.name !~ CREATED_COL_REGEX }
25
26
  quoted_name = connection.quote_ident name
26
27
  connection.execute "DROP PROCEDURE IF EXISTS #{quoted_name}"
27
28
  connection.execute(%{
@@ -50,7 +51,7 @@ class Upsert
50
51
  -- key error. But the handler above will take care of that.
51
52
  IF @count > 0 THEN
52
53
  -- UPDATE table_name SET b = b_SET WHERE a = a_SEL;
53
- UPDATE #{quoted_table_name} SET #{setter_column_definitions.map(&:to_setter).join(', ')} WHERE #{selector_column_definitions.map(&:to_selector).join(' AND ')};
54
+ UPDATE #{quoted_table_name} SET #{update_column_definitions.map(&:to_setter).join(', ')} WHERE #{selector_column_definitions.map(&:to_selector).join(' AND ')};
54
55
  ELSE
55
56
  -- INSERT INTO table_name (a, b) VALUES (k, data);
56
57
  INSERT INTO #{quoted_table_name} (#{setter_column_definitions.map(&:quoted_name).join(', ')}) VALUES (#{setter_column_definitions.map(&:to_setter_value).join(', ')});
@@ -53,6 +53,7 @@ class Upsert
53
53
  Upsert.logger.info "[upsert] Creating or replacing database function #{name.inspect} on table #{table_name.inspect} for selector #{selector_keys.map(&:inspect).join(', ')} and setter #{setter_keys.map(&:inspect).join(', ')}"
54
54
  selector_column_definitions = column_definitions.select { |cd| selector_keys.include?(cd.name) }
55
55
  setter_column_definitions = column_definitions.select { |cd| setter_keys.include?(cd.name) }
56
+ update_column_definitions = setter_column_definitions.select { |cd| cd.name !~ CREATED_COL_REGEX }
56
57
  first_try = true
57
58
  connection.execute(%{
58
59
  CREATE OR REPLACE FUNCTION #{name}(#{(selector_column_definitions.map(&:to_selector_arg) + setter_column_definitions.map(&:to_setter_arg)).join(', ')}) RETURNS VOID AS
@@ -62,7 +63,7 @@ class Upsert
62
63
  BEGIN
63
64
  LOOP
64
65
  -- first try to update the key
65
- UPDATE #{quoted_table_name} SET #{setter_column_definitions.map(&:to_setter).join(', ')}
66
+ UPDATE #{quoted_table_name} SET #{update_column_definitions.map(&:to_setter).join(', ')}
66
67
  WHERE #{selector_column_definitions.map(&:to_selector).join(' AND ') };
67
68
  IF found THEN
68
69
  RETURN;
@@ -3,11 +3,13 @@ class Upsert
3
3
  # @private
4
4
  module Sqlite3
5
5
  attr_reader :quoted_setter_names
6
+ attr_reader :quoted_update_names
6
7
  attr_reader :quoted_selector_names
7
8
 
8
9
  def initialize(*)
9
10
  super
10
11
  @quoted_setter_names = setter_keys.map { |k| connection.quote_ident k }
12
+ @quoted_update_names = setter_keys.select { |k| k !~ CREATED_COL_REGEX }.map { |k| connection.quote_ident k }
11
13
  @quoted_selector_names = selector_keys.map { |k| connection.quote_ident k }
12
14
  end
13
15
 
@@ -18,12 +20,13 @@ class Upsert
18
20
  def execute(row)
19
21
  bind_setter_values = row.setter.values.map { |v| connection.bind_value v }
20
22
  bind_selector_values = row.selector.values.map { |v| connection.bind_value v }
21
-
23
+ bind_update_values = row.setter.select{ |k,v| k !~ CREATED_COL_REGEX }.map { |k,v| connection.bind_value v }
24
+
22
25
  insert_or_ignore_sql = %{INSERT OR IGNORE INTO #{quoted_table_name} (#{quoted_setter_names.join(',')}) VALUES (#{Array.new(bind_setter_values.length, '?').join(',')})}
23
26
  connection.execute insert_or_ignore_sql, bind_setter_values
24
27
 
25
- update_sql = %{UPDATE #{quoted_table_name} SET #{quoted_setter_names.map { |qk| "#{qk}=?" }.join(',')} WHERE #{quoted_selector_names.map { |qk| "#{qk}=?" }.join(' AND ')}}
26
- connection.execute update_sql, (bind_setter_values + bind_selector_values)
28
+ update_sql = %{UPDATE #{quoted_table_name} SET #{quoted_update_names.map { |qk| "#{qk}=?" }.join(',')} WHERE #{quoted_selector_names.map { |qk| "#{qk}=?" }.join(' AND ')}}
29
+ connection.execute update_sql, (bind_update_values + bind_selector_values)
27
30
  end
28
31
  end
29
32
  end
@@ -1,3 +1,3 @@
1
1
  class Upsert
2
- VERSION = "1.1.7"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -46,6 +46,32 @@ describe Upsert do
46
46
  u.row(selector, setter)
47
47
  Pet.find_by_name_and_gender('Jerry', 'blue').tag_number.should == 777
48
48
  end
49
+
50
+ # https://github.com/seamusabshere/upsert/issues/18
51
+ it "uses nil selectors" do
52
+ Pet.create(name: "Jerry", gender: nil, spiel: "samoyed")
53
+ u = Upsert.new($conn, :pets)
54
+ u.row({:name => 'Jerry', gender: nil}, :spiel => 'beagle', :birthday => Time.now)
55
+ Pet.count.should == 1
56
+ end
57
+
58
+ it "uses nil selectors (another way of checking)" do
59
+ u = Upsert.new($conn, :pets)
60
+ now = Time.now
61
+ assert_creates(Pet, [{:name => 'Jerry', :gender => nil, :spiel => 'beagle', :birthday => now}]) do
62
+ u.row(name: "Jerry", gender: nil, spiel: "samoyed")
63
+ u.row({:name => 'Jerry', gender: nil}, :spiel => 'beagle', :birthday => Time.now)
64
+ end
65
+ end
66
+
67
+ it "tells you if you request a column that doesn't exist" do
68
+ u = Upsert.new($conn, :pets)
69
+ lambda { u.row(gibberish: 'ba') }.should raise_error(/invalid col/i)
70
+ lambda { u.row(name: 'Jerry', gibberish: 'ba') }.should raise_error(/invalid col/i)
71
+ lambda { u.row({name: 'Jerry'}, gibberish: 'ba') }.should raise_error(/invalid col/i)
72
+ lambda { u.row({name: 'Jerry'}, gender: 'male', gibberish: 'ba') }.should raise_error(/invalid col/i)
73
+ end
74
+
49
75
  end
50
76
 
51
77
  describe "is just as correct as other ways" do
@@ -66,6 +66,23 @@ describe Upsert do
66
66
  upsert.row({:id => jerry.id}, :lovability => 2.0)
67
67
  end
68
68
  end
69
+ it "does not set the created_at and created_on columns on update" do
70
+ task = Task.create :name => 'Clean bathroom'
71
+ created = task.created_at
72
+ upsert = Upsert.new $conn, :tasks
73
+ upsert.row({:id => task.id}, :name => 'Clean kitchen')
74
+ task.reload
75
+ task.created_at.should eql task.created_at
76
+ task.created_on.should eql task.created_on
77
+ end
78
+
79
+ it "converts symbol values to string" do
80
+ jerry = Pet.create :name => 'Jerry', :gender => 'female'
81
+ upsert = Upsert.new $conn, :pets
82
+ assert_creates(Pet, [{:name => 'Jerry', :gender => 'male'}]) do
83
+ upsert.row({:id => jerry.id}, :gender => :male)
84
+ end
85
+ end
69
86
  end
70
87
  describe :batch do
71
88
  it "works for multiple rows (base case)" do
@@ -94,4 +111,4 @@ describe Upsert do
94
111
  end
95
112
  end
96
113
  end
97
- end
114
+ end
@@ -107,6 +107,13 @@ class Pet < ActiveRecord::Base
107
107
  end
108
108
  Pet.auto_upgrade!
109
109
 
110
+ class Task < ActiveRecord::Base
111
+ col :name
112
+ col :created_at, :type => :datetime
113
+ col :created_on, :type => :datetime
114
+ end
115
+ Task.auto_upgrade!
116
+
110
117
  require 'zlib'
111
118
  require 'benchmark'
112
119
  require 'faker'
@@ -47,5 +47,6 @@ Gem::Specification.new do |gem|
47
47
  gem.add_development_dependency 'mysql2'
48
48
  gem.add_development_dependency 'pg'
49
49
  gem.add_development_dependency 'redcarpet' # github-flavored markdown
50
+ gem.add_development_dependency 'rake'
50
51
  end
51
52
  end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upsert
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.7
5
- prerelease:
4
+ version: 1.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Seamus Abshere
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-15 00:00:00.000000000 Z
11
+ date: 2013-04-04 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec-core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :development
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ! '>='
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rspec-expectations
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ! '>='
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ! '>='
44
39
  - !ruby/object:Gem::Version
@@ -46,7 +41,6 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec-mocks
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
45
  - - ! '>='
52
46
  - !ruby/object:Gem::Version
@@ -54,7 +48,6 @@ dependencies:
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
52
  - - ! '>='
60
53
  - !ruby/object:Gem::Version
@@ -62,7 +55,6 @@ dependencies:
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: activerecord
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
59
  - - ! '>='
68
60
  - !ruby/object:Gem::Version
@@ -70,7 +62,6 @@ dependencies:
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
66
  - - ! '>='
76
67
  - !ruby/object:Gem::Version
@@ -78,7 +69,6 @@ dependencies:
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: active_record_inline_schema
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
73
  - - ! '>='
84
74
  - !ruby/object:Gem::Version
@@ -86,7 +76,6 @@ dependencies:
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
80
  - - ! '>='
92
81
  - !ruby/object:Gem::Version
@@ -94,7 +83,6 @@ dependencies:
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: faker
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
87
  - - ! '>='
100
88
  - !ruby/object:Gem::Version
@@ -102,7 +90,6 @@ dependencies:
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
94
  - - ! '>='
108
95
  - !ruby/object:Gem::Version
@@ -110,7 +97,6 @@ dependencies:
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: yard
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
101
  - - ! '>='
116
102
  - !ruby/object:Gem::Version
@@ -118,7 +104,6 @@ dependencies:
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
108
  - - ! '>='
124
109
  - !ruby/object:Gem::Version
@@ -126,7 +111,6 @@ dependencies:
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: activerecord-import
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
115
  - - ! '>='
132
116
  - !ruby/object:Gem::Version
@@ -134,7 +118,6 @@ dependencies:
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
122
  - - ! '>='
140
123
  - !ruby/object:Gem::Version
@@ -142,7 +125,6 @@ dependencies:
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: pry
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
129
  - - ! '>='
148
130
  - !ruby/object:Gem::Version
@@ -150,7 +132,6 @@ dependencies:
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
136
  - - ! '>='
156
137
  - !ruby/object:Gem::Version
@@ -158,7 +139,6 @@ dependencies:
158
139
  - !ruby/object:Gem::Dependency
159
140
  name: pg-hstore
160
141
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
142
  requirements:
163
143
  - - ! '>='
164
144
  - !ruby/object:Gem::Version
@@ -166,7 +146,6 @@ dependencies:
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
149
  requirements:
171
150
  - - ! '>='
172
151
  - !ruby/object:Gem::Version
@@ -174,7 +153,6 @@ dependencies:
174
153
  - !ruby/object:Gem::Dependency
175
154
  name: sqlite3
176
155
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
156
  requirements:
179
157
  - - ! '>='
180
158
  - !ruby/object:Gem::Version
@@ -182,7 +160,6 @@ dependencies:
182
160
  type: :development
183
161
  prerelease: false
184
162
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
163
  requirements:
187
164
  - - ! '>='
188
165
  - !ruby/object:Gem::Version
@@ -190,7 +167,6 @@ dependencies:
190
167
  - !ruby/object:Gem::Dependency
191
168
  name: mysql2
192
169
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
170
  requirements:
195
171
  - - ! '>='
196
172
  - !ruby/object:Gem::Version
@@ -198,7 +174,6 @@ dependencies:
198
174
  type: :development
199
175
  prerelease: false
200
176
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
177
  requirements:
203
178
  - - ! '>='
204
179
  - !ruby/object:Gem::Version
@@ -206,7 +181,6 @@ dependencies:
206
181
  - !ruby/object:Gem::Dependency
207
182
  name: pg
208
183
  requirement: !ruby/object:Gem::Requirement
209
- none: false
210
184
  requirements:
211
185
  - - ! '>='
212
186
  - !ruby/object:Gem::Version
@@ -214,7 +188,6 @@ dependencies:
214
188
  type: :development
215
189
  prerelease: false
216
190
  version_requirements: !ruby/object:Gem::Requirement
217
- none: false
218
191
  requirements:
219
192
  - - ! '>='
220
193
  - !ruby/object:Gem::Version
@@ -222,7 +195,6 @@ dependencies:
222
195
  - !ruby/object:Gem::Dependency
223
196
  name: redcarpet
224
197
  requirement: !ruby/object:Gem::Requirement
225
- none: false
226
198
  requirements:
227
199
  - - ! '>='
228
200
  - !ruby/object:Gem::Version
@@ -230,7 +202,20 @@ dependencies:
230
202
  type: :development
231
203
  prerelease: false
232
204
  version_requirements: !ruby/object:Gem::Requirement
233
- none: false
205
+ requirements:
206
+ - - ! '>='
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rake
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ! '>='
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
234
219
  requirements:
235
220
  - - ! '>='
236
221
  - !ruby/object:Gem::Version
@@ -256,6 +241,7 @@ files:
256
241
  - lib/upsert/column_definition.rb
257
242
  - lib/upsert/column_definition/mysql.rb
258
243
  - lib/upsert/column_definition/postgresql.rb
244
+ - lib/upsert/column_definition/sqlite3.rb
259
245
  - lib/upsert/connection.rb
260
246
  - lib/upsert/connection/Java_ComMysqlJdbc_JDBC4Connection.rb
261
247
  - lib/upsert/connection/Java_OrgPostgresqlJdbc4_Jdbc4Connection.rb
@@ -299,27 +285,26 @@ files:
299
285
  - upsert.gemspec
300
286
  homepage: https://github.com/seamusabshere/upsert
301
287
  licenses: []
288
+ metadata: {}
302
289
  post_install_message:
303
290
  rdoc_options: []
304
291
  require_paths:
305
292
  - lib
306
293
  required_ruby_version: !ruby/object:Gem::Requirement
307
- none: false
308
294
  requirements:
309
295
  - - ! '>='
310
296
  - !ruby/object:Gem::Version
311
297
  version: '0'
312
298
  required_rubygems_version: !ruby/object:Gem::Requirement
313
- none: false
314
299
  requirements:
315
300
  - - ! '>='
316
301
  - !ruby/object:Gem::Version
317
302
  version: '0'
318
303
  requirements: []
319
304
  rubyforge_project:
320
- rubygems_version: 1.8.24
305
+ rubygems_version: 2.0.3
321
306
  signing_key:
322
- specification_version: 3
307
+ specification_version: 4
323
308
  summary: Make it easy to upsert on MySQL, PostgreSQL, and SQLite3. Transparently creates
324
309
  merge functions for MySQL and PostgreSQL; on SQLite3, uses INSERT OR IGNORE.
325
310
  test_files: