activeadmin_settings_cached 1.0.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e214739b6eca1a486545cefe32eb257458bfd36a
4
- data.tar.gz: c147f55eb31ce99ad8bbf62e5453b4808731ed54
3
+ metadata.gz: a9f431cda46f273c027277f759dd4072f57a74c8
4
+ data.tar.gz: 532fbe14c373077e49bb431db5702836429e7d9d
5
5
  SHA512:
6
- metadata.gz: 49f30841e90bd9c3591402608ea9ebebd3adb612e603d9a59ec03d3491fc8bb41b70a5b098367336682ba0a8fa565f68acc8c6acdbbd2b5ff67bf5151fef8263
7
- data.tar.gz: 4fdda684442e6bf1e7ca452305dce446295c651a73467180a7d720901b2c595d98793e488f2ffecaa2656f5fa99aa6e0c70655cd065624739df8437af1350f7d
6
+ metadata.gz: 2f3d082e1f588e1f86207b1efe3dd4f0971fcef11862418fc41adc61bb1a71991fd1b6bf07af6f1f06da491a6c5b300fcda417149406f08fd410cc66123cdf5b
7
+ data.tar.gz: a9911d042145d5f126ee0faf578650615a971e5ac9bdead4cab311e84bcd7dbe50a54e9da9bfe68cb3c82289d2f47a96420333882c6b467293663d2956a31746
data/.gitignore CHANGED
@@ -6,9 +6,12 @@
6
6
  /doc/
7
7
  /pkg/
8
8
  /spec/reports/
9
+ /spec/rails/
9
10
  /tmp/
10
11
  *.bundle
11
12
  *.so
12
13
  *.o
13
14
  *.a
15
+ .ruby-version
16
+ .idea
14
17
  mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ script:
2
+ - bundle exec rspec spec
3
+ rvm:
4
+ - 2.0.0
5
+ - 2.1.5
6
+ - 2.2.0
7
+ - 2.3.0
8
+ before_install:
9
+ - gem install bundler -v '= 1.9.3'
10
+ - gem update --system
11
+ - gem --version
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in activeadmin_settings_cached.gemspec
3
+ group :test do
4
+ #gem 'turbolinks'
5
+ gem 'activeadmin', github: 'activeadmin/activeadmin', branch: 'ab1d8d1a4a1af748ae7009d9d725193d780d0059'
6
+ end
7
+
4
8
  gemspec
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Activeadmin Settings Cached
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/activeadmin_settings_cached.svg)](http://badge.fury.io/rb/activeadmin_settings_cached)
4
+ [![Build Status](https://travis-ci.org/artofhuman/activeadmin_settings_cached.svg?branch=master)](https://travis-ci.org/artofhuman/activeadmin_settings_cached)
4
5
 
5
6
  Provides a nice UI interface for [rails-settings-cached](https://github.com/huacnlee/rails-settings-cached) gem in [Active Admin](http://activeadmin.info/).
6
7
 
@@ -21,12 +22,9 @@ Create your settings model:
21
22
  $ rails g settings Settings
22
23
  $ bundle exec rake db:migrate
23
24
 
24
- Add a route in config/routes.rb
25
+ Create your settings page:
25
26
 
26
- ``` ruby
27
- ActiveAdmin.routes(self)
28
- mount ActiveadminSettingsCached::Engine => '/admin'
29
- ```
27
+ $ rails g active_admin:settings Settings
30
28
 
31
29
  And configure your default values in your Settings model:
32
30
 
@@ -38,6 +36,28 @@ end
38
36
 
39
37
  In your application's admin interface, there will now be a new page with this setting
40
38
 
39
+ ## active_admin_settings_page DSL
40
+
41
+ #### Basic usage
42
+
43
+ ```ruby
44
+ ActiveAdmin.register_page 'Settings' do
45
+ menu label: 'Settings', priority: 99
46
+ active_admin_settings_page options
47
+ end
48
+ ```
49
+
50
+ #### Options
51
+ Tool | Description
52
+ --------------------- | -----------
53
+ :model_name |String, settings model name override (default: uses name from global config.)
54
+ :starting_with |String, each key must starting with, (default: nil)
55
+ :template |String, custom template rendering (default: 'admin/settings/index')
56
+ :template_object |object passing to view (default: ActiveadminSettingsCached::Model instance)
57
+ :display |Hash, display settings override (default: {})
58
+ :title |String, title value override (default: I18n.t('settings.menu.label'))
59
+
60
+
41
61
  ## Localization
42
62
  You can localize settings keys in local file
43
63
 
@@ -45,8 +65,7 @@ You can localize settings keys in local file
45
65
  en:
46
66
  settings:
47
67
  attributes:
48
- my_awesome_settings:
49
- name: 'My Awesome Lolaized Setting'
68
+ my_awesome_settings: 'My Awesome Lolaized Setting'
50
69
  ```
51
70
  ## Model name
52
71
 
@@ -65,7 +84,7 @@ If you need define display options for settings fields, eg textarea, url or :tim
65
84
 
66
85
  ``` ruby
67
86
  ActiveadminSettingsCached.configure do |config|
68
- condig.display = {
87
+ config.display = {
69
88
  my_awesome_setting_name: :text,
70
89
  my_awesome_setting_name_2: :timestamp,
71
90
  my_awesome_setting_name_3: :select
@@ -74,3 +93,11 @@ end
74
93
  ```
75
94
 
76
95
  Available options see [here](https://github.com/justinfrench/formtastic#the-available-inputs)
96
+
97
+ ## Contributing
98
+
99
+ 1. Fork it
100
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
101
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
102
+ 4. Push to the branch (`git push origin my-new-feature`)
103
+ 5. Create new Pull Request
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler'
2
+ require 'rake'
3
+ Bundler.setup
4
+ Bundler::GemHelper.install_tasks
2
5
 
6
+ # Import all our rake tasks
7
+ FileList['tasks/**/*.rake'].each { |task| import task }
@@ -19,8 +19,16 @@ Gem::Specification.new do |s|
19
19
  s.require_paths = ["lib"]
20
20
 
21
21
  s.add_dependency 'activeadmin'
22
- s.add_dependency 'rails-settings-cached'
22
+ s.add_dependency 'rails-settings-cached', '>= 0.5.3'
23
23
 
24
24
  s.add_development_dependency "bundler"
25
25
  s.add_development_dependency "rake"
26
+ s.add_development_dependency "coveralls"
27
+
28
+ s.add_development_dependency "database_cleaner"
29
+ s.add_development_dependency "sqlite3"
30
+ s.add_development_dependency "rspec-rails"
31
+ s.add_development_dependency "capybara"
32
+ s.add_development_dependency "selenium-webdriver"
33
+ s.add_development_dependency "poltergeist"
26
34
  end
@@ -1,5 +1,5 @@
1
1
  <div>
2
- <%= semantic_form_for :settings, :method => :put, url: activeadmin_settings_cached.settings_path do |f| %>
2
+ <%= semantic_form_for :settings, :method => :post, url: {action: :update} do |f| %>
3
3
  <table id="settings" class="index_table index">
4
4
  <thead>
5
5
  <tr>
@@ -8,12 +8,12 @@
8
8
  </tr>
9
9
  </thead>
10
10
  <tbody>
11
- <% ActiveadminSettingsCached.settings.each_pair do |name, value| %>
11
+ <% settings_model.settings.each_pair do |name, _| %>
12
12
  <tr class="odd">
13
- <td><strong><%= f.label t("settings.attributes.#{name}.name", default: name) %></strong></td>
13
+ <td><strong><%= f.label t("settings.attributes.#{name}", default: name) %></strong></td>
14
14
  <td>
15
15
  <div class='form'>
16
- <ol><%= f.input name, settings_field_options(name) %></ol>
16
+ <ol><%= f.input name, settings_model.field_options(name) %></ol>
17
17
  </div>
18
18
  </td>
19
19
  </tr>
@@ -1,4 +1,4 @@
1
- require "activeadmin_settings_cached/engine"
1
+ require 'activeadmin_settings_cached/engine'
2
2
 
3
3
  module ActiveadminSettingsCached
4
4
  class Configuration
@@ -21,23 +21,5 @@ module ActiveadminSettingsCached
21
21
  def configure
22
22
  yield config
23
23
  end
24
-
25
- def settings
26
- defaults.merge! config.model_name.public_send(meth)
27
- end
28
-
29
- def defaults
30
- config.model_name.defaults
31
- end
32
-
33
- private
34
-
35
- def meth
36
- if Rails.version >= '4.1.0'
37
- :get_all
38
- else
39
- :all
40
- end
41
- end
42
24
  end
43
25
  end
@@ -0,0 +1,60 @@
1
+ module ActiveadminSettingsCached
2
+ class Coercions
3
+ SIMPLE_COERCIONS = {
4
+ float: :to_f,
5
+ integer: :to_i,
6
+ symbol: :to_sym
7
+ }
8
+ attr_reader :defaults, :display
9
+
10
+ def initialize(defaults, display)
11
+ @defaults = defaults
12
+ @display = display
13
+
14
+ init_methods
15
+ end
16
+
17
+ def cast_params(params)
18
+ coerced_params = params.map do |name, value|
19
+ [name, cast_value(name, value)]
20
+ end
21
+
22
+ return coerced_params unless block_given?
23
+
24
+ coerced_params.each do |name, value|
25
+ yield(name, value.call)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def coerce(m, &block)
32
+ define_singleton_method :"string_to_#{m.to_s}", &block
33
+ end
34
+
35
+ def init_methods
36
+ coerce :boolean do |value|
37
+ value && %w(true 1 yes y t).include?(value)
38
+ end
39
+
40
+ SIMPLE_COERCIONS.each do |k, v|
41
+ coerce(k) { |value| String(value).send(v) }
42
+ end
43
+ end
44
+
45
+ def cast_value(name, value)
46
+ case defaults[name]
47
+ when TrueClass, FalseClass
48
+ display[name].to_s == 'boolean' ? -> { string_to_boolean(value) } : -> { value }
49
+ when Integer
50
+ -> { string_to_integer(value) }
51
+ when Float
52
+ -> { string_to_float(value) }
53
+ when Symbol
54
+ -> { string_to_symbol(value) }
55
+ else
56
+ -> { value }
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveadminSettingsCached
2
+ module DSL
3
+ # Declares settings function
4
+ #
5
+ # Options:
6
+ # +model_name+:: settings model name override (default: uses name from global config.)
7
+ # +starting_with+:: each key must starting with, (default: nil)
8
+ # +template+:: custom template rendering (default: 'admin/settings/index')
9
+ # +template_object+:: object to use in templates (default: ActiveadminSettingsCached::Model instance)
10
+ # +display+:: display settings override (default: nil)
11
+ # +title+:: title value override (default: I18n.t('settings.menu.label'))
12
+ #
13
+ def active_admin_settings_page(options = {}, &block)
14
+ options.assert_valid_keys(*Options::VALID_OPTIONS)
15
+
16
+ options = Options.options_for(options)
17
+ coercion = Coercions.new(options[:template_object].defaults, options[:template_object].display)
18
+
19
+ content title: options[:title] do
20
+ render partial: options[:template], locals: { settings_model: options[:template_object] }
21
+ end
22
+
23
+ page_action :update, method: :post do
24
+ settings_params = params.require(:settings).permit(options[:template_object].defaults.keys)
25
+
26
+ coercion.cast_params(settings_params) do |name, value|
27
+ options[:template_object][name] = value
28
+ end
29
+
30
+ flash[:success] = t('activeadmin_settings_cached.settings.update.success'.freeze)
31
+ redirect_to :back
32
+ end
33
+
34
+ instance_eval(&block) if block_given?
35
+ end
36
+ end
37
+ end
@@ -1,13 +1,13 @@
1
1
  require 'rails-settings-cached'
2
+ require 'active_admin'
2
3
 
3
4
  module ActiveadminSettingsCached
4
5
  class Engine < Rails::Engine
5
- isolate_namespace ActiveadminSettingsCached
6
+ config.mount_at = '/'
7
+ config.autoload_paths += Dir["#{config.root}/lib"]
6
8
 
7
- initializer 'activeadmin_settings_cached.admin' do
8
- ActiveAdmin.before_load do |app|
9
- app.load_paths << File.expand_path("../../../app/admin", __FILE__)
10
- end
9
+ initializer 'activeadmin_settings_cached' do
10
+ ActiveAdmin::DSL.send(:include, ActiveadminSettingsCached::DSL)
11
11
  end
12
12
  end
13
13
  end
@@ -0,0 +1,101 @@
1
+ module ActiveadminSettingsCached
2
+ class Model
3
+ include ActiveModel::Model
4
+
5
+ attr_reader :attributes
6
+
7
+ def initialize(args = {})
8
+ @attributes = {}
9
+ args[:model_name] = args[:model_name].constantize if args[:model_name].is_a? String
10
+ args[:display] = default_attributes[:display].merge!(args[:display]) if args[:display]
11
+ assign_attributes(merge_attributes(args))
12
+ end
13
+
14
+ def field_options(settings_name)
15
+ default_value = defaults[settings_name]
16
+ value = settings[settings_name]
17
+
18
+ input_opts = if default_value.is_a?(Array)
19
+ {
20
+ collection: default_value,
21
+ selected: value,
22
+ }
23
+ elsif (default_value.is_a?(TrueClass) || default_value.is_a?(FalseClass)) &&
24
+ display[settings_name].to_s == 'boolean'
25
+ {
26
+ input_html: { checked: value }, label: '', checked_value: 'true', unchecked_value: 'false'
27
+ }
28
+ else
29
+ {
30
+ input_html: { value: value, placeholder: default_value },
31
+ }
32
+ end
33
+
34
+ { as: display[settings_name], label: false }
35
+ .merge!(input_opts)
36
+ end
37
+
38
+ def settings
39
+ data = load_settings
40
+ ActiveSupport::OrderedHash[data.to_a.sort { |a, b| a.first <=> b.first }] if data
41
+ end
42
+
43
+ def defaults
44
+ settings_model.defaults
45
+ end
46
+
47
+ def display
48
+ attributes[:display]
49
+ end
50
+
51
+ def [](param)
52
+ settings_model[param]
53
+ end
54
+
55
+ def []=(param, value)
56
+ settings_model[param] = value
57
+ end
58
+
59
+ def persisted?
60
+ false
61
+ end
62
+
63
+ alias_method :to_hash, :attributes
64
+
65
+ protected
66
+
67
+ def load_settings
68
+ settings_model.public_send(meth, attributes[:starting_with])
69
+ end
70
+
71
+ def assign_attributes(args = {})
72
+ @attributes.merge!(args)
73
+ end
74
+
75
+ def default_attributes
76
+ {
77
+ starting_with: nil,
78
+ model_name: ActiveadminSettingsCached.config.model_name,
79
+ display: ActiveadminSettingsCached.config.display
80
+ }
81
+ end
82
+
83
+ def merge_attributes(args)
84
+ default_attributes.each_with_object({}) do |(k, v), h|
85
+ h[k] = args[k] || v
86
+ end
87
+ end
88
+
89
+ def settings_model
90
+ attributes[:model_name]
91
+ end
92
+
93
+ def meth
94
+ if Rails.version >= '4.1.0'
95
+ :get_all
96
+ else
97
+ :all
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveadminSettingsCached
2
+ module Options
3
+ VALID_OPTIONS = [
4
+ :model_name,
5
+ :starting_with,
6
+ :template,
7
+ :template_object,
8
+ :display,
9
+ :title
10
+ ].freeze
11
+
12
+ def self.options_for(options = {})
13
+ options[:template_object] = ActiveadminSettingsCached::Model.new(options) unless options[:template_object]
14
+
15
+ {
16
+ template: 'admin/settings/index',
17
+ title: I18n.t('settings.menu.label')
18
+ }.deep_merge(options)
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveadminSettingsCached
2
- VERSION = "1.0.1"
2
+ VERSION = '2.0.0'
3
3
  end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Registers settings with Active Admin
3
+
4
+ Example:
5
+ rails generate active_admin:settings Thing
6
+
7
+ This will create:
8
+ app/admin/thing.rb
@@ -0,0 +1,11 @@
1
+ module ActiveadminSettingsCached
2
+ module Generators
3
+ class SettingsGenerator < Rails::Generators::NamedBase
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ def generate_config_file
7
+ template 'settings.rb', "app/admin/#{file_path.tr('/', '_')}.rb"
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ ActiveAdmin.register_page '<%= class_name %>' do
2
+ title = '<%= class_name %>'
3
+ menu label: title
4
+ active_admin_settings_page(title: title)
5
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe ActiveadminSettingsCached::Coercions do
4
+ let(:display) { Hash['base.first_setting' => 'string', 'base.second_setting' => 'boolean',
5
+ 'base.third_setting' => 'number', 'base.four_setting' => 'number',
6
+ 'second.first_setting' => 'boolean', 'second.second_setting' => 'string'].with_indifferent_access }
7
+ let(:defaults) { Hash['base.first_setting' => 'AAA', 'base.second_setting' => true, 'base.third_setting' => 5,
8
+ 'base.four_setting' => 5.5, 'base.five_setting' => :aaa, 'second.first_setting' => false,
9
+ 'second.second_setting' => 'BBB'].with_indifferent_access }
10
+ let(:right_params) { ActionController::Parameters.new(Hash['base.first_setting' => 'BBB', 'base.second_setting' => 'false', 'base.third_setting' => '155',
11
+ 'base.four_setting' => '55.5', 'base.five_setting' => 'bbb', 'second.first_setting' => 'true',
12
+ 'second.second_setting' => 'AAA']) }
13
+ let(:wrong_params) { ActionController::Parameters.new(Hash['base.second_setting' => 'hjgj', 'base.third_setting' => 'fhfh',
14
+ 'base.four_setting' => 'gjfhg', 'second.first_setting' => 'ggf']) }
15
+ let(:no_params) { ActionController::Parameters.new(Hash[]) }
16
+
17
+ before do
18
+ @coercions = ActiveadminSettingsCached::Coercions.new(defaults, display)
19
+ end
20
+
21
+ it 'when good params' do
22
+ expect { |b|
23
+ @coercions.cast_params right_params, &b
24
+ }.to yield_successive_args(['base.first_setting', 'BBB'], ['base.second_setting', false],
25
+ ['base.third_setting', 155], ['base.four_setting', 55.5],
26
+ ['base.five_setting', :bbb], ['second.first_setting', true],
27
+ ['second.second_setting', 'AAA'])
28
+ end
29
+
30
+ it 'when wrong params' do
31
+ expect { |b|
32
+ @coercions.cast_params wrong_params, &b
33
+ }.to yield_successive_args(['base.second_setting', false], ['base.third_setting', 0],
34
+ ['base.four_setting', 0.0], ['second.first_setting', false])
35
+ end
36
+
37
+ it 'when no params' do
38
+ expect { |b|
39
+ @coercions.cast_params no_params, &b
40
+ }.not_to yield_control
41
+ end
42
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe ActiveadminSettingsCached::Model do
4
+ include ActiveModel::Lint::Tests
5
+
6
+ ActiveModel::Lint::Tests.public_instance_methods.map{|m| m.to_s}.grep(/^test/).each do |m|
7
+ example m.gsub('_',' ') do
8
+ send m
9
+ end
10
+ end
11
+
12
+ def model
13
+ subject
14
+ end
15
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe 'settings', type: :feature, js: true do
4
+ before do
5
+ Setting.defaults['base.first_setting'] = 'AAA'
6
+ Setting.defaults['base.second_setting'] = true
7
+ Setting.defaults['base.third_setting'] = 5
8
+ Setting.defaults['base.four_setting'] = 5.50
9
+ Setting.defaults['base.five_setting'] = :aaa
10
+ Setting.defaults['second.first_setting'] = false
11
+ Setting.defaults['second.second_setting'] = 'BBB'
12
+ Setting['base.first_setting'] = 'AAA'
13
+ Setting['base.second_setting'] = true
14
+ Setting['second.first_setting'] = false
15
+ Setting['second.second_setting'] = 'BBB'
16
+ end
17
+
18
+ context 'global config' do
19
+ before do
20
+ ActiveadminSettingsCached.configure do |config|
21
+ config.display = {'base.first_setting' => 'string', 'base.second_setting' => 'boolean',
22
+ 'base.third_setting' => 'number', 'base.four_setting' => 'number',
23
+ 'second.first_setting' => 'boolean', 'second.second_setting' => 'string'}
24
+ end
25
+ add_setting_resource
26
+ add_second_setting_resource
27
+ add_all_setting_resource
28
+ end
29
+
30
+ context 'all setting index' do
31
+ it 'when list' do
32
+ visit '/admin/settings'
33
+ check_base_setting
34
+ check_second_setting
35
+ end
36
+
37
+ it 'when save' do
38
+ visit '/admin/settings'
39
+ check_base_setting
40
+ check_second_setting
41
+ fill_base_setting
42
+ fill_second_setting
43
+ submit
44
+ fill_base_setting_check
45
+ fill_second_setting_check
46
+ end
47
+ end
48
+ end
49
+
50
+ context 'with custom template_object' do
51
+ context 'when right object' do
52
+ before do
53
+ template_object = ActiveadminSettingsCached::Model.new(display: {'base.first_setting' => 'string', 'base.second_setting' => 'boolean',
54
+ 'base.third_setting' => 'number', 'base.four_setting' => 'number',
55
+ 'second.first_setting' => 'boolean', 'second.second_setting' => 'string'})
56
+ add_all_setting_resource(template_object: template_object)
57
+ end
58
+
59
+ it do
60
+ visit '/admin/base_settings'
61
+ check_base_setting
62
+ end
63
+ end
64
+
65
+ context 'when wrong object' do
66
+ before do
67
+ template_object = nil
68
+ add_all_setting_resource(template_object: template_object)
69
+ end
70
+
71
+ it do
72
+ visit '/admin/base_settings'
73
+ check_base_setting
74
+ end
75
+ end
76
+ end
77
+
78
+ context 'per page' do
79
+ before do
80
+ ActiveadminSettingsCached.configure do |config|
81
+ config.display = {}
82
+ end
83
+ add_setting_resource(display: {'base.first_setting' => 'string', 'base.second_setting' => 'boolean',
84
+ 'base.third_setting' => 'number', 'base.four_setting' => 'number'})
85
+ add_second_setting_resource(display: {'second.first_setting' => 'boolean', 'second.second_setting' => 'string'})
86
+ add_all_setting_resource(display: {'base.first_setting' => 'string', 'base.second_setting' => 'boolean',
87
+ 'base.third_setting' => 'number', 'base.four_setting' => 'number',
88
+ 'second.first_setting' => 'boolean', 'second.second_setting' => 'string'})
89
+ end
90
+
91
+ context 'setting index' do
92
+ it 'when list' do
93
+ visit '/admin/base_settings'
94
+ check_base_setting
95
+ end
96
+
97
+ it 'when save' do
98
+ visit '/admin/base_settings'
99
+ check_base_setting
100
+ fill_base_setting
101
+ submit
102
+ fill_base_setting_check
103
+ end
104
+ end
105
+
106
+ context 'second setting index' do
107
+ it 'when list' do
108
+ visit '/admin/second_settings'
109
+ check_second_setting
110
+ end
111
+
112
+ it 'when save' do
113
+ visit '/admin/second_settings'
114
+ check_second_setting
115
+ fill_second_setting
116
+ submit
117
+ fill_second_setting_check
118
+ end
119
+ end
120
+
121
+ context 'all setting index' do
122
+ it 'when list' do
123
+ visit '/admin/settings'
124
+ check_base_setting
125
+ check_second_setting
126
+ end
127
+
128
+ it 'when save' do
129
+ visit '/admin/settings'
130
+ check_base_setting
131
+ check_second_setting
132
+ fill_base_setting
133
+ fill_second_setting
134
+ submit
135
+ fill_base_setting_check
136
+ fill_second_setting_check
137
+ end
138
+ end
139
+ end
140
+
141
+ def check_base_setting
142
+ expect(page).to have_selector("input[value='#{Setting['base.first_setting']}']")
143
+ end
144
+
145
+ def check_second_setting
146
+ expect(page).to have_selector("input[value='#{Setting['second.second_setting']}']")
147
+ end
148
+
149
+ def fill_base_setting
150
+ fill_in('settings_base.first_setting', with: 'BBB')
151
+ uncheck('settings_base.second_setting')
152
+ fill_in('settings_base.third_setting', with: 100)
153
+ fill_in('settings_base.four_setting', with: 150.55)
154
+ fill_in('settings_base.five_setting', with: 'bbb')
155
+
156
+ end
157
+
158
+ def fill_second_setting
159
+ fill_in('settings_second.second_setting', with: 'AAA')
160
+ check('settings_second.first_setting')
161
+ end
162
+
163
+ def fill_base_setting_check
164
+ expect(Setting['base.first_setting']).to eq 'BBB'
165
+ expect(Setting['base.second_setting']).to eq false
166
+ expect(Setting['base.third_setting']).to eq 100
167
+ expect(Setting['base.four_setting']).to eq 150.55
168
+ expect(Setting['base.five_setting']).to eq :bbb
169
+ end
170
+
171
+ def fill_second_setting_check
172
+ expect(Setting['second.second_setting']).to eq 'AAA'
173
+ expect(Setting['second.first_setting']).to eq true
174
+ end
175
+
176
+ def submit
177
+ click_on('Save Settings')
178
+ end
179
+ end
@@ -0,0 +1,65 @@
1
+ require 'database_cleaner'
2
+
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ $LOAD_PATH << File.expand_path('../support', __FILE__)
8
+
9
+ ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
10
+ require 'bundler'
11
+ Bundler.setup
12
+
13
+ ENV['RAILS_ENV'] = 'test'
14
+ # Ensure the Active Admin load path is happy
15
+ require 'rails'
16
+ ENV['RAILS'] = Rails.version
17
+ ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{ENV['RAILS']}", __FILE__)
18
+ # Create the test app if it doesn't exists
19
+ unless File.exists?(ENV['RAILS_ROOT'])
20
+ system 'rake setup'
21
+ end
22
+
23
+ require 'active_model'
24
+ # require ActiveRecord to ensure that Ransack loads correctly
25
+ require 'active_record'
26
+ require 'active_admin'
27
+ ActiveAdmin.application.load_paths = [ENV['RAILS_ROOT'] + '/app/admin']
28
+ require ENV['RAILS_ROOT'] + '/config/environment.rb'
29
+ # Disabling authentication in specs so that we don't have to worry about
30
+ # it allover the place
31
+ ActiveAdmin.application.authentication_method = false
32
+ ActiveAdmin.application.current_user_method = false
33
+
34
+ require 'rspec/rails'
35
+ require 'support/admin'
36
+ require 'capybara/rails'
37
+ require 'capybara/rspec'
38
+
39
+ unless ENV['CAPYBARA_FIREFOX']
40
+ require 'capybara/poltergeist'
41
+
42
+ Capybara.register_driver :poltergeist do |app|
43
+ Capybara::Poltergeist::Driver.new(app, {
44
+ js_errors: true,
45
+ timeout: 80,
46
+ debug: true,
47
+ :phantomjs_options => ['--debug=no', '--load-images=no']
48
+
49
+ })
50
+ end
51
+
52
+ Capybara.javascript_driver = :poltergeist
53
+ end
54
+
55
+ RSpec.configure do |config|
56
+ DatabaseCleaner.strategy = :truncation
57
+
58
+ config.before(:each) do
59
+ DatabaseCleaner.start
60
+ end
61
+
62
+ config.after(:each) do
63
+ DatabaseCleaner.clean
64
+ end
65
+ end
@@ -0,0 +1,26 @@
1
+ def add_setting_resource(options = {}, &block)
2
+ options.merge!({model_name: 'Setting', starting_with: 'base.', title: 'Base Settings'})
3
+ ActiveAdmin.register_page options[:title] do
4
+ menu label: options[:title], priority: 99, parent: 'settings'
5
+ active_admin_settings_page(options, &block)
6
+ end
7
+ Rails.application.reload_routes!
8
+ end
9
+
10
+ def add_second_setting_resource(options = {}, &block)
11
+ options.merge!({model_name: 'Setting', starting_with: 'second.', title: 'Second Settings'})
12
+ ActiveAdmin.register_page options[:title] do
13
+ menu label: options[:title], priority: 99, parent: 'settings'
14
+ active_admin_settings_page(options, &block)
15
+ end
16
+ Rails.application.reload_routes!
17
+ end
18
+
19
+ def add_all_setting_resource(options = {}, &block)
20
+ options.merge!({model_name: 'Setting', title: 'Settings'})
21
+ ActiveAdmin.register_page options[:title] do
22
+ menu label: options[:title], priority: 99, id: 'settings'
23
+ active_admin_settings_page(options, &block)
24
+ end
25
+ Rails.application.reload_routes!
26
+ end
@@ -0,0 +1,20 @@
1
+ # Rails template to build the sample app for specs
2
+
3
+ generate :settings, 'Setting'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+
7
+ generate :'active_admin:install --skip-users'
8
+ generate :'formtastic:install'
9
+
10
+ # Configure Setup
11
+ inject_into_file 'config/initializers/active_admin.rb', <<-RUBY, before: "ActiveAdmin.setup do |config|"
12
+ ActiveadminSettingsCached.configure do |config|
13
+ config.model_name = 'Setting'
14
+ end
15
+ RUBY
16
+
17
+ route "root :to => 'admin/dashboard#index'"
18
+
19
+ rake 'db:migrate'
20
+ rake 'db:test:prepare'
data/tasks/test.rake ADDED
@@ -0,0 +1,22 @@
1
+ desc 'Creates a test rails app for the specs to run against'
2
+ task :setup do
3
+ require 'rails/version'
4
+ if File.exists? dir = "spec/rails/rails-#{Rails::VERSION::STRING}"
5
+ puts "test app #{dir} already exists; skipping"
6
+ else
7
+ system 'mkdir -p spec/rails'
8
+
9
+ args = %w[
10
+ -m\ spec/support/rails_template.rb
11
+ --skip-gemfile
12
+ --skip-bundle
13
+ --skip-git
14
+ --skip-keeps
15
+ --skip-turbolinks
16
+ --skip-test-unit
17
+ --skip-spring
18
+ ]
19
+
20
+ system "bundle exec rails new #{dir} #{args.join ' '}"
21
+ end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeadmin_settings_cached
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Semyon Pupkov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-24 00:00:00.000000000 Z
11
+ date: 2016-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activeadmin
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 0.5.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 0.5.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,104 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sqlite3
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: capybara
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: selenium-webdriver
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: poltergeist
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
69
167
  description: UI interface for rails-settings-cached in active admin
70
168
  email:
71
169
  - semen.pupkov@gmail.com
@@ -74,21 +172,32 @@ extensions: []
74
172
  extra_rdoc_files: []
75
173
  files:
76
174
  - ".gitignore"
175
+ - ".travis.yml"
77
176
  - Gemfile
78
177
  - LICENSE.txt
79
178
  - README.md
80
179
  - Rakefile
81
180
  - activeadmin_settings_cached.gemspec
82
- - app/admin/settings.rb
83
- - app/controllers/activeadmin_settings_cached/settings_controller.rb
84
- - app/helpers/settings_helper.rb
85
181
  - app/views/admin/settings/_index.html.erb
86
182
  - config/locales/en.yml
87
183
  - config/locales/ru.yml
88
- - config/routes.rb
89
184
  - lib/activeadmin_settings_cached.rb
185
+ - lib/activeadmin_settings_cached/coercions.rb
186
+ - lib/activeadmin_settings_cached/dsl.rb
90
187
  - lib/activeadmin_settings_cached/engine.rb
188
+ - lib/activeadmin_settings_cached/model.rb
189
+ - lib/activeadmin_settings_cached/options.rb
91
190
  - lib/activeadmin_settings_cached/version.rb
191
+ - lib/generators/active_admin/settings/USAGE
192
+ - lib/generators/active_admin/settings/settings_generator.rb
193
+ - lib/generators/active_admin/settings/templates/settings.rb
194
+ - spec/coercions_spec.rb
195
+ - spec/model_spec.rb
196
+ - spec/settings_spec.rb
197
+ - spec/spec_helper.rb
198
+ - spec/support/admin.rb
199
+ - spec/support/rails_template.rb
200
+ - tasks/test.rake
92
201
  homepage: https://github.com/artofhuman/activeadmin_settings_cached
93
202
  licenses:
94
203
  - MIT
@@ -109,8 +218,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
218
  version: '0'
110
219
  requirements: []
111
220
  rubyforge_project:
112
- rubygems_version: 2.4.6
221
+ rubygems_version: 2.4.5
113
222
  signing_key:
114
223
  specification_version: 4
115
224
  summary: UI interface for rails-settings-cached in active admin
116
- test_files: []
225
+ test_files:
226
+ - spec/coercions_spec.rb
227
+ - spec/model_spec.rb
228
+ - spec/settings_spec.rb
229
+ - spec/spec_helper.rb
230
+ - spec/support/admin.rb
231
+ - spec/support/rails_template.rb
@@ -1,13 +0,0 @@
1
- ActiveAdmin.register_page "Settings" do
2
- title = proc { I18n.t('settings.menu.label') }
3
-
4
- menu label: title, priority: 99
5
-
6
- content title: title do
7
- render partial: 'admin/settings/index'
8
- end
9
-
10
- controller do
11
- helper :settings
12
- end
13
- end
@@ -1,22 +0,0 @@
1
- module ActiveadminSettingsCached
2
- class SettingsController < ApplicationController
3
- def update
4
- settings_params.each_pair do |name, value|
5
- settings_model[name] = value
6
- end
7
-
8
- flash[:success] = t('.success'.freeze)
9
- redirect_to :back
10
- end
11
-
12
- private
13
-
14
- def settings_params
15
- params.require(:settings).permit(settings_model.defaults.keys)
16
- end
17
-
18
- def settings_model
19
- ActiveadminSettingsCached.config.model_name
20
- end
21
- end
22
- end
@@ -1,20 +0,0 @@
1
- module SettingsHelper
2
- def settings_field_options(settings_name)
3
- default_value = ActiveadminSettingsCached.defaults[settings_name]
4
- value = ActiveadminSettingsCached.settings[settings_name]
5
-
6
- input_opts = if default_value.is_a?(Array)
7
- {
8
- collection: default_value,
9
- selected: value,
10
- }
11
- else
12
- {
13
- input_html: {value: value, placeholder: default_value},
14
- }
15
- end
16
-
17
- {as: ActiveadminSettingsCached.config.display[settings_name], label: false}
18
- .merge!(input_opts)
19
- end
20
- end
data/config/routes.rb DELETED
@@ -1,3 +0,0 @@
1
- ActiveadminSettingsCached::Engine.routes.draw do
2
- resource :settings, only: :update
3
- end