dumped_railers 0.1.5 → 0.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.travis.yml +9 -4
- data/CHANGELOG.md +24 -0
- data/README.md +82 -12
- data/dumped_railers.gemspec +2 -2
- data/gemfiles/{Gemfile.rails_6.0.3.4 → Gemfile.rails_5.2} +1 -1
- data/gemfiles/{Gemfile.rails_6.1.0 → Gemfile.rails_6.0} +0 -0
- data/gemfiles/{Gemfile.rails_5.2.4 → Gemfile.rails_6.1} +1 -1
- data/lib/dumped_railers.rb +31 -18
- data/lib/dumped_railers/configuration.rb +35 -0
- data/lib/dumped_railers/dump.rb +1 -1
- data/lib/dumped_railers/fixture_builder/record.rb +8 -8
- data/lib/dumped_railers/import.rb +20 -4
- data/lib/dumped_railers/preprocessor/strip_ignorables.rb +7 -3
- data/lib/dumped_railers/record_builder/fixture_set.rb +31 -9
- data/lib/dumped_railers/version.rb +1 -1
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad9f2b4ac74c2d926442a9292907bf0201cfe2dc01f48e6a1c115514360b730a
|
4
|
+
data.tar.gz: 515e61e954e02489ae21218f121e593389d1f1602ad5c532fcc53e02ae112237
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fd8c272b5c0f630bc08ec446ada9d1bdb96eeeb353d3c1bd20df515e045a157508070eba600fbcf3e927c804a2fe4e1b18307210d19067f961eeeaa26729a83
|
7
|
+
data.tar.gz: adf932812767e149015efafc1007ba069f88001304601538046146137abe4ab9aa3c686948140e122713237221f68b73f085367a06b49bfcbd162585aa0d880f
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
---
|
2
2
|
language: ruby
|
3
3
|
cache: bundler
|
4
|
+
before_install: gem install bundler
|
4
5
|
rvm:
|
6
|
+
- 3.0.0
|
5
7
|
- 2.7.2
|
6
8
|
- 2.6.6
|
7
9
|
- 2.5.8
|
8
10
|
gemfile:
|
9
|
-
- gemfiles/Gemfile.rails_6.1
|
10
|
-
- gemfiles/Gemfile.rails_6.0
|
11
|
-
- gemfiles/Gemfile.rails_5.2
|
12
|
-
|
11
|
+
- gemfiles/Gemfile.rails_6.1
|
12
|
+
- gemfiles/Gemfile.rails_6.0
|
13
|
+
- gemfiles/Gemfile.rails_5.2
|
14
|
+
jobs:
|
15
|
+
exclude:
|
16
|
+
- rvm: 3.0.0
|
17
|
+
gemfile: gemfiles/Gemfile.rails_5.2
|
data/CHANGELOG.md
CHANGED
@@ -30,3 +30,27 @@
|
|
30
30
|
## [0.1.5]
|
31
31
|
### Added
|
32
32
|
- Supported in-memopry fixtures. Now users can dump into and import from in-memory fixture object without saving files.
|
33
|
+
|
34
|
+
## [0.2.0]
|
35
|
+
### Added
|
36
|
+
- Provide options to limit models to import, so that users can prohibit modification to arbitrary models.
|
37
|
+
- Support for Ruby 3.0.0 (requires Rails >= 6.0)
|
38
|
+
|
39
|
+
### Changed
|
40
|
+
- Accept both global configuration as well as runtime (one-off) settings for all the available options.
|
41
|
+
Now all the configured settings will be overridden at runtime when the settings are provided with arguments.
|
42
|
+
|
43
|
+
## [0.3.0]
|
44
|
+
### Added
|
45
|
+
- Support `before_save`/`after_save` callbacks with import! method. The callbacks are invoked just before (or after) each table's records are saved.
|
46
|
+
|
47
|
+
## [0.3.1]
|
48
|
+
### Added
|
49
|
+
- Accept multiple (array) callbacks for `before_save` / `after_save` arguments with DumpedRailers.import!.
|
50
|
+
|
51
|
+
## [0.4.0]
|
52
|
+
### Changed
|
53
|
+
- **BREAKING** preprocessor interface has changed so as that its API have consistency with that of callbacks.
|
54
|
+
- Preprocessors now require arguments (`model`, `attributes`) in this order. Before version < 0.4, it was (`attributes`, `model`)
|
55
|
+
- Attributes needs to be updated destructively within preprocessors. Return values are no longer required reflect the changes.
|
56
|
+
|
data/README.md
CHANGED
@@ -78,24 +78,24 @@ DumpedRailers.import!(fixtures)
|
|
78
78
|
|
79
79
|
DumpedRailers does not save the fixtures when `base_dir` keyword argument is not specified.
|
80
80
|
|
81
|
-
###
|
81
|
+
### Ignoring Certain Columns
|
82
82
|
|
83
83
|
* By default, DumpedRailers ignore three columns - `id`, `created_at`, `updated_at`. You can always update/change this settings as follows.
|
84
84
|
|
85
85
|
```ruby
|
86
86
|
DumpedRailers.configure do |config|
|
87
|
-
config.ignorable_columns += [:published_on] # published_on will be ignored on top of default settings.
|
87
|
+
config.ignorable_columns += [:published_on] # :published_on will be ignored *on top of* default settings.
|
88
88
|
end
|
89
89
|
```
|
90
90
|
|
91
91
|
* of course you can totally replace the settings with your own.
|
92
92
|
```ruby
|
93
93
|
DumpedRailers.configure do |config|
|
94
|
-
config.ignorable_columns = %i[uuid created_on updated_on] # uuid and created_on will be ignored instead of id, created_at, updated_at
|
94
|
+
config.ignorable_columns = %i[uuid created_on updated_on] # :uuid and :created_on will be ignored *instead of* :id, :created_at, :updated_at
|
95
95
|
end
|
96
96
|
```
|
97
97
|
|
98
|
-
### Masking,
|
98
|
+
### Masking, Filtering
|
99
99
|
|
100
100
|
* you can pass `preprocessors` to DumpedRailers before it starts dump. All the attributes are filtered through preprocessors in order of registration.
|
101
101
|
|
@@ -103,15 +103,15 @@ end
|
|
103
103
|
DumpedRailers.dump!(User, Item, base_dir: 'tmp/', preprocessors: [MaskingPreprocessor.new])
|
104
104
|
```
|
105
105
|
|
106
|
-
* "Preprocessors" can be lambda, or module, or any objects that can repond to #call(
|
106
|
+
* "Preprocessors" can be lambda, or module, or any objects that can repond to #call(model, attributes).
|
107
107
|
|
108
108
|
|
109
109
|
```ruby
|
110
110
|
class MaskingPreprocessor
|
111
|
-
def call(
|
112
|
-
attrs.
|
113
|
-
col
|
114
|
-
}
|
111
|
+
def call(model, attrs)
|
112
|
+
attrs.each { |col, _value|
|
113
|
+
attrs[col] = '<MASKED>' if col.match?(/password/)
|
114
|
+
}
|
115
115
|
end
|
116
116
|
end
|
117
117
|
```
|
@@ -119,12 +119,82 @@ end
|
|
119
119
|
* a lambda object can be accepted as well
|
120
120
|
|
121
121
|
```ruby
|
122
|
-
masking_preprocessor = -> (
|
122
|
+
masking_preprocessor = -> (model, attrs) { attrs.transform_values!(&:upcase) }
|
123
123
|
```
|
124
124
|
|
125
|
-
NOTE:
|
125
|
+
NOTE:
|
126
|
+
* In order to reflect changes to the output, **preprocessors must change the attributes destructively**.
|
127
|
+
* If you set multiple preprocessors, each preprocessor will be invoked sequentially from left to right, which means your second preprocessor receives attributes only after your first preprocessor update them.
|
126
128
|
|
127
|
-
###
|
129
|
+
### Limiting Import with Authorized Models Only
|
130
|
+
|
131
|
+
* In case you don't want to accept arbitrary fixtures to import, you can limit model access as follows:
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
DumpedRailers.import!(fixtures, authorized_models: [Item, Price])
|
135
|
+
```
|
136
|
+
|
137
|
+
This would allow us to import fixtures for items and prices, but reject modification on User, Purchase, Admin data.
|
138
|
+
|
139
|
+
NOTE: Only DumpedRailers.import! is affected by this option. DumpedRailers.dump! can't be scoped (at least in the current version).
|
140
|
+
|
141
|
+
|
142
|
+
### Setting Callbacks
|
143
|
+
|
144
|
+
* You can set `before_save` / `after_save` callbacks for import! method.
|
145
|
+
The callbacks are invoked just before/after each table's records are saved.
|
146
|
+
|
147
|
+
```ruby
|
148
|
+
before_callback = -> (model, records) {
|
149
|
+
if model == User
|
150
|
+
# set random initial passwords before saving
|
151
|
+
records.each do |user|
|
152
|
+
user.password = user.password_confirmation = SecureRandom.hex(12)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
}
|
156
|
+
|
157
|
+
after_callback1 = -> (model, records) {
|
158
|
+
if model == User
|
159
|
+
records.each do |user|
|
160
|
+
user.confirm!
|
161
|
+
end
|
162
|
+
end
|
163
|
+
}
|
164
|
+
|
165
|
+
after_callback2 = -> (model, records) {
|
166
|
+
if model == Admin
|
167
|
+
records.each |admin|
|
168
|
+
notify_to_slack(admin.email, admin.name)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
}
|
172
|
+
|
173
|
+
DumpedRailers.import!(fixture_path, before_save: before_callback, after_save: [after_callback1, after_callback2])
|
174
|
+
```
|
175
|
+
|
176
|
+
`before_save` / `after_save` can accept both single and multiple (array) arguments.
|
177
|
+
|
178
|
+
### Configuration
|
179
|
+
|
180
|
+
* All the settings can be configured by either configuration (global) or arguments (at runtime).
|
181
|
+
* When you have duplicated setting, arguments are respected: you can always override configured settings by arguments.
|
182
|
+
|
183
|
+
```ruby
|
184
|
+
DumpedRailers.configure do |config|
|
185
|
+
config.ignorable_columns = [:archived_at]
|
186
|
+
config.preprocessors = [FooPreprocessor, BarPreprocessor]
|
187
|
+
end
|
188
|
+
|
189
|
+
DumpedRailers.dump!(Item, ignorable_columns: [:id], preprocessors: [BazPreprocessor], base_dir: 'tmp/')
|
190
|
+
# this would ignore `id` column, and apply BazPreprocessor only
|
191
|
+
|
192
|
+
DumpedRailers.dump!(Price, base_dir: 'tmp/')
|
193
|
+
# this would ignore `archived_at`, applies FooPreprocessor and BazPreprocessor
|
194
|
+
# (settings provided with arguments are considered as one-off, and don't survive globally)
|
195
|
+
```
|
196
|
+
|
197
|
+
### Dump/Import under default_scope (e.g. ActsAsTenant)
|
128
198
|
|
129
199
|
* Such library builds multi-tenancy environment on one single database, using default_scope to switch over database access rights between tenants. You can incorporate data from Tenant A to Tenant B as follows. let's say we use [ActsAsTenant](https://github.com/ErwinM/acts_as_tenant)
|
130
200
|
|
data/dumped_railers.gemspec
CHANGED
@@ -27,9 +27,9 @@ Gem::Specification.new do |spec|
|
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
29
29
|
spec.add_development_dependency 'rake', '~> 12.3.3'
|
30
|
-
spec.add_development_dependency 'rspec', '~> 3.
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.10'
|
31
31
|
spec.add_development_dependency 'sqlite3'
|
32
|
-
spec.add_development_dependency 'activerecord', '
|
32
|
+
spec.add_development_dependency 'activerecord', '>= 5.2'
|
33
33
|
spec.add_development_dependency 'database_cleaner-active_record', '~> 1.8'
|
34
34
|
spec.add_development_dependency 'pry'
|
35
35
|
spec.add_development_dependency 'pry-byebug'
|
File without changes
|
data/lib/dumped_railers.rb
CHANGED
@@ -4,45 +4,58 @@ require 'dumped_railers/version'
|
|
4
4
|
require 'dumped_railers/file_helper.rb'
|
5
5
|
require 'dumped_railers/dump'
|
6
6
|
require 'dumped_railers/import'
|
7
|
+
require 'dumped_railers/configuration'
|
7
8
|
|
8
9
|
module DumpedRailers
|
9
|
-
|
10
|
-
|
11
|
-
def dump!(*models, base_dir: nil, preprocessors: nil)
|
12
|
-
preprocessors = [Preprocessor::StripIgnorables.new, *preprocessors].compact.uniq
|
10
|
+
extend Configuration
|
13
11
|
|
14
|
-
|
12
|
+
class << self
|
13
|
+
def dump!(*models, base_dir: nil, preprocessors: nil, ignorable_columns: nil)
|
14
|
+
# override global config settings when options are specified
|
15
|
+
runtime_options = { preprocessors: preprocessors.presence, ignorable_columns: ignorable_columns.presence }.compact.reverse_merge(dump_options.deep_dup)
|
16
|
+
runtime_options[:preprocessors].unshift(
|
17
|
+
default_preprocessor(runtime_options[:ignorable_columns])
|
18
|
+
)
|
19
|
+
|
20
|
+
fixture_handler = Dump.new(*models, preprocessors: runtime_options[:preprocessors])
|
15
21
|
fixtures = fixture_handler.build_fixtures!
|
16
22
|
fixture_handler.persist_all!(base_dir)
|
17
23
|
|
18
24
|
fixtures
|
19
25
|
end
|
20
26
|
|
21
|
-
def import!(*paths)
|
27
|
+
def import!(*paths, authorized_models: nil, before_save: nil, after_save: nil)
|
22
28
|
# make sure class-baseed caches starts with clean state
|
23
29
|
DumpedRailers::RecordBuilder::FixtureRow::RecordStore.clear!
|
24
30
|
DumpedRailers::RecordBuilder::DependencyTracker.clear!
|
25
31
|
|
26
|
-
|
32
|
+
# override global config settings when options are specified
|
33
|
+
runtime_options = { authorized_models: authorized_models.presence }.compact.reverse_merge(import_options)
|
34
|
+
|
35
|
+
before_save = Array(before_save).compact
|
36
|
+
after_save = Array(after_save).compact
|
37
|
+
|
38
|
+
fixture_handler = Import.new(
|
39
|
+
*paths,
|
40
|
+
authorized_models: runtime_options[:authorized_models],
|
41
|
+
before_save: before_save,
|
42
|
+
after_save: after_save,
|
43
|
+
)
|
27
44
|
fixture_handler.import_all!
|
28
45
|
end
|
29
46
|
|
30
|
-
|
47
|
+
private
|
31
48
|
|
32
|
-
def
|
33
|
-
|
49
|
+
def default_preprocessor(ignorable_columns)
|
50
|
+
Preprocessor::StripIgnorables.new(*ignorable_columns)
|
34
51
|
end
|
35
52
|
|
36
|
-
def
|
37
|
-
|
53
|
+
def dump_options
|
54
|
+
options.slice(:ignorable_columns, :preprocessors)
|
38
55
|
end
|
39
56
|
|
40
|
-
|
41
|
-
|
42
|
-
def configure_defaults!
|
43
|
-
configure do |config|
|
44
|
-
config.ignorable_columns = IGNORABLE_COLUMNS
|
45
|
-
end
|
57
|
+
def import_options
|
58
|
+
options.slice(:authorized_models)
|
46
59
|
end
|
47
60
|
end
|
48
61
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DumpedRailers
|
4
|
+
module Configuration
|
5
|
+
extend Forwardable
|
6
|
+
def_delegators :@_config, :preprocessors, :ignorable_columns, :authorized_models
|
7
|
+
|
8
|
+
def configure
|
9
|
+
yield config
|
10
|
+
end
|
11
|
+
|
12
|
+
def options
|
13
|
+
config.to_h
|
14
|
+
end
|
15
|
+
|
16
|
+
IGNORABLE_COLUMNS = %w[id created_at updated_at]
|
17
|
+
def configure_defaults!
|
18
|
+
clear_configuration!(
|
19
|
+
ignorable_columns: IGNORABLE_COLUMNS,
|
20
|
+
preprocessors: [],
|
21
|
+
authorized_models: :any,
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def config
|
26
|
+
@_config ||= OpenStruct.new
|
27
|
+
end
|
28
|
+
private :config
|
29
|
+
|
30
|
+
def clear_configuration!(**attrs)
|
31
|
+
@_config = OpenStruct.new(attrs)
|
32
|
+
end
|
33
|
+
private :clear_configuration!
|
34
|
+
end
|
35
|
+
end
|
data/lib/dumped_railers/dump.rb
CHANGED
@@ -7,7 +7,7 @@ module DumpedRailers
|
|
7
7
|
class Dump
|
8
8
|
def initialize(*models, preprocessors: [])
|
9
9
|
@fixture_tables = models.map { |model|
|
10
|
-
FixtureBuilder::Model.new(model,
|
10
|
+
FixtureBuilder::Model.new(model, preprocessors: preprocessors)
|
11
11
|
}
|
12
12
|
end
|
13
13
|
|
@@ -11,11 +11,11 @@ module DumpedRailers
|
|
11
11
|
|
12
12
|
def build!
|
13
13
|
id = @record.id
|
14
|
-
attributes =
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
attributes = @record.attributes.deep_dup
|
15
|
+
@preprocessors.each do |preprocessor|
|
16
|
+
preprocessor.call(@model, attributes)
|
17
|
+
end
|
18
|
+
|
19
19
|
# convert "belong_to association" foreign keys into record-unique labels
|
20
20
|
@model.reflect_on_all_associations.select(&:belongs_to?).each do |rel|
|
21
21
|
# skip ignorables
|
@@ -39,15 +39,15 @@ module DumpedRailers
|
|
39
39
|
|
40
40
|
[record_label_for(@model.name, id), attributes]
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
private
|
44
|
-
|
44
|
+
|
45
45
|
def record_label_for(class_name, id, type=nil)
|
46
46
|
return nil unless id
|
47
47
|
|
48
48
|
identifier = "#{class_name.to_s.underscore}_#{id}"
|
49
49
|
type_specifier = "(#{type})" if type
|
50
|
-
|
50
|
+
|
51
51
|
"__#{identifier}#{type_specifier}"
|
52
52
|
end
|
53
53
|
end
|
@@ -6,28 +6,44 @@ module DumpedRailers
|
|
6
6
|
class Import
|
7
7
|
attr_reader :fixture_set
|
8
8
|
|
9
|
-
def initialize(*paths)
|
9
|
+
def initialize(*paths, authorized_models: [], before_save: [], after_save: [])
|
10
|
+
@before_save = before_save
|
11
|
+
@after_save = after_save
|
12
|
+
|
10
13
|
if (paths.first.is_a? Hash)
|
11
14
|
@raw_fixtures = paths.first.values
|
12
15
|
else
|
13
16
|
@raw_fixtures = FileHelper.read_fixtures(*paths)
|
14
17
|
end
|
15
18
|
|
16
|
-
@fixture_set = RecordBuilder::FixtureSet.new(@raw_fixtures)
|
19
|
+
@fixture_set = RecordBuilder::FixtureSet.new(@raw_fixtures, authorized_models: authorized_models)
|
17
20
|
end
|
18
21
|
|
19
|
-
def import_all!
|
22
|
+
def import_all!(&block)
|
23
|
+
fixture_set.authorize_models!
|
20
24
|
fixture_set.sort_by_table_dependencies!
|
21
25
|
@record_sets = fixture_set.build_record_sets!
|
22
26
|
|
23
27
|
ActiveRecord::Base.transaction(joinable: false, requires_new: true) do
|
24
28
|
# models have to be persisted one-by-one so that dependent models are able to
|
25
29
|
# resolve "belongs_to" (parent) association
|
26
|
-
@record_sets.each do |
|
30
|
+
@record_sets.each do |model, records|
|
31
|
+
@before_save.each do |callback|
|
32
|
+
callback.call(model, records)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
@record_sets.each do |model, records|
|
27
37
|
# FIXME: faster implementation wanted, parhaps with activerocord-import
|
28
38
|
# (objects needs to be reloaded somehow when using buik insert)
|
29
39
|
records.each(&:save!)
|
30
40
|
end
|
41
|
+
|
42
|
+
@record_sets.each do |model, records|
|
43
|
+
@after_save.each do |callback|
|
44
|
+
callback.call(model, records)
|
45
|
+
end
|
46
|
+
end
|
31
47
|
end
|
32
48
|
end
|
33
49
|
end
|
@@ -3,9 +3,13 @@
|
|
3
3
|
module DumpedRailers
|
4
4
|
module Preprocessor
|
5
5
|
class StripIgnorables
|
6
|
-
def
|
7
|
-
|
8
|
-
|
6
|
+
def initialize(*ignorable_columns)
|
7
|
+
@ignorable_columns = ignorable_columns.compact.map(&:to_s)
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(_model, attributes)
|
11
|
+
attributes.delete_if { |column_name, _v|
|
12
|
+
@ignorable_columns.include?(column_name)
|
9
13
|
}
|
10
14
|
end
|
11
15
|
end
|
@@ -8,35 +8,57 @@ module DumpedRailers
|
|
8
8
|
class FixtureSet
|
9
9
|
include TSort
|
10
10
|
attr_reader :fixture_tables, :record_sets
|
11
|
-
|
12
|
-
def initialize(raw_fixtures)
|
11
|
+
|
12
|
+
def initialize(raw_fixtures, authorized_models: [])
|
13
13
|
@fixture_tables = raw_fixtures.map { |raw_records| build_fixture_table(raw_records) }
|
14
|
+
@authorized_models = Array(authorized_models)
|
14
15
|
end
|
15
|
-
|
16
|
+
|
16
17
|
def sort_by_table_dependencies!
|
17
18
|
@fixture_tables.each(&:analyze_metadata_dependencies!)
|
18
19
|
# dependency are sorted in topological order using Active Record reflection
|
19
20
|
@fixture_tables = tsort
|
20
|
-
|
21
|
+
|
21
22
|
self
|
22
23
|
end
|
23
|
-
|
24
|
+
|
25
|
+
def authorize_models!
|
26
|
+
return if @authorized_models.include?(:any)
|
27
|
+
|
28
|
+
unauthorized_models = fixture_models.reject { |model|
|
29
|
+
@authorized_models.include? model
|
30
|
+
}
|
31
|
+
return if unauthorized_models.empty?
|
32
|
+
|
33
|
+
raise RuntimeError, <<~"ERROR_MESSAGE"
|
34
|
+
You are trying to import data into unauthorized models.
|
35
|
+
Make sure that the fixture contains records for authorized models only.
|
36
|
+
|
37
|
+
Models that are forbidden to access: #{unauthorized_models.map(&:name).join(', ')}
|
38
|
+
|
39
|
+
ERROR_MESSAGE
|
40
|
+
end
|
41
|
+
|
24
42
|
def build_record_sets!
|
25
43
|
@record_sets = @fixture_tables.map { |table|
|
26
44
|
[table.model, table.build_records!]
|
27
45
|
}.to_h
|
28
46
|
end
|
29
|
-
|
47
|
+
|
30
48
|
private
|
31
|
-
|
49
|
+
|
32
50
|
def build_fixture_table(raw_records)
|
33
51
|
FixtureTable.new(raw_records)
|
34
52
|
end
|
35
|
-
|
53
|
+
|
54
|
+
def fixture_models
|
55
|
+
@fixture_tables.map(&:model)
|
56
|
+
end
|
57
|
+
|
36
58
|
def tsort_each_node(&block)
|
37
59
|
@fixture_tables.each { |table| block.call(table) }
|
38
60
|
end
|
39
|
-
|
61
|
+
|
40
62
|
def tsort_each_child(node, &block)
|
41
63
|
dependent_nodes = @fixture_tables.select { |table| node.dependencies.include? table.model_name }
|
42
64
|
dependent_nodes.each &block
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dumped_railers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koji Onishi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-01-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.10'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.10'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sqlite3
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,14 +70,14 @@ dependencies:
|
|
70
70
|
name: activerecord
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '5.2'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '5.2'
|
83
83
|
- !ruby/object:Gem::Dependency
|
@@ -156,10 +156,11 @@ files:
|
|
156
156
|
- bin/console
|
157
157
|
- bin/setup
|
158
158
|
- dumped_railers.gemspec
|
159
|
-
- gemfiles/Gemfile.rails_5.2
|
160
|
-
- gemfiles/Gemfile.rails_6.0
|
161
|
-
- gemfiles/Gemfile.rails_6.1
|
159
|
+
- gemfiles/Gemfile.rails_5.2
|
160
|
+
- gemfiles/Gemfile.rails_6.0
|
161
|
+
- gemfiles/Gemfile.rails_6.1
|
162
162
|
- lib/dumped_railers.rb
|
163
|
+
- lib/dumped_railers/configuration.rb
|
163
164
|
- lib/dumped_railers/dump.rb
|
164
165
|
- lib/dumped_railers/file_helper.rb
|
165
166
|
- lib/dumped_railers/fixture_builder/model.rb
|
@@ -193,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
194
|
- !ruby/object:Gem::Version
|
194
195
|
version: '0'
|
195
196
|
requirements: []
|
196
|
-
rubygems_version: 3.
|
197
|
+
rubygems_version: 3.1.4
|
197
198
|
signing_key:
|
198
199
|
specification_version: 4
|
199
200
|
summary: A flexible fixture importer/exporter, that can transport ActiveRecord data
|