rails-settings-ui 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Rakefile +11 -10
- data/app/assets/stylesheets/rails_settings_ui/application.css.scss +2 -2
- data/app/controllers/rails_settings_ui/settings_controller.rb +1 -1
- data/app/helpers/rails_settings_ui/settings_helper.rb +32 -63
- data/lib/rails-settings-ui.rb +1 -1
- data/lib/rails-settings-ui/engine.rb +7 -0
- data/lib/rails-settings-ui/type_converter.rb +58 -0
- data/lib/rails-settings-ui/value_types/array.rb +17 -0
- data/lib/rails-settings-ui/value_types/base.rb +30 -0
- data/lib/rails-settings-ui/value_types/boolean.rb +11 -0
- data/lib/rails-settings-ui/value_types/fixnum.rb +17 -0
- data/lib/rails-settings-ui/value_types/float.rb +17 -0
- data/lib/rails-settings-ui/value_types/hash.rb +19 -0
- data/lib/rails-settings-ui/value_types/string.rb +11 -0
- data/lib/rails-settings-ui/value_types/symbol.rb +11 -0
- data/lib/rails-settings-ui/version.rb +1 -1
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/settings.rb +16 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +28 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +24 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/db/migrate/20140320182332_create_settings.rb +17 -0
- data/spec/dummy/db/schema.rb +27 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +264 -0
- data/spec/dummy/log/test.log +3237 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/capybara/capybara-201403251000145108838835.html +68 -0
- data/spec/dummy/tmp/capybara/capybara-201403251029034025293240.html +95 -0
- data/spec/features/settings_spec.rb +63 -0
- data/spec/lib/rails-settings-ui/type_converter_spec.rb +33 -0
- data/spec/lib/rails-settings-ui/value_types/array_spec.rb +15 -0
- data/spec/lib/rails-settings-ui/value_types/base_spec.rb +23 -0
- data/spec/lib/rails-settings-ui/value_types/boolean_spec.rb +10 -0
- data/spec/lib/rails-settings-ui/value_types/fixnum_spec.rb +17 -0
- data/spec/lib/rails-settings-ui/value_types/float_spec.rb +17 -0
- data/spec/lib/rails-settings-ui/value_types/hash_spec.rb +26 -0
- data/spec/lib/rails-settings-ui/value_types/string_spec.rb +10 -0
- data/spec/lib/rails-settings-ui/value_types/symbol_spec.rb +10 -0
- data/spec/spec_helper.rb +27 -0
- metadata +175 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1bd37d900e097cdee839f64abed32539038d2c4f
|
4
|
+
data.tar.gz: 58a2060c7fc0c73ed046a811386dfd09da345c91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97867588d71608cd5354396f6162d1b93c512327db2f90306cfe60d7e665cadf5646800265302b866529a874f1e7deb48572133406b24529c237f004893352e4
|
7
|
+
data.tar.gz: 73c09c67f469370b1dd8f29e0a385fc47bf7d69f874319e35b6fa04857b81a65e65431a04c9e45982818b075b94cef55493fb304f377eee02ca13be6d38fbe2b
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -6,16 +6,17 @@ rescue LoadError
|
|
6
6
|
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
|
10
|
+
load 'rails/tasks/engine.rake'
|
11
11
|
|
12
|
-
|
12
|
+
Bundler::GemHelper.install_tasks
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
Dir[File.join(File.dirname(__FILE__), 'tasks/**/*.rake')].each {|f| load f }
|
15
|
+
|
16
|
+
require 'rspec/core'
|
17
|
+
require 'rspec/core/rake_task'
|
18
|
+
|
19
|
+
desc "Run all specs in spec directory (excluding plugin specs)"
|
20
|
+
RSpec::Core::RakeTask.new(:spec => 'app:db:test:prepare')
|
20
21
|
|
21
|
-
task :default => :
|
22
|
+
task :default => :spec
|
@@ -23,6 +23,6 @@ class RailsSettingsUi::SettingsController < RailsSettingsUi::ApplicationControll
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def cast_settings_params
|
26
|
-
@casted_settings = RailsSettingsUi::
|
26
|
+
@casted_settings = RailsSettingsUi::TypeConverter.cast(params["settings"])
|
27
27
|
end
|
28
28
|
end
|
@@ -1,75 +1,44 @@
|
|
1
1
|
module RailsSettingsUi::SettingsHelper
|
2
|
-
def self.cast(requires_cast)
|
3
|
-
requires_cast[:errors] = {}
|
4
|
-
requires_cast.each do |var_name, value|
|
5
|
-
case Settings.defaults[var_name.to_sym]
|
6
|
-
when Fixnum
|
7
|
-
if is_numeric?(value)
|
8
|
-
requires_cast[var_name] = value.to_i
|
9
|
-
else
|
10
|
-
requires_cast[:errors][var_name.to_sym] = I18n.t("settings.errors.invalid_numeric", default: 'Invalid')
|
11
|
-
end
|
12
|
-
when ActiveSupport::HashWithIndifferentAccess
|
13
|
-
begin
|
14
|
-
requires_cast[var_name] = JSON.parse(value.gsub(/\=\>/, ':'))
|
15
|
-
rescue JSON::ParserError => e
|
16
|
-
requires_cast[:errors][var_name.to_sym] = I18n.t("settings.errors.invalid_hash", default: 'Invalid')
|
17
|
-
end
|
18
|
-
when Float
|
19
|
-
if is_numeric?(value)
|
20
|
-
requires_cast[var_name] = value.to_f
|
21
|
-
else
|
22
|
-
requires_cast[:errors][var_name.to_sym] = I18n.t("settings.errors.invalid_numeric", default: 'Invalid')
|
23
|
-
end
|
24
|
-
when Array
|
25
|
-
# Array presented in checkboxes
|
26
|
-
if value.is_a?(Hash)
|
27
|
-
requires_cast[var_name] = value.keys.map!(&:to_sym)
|
28
|
-
# or in select tag
|
29
|
-
else
|
30
|
-
value.to_sym
|
31
|
-
end
|
32
|
-
when FalseClass, TrueClass
|
33
|
-
requires_cast[var_name] = true
|
34
|
-
end
|
35
|
-
end
|
36
|
-
Settings.defaults.each do |name, value|
|
37
|
-
if !requires_cast[name.to_sym].present? && [TrueClass, FalseClass].include?(value.class)
|
38
|
-
requires_cast[name.to_sym] = false
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
requires_cast
|
43
|
-
end
|
44
|
-
|
45
2
|
def setting_field(setting_name, setting_value, all_settings)
|
46
3
|
if RailsSettingsUi.settings_displayed_as_select_tag.include?(setting_name.to_sym)
|
47
|
-
|
48
|
-
[label, value]
|
49
|
-
end
|
50
|
-
select_tag("settings[#{setting_name.to_s}]", options_for_select(default_setting_values, setting_value))
|
4
|
+
select_tag_field(setting_name, setting_value)
|
51
5
|
elsif setting_value.is_a?(Array)
|
52
|
-
|
53
|
-
Settings.defaults[setting_name.to_sym].each do |value|
|
54
|
-
field << check_box_tag("settings[#{setting_name.to_s}][#{value.to_s}]", nil, all_settings[setting_name.to_s].include?(value), style: "margin: 0 10px;")
|
55
|
-
field << label_tag("settings[#{setting_name.to_s}][#{value.to_s}]", I18n.t("settings.attributes.#{setting_name}.labels.#{value}", default: value.to_s), style: "display: inline-block;")
|
56
|
-
end
|
57
|
-
return field.html_safe
|
6
|
+
checkboxes_group_field(setting_name, all_settings)
|
58
7
|
elsif [TrueClass, FalseClass].include?(setting_value.class)
|
59
|
-
|
8
|
+
checkbox_field(setting_name, setting_value)
|
60
9
|
else
|
61
|
-
text_field
|
62
|
-
|
63
|
-
|
64
|
-
text_field_tag("settings[#{setting_name}]", setting_value.to_s)
|
65
|
-
end
|
10
|
+
text_field(setting_name, setting_value)
|
11
|
+
end
|
12
|
+
end
|
66
13
|
|
67
|
-
|
68
|
-
|
14
|
+
def select_tag_field(setting_name, setting_value)
|
15
|
+
default_setting_values = I18n.t("settings.attributes.#{setting_name}.labels", default: {}).map do |label, value|
|
16
|
+
[label, value]
|
69
17
|
end
|
18
|
+
select_tag("settings[#{setting_name.to_s}]", options_for_select(default_setting_values, setting_value))
|
70
19
|
end
|
71
20
|
|
72
|
-
def
|
73
|
-
|
21
|
+
def checkboxes_group_field(setting_name, all_settings)
|
22
|
+
field = ""
|
23
|
+
Settings.defaults[setting_name.to_sym].each do |value|
|
24
|
+
field << check_box_tag("settings[#{setting_name.to_s}][#{value.to_s}]", nil, all_settings[setting_name.to_s].include?(value), style: "margin: 0 10px;")
|
25
|
+
field << label_tag("settings[#{setting_name.to_s}][#{value.to_s}]", I18n.t("settings.attributes.#{setting_name}.labels.#{value}", default: value.to_s), style: "display: inline-block;")
|
26
|
+
end
|
27
|
+
field.html_safe
|
28
|
+
end
|
29
|
+
|
30
|
+
def checkbox_field(setting_name, setting_value)
|
31
|
+
check_box_tag("settings[#{setting_name.to_s}]", nil, setting_value).html_safe
|
32
|
+
end
|
33
|
+
|
34
|
+
def text_field(setting_name, setting_value)
|
35
|
+
field = if setting_value.to_s.size > 30
|
36
|
+
text_area_tag("settings[#{setting_name}]", setting_value.to_s, rows: 10)
|
37
|
+
else
|
38
|
+
text_field_tag("settings[#{setting_name}]", setting_value.to_s)
|
39
|
+
end
|
40
|
+
|
41
|
+
help_block_content = I18n.t("settings.attributes.#{setting_name}.help_block", default: '')
|
42
|
+
field + (help_block_content.presence && content_tag(:span, help_block_content, class: 'help-block'))
|
74
43
|
end
|
75
44
|
end
|
data/lib/rails-settings-ui.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rails-settings-ui/engine'
|
|
3
3
|
require 'rails-settings-ui/main_app_route_delegator'
|
4
4
|
require 'rails-settings-ui/version'
|
5
5
|
|
6
|
-
require
|
6
|
+
require "rails-settings-ui/type_converter"
|
7
7
|
|
8
8
|
module RailsSettingsUi
|
9
9
|
mattr_accessor :parent_controller
|
@@ -1,5 +1,12 @@
|
|
1
1
|
module ::RailsSettingsUi
|
2
2
|
class Engine < Rails::Engine
|
3
3
|
isolate_namespace RailsSettingsUi
|
4
|
+
|
5
|
+
config.generators do |g|
|
6
|
+
g.test_framework :rspec, fixture: false
|
7
|
+
g.fixture_replacement :factory_girl, dir: 'spec/factories'
|
8
|
+
g.assets false
|
9
|
+
g.helper false
|
10
|
+
end
|
4
11
|
end
|
5
12
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative "value_types/string"
|
2
|
+
require_relative "value_types/symbol"
|
3
|
+
require_relative "value_types/fixnum"
|
4
|
+
require_relative "value_types/hash"
|
5
|
+
require_relative "value_types/float"
|
6
|
+
require_relative "value_types/array"
|
7
|
+
require_relative "value_types/boolean"
|
8
|
+
|
9
|
+
module RailsSettingsUi
|
10
|
+
class UnknownDefaultValueType < StandardError;end
|
11
|
+
|
12
|
+
class TypeConverter
|
13
|
+
VALUE_TYPES_MAP = {
|
14
|
+
String => RailsSettingsUi::ValueTypes::String,
|
15
|
+
Symbol => RailsSettingsUi::ValueTypes::Symbol,
|
16
|
+
Fixnum => RailsSettingsUi::ValueTypes::Fixnum,
|
17
|
+
ActiveSupport::HashWithIndifferentAccess => RailsSettingsUi::ValueTypes::Hash,
|
18
|
+
Float => RailsSettingsUi::ValueTypes::Float,
|
19
|
+
Array => RailsSettingsUi::ValueTypes::Array,
|
20
|
+
FalseClass => RailsSettingsUi::ValueTypes::Boolean,
|
21
|
+
TrueClass => RailsSettingsUi::ValueTypes::Boolean
|
22
|
+
}
|
23
|
+
|
24
|
+
def self.cast(settings)
|
25
|
+
errors = {}
|
26
|
+
settings.each do |name, value|
|
27
|
+
type = setting_value_type(name, value)
|
28
|
+
settings[name] = type.cast
|
29
|
+
if type.errors.any?
|
30
|
+
errors[name.to_sym] = type.errors
|
31
|
+
end
|
32
|
+
end
|
33
|
+
settings = set_non_presented_boolean_settings_to_false(settings)
|
34
|
+
|
35
|
+
settings[:errors] = errors
|
36
|
+
settings
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.setting_value_type(name, value)
|
40
|
+
default_setting_value_type = Settings.defaults[name.to_sym].class
|
41
|
+
unless VALUE_TYPES_MAP.keys.include?(default_setting_value_type)
|
42
|
+
raise RailsSettingsUi::UnknownDefaultValueType, "Unknown default value type #{default_setting_value_type}"
|
43
|
+
end
|
44
|
+
|
45
|
+
setting_value_type_class = VALUE_TYPES_MAP[default_setting_value_type]
|
46
|
+
setting_value_type_class.new(value)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.set_non_presented_boolean_settings_to_false(settings)
|
50
|
+
Settings.defaults.each do |name, value|
|
51
|
+
if !settings[name.to_sym].present? && [TrueClass, FalseClass].include?(value.class)
|
52
|
+
settings[name.to_sym] = false
|
53
|
+
end
|
54
|
+
end
|
55
|
+
settings
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module RailsSettingsUi
|
4
|
+
module ValueTypes
|
5
|
+
class Array < RailsSettingsUi::ValueTypes::Base
|
6
|
+
def cast
|
7
|
+
# Array presented in checkboxes
|
8
|
+
if ["Hash", "ActiveSupport::HashWithIndifferentAccess"].include?(value.class.name)
|
9
|
+
value.keys.map!(&:to_sym)
|
10
|
+
# or in select tag
|
11
|
+
else
|
12
|
+
value.to_sym
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module RailsSettingsUi
|
2
|
+
module ValueTypes
|
3
|
+
class Base
|
4
|
+
attr_accessor :value, :errors
|
5
|
+
|
6
|
+
def initialize(value)
|
7
|
+
self.value = value
|
8
|
+
self.errors = []
|
9
|
+
validate
|
10
|
+
end
|
11
|
+
|
12
|
+
def cast
|
13
|
+
raise NotImplementedError
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid?
|
17
|
+
!errors.any?
|
18
|
+
end
|
19
|
+
|
20
|
+
def value_numeric?
|
21
|
+
!value.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/).nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def validate
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module RailsSettingsUi
|
4
|
+
module ValueTypes
|
5
|
+
class Fixnum < RailsSettingsUi::ValueTypes::Base
|
6
|
+
def cast
|
7
|
+
value.to_i
|
8
|
+
end
|
9
|
+
|
10
|
+
def validate
|
11
|
+
unless value_numeric?
|
12
|
+
self.errors << I18n.t("settings.errors.invalid_numeric", default: 'Invalid')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module RailsSettingsUi
|
4
|
+
module ValueTypes
|
5
|
+
class Float < RailsSettingsUi::ValueTypes::Base
|
6
|
+
def cast
|
7
|
+
value.to_f
|
8
|
+
end
|
9
|
+
|
10
|
+
def validate
|
11
|
+
unless value_numeric?
|
12
|
+
self.errors << I18n.t("settings.errors.invalid_numeric", default: 'Invalid')
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative "base"
|
2
|
+
|
3
|
+
module RailsSettingsUi
|
4
|
+
module ValueTypes
|
5
|
+
class Hash < RailsSettingsUi::ValueTypes::Base
|
6
|
+
def cast
|
7
|
+
value
|
8
|
+
end
|
9
|
+
|
10
|
+
def validate
|
11
|
+
begin
|
12
|
+
self.value = JSON.parse(value.gsub(/\=\>/, ':'))
|
13
|
+
rescue JSON::ParserError => e
|
14
|
+
self.errors << I18n.t("settings.errors.invalid_hash", default: 'Invalid')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
== README
|
2
|
+
|
3
|
+
This README would normally document whatever steps are necessary to get the
|
4
|
+
application up and running.
|
5
|
+
|
6
|
+
Things you may want to cover:
|
7
|
+
|
8
|
+
* Ruby version
|
9
|
+
|
10
|
+
* System dependencies
|
11
|
+
|
12
|
+
* Configuration
|
13
|
+
|
14
|
+
* Database creation
|
15
|
+
|
16
|
+
* Database initialization
|
17
|
+
|
18
|
+
* How to run the test suite
|
19
|
+
|
20
|
+
* Services (job queues, cache servers, search engines, etc.)
|
21
|
+
|
22
|
+
* Deployment instructions
|
23
|
+
|
24
|
+
* ...
|
25
|
+
|
26
|
+
|
27
|
+
Please feel free to use a different markup language if you do not plan to run
|
28
|
+
<tt>rake doc:app</tt>.
|
data/spec/dummy/Rakefile
ADDED