active_settings 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YWQ0NTJiMmViYWU4ZWFmNDRkMDJhYWQzZjQ1YTNmZTNmZDhjMjI3NA==
5
+ data.tar.gz: !binary |-
6
+ MjhiZTMzYTQ4NzIwYmNlYjJiNzYzOGI0YzJhODM3OWVhM2U5M2FkZQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ Njc3YTE3OTZhNmQ4NjRlN2I5ZTk0MjU3MThjYWQ3OGU4YzcyYzU0MjE3YjZk
10
+ OWY1NjhkMDcxMDg0YTM0ZjVhZTY0YmQwOGYzYTY2MzNiZjRmOTFkYTBhNGU5
11
+ Mjg4ZGU0YjEwOWVhYWJmZjVkZGExNGE4MjcxYTJlOGFiYjliNGQ=
12
+ data.tar.gz: !binary |-
13
+ N2U2MTM2OWQ4NTlhNzM1NTQwMjU0NjQzZWYzNzlmMWYzNWQxYTVmMzY5Mjkx
14
+ MmM4Y2UyZDkyMTc1MzNkZjFhOWRjYzgxMjkwMDk3ODllODRjODc2NmE4MmRk
15
+ NWExYjAxMTNjZWU4Mzg3OWYwYzRlNDM3OGVhODdlNWVhMzViZjc=
@@ -0,0 +1,10 @@
1
+ require 'rails'
2
+ require 'active_settings/version'
3
+ require 'active_settings/config'
4
+ require 'active_settings/engine'
5
+
6
+ module ActiveSettings
7
+ def self.detail
8
+ ActiveSettings::Config
9
+ end
10
+ end
@@ -0,0 +1,287 @@
1
+ module ActiveSettings
2
+
3
+ class << self
4
+ def config_definitions
5
+ @config_definitions ||= {}
6
+ end
7
+
8
+ def config_definitions=(definitions)
9
+ @config_definitions = definitions
10
+ end
11
+ end
12
+
13
+ class Config < ActiveRecord::Base
14
+ #
15
+ # The ActiveSettings.detail model class is stored in the database but emulates a hash
16
+ # with simple bracket methods that allow you to get and set values like so:
17
+ #
18
+ # ActiveSettings.detail['setting.name'] = 'value'
19
+ # ActiveSettings.detail['setting.name'] #=> "value"
20
+ #
21
+ # Config entries can be used freely as general-purpose global variables unless a definition
22
+ # has been given for that key, in which case restrictions and defaults may apply. The restrictions
23
+ # can take the form of validations, requirements, permissions or permitted options. They are
24
+ # declared by calling ActiveSettings::Config#define:
25
+ #
26
+ # # setting must be either 'foo', 'bar' or 'blank'
27
+ # define('admin.name', :select_from => ['foo', 'bar'])
28
+ #
29
+ # # setting is (and must be) chosen from the names of currently available layouts
30
+ # define('shop.layout', :select_from => lambda { Layout.all.map{|l| [l.name,l.id]} }, :allow_blank => false)
31
+ #
32
+ # # setting cannot be changed at runtime
33
+ # define('setting.important', :default => "something", :allow_change => false)
34
+ #
35
+ # Which almost always happens in a block like this:
36
+ #
37
+ # ActiveSettings.detail.configure do |config|
38
+ # config.namespace('user', :allow_change => true) do |user|
39
+ # user.define 'allow_password_reset?', :default => true
40
+ # end
41
+ # end
42
+ #
43
+ # and usually in a config/active_settings.rb file in the application directory.
44
+ #
45
+ # admin.title :: the title of the admin system
46
+ # admin.subtitle :: the subtitle of the admin system
47
+ # defaults.page.parts :: a comma separated list of default page parts
48
+ # defaults.page.status :: a string representation of the default page status
49
+ # defaults.page.filter :: the default filter to use on new page parts
50
+ # defaults.page.fields :: a comma separated list of the default page fields
51
+ # defaults.snippet.filter :: the default filter to use on new snippets
52
+ # dev.host :: the hostname where draft pages are viewable
53
+ # local.timezone :: the timezone name (`rake -D time` for full list)
54
+ # used to correct displayed times
55
+ # page.edit.published_date? :: when true, shows the datetime selector
56
+ # for published date on the page edit screen
57
+ #
58
+ #
59
+
60
+ self.table_name = 'active_settings'
61
+ after_save :update_cache
62
+ attr_reader :definition
63
+
64
+ class ConfigError < RuntimeError; end
65
+
66
+ class << self
67
+
68
+ # Requesting a config item:
69
+ #
70
+ # key = ActiveSettings.detail['key']
71
+ def [](key)
72
+ if table_exists?
73
+ unless ActiveSettings::Config.cache_exists?
74
+ ActiveSettings::Config.initialize_cache
75
+ end
76
+ Rails.cache.read('ActiveSettings::Config')[key]
77
+ end
78
+ end
79
+
80
+ # The usual way to use a config item:
81
+ #
82
+ # ActiveSettings.detail['key'] = value
83
+ #
84
+ def []=(key, value)
85
+ if table_exists?
86
+ setting = find_or_initialize_by_key(key)
87
+ setting.value = value
88
+ end
89
+ end
90
+
91
+ def to_hash
92
+ Hash[ *find(:all).map { |pair| [pair.key, pair.value] }.flatten ]
93
+ end
94
+
95
+ def initialize_cache
96
+ Rails.cache.write('ActiveSettings::Config', ActiveSettings::Config.to_hash)
97
+ Rails.cache.silence!
98
+ end
99
+
100
+ def cache_clear!
101
+ initialize_cache
102
+ end
103
+
104
+ def cache_exists?
105
+ true if Rails.cache.read('ActiveSettings::Config')
106
+ end
107
+
108
+ def configure(&block)
109
+ yield self
110
+ end
111
+
112
+ # A convenient drying method for specifying a prefix and options common to several settings.
113
+ #
114
+ # ActiveSettings.detail.configure do |config|
115
+ # config.namespace('secret', :allow_display => false) do |secret|
116
+ # secret.define('identity', :default => 'batman') # defines 'secret.identity'
117
+ # secret.define('lair', :default => 'batcave') # defines 'secret.lair'
118
+ # secret.define('longing', :default => 'vindication') # defines 'secret.longing'
119
+ # end
120
+ # end
121
+ #
122
+ def namespace(prefix, options = {}, &block)
123
+ prefix = [options[:prefix], prefix].join('.') if options[:prefix]
124
+ with_options(options.merge(:prefix => prefix), &block)
125
+ end
126
+
127
+ # Declares a setting definition that will constrain and support the use of a particular config entry.
128
+ #
129
+ # define('setting.key', options)
130
+ #
131
+ # Can take several options:
132
+ # * :default is the value that will be placed in the database if none has been set already
133
+ # * :type can be :string, :boolean or :integer. Note that all settings whose key ends in ? are considered boolean.
134
+ # * :select_from should be a list or hash suitable for passing to options_for_select, or a block that will return such a list at runtime
135
+ # * :validate_with should be a block that will receive a value and return true or false. Validations are also implied by type or select_from.
136
+ # * :allow_blank should be false if the config item must not be blank or nil
137
+ # * :allow_change should be false if the config item can only be set, not changed. Add a default to specify an unchanging config entry.
138
+ # * :allow_display should be false if the config item should not be showable in radius tags
139
+ #
140
+ # From the main ActiveSettings config/initializers/active_settings.rb:
141
+ #
142
+ # ActiveSettings.detail.configure do |config|
143
+ # config.define 'defaults.locale', :select_from => lambda {Layout.all.map{|l| [l.name, l.d]}}, :allow_blank => true
144
+ # config.define 'defaults.page.parts', :default => "Body,Extended"
145
+ # ...
146
+ # end
147
+ #
148
+ # It's also possible to reuse a definition by passing it to define:
149
+ #
150
+ # choose_layout = ActiveSettings::Config::Definition.new(:select_from => lambda {Layout.all.map{|l| [l.name, l.d]}})
151
+ # define "my.layout", choose_layout
152
+ # define "your.layout", choose_layout
153
+ #
154
+ # but at the moment that's only done in testing.
155
+ #
156
+ def define(key, options={})
157
+ called_from = caller.grep(/\/initializers\//).first
158
+ if options.is_a? ActiveSettings::Config::Definition
159
+ definition = options
160
+ else
161
+ key = [options[:prefix], key].join('.') if options[:prefix]
162
+ end
163
+
164
+ raise LoadError, %{
165
+ Config definition error: '#{key}' is defined twice:
166
+ 1. #{called_from}
167
+ 2. #{definitions[key].definer}
168
+ } unless definitions[key].nil? || definitions[key].empty?
169
+
170
+ definition ||= ActiveSettings::Config::Definition.new(options.merge(:definer => called_from))
171
+ definitions[key] = definition
172
+
173
+ if self[key].nil? && !definition.default.nil?
174
+ begin
175
+ self[key] = definition.default
176
+ rescue ActiveRecord::RecordInvalid
177
+ raise LoadError, "Default configuration invalid: value '#{definition.default}' is not allowed for '#{key}'"
178
+ end
179
+ end
180
+ end
181
+
182
+ def definitions
183
+ ActiveSettings.config_definitions
184
+ end
185
+
186
+ def definition_for(key)
187
+ definitions[key] ||= ActiveSettings::Config::Definition.new(:empty => true)
188
+ end
189
+
190
+ def clear_definitions!
191
+ ActiveSettings.config_definitions = {}
192
+ end
193
+
194
+ end
195
+
196
+ # The usual way to use a config item:
197
+ #
198
+ # ActiveSettings.detail['key'] = value
199
+ #
200
+ # is equivalent to this:
201
+ #
202
+ # ActiveSettings::Config.find_or_create_by_key('key').value = value
203
+ #
204
+ # Calling value= also applies any validations and restrictions that are found in the associated definition.
205
+ # so this will raise a ConfigError if you try to change a protected config entry or a RecordInvalid if you
206
+ # set a value that is not among those permitted.
207
+ #
208
+ def value=(param)
209
+ newvalue = param.to_s
210
+ if newvalue != self[:value]
211
+ raise ConfigError, "#{self.key} cannot be changed" unless settable? || self[:value].blank?
212
+ if boolean?
213
+ self[:value] = (newvalue == '1' || newvalue == 'true') ? 'true' : 'false'
214
+ else
215
+ self[:value] = newvalue
216
+ end
217
+ self.save!
218
+ end
219
+ self[:value]
220
+ end
221
+
222
+ # Requesting a config item:
223
+ #
224
+ # key = ActiveSettings.detail['key']
225
+ #
226
+ # is equivalent to this:
227
+ #
228
+ # key = ActiveSettings::Config.find_or_create_by_key('key').value
229
+ #
230
+ # If the config item is boolean the response will be true or false. For items with :type => :integer it will be an integer,
231
+ # for everything else a string.
232
+ #
233
+ def value
234
+ if boolean?
235
+ checked?
236
+ else
237
+ self[:value]
238
+ end
239
+ end
240
+
241
+ # Returns the definition associated with this config item. If none has been declared this will be an empty definition
242
+ # that does not restrict use.
243
+ #
244
+ def definition
245
+ @definition ||= self.class.definition_for(self.key)
246
+ end
247
+
248
+ # Returns true if the item key ends with '?' or the definition specifies :type => :boolean.
249
+ #
250
+ def boolean?
251
+ definition.boolean? || self.key.ends_with?('?')
252
+ end
253
+
254
+ # Returns true if the item is boolean and true.
255
+ #
256
+ def checked?
257
+ return nil if self[:value].nil?
258
+ boolean? && self[:value] == 'true'
259
+ end
260
+
261
+ # Returns true if the item defintion includes a :select_from parameter that limits the range of permissible options.
262
+ #
263
+ def selector?
264
+ definition.selector?
265
+ end
266
+
267
+ # Returns a name corresponding to the current setting value, if the setting definition includes a select_from parameter.
268
+ #
269
+ def selected_value
270
+ definition.selected(value)
271
+ end
272
+
273
+ def update_cache
274
+ ActiveSettings::Config.initialize_cache
275
+ end
276
+
277
+ delegate :default, :type, :allow_blank?, :hidden?, :visible?, :settable?, :selection, :label, :notes, :units, :to => :definition
278
+
279
+ def validate
280
+ definition.validate(self)
281
+ end
282
+
283
+ end
284
+
285
+ end
286
+
287
+ require 'active_settings/config/definition' unless defined?(ActiveSettings::Config::Definition)
@@ -0,0 +1,150 @@
1
+ module ActiveSettings
2
+ class Config
3
+ class Definition
4
+
5
+ attr_reader :empty, :default, :type, :label, :notes, :validate_with,
6
+ :select_from, :allow_blank, :allow_display,
7
+ :allow_change, :units, :definer
8
+
9
+ # Configuration 'definitions' are metadata held in memory that add restriction and description to individual config entries.
10
+ #
11
+ # By default ActiveSettings' configuration machinery is open and ad-hoc: config items are just globally-accessible variables.
12
+ # They're created when first mentioned and then available in all parts of the application. The definition mechanism is a way
13
+ # to place limits on that behavior. It allows you to protect a config entry, to specify the values it can take and to
14
+ # validate it when it changes. In the next update it will also allow you to declare that
15
+ # a config item is global or site-specific.
16
+ #
17
+ # The actual defining is done by ActiveSettings::Config#define and usually in a block like this:
18
+ #
19
+ # ActiveSettings::Config.configure do |config|
20
+ # config.namespace('users', :allow_change => true) do |users|
21
+ # users.define 'allow_password_reset?', :label => 'Allow password reset?'
22
+ # end
23
+ # end
24
+ #
25
+ # See the method documentation in ActiveSettings::Config for options and conventions.
26
+ #
27
+ def initialize(options={})
28
+ [:empty, :default, :type, :label, :notes, :validate_with, :select_from, :allow_blank,
29
+ :allow_change, :allow_display, :units, :definer].each do |attribute|
30
+ instance_variable_set "@#{attribute}".to_sym, options[attribute]
31
+ end
32
+ end
33
+
34
+ # Returns true if the definition included an :empty flag, which should only be the case for the blank, unrestricting
35
+ # definitions created when an undefined config item is set or got.
36
+ #
37
+ def empty?
38
+ !!empty
39
+ end
40
+
41
+ # Returns true if the definition included a :type => :boolean parameter. Config entries that end in '?' are automatically
42
+ # considered boolean, whether a type is declared or not. config.boolean? may therefore differ from config.definition.boolean?
43
+ #
44
+ def boolean?
45
+ type == :boolean
46
+ end
47
+
48
+ # Returns true if the definition included a :select_from parameter (either as list or proc).
49
+ #
50
+ def selector?
51
+ !select_from.blank?
52
+ end
53
+
54
+ # Returns true if the definition included a :type => :integer parameter
55
+ def integer?
56
+ type == :integer
57
+ end
58
+
59
+ # Returns true if the definition included a :type => :date parameter
60
+ def date?
61
+ type == :date
62
+ end
63
+
64
+ # Returns the list of possible values for this config entry in a form suitable for passing to options_for_select.
65
+ # if :select_from is a proc it is called first with no arguments and its return value passed through.
66
+ #
67
+ def selection
68
+ if selector?
69
+ choices = select_from
70
+ choices = choices.call if choices.respond_to? :call
71
+ choices = normalize_selection(choices)
72
+ choices.unshift ['","'] if allow_blank?
73
+ choices
74
+ end
75
+ end
76
+
77
+ # in definitions we accept anything that options_for_select would normally take
78
+ # here we standardises on an options array-of-arrays so that it's easier to validate input
79
+ #
80
+ def normalize_selection(choices)
81
+ choices = choices.to_a if Hash === choices
82
+ choices = choices.collect{|c| (c.is_a? Array) ? c : [c,c]}
83
+ end
84
+
85
+ # If the config item is a selector and :select_from specifies [name, value] pairs (as hash or array),
86
+ # this will return the name corresponding to the currently selected value.
87
+ #
88
+ def selected(value)
89
+ if value && selector? && pair = selection.find{|s| s.last == value}
90
+ pair.first
91
+ end
92
+ end
93
+
94
+ # Checks the supplied value against the validation rules for this definition.
95
+ # There are several ways in which validations might be defined or implied:
96
+ # * if :validate_with specifies a block, the setting object is passed to the block
97
+ # * if :type is :integer, we test that the supplied string resolves to a valid integer
98
+ # * if the config item is a selector we test that its value is one of the permitted options
99
+ # * if :allow_blank has been set to false, we test that the value is not blank
100
+ #
101
+ def validate(setting)
102
+ if allow_blank?
103
+ return if setting.value.blank?
104
+ else
105
+ setting.errors.add :value, :blank if setting.value.blank?
106
+ end
107
+ if validate_with.is_a? Proc
108
+ validate_with.call(setting)
109
+ end
110
+ if selector?
111
+ setting.errors.add :value, :not_permitted unless selectable?(setting.value)
112
+ end
113
+ if integer?
114
+ Integer(setting.value) rescue setting.errors.add :value, :not_a_number
115
+ end
116
+ end
117
+
118
+ # Returns true if the value is one of the permitted selections. Not case-sensitive.
119
+ def selectable?(value)
120
+ return true unless selector?
121
+ selection.map(&:last).map(&:downcase).include?(value.downcase)
122
+ end
123
+
124
+ # Returns true unless :allow_blank has been explicitly set to false. Defaults to true.
125
+ # A config item that does not allow_blank must be set or it will not be valid.
126
+ def allow_blank?
127
+ true unless allow_blank == false
128
+ end
129
+
130
+ # Returns true unless :allow_change has been explicitly set to false. Defaults to true.
131
+ # A config item that is not settable cannot be changed in the running application.
132
+ def settable?
133
+ true unless allow_change == false
134
+ end
135
+
136
+ # Returns true unless :allow_change has been explicitly set to false. Defaults to true.
137
+ # A config item that is not visible cannot be displayed in a view.
138
+ def visible?
139
+ true unless allow_display == false
140
+ end
141
+
142
+ # Returns true if :allow_display has been explicitly set to false. Defaults to true.
143
+ def hidden?
144
+ true if allow_display == false
145
+ end
146
+
147
+ end
148
+ end
149
+ end
150
+
@@ -0,0 +1,5 @@
1
+ module ActiveSettings
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace ActiveSettings
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module ActiveSettings
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+ require 'rails/generators/active_record/migration'
4
+
5
+ module ActiveSettings
6
+ module Generators
7
+ class InstallGenerator < ::Rails::Generators::Base
8
+ include Rails::Generators::Migration
9
+ extend ActiveRecord::Generators::Migration
10
+
11
+ source_root File.expand_path("../templates", __FILE__)
12
+
13
+ def copy_initializer
14
+ template "active_settings.rb", "config/initializers/active_settings.rb"
15
+ end
16
+
17
+ def create_migration_file
18
+ migration_template 'migration.rb', 'db/migrate/create_active_settings.rb'
19
+ end
20
+
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,17 @@
1
+ ActiveSettings.detail do |config|
2
+ # config.define 'admin.title', :default => "Your App"
3
+ # config.define 'dev.host'
4
+ # config.define 'local.timezone', :allow_change => true, :select_from => lambda { ActiveSupport::TimeZone::MAPPING.keys.sort }
5
+ # config.define 'defaults.locale', :select_from => lambda { Locales.locales }, :allow_blank => true
6
+ # config.define 'defaults.page.parts', :default => "Body,Extended"
7
+ # config.define 'defaults.page.status', :select_from => lambda { Status.selectable_values }, :allow_blank => false, :default => "Draft"
8
+ # config.define 'defaults.page.filter', :select_from => lambda { TextFilter.descendants.map { |s| s.filter_name }.sort }, :allow_blank => true
9
+ # config.define 'defaults.page.fields'
10
+ # config.define 'defaults.snippet.filter', :select_from => lambda { Snippets.all.map { |s| s.filter_name }.sort }, :allow_blank => true
11
+ # config.define 'pagination.param_name', :default => 'page'
12
+ # config.define 'pagination.per_page_param_name', :default => 'per_page'
13
+ # config.define 'admin.pagination.per_page', :type => :integer, :default => 50
14
+ # config.define 'site.title', :default => "Your site title", :allow_blank => false
15
+ # config.define 'site.host', :default => "www.example.com", :allow_blank => false
16
+ # config.define 'user.allow_password_reset?', :default => true
17
+ end
@@ -0,0 +1,16 @@
1
+ class CreateActiveSettings < ActiveRecord::Migration
2
+ def up
3
+ create_table :active_settings do |t|
4
+ t.string :key, limit: 80
5
+ t.string :value, limit: 120
6
+ end
7
+
8
+ change_table :active_settings do |t|
9
+ t.index :key, unique: true
10
+ end
11
+ end
12
+
13
+ def down
14
+ drop_table :active_settings
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_settings
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Scott V. Rosenthal
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activerecord
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: ActiveSettings provides an open and ad-hoc settings config for globally-accessible
70
+ variables via ActiveRecord in your rails 3.1+ app.
71
+ email:
72
+ - sr7575@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - lib/active_settings/config/definition.rb
78
+ - lib/active_settings/config.rb
79
+ - lib/active_settings/engine.rb
80
+ - lib/active_settings/version.rb
81
+ - lib/active_settings.rb
82
+ - lib/generators/active_settings/install/install_generator.rb
83
+ - lib/generators/active_settings/install/templates/active_settings.rb
84
+ - lib/generators/active_settings/install/templates/migration.rb
85
+ homepage: https://github.com/scottvrosenthal/active_settings
86
+ licenses:
87
+ - MIT
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubyforge_project:
105
+ rubygems_version: 2.0.3
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: ActiveSettings provides an open and ad-hoc settings config & definitions
109
+ for Rails cached globally-accessible variables via ActiveRecord in your rails 3.1+
110
+ app.
111
+ test_files: []