Revision 20d817c8
Added by Tomer Brisker almost 7 years ago
app/services/csv_exporter.rb | ||
---|---|---|
|
||
module CsvExporter
|
||
def self.export(resources, columns)
|
||
header = csv_header(columns)
|
||
Enumerator.new do |csv|
|
||
csv << csv_header(columns)
|
||
csv << header
|
||
columns.map!{|c| c.to_s.split('.').map(&:to_sym)}
|
||
|
||
resources.uncached do
|
||
resources.reorder(nil).limit(nil).find_each do |obj|
|
||
csv << CSV.generate_line(columns.map{|c| obj.send(c)})
|
||
csv << CSV.generate_line(columns.map{|c| c.inject(obj, :try)})
|
||
end
|
||
end
|
||
end
|
test/controllers/concerns/csv_responder_test.rb | ||
---|---|---|
assert_equal "text/csv; charset=utf-8", response.headers["Content-Type"]
|
||
assert_equal "no-cache", response.headers["Cache-Control"]
|
||
assert_equal "attachment; filename=\"fake-#{Date.today}.csv\"", response.headers["Content-Disposition"]
|
||
assert response.stream.instance_variable_get(:@buf).is_a? Enumerator
|
||
assert_equal "Name\n", response.stream.instance_variable_get(:@buf).next
|
||
buf = response.stream.instance_variable_get(:@buf)
|
||
assert buf.is_a? Enumerator
|
||
assert_equal "Name\n", buf.next
|
||
end
|
||
end
|
||
|
||
... | ... | |
tests Api::V2::FakeController
|
||
|
||
test "response is streamed correctly with right headers" do
|
||
get :index
|
||
get :index, {}, set_session_user
|
||
assert_equal "text/csv; charset=utf-8", response.headers["Content-Type"]
|
||
assert_equal "no-cache", response.headers["Cache-Control"]
|
||
assert_equal "attachment; filename=\"fake-#{Date.today}.csv\"", response.headers["Content-Disposition"]
|
||
assert response.stream.instance_variable_get(:@buf).is_a? Enumerator
|
||
assert_equal "Name\n", response.stream.instance_variable_get(:@buf).next
|
||
buf = response.stream.instance_variable_get(:@buf)
|
||
assert buf.is_a? Enumerator
|
||
assert_equal "Name\n", buf.next
|
||
end
|
||
end
|
test/unit/csv_exporter_test.rb | ||
---|---|---|
result = CsvExporter.export(Host::Managed, [:id])
|
||
assert_equal "Id\n", result.next
|
||
assert_equal result.count, Host::Managed.count+1
|
||
assert_difference('CsvExporter.export(Host::Managed, [:id]).count') do
|
||
FactoryGirl.create(:host)
|
||
end
|
||
end
|
||
|
||
test 'handles empty results correctly' do
|
||
... | ... | |
result.next
|
||
end
|
||
end
|
||
|
||
test 'calls nested methods on records' do
|
||
host = FactoryGirl.create(:host)
|
||
result = CsvExporter.export(Host::Managed, [:name, 'location.name'])
|
||
assert_equal "Name,Location.Name\n", result.next
|
||
assert_equal "#{host.name},#{host.location.name}\n", result.next
|
||
assert_raises StopIteration do
|
||
result.next
|
||
end
|
||
end
|
||
end
|
Also available in: Unified diff
Fixes #19585 - Allow csv export of nested attributes
This is required for example to export host facet attributes.