rails-settings-ui 1.3.5 → 1.4.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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -3
  3. data/README.md +15 -60
  4. data/app/controllers/rails_settings_ui/settings_controller.rb +17 -13
  5. data/app/helpers/rails_settings_ui/settings_helper.rb +5 -10
  6. data/config/locales/en.yml +3 -4
  7. data/lib/rails-settings-ui/engine.rb +0 -1
  8. data/lib/rails-settings-ui/settings_form_coercible.rb +2 -1
  9. data/lib/rails-settings-ui/settings_form_validator.rb +2 -1
  10. data/lib/rails-settings-ui/type_converter.rb +79 -0
  11. data/lib/rails-settings-ui/value_types/array.rb +19 -0
  12. data/lib/rails-settings-ui/value_types/base.rb +30 -0
  13. data/lib/rails-settings-ui/value_types/boolean.rb +16 -0
  14. data/lib/rails-settings-ui/value_types/duration.rb +17 -0
  15. data/lib/rails-settings-ui/value_types/fixnum.rb +17 -0
  16. data/lib/rails-settings-ui/value_types/float.rb +17 -0
  17. data/lib/rails-settings-ui/value_types/hash.rb +19 -0
  18. data/lib/rails-settings-ui/value_types/string.rb +11 -0
  19. data/lib/rails-settings-ui/value_types/symbol.rb +11 -0
  20. data/lib/rails-settings-ui/version.rb +1 -1
  21. data/lib/rails-settings-ui.rb +13 -5
  22. data/spec/dummy/app/assets/config/manifest.js +3 -0
  23. data/spec/dummy/app/models/settings.rb +17 -11
  24. data/spec/dummy/config/application.rb +8 -5
  25. data/spec/dummy/config/environments/development.rb +1 -1
  26. data/spec/dummy/config/environments/test.rb +5 -0
  27. data/spec/dummy/db/development.sqlite3 +0 -0
  28. data/spec/dummy/log/development.log +204 -0
  29. data/spec/dummy/log/test.log +17721 -0
  30. data/spec/dummy/tmp/cache/983/850/rails-settings-cached%2Fv1 +0 -0
  31. data/spec/dummy/tmp/cache/B43/920/rails_settings_cached%3Aangle +1 -0
  32. data/spec/dummy/tmp/cache/B5B/D00/rails_settings_cached%3Alimit +1 -0
  33. data/spec/dummy/tmp/cache/C33/A30/rails_settings_cached%3Acompany +2 -0
  34. data/spec/dummy/tmp/cache/E33/F60/rails_settings_cached%3Aproject_name +2 -0
  35. data/spec/dummy/tmp/capybara/capybara-202210171734284469945531.html +149 -0
  36. data/spec/dummy/tmp/capybara/capybara-202210171737204973407096.html +149 -0
  37. data/spec/dummy/tmp/capybara/capybara-202210171748434956557154.html +149 -0
  38. data/spec/dummy/tmp/capybara/capybara-202210171748436975538759.html +149 -0
  39. data/spec/dummy/tmp/capybara/capybara-202210171750314291147778.html +149 -0
  40. data/spec/dummy/tmp/capybara/capybara-20221017175031820707857.html +149 -0
  41. data/spec/dummy/tmp/capybara/capybara-202210171753008459837645.html +149 -0
  42. data/spec/dummy/tmp/capybara/capybara-202210171852063304179945.html +149 -0
  43. data/spec/dummy/tmp/capybara/capybara-202210171856426164369905.html +149 -0
  44. data/spec/dummy/tmp/capybara/capybara-202210171858321617647144.html +146 -0
  45. data/spec/dummy/tmp/capybara/capybara-202210171859225748767967.html +149 -0
  46. data/spec/dummy/tmp/capybara/capybara-202210171900593853637022.html +149 -0
  47. data/spec/dummy/tmp/capybara/capybara-202210171905425563856340.html +149 -0
  48. data/spec/dummy/tmp/capybara/capybara-202210171906453524726761.html +149 -0
  49. data/spec/dummy/tmp/capybara/capybara-202210171907021196417641.html +149 -0
  50. data/spec/dummy/tmp/capybara/capybara-202210171907177584260273.html +149 -0
  51. data/spec/dummy/tmp/capybara/capybara-202210171908598155484313.html +146 -0
  52. data/spec/dummy/tmp/capybara/capybara-202210171910151128908606.html +149 -0
  53. data/spec/dummy/tmp/capybara/capybara-202210171910335167198647.html +149 -0
  54. data/spec/dummy/tmp/capybara/capybara-20221017191603669584955.html +149 -0
  55. data/spec/dummy/tmp/capybara/capybara-202210171923383386177630.html +149 -0
  56. data/spec/dummy/tmp/capybara/capybara-20221017192440932299839.html +149 -0
  57. data/spec/dummy/tmp/capybara/capybara-202210171925398582267473.html +149 -0
  58. data/spec/dummy/tmp/capybara/capybara-202210171926266453882118.html +149 -0
  59. data/spec/dummy/tmp/capybara/capybara-202210171927092397731872.html +149 -0
  60. data/spec/dummy/tmp/capybara/capybara-202210171927096856622887.html +149 -0
  61. data/spec/dummy/tmp/capybara/capybara-20221017192857430966358.html +149 -0
  62. data/spec/dummy/tmp/capybara/capybara-20221017192857715946316.html +149 -0
  63. data/spec/dummy/tmp/capybara/capybara-202210171929344449627309.html +148 -0
  64. data/spec/dummy/tmp/capybara/capybara-202210171929349483966535.html +148 -0
  65. data/spec/dummy/tmp/capybara/capybara-202210171931514543176977.html +149 -0
  66. data/spec/dummy/tmp/capybara/capybara-202210171931516552014196.html +149 -0
  67. data/spec/dummy/tmp/capybara/capybara-202210171933532109133909.html +148 -0
  68. data/spec/dummy/tmp/capybara/capybara-202210171933538239745721.html +148 -0
  69. data/spec/dummy/tmp/capybara/capybara-202210171934252299363012.html +148 -0
  70. data/spec/dummy/tmp/capybara/capybara-202210171934257507814102.html +148 -0
  71. data/spec/dummy/tmp/capybara/capybara-202210171935002341486006.html +148 -0
  72. data/spec/dummy/tmp/capybara/capybara-202210171935003194509488.html +148 -0
  73. data/spec/dummy/tmp/capybara/capybara-202210171935191080772264.html +149 -0
  74. data/spec/dummy/tmp/capybara/capybara-20221017193519504184564.html +148 -0
  75. data/spec/dummy/tmp/capybara/capybara-202210171935494419345825.html +148 -0
  76. data/spec/dummy/tmp/capybara/capybara-202210171935495077855617.html +149 -0
  77. data/spec/dummy/tmp/capybara/capybara-202210171935512244046619.html +149 -0
  78. data/spec/dummy/tmp/capybara/capybara-202210171935515471773291.html +148 -0
  79. data/spec/dummy/tmp/capybara/capybara-20221017193621299357586.html +148 -0
  80. data/spec/dummy/tmp/capybara/capybara-202210171936214576498840.html +149 -0
  81. data/spec/dummy/tmp/capybara/capybara-202210171943053342669430.html +149 -0
  82. data/spec/dummy/tmp/capybara/capybara-202210171943054897250624.html +148 -0
  83. data/spec/dummy/tmp/capybara/capybara-202210171943172523615452.html +148 -0
  84. data/spec/dummy/tmp/capybara/capybara-202210171943176449343696.html +149 -0
  85. data/spec/dummy/tmp/capybara/capybara-202210171944092904892605.html +149 -0
  86. data/spec/dummy/tmp/capybara/capybara-202210171944096476035010.html +148 -0
  87. data/spec/features/settings_spec.rb +9 -8
  88. data/spec/lib/rails-settings-ui/type_converter_spec.rb +43 -0
  89. data/spec/lib/rails-settings-ui/value_types/array_spec.rb +21 -0
  90. data/spec/lib/rails-settings-ui/value_types/base_spec.rb +23 -0
  91. data/spec/lib/rails-settings-ui/value_types/boolean_spec.rb +10 -0
  92. data/spec/lib/rails-settings-ui/value_types/duration_spec.rb +19 -0
  93. data/spec/lib/rails-settings-ui/value_types/fixnum_spec.rb +17 -0
  94. data/spec/lib/rails-settings-ui/value_types/float_spec.rb +17 -0
  95. data/spec/lib/rails-settings-ui/value_types/hash_spec.rb +26 -0
  96. data/spec/lib/rails-settings-ui/value_types/string_spec.rb +10 -0
  97. data/spec/lib/rails-settings-ui/value_types/symbol_spec.rb +10 -0
  98. data/spec/spec_helper.rb +0 -1
  99. metadata +199 -55
  100. data/spec/lib/rails-settings-ui/settings_form_coercible_spec.rb +0 -136
  101. data/spec/lib/rails-settings-ui/settings_form_validator_spec.rb +0 -94
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d63b8dd2f8b21d13584e337a8fcecda9a8f4cdf8cb36fe43c8c820ff4135610
4
- data.tar.gz: f5b9e70028d0b94d02f65a6c4d83c1099b0c7d77b1d26461277ab96fbed9070e
3
+ metadata.gz: 7cf201387248adc25655ab881e32b146940be2c850b604cc0057b4a7bf146183
4
+ data.tar.gz: 60e18da98e363ff116efa4d5584c10dfa58808d9fe41f5f8159ace32036e38d9
5
5
  SHA512:
6
- metadata.gz: 898f2698cc54648e70d3f1c36a369779a9c75d49cbc98b442e8d6ee847d2378eeaac81a65b1e427c9ae8cc7837453210842d7ab07949b4b9e91354d5698ac172
7
- data.tar.gz: 44dacf721a928326f0108f09be41cff3e1bc3a38c27b4b949024ff1d32656b65f60c2e0eaae94bbea8f6da64c4688649e96a38a69cc82e262eebf3cd99691dff
6
+ metadata.gz: 17dd3a8f8b71639e620ee06672595f34d99011fdde606f600887b45ac40107519c1e6c0988435d24bc5b78a2954e9ebe44e3c03d3b9ce71f361c2fb92a96f6ef
7
+ data.tar.gz: ffe3ca3182d6d6d0ea8339b0666df35c009c6b8da7b973080b77fb545411df82ab4a7b5005199e68854c6d74c52dde5a5790f5b59371db60c4024218bd17d4f8
data/Gemfile CHANGED
@@ -1,8 +1,9 @@
1
- source "http://rubygems.org"
1
+ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
5
  group :development, :test do
6
- gem "sqlite3"
7
- gem "rails-settings-cached", '0.5.4'
6
+ gem 'pry'
7
+ gem 'sqlite3'
8
+ gem 'rails-settings-cached', '2.8.2'
8
9
  end
data/README.md CHANGED
@@ -1,20 +1,16 @@
1
1
  Rails settings UI
2
2
  ================================
3
3
 
4
- [![Gem Version](https://badge.fury.io/rb/rails-settings-ui.png)](http://badge.fury.io/rb/rails-settings-ui)
5
- [![Build Status](https://travis-ci.org/accessd/rails-settings-ui.svg?branch=master)](https://travis-ci.org/accessd/rails-settings-ui)
6
- [![Code Climate](https://codeclimate.com/github/accessd/rails-settings-ui/badges/gpa.svg)](https://codeclimate.com/github/accessd/rails-settings-ui)
7
- [![Test Coverage](https://codeclimate.com/github/accessd/rails-settings-ui/badges/coverage.svg)](https://codeclimate.com/github/accessd/rails-settings-ui/coverage)
4
+ [![Gem Version](https://badge.fury.io/rb/rails-settings-ui.svg)](https://rubygems.org/gems/rails-settings-ui)
5
+ [![build](https://github.com/accessd/rails-settings-ui/workflows/build/badge.svg)](https://github.com/accessd/rails-settings-cached/actions?query=workflow%3Abuild)
8
6
 
9
- A Rails Engine to manage your application settings. Includes validation. Compatible with Rails 5.
10
- It compatible with [rails-settings-cached](https://github.com/huacnlee/rails-settings-cached) gem.
7
+ A Rails Engine to manage your application settings. Includes validation. Compatible with Rails 8.
8
+ It depends on [rails-settings-cached](https://github.com/huacnlee/rails-settings-cached) gem.
11
9
 
12
10
  Preview:
13
11
 
14
12
  ![ScreenShot](https://raw.github.com/accessd/rails-settings-ui/master/doc/img/settings-page.png)
15
13
 
16
- Live example: http://rails-settings-ui.herokuapp.com/
17
-
18
14
  How to
19
15
  -----
20
16
 
@@ -22,16 +18,6 @@ Add to Gemfile
22
18
 
23
19
  gem 'rails-settings-ui'
24
20
 
25
- then add
26
-
27
- gem 'rails-settings-cached'
28
-
29
- or
30
-
31
- gem 'rails-settings'
32
-
33
- or your fork of rails-settings.
34
-
35
21
  If you want to use bootstrap interface you need also include bootstrap stylesheets to your app.
36
22
  You may use [bootstrap-sass](https://github.com/twbs/bootstrap-sass) gem for that.
37
23
 
@@ -115,55 +101,24 @@ if you don't specify labels in locale config, you'll get:
115
101
  settings:
116
102
  attributes:
117
103
  launch_mode:
118
- help_block: 'Rocket launch mode'
104
+ help_block: 'launch mode'
119
105
  ```
120
106
 
121
107
  Validations
122
108
  -------------
123
109
 
124
- To validation work is required the default settings in the proper format, eg:
110
+ Validations work based on default value for setting or by explicitly specify type for setting, eg:
125
111
 
126
- For rails-settings-cached up to 0.5.8:
112
+ class Settings < RailsSettings::Base
113
+ cache_prefix { "v1" }
127
114
 
128
- class Settings < RailsSettings::CachedSettings
129
- defaults[:company_name] = "Company name"
130
- defaults[:head_name] = "Head name"
131
- defaults[:manager_premium] = 19
132
- defaults[:show_contract_fields] = true
133
- defaults[:launch_mode] = [:auto, :manual]
115
+ field :company_name, type: :string, default: "Company name"
116
+ field :head_name, default: "Head name"
117
+ field :manager_premium, default: 19
118
+ field :show_contract_fields, default: true
119
+ field :launch_mode, default: [:auto, :manual]
134
120
  end
135
121
 
136
- For rails-settings-cached with version >= 0.6.0 default settings moved to YAML config file (config/app.yml), so
137
- defaults should looks like:
138
-
139
- ```yaml
140
- defaults: &defaults
141
- rocket_name: "Foo"
142
- limit: 123
143
- launch_mode:
144
- - auto
145
- - manual
146
- spaceports:
147
- - plesetsk
148
- - baikonur
149
- style:
150
- border_color: 'e0e0e0'
151
- block_color: 'ffffff'
152
- title:
153
- font: "Tahoma"
154
- size: "12"
155
- color: '107821'
156
-
157
- development:
158
- <<: *defaults
159
-
160
- test:
161
- <<: *defaults
162
-
163
- production:
164
- <<: *defaults
165
- ```
166
-
167
122
  Views
168
123
  -------------
169
124
 
@@ -192,10 +147,10 @@ Alternatively, to have custom rules just for rails-setting-ui you can:
192
147
 
193
148
  Rails.application.config.to_prepare do
194
149
  RailsSettingsUi::ApplicationController.module_eval do
195
- before_filter :check_settings_permissions # for Rails 3
196
- before_action :check_settings_permissions # starting from Rails 4
150
+ before_action :check_settings_permissions
197
151
 
198
152
  private
153
+
199
154
  def check_settings_permissions
200
155
  render status: 403 unless current_user && can_manage_settings?(current_user)
201
156
  end
@@ -1,16 +1,24 @@
1
1
  class RailsSettingsUi::SettingsController < RailsSettingsUi::ApplicationController
2
2
  include RailsSettingsUi::SettingsHelper
3
3
  before_action :collection
4
- before_action :validate_settings, only: :update_all
4
+ before_action :cast_settings_params, only: :update_all
5
5
 
6
6
  def index
7
7
  end
8
8
 
9
9
  def update_all
10
- if @errors.any?
10
+ if @casted_settings[:errors].any?
11
+ @errors = @casted_settings[:errors]
11
12
  render :index
12
13
  else
13
- coerced_values.each { |name, value| RailsSettingsUi.settings_klass[name] = value }
14
+ @casted_settings.map do |name, value|
15
+ next if name == 'errors'
16
+
17
+ sc = RailsSettingsUi.setting_config(name)
18
+ next if sc[:readonly] == true
19
+
20
+ RailsSettingsUi.settings_klass.public_send("#{name}=", value)
21
+ end
14
22
  flash[:success] = t('settings.index.settings_saved')
15
23
  redirect_to [:settings]
16
24
  end
@@ -19,23 +27,19 @@ class RailsSettingsUi::SettingsController < RailsSettingsUi::ApplicationControll
19
27
  private
20
28
 
21
29
  def collection
22
- all_settings_without_ignored = all_settings.reject{ |name, _description| RailsSettingsUi.ignored_settings.include?(name.to_sym) }
30
+ all_settings_without_ignored = all_settings.reject do |name, _description|
31
+ RailsSettingsUi.ignored_settings.include?(name.to_sym)
32
+ end
23
33
  @settings = Hash[all_settings_without_ignored]
24
34
  @errors = {}
25
35
  end
26
36
 
27
- def validate_settings
28
- # validation schema accepts hash (http://dry-rb.org/gems/dry-validation/forms/) so we're converting
29
- # ActionController::Parameters => ActiveSupport::HashWithIndifferentAccess
30
- @errors = RailsSettingsUi::SettingsFormValidator.new(default_settings, settings_from_params).errors
31
- end
32
-
33
- def coerced_values
34
- RailsSettingsUi::SettingsFormCoercible.new(default_settings, settings_from_params).coerce!
37
+ def cast_settings_params
38
+ @casted_settings = RailsSettingsUi::TypeConverter.cast(settings_from_params)
35
39
  end
36
40
 
37
41
  def settings_from_params
38
- settings_params = params['settings'].deep_dup
42
+ settings_params = params['settings'].deep_dup || {}
39
43
  if settings_params.respond_to?(:to_unsafe_h)
40
44
  settings_params.to_unsafe_h
41
45
  else
@@ -70,20 +70,15 @@ module RailsSettingsUi::SettingsHelper
70
70
  content_tag(:span, I18n.t("settings.errors.default_missing"), class: "label label-warning")
71
71
  end
72
72
 
73
- def get_collection_method
74
- case Rails::VERSION::STRING
75
- when /4\.0\.\d+/ || /3\..*/
76
- :all
77
- else
78
- :get_all
79
- end
80
- end
81
-
82
73
  def default_value_for_setting(setting_name)
83
74
  RailsSettingsUi.defaults_for_settings.with_indifferent_access[setting_name.to_sym]
84
75
  end
85
76
 
86
77
  def all_settings
87
- RailsSettingsUi.settings_klass.public_send(get_collection_method)
78
+ stored_settings = RailsSettingsUi.settings_klass.public_send(:all).each_with_object({}) do |s, hsh|
79
+ hsh[s.var] = s.value
80
+ end.with_indifferent_access
81
+
82
+ stored_settings.merge(RailsSettingsUi.default_settings.merge(stored_settings))
88
83
  end
89
84
  end
@@ -1,8 +1,7 @@
1
1
  en:
2
2
  errors:
3
- form_hash?: Invalid hash
4
- int?: Invalid numeric
5
- float?: Invalid numeric
3
+ invalid_hash: Invalid hash
4
+ invalid_numeric: Invalid numeric
6
5
  settings:
7
6
  index:
8
7
  title: Settings
@@ -10,6 +9,6 @@ en:
10
9
  value: Value
11
10
  save_all: Save all
12
11
  settings_include_errors: Settings include errors
13
- settings_saved: Settings saved succesfully!
12
+ settings_saved: Settings saved successfully!
14
13
  errors:
15
14
  default_missing: Default value missing, but exists in db
@@ -4,7 +4,6 @@ module ::RailsSettingsUi
4
4
 
5
5
  config.generators do |g|
6
6
  g.test_framework :rspec, fixture: false
7
- g.fixture_replacement :factory_girl, dir: 'spec/factories'
8
7
  g.assets false
9
8
  g.helper false
10
9
  end
@@ -42,10 +42,11 @@ module RailsSettingsUi
42
42
  attr_reader :settings, :default_settings
43
43
  attr_accessor :coerced_settings
44
44
 
45
+ integer_klass = defined?(Fixnum) ? Fixnum : Integer
45
46
  COERCIONS_MAP = {
46
47
  String => Types::Coercible::String,
47
48
  Symbol => Types::CustomCoercions::Symbol,
48
- (1.class == Integer ? Integer : Fixnum) => Types::Params::Integer,
49
+ integer_klass => Types::Params::Integer,
49
50
  ActiveSupport::HashWithIndifferentAccess => Types::CustomCoercions::Hash,
50
51
  ActiveSupport::Duration => Types::Params::Integer,
51
52
  Float => Types::Params::Float,
@@ -19,8 +19,9 @@ module RailsSettingsUi
19
19
  end
20
20
 
21
21
  class SettingsFormValidator
22
+ integer_klass = defined?(Fixnum) ? Fixnum : Integer
22
23
  VALIDATABLE_TYPES = {
23
- (1.class == Integer ? Integer : Fixnum) => :int?,
24
+ integer_klass => :int?,
24
25
  Float => :float?,
25
26
  ActiveSupport::Duration => :int?,
26
27
  ActiveSupport::HashWithIndifferentAccess => :form_hash?
@@ -0,0 +1,79 @@
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/duration"
6
+ require_relative "value_types/float"
7
+ require_relative "value_types/array"
8
+ require_relative "value_types/boolean"
9
+
10
+ module RailsSettingsUi
11
+ class UnknownDefaultValueType < StandardError;end
12
+
13
+ class TypeConverter
14
+ integer_klass = defined?(Fixnum) ? Fixnum : Integer
15
+ VALUE_TYPES_MAP = {
16
+ String => RailsSettingsUi::ValueTypes::String,
17
+ Symbol => RailsSettingsUi::ValueTypes::Symbol,
18
+ integer_klass => RailsSettingsUi::ValueTypes::Fixnum,
19
+ # ActiveSupport::HashWithIndifferentAccess => RailsSettingsUi::ValueTypes::Hash,
20
+ ActiveSupport::Duration => RailsSettingsUi::ValueTypes::Float,
21
+ Float => RailsSettingsUi::ValueTypes::Float,
22
+ Array => RailsSettingsUi::ValueTypes::Array,
23
+ FalseClass => RailsSettingsUi::ValueTypes::Boolean,
24
+ TrueClass => RailsSettingsUi::ValueTypes::Boolean,
25
+ boolean: RailsSettingsUi::ValueTypes::Boolean,
26
+ string: RailsSettingsUi::ValueTypes::String,
27
+ integer: RailsSettingsUi::ValueTypes::Fixnum,
28
+ float: RailsSettingsUi::ValueTypes::Float,
29
+ array: RailsSettingsUi::ValueTypes::Array,
30
+ hash: RailsSettingsUi::ValueTypes::Hash
31
+ }
32
+
33
+ def self.cast(settings)
34
+ errors = {}
35
+ settings.each do |name, value|
36
+ sc = RailsSettingsUi.setting_config(name.to_s)
37
+ type = setting_value_type(name, value, sc)
38
+ settings[name] = type.cast
39
+ if type.errors.any?
40
+ errors[name.to_sym] = type.errors
41
+ end
42
+ end
43
+ settings = set_non_presented_settings(settings)
44
+
45
+ settings[:errors] = errors
46
+ settings
47
+ end
48
+
49
+ def self.setting_value_type(name, value, setting_config)
50
+ default_setting_value_type = if setting_config[:type].nil? || setting_config[:type] == :string
51
+ setting_config[:default].class
52
+ else
53
+ setting_config[:type]
54
+ end
55
+
56
+ unless VALUE_TYPES_MAP.keys.include?(default_setting_value_type)
57
+ raise RailsSettingsUi::UnknownDefaultValueType,
58
+ "Unknown default value type #{default_setting_value_type} for #{name}"
59
+ end
60
+
61
+ # puts "--- #{name}: #{default_setting_value_type} ---"
62
+ setting_value_type_class = VALUE_TYPES_MAP[default_setting_value_type]
63
+ setting_value_type_class.new(value)
64
+ end
65
+
66
+ def self.set_non_presented_settings(settings)
67
+ RailsSettingsUi.default_settings.each do |name, value|
68
+ if !settings[name.to_sym].present?
69
+ if [TrueClass, FalseClass].include?(value.class)
70
+ settings[name.to_sym] = false
71
+ elsif [Array].include?(value.class)
72
+ settings[name.to_sym] = []
73
+ end
74
+ end
75
+ end
76
+ settings
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,19 @@
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
+ elsif value.class.name == 'ActionController::Parameters'
11
+ value.reject{|_,v| v!='on' }.keys.map!(&:to_sym)
12
+ # or in select tag
13
+ else
14
+ value.to_sym
15
+ end
16
+ end
17
+ end
18
+ end
19
+ 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,16 @@
1
+ require_relative "base"
2
+
3
+ module RailsSettingsUi
4
+ module ValueTypes
5
+ class Boolean < RailsSettingsUi::ValueTypes::Base
6
+ def cast
7
+ case value
8
+ when 'off'
9
+ self.value = false
10
+ else
11
+ self.value = true
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require_relative "base"
2
+
3
+ module RailsSettingsUi
4
+ module ValueTypes
5
+ class Duration < RailsSettingsUi::ValueTypes::Base
6
+ def cast
7
+ value.to_f.seconds
8
+ end
9
+
10
+ def validate
11
+ unless value_numeric?
12
+ self.errors << I18n.t('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 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('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('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('errors.invalid_hash', default: 'Invalid')
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base"
2
+
3
+ module RailsSettingsUi
4
+ module ValueTypes
5
+ class String < RailsSettingsUi::ValueTypes::Base
6
+ def cast
7
+ value.to_s
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative "base"
2
+
3
+ module RailsSettingsUi
4
+ module ValueTypes
5
+ class Symbol < RailsSettingsUi::ValueTypes::Base
6
+ def cast
7
+ value.to_sym
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsSettingsUi
2
- VERSION = '1.3.5'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -3,8 +3,7 @@ require 'rails-settings-ui/engine'
3
3
  require 'rails-settings-ui/route_delegator'
4
4
  require 'rails-settings-ui/version'
5
5
 
6
- require "rails-settings-ui/settings_form_validator"
7
- require "rails-settings-ui/settings_form_coercible"
6
+ require "rails-settings-ui/type_converter"
8
7
 
9
8
  module RailsSettingsUi
10
9
  mattr_accessor :parent_controller
@@ -45,12 +44,21 @@ module RailsSettingsUi
45
44
  settings_class.constantize
46
45
  end
47
46
 
47
+ def setting_config(name)
48
+ defined_fields = RailsSettingsUi.settings_klass.public_send(:all).defined_fields
49
+ defined_fields.find { |s| s[:key] == name }
50
+ end
51
+
48
52
  def default_settings
49
- if Gem.loaded_specs['rails-settings-cached'].version.to_s >= '0.6.0'
50
- settings = RailsSettings::Default.instance.with_indifferent_access
53
+ rsc_version = Gem.loaded_specs['rails-settings-cached'].version.to_s
54
+
55
+ if rsc_version >= '2.7.0'
56
+ defined_fields = RailsSettingsUi.settings_klass.public_send(:all).defined_fields
57
+ settings = defined_fields.each_with_object({}) { |s, hsh| hsh[s[:key]] = s[:default] }.with_indifferent_access
51
58
  settings.reject { |name, _description| ignored_settings.include?(name.to_sym) }
52
59
  else
53
- RailsSettingsUi.settings_klass.defaults
60
+ settings = RailsSettings::Default.instance.with_indifferent_access
61
+ settings.reject { |name, _description| ignored_settings.include?(name.to_sym) }
54
62
  end
55
63
  end
56
64
  end
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link application.css
3
+ //= link application.js
@@ -1,8 +1,12 @@
1
- class Settings < RailsSettings::CachedSettings
2
- defaults[:project_name] = "Dummy"
3
- defaults[:limit] = 150
4
- defaults[:angle] = 0.5
5
- defaults[:style] = {
1
+ class Settings < RailsSettings::Base
2
+ cache_prefix { "v1" }
3
+
4
+ field :project_name, type: :string, default: "Dummy"
5
+ scope :limits do
6
+ field :limit, type: :integer, default: 150
7
+ end
8
+ field :angle, type: :float, default: 0.5
9
+ field :style, type: :hash, default: {
6
10
  border_color: 'e0e0e0',
7
11
  block_color: 'ffffff',
8
12
  title: {
@@ -11,10 +15,12 @@ class Settings < RailsSettings::CachedSettings
11
15
  color: '107821'
12
16
  }
13
17
  }
14
- defaults[:check_something] = true
15
- defaults[:description] = "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful."
16
- defaults[:mode] = [:auto, :manual]
17
- defaults[:timer] = 2.hours
18
- defaults[:project_status] = :finished
19
- defaults[:locale] = [:en, :ru]
18
+ field :check_something, type: :boolean, default: true
19
+ field :description, type: :string,
20
+ default: "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful."
21
+ field :mode, type: :array, default: [:auto, :manual]
22
+ field :timer, default: 2.hours
23
+ field :project_status, default: :finished
24
+ field :locale, default: [:en, :ru]
25
+ field :readonly_item, type: :integer, default: 100, readonly: true
20
26
  end
@@ -1,10 +1,14 @@
1
1
  require File.expand_path('../boot', __FILE__)
2
2
 
3
3
  # Pick the frameworks you want:
4
- require "active_record/railtie"
5
- require "action_controller/railtie"
6
- require "action_mailer/railtie"
7
- require "sprockets/railtie"
4
+ # require "active_record/railtie"
5
+ # require "action_controller/railtie"
6
+ # require "action_mailer/railtie"
7
+ # require "sprockets/railtie"
8
+
9
+ # Workaround for Rails 6 requiring Logger before ActiveSupport modules
10
+ require 'logger'
11
+ require 'rails/all'
8
12
  # require "rails/test_unit/railtie"
9
13
 
10
14
  Bundler.require(*Rails.groups)
@@ -25,4 +29,3 @@ module Dummy
25
29
  config.i18n.default_locale = :en
26
30
  end
27
31
  end
28
-
@@ -25,5 +25,5 @@ Dummy::Application.configure do
25
25
  # Debug mode disables concatenation and preprocessing of assets.
26
26
  # This option may cause significant delays in view rendering with a large
27
27
  # number of complex assets.
28
- config.assets.debug = true
28
+ # config.assets.debug = true
29
29
  end
@@ -33,4 +33,9 @@ Dummy::Application.configure do
33
33
 
34
34
  # Print deprecation notices to the stderr.
35
35
  config.active_support.deprecation = :stderr
36
+
37
+ # Allow unsafe YAML loading for tests with Rails >= 6
38
+ if defined?(ActiveRecord::Base) && ActiveRecord::Base.respond_to?(:use_yaml_unsafe_load=)
39
+ ActiveRecord::Base.use_yaml_unsafe_load = true
40
+ end
36
41
  end
Binary file