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 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