common-data-caching 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3807a5c6b09ddd98dfcb3b476defd965be5b6c158577c212284eb2f1521197e3
4
+ data.tar.gz: 6a715c0d8a1f00ed3efab75ad5b4f5fba86d346804e0dc8aab776df35363f002
5
+ SHA512:
6
+ metadata.gz: d5a7cedbb2265e339fb3b022fdd54b37b878a0c3bb16d873a3b84bdc5394f993e07a42ed13055c5d2fb9e3e07f13f4ba2ff24931871dffdc75b9b80b31550d90
7
+ data.tar.gz: e9d850897b225c517d8edea7f939d3359f7cb0297ee26e42efc205ab58f81e1c58966df858a8714922f67fd929d23cc096ccf9727c0b6e2ae3dd86e80f5609d5
data/README.md ADDED
@@ -0,0 +1,88 @@
1
+ # Common Data Caching
2
+ [![Gem Version](https://badge.fury.io/rb/common-data-caching.svg)](https://badge.fury.io/rb/common-data-caching)
3
+
4
+ Гем для кеширования общих данных Rails.
5
+
6
+ Часто в проектах Rails приходится формировать списки объектов для их дальнейшей обработки фронтендом (например отображение опций в селектах).
7
+
8
+ Подобные коллекции могут вызываться очень часто. И, чтобы не нагружать БД, лучше их кешировать.
9
+
10
+ Этот гем предназначен для простого кеширования необходимых данных и получения готовых кешированных коллекций.
11
+
12
+ ## Установка
13
+
14
+ Добавить в Gemfile
15
+
16
+ ```ruby
17
+ gem 'common-data-caching'
18
+ ```
19
+
20
+ И выполнить:
21
+
22
+ ```bash
23
+ bundle
24
+ ```
25
+
26
+ ## Использование
27
+
28
+ Добавьте вызов `common_cache` на моделях, передав обязательную опцию `attrs` со списком атрибутов, которые должны быть в закешированной коллекции (`id` будет добавлен по умолчанию, добавлять его не обязательно):
29
+
30
+ ```ruby
31
+ class User < ActiveRecord::Base
32
+ common_cache attrs: %i[email name]
33
+ end
34
+ ```
35
+
36
+ Коллекция кеша будет обновляться после каждого изменения записи модели - создании, обновлении, удалении.
37
+
38
+ Для получения коллекции кеша общих данных вызовите метод `common_data_cache_collection`:
39
+
40
+ ```ruby
41
+ User.common_data_cache_collection
42
+ ```
43
+
44
+ ### Сортировка
45
+
46
+ Для применения сортировки, передайте опцию `order`:
47
+
48
+ ```ruby
49
+ class User < ActiveRecord::Base
50
+ common_cache attrs: %i[email name],
51
+ order: 'name desc'
52
+ end
53
+ ```
54
+
55
+ Значение опции `order` должно соответствовать тем же значениям, которые принимает метод `.order` ActiveRecord.
56
+
57
+ По умолчанию, сортировка осуществляется по `id` в направлении `ASC`, до тех пор пока не будет передан `order`.
58
+
59
+ ### Фильтрация
60
+
61
+ Для применения фильтрации/ограничений записей, из которых будет сформирована закешированная коллекция, передайте опцию `scope`:
62
+
63
+ ```ruby
64
+ class User < ActiveRecord::Base
65
+ common_cache attrs: %i[email name],
66
+ scope: proc { where(role: 'admin') }
67
+ end
68
+ ```
69
+
70
+ Значение опции `scope` должно быть условием `where` ActiveRecord, Rails скоупом или их последовательностью, которые необходимо обернуть в `proc`.
71
+
72
+ По умолчанию, фильтрация не применяется, до тех пор пока не будет передан `scope`.
73
+
74
+ ## Массовое обновление коллекций
75
+
76
+ Для массового обновления всех коллекций воспользутесь Rake таском:
77
+
78
+ ```bash
79
+ rake common_data_caching:update
80
+ ```
81
+
82
+ ## Capistrano
83
+
84
+ Для обновления кеша общих данных при каждом деплое с помощью Capistrano добавьте в Capfile:
85
+
86
+ ```ruby
87
+ require 'common_data_caching/capistrano'
88
+ ```
@@ -0,0 +1 @@
1
+ require 'common_data_caching'
@@ -0,0 +1,27 @@
1
+ module CommonDataCaching
2
+ module Callbacks
3
+
4
+ extend ActiveSupport::Concern
5
+
6
+ def common_data_caching?
7
+ true
8
+ end
9
+
10
+ private
11
+
12
+ def update_common_data_cache
13
+ # обновить коллекцию кеша всей сущности
14
+ self.class.update_common_data_cache
15
+
16
+ # удалить отдельно кешированную запись
17
+ key = self.class.common_cache_key(id)
18
+ Rails.cache.delete(key)
19
+ end
20
+
21
+ def update_common_data_cache_versions
22
+ # обновление версии кешированной коллекции
23
+ self.class.update_common_data_cache_versions
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,12 @@
1
+ namespace :common_data_caching do
2
+ desc 'Обновление кеша общих данных'
3
+ task :update do
4
+ on roles(:app) do
5
+ within release_path do
6
+ with rails_env: "#{fetch(:stage)}" do
7
+ execute :rake, 'common_data_caching:update_cache'
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ load File.expand_path('../capistrano/tasks/common_data_caching.rake', __FILE__)
@@ -0,0 +1,46 @@
1
+ module CommonDataCaching
2
+ module ClassMethods
3
+
4
+ def common_data_caching?
5
+ true
6
+ end
7
+
8
+ def common_data_cache_key(id = nil)
9
+ ['common-data-caching', to_s, id].compact.join('_')
10
+ end
11
+
12
+ def common_data_cache_collection
13
+ Rails.cache.fetch(common_data_cache_key) || []
14
+ end
15
+
16
+ def update_common_data_cache
17
+ scope = cache_opts[:scope] || proc { where('1=1') }
18
+ ordering = cache_opts[:order] || :id
19
+
20
+ data = merge(scope).order(ordering).prepare_common_data_collection
21
+ Rails.cache.write(common_cache_key, data)
22
+ end
23
+
24
+ def update_common_data_cache_versions
25
+ versions = Rails.cache.read('common_cache_versions') || {}
26
+ versions[to_s] = Time.now.to_i
27
+ Rails.cache.write('common_cache_versions', versions)
28
+ end
29
+
30
+ def prepare_common_data_collection
31
+ # колонка ID по умолчанию
32
+ hash = { id: :id }
33
+
34
+ cache_opts[:attrs].flatten.map do |key|
35
+ key.is_a?(Hash) ? hash.merge!(key) : hash.merge!(key => key)
36
+ end
37
+
38
+ keys = hash.keys.unshift(:id)
39
+
40
+ all.map do |object|
41
+ keys.to_h { |title| [title, object.send(hash[title])] }
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ namespace :common_data_caching do
2
+
3
+ desc 'Обновить кеш общих данных'
4
+ task update_cache: :environment do
5
+ # получение списка моделей
6
+ Rails.application.eager_load!
7
+ models = ActiveRecord::Base.descendants
8
+
9
+ # удаление старых версий кеша
10
+ Rails.cache.delete('common_cache_versions')
11
+
12
+ models.each do |model|
13
+ # проверка - в модели предусмотрено кеширование общих данных
14
+ next unless model.common_data_caching?
15
+
16
+ # обновление кеша
17
+ model.update_common_cache
18
+
19
+ # обновление версий кеша
20
+ model.update_common_cache_versions
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,33 @@
1
+ require 'rake'
2
+ require 'common_data_caching/callbacks'
3
+ require 'common_data_caching/class_methods'
4
+ require 'common_data_caching/rake_tasks'
5
+
6
+ module CommonDataCaching
7
+ end
8
+
9
+ ActiveSupport.on_load(:active_record) do
10
+ class ActiveRecord::Base
11
+ def self.common_data_caching?
12
+ false
13
+ end
14
+
15
+ def common_data_caching?
16
+ self.class.common_data_caching?
17
+ end
18
+
19
+ def self.common_cache(options= {})
20
+ # опции кешинга
21
+ class_attribute :cache_opts
22
+ self.cache_opts = options
23
+
24
+ # методы кеширования
25
+ extend CommonDataCaching::ClassMethods
26
+
27
+ # установка коллбэков
28
+ include CommonDataCaching::Callbacks
29
+ after_commit :update_common_data_cache, on: %i[create update destroy], if: :common_data_caching?
30
+ after_commit :update_common_data_cache_versions, on: %i[create update destroy], if: :common_data_caching?
31
+ end
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: common-data-caching
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Павел Бабин
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-03-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '6.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '6.0'
27
+ description: Кеширование общих данных
28
+ email: babin359@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - README.md
34
+ - lib/common-data-caching.rb
35
+ - lib/common_data_caching.rb
36
+ - lib/common_data_caching/callbacks.rb
37
+ - lib/common_data_caching/capistrano.rb
38
+ - lib/common_data_caching/capistrano/tasks/common_data_caching.rake
39
+ - lib/common_data_caching/class_methods.rb
40
+ - lib/common_data_caching/rake_tasks.rb
41
+ homepage:
42
+ licenses:
43
+ - MIT
44
+ metadata:
45
+ rubygems_mfa_required: 'true'
46
+ post_install_message:
47
+ rdoc_options: []
48
+ require_paths:
49
+ - lib
50
+ required_ruby_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 3.1.0
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ requirements: []
61
+ rubygems_version: 3.0.6
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Кеширование общих данных
65
+ test_files: []