rails-settings-cached 2.3.1 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +48 -15
- data/lib/rails-settings-cached.rb +1 -0
- data/lib/rails-settings/base.rb +16 -10
- data/lib/rails-settings/request_store.rb +8 -0
- data/lib/rails-settings/version.rb +1 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 603b7101883a17d76bfb33682ce421b7259101bfc7d3b0fea450d02466adcb03
|
4
|
+
data.tar.gz: '088348b905fba8727569b052468ca194c74fcde740976e0d4cfe6b780063144f'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eeaed942036ec6c70fbd0f8a687000032e87cbef17324eca6329c32e1f7b69b6f38a7d295ec00441ec1fd1601f53c8cbe162df33e0f5d4f518658f6cb3236835
|
7
|
+
data.tar.gz: 13f87d6cac9234fcf48b50b3e67723aac4977d4a9e8fb71528bf8d12fd29eb27372d9b5705a496f694550ad988dba613f9dc3bf069fa699a910ebd1f4c5b8506
|
data/README.md
CHANGED
@@ -126,7 +126,6 @@ irb > Setting.notification_options
|
|
126
126
|
}
|
127
127
|
```
|
128
128
|
|
129
|
-
|
130
129
|
### Get defined fields
|
131
130
|
|
132
131
|
> version 2.3+
|
@@ -151,9 +150,11 @@ Setting.get_field("app_name")
|
|
151
150
|
=> { key: "app_name", type: :string, default: "Rails Settings", readonly: false }
|
152
151
|
```
|
153
152
|
|
154
|
-
##
|
153
|
+
## Use Setting in Rails initializing:
|
155
154
|
|
156
|
-
|
155
|
+
In `version 2.3+` we allows you to use Setting before Rails is initialized.
|
156
|
+
|
157
|
+
For example `config/initializers/devise.rb`
|
157
158
|
|
158
159
|
```rb
|
159
160
|
Devise.setup do |config|
|
@@ -163,17 +164,53 @@ Devise.setup do |config|
|
|
163
164
|
end
|
164
165
|
```
|
165
166
|
|
166
|
-
|
167
|
+
```rb
|
168
|
+
class Setting < RailsSettings::Base
|
169
|
+
field :omniauth_google_client_id, default: ENV["OMNIAUTH_GOOGLE_CLIENT_ID"]
|
170
|
+
field :omniauth_google_client_secret, default: ENV["OMNIAUTH_GOOGLE_CLIENT_SECRET"]
|
171
|
+
end
|
172
|
+
```
|
173
|
+
|
174
|
+
## Readonly field
|
175
|
+
|
176
|
+
You may also want use Setting before Rails initialize:
|
177
|
+
|
178
|
+
```
|
179
|
+
config/environments/*.rb
|
180
|
+
```
|
181
|
+
|
182
|
+
If you want do that do that, the setting field must has `readonly: true`.
|
183
|
+
|
184
|
+
For example:
|
167
185
|
|
168
186
|
```rb
|
169
187
|
class Setting < RailsSettings::Base
|
170
|
-
|
171
|
-
field :
|
172
|
-
|
188
|
+
field :mailer_provider, default: (ENV["mailer_provider"] || "smtp"), readonly: true
|
189
|
+
field :mailer_options, type: :hash, readonly: true, default: {
|
190
|
+
address: ENV["mailer_options.address"],
|
191
|
+
port: ENV["mailer_options.port"],
|
192
|
+
domain: ENV["mailer_options.domain"],
|
193
|
+
user_name: ENV["mailer_options.user_name"],
|
194
|
+
password: ENV["mailer_options.password"],
|
195
|
+
authentication: ENV["mailer_options.authentication"] || "login",
|
196
|
+
enable_starttls_auto: ENV["mailer_options.enable_starttls_auto"]
|
197
|
+
}
|
173
198
|
end
|
174
199
|
```
|
175
200
|
|
176
|
-
|
201
|
+
config/environments/production.rb
|
202
|
+
|
203
|
+
```rb
|
204
|
+
# You must require_relative directly in Rails 6.1+ in config/environments/production.rb
|
205
|
+
require_relative "../../app/models/setting"
|
206
|
+
|
207
|
+
Rails.application.configure do
|
208
|
+
config.action_mailer.delivery_method = :smtp
|
209
|
+
config.action_mailer.smtp_settings = Setting.mailer_options.deep_symbolize_keys
|
210
|
+
end
|
211
|
+
```
|
212
|
+
|
213
|
+
## Caching flow:
|
177
214
|
|
178
215
|
```
|
179
216
|
Setting.host -> Check Cache -> Exist - Get value of key for cache -> Return
|
@@ -183,7 +220,7 @@ Setting.host -> Check Cache -> Exist - Get value of key for cache -> Return
|
|
183
220
|
Return default value or nil
|
184
221
|
```
|
185
222
|
|
186
|
-
In each Setting keys call, we will load the cache/db and save in [
|
223
|
+
In each Setting keys call, we will load the cache/db and save in [ActiveSupport::CurrentAttributes](https://api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html) to avoid hit cache/db.
|
187
224
|
|
188
225
|
Each key update will expire the cache, so do not add some frequent update key.
|
189
226
|
|
@@ -208,7 +245,7 @@ class ActiveSupport::TestCase
|
|
208
245
|
end
|
209
246
|
```
|
210
247
|
|
211
|
-
|
248
|
+
---
|
212
249
|
|
213
250
|
## How to manage Settings in the admin interface?
|
214
251
|
|
@@ -222,19 +259,16 @@ namespace :admin do
|
|
222
259
|
end
|
223
260
|
```
|
224
261
|
|
225
|
-
|
226
262
|
app/controllers/admin/settings_controller.rb
|
227
263
|
|
228
264
|
```rb
|
229
265
|
module Admin
|
230
266
|
class SettingsController < ApplicationController
|
231
|
-
before_action :get_setting, only: [:edit, :update]
|
232
|
-
|
233
267
|
def create
|
234
268
|
setting_params.keys.each do |key|
|
235
269
|
Setting.send("#{key}=", setting_params[key].strip) unless setting_params[key].nil?
|
236
270
|
end
|
237
|
-
redirect_to
|
271
|
+
redirect_to admin_settings_path, notice: "Setting was successfully updated."
|
238
272
|
end
|
239
273
|
|
240
274
|
private
|
@@ -319,5 +353,4 @@ end
|
|
319
353
|
- [tootsuite/mastodon](https://github.com/tootsuite/mastodon) - 0.6.x
|
320
354
|
- [helpyio/helpy](https://github.com/helpyio/helpy) - 0.5.x
|
321
355
|
|
322
|
-
|
323
356
|
And more than [1K repositories](https://github.com/huacnlee/rails-settings-cached/network/dependents) used.
|
data/lib/rails-settings/base.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "request_store"
|
4
|
-
|
5
3
|
module RailsSettings
|
6
4
|
class Base < ActiveRecord::Base
|
7
5
|
class SettingNotFound < RuntimeError; end
|
@@ -25,7 +23,7 @@ module RailsSettings
|
|
25
23
|
|
26
24
|
class << self
|
27
25
|
def clear_cache
|
28
|
-
RequestStore.
|
26
|
+
RequestStore.reset
|
29
27
|
Rails.cache.delete(cache_key)
|
30
28
|
end
|
31
29
|
|
@@ -121,15 +119,15 @@ module RailsSettings
|
|
121
119
|
when :hash
|
122
120
|
value = begin
|
123
121
|
begin
|
124
|
-
|
122
|
+
YAML.load(value).to_h
|
125
123
|
rescue StandardError
|
126
124
|
eval(value).to_h
|
127
|
-
|
125
|
+
end
|
128
126
|
rescue StandardError
|
129
127
|
{}
|
130
128
|
end
|
131
129
|
value.deep_stringify_keys!
|
132
|
-
value
|
130
|
+
ActiveSupport::HashWithIndifferentAccess.new(value)
|
133
131
|
when :integer
|
134
132
|
value.to_i
|
135
133
|
when :float
|
@@ -142,19 +140,27 @@ module RailsSettings
|
|
142
140
|
end
|
143
141
|
|
144
142
|
def _value_of(var_name)
|
145
|
-
|
143
|
+
unless _table_exists?
|
144
|
+
# Fallback to default value if table was not ready (before migrate)
|
145
|
+
puts "WARNING: table: \"#{table_name}\" does not exist or not database connection, `#{name}.#{var_name}` fallback to returns the default value."
|
146
|
+
return nil
|
147
|
+
end
|
146
148
|
|
147
149
|
_all_settings[var_name.to_s]
|
148
150
|
end
|
149
151
|
|
152
|
+
def _table_exists?
|
153
|
+
table_exists?
|
154
|
+
rescue => e
|
155
|
+
false
|
156
|
+
end
|
157
|
+
|
150
158
|
def rails_initialized?
|
151
159
|
Rails.application&.initialized?
|
152
160
|
end
|
153
161
|
|
154
162
|
def _all_settings
|
155
|
-
|
156
|
-
|
157
|
-
RequestStore.store[:rails_settings_all_settings] ||= begin
|
163
|
+
RequestStore.settings ||= begin
|
158
164
|
Rails.cache.fetch(cache_key, expires_in: 1.week) do
|
159
165
|
vars = unscoped.select("var, value")
|
160
166
|
result = {}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module RailsSettings
|
2
|
+
# For storage all settings in Current, it will reset after per request completed.
|
3
|
+
# Base on ActiveSupport::CurrentAttributes
|
4
|
+
# https://api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html
|
5
|
+
class RequestStore < ActiveSupport::CurrentAttributes
|
6
|
+
attribute :settings
|
7
|
+
end
|
8
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-settings-cached
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Lee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -25,13 +25,13 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: codecov
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
|
-
type: :
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: pg
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- lib/rails-settings-cached.rb
|
129
129
|
- lib/rails-settings/base.rb
|
130
130
|
- lib/rails-settings/railtie.rb
|
131
|
+
- lib/rails-settings/request_store.rb
|
131
132
|
- lib/rails-settings/version.rb
|
132
133
|
homepage: https://github.com/huacnlee/rails-settings-cached
|
133
134
|
licenses:
|
@@ -148,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
149
|
- !ruby/object:Gem::Version
|
149
150
|
version: '0'
|
150
151
|
requirements: []
|
151
|
-
rubygems_version: 3.
|
152
|
+
rubygems_version: 3.1.2
|
152
153
|
signing_key:
|
153
154
|
specification_version: 4
|
154
155
|
summary: Settings plugin for Rails that makes managing a table of global keys.
|