activeadmin_settings_cached 1.0.1 → 2.0.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.
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