live_fixtures 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/live_fixtures/export.rb +8 -4
- data/lib/live_fixtures/import.rb +52 -12
- data/lib/live_fixtures/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9414f9b5a408acaff1c2749f0f3127412f23f6d364988fcf1f75ce9a15b0cbe4
|
4
|
+
data.tar.gz: f6304bcef06ba8b4e153d7ff19744e9af837592ea0aa72a758a5446e3933055c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 348ebda33ef0e11062c823ab14d64dc5b5c5947686f91d2a094836b7a1499061ff7e306a1e943824a27e958dad4e8ed4581b5626b835c191a5409a2d735f557b
|
7
|
+
data.tar.gz: 03eb2d921c1de9d75f144c99dd5166298d2ed67d79844bb5b2aac1b44acb31a00a2076ef4ec27e2a50a72b5f41de68d6168bb517786fb1fef7aadec8d610199f
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
4
4
|
|
5
|
+
## [2.1.0] - 2020-12-09
|
6
|
+
### Added
|
7
|
+
support for selectively import tables with custom callbacks per table (#34)
|
8
|
+
|
5
9
|
## [2.0.0] - 2020-11-11
|
6
10
|
### Breaking changes
|
7
11
|
This is a breaking change because LiveFixtures::Import.new now needs to receive the class_names Hash to be able to correctly compute the insert_order in case there are some unconventional class names associations. And the class_names argument is removed from import_all. But this is the only change.
|
data/lib/live_fixtures/export.rb
CHANGED
@@ -55,10 +55,15 @@ module LiveFixtures::Export
|
|
55
55
|
# @yieldparam model [ActiveRecord::Base] each successive model.
|
56
56
|
# @yieldreturn [Hash{String => Object}] a hash of attributes to be merged and saved with the model's attributes.
|
57
57
|
def export_fixtures(models, with_references = [])
|
58
|
-
return unless models.present?
|
58
|
+
return [] unless models.present?
|
59
59
|
|
60
|
-
|
61
|
-
|
60
|
+
model_class = models.first.class
|
61
|
+
|
62
|
+
File.open(File.join(@dir, model_class.table_name + '.yml'), 'w') do |file|
|
63
|
+
file.write <<~PRELUDE
|
64
|
+
_fixture:
|
65
|
+
model_class: #{model_class.name}
|
66
|
+
PRELUDE
|
62
67
|
|
63
68
|
iterator = export_options[:show_progress] ? ProgressBarIterator : SimpleIterator
|
64
69
|
|
@@ -66,7 +71,6 @@ module LiveFixtures::Export
|
|
66
71
|
more_attributes = block_given? ? yield(model) : {}
|
67
72
|
file.write Fixture.to_yaml(model, with_references, more_attributes)
|
68
73
|
end
|
69
|
-
|
70
74
|
end
|
71
75
|
end
|
72
76
|
|
data/lib/live_fixtures/import.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
1
3
|
# An object that facilitates the import of fixtures into a database.
|
2
4
|
class LiveFixtures::Import
|
3
5
|
NO_LABEL = nil
|
@@ -6,6 +8,13 @@ class LiveFixtures::Import
|
|
6
8
|
# the inferred one if none was specified.
|
7
9
|
attr_reader :insert_order
|
8
10
|
|
11
|
+
# Map of table_name to import routine
|
12
|
+
# @return [Hash<String => Proc>]
|
13
|
+
attr_reader :alternate_imports
|
14
|
+
|
15
|
+
# Accessor for string label for a given fixture mapping to it's db id
|
16
|
+
attr_reader :label_to_id
|
17
|
+
|
9
18
|
# Instantiate a new Import with the directory containing your fixtures, and
|
10
19
|
# the order in which to import them. The order should ensure fixtures
|
11
20
|
# containing references to another fixture are imported AFTER the referenced
|
@@ -18,14 +27,25 @@ class LiveFixtures::Import
|
|
18
27
|
# @option opts [Boolean] show_progress whether or not to show the progress bar
|
19
28
|
# @option opts [Boolean] skip_missing_tables when false, an error will be raised if a yaml file isn't found for each table in insert_order
|
20
29
|
# @option opts [Boolean] skip_missing_refs when false, an error will be raised if an ID isn't found for a label.
|
30
|
+
# @option opts [Boolean] use_insert_order_as_table_names when true, table names will be those passed in insert_order, not read from yaml files
|
21
31
|
# @return [LiveFixtures::Import] an importer
|
22
32
|
# @see LiveFixtures::Export::Reference
|
23
33
|
def initialize(root_path, insert_order = nil, class_names = {}, **opts)
|
24
|
-
defaut_options = {
|
34
|
+
defaut_options = {
|
35
|
+
show_progress: true,
|
36
|
+
skip_missing_tables: false,
|
37
|
+
skip_missing_refs: false,
|
38
|
+
use_insert_order_as_table_names: false,
|
39
|
+
}
|
25
40
|
@options = defaut_options.merge(opts)
|
26
41
|
@root_path = root_path
|
27
|
-
|
28
|
-
|
42
|
+
|
43
|
+
if insert_order && @options[:use_insert_order_as_table_names]
|
44
|
+
@table_names = insert_order
|
45
|
+
else
|
46
|
+
@table_names = Dir.glob(File.join(@root_path, '{*,**}/*.yml')).map do |filepath|
|
47
|
+
File.basename filepath, ".yml"
|
48
|
+
end
|
29
49
|
end
|
30
50
|
|
31
51
|
@class_names = class_names
|
@@ -40,7 +60,9 @@ class LiveFixtures::Import
|
|
40
60
|
if @table_names.size < @insert_order.size && !@options[:skip_missing_tables]
|
41
61
|
raise ArgumentError, "table(s) mentioned in `insert_order` which has no yml file to import: #{@insert_order - @table_names}"
|
42
62
|
end
|
63
|
+
|
43
64
|
@label_to_id = {}
|
65
|
+
@alternate_imports = {}
|
44
66
|
end
|
45
67
|
|
46
68
|
# Within a transaction, import all the fixtures into the database.
|
@@ -54,13 +76,22 @@ class LiveFixtures::Import
|
|
54
76
|
# @see https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/fixtures.rb#L496
|
55
77
|
def import_all
|
56
78
|
connection = ActiveRecord::Base.connection
|
79
|
+
show_progress = @options[:show_progress]
|
57
80
|
|
81
|
+
# TODO: should be additive with alternate_imports so we can delete the fixture file
|
58
82
|
files_to_read = @table_names
|
59
83
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
84
|
+
return if files_to_read.empty?
|
85
|
+
|
86
|
+
connection.transaction(requires_new: true) do
|
87
|
+
files_to_read.each do |path|
|
88
|
+
table_name = path.tr '/', '_'
|
89
|
+
if alternate = @alternate_imports[table_name]
|
90
|
+
time = Benchmark.ms do
|
91
|
+
alternate.call(@label_to_id)
|
92
|
+
end
|
93
|
+
puts "Imported %s in %.0fms" % [table_name, time] if show_progress
|
94
|
+
else
|
64
95
|
class_name = @class_names[table_name.to_sym] || table_name.classify
|
65
96
|
|
66
97
|
ff = Fixtures.new(connection,
|
@@ -71,16 +102,25 @@ class LiveFixtures::Import
|
|
71
102
|
skip_missing_refs: @options[:skip_missing_refs])
|
72
103
|
|
73
104
|
conn = ff.model_connection || connection
|
74
|
-
|
75
|
-
iterator
|
76
|
-
|
77
|
-
|
105
|
+
|
106
|
+
iterator = show_progress ? ProgressBarIterator : SimpleIterator
|
107
|
+
iterator.new(ff).each do |tname, label, row|
|
108
|
+
conn.insert_fixture(row, tname)
|
109
|
+
@label_to_id[label] = conn.send(:last_inserted_id, tname) unless label == NO_LABEL
|
78
110
|
end
|
79
111
|
end
|
80
112
|
end
|
81
113
|
end
|
82
114
|
end
|
83
115
|
|
116
|
+
# Override import of table using a callable object
|
117
|
+
# @param table_name [String] table to use callable instead of fixture file
|
118
|
+
# @param callable [Proc] Proc/lambda that will be called with @label_to_id
|
119
|
+
def override(table_name, callable)
|
120
|
+
@alternate_imports[table_name] = callable
|
121
|
+
self
|
122
|
+
end
|
123
|
+
|
84
124
|
private
|
85
125
|
|
86
126
|
# Here we go through each of the fixture YAML files to see what polymorphic
|
@@ -131,7 +171,7 @@ class LiveFixtures::Import
|
|
131
171
|
def initialize(ff)
|
132
172
|
@ff = ff
|
133
173
|
@bar = LiveFixtures.get_progress_bar(
|
134
|
-
total:ff.fixtures.size,
|
174
|
+
total: ff.fixtures.size,
|
135
175
|
title: ff.model_class.name
|
136
176
|
)
|
137
177
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: live_fixtures
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jleven
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 1970-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -214,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
214
|
- !ruby/object:Gem::Version
|
215
215
|
version: '0'
|
216
216
|
requirements: []
|
217
|
-
rubygems_version: 3.
|
217
|
+
rubygems_version: 3.1.4
|
218
218
|
signing_key:
|
219
219
|
specification_version: 4
|
220
220
|
summary: Tools for exporting and importing between databases managed by ActiveRecord.
|