activerecord-import 0.14.1 → 1.4.1

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 (131) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yaml +107 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +74 -8
  5. data/Brewfile +3 -1
  6. data/CHANGELOG.md +448 -2
  7. data/Gemfile +26 -19
  8. data/LICENSE +21 -56
  9. data/README.markdown +568 -32
  10. data/Rakefile +5 -1
  11. data/activerecord-import.gemspec +8 -7
  12. data/benchmarks/README +2 -2
  13. data/benchmarks/benchmark.rb +8 -1
  14. data/benchmarks/lib/base.rb +2 -0
  15. data/benchmarks/lib/cli_parser.rb +5 -2
  16. data/benchmarks/lib/float.rb +2 -0
  17. data/benchmarks/lib/mysql2_benchmark.rb +2 -0
  18. data/benchmarks/lib/output_to_csv.rb +2 -0
  19. data/benchmarks/lib/output_to_html.rb +4 -2
  20. data/benchmarks/models/test_innodb.rb +2 -0
  21. data/benchmarks/models/test_memory.rb +2 -0
  22. data/benchmarks/models/test_myisam.rb +2 -0
  23. data/benchmarks/schema/{mysql_schema.rb → mysql2_schema.rb} +2 -0
  24. data/gemfiles/4.2.gemfile +4 -3
  25. data/gemfiles/5.0.gemfile +4 -3
  26. data/gemfiles/5.1.gemfile +4 -0
  27. data/gemfiles/5.2.gemfile +4 -0
  28. data/gemfiles/6.0.gemfile +4 -0
  29. data/gemfiles/6.1.gemfile +4 -0
  30. data/gemfiles/7.0.gemfile +4 -0
  31. data/lib/activerecord-import/active_record/adapters/abstract_adapter.rb +2 -0
  32. data/lib/activerecord-import/active_record/adapters/jdbcmysql_adapter.rb +6 -4
  33. data/lib/activerecord-import/active_record/adapters/jdbcpostgresql_adapter.rb +2 -0
  34. data/lib/activerecord-import/active_record/adapters/jdbcsqlite3_adapter.rb +8 -0
  35. data/lib/activerecord-import/active_record/adapters/mysql2_adapter.rb +2 -0
  36. data/lib/activerecord-import/active_record/adapters/postgresql_adapter.rb +2 -0
  37. data/lib/activerecord-import/active_record/adapters/seamless_database_pool_adapter.rb +2 -0
  38. data/lib/activerecord-import/active_record/adapters/sqlite3_adapter.rb +2 -0
  39. data/lib/activerecord-import/adapters/abstract_adapter.rb +12 -16
  40. data/lib/activerecord-import/adapters/em_mysql2_adapter.rb +2 -0
  41. data/lib/activerecord-import/adapters/mysql2_adapter.rb +2 -0
  42. data/lib/activerecord-import/adapters/mysql_adapter.rb +35 -18
  43. data/lib/activerecord-import/adapters/postgresql_adapter.rb +107 -28
  44. data/lib/activerecord-import/adapters/sqlite3_adapter.rb +141 -18
  45. data/lib/activerecord-import/base.rb +15 -8
  46. data/lib/activerecord-import/import.rb +642 -178
  47. data/lib/activerecord-import/mysql2.rb +2 -0
  48. data/lib/activerecord-import/postgresql.rb +2 -0
  49. data/lib/activerecord-import/sqlite3.rb +2 -0
  50. data/lib/activerecord-import/synchronize.rb +5 -3
  51. data/lib/activerecord-import/value_sets_parser.rb +29 -3
  52. data/lib/activerecord-import/version.rb +3 -1
  53. data/lib/activerecord-import.rb +5 -16
  54. data/test/adapters/jdbcmysql.rb +2 -0
  55. data/test/adapters/jdbcpostgresql.rb +2 -0
  56. data/test/adapters/jdbcsqlite3.rb +3 -0
  57. data/test/adapters/makara_postgis.rb +3 -0
  58. data/test/adapters/mysql2.rb +2 -0
  59. data/test/adapters/mysql2_makara.rb +2 -0
  60. data/test/adapters/mysql2spatial.rb +2 -0
  61. data/test/adapters/postgis.rb +2 -0
  62. data/test/adapters/postgresql.rb +2 -0
  63. data/test/adapters/postgresql_makara.rb +2 -0
  64. data/test/adapters/seamless_database_pool.rb +2 -0
  65. data/test/adapters/spatialite.rb +2 -0
  66. data/test/adapters/sqlite3.rb +2 -0
  67. data/test/{travis → github}/database.yml +7 -1
  68. data/test/import_test.rb +498 -32
  69. data/test/jdbcmysql/import_test.rb +2 -1
  70. data/test/jdbcpostgresql/import_test.rb +2 -1
  71. data/test/jdbcsqlite3/import_test.rb +6 -0
  72. data/test/makara_postgis/import_test.rb +10 -0
  73. data/test/models/account.rb +5 -0
  74. data/test/models/alarm.rb +4 -0
  75. data/test/models/animal.rb +8 -0
  76. data/test/models/bike_maker.rb +9 -0
  77. data/test/models/book.rb +4 -0
  78. data/test/models/car.rb +5 -0
  79. data/test/models/card.rb +5 -0
  80. data/test/models/chapter.rb +2 -0
  81. data/test/models/customer.rb +8 -0
  82. data/test/models/deck.rb +8 -0
  83. data/test/models/dictionary.rb +6 -0
  84. data/test/models/discount.rb +2 -0
  85. data/test/models/end_note.rb +2 -0
  86. data/test/models/group.rb +2 -0
  87. data/test/models/order.rb +8 -0
  88. data/test/models/playing_card.rb +4 -0
  89. data/test/models/promotion.rb +2 -0
  90. data/test/models/question.rb +2 -0
  91. data/test/models/rule.rb +2 -0
  92. data/test/models/tag.rb +7 -0
  93. data/test/models/tag_alias.rb +5 -0
  94. data/test/models/topic.rb +16 -0
  95. data/test/models/user.rb +5 -0
  96. data/test/models/user_token.rb +6 -0
  97. data/test/models/vendor.rb +9 -0
  98. data/test/models/widget.rb +18 -0
  99. data/test/mysql2/import_test.rb +2 -0
  100. data/test/mysql2_makara/import_test.rb +2 -0
  101. data/test/mysqlspatial2/import_test.rb +2 -0
  102. data/test/postgis/import_test.rb +6 -0
  103. data/test/postgresql/import_test.rb +2 -4
  104. data/test/schema/generic_schema.rb +88 -3
  105. data/test/schema/jdbcpostgresql_schema.rb +3 -0
  106. data/test/schema/mysql2_schema.rb +21 -0
  107. data/test/schema/postgis_schema.rb +3 -0
  108. data/test/schema/postgresql_schema.rb +63 -0
  109. data/test/schema/sqlite3_schema.rb +15 -0
  110. data/test/schema/version.rb +2 -0
  111. data/test/sqlite3/import_test.rb +4 -50
  112. data/test/support/active_support/test_case_extensions.rb +8 -1
  113. data/test/support/assertions.rb +2 -0
  114. data/test/support/factories.rb +17 -8
  115. data/test/support/generate.rb +10 -8
  116. data/test/support/mysql/import_examples.rb +17 -3
  117. data/test/support/postgresql/import_examples.rb +442 -9
  118. data/test/support/shared_examples/on_duplicate_key_ignore.rb +45 -0
  119. data/test/support/shared_examples/on_duplicate_key_update.rb +278 -1
  120. data/test/support/shared_examples/recursive_import.rb +137 -12
  121. data/test/support/sqlite3/import_examples.rb +232 -0
  122. data/test/synchronize_test.rb +10 -0
  123. data/test/test_helper.rb +44 -3
  124. data/test/value_sets_bytes_parser_test.rb +15 -2
  125. data/test/value_sets_records_parser_test.rb +2 -0
  126. metadata +74 -22
  127. data/.travis.yml +0 -52
  128. data/gemfiles/3.2.gemfile +0 -3
  129. data/gemfiles/4.0.gemfile +0 -3
  130. data/gemfiles/4.1.gemfile +0 -3
  131. data/test/schema/mysql_schema.rb +0 -16
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../support/postgresql/import_examples')
5
+
6
+ should_support_postgresql_import_functionality
7
+
8
+ if ActiveRecord::Base.connection.supports_on_duplicate_key_update?
9
+ should_support_postgresql_upsert_functionality
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Account < ActiveRecord::Base
4
+ self.locking_column = :lock
5
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Alarm < ActiveRecord::Base
4
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Animal < ActiveRecord::Base
4
+ after_initialize :validate_name_presence, if: :new_record?
5
+ def validate_name_presence
6
+ raise ArgumentError if name.nil?
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bike
4
+ def self.table_name_prefix
5
+ 'bike_'
6
+ end
7
+ class Maker < ActiveRecord::Base
8
+ end
9
+ end
data/test/models/book.rb CHANGED
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Book < ActiveRecord::Base
2
4
  belongs_to :topic, inverse_of: :books
5
+ belongs_to :tag, foreign_key: [:tag_id, :parent_id]
6
+
3
7
  has_many :chapters, inverse_of: :book
4
8
  has_many :discounts, as: :discountable
5
9
  has_many :end_notes, inverse_of: :book
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Car < ActiveRecord::Base
4
+ self.primary_key = :Name
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Card < ActiveRecord::Base
4
+ belongs_to :deck, polymorphic: true
5
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Chapter < ActiveRecord::Base
2
4
  belongs_to :book, inverse_of: :chapters
3
5
  validates :title, presence: true
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Customer < ActiveRecord::Base
4
+ has_many :orders,
5
+ inverse_of: :customer,
6
+ primary_key: %i(account_id id),
7
+ foreign_key: %i(account_id customer_id)
8
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Deck < ActiveRecord::Base
4
+ has_many :cards
5
+ def self.polymorphic_name
6
+ "PlayingCard"
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'book'
4
+
5
+ class Dictionary < Book
6
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Discount < ActiveRecord::Base
2
4
  belongs_to :discountable, polymorphic: true
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class EndNote < ActiveRecord::Base
2
4
  belongs_to :book, inverse_of: :end_notes
3
5
  validates :note, presence: true
data/test/models/group.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Group < ActiveRecord::Base
2
4
  self.table_name = 'group'
3
5
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Order < ActiveRecord::Base
4
+ belongs_to :customer,
5
+ inverse_of: :orders,
6
+ primary_key: %i(account_id id),
7
+ foreign_key: %i(account_id customer_id)
8
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class PlayingCard < ActiveRecord::Base
4
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Promotion < ActiveRecord::Base
2
4
  self.primary_key = :promotion_id
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Question < ActiveRecord::Base
2
4
  has_one :rule
3
5
  end
data/test/models/rule.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Rule < ActiveRecord::Base
2
4
  belongs_to :question
3
5
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Tag < ActiveRecord::Base
4
+ self.primary_keys = :tag_id, :publisher_id unless ENV["SKIP_COMPOSITE_PK"]
5
+ has_many :books, inverse_of: :tag
6
+ has_many :tag_aliases, inverse_of: :tag
7
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class TagAlias < ActiveRecord::Base
4
+ belongs_to :tag, foreign_key: [:tag_id, :parent_id], required: true
5
+ end
data/test/models/topic.rb CHANGED
@@ -1,9 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Topic < ActiveRecord::Base
2
4
  validates_presence_of :author_name
3
5
  validates :title, numericality: { only_integer: true }, on: :context_test
6
+ validates :title, uniqueness: true
7
+ validates :content, uniqueness: true
8
+ validates :word_count, numericality: { greater_than: 0 }, if: :content?
9
+
10
+ validate -> { errors.add(:title, :validate_failed) if title == 'validate_failed' }
11
+ before_validation -> { errors.add(:title, :invalid) if title == 'invalid' }
4
12
 
5
13
  has_many :books, inverse_of: :topic
6
14
  belongs_to :parent, class_name: "Topic"
7
15
 
8
16
  composed_of :description, mapping: [%w(title title), %w(author_name author_name)], allow_nil: true, class_name: "TopicDescription"
17
+
18
+ default_scope { where(approved: true) }
19
+
20
+ private
21
+
22
+ def word_count
23
+ @word_count ||= content.to_s.scan(/\w+/).count
24
+ end
9
25
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class User < ActiveRecord::Base
4
+ has_many :user_tokens, primary_key: :name, foreign_key: :user_name
5
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UserToken < ActiveRecord::Base
4
+ belongs_to :user, primary_key: :name, foreign_key: :user_name
5
+ validates :user, presence: true
6
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Vendor < ActiveRecord::Base
4
+ store :preferences, accessors: [:color], coder: JSON
5
+
6
+ store_accessor :data, :size
7
+ store_accessor :config, :contact
8
+ store_accessor :settings, :charge_code
9
+ end
@@ -1,3 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CustomCoder
4
+ def load(value)
5
+ if value.nil?
6
+ {}
7
+ else
8
+ YAML.load(value)
9
+ end
10
+ end
11
+
12
+ def dump(value)
13
+ YAML.dump(value)
14
+ end
15
+ end
16
+
1
17
  class Widget < ActiveRecord::Base
2
18
  self.primary_key = :w_id
3
19
 
@@ -5,4 +21,6 @@ class Widget < ActiveRecord::Base
5
21
 
6
22
  serialize :data, Hash
7
23
  serialize :json_data, JSON
24
+ serialize :unspecified_data
25
+ serialize :custom_data, CustomCoder.new
8
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
4
  require File.expand_path(File.dirname(__FILE__) + '/../support/assertions')
3
5
  require File.expand_path(File.dirname(__FILE__) + '/../support/mysql/import_examples')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
4
 
3
5
  require File.expand_path(File.dirname(__FILE__) + '/../support/assertions')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
4
 
3
5
  require File.expand_path(File.dirname(__FILE__) + '/../support/assertions')
@@ -1,4 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
4
  require File.expand_path(File.dirname(__FILE__) + '/../support/postgresql/import_examples')
3
5
 
4
6
  should_support_postgresql_import_functionality
7
+
8
+ if ActiveRecord::Base.connection.supports_on_duplicate_key_update?
9
+ should_support_postgresql_upsert_functionality
10
+ end
@@ -1,8 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
4
  require File.expand_path(File.dirname(__FILE__) + '/../support/postgresql/import_examples')
3
5
 
4
6
  should_support_postgresql_import_functionality
5
-
6
- if ActiveRecord::Base.connection.supports_on_duplicate_key_update?
7
- should_support_postgresql_upsert_functionality
8
- end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveRecord::Schema.define do
2
4
  create_table :schema_info, force: :cascade do |t|
3
5
  t.integer :version, unique: true
@@ -52,6 +54,20 @@ ActiveRecord::Schema.define do
52
54
  t.string :name
53
55
  end
54
56
 
57
+ create_table :cards, force: :cascade do |t|
58
+ t.string :name
59
+ t.string :deck_type
60
+ t.integer :deck_id
61
+ end
62
+
63
+ create_table :decks, force: :cascade do |t|
64
+ t.string :name
65
+ end
66
+
67
+ create_table :playing_cards, force: :cascade do |t|
68
+ t.string :name
69
+ end
70
+
55
71
  create_table :books, force: :cascade do |t|
56
72
  t.string :title, null: false
57
73
  t.string :publisher, null: false, default: 'Default Publisher'
@@ -62,8 +78,11 @@ ActiveRecord::Schema.define do
62
78
  t.datetime :updated_on
63
79
  t.date :publish_date
64
80
  t.integer :topic_id
81
+ t.integer :tag_id
82
+ t.integer :publisher_id
65
83
  t.boolean :for_sale, default: true
66
84
  t.integer :status, default: 0
85
+ t.string :type
67
86
  end
68
87
 
69
88
  create_table :chapters, force: :cascade do |t|
@@ -73,7 +92,7 @@ ActiveRecord::Schema.define do
73
92
  t.datetime :updated_at
74
93
  end
75
94
 
76
- create_table :end_notes, force: :cascade do |t|
95
+ create_table :end_notes, primary_key: :end_note_id, force: :cascade do |t|
77
96
  t.string :note
78
97
  t.integer :book_id, null: false
79
98
  t.datetime :created_at
@@ -111,10 +130,12 @@ ActiveRecord::Schema.define do
111
130
  add_index :animals, [:name], unique: true, name: 'uk_animals'
112
131
 
113
132
  create_table :widgets, id: false, force: :cascade do |t|
114
- t.integer :w_id
133
+ t.integer :w_id, primary_key: true
115
134
  t.boolean :active, default: false
116
135
  t.text :data
117
136
  t.text :json_data
137
+ t.text :unspecified_data
138
+ t.text :custom_data
118
139
  end
119
140
 
120
141
  create_table :promotions, primary_key: :promotion_id, force: :cascade do |t|
@@ -131,7 +152,8 @@ ActiveRecord::Schema.define do
131
152
  t.string :discountable_type
132
153
  end
133
154
 
134
- create_table :rules, force: :cascade do |t|
155
+ create_table :rules, id: false, force: :cascade do |t|
156
+ t.integer :id
135
157
  t.string :condition_text
136
158
  t.integer :question_id
137
159
  end
@@ -139,4 +161,67 @@ ActiveRecord::Schema.define do
139
161
  create_table :questions, force: :cascade do |t|
140
162
  t.string :body
141
163
  end
164
+
165
+ create_table :vendors, force: :cascade do |t|
166
+ t.string :name, null: true
167
+ t.text :preferences
168
+ t.text :data
169
+ t.text :config
170
+ t.text :settings
171
+ end
172
+
173
+ create_table :cars, id: false, force: :cascade do |t|
174
+ t.string :Name, null: true
175
+ t.string :Features
176
+ end
177
+
178
+ create_table :users, force: :cascade do |t|
179
+ t.string :name, null: false
180
+ t.integer :lock_version, null: false, default: 0
181
+ end
182
+
183
+ create_table :user_tokens, force: :cascade do |t|
184
+ t.string :user_name, null: false
185
+ t.string :token, null: false
186
+ end
187
+
188
+ create_table :accounts, force: :cascade do |t|
189
+ t.string :name, null: false
190
+ t.integer :lock, null: false, default: 0
191
+ end
192
+
193
+ create_table :bike_makers, force: :cascade do |t|
194
+ t.string :name, null: false
195
+ t.integer :lock_version, null: false, default: 0
196
+ end
197
+
198
+ add_index :cars, :Name, unique: true
199
+
200
+ unless ENV["SKIP_COMPOSITE_PK"]
201
+ execute %(
202
+ CREATE TABLE IF NOT EXISTS tags (
203
+ tag_id INT NOT NULL,
204
+ publisher_id INT NOT NULL,
205
+ tag VARCHAR(50),
206
+ PRIMARY KEY (tag_id, publisher_id)
207
+ );
208
+ ).split.join(' ').strip
209
+
210
+ create_table :tag_aliases, force: :cascade do |t|
211
+ t.integer :tag_id, null: false
212
+ t.integer :parent_id, null: false
213
+ t.string :alias, null: false
214
+ end
215
+ end
216
+
217
+ create_table :customers, force: :cascade do |t|
218
+ t.integer :account_id
219
+ t.string :name
220
+ end
221
+
222
+ create_table :orders, force: :cascade do |t|
223
+ t.integer :account_id
224
+ t.integer :customer_id
225
+ t.integer :amount
226
+ end
142
227
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/postgresql_schema')
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Schema.define do
4
+ create_table :books, force: :cascade do |t|
5
+ t.string :title, null: false
6
+ t.virtual :upper_title, type: :string, as: "upper(`title`)" if t.respond_to?(:virtual)
7
+ t.string :publisher, null: false, default: 'Default Publisher'
8
+ t.string :author_name, null: false
9
+ t.datetime :created_at
10
+ t.datetime :created_on
11
+ t.datetime :updated_at
12
+ t.datetime :updated_on
13
+ t.date :publish_date
14
+ t.integer :topic_id
15
+ t.integer :tag_id
16
+ t.integer :publisher_id
17
+ t.boolean :for_sale, default: true
18
+ t.integer :status, default: 0
19
+ t.string :type
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path(File.dirname(__FILE__) + '/postgresql_schema')
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Schema.define do
4
+ execute('CREATE extension IF NOT EXISTS "hstore";')
5
+ execute('CREATE extension IF NOT EXISTS "pgcrypto";')
6
+ execute('CREATE extension IF NOT EXISTS "uuid-ossp";')
7
+
8
+ # create ENUM if it does not exist yet
9
+ begin
10
+ execute('CREATE TYPE vendor_type AS ENUM (\'wholesaler\', \'retailer\');')
11
+ rescue ActiveRecord::StatementInvalid => e
12
+ # since PostgreSQL does not support IF NOT EXISTS when creating a TYPE,
13
+ # rescue the error and check the error class
14
+ raise unless e.cause.is_a? PG::DuplicateObject
15
+ execute('ALTER TYPE vendor_type ADD VALUE IF NOT EXISTS \'wholesaler\';')
16
+ execute('ALTER TYPE vendor_type ADD VALUE IF NOT EXISTS \'retailer\';')
17
+ end
18
+
19
+ create_table :vendors, id: :uuid, force: :cascade do |t|
20
+ t.string :name, null: true
21
+ t.text :hours
22
+ t.text :preferences
23
+
24
+ if t.respond_to?(:json)
25
+ t.json :pure_json_data
26
+ t.json :data
27
+ else
28
+ t.text :data
29
+ end
30
+
31
+ if t.respond_to?(:hstore)
32
+ t.hstore :config
33
+ else
34
+ t.text :config
35
+ end
36
+
37
+ if t.respond_to?(:jsonb)
38
+ t.jsonb :pure_jsonb_data
39
+ t.jsonb :settings
40
+ t.jsonb :json_data, null: false, default: {}
41
+ else
42
+ t.text :settings
43
+ t.text :json_data
44
+ end
45
+
46
+ t.column :vendor_type, :vendor_type
47
+
48
+ t.datetime :created_at
49
+ t.datetime :updated_at
50
+ end
51
+
52
+ create_table :alarms, force: true do |t|
53
+ t.column :device_id, :integer, null: false
54
+ t.column :alarm_type, :integer, null: false
55
+ t.column :status, :integer, null: false
56
+ t.column :metadata, :text
57
+ t.column :secret_key, :binary
58
+ t.datetime :created_at
59
+ t.datetime :updated_at
60
+ end
61
+
62
+ add_index :alarms, [:device_id, :alarm_type], unique: true, where: 'status <> 0'
63
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveRecord::Schema.define do
4
+ create_table :alarms, force: true do |t|
5
+ t.column :device_id, :integer, null: false
6
+ t.column :alarm_type, :integer, null: false
7
+ t.column :status, :integer, null: false
8
+ t.column :metadata, :text
9
+ t.column :secret_key, :binary
10
+ t.datetime :created_at
11
+ t.datetime :updated_at
12
+ end
13
+
14
+ add_index :alarms, [:device_id, :alarm_type], unique: true, where: 'status <> 0'
15
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class SchemaInfo < ActiveRecord::Base
2
4
  if respond_to?(:table_name=)
3
5
  self.table_name = 'schema_info'
@@ -1,52 +1,6 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
-
3
- should_support_recursive_import
4
-
5
- describe "#supports_imports?" do
6
- context "and SQLite is 3.7.11 or higher" do
7
- it "supports import" do
8
- version = ActiveRecord::ConnectionAdapters::SQLite3Adapter::Version.new("3.7.11")
9
- assert ActiveRecord::Base.supports_import?(version)
10
-
11
- version = ActiveRecord::ConnectionAdapters::SQLite3Adapter::Version.new("3.7.12")
12
- assert ActiveRecord::Base.supports_import?(version)
13
- end
14
- end
1
+ # frozen_string_literal: true
15
2
 
16
- context "and SQLite less than 3.7.11" do
17
- it "doesn't support import" do
18
- version = ActiveRecord::ConnectionAdapters::SQLite3Adapter::Version.new("3.7.10")
19
- assert !ActiveRecord::Base.supports_import?(version)
20
- end
21
- end
22
- end
23
-
24
- describe "#import" do
25
- it "imports with a single insert on SQLite 3.7.11 or higher" do
26
- assert_difference "Topic.count", +507 do
27
- result = Topic.import Build(7, :topics)
28
- assert_equal 1, result.num_inserts, "Failed to issue a single INSERT statement. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
29
- assert_equal 7, Topic.count, "Failed to insert all records. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
30
-
31
- result = Topic.import Build(500, :topics)
32
- assert_equal 1, result.num_inserts, "Failed to issue a single INSERT statement. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
33
- assert_equal 507, Topic.count, "Failed to insert all records. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
34
- end
35
- end
36
-
37
- it "imports with a two inserts on SQLite 3.7.11 or higher" do
38
- assert_difference "Topic.count", +501 do
39
- result = Topic.import Build(501, :topics)
40
- assert_equal 2, result.num_inserts, "Failed to issue a two INSERT statements. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
41
- assert_equal 501, Topic.count, "Failed to insert all records. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
42
- end
43
- end
3
+ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
4
+ require File.expand_path(File.dirname(__FILE__) + '/../support/sqlite3/import_examples')
44
5
 
45
- it "imports with a five inserts on SQLite 3.7.11 or higher" do
46
- assert_difference "Topic.count", +2500 do
47
- result = Topic.import Build(2500, :topics)
48
- assert_equal 5, result.num_inserts, "Failed to issue a two INSERT statements. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
49
- assert_equal 2500, Topic.count, "Failed to insert all records. Make sure you have a supported version of SQLite3 (3.7.11 or higher) installed"
50
- end
51
- end
52
- end
6
+ should_support_sqlite3_import_functionality
@@ -1,6 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ActiveSupport::TestCase
2
4
  include ActiveRecord::TestFixtures
3
- self.use_transactional_fixtures = true
5
+
6
+ if ENV['AR_VERSION'].to_f >= 5.0
7
+ self.use_transactional_tests = true
8
+ else
9
+ self.use_transactional_fixtures = true
10
+ end
4
11
 
5
12
  class << self
6
13
  def requires_active_record_version(version_string, &blk)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ActiveSupport::TestCase
2
4
  module ImportAssertions
3
5
  def self.extended(klass)