api_me 0.13.0 → 0.14.0
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/api_me.rb +46 -9
- data/lib/api_me/csv_stream_writer.rb +32 -0
- data/lib/api_me/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9646af7af8c9ba9da48b8655d133eaea222e669a916435eb86670c2ab19aa848
|
4
|
+
data.tar.gz: c580cea45bc61f08bb8cadb103db8090b7d87f7e560d7859d990dfa256735f6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e5bf1017206e3569e3998b419e4cd310ba80ab6787f2d71e317bc3880e99a1f32e29d3eb4d4355dc357a9c1429a1aa2f35e8a7fc6003da0faa65f0726e59189
|
7
|
+
data.tar.gz: 482033012c3342badf0c2b1fbeb099a04b32d217ec50af2d4940bc1bb33bd96c6e26bc5d6ef7ddebeefeac7314415e022e998f40196d97c2656b7e899b33c8f9
|
data/lib/api_me.rb
CHANGED
@@ -9,6 +9,7 @@ require 'api_me/version'
|
|
9
9
|
require 'api_me/base_filter'
|
10
10
|
require 'api_me/sorting'
|
11
11
|
require 'api_me/pagination'
|
12
|
+
require 'api_me/csv_stream_writer'
|
12
13
|
|
13
14
|
module ApiMe
|
14
15
|
extend ActiveSupport::Concern
|
@@ -76,15 +77,39 @@ module ApiMe
|
|
76
77
|
@sorted_scope = sort_scope(@filter_scope)
|
77
78
|
@pagination_object = paginate_scope(@sorted_scope, page_params)
|
78
79
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
80
|
+
respond_to do |format|
|
81
|
+
format.csv do
|
82
|
+
@csv_includes_scope = csv_includes_scope(@sorted_scope)
|
83
|
+
response.headers['Content-Type'] = 'text/csv'
|
84
|
+
response.headers['Cache-Control'] = 'no-cache'
|
85
|
+
# Hack to work around https://github.com/rack/rack/issues/1619
|
86
|
+
response.headers['Last-Modified'] = Time.current.httpdate
|
87
|
+
# Disable gzip in nginx
|
88
|
+
response.headers['X-Accel-Buffering'] = 'no'
|
89
|
+
response.headers['Content-Disposition'] = "attachment; filename=\"#{csv_filename}\""
|
90
|
+
|
91
|
+
::ApiMe::CsvStreamWriter.generate(response.stream) do |csv|
|
92
|
+
# headers
|
93
|
+
csv << csv_headers
|
94
|
+
@csv_includes_scope.find_each do |object|
|
95
|
+
csv << object.try('to_csv')
|
96
|
+
end
|
97
|
+
end
|
98
|
+
ensure
|
99
|
+
response.stream.close
|
100
|
+
end
|
101
|
+
format.all do
|
102
|
+
render(
|
103
|
+
json: @pagination_object.results,
|
104
|
+
root: collection_root_key,
|
105
|
+
each_serializer: serializer_klass,
|
106
|
+
meta: {
|
107
|
+
page: @pagination_object.page_meta,
|
108
|
+
sort: sorting_meta(@filter_scope)
|
109
|
+
}
|
110
|
+
)
|
111
|
+
end
|
112
|
+
end
|
88
113
|
end
|
89
114
|
|
90
115
|
def show
|
@@ -129,6 +154,18 @@ module ApiMe
|
|
129
154
|
|
130
155
|
protected
|
131
156
|
|
157
|
+
def csv_filename
|
158
|
+
"#{model_klass.name.dasherize}-#{Time.zone.now.to_date.to_s(:default)}.csv"
|
159
|
+
end
|
160
|
+
|
161
|
+
def csv_headers
|
162
|
+
model_klass.respond_to?('csv_headers') ? model_klass.csv_headers : []
|
163
|
+
end
|
164
|
+
|
165
|
+
def csv_includes_scope(scope)
|
166
|
+
scope
|
167
|
+
end
|
168
|
+
|
132
169
|
def singular_root_key
|
133
170
|
model_klass.name.singularize.underscore
|
134
171
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'csv'
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module ApiMe
|
5
|
+
class CsvStreamWriter
|
6
|
+
# @!attribute [r] stream
|
7
|
+
# @return [IO]
|
8
|
+
attr_reader :stream
|
9
|
+
|
10
|
+
# Provides a similar interface to CSV.generate but compatible with an IO stream
|
11
|
+
# @example
|
12
|
+
# CsvStreamWriter.generate(stream) do |csv|
|
13
|
+
# csv << ['foo', 'bar']
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# @param [IO]
|
17
|
+
# @yield [CsvStreamWriter] csv
|
18
|
+
def self.generate(stream)
|
19
|
+
yield new(stream)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [IO]
|
23
|
+
def initialize(stream)
|
24
|
+
@stream = stream
|
25
|
+
end
|
26
|
+
|
27
|
+
# @param [Array<String>]
|
28
|
+
def <<(row)
|
29
|
+
stream.write CSV.generate_line(row)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/api_me/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_me
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Clopton
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-12-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -162,6 +162,7 @@ files:
|
|
162
162
|
- Rakefile
|
163
163
|
- lib/api_me.rb
|
164
164
|
- lib/api_me/base_filter.rb
|
165
|
+
- lib/api_me/csv_stream_writer.rb
|
165
166
|
- lib/api_me/engine.rb
|
166
167
|
- lib/api_me/model.rb
|
167
168
|
- lib/api_me/pagination.rb
|