grape-listing 1.1.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f7ada8749162c0e09f2a0dad2712dbd31e3296d302266449e4c5edd7cea9b1d6
4
- data.tar.gz: 51afe0e601ad9e8f5d22d4c0d07031078cc9b6d1161cfd092a15dfb18265cd8b
3
+ metadata.gz: fc9d85fa238526c44cf07b472bd9976773d5bfe9cb04bdc97ecc81672df569cf
4
+ data.tar.gz: fe05929e906cb16edb27e6987eb16d0d7b12ab824f9de49154b4bb1b84294fcf
5
5
  SHA512:
6
- metadata.gz: ff72f5cf03c2394347d8745e8c68429d85f793ce64f29eddc7d808f6b75fb81c4a4cb6d12bf5af8f707a999e2fe90d5269b4b310ebd6794819d65d0bfbeb7fe0
7
- data.tar.gz: 98e6cec6b17f9efa1fcbd1890a3d376539d2662240e6dfddb107ae729a96b1f8e2aea569f2adb183fb52639945159a3dcc7b0b24ce7e5ada098d055c2d1b1066
6
+ metadata.gz: 8bf8698b3d478e54fbd02091a24a7d3a838c3a9fd30b79edb1b9941a92a722ef86a43850035f7c6e4ccd89384f4576160ae7fb09c8c665f0b706ba6f157cdf74
7
+ data.tar.gz: e45bdb89068782fae208e8b6ec250fdf528b44cd7fffbd151247346eaf473a7c4206318a10a59ac3ce7f1e04280feca4e75580de945ee3e0bb1c8a553067d442
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # Grape Listing
2
- [![Gem Version](https://badge.fury.io/rb/paginated.svg)](https://badge.fury.io/rb/paginated)
2
+ [![Gem Version](https://badge.fury.io/rb/grape-listing.svg)](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] && !params[:spreadsheet]
23
- opts[:only_columns] = params[:columns] + %w[id deleted_at]
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/collection'
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::Collection
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(records)
22
+ generate_spreadsheet(objects)
18
23
  end
19
24
 
20
25
  private
21
26
 
22
- def generate_spreadsheet(records)
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
- cols = spreadsheet_columns
44
- records.each do |record|
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
- model_cols = @model.columns.to_h { |i| [i.name, i] }
61
+ values = []
62
+ entity_doc = @grape_entity.documentation
63
+ model_cols = @model.columns.to_h { |i| [i.name.to_sym, i] }
58
64
 
59
- @params['columns'].map do |column|
65
+ @spreadsheet_cols.each do |column|
66
+ # поиск описания среди комментариев к таблице БД
60
67
  db_col = model_cols[column]
61
-
62
- db_col.comment || column
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
- def spreadsheet_columns
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.0
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-07 00:00:00.000000000 Z
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: Простая пагинация, поиск и формирование эл. таблиц для API на базе Grape
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/collection.rb
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