seed_dump 3.3.1 → 3.4.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.
@@ -1,14 +1,21 @@
1
1
  FactoryBot.define do
2
2
  factory :another_sample do
3
- string 'string'
4
- text 'text'
5
- integer 42
6
- float 3.14
7
- decimal 2.72
8
- datetime DateTime.parse('July 4, 1776 7:14pm UTC')
9
- time Time.parse('3:15am UTC')
10
- date Date.parse('November 19, 1863')
11
- binary 'binary'
12
- boolean false
3
+ # Use block syntax for attribute definitions
4
+ string { 'string' }
5
+ text { 'text' }
6
+ integer { 42 }
7
+ float { 3.14 }
8
+ # BigDecimal needs to be initialized within the block
9
+ decimal { BigDecimal('2.72') }
10
+ # Use standard Ruby DateTime/Time parse methods directly
11
+ datetime { DateTime.parse('July 4, 1776 7:14pm UTC') }
12
+ time { Time.parse('3:15am UTC') }
13
+ date { Date.parse('November 19, 1863') }
14
+ binary { 'binary' }
15
+ boolean { false }
16
+ # created_at and updated_at are typically handled by ActiveRecord timestamps
17
+ # but can be defined explicitly if needed for specific tests.
18
+ # created_at { Time.now }
19
+ # updated_at { Time.now }
13
20
  end
14
21
  end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :author do
3
+ name { 'Test Author' }
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ FactoryBot.define do
2
+ factory :base_user do
3
+ name { 'Test User' }
4
+ email { 'user@example.com' }
5
+ end
6
+
7
+ factory :admin_user do
8
+ name { 'Admin User' }
9
+ email { 'admin@example.com' }
10
+ end
11
+
12
+ factory :guest_user do
13
+ name { 'Guest User' }
14
+ email { 'guest@example.com' }
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ FactoryBot.define do
2
+ factory :book do
3
+ title { 'Test Book' }
4
+ association :author
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ FactoryBot.define do
2
+ factory :boss do
3
+ name { 'The Boss' }
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ FactoryBot.define do
2
+ factory :review do
3
+ content { 'Great book!' }
4
+ rating { 5 }
5
+ association :book
6
+ end
7
+ end
@@ -1,16 +1,20 @@
1
1
  FactoryBot.define do
2
2
  factory :sample do
3
- string 'string'
4
- text 'text'
5
- integer 42
6
- float 3.14
7
- decimal 2.72
8
- datetime DateTime.parse('July 4, 1776 7:14pm UTC')
9
- time Time.parse('3:15am UTC')
10
- date Date.parse('November 19, 1863')
11
- binary 'binary'
12
- boolean false
13
- created_at DateTime.parse('July 20, 1969 20:18 UTC')
14
- updated_at DateTime.parse('November 10, 1989 4:20 UTC')
3
+ # Use block syntax for attribute definitions
4
+ string { 'string' }
5
+ text { 'text' }
6
+ integer { 42 }
7
+ float { 3.14 }
8
+ # BigDecimal needs to be initialized within the block
9
+ decimal { BigDecimal('2.72') }
10
+ # Use standard Ruby DateTime/Time parse methods directly
11
+ datetime { DateTime.parse('July 4, 1776 7:14pm UTC') }
12
+ time { Time.parse('3:15am UTC') }
13
+ date { Date.parse('November 19, 1863') }
14
+ binary { 'binary' }
15
+ boolean { false }
16
+ # Define created_at and updated_at explicitly as they are used in specs
17
+ created_at { DateTime.parse('July 20, 1969 20:18 UTC') }
18
+ updated_at { DateTime.parse('November 10, 1989 4:20 UTC') }
15
19
  end
16
20
  end
@@ -1,14 +1,21 @@
1
1
  FactoryBot.define do
2
2
  factory :yet_another_sample do
3
- string 'string'
4
- text 'text'
5
- integer 42
6
- float 3.14
7
- decimal 2.72
8
- datetime DateTime.parse('July 4, 1776 7:14pm UTC')
9
- time Time.parse('3:15am UTC')
10
- date Date.parse('November 19, 1863')
11
- binary 'binary'
12
- boolean false
3
+ # Use block syntax for attribute definitions
4
+ string { 'string' }
5
+ text { 'text' }
6
+ integer { 42 }
7
+ float { 3.14 }
8
+ # BigDecimal needs to be initialized within the block
9
+ decimal { BigDecimal('2.72') }
10
+ # Use standard Ruby DateTime/Time parse methods directly
11
+ datetime { DateTime.parse('July 4, 1776 7:14pm UTC') }
12
+ time { Time.parse('3:15am UTC') }
13
+ date { Date.parse('November 19, 1863') }
14
+ binary { 'binary' }
15
+ boolean { false }
16
+ # created_at and updated_at are typically handled by ActiveRecord timestamps
17
+ # but can be defined explicitly if needed for specific tests.
18
+ # created_at { Time.now }
19
+ # updated_at { Time.now }
13
20
  end
14
21
  end
data/spec/helpers.rb CHANGED
@@ -8,16 +8,87 @@ class Rails
8
8
  def self.eager_load!
9
9
  @already_called ||= false
10
10
 
11
- if !@already_called
12
- Object.const_set('Sample', Class.new(ActiveRecord::Base))
11
+ # Define models only if they aren't already defined
12
+ # This prevents errors if eager_load! is called multiple times
13
+ unless @already_called
14
+ Object.const_set('Sample', Class.new(ActiveRecord::Base)) unless defined?(Sample)
15
+ Object.const_set('AnotherSample', Class.new(ActiveRecord::Base)) unless defined?(AnotherSample)
16
+ Object.const_set('YetAnotherSample', Class.new(ActiveRecord::Base)) unless defined?(YetAnotherSample)
17
+ Object.const_set('NoTableModel', Class.new(ActiveRecord::Base)) unless defined?(NoTableModel)
18
+ Object.const_set('EmptyModel', Class.new(ActiveRecord::Base)) unless defined?(EmptyModel)
19
+ Object.const_set('CampaignsManager', Class.new(ActiveRecord::Base)) unless defined?(CampaignsManager)
20
+ Object.const_set('Boss', Class.new(ActiveRecord::Base)) unless defined?(Boss)
21
+
22
+ # STI models for testing issue #120
23
+ unless defined?(BaseUser)
24
+ base_user_class = Class.new(ActiveRecord::Base) do
25
+ self.table_name = 'base_users'
26
+ end
27
+ Object.const_set('BaseUser', base_user_class)
28
+ end
29
+
30
+ unless defined?(AdminUser)
31
+ admin_user_class = Class.new(BaseUser)
32
+ Object.const_set('AdminUser', admin_user_class)
33
+ end
34
+
35
+ unless defined?(GuestUser)
36
+ guest_user_class = Class.new(BaseUser)
37
+ Object.const_set('GuestUser', guest_user_class)
38
+ end
39
+
40
+ # Model with serialized Hash field (issue #105) - JSON serialization
41
+ unless defined?(SerializedSample)
42
+ serialized_class = Class.new(ActiveRecord::Base) do
43
+ self.table_name = 'serialized_samples'
44
+ serialize :metadata, coder: JSON
45
+ end
46
+ Object.const_set('SerializedSample', serialized_class)
47
+ end
48
+
49
+ # Model with default_scope selecting specific columns (issue #165)
50
+ unless defined?(ScopedSelectSample)
51
+ scoped_class = Class.new(ActiveRecord::Base) do
52
+ self.table_name = 'scoped_select_samples'
53
+ default_scope { select(:id, :name) }
54
+ end
55
+ Object.const_set('ScopedSelectSample', scoped_class)
56
+ end
13
57
 
14
- Object.const_set('AnotherSample', Class.new(ActiveRecord::Base))
58
+ # Model with created_on/updated_on columns (issue #128)
59
+ unless defined?(TimestampOnSample)
60
+ timestamp_on_class = Class.new(ActiveRecord::Base) do
61
+ self.table_name = 'timestamp_on_samples'
62
+ end
63
+ Object.const_set('TimestampOnSample', timestamp_on_class)
64
+ end
15
65
 
16
- Object.const_set('YetAnotherSample', Class.new(ActiveRecord::Base))
66
+ # Models with foreign key relationships for testing dependency ordering (issues #78, #83)
67
+ # Author -> Book -> Review (Review depends on Book, Book depends on Author)
68
+ unless defined?(Author)
69
+ author_class = Class.new(ActiveRecord::Base) do
70
+ self.table_name = 'authors'
71
+ has_many :books
72
+ end
73
+ Object.const_set('Author', author_class)
74
+ end
17
75
 
18
- Object.const_set('NoTableModel', Class.new(ActiveRecord::Base))
76
+ unless defined?(Book)
77
+ book_class = Class.new(ActiveRecord::Base) do
78
+ self.table_name = 'books'
79
+ belongs_to :author
80
+ has_many :reviews
81
+ end
82
+ Object.const_set('Book', book_class)
83
+ end
19
84
 
20
- Object.const_set('EmptyModel', Class.new(ActiveRecord::Base))
85
+ unless defined?(Review)
86
+ review_class = Class.new(ActiveRecord::Base) do
87
+ self.table_name = 'reviews'
88
+ belongs_to :book
89
+ end
90
+ Object.const_set('Review', review_class)
91
+ end
21
92
 
22
93
  @already_called = true
23
94
  end
@@ -29,10 +100,18 @@ class Rails
29
100
  end
30
101
 
31
102
  module Helpers
32
- def create_db
103
+ # Define create_db as a module method (self.create_db)
104
+ def self.create_db
105
+ # Ensure ActiveRecord connection is established before migrations
106
+ unless ActiveRecord::Base.connected?
107
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
108
+ end
109
+
33
110
  ActiveRecord::Migration.verbose = false
34
111
 
35
112
  ActiveRecord::Schema.define(:version => 1) do
113
+ # Use drop_table with if_exists for idempotency
114
+ drop_table :samples, if_exists: true
36
115
  create_table 'samples', :force => true do |t|
37
116
  t.string 'string'
38
117
  t.text 'text'
@@ -48,6 +127,7 @@ module Helpers
48
127
  t.datetime 'updated_at', :null => false
49
128
  end
50
129
 
130
+ drop_table :another_samples, if_exists: true
51
131
  create_table 'another_samples', :force => true do |t|
52
132
  t.string 'string'
53
133
  t.text 'text'
@@ -63,6 +143,7 @@ module Helpers
63
143
  t.datetime 'updated_at', :null => false
64
144
  end
65
145
 
146
+ drop_table :yet_another_samples, if_exists: true
66
147
  create_table 'yet_another_samples', :force => true do |t|
67
148
  t.string 'string'
68
149
  t.text 'text'
@@ -78,15 +159,94 @@ module Helpers
78
159
  t.datetime 'updated_at', :null => false
79
160
  end
80
161
 
162
+ drop_table :empty_models, if_exists: true
81
163
  create_table 'empty_models', force: true
164
+
165
+ # Join table without primary key (for issue #167 - HABTM tables)
166
+ drop_table :campaigns_managers, if_exists: true
167
+ create_table 'campaigns_managers', id: false, force: true do |t|
168
+ t.integer :campaign_id
169
+ t.integer :manager_id
170
+ end
171
+
172
+ # Table for testing default_scope with select (issue #165)
173
+ drop_table :scoped_select_samples, if_exists: true
174
+ create_table 'scoped_select_samples', force: true do |t|
175
+ t.string :name
176
+ t.string :description
177
+ t.datetime 'created_at', null: false
178
+ t.datetime 'updated_at', null: false
179
+ end
180
+
181
+ # Table for testing serialized Hash fields (issue #105) - JSON
182
+ drop_table :serialized_samples, if_exists: true
183
+ create_table 'serialized_samples', force: true do |t|
184
+ t.string :name
185
+ t.text :metadata
186
+ t.datetime 'created_at', null: false
187
+ t.datetime 'updated_at', null: false
188
+ end
189
+
190
+ # Table for testing created_on/updated_on exclusion (issue #128)
191
+ drop_table :timestamp_on_samples, if_exists: true
192
+ create_table 'timestamp_on_samples', force: true do |t|
193
+ t.string :name
194
+ t.datetime 'created_on', null: false
195
+ t.datetime 'updated_on', null: false
196
+ end
197
+
198
+ # Table for testing model names ending in 's' (issue #121)
199
+ drop_table :bosses, if_exists: true
200
+ create_table 'bosses', force: true do |t|
201
+ t.string :name
202
+ t.datetime 'created_at', null: false
203
+ t.datetime 'updated_at', null: false
204
+ end
205
+
206
+ # Table for testing STI deduplication (issue #120)
207
+ drop_table :base_users, if_exists: true
208
+ create_table 'base_users', force: true do |t|
209
+ t.string :type # STI type column
210
+ t.string :name
211
+ t.string :email
212
+ t.datetime 'created_at', null: false
213
+ t.datetime 'updated_at', null: false
214
+ end
215
+
216
+ # Tables for testing foreign key dependency ordering (issues #78, #83)
217
+ # Author -> Book -> Review dependency chain
218
+ drop_table :reviews, if_exists: true
219
+ drop_table :books, if_exists: true
220
+ drop_table :authors, if_exists: true
221
+
222
+ create_table 'authors', force: true do |t|
223
+ t.string :name
224
+ t.datetime 'created_at', null: false
225
+ t.datetime 'updated_at', null: false
226
+ end
227
+
228
+ create_table 'books', force: true do |t|
229
+ t.string :title
230
+ t.references :author, foreign_key: true
231
+ t.datetime 'created_at', null: false
232
+ t.datetime 'updated_at', null: false
233
+ end
234
+
235
+ create_table 'reviews', force: true do |t|
236
+ t.text :content
237
+ t.integer :rating
238
+ t.references :book, foreign_key: true
239
+ t.datetime 'created_at', null: false
240
+ t.datetime 'updated_at', null: false
241
+ end
242
+
82
243
  end
83
244
  end
84
245
 
246
+ # Keep load_sample_data as an instance method if needed by examples
85
247
  def load_sample_data
86
248
  Rails.application.eager_load!
87
249
 
88
250
  Sample.create!
89
-
90
- ChildSample.create!
91
251
  end
92
252
  end
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
- require 'seed_dump'
1
+ # Explicitly require logger before active_support to potentially resolve
2
+ # constant lookup issues in newer Ruby versions with older ActiveSupport.
3
+ require 'logger'
2
4
 
3
5
  require 'active_support'
4
6
  require 'active_record'
@@ -7,26 +9,47 @@ require 'tempfile'
7
9
 
8
10
  require 'byebug'
9
11
 
10
- require 'database_cleaner'
12
+ require 'database_cleaner/active_record' # Use the specific cleaner
11
13
  require 'factory_bot'
12
14
 
13
- require './spec/helpers'
15
+ # Require the main gem file to define SeedDump constant
16
+ require_relative '../lib/seed_dump'
14
17
 
15
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
18
+ require_relative './helpers' # Use require_relative for local files
16
19
 
20
+ # Load FactoryBot definitions
17
21
  FactoryBot.find_definitions
18
22
 
19
23
  RSpec.configure do |config|
20
24
  config.order = 'random'
21
25
 
26
+ # Include helper methods for use within examples (it blocks)
22
27
  config.include Helpers
23
28
 
29
+ # Configure DatabaseCleaner and Schema Setup
24
30
  config.before(:suite) do
25
- DatabaseCleaner.strategy = :transaction
31
+ # Ensure mock Rails models are defined once for the suite
32
+ Rails.application.eager_load! if defined?(Rails) && Rails.respond_to?(:application)
33
+
34
+ # Create the database schema once before the suite runs
35
+ begin
36
+ Helpers.create_db
37
+ rescue => e
38
+ puts "== RSpec: ERROR creating database schema: #{e.message} =="
39
+ puts e.backtrace
40
+ raise e # Re-raise the error to fail the suite setup
41
+ end
42
+
43
+
44
+ # Set up DatabaseCleaner strategy and clean once initially
45
+ # Use truncation strategy for initial clean
46
+ DatabaseCleaner.strategy = :truncation
26
47
  DatabaseCleaner.clean_with(:truncation)
27
48
  end
28
49
 
50
+ # Use :truncation strategy before and after each example for thorough cleaning
29
51
  config.before(:each) do
52
+ DatabaseCleaner.strategy = :truncation # Set strategy before starting
30
53
  DatabaseCleaner.start
31
54
  end
32
55
 
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seed_dump
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.1
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Halff
8
8
  - Ryan Oblak
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-05-08 00:00:00.000000000 Z
12
+ date: 1980-01-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -39,62 +39,76 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '4'
42
+ - !ruby/object:Gem::Dependency
43
+ name: seed_dump
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: byebug
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - "~>"
47
61
  - !ruby/object:Gem::Version
48
- version: '2.0'
62
+ version: '11.1'
49
63
  type: :development
50
64
  prerelease: false
51
65
  version_requirements: !ruby/object:Gem::Requirement
52
66
  requirements:
53
67
  - - "~>"
54
68
  - !ruby/object:Gem::Version
55
- version: '2.0'
69
+ version: '11.1'
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: factory_bot
58
72
  requirement: !ruby/object:Gem::Requirement
59
73
  requirements:
60
74
  - - "~>"
61
75
  - !ruby/object:Gem::Version
62
- version: 4.8.2
76
+ version: '6.1'
63
77
  type: :development
64
78
  prerelease: false
65
79
  version_requirements: !ruby/object:Gem::Requirement
66
80
  requirements:
67
81
  - - "~>"
68
82
  - !ruby/object:Gem::Version
69
- version: 4.8.2
83
+ version: '6.1'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: activerecord-import
72
86
  requirement: !ruby/object:Gem::Requirement
73
87
  requirements:
74
88
  - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: '0.4'
90
+ version: '0.28'
77
91
  type: :development
78
92
  prerelease: false
79
93
  version_requirements: !ruby/object:Gem::Requirement
80
94
  requirements:
81
95
  - - "~>"
82
96
  - !ruby/object:Gem::Version
83
- version: '0.4'
97
+ version: '0.28'
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: jeweler
86
100
  requirement: !ruby/object:Gem::Requirement
87
101
  requirements:
88
102
  - - "~>"
89
103
  - !ruby/object:Gem::Version
90
- version: '2.0'
104
+ version: '2.3'
91
105
  type: :development
92
106
  prerelease: false
93
107
  version_requirements: !ruby/object:Gem::Requirement
94
108
  requirements:
95
109
  - - "~>"
96
110
  - !ruby/object:Gem::Version
97
- version: '2.0'
111
+ version: '2.3'
98
112
  description: Dump (parts) of your database to db/seeds.rb to get a headstart creating
99
113
  a meaningful seeds.rb file
100
114
  email: rroblak@gmail.com
@@ -103,12 +117,25 @@ extensions: []
103
117
  extra_rdoc_files:
104
118
  - README.md
105
119
  files:
120
+ - ".github/workflows/release.yml"
106
121
  - ".rspec"
122
+ - Appraisals
107
123
  - Gemfile
108
124
  - MIT-LICENSE
109
125
  - README.md
110
126
  - Rakefile
111
127
  - VERSION
128
+ - find_ruby_compat.sh
129
+ - gemfiles/rails_6.1.gemfile
130
+ - gemfiles/rails_6.1.gemfile.lock
131
+ - gemfiles/rails_7.0.gemfile
132
+ - gemfiles/rails_7.0.gemfile.lock
133
+ - gemfiles/rails_7.1.gemfile
134
+ - gemfiles/rails_7.1.gemfile.lock
135
+ - gemfiles/rails_7.2.gemfile
136
+ - gemfiles/rails_7.2.gemfile.lock
137
+ - gemfiles/rails_8.0.gemfile
138
+ - gemfiles/rails_8.0.gemfile.lock
112
139
  - lib/seed_dump.rb
113
140
  - lib/seed_dump/dump_methods.rb
114
141
  - lib/seed_dump/dump_methods/enumeration.rb
@@ -119,6 +146,11 @@ files:
119
146
  - spec/dump_methods_spec.rb
120
147
  - spec/environment_spec.rb
121
148
  - spec/factories/another_samples.rb
149
+ - spec/factories/authors.rb
150
+ - spec/factories/base_users.rb
151
+ - spec/factories/books.rb
152
+ - spec/factories/bosses.rb
153
+ - spec/factories/reviews.rb
122
154
  - spec/factories/samples.rb
123
155
  - spec/factories/yet_another_samples.rb
124
156
  - spec/helpers.rb
@@ -127,7 +159,7 @@ homepage: https://github.com/rroblak/seed_dump
127
159
  licenses:
128
160
  - MIT
129
161
  metadata: {}
130
- post_install_message:
162
+ post_install_message:
131
163
  rdoc_options: []
132
164
  require_paths:
133
165
  - lib
@@ -142,9 +174,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
174
  - !ruby/object:Gem::Version
143
175
  version: '0'
144
176
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.7.6
147
- signing_key:
177
+ rubygems_version: 3.5.22
178
+ signing_key:
148
179
  specification_version: 4
149
180
  summary: "{Seed Dumper for Rails}"
150
181
  test_files: []