rails_admin_settings 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +13 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile.lock +1 -1
- data/README.md +11 -0
- data/lib/rails_admin_settings.rb +75 -42
- data/lib/rails_admin_settings/settings.rb +1 -26
- data/lib/rails_admin_settings/uploads.rb +1 -1
- data/lib/rails_admin_settings/validation.rb +88 -57
- data/lib/rails_admin_settings/version.rb +1 -1
- metadata +1 -3
- data/.ruby-gemset +0 -2
- data/.ruby-version +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29fd0a6b9da6e78369f829515f98217818eee87ca05f4dfc6223265f8f1f177d
|
4
|
+
data.tar.gz: bd6b04c0cdc0ba33004138e24d7ab082e020cffaa61b2efa4f28c1168ee8cd6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a46ecf577c6f31320bf286d48a280717ae2a199e71fbd379edd11b18eda0a364b806e247485d26660e54836254c46f4b22a44f59722d46c5fac8cdc26129f6dc
|
7
|
+
data.tar.gz: 1fc1c269cbfea981a88305204ed5b12ec9d00bd631b9687e1b42c516cddc5c5de63e91e9149bfe5c909b5965689cad12c05e5873a1206f6c7d41f17e7785bb18
|
data/.travis.yml
CHANGED
@@ -9,12 +9,21 @@ rvm:
|
|
9
9
|
- 2.5.0
|
10
10
|
|
11
11
|
env:
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
global:
|
13
|
+
- CC_TEST_REPORTER_ID=f23ba257d0a12c588551991b4377e3eb218c1ff80050bc48c6b18c49ca16cb62
|
14
|
+
matrix:
|
15
|
+
- "UPLOADS=paperclip"
|
16
|
+
- "UPLOADS=carrierwave"
|
17
|
+
- "RAILS=1 UPLOADS=paperclip"
|
18
|
+
- "RAILS=1 UPLOADS=carrierwave"
|
16
19
|
|
17
20
|
gemfile:
|
18
21
|
- gemfiles/mongoid-6.0.gemfile
|
19
22
|
- gemfiles/mongoid-6.3.gemfile
|
20
23
|
|
24
|
+
before_script:
|
25
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
26
|
+
- chmod +x ./cc-test-reporter
|
27
|
+
- ./cc-test-reporter before-build
|
28
|
+
after_script:
|
29
|
+
- ./cc-test-reporter after-build --debug --exit-code $TRAVIS_TEST_RESULT
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
[![Build Status](https://secure.travis-ci.org/rs-pro/rails_admin_settings.png?branch=master)](http://travis-ci.org/rs-pro/rails_admin_settings)
|
4
4
|
[![Dependency Status](https://gemnasium.com/rs-pro/rails_admin_settings.svg)](https://gemnasium.com/rs-pro/rails_admin_settings)
|
5
|
+
[![Gem Version](https://badge.fury.io/rb/rails_admin_settings.svg)](https://badge.fury.io/rb/rails_admin_settings)
|
6
|
+
[![security](https://hakiri.io/github/rs-pro/rails_admin_settings/master.svg)](https://hakiri.io/github/rs-pro/rails_admin_settings/master)
|
7
|
+
[![Maintainability](https://api.codeclimate.com/v1/badges/de00cbec10559ebd2b4b/maintainability)](https://codeclimate.com/github/rs-pro/rails_admin_settings/maintainability)
|
8
|
+
[![Test Coverage](https://api.codeclimate.com/v1/badges/de00cbec10559ebd2b4b/test_coverage)](https://codeclimate.com/github/rs-pro/rails_admin_settings/test_coverage)
|
5
9
|
|
6
10
|
App settings editable via RailsAdmin with support for ActiveRecord and Mongoid.
|
7
11
|
|
@@ -134,6 +138,13 @@ Simple format types are stored in db as-is.
|
|
134
138
|
|
135
139
|
Rails admin management for settings is supported out of the box
|
136
140
|
|
141
|
+
It is recommended to disable new/create page (it is not supported by design, settings are defined in ruby code).
|
142
|
+
Disable via cancan:
|
143
|
+
|
144
|
+
```
|
145
|
+
cannot :create, RailsAdminSettings::Setting
|
146
|
+
```
|
147
|
+
|
137
148
|
## Contributing
|
138
149
|
|
139
150
|
1. Fork it
|
data/lib/rails_admin_settings.rb
CHANGED
@@ -6,6 +6,20 @@ module RailsAdminSettings
|
|
6
6
|
end
|
7
7
|
cattr_accessor :scrubber
|
8
8
|
|
9
|
+
class PersistenceException < Exception
|
10
|
+
end
|
11
|
+
|
12
|
+
autoload :Mongoid, "rails_admin_settings/mongoid"
|
13
|
+
autoload :Fallback, "rails_admin_settings/fallback"
|
14
|
+
autoload :Namespaced, "rails_admin_settings/namespaced"
|
15
|
+
autoload :Processing, "rails_admin_settings/processing"
|
16
|
+
autoload :Validation, "rails_admin_settings/validation"
|
17
|
+
autoload :RequireHelpers, "rails_admin_settings/require_helpers"
|
18
|
+
autoload :RailsAdminConfig, "rails_admin_settings/rails_admin_config"
|
19
|
+
autoload :Uploads, "rails_admin_settings/uploads"
|
20
|
+
autoload :HexColorValidator, "rails_admin_settings/hex_color_validator"
|
21
|
+
autoload :Dumper, "rails_admin_settings/dumper"
|
22
|
+
|
9
23
|
class << self
|
10
24
|
def orm
|
11
25
|
if defined?(::Mongoid)
|
@@ -22,55 +36,74 @@ module RailsAdminSettings
|
|
22
36
|
def active_record?
|
23
37
|
orm == :active_record
|
24
38
|
end
|
25
|
-
end
|
26
|
-
|
27
|
-
class PersistenceException < Exception
|
28
|
-
end
|
29
|
-
|
30
|
-
autoload :Mongoid, "rails_admin_settings/mongoid"
|
31
|
-
autoload :Fallback, "rails_admin_settings/fallback"
|
32
|
-
autoload :Namespaced, "rails_admin_settings/namespaced"
|
33
|
-
autoload :Processing, "rails_admin_settings/processing"
|
34
|
-
autoload :Validation, "rails_admin_settings/validation"
|
35
|
-
autoload :RequireHelpers, "rails_admin_settings/require_helpers"
|
36
|
-
autoload :RailsAdminConfig, "rails_admin_settings/rails_admin_config"
|
37
|
-
autoload :Uploads, "rails_admin_settings/uploads"
|
38
|
-
autoload :HexColorValidator, "rails_admin_settings/hex_color_validator"
|
39
|
-
autoload :Dumper, "rails_admin_settings/dumper"
|
40
39
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
def apply_defaults!(file, verbose = false)
|
41
|
+
if File.file?(file)
|
42
|
+
puts "[settings] Loading from #{file}" if verbose
|
43
|
+
if defined?(Psych) && Psych.respond_to?(:safe_load)
|
44
|
+
yaml = Psych.safe_load(File.read(file))
|
45
|
+
else
|
46
|
+
yaml = YAML.load(File.read(file), safe: true)
|
47
|
+
end
|
48
|
+
yaml.each_pair do |namespace, vals|
|
49
|
+
process_defaults(namespace, vals, verbose)
|
50
|
+
end
|
52
51
|
end
|
53
52
|
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.track_history!
|
57
|
-
return false unless Settings.table_exists?
|
58
53
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
54
|
+
def process_defaults(namespace, vals, verbose = false)
|
55
|
+
vals.symbolize_keys!
|
56
|
+
n = Settings.ns(namespace)
|
57
|
+
vals.each_pair do |key, val|
|
58
|
+
val.symbolize_keys!
|
59
|
+
if !val[:kind].nil? && (val[:kind] == 'file' || val[:kind] == 'image')
|
60
|
+
unless Settings.file_uploads_supported
|
61
|
+
raise PersistenceException, "Fatal: setting #{key} is #{val[:type]} but file upload engine is not detected"
|
62
|
+
end
|
63
|
+
value = File.open(Settings.root_file_path.join(val.delete(:value)))
|
64
|
+
else
|
65
|
+
value = val.delete(:value)
|
66
|
+
end
|
67
|
+
puts "#{key} - default '#{value}' current '#{Settings.get(key).raw}'" if verbose
|
68
|
+
n.set(key, value, val.merge(overwrite: false))
|
65
69
|
end
|
66
|
-
|
67
|
-
|
70
|
+
n.unload!
|
71
|
+
end
|
72
|
+
|
73
|
+
def migrate!
|
74
|
+
if RailsAdminSettings.mongoid?
|
75
|
+
RailsAdminSettings::Setting.where(:ns.exists => false).update_all(ns: 'main')
|
76
|
+
RailsAdminSettings::Setting.all.each do |s|
|
77
|
+
s.kind = s.read_attribute(:type) if !s.read_attribute(:type).blank? && s.kind != s.read_attribute(:type)
|
78
|
+
s.save! if s.changed?
|
79
|
+
s.unset(:type)
|
80
|
+
end
|
68
81
|
else
|
69
|
-
|
82
|
+
if Settings.table_exists?
|
83
|
+
RailsAdminSettings::Setting.where("ns IS NULL").update_all(ns: 'main')
|
84
|
+
end
|
70
85
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
86
|
+
end
|
87
|
+
|
88
|
+
def track_history!
|
89
|
+
return false unless Settings.table_exists?
|
90
|
+
|
91
|
+
if mongoid?
|
92
|
+
if ::Mongoid.const_defined?('History')
|
93
|
+
RailsAdminSettings::Setting.send(:include, ::Mongoid::History::Trackable)
|
94
|
+
RailsAdminSettings::Setting.send(:track_history, {track_create: true, track_destroy: true})
|
95
|
+
else
|
96
|
+
puts "[rails_admin_settings] WARN unable to track_history: Mongoid::History not loaded!"
|
97
|
+
end
|
98
|
+
if ::Mongoid.const_defined?('Userstamp')
|
99
|
+
RailsAdminSettings::Setting.send(:include, ::Mongoid::Userstamp)
|
100
|
+
else
|
101
|
+
puts "[rails_admin_settings] WARN unable to track_history: Mongoid::Userstamp not loaded!"
|
102
|
+
end
|
103
|
+
elsif active_record?
|
104
|
+
if defined?(PaperTrail) && PaperTrail::Version.table_exists?
|
105
|
+
RailsAdminSettings::Setting.send(:has_paper_trail)
|
106
|
+
end
|
74
107
|
end
|
75
108
|
end
|
76
109
|
end
|
@@ -64,32 +64,7 @@ class Settings < BasicObject
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def apply_defaults!(file, verbose = false)
|
67
|
-
|
68
|
-
puts "[settings] Loading from #{file}" if verbose
|
69
|
-
if defined?(Psych) && Psych.respond_to?(:safe_load)
|
70
|
-
yaml = Psych.safe_load(File.read(file))
|
71
|
-
else
|
72
|
-
yaml = YAML.load(File.read(file), safe: true)
|
73
|
-
end
|
74
|
-
yaml.each_pair do |namespace, vals|
|
75
|
-
vals.symbolize_keys!
|
76
|
-
n = ns(namespace)
|
77
|
-
vals.each_pair do |key, val|
|
78
|
-
val.symbolize_keys!
|
79
|
-
if !val[:kind].nil? && (val[:kind] == 'file' || val[:kind] == 'image')
|
80
|
-
unless @@file_uploads_supported
|
81
|
-
::Kernel.raise ::RailsAdminSettings::PersistenceException, "Fatal: setting #{key} is #{val[:type]} but file upload engine is not detected"
|
82
|
-
end
|
83
|
-
value = File.open(root_file_path.join(val.delete(:value)))
|
84
|
-
else
|
85
|
-
value = val.delete(:value)
|
86
|
-
end
|
87
|
-
puts "#{key} - default '#{value}' current '#{Settings.get(key).raw}'" if verbose
|
88
|
-
n.set(key, value, val.merge(overwrite: false))
|
89
|
-
end
|
90
|
-
n.unload!
|
91
|
-
end
|
92
|
-
end
|
67
|
+
RailsAdminSettings.apply_defaults!(file, verbose)
|
93
68
|
end
|
94
69
|
|
95
70
|
def get(key, options = {})
|
@@ -31,7 +31,7 @@ module RailsAdminSettings
|
|
31
31
|
Settings.file_uploads_supported = true
|
32
32
|
Settings.file_uploads_engine = :paperclip
|
33
33
|
elsif RailsAdminSettings.active_record? && defined?(Paperclip)
|
34
|
-
base.
|
34
|
+
base.has_attached_file(:file, self.paperclip_options)
|
35
35
|
if base.respond_to?(:do_not_validate_attachment_file_type)
|
36
36
|
base.do_not_validate_attachment_file_type :file
|
37
37
|
end
|
@@ -1,91 +1,122 @@
|
|
1
1
|
module RailsAdminSettings
|
2
2
|
module Validation
|
3
|
-
|
4
|
-
base
|
5
|
-
|
3
|
+
class << self
|
4
|
+
def included(base)
|
5
|
+
base.before_validation do
|
6
|
+
self.raw = default_serializable_value if raw.blank?
|
7
|
+
end
|
8
|
+
base.before_validation :preprocess_value, if: :preprocessed_kind?
|
9
|
+
base.validates_uniqueness_of :key, scope: :ns
|
10
|
+
base.validates_inclusion_of :kind, in: RailsAdminSettings.kinds
|
11
|
+
base.validates_numericality_of :raw, if: :integer_kind?
|
12
|
+
|
13
|
+
add_validators(base)
|
6
14
|
end
|
7
|
-
base.before_validation :preprocess_value, if: :preprocessed_kind?
|
8
|
-
base.validates_uniqueness_of :key, scope: :ns
|
9
|
-
base.validates_inclusion_of :kind, in: RailsAdminSettings.kinds
|
10
|
-
base.validates_numericality_of :raw, if: :integer_kind?
|
11
15
|
|
12
|
-
base
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
def add_validators(base)
|
17
|
+
add_color_validator(base)
|
18
|
+
add_file_validator(base)
|
19
|
+
add_email_validator(base)
|
20
|
+
add_url_validator(base)
|
21
|
+
add_phone_validator(base)
|
22
|
+
add_geo_validator(base)
|
23
|
+
add_yaml_validator(base)
|
24
|
+
add_json_validator(base)
|
16
25
|
end
|
17
26
|
|
18
|
-
base
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
27
|
+
def add_color_validator(base)
|
28
|
+
base.validates_with(RailsAdminSettings::HexColorValidator, attributes: :raw, if: :color_kind?)
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_file_validator(base)
|
32
|
+
base.validate if: :file_kind? do
|
33
|
+
unless Settings.file_uploads_supported
|
34
|
+
raise '[rails_admin_settings] File kind requires either CarrierWave or Paperclip. Check that rails_admin_settings is below them in Gemfile'
|
26
35
|
end
|
27
36
|
end
|
28
37
|
end
|
29
38
|
|
30
|
-
base
|
31
|
-
|
32
|
-
|
39
|
+
def add_email_validator(base)
|
40
|
+
base.validate if: :email_kind? do
|
41
|
+
require_validates_email_format_of do
|
42
|
+
errors.add(:raw, I18n.t('admin.settings.email_invalid')) unless raw.blank? || ValidatesEmailFormatOf.validate_email_format(raw).nil?
|
43
|
+
end
|
33
44
|
end
|
34
45
|
end
|
35
46
|
|
36
|
-
base
|
37
|
-
|
38
|
-
|
47
|
+
def add_url_validator(base)
|
48
|
+
base.before_validation if: :url_kind? do
|
49
|
+
require_addressable do
|
50
|
+
self.raw = Addressable::URI.heuristic_parse(self.raw) unless self.raw.blank?
|
51
|
+
end
|
39
52
|
end
|
40
|
-
end
|
41
53
|
|
42
|
-
|
43
|
-
|
44
|
-
|
54
|
+
base.before_validation if: :domain_kind? do
|
55
|
+
require_addressable do
|
56
|
+
self.raw = Addressable::URI.heuristic_parse(self.raw).host unless self.raw.blank?
|
57
|
+
end
|
45
58
|
end
|
46
59
|
end
|
47
60
|
|
48
|
-
base
|
49
|
-
|
50
|
-
|
61
|
+
def add_phone_validator(base)
|
62
|
+
base.validate if: :phone_kind? do
|
63
|
+
require_russian_phone do
|
64
|
+
errors.add(:raw, I18n.t('admin.settings.phone_invalid')) unless raw.blank? || RussianPhone::Number.new(raw).valid?
|
65
|
+
end
|
51
66
|
end
|
52
|
-
end
|
53
67
|
|
54
|
-
|
55
|
-
|
56
|
-
|
68
|
+
base.validate if: :phones_kind? do
|
69
|
+
require_russian_phone do
|
70
|
+
unless raw.blank?
|
71
|
+
invalid_phones = raw.gsub("\r", '').split("\n").inject([]) do |memo, value|
|
72
|
+
memo << value unless RussianPhone::Number.new(value).valid?
|
73
|
+
memo
|
74
|
+
end
|
75
|
+
errors.add(:raw, I18n.t('admin.settings.phones_invalid', phones: invalid_phones * ', ')) unless invalid_phones.empty?
|
76
|
+
end
|
77
|
+
end
|
57
78
|
end
|
79
|
+
|
58
80
|
end
|
59
81
|
|
60
|
-
|
61
|
-
if
|
62
|
-
|
63
|
-
|
82
|
+
def add_geo_validator(base)
|
83
|
+
base.validate if: :address_kind? do
|
84
|
+
require_geocoder do
|
85
|
+
# just raise error if we are trying to use address kind without geocoder
|
86
|
+
end
|
87
|
+
end
|
88
|
+
if Object.const_defined?('Geocoder')
|
89
|
+
if RailsAdminSettings.mongoid?
|
90
|
+
base.field(:coordinates, type: Array)
|
91
|
+
base.send(:include, Geocoder::Model::Mongoid)
|
92
|
+
end
|
93
|
+
base.geocoded_by(:raw)
|
94
|
+
base.after_validation(:geocode, if: :address_kind?)
|
64
95
|
end
|
65
|
-
base.geocoded_by(:raw)
|
66
|
-
base.after_validation(:geocode, if: :address_kind?)
|
67
96
|
end
|
68
97
|
|
69
|
-
base
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
98
|
+
def add_yaml_validator(base)
|
99
|
+
base.validate if: :yaml_kind? do
|
100
|
+
require_safe_yaml do
|
101
|
+
unless raw.blank?
|
102
|
+
begin
|
103
|
+
YAML.safe_load(raw)
|
104
|
+
rescue Psych::SyntaxError => e
|
105
|
+
errors.add(:raw, I18n.t('admin.settings.yaml_invalid'))
|
106
|
+
end
|
78
107
|
end
|
79
108
|
end
|
80
109
|
end
|
81
110
|
end
|
82
111
|
|
83
|
-
base
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
112
|
+
def add_json_validator(base)
|
113
|
+
base.validate if: :json_kind? do
|
114
|
+
unless raw.blank?
|
115
|
+
begin
|
116
|
+
JSON.load(raw)
|
117
|
+
rescue JSON::ParserError => e
|
118
|
+
errors.add(:raw, I18n.t('admin.settings.json_invalid'))
|
119
|
+
end
|
89
120
|
end
|
90
121
|
end
|
91
122
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_admin_settings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gleb Tv
|
@@ -271,8 +271,6 @@ extra_rdoc_files: []
|
|
271
271
|
files:
|
272
272
|
- ".gitignore"
|
273
273
|
- ".rspec"
|
274
|
-
- ".ruby-gemset"
|
275
|
-
- ".ruby-version"
|
276
274
|
- ".travis.yml"
|
277
275
|
- CHANGELOG.md
|
278
276
|
- Gemfile
|
data/.ruby-gemset
DELETED
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.1.5
|