grape-listing 1.1.0 → 1.1.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/README.md +1 -1
- data/lib/grape/dsl.rb +2 -2
- data/lib/grape_listing_service.rb +4 -2
- data/lib/listing_service/pagination.rb +30 -0
- data/lib/listing_service/serialization.rb +42 -0
- data/lib/listing_service/spreadsheet.rb +29 -18
- metadata +5 -4
- data/lib/listing_service/collection.rb +0 -58
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc9d85fa238526c44cf07b472bd9976773d5bfe9cb04bdc97ecc81672df569cf
|
4
|
+
data.tar.gz: fe05929e906cb16edb27e6987eb16d0d7b12ab824f9de49154b4bb1b84294fcf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8bf8698b3d478e54fbd02091a24a7d3a838c3a9fd30b79edb1b9941a92a722ef86a43850035f7c6e4ccd89384f4576160ae7fb09c8c665f0b706ba6f157cdf74
|
7
|
+
data.tar.gz: e45bdb89068782fae208e8b6ec250fdf528b44cd7fffbd151247346eaf473a7c4206318a10a59ac3ce7f1e04280feca4e75580de945ee3e0bb1c8a553067d442
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Grape Listing
|
2
|
-
[](https://badge.fury.io/rb/grape-listing)
|
3
3
|
|
4
4
|
Гем для пагинации и фильтрации записей с возможностью формирования электронных таблиц (XLSX) на базе Grape.
|
5
5
|
|
data/lib/grape/dsl.rb
CHANGED
@@ -19,8 +19,8 @@ module Grape
|
|
19
19
|
opts = { model:, entity:, scopes:, search:, params:, current_user: }
|
20
20
|
|
21
21
|
# требуемый список полей (+стандартные) для фильтрации в Grape Entity
|
22
|
-
if params[:columns]
|
23
|
-
opts[:only_columns] = params[:columns] +
|
22
|
+
if params[:columns]
|
23
|
+
opts[:only_columns] = params[:spreadsheet] ? params[:columns] : params[:columns] + ['deleted_at']
|
24
24
|
end
|
25
25
|
|
26
26
|
opts
|
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'listing_service/args_handling'
|
2
|
-
require 'listing_service/
|
2
|
+
require 'listing_service/pagination'
|
3
3
|
require 'listing_service/search'
|
4
|
+
require 'listing_service/serialization'
|
4
5
|
require 'listing_service/sorting'
|
5
6
|
require 'listing_service/spreadsheet'
|
6
7
|
|
7
8
|
class GrapeListingService
|
8
9
|
|
9
10
|
include GrapeListing::ArgsHandling
|
10
|
-
include GrapeListing::
|
11
|
+
include GrapeListing::Pagination
|
11
12
|
include GrapeListing::Search
|
13
|
+
include GrapeListing::Serialization
|
12
14
|
include GrapeListing::Sorting
|
13
15
|
include GrapeListing::Spreadsheet
|
14
16
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module GrapeListing
|
2
|
+
module Pagination
|
3
|
+
|
4
|
+
def paginated
|
5
|
+
if @objects_count > 0
|
6
|
+
search
|
7
|
+
paginate
|
8
|
+
else
|
9
|
+
@objects = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# результат с пагинацией
|
13
|
+
{ count: @objects_count, objects: @objects }
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def paginate
|
19
|
+
# коллекция записей ActiveRecord для применения аггрегирования
|
20
|
+
list = @objects || @model.unscoped.merge(@scopes)
|
21
|
+
|
22
|
+
# применение сортировки и пагинации к коллекции записей
|
23
|
+
@objects = list.offset(@offset).merge(sort_proc).limit(@limit)
|
24
|
+
|
25
|
+
# сериализация с помощью переданных полей или сериалайзера
|
26
|
+
@objects = serialize(@objects)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module GrapeListing
|
2
|
+
module Serialization
|
3
|
+
|
4
|
+
private
|
5
|
+
|
6
|
+
def serialize(records)
|
7
|
+
if @fields
|
8
|
+
serialize_with_fields(records)
|
9
|
+
elsif @grape_entity
|
10
|
+
serialize_with_entity(records)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def serialize_with_fields(records)
|
15
|
+
# добавление ID в список полей по умолчанию
|
16
|
+
@fields.push(:id)
|
17
|
+
|
18
|
+
# список массивов значений
|
19
|
+
records = records.map { |i| obtain_fields_values(i) }
|
20
|
+
|
21
|
+
# трансформация массивов значений в объекты (ключ-значение)
|
22
|
+
records.map { |i| @fields.zip(i).to_h }
|
23
|
+
end
|
24
|
+
|
25
|
+
def serialize_with_entity(records)
|
26
|
+
opts = { current_user: @current_user }
|
27
|
+
|
28
|
+
# требуемый список полей (если был передан)
|
29
|
+
opts[:only] = @only_columns if @only_columns
|
30
|
+
|
31
|
+
# опция для идентификации формирования эл. таблицы
|
32
|
+
opts[:spreadsheet] = true if @params['spreadsheet']
|
33
|
+
|
34
|
+
records.map { |i| @grape_entity.represent(i, opts).as_json }
|
35
|
+
end
|
36
|
+
|
37
|
+
def obtain_fields_values(record)
|
38
|
+
@fields.map { |i| record.send(i) }
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -4,6 +4,8 @@ module GrapeListing
|
|
4
4
|
module Spreadsheet
|
5
5
|
|
6
6
|
def spreadsheet
|
7
|
+
@spreadsheet_cols = @params['columns'].map(&:to_sym)
|
8
|
+
|
7
9
|
# поиск и фильтрация
|
8
10
|
search
|
9
11
|
|
@@ -13,13 +15,16 @@ module GrapeListing
|
|
13
15
|
# ограничение записей
|
14
16
|
records = records.order(:id).offset(@offset).limit(@limit)
|
15
17
|
|
18
|
+
# сериализация записей и превращение в объекты
|
19
|
+
objects = serialize(records)
|
20
|
+
|
16
21
|
# формирования файла эл. таблицы
|
17
|
-
generate_spreadsheet(
|
22
|
+
generate_spreadsheet(objects)
|
18
23
|
end
|
19
24
|
|
20
25
|
private
|
21
26
|
|
22
|
-
def generate_spreadsheet(
|
27
|
+
def generate_spreadsheet(objects)
|
23
28
|
filepath = "#{@tempdir}/#{Time.now.strftime('%Y%m%d_%H%M%S')}.xlsx"
|
24
29
|
|
25
30
|
# создание таблицы и ее конфигурация
|
@@ -40,9 +45,8 @@ module GrapeListing
|
|
40
45
|
worksheet.append_row(spreadsheet_titles, bold)
|
41
46
|
|
42
47
|
# содержимое
|
43
|
-
|
44
|
-
|
45
|
-
values = cols.map { |col| record.send_chain(col) }
|
48
|
+
objects.each do |object|
|
49
|
+
values = object.slice(*@spreadsheet_cols).values
|
46
50
|
worksheet.append_row(values)
|
47
51
|
end
|
48
52
|
|
@@ -54,23 +58,30 @@ module GrapeListing
|
|
54
58
|
end
|
55
59
|
|
56
60
|
def spreadsheet_titles
|
57
|
-
|
61
|
+
values = []
|
62
|
+
entity_doc = @grape_entity.documentation
|
63
|
+
model_cols = @model.columns.to_h { |i| [i.name.to_sym, i] }
|
58
64
|
|
59
|
-
@
|
65
|
+
@spreadsheet_cols.each do |column|
|
66
|
+
# поиск описания среди комментариев к таблице БД
|
60
67
|
db_col = model_cols[column]
|
61
|
-
|
62
|
-
|
68
|
+
if db_col&.comment&.present?
|
69
|
+
values << db_col.comment
|
70
|
+
next
|
71
|
+
end
|
72
|
+
|
73
|
+
# поиск описания среди комментариев к полям Grape Entity
|
74
|
+
doc = entity_doc[column]
|
75
|
+
if doc && doc[:desc]
|
76
|
+
values << doc[:desc]
|
77
|
+
next
|
78
|
+
end
|
79
|
+
|
80
|
+
# ничего из вышеперечисленного не найдено, заголовок - название самой колонки
|
81
|
+
values << column.upcase
|
63
82
|
end
|
64
|
-
end
|
65
83
|
|
66
|
-
|
67
|
-
entity_doc = @grape_entity.documentation
|
68
|
-
|
69
|
-
@params['columns'].map do |column|
|
70
|
-
doc = entity_doc[column.to_sym]
|
71
|
-
|
72
|
-
doc && doc[:sheet_method] ? doc[:sheet_method].split('.') : column
|
73
|
-
end
|
84
|
+
values
|
74
85
|
end
|
75
86
|
|
76
87
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape-listing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Павел Бабин
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fast_excel
|
@@ -66,7 +66,7 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '7.0'
|
69
|
-
description:
|
69
|
+
description: Фильтрация, пагинация и формирование эл. таблиц на базе Grape
|
70
70
|
email: babin359@gmail.com
|
71
71
|
executables: []
|
72
72
|
extensions: []
|
@@ -80,8 +80,9 @@ files:
|
|
80
80
|
- lib/grape_listing/configuration.rb
|
81
81
|
- lib/grape_listing_service.rb
|
82
82
|
- lib/listing_service/args_handling.rb
|
83
|
-
- lib/listing_service/
|
83
|
+
- lib/listing_service/pagination.rb
|
84
84
|
- lib/listing_service/search.rb
|
85
|
+
- lib/listing_service/serialization.rb
|
85
86
|
- lib/listing_service/sorting.rb
|
86
87
|
- lib/listing_service/spreadsheet.rb
|
87
88
|
homepage:
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module GrapeListing
|
2
|
-
module Collection
|
3
|
-
|
4
|
-
def paginated
|
5
|
-
if @objects_count > 0
|
6
|
-
search
|
7
|
-
serialize
|
8
|
-
else
|
9
|
-
@objects = []
|
10
|
-
end
|
11
|
-
|
12
|
-
# результат с пагинацией
|
13
|
-
{ count: @objects_count, objects: @objects }
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def serialize
|
19
|
-
# коллекция записей ActiveRecord для применения аггрегирования
|
20
|
-
list = @objects || @model.unscoped.merge(@scopes)
|
21
|
-
|
22
|
-
# применение сортировки и пагинации к коллекции записей
|
23
|
-
@objects = list.offset(@offset).merge(sort_proc).limit(@limit)
|
24
|
-
|
25
|
-
# сериализация с помощью переданных полей или сериалайзера
|
26
|
-
if @fields
|
27
|
-
serialize_with_fields
|
28
|
-
elsif @grape_entity
|
29
|
-
serialize_with_entity
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def serialize_with_fields
|
34
|
-
# добавление ID в список полей по умолчанию
|
35
|
-
@fields.push(:id)
|
36
|
-
|
37
|
-
# список массивов значений
|
38
|
-
@objects = @objects.map { |i| obtain_fields_values(i) }
|
39
|
-
|
40
|
-
# трансформация массивов значений в объекты (ключ-значение)
|
41
|
-
@objects = @objects.map { |i| @fields.zip(i).to_h }
|
42
|
-
end
|
43
|
-
|
44
|
-
def serialize_with_entity
|
45
|
-
opts = { current_user: @current_user }
|
46
|
-
|
47
|
-
# требуемый список полей (если был передан)
|
48
|
-
opts[:only] = @only_columns if @only_columns
|
49
|
-
|
50
|
-
@objects = @objects.map { |i| @grape_entity.represent(i, opts).as_json }
|
51
|
-
end
|
52
|
-
|
53
|
-
def obtain_fields_values(record)
|
54
|
-
@fields.map { |i| record.send(i) }
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|