relational_exporter 0.0.2 → 0.0.3
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/README.md +7 -2
- data/lib/relational_exporter.rb +38 -16
- data/lib/relational_exporter/version.rb +1 -1
- 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: 27528505c9ae963ac90a8dec1a21aadba17fecd7
|
4
|
+
data.tar.gz: e84bb8298c019cc46dca592d3da020bf03f6c564
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12fc7ca1f8478f07f1c76f23fa05e91a4d89620f9656ab72d133c768c2b5e5cc8fbe8397f3e2742a9f35b47ef3e7cf28d271205334df573c8aacbb8f7201ae01
|
7
|
+
data.tar.gz: 202c03846dcc21b7cd8f0c367d6ff841c346cc6cd5e8f6f79af0834966f0ee06a5e8d9fad5aa50e04f7d72ce22b0ea4a62b746863f4f022a96813e366a0e41a8
|
data/README.md
CHANGED
@@ -78,9 +78,14 @@ Or install it yourself as:
|
|
78
78
|
}
|
79
79
|
|
80
80
|
# Run the export!
|
81
|
-
r = RelationalExporter::Runner.new schema: my_schema, connection_config: my_conn
|
81
|
+
r = RelationalExporter::Runner.new schema: my_schema, connection_config: my_conn, logger: Logger.new(STDERR)
|
82
82
|
r.export(my_output_config) do |record|
|
83
|
-
#
|
83
|
+
# examine the record and it's associations using any
|
84
|
+
# Active Record models that were defined in your schema!
|
85
|
+
puts record.class # => Person
|
86
|
+
|
87
|
+
# filter out the record if desired
|
88
|
+
record = nil if record.name == 'Bob'
|
84
89
|
end
|
85
90
|
```
|
86
91
|
|
data/lib/relational_exporter.rb
CHANGED
@@ -6,11 +6,10 @@ require 'relational_exporter/active_record_extension'
|
|
6
6
|
|
7
7
|
module RelationalExporter
|
8
8
|
class Runner
|
9
|
-
attr_accessor :schema
|
9
|
+
attr_accessor :schema, :logger
|
10
10
|
|
11
11
|
def initialize(options={})
|
12
|
-
|
13
|
-
ActiveRecord::Base.logger = Logger.new(STDOUT)
|
12
|
+
@logger = options[:logger] ? options[:logger] : Logger.new(STDERR)
|
14
13
|
|
15
14
|
@connection_config = options[:connection_config]
|
16
15
|
begin
|
@@ -26,6 +25,8 @@ module RelationalExporter
|
|
26
25
|
end
|
27
26
|
|
28
27
|
def export(output_config, &block)
|
28
|
+
ActiveRecord::Base.logger = @logger
|
29
|
+
|
29
30
|
output_config = Hashie::Mash.new output_config
|
30
31
|
|
31
32
|
main_klass = output_config.output.model.to_s.classify.constantize
|
@@ -35,7 +36,16 @@ module RelationalExporter
|
|
35
36
|
header_row = []
|
36
37
|
max_associations = {}
|
37
38
|
|
38
|
-
|
39
|
+
csv_options = {headers: true}
|
40
|
+
if output_config.file_path.blank?
|
41
|
+
csv_method = :instance
|
42
|
+
csv_args = [STDOUT, csv_options]
|
43
|
+
else
|
44
|
+
csv_method = :open
|
45
|
+
csv_args = [output_config.file_path, 'wb', csv_options]
|
46
|
+
end
|
47
|
+
|
48
|
+
::CSV.send(csv_method, *csv_args) do |csv|
|
39
49
|
main_klass.find_all_by_scope(output_config.output.scope.as_json).find_in_batches do |batch|
|
40
50
|
batch.each do |single|
|
41
51
|
if block_given?
|
@@ -47,15 +57,7 @@ module RelationalExporter
|
|
47
57
|
row = []
|
48
58
|
|
49
59
|
# Add main record headers
|
50
|
-
|
51
|
-
main_attributes = main_klass.active_model_serializer.new(single).as_json(root: false) rescue nil
|
52
|
-
elsif defined?(BaseSerializer)
|
53
|
-
main_attributes = BaseSerializer.new(single).as_json(root: false) rescue nil
|
54
|
-
end
|
55
|
-
|
56
|
-
main_attributes = single.attributes if main_attributes.nil?
|
57
|
-
|
58
|
-
main_attributes.each do |field, value|
|
60
|
+
serialized_attributes(single).each do |field, value|
|
59
61
|
header_row << [main_klass.to_s.underscore, field].join('_').classify if csv.header_row?
|
60
62
|
row << value
|
61
63
|
end
|
@@ -77,7 +79,7 @@ module RelationalExporter
|
|
77
79
|
|
78
80
|
foreign_key = main_klass.reflections[association_accessor].foreign_key rescue nil
|
79
81
|
|
80
|
-
fields = association_klass.
|
82
|
+
fields = serialized_attributes(association_klass).keys
|
81
83
|
|
82
84
|
fields.reject! {|v| v == foreign_key } if foreign_key
|
83
85
|
|
@@ -93,6 +95,8 @@ module RelationalExporter
|
|
93
95
|
max_associated = 1
|
94
96
|
end
|
95
97
|
|
98
|
+
max_associated = 0 if max_associated.nil?
|
99
|
+
|
96
100
|
max_associations[association_accessor] = max_associated
|
97
101
|
|
98
102
|
max_associated.times do |i|
|
@@ -107,7 +111,7 @@ module RelationalExporter
|
|
107
111
|
|
108
112
|
csv << header_row if csv.header_row?
|
109
113
|
if row.count != header_row.count
|
110
|
-
|
114
|
+
@logger.error "Encountered invalid row, skipping."
|
111
115
|
end
|
112
116
|
csv << row
|
113
117
|
end
|
@@ -117,10 +121,28 @@ module RelationalExporter
|
|
117
121
|
|
118
122
|
private
|
119
123
|
|
124
|
+
def serialized_attributes(object)
|
125
|
+
return nil if object.nil?
|
126
|
+
|
127
|
+
klass, model = object.is_a?(Class) ? [object, object.first] : [object.class, object]
|
128
|
+
|
129
|
+
return {} if model.nil?
|
130
|
+
|
131
|
+
if model.respond_to?(:active_model_serializer) && !model.active_model_serializer.nil?
|
132
|
+
serialized = model.active_model_serializer.new(model).as_json(root: false) rescue nil
|
133
|
+
# elsif defined?(BaseSerializer)
|
134
|
+
# serialized = BaseSerializer.new(model).as_json(root: false) rescue nil
|
135
|
+
end
|
136
|
+
|
137
|
+
serialized = model.attributes if serialized.nil?
|
138
|
+
serialized
|
139
|
+
end
|
140
|
+
|
120
141
|
def get_row_arr(records, fields, max_count=1, &block)
|
121
142
|
max_count.times do |i|
|
143
|
+
record = serialized_attributes records[i]
|
122
144
|
fields.each do |field|
|
123
|
-
val =
|
145
|
+
val = record[field] rescue nil
|
124
146
|
yield val
|
125
147
|
end
|
126
148
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relational_exporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Hammond
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hashie
|