rails_admin_settings 0.1.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.
- data/.gitignore +18 -0
- data/.rspec +1 -0
- data/.rvmrc +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +80 -0
- data/Rakefile +9 -0
- data/app/views/rails_admin/main/_setting_value.html.haml +20 -0
- data/config/locales/en.rails_admin_settings.yml +4 -0
- data/config/locales/ru.rails_admin_settings.yml +17 -0
- data/lib/rails_admin_settings/engine.rb +11 -0
- data/lib/rails_admin_settings/processing.rb +118 -0
- data/lib/rails_admin_settings/rails_admin_config.rb +39 -0
- data/lib/rails_admin_settings/require_helpers.rb +36 -0
- data/lib/rails_admin_settings/setting.rb +38 -0
- data/lib/rails_admin_settings/settings.rb +95 -0
- data/lib/rails_admin_settings/types.rb +5 -0
- data/lib/rails_admin_settings/validation.rb +30 -0
- data/lib/rails_admin_settings/version.rb +3 -0
- data/lib/rails_admin_settings.rb +16 -0
- data/rails_admin_settings.gemspec +34 -0
- data/spec/advanced_usage_spec.rb +57 -0
- data/spec/factories/setting.rb +8 -0
- data/spec/model_spec.rb +45 -0
- data/spec/settings_spec.rb +38 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/database_cleaner.rb +9 -0
- data/spec/support/mongoid.rb +6 -0
- data/spec/support/mongoid.yml +8 -0
- metadata +266 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use 1.9.3-p392@rails_admin_settings --create
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Gleb Tv
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# RailsAdminSettings
|
2
|
+
|
3
|
+
[](http://travis-ci.org/rs-pro/rails_admin_settings)
|
4
|
+
[](https://gemnasium.com/rs-pro/rails_admin_settings)
|
5
|
+
|
6
|
+
Note: This gem currently supports Mongoid only, as I don't need AR support.
|
7
|
+
|
8
|
+
Pull request with AR support will be welcome
|
9
|
+
|
10
|
+
## Features
|
11
|
+
|
12
|
+
- Lazy loading - loads settings only if they are needed during request
|
13
|
+
- Loads all settings at once and caches them for the duration of request
|
14
|
+
- Supports lots of setting types - yaml, html with ckeditor, phone numbers etc
|
15
|
+
|
16
|
+
## Installation
|
17
|
+
|
18
|
+
Add this line to your application's Gemfile:
|
19
|
+
|
20
|
+
gem 'rails_admin_settings'
|
21
|
+
|
22
|
+
## Gemfile order matters
|
23
|
+
|
24
|
+
- Put it after rails_admin to get built-in support
|
25
|
+
- Put it after rails_admin_toggleable to get built-in support
|
26
|
+
- Put it after ckeditor/glebtv-ckeditor/rich to get built-in support
|
27
|
+
- Put it after russian_phone to get built-in support
|
28
|
+
- Put it after sanitized to get built-in support
|
29
|
+
- Put it after safe_yaml to get built-in support
|
30
|
+
|
31
|
+
And then execute:
|
32
|
+
|
33
|
+
$ bundle
|
34
|
+
|
35
|
+
Or install it yourself as:
|
36
|
+
|
37
|
+
$ gem install rails_admin_settings
|
38
|
+
|
39
|
+
## Basic Usage (like RailsSettings)
|
40
|
+
|
41
|
+
Settings.admin_email = 'test@example.com'
|
42
|
+
Settings.admin_email
|
43
|
+
|
44
|
+
|
45
|
+
## Advanced Usage
|
46
|
+
|
47
|
+
Settings.content_block_1(mode: 'html', default: 'test')
|
48
|
+
Settings.data(mode: 'yaml')
|
49
|
+
Settings.data = [1, 2, 3]
|
50
|
+
|
51
|
+
See more here: https://github.com/rs-pro/rails_admin_settings/blob/master/spec/advanced_usage_spec.rb
|
52
|
+
|
53
|
+
## Value types
|
54
|
+
|
55
|
+
Supported types:
|
56
|
+
|
57
|
+
string (input)
|
58
|
+
text (textarea)
|
59
|
+
html (supports Rich, glebtv-ckeditor, ckeditor, but does not require any of them)
|
60
|
+
integer (stored as string)
|
61
|
+
yaml (requires safe_yaml)
|
62
|
+
phone (requires russian_phone)
|
63
|
+
sanitized (requires sanitize)
|
64
|
+
|
65
|
+
Strings and html support following replacement patterns:
|
66
|
+
|
67
|
+
{{year}} -> current year
|
68
|
+
{{year|2013}} -> 2013 in 2013, 2013-2014 in 2014, etc
|
69
|
+
|
70
|
+
## Usage with Rails Admin
|
71
|
+
|
72
|
+
Rails admin management for settings is supported out of the box
|
73
|
+
|
74
|
+
## Contributing
|
75
|
+
|
76
|
+
1. Fork it
|
77
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
78
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
79
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
80
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
- if @object.type == 'string' || @object.type == 'integer'
|
2
|
+
= form.text_field :raw, :value => field.value
|
3
|
+
- elsif @object.type == 'text' || @object.type == 'yaml'
|
4
|
+
= form.text_area :raw, :value => field.value, :rows => 10, :cols => 80
|
5
|
+
- elsif @object.type == 'html'
|
6
|
+
- if form.respond_to?(:cktext_area)
|
7
|
+
= javascript_include_tag "ckeditor/init"
|
8
|
+
= form.cktext_area :raw, :value => field.value, :rows => 10, :cols => 80
|
9
|
+
- elsif Object.const_defined?('Rich')
|
10
|
+
= form.text_area :raw, :value => field.value, :rows => 10, :cols => 80
|
11
|
+
|
12
|
+
= javascript_include_tag "rich/base.js"
|
13
|
+
javascript:
|
14
|
+
var instance = CKEDITOR.instances['#{form.dom_id(field)}'];
|
15
|
+
if(instance) { CKEDITOR.remove(instance); }
|
16
|
+
CKEDITOR.replace('#{form.dom_id(field)}', #{Rich.options().to_json.html_safe});
|
17
|
+
- else
|
18
|
+
.alert.alert-error
|
19
|
+
= t('admin.settings.no_ckeditor_detected')
|
20
|
+
= form.text_area :raw, :value => field.value, :rows => 10, :cols => 80
|
@@ -0,0 +1,17 @@
|
|
1
|
+
ru:
|
2
|
+
admin:
|
3
|
+
settings:
|
4
|
+
label: 'Настройки'
|
5
|
+
no_ckeditor_detected: CKEditor не обнаружен — отображаю настройку как текстовое поле
|
6
|
+
phone_invalid: Неверный телефонный номер
|
7
|
+
yaml_invalid: Неверный синтаксис YAML
|
8
|
+
mongoid:
|
9
|
+
models:
|
10
|
+
rails_admin_settings/setting: Настройки
|
11
|
+
|
12
|
+
attributes:
|
13
|
+
rails_admin_settings/setting:
|
14
|
+
key: Название
|
15
|
+
raw: Значение
|
16
|
+
type: Тип
|
17
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module RailsAdminSettings
|
2
|
+
class Engine < ::Rails::Engine
|
3
|
+
initializer 'RailsAdminSettings Install after_filter' do |app|
|
4
|
+
if defined?(ActionController) and defined?(ActionController::Base)
|
5
|
+
ActionController::Base.class_eval do
|
6
|
+
after_filter { Settings.unload! }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module RailsAdminSettings
|
2
|
+
module Processing
|
3
|
+
def text_type?
|
4
|
+
['string', 'html', 'sanitized'].include? type
|
5
|
+
end
|
6
|
+
|
7
|
+
def html_type?
|
8
|
+
['html', 'sanitized'].include? type
|
9
|
+
end
|
10
|
+
|
11
|
+
def integer_type?
|
12
|
+
'integer' == type
|
13
|
+
end
|
14
|
+
|
15
|
+
def yaml_type?
|
16
|
+
'yaml' == type
|
17
|
+
end
|
18
|
+
|
19
|
+
def phone_type?
|
20
|
+
'phone' == type
|
21
|
+
end
|
22
|
+
|
23
|
+
def sanitized_type?
|
24
|
+
'sanitized' == type
|
25
|
+
end
|
26
|
+
|
27
|
+
def value
|
28
|
+
if raw.blank? || disabled?
|
29
|
+
default_value
|
30
|
+
else
|
31
|
+
processed_value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
if yaml_type? || phone_type? || integer_type?
|
37
|
+
raw
|
38
|
+
else
|
39
|
+
value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def sanitize_value
|
46
|
+
require_sanitize do
|
47
|
+
self.raw = Sanitize.clean(value, Sanitize::Config::RELAXED)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_value
|
52
|
+
if html_type?
|
53
|
+
''.html_safe
|
54
|
+
elsif text_type?
|
55
|
+
''
|
56
|
+
elsif integer_type?
|
57
|
+
0
|
58
|
+
elsif yaml_type?
|
59
|
+
nil
|
60
|
+
elsif phone_type?
|
61
|
+
require_russian_phone do
|
62
|
+
RussianPhone::Number.new('(000) 000-00-00')
|
63
|
+
end
|
64
|
+
else
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def process_text
|
70
|
+
replacer = Proc.new do |m|
|
71
|
+
if Time.now.strftime('%Y') == $1
|
72
|
+
$1
|
73
|
+
else
|
74
|
+
"#{$1}-#{Time.now.strftime('%Y')}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
text = raw.dup
|
79
|
+
|
80
|
+
text.gsub!('{{year}}', Time.now.strftime('%Y'))
|
81
|
+
text.gsub!(/\{\{year\|([\d]{4})\}\}/, &replacer)
|
82
|
+
text = text.html_safe if html_type?
|
83
|
+
text
|
84
|
+
end
|
85
|
+
|
86
|
+
def load_phone
|
87
|
+
require_russian_phone do
|
88
|
+
RussianPhone::Number.new(raw)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def load_yaml
|
93
|
+
require_safe_yaml do
|
94
|
+
YAML.safe_load(raw)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def processed_value
|
99
|
+
if text_type?
|
100
|
+
process_text
|
101
|
+
elsif integer_type?
|
102
|
+
raw.to_i
|
103
|
+
elsif yaml_type?
|
104
|
+
load_yaml
|
105
|
+
elsif phone_type?
|
106
|
+
load_phone
|
107
|
+
else
|
108
|
+
nil
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.included(base)
|
113
|
+
base.class_eval do
|
114
|
+
alias_method :val, :value
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module RailsAdminSettings
|
2
|
+
module RailsAdminConfig
|
3
|
+
def self.included(base)
|
4
|
+
rails_admin do
|
5
|
+
navigation_label t('admin.settings.label')
|
6
|
+
|
7
|
+
object_label_method do
|
8
|
+
:key
|
9
|
+
end
|
10
|
+
|
11
|
+
list do
|
12
|
+
if Object.const_defined?('RailsAdminToggleable')
|
13
|
+
field :enabled, :toggle
|
14
|
+
else
|
15
|
+
field :enabled
|
16
|
+
end
|
17
|
+
|
18
|
+
field :key
|
19
|
+
field :type
|
20
|
+
end
|
21
|
+
|
22
|
+
edit do
|
23
|
+
field :enabled
|
24
|
+
|
25
|
+
field :raw do
|
26
|
+
partial "setting_value"
|
27
|
+
end
|
28
|
+
|
29
|
+
field :key do
|
30
|
+
read_only true
|
31
|
+
end
|
32
|
+
field :type do
|
33
|
+
read_only true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RailsAdminSettings
|
2
|
+
module RequireHelpers
|
3
|
+
private
|
4
|
+
|
5
|
+
def require_russian_phone
|
6
|
+
begin
|
7
|
+
require 'russian_phone'
|
8
|
+
yield
|
9
|
+
rescue LoadError => e
|
10
|
+
e.message << " [rails_admin_settings] Please add gem 'russian_phone' to use phone settings"
|
11
|
+
raise e
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def require_safe_yaml
|
16
|
+
begin
|
17
|
+
require 'safe_yaml'
|
18
|
+
yield
|
19
|
+
rescue LoadError => e
|
20
|
+
e.message << " [rails_admin_settings] Please add gem 'safe_yaml' to your Gemfile to use yaml settings"
|
21
|
+
raise e
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def require_sanitize
|
26
|
+
begin
|
27
|
+
require 'sanitize'
|
28
|
+
yield
|
29
|
+
rescue LoadError => e
|
30
|
+
e.message << " [rails_admin_settings] Please install sanitize to use sanitized settings"
|
31
|
+
raise e
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
module RailsAdminSettings
|
3
|
+
class Setting
|
4
|
+
include ::Mongoid::Document
|
5
|
+
include ::Mongoid::Timestamps::Short
|
6
|
+
|
7
|
+
if Object.const_defined?('Mongoid') && Mongoid.const_defined?('Audit')
|
8
|
+
include ::Mongoid::Audit::Trackable
|
9
|
+
track_history track_create: true, track_destroy: true
|
10
|
+
end
|
11
|
+
|
12
|
+
field :enabled, type: Boolean, default: true
|
13
|
+
scope :enabled, where(enabled: true)
|
14
|
+
|
15
|
+
field :type, type: String, default: RailsAdminSettings.types.first
|
16
|
+
|
17
|
+
field :key, type: String
|
18
|
+
field :raw, type: String, default: ''
|
19
|
+
|
20
|
+
include RailsAdminSettings::RequireHelpers
|
21
|
+
include RailsAdminSettings::Processing
|
22
|
+
include RailsAdminSettings::Validation
|
23
|
+
|
24
|
+
def disabled?
|
25
|
+
!enabled
|
26
|
+
end
|
27
|
+
|
28
|
+
def enabled?
|
29
|
+
enabled
|
30
|
+
end
|
31
|
+
|
32
|
+
index(key: 1)
|
33
|
+
|
34
|
+
if respond_to?(:rails_admin)
|
35
|
+
include RailsAdminSettings::RailsAdminConfig
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
class Settings
|
2
|
+
class << self
|
3
|
+
def load!
|
4
|
+
unless @@loaded
|
5
|
+
@@settings = {}
|
6
|
+
@@loaded = true
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def unload!
|
11
|
+
@@settings = {}
|
12
|
+
@@loaded = false
|
13
|
+
end
|
14
|
+
|
15
|
+
# returns processed setting value
|
16
|
+
def method_missing(key, *args)
|
17
|
+
if key[-1] == '='
|
18
|
+
key = key[0..-2]
|
19
|
+
options = args[1] || {}
|
20
|
+
value = args.first
|
21
|
+
set(key, value, options).val
|
22
|
+
else
|
23
|
+
get(key, args.first || {}).val
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def set(key, value = nil, options = {})
|
28
|
+
load!
|
29
|
+
key = key.to_s
|
30
|
+
options.symbolize_keys!
|
31
|
+
|
32
|
+
|
33
|
+
if !options[:type].nil? && options[:type] == 'yaml' && !value.nil? && !valid_yaml?(value)
|
34
|
+
value = value.to_yaml
|
35
|
+
end
|
36
|
+
|
37
|
+
if @@settings[key].nil?
|
38
|
+
@@settings[key] = RailsAdminSettings::Setting.create(options.merge(key: key, raw: value))
|
39
|
+
else
|
40
|
+
@@settings[key].update_attributes!(options.merge(raw: value))
|
41
|
+
@@settings[key]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def valid_yaml?(value)
|
46
|
+
begin
|
47
|
+
YAML.safe_load(value)
|
48
|
+
rescue LoadError => e
|
49
|
+
e.message << " [rails_admin_settings] Please add gem 'safe_yaml' to your Gemfile to use yaml settings"
|
50
|
+
raise e
|
51
|
+
rescue Psych::SyntaxError => e
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# returns setting object
|
57
|
+
def get(key, options = {})
|
58
|
+
load!
|
59
|
+
key = key.to_s
|
60
|
+
if @@settings[key].nil?
|
61
|
+
create_setting(key, options)
|
62
|
+
else
|
63
|
+
@@settings[key]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def []=(key, value)
|
68
|
+
set(key, value)
|
69
|
+
end
|
70
|
+
|
71
|
+
def [](key)
|
72
|
+
get(key)
|
73
|
+
end
|
74
|
+
|
75
|
+
def save_default(key, value, options = {})
|
76
|
+
load!
|
77
|
+
options.merge!(default: value)
|
78
|
+
create_setting(key, options) if @@settings[key].nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
def create_setting(key, options = {})
|
82
|
+
load!
|
83
|
+
options.symbolize_keys!
|
84
|
+
options[:raw] = options.delete(:default)
|
85
|
+
@@settings[key] = RailsAdminSettings::Setting.create(options.merge(key: key)) if @@settings[key].nil?
|
86
|
+
end
|
87
|
+
|
88
|
+
# to satisfy rspec
|
89
|
+
def to_ary
|
90
|
+
['Settings']
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
self.unload!
|
95
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module RailsAdminSettings
|
2
|
+
module Validation
|
3
|
+
def self.included(base)
|
4
|
+
base.before_validation do
|
5
|
+
self.raw = default_value if raw.blank?
|
6
|
+
end
|
7
|
+
base.before_validation :sanitize_value, if: :sanitized_type?
|
8
|
+
base.validates_uniqueness_of :key
|
9
|
+
base.validates_inclusion_of :type, in: RailsAdminSettings.types
|
10
|
+
base.validates_numericality_of :raw, if: :integer_type?
|
11
|
+
|
12
|
+
base.validate if: :phone_type? do
|
13
|
+
require_russian_phone do
|
14
|
+
errors.add(:raw, t('admin.settings.phone_invalid')) if RussianPhone::Number.new(:raw).valid?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
base.validate if: :yaml_type? do
|
18
|
+
require_safe_yaml do
|
19
|
+
unless raw.blank?
|
20
|
+
begin
|
21
|
+
YAML.safe_load(raw)
|
22
|
+
rescue Psych::SyntaxError => e
|
23
|
+
errors.add(:raw, t('admin.settings.yaml_invalid'))
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rails_admin_settings/version"
|
2
|
+
|
3
|
+
module RailsAdminSettings
|
4
|
+
autoload :Processing, "rails_admin_settings/processing"
|
5
|
+
autoload :Validation, "rails_admin_settings/validation"
|
6
|
+
autoload :RequireHelpers, "rails_admin_settings/require_helpers"
|
7
|
+
autoload :RailsAdminConfig, "rails_admin_settings/rails_admin_config"
|
8
|
+
autoload :Setting, "rails_admin_settings/setting"
|
9
|
+
end
|
10
|
+
|
11
|
+
require "rails_admin_settings/types"
|
12
|
+
require "rails_admin_settings/settings"
|
13
|
+
|
14
|
+
if Object.const_defined?('Rails')
|
15
|
+
require "rails_admin_settings/engine"
|
16
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'rails_admin_settings/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rails_admin_settings"
|
8
|
+
spec.version = RailsAdminSettings::VERSION
|
9
|
+
spec.authors = ["Gleb Tv"]
|
10
|
+
spec.email = ["glebtv@gmail.com"]
|
11
|
+
spec.description = %q{Mongoid / RailsAdmin App Settings management}
|
12
|
+
spec.summary = %q{Setting for Rails app with mongoid and RailsAdmin}
|
13
|
+
spec.homepage = "https://github.com/rs-pro/rails_admin_settings"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "mongoid", '~> 3.1'
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3.4"
|
24
|
+
spec.add_development_dependency "rake", "~> 10.0.3"
|
25
|
+
spec.add_development_dependency "rspec", "~> 2.13.0"
|
26
|
+
spec.add_development_dependency "mongoid-rspec", "~> 1.7.0"
|
27
|
+
spec.add_development_dependency "simplecov", "~> 0.7.1"
|
28
|
+
spec.add_development_dependency "database_cleaner", "~> 0.9.1"
|
29
|
+
spec.add_development_dependency "factory_girl", "~> 4.2.0"
|
30
|
+
|
31
|
+
spec.add_development_dependency "safe_yaml", "~> 0.8.6"
|
32
|
+
spec.add_development_dependency "russian_phone", "~> 0.3.2"
|
33
|
+
spec.add_development_dependency "sanitize", "~> 2.0.3"
|
34
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe 'Settings advanced usage' do
|
6
|
+
it 'with defaults' do
|
7
|
+
s = Settings.email(default: 'test@example.com')
|
8
|
+
s.should eq 'test@example.com'
|
9
|
+
Settings.get(:email).to_s.should eq 'test@example.com'
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'support html mode' do
|
13
|
+
Settings.get(:email, type: 'html').to_s.should eq 'test@example.com'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'support integer mode' do
|
17
|
+
Settings.get(:testint, type: 'integer').value.should eq 0
|
18
|
+
Settings.get(:testint, default: 5, type: 'integer').value.should eq 0
|
19
|
+
Settings.get(:testint2, default: 5, type: 'integer').value.should eq 5
|
20
|
+
Settings.testint2.should eq 5
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'support yaml mode' do
|
24
|
+
Settings.get(:test_yml, type: 'yaml').value.should be_nil
|
25
|
+
Settings.get(:test_yml_2, default: '[t1, t2, t3]', type: 'yaml').value.should eq ['t1', 't2', 't3']
|
26
|
+
Settings.test_yml_2.should eq ['t1', 't2', 't3']
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should have sensible defaults' do
|
30
|
+
s = Settings.get(:test_sett)
|
31
|
+
s.should_not be_nil
|
32
|
+
s.type.should eq 'string'
|
33
|
+
s.raw.should eq ''
|
34
|
+
s.value.should eq ''
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should support yaml type' do
|
38
|
+
Settings.set(:data, '[one, two, three]', type: 'yaml')
|
39
|
+
Settings.get(:data).raw.should eq '[one, two, three]'
|
40
|
+
Settings.data.should eq ['one', 'two', 'three']
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should support phone type' do
|
44
|
+
Settings.set(:tphone, '906 111 11 11', type: 'phone')
|
45
|
+
Settings.get(:tphone).val.class.name.should eq 'RussianPhone::Number'
|
46
|
+
Settings.tphone.class.name.should eq 'RussianPhone::Number'
|
47
|
+
Settings.tphone.should eq '906 111 11 11'
|
48
|
+
|
49
|
+
Settings.get(:tphone).val.city.should eq '906'
|
50
|
+
Settings.get(:tphone).val.formatted_subscriber.should eq '111-11-11'
|
51
|
+
|
52
|
+
Settings.dphone(type: 'phone')
|
53
|
+
|
54
|
+
Settings.dphone.city.should eq '000'
|
55
|
+
Settings.dphone.formatted_subscriber.should eq '000-00-00'
|
56
|
+
end
|
57
|
+
end
|
data/spec/model_spec.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe RailsAdminSettings::Setting do
|
6
|
+
it { should have_fields(:enabled, :key, :type, :raw) }
|
7
|
+
|
8
|
+
it "correctly return content when enabled" do
|
9
|
+
setting = FactoryGirl.create(:setting)
|
10
|
+
setting.to_s.should eq "Контент 1"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "return empty string when disabled" do
|
14
|
+
setting = FactoryGirl.create(:setting, enabled: false)
|
15
|
+
setting.to_s.should eq ""
|
16
|
+
end
|
17
|
+
|
18
|
+
it "correctly process {{year}}" do
|
19
|
+
setting = FactoryGirl.create(:setting, raw: '© {{year}} company')
|
20
|
+
setting.val.should eq "© #{Time.now.strftime('%Y')} company"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "correctly process {{year|2010}}" do
|
24
|
+
setting = FactoryGirl.create(:setting, raw: '© {{year|2010}} company')
|
25
|
+
setting.val.should eq "© 2010-#{Time.now.strftime('%Y')} company"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "correctly process {{year|current_year}}" do
|
29
|
+
setting = FactoryGirl.create(:setting, raw: '© {{year|' + Time.now.strftime('%Y') + '}} company')
|
30
|
+
setting.val.should eq "© #{Time.now.strftime('%Y')} company"
|
31
|
+
setting.val.class.name.should_not eq "ActiveSupport::SafeBuffer"
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'return html_safe string when in html mode' do
|
35
|
+
setting = FactoryGirl.create(:setting, raw: '© {{year}} company', type: 'html')
|
36
|
+
setting.val.should eq "© #{Time.now.strftime('%Y')} company"
|
37
|
+
setting.val.class.name.should eq "ActiveSupport::SafeBuffer"
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'sanitize html when in sanitized mode' do
|
41
|
+
setting = FactoryGirl.create(:setting, raw: '© {{year}} company <a href="javascript:alert()">test</a>', type: 'sanitized')
|
42
|
+
setting.val.should eq "© #{Time.now.strftime('%Y')} company <a>test</a>"
|
43
|
+
setting.val.class.name.should eq "ActiveSupport::SafeBuffer"
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Settings do
|
6
|
+
|
7
|
+
it "should works as RailsSettings" do
|
8
|
+
email = "my@mail.ru"
|
9
|
+
Settings.email = email
|
10
|
+
Settings.email.should == email
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should save default" do
|
14
|
+
email = "my@mail.ru"
|
15
|
+
email2 = "my2@mail.ru"
|
16
|
+
Settings.save_default(:email, email)
|
17
|
+
Settings.email.should == email
|
18
|
+
Settings.email = email2
|
19
|
+
Settings.email.should == email2
|
20
|
+
Settings.save_default(:email, email)
|
21
|
+
Settings.email.should == email2
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should properly unload' do
|
25
|
+
Settings.class_eval { cattr_accessor :loaded }
|
26
|
+
Settings.load!
|
27
|
+
Settings.loaded.should eq true
|
28
|
+
Settings.unload!
|
29
|
+
Settings.loaded.should eq false
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should support yaml type' do
|
33
|
+
Settings.tdata(type: 'yaml')
|
34
|
+
Settings.tdata = ['one', 'two', 'three']
|
35
|
+
YAML.safe_load(Settings.get(:tdata).raw).should eq ['one', 'two', 'three']
|
36
|
+
Settings.tdata.should eq ['one', 'two', 'three']
|
37
|
+
end
|
38
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
require 'simplecov'
|
6
|
+
SimpleCov.start
|
7
|
+
|
8
|
+
require 'bundler/setup'
|
9
|
+
require 'active_support/core_ext'
|
10
|
+
require 'mongoid'
|
11
|
+
require 'database_cleaner'
|
12
|
+
require 'factory_girl'
|
13
|
+
require 'mongoid-rspec'
|
14
|
+
|
15
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each do |f|
|
16
|
+
require f
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'rails_admin_settings'
|
20
|
+
|
21
|
+
Dir["#{File.dirname(__FILE__)}/factories/**/*.rb"].each do |f|
|
22
|
+
require f
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,266 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails_admin_settings
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Gleb Tv
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: mongoid
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.1'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.1'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.3.4
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.3.4
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 10.0.3
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 10.0.3
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.13.0
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.13.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: mongoid-rspec
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.7.0
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.7.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: simplecov
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: 0.7.1
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.7.1
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: database_cleaner
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.9.1
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 0.9.1
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: factory_girl
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ~>
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: 4.2.0
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 4.2.0
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: safe_yaml
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.8.6
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 0.8.6
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: russian_phone
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ~>
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.3.2
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.3.2
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: sanitize
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
none: false
|
178
|
+
requirements:
|
179
|
+
- - ~>
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: 2.0.3
|
182
|
+
type: :development
|
183
|
+
prerelease: false
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ~>
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 2.0.3
|
190
|
+
description: Mongoid / RailsAdmin App Settings management
|
191
|
+
email:
|
192
|
+
- glebtv@gmail.com
|
193
|
+
executables: []
|
194
|
+
extensions: []
|
195
|
+
extra_rdoc_files: []
|
196
|
+
files:
|
197
|
+
- .gitignore
|
198
|
+
- .rspec
|
199
|
+
- .rvmrc
|
200
|
+
- .travis.yml
|
201
|
+
- Gemfile
|
202
|
+
- LICENSE.txt
|
203
|
+
- README.md
|
204
|
+
- Rakefile
|
205
|
+
- app/views/rails_admin/main/_setting_value.html.haml
|
206
|
+
- config/locales/en.rails_admin_settings.yml
|
207
|
+
- config/locales/ru.rails_admin_settings.yml
|
208
|
+
- lib/rails_admin_settings.rb
|
209
|
+
- lib/rails_admin_settings/engine.rb
|
210
|
+
- lib/rails_admin_settings/processing.rb
|
211
|
+
- lib/rails_admin_settings/rails_admin_config.rb
|
212
|
+
- lib/rails_admin_settings/require_helpers.rb
|
213
|
+
- lib/rails_admin_settings/setting.rb
|
214
|
+
- lib/rails_admin_settings/settings.rb
|
215
|
+
- lib/rails_admin_settings/types.rb
|
216
|
+
- lib/rails_admin_settings/validation.rb
|
217
|
+
- lib/rails_admin_settings/version.rb
|
218
|
+
- rails_admin_settings.gemspec
|
219
|
+
- spec/advanced_usage_spec.rb
|
220
|
+
- spec/factories/setting.rb
|
221
|
+
- spec/model_spec.rb
|
222
|
+
- spec/settings_spec.rb
|
223
|
+
- spec/spec_helper.rb
|
224
|
+
- spec/support/database_cleaner.rb
|
225
|
+
- spec/support/mongoid.rb
|
226
|
+
- spec/support/mongoid.yml
|
227
|
+
homepage: https://github.com/rs-pro/rails_admin_settings
|
228
|
+
licenses:
|
229
|
+
- MIT
|
230
|
+
post_install_message:
|
231
|
+
rdoc_options: []
|
232
|
+
require_paths:
|
233
|
+
- lib
|
234
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
235
|
+
none: false
|
236
|
+
requirements:
|
237
|
+
- - ! '>='
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
version: '0'
|
240
|
+
segments:
|
241
|
+
- 0
|
242
|
+
hash: -2035061184471093913
|
243
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
244
|
+
none: false
|
245
|
+
requirements:
|
246
|
+
- - ! '>='
|
247
|
+
- !ruby/object:Gem::Version
|
248
|
+
version: '0'
|
249
|
+
segments:
|
250
|
+
- 0
|
251
|
+
hash: -2035061184471093913
|
252
|
+
requirements: []
|
253
|
+
rubyforge_project:
|
254
|
+
rubygems_version: 1.8.25
|
255
|
+
signing_key:
|
256
|
+
specification_version: 3
|
257
|
+
summary: Setting for Rails app with mongoid and RailsAdmin
|
258
|
+
test_files:
|
259
|
+
- spec/advanced_usage_spec.rb
|
260
|
+
- spec/factories/setting.rb
|
261
|
+
- spec/model_spec.rb
|
262
|
+
- spec/settings_spec.rb
|
263
|
+
- spec/spec_helper.rb
|
264
|
+
- spec/support/database_cleaner.rb
|
265
|
+
- spec/support/mongoid.rb
|
266
|
+
- spec/support/mongoid.yml
|