activerecord-import 0.28.0 → 0.28.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/CHANGELOG.md +7 -0
- data/lib/activerecord-import/import.rb +42 -27
- data/lib/activerecord-import/version.rb +1 -1
- data/test/import_test.rb +7 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dbd7badbb2e98c6725ddaf5edbb713c4f79bfc01
|
4
|
+
data.tar.gz: 0912df3959070820db94063d0172a43f4b027a9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22fb70781c58df1795c41e5b8e954b8a89e6c85be0dbf33f2c2fb9265847778f99f414cbd7fe9ea945d6aa43f89d7557ea41541f938fa357a7bbcb2c0e6114df
|
7
|
+
data.tar.gz: b480446464f626518ac128b2e79d4e4dbb2b50e8e52d6781812a0ee1594e5328430214ad03be9590c09dcfd07661ae54130b53ccde1b9b7d2131d2f40c80a633
|
data/CHANGELOG.md
CHANGED
@@ -24,42 +24,57 @@ module ActiveRecord::Import #:nodoc:
|
|
24
24
|
end
|
25
25
|
|
26
26
|
class Validator
|
27
|
-
def initialize(options = {})
|
27
|
+
def initialize(klass, options = {})
|
28
28
|
@options = options
|
29
|
+
init_validations(klass)
|
30
|
+
end
|
31
|
+
|
32
|
+
def init_validations(klass)
|
33
|
+
@validate_callbacks = klass._validate_callbacks.dup
|
34
|
+
|
35
|
+
klass._validate_callbacks.each_with_index do |callback, i|
|
36
|
+
filter = callback.raw_filter
|
37
|
+
|
38
|
+
if filter.class.name =~ /Validations::PresenceValidator/
|
39
|
+
callback = callback.dup
|
40
|
+
filter = filter.dup
|
41
|
+
associations = klass.reflect_on_all_associations(:belongs_to)
|
42
|
+
attrs = filter.instance_variable_get(:@attributes).dup
|
43
|
+
associations.each do |assoc|
|
44
|
+
if (index = attrs.index(assoc.name))
|
45
|
+
key = assoc.foreign_key.to_sym
|
46
|
+
attrs[index] = key unless attrs.include?(key)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
filter.instance_variable_set(:@attributes, attrs)
|
50
|
+
if @validate_callbacks.respond_to?(:chain, true)
|
51
|
+
@validate_callbacks.send(:chain).tap do |chain|
|
52
|
+
callback.instance_variable_set(:@filter, filter)
|
53
|
+
chain[i] = callback
|
54
|
+
end
|
55
|
+
else
|
56
|
+
callback.raw_filter = filter
|
57
|
+
callback.filter = callback.send(:_compile_filter, filter)
|
58
|
+
@validate_callbacks[i] = callback
|
59
|
+
end
|
60
|
+
elsif !@options[:validate_uniqueness] && filter.is_a?(ActiveRecord::Validations::UniquenessValidator)
|
61
|
+
@validate_callbacks.delete(callback)
|
62
|
+
end
|
63
|
+
end
|
29
64
|
end
|
30
65
|
|
31
66
|
def valid_model?(model)
|
32
67
|
validation_context = @options[:validate_with_context]
|
33
68
|
validation_context ||= (model.new_record? ? :create : :update)
|
34
|
-
|
35
69
|
current_context = model.send(:validation_context)
|
70
|
+
|
36
71
|
begin
|
37
72
|
model.send(:validation_context=, validation_context)
|
38
73
|
model.errors.clear
|
39
74
|
|
40
|
-
validate_callbacks = model._validate_callbacks.dup
|
41
|
-
|
42
|
-
model._validate_callbacks.each do |callback|
|
43
|
-
filter = callback.raw_filter
|
44
|
-
|
45
|
-
if filter.class.name =~ /Validations::PresenceValidator/
|
46
|
-
associations = model.class.reflect_on_all_associations(:belongs_to)
|
47
|
-
attrs = filter.instance_variable_get(:@attributes)
|
48
|
-
associations.each do |assoc|
|
49
|
-
if (index = attrs.index(assoc.name))
|
50
|
-
key = assoc.foreign_key.to_sym
|
51
|
-
attrs[index] = key unless attrs.include?(key)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
filter.instance_variable_set(:@attributes, attrs)
|
55
|
-
elsif !@options[:validate_uniqueness] && filter.is_a?(ActiveRecord::Validations::UniquenessValidator)
|
56
|
-
validate_callbacks.delete(callback)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
75
|
model.run_callbacks(:validation) do
|
61
76
|
if defined?(ActiveSupport::Callbacks::Filters::Environment) # ActiveRecord >= 4.1
|
62
|
-
runner = validate_callbacks.compile
|
77
|
+
runner = @validate_callbacks.compile
|
63
78
|
env = ActiveSupport::Callbacks::Filters::Environment.new(model, false, nil)
|
64
79
|
if runner.respond_to?(:call) # ActiveRecord < 5.1
|
65
80
|
runner.call(env)
|
@@ -78,10 +93,10 @@ module ActiveRecord::Import #:nodoc:
|
|
78
93
|
runner.invoke_before(env)
|
79
94
|
runner.invoke_after(env)
|
80
95
|
end
|
81
|
-
elsif validate_callbacks.method(:compile).arity == 0 # ActiveRecord = 4.0
|
82
|
-
model.instance_eval validate_callbacks.compile
|
96
|
+
elsif @validate_callbacks.method(:compile).arity == 0 # ActiveRecord = 4.0
|
97
|
+
model.instance_eval @validate_callbacks.compile
|
83
98
|
else # ActiveRecord 3.x
|
84
|
-
model.instance_eval validate_callbacks.compile(nil, model)
|
99
|
+
model.instance_eval @validate_callbacks.compile(nil, model)
|
85
100
|
end
|
86
101
|
end
|
87
102
|
|
@@ -529,7 +544,7 @@ class ActiveRecord::Base
|
|
529
544
|
options[:locking_column] = locking_column if attribute_names.include?(locking_column)
|
530
545
|
|
531
546
|
is_validating = options[:validate_with_context].present? ? true : options[:validate]
|
532
|
-
validator = ActiveRecord::Import::Validator.new(options)
|
547
|
+
validator = ActiveRecord::Import::Validator.new(self, options)
|
533
548
|
|
534
549
|
# assume array of model objects
|
535
550
|
if args.last.is_a?( Array ) && args.last.first.is_a?(ActiveRecord::Base)
|
data/test/import_test.rb
CHANGED
@@ -316,6 +316,13 @@ describe "#import" do
|
|
316
316
|
UserToken.import [:user_name, :token], [%w("Bob", "12345abcdef67890")]
|
317
317
|
end
|
318
318
|
end
|
319
|
+
|
320
|
+
it "should not mutate the defined validations" do
|
321
|
+
UserToken.import [:user_name, :token], [%w("Bob", "12345abcdef67890")]
|
322
|
+
ut = UserToken.new
|
323
|
+
ut.valid?
|
324
|
+
assert_includes ut.errors.messages, :user
|
325
|
+
end
|
319
326
|
end
|
320
327
|
end
|
321
328
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-import
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.28.
|
4
|
+
version: 0.28.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Dennis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|