rails-archiver 0.1.4 → 0.1.5
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/lib/rails-archiver/archiver.rb +47 -30
- data/lib/rails-archiver/unarchiver.rb +20 -7
- data/rails-archiver.gemspec +2 -2
- 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: e89e5ca01be0d05982ac7fa26975124829306cae
|
4
|
+
data.tar.gz: 6780627670479f1c424524a8deda72fa1c929469
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bba0013c0242a752fa52e28c25c3514a531bec16b0d50562897db64c932ab021aa4e9466d770eed74b12bb20d753e2d71bc2028001ef5f032ecfb098075f99fc
|
7
|
+
data.tar.gz: 244cb0624a39829ac8ecc00cc5e335ea4bcd27c86590b1e29de418bd022f2e80b97e1b0bce343ae72bf13fdc2639434577d264b2f6ce6ef5f7a5370e4ac9b5e6
|
@@ -39,18 +39,54 @@ module RailsArchiver
|
|
39
39
|
def archive
|
40
40
|
@logger.info("Starting archive of #{@model.class.name} #{@model.id}")
|
41
41
|
@hash = {}
|
42
|
-
|
42
|
+
visit_nodes(@model)
|
43
|
+
save_additional_data
|
43
44
|
@logger.info('Completed loading data')
|
44
45
|
@archive_location = @transport.store_archive(@hash)
|
45
46
|
if @model.attribute_names.include?('archived')
|
46
47
|
@model.update_attribute(:archived, true)
|
47
48
|
end
|
48
|
-
@
|
49
|
-
|
50
|
-
|
49
|
+
if @options[:delete_records]
|
50
|
+
@logger.info('Deleting rows')
|
51
|
+
_delete_records
|
52
|
+
@logger.info('All records deleted')
|
53
|
+
end
|
51
54
|
@hash
|
52
55
|
end
|
53
56
|
|
57
|
+
# Use this method to add more data into the archive hash which isn't
|
58
|
+
# directly accessible from the parent model. Call `visit_nodes` on each
|
59
|
+
# set of data you want to add. To be overridden by subclasses.
|
60
|
+
def save_additional_data
|
61
|
+
end
|
62
|
+
|
63
|
+
# Used to visit an association, and recursively calls down to
|
64
|
+
# all child objects through all other allowed associations.
|
65
|
+
# @param node [ActiveRecord::Base|Array<ActiveRecord::Base>]
|
66
|
+
# any object(s) that inherits from ActiveRecord::Base
|
67
|
+
def visit_nodes(node)
|
68
|
+
return if node.blank?
|
69
|
+
if node.respond_to?(:each) # e.g. a list of nodes from a has_many association
|
70
|
+
node.each { |n| visit_nodes(n) }
|
71
|
+
else
|
72
|
+
class_name = node.class.name
|
73
|
+
@hash[class_name] ||= Set.new
|
74
|
+
@hash[class_name] << visit(node)
|
75
|
+
get_associations(node).each do |assoc|
|
76
|
+
@logger.debug("Visiting #{assoc.name}")
|
77
|
+
new_nodes = node.send(assoc.name)
|
78
|
+
next if new_nodes.blank?
|
79
|
+
|
80
|
+
if new_nodes.respond_to?(:find_each)
|
81
|
+
new_nodes.find_each { |n| visit_nodes(n) }
|
82
|
+
else
|
83
|
+
visit_nodes(new_nodes)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
54
90
|
# Returns a single object in the database represented as a hash.
|
55
91
|
# Does not account for any associations, only prints out the columns
|
56
92
|
# associated with the object as they relate to the current schema.
|
@@ -92,6 +128,13 @@ module RailsArchiver
|
|
92
128
|
@logger.info("Finished deleting from #{table}")
|
93
129
|
end
|
94
130
|
|
131
|
+
# @return [RailsArchiver::Unarchiver]
|
132
|
+
def unarchiver
|
133
|
+
unarchiver = RailsArchiver::Unarchiver.new(@model, :logger => @logger)
|
134
|
+
unarchiver.transport = self.transport
|
135
|
+
unarchiver
|
136
|
+
end
|
137
|
+
|
95
138
|
protected
|
96
139
|
|
97
140
|
# Callback that runs after deletion is finished.
|
@@ -131,31 +174,5 @@ module RailsArchiver
|
|
131
174
|
end
|
132
175
|
end
|
133
176
|
|
134
|
-
# Used to visit an association, and recursively calls down to
|
135
|
-
# all child objects through all other allowed associations.
|
136
|
-
# @param node [ActiveRecord::Base|Array<ActiveRecord::Base>]
|
137
|
-
# any object(s) that inherits from ActiveRecord::Base
|
138
|
-
def _visit_association(node)
|
139
|
-
return if node.blank?
|
140
|
-
if node.respond_to?(:each) # e.g. a list of nodes from a has_many association
|
141
|
-
node.each { |n| _visit_association(n) }
|
142
|
-
else
|
143
|
-
class_name = node.class.name
|
144
|
-
@hash[class_name] ||= Set.new
|
145
|
-
@hash[class_name] << visit(node)
|
146
|
-
get_associations(node).each do |assoc|
|
147
|
-
@logger.debug("Visiting #{assoc.name}")
|
148
|
-
new_nodes = node.send(assoc.name)
|
149
|
-
next if new_nodes.blank?
|
150
|
-
|
151
|
-
if new_nodes.respond_to?(:find_each)
|
152
|
-
new_nodes.find_each { |n| _visit_association(n) }
|
153
|
-
else
|
154
|
-
_visit_association(new_nodes)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
end
|
159
|
-
end
|
160
177
|
end
|
161
178
|
end
|
@@ -32,15 +32,18 @@ module RailsArchiver
|
|
32
32
|
# model) depending on the transport being used.
|
33
33
|
def unarchive(location=nil)
|
34
34
|
@errors = []
|
35
|
+
source = @model ? @model.class.name : location
|
35
36
|
@logger.info('Downloading JSON file')
|
36
37
|
hash = @transport.retrieve_archive(location)
|
37
|
-
@logger.info("Loading #{
|
38
|
+
@logger.info("Loading #{source}")
|
38
39
|
load_classes(hash)
|
39
|
-
@model
|
40
|
-
|
41
|
-
@model.
|
40
|
+
if @model
|
41
|
+
@model.reload
|
42
|
+
if @model.attribute_names.include?('archived')
|
43
|
+
@model.update_attribute(:archived, false)
|
44
|
+
end
|
42
45
|
end
|
43
|
-
@logger.info("#{
|
46
|
+
@logger.info("#{source} load complete!")
|
44
47
|
end
|
45
48
|
|
46
49
|
# Load a list of general classes that were saved as JSON.
|
@@ -98,12 +101,12 @@ module RailsArchiver
|
|
98
101
|
model = klass.where(klass.primary_key => hash[klass.primary_key]).first
|
99
102
|
if model.nil?
|
100
103
|
model = klass.new
|
101
|
-
model
|
104
|
+
_assign_attributes(model, attrs)
|
102
105
|
# can't set this in the attribute hash, it'll be overridden. Need
|
103
106
|
# to set it manually.
|
104
107
|
model[klass.primary_key] = hash[klass.primary_key]
|
105
108
|
else
|
106
|
-
model
|
109
|
+
_assign_attributes(model, attrs)
|
107
110
|
end
|
108
111
|
|
109
112
|
model
|
@@ -111,6 +114,16 @@ module RailsArchiver
|
|
111
114
|
|
112
115
|
private
|
113
116
|
|
117
|
+
# @param model [ActiveRecord::Base]
|
118
|
+
# @param attrs [Hash]
|
119
|
+
def _assign_attributes(model, attrs)
|
120
|
+
if model.method(:attributes=).arity == 1
|
121
|
+
model.attributes = attrs
|
122
|
+
else
|
123
|
+
model.send(:attributes=, attrs, false)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
114
127
|
def _get_transport(symbol_or_object)
|
115
128
|
if symbol_or_object.is_a?(Symbol)
|
116
129
|
klass = if symbol_or_object.present?
|
data/rails-archiver.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rails-archiver'
|
3
3
|
s.require_paths = %w(. lib lib/rails-archiver)
|
4
|
-
s.version = '0.1.
|
5
|
-
s.date = '2018-06-
|
4
|
+
s.version = '0.1.5'
|
5
|
+
s.date = '2018-06-04'
|
6
6
|
s.summary = 'Fully archive a Rails model'
|
7
7
|
s.description = <<-EOF
|
8
8
|
EOF
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-archiver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Orner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|