configvars_rails 0.1.0 → 0.2.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{configvars_rails}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Victor Costan"]
12
- s.date = %q{2010-08-08}
12
+ s.date = %q{2010-08-09}
13
13
  s.description = %q{This gem provides a model and simple controller for
14
14
  storing global application configuration in a database. This allows the
15
15
  configuration to change without source code modifications.}
@@ -29,6 +29,7 @@ Gem::Specification.new do |s|
29
29
  "configvars_rails.gemspec",
30
30
  "lib/configvars_rails.rb",
31
31
  "lib/configvars_rails/controller.rb",
32
+ "lib/configvars_rails/descriptor.rb",
32
33
  "lib/configvars_rails/engine.rb",
33
34
  "lib/configvars_rails/generators/all_generator.rb",
34
35
  "lib/configvars_rails/generators/templates/001_create_config_vars.rb",
@@ -38,14 +39,16 @@ Gem::Specification.new do |s|
38
39
  "lib/configvars_rails/generators/templates/config_vars/edit.html.erb",
39
40
  "lib/configvars_rails/generators/templates/config_vars/index.html.erb",
40
41
  "lib/configvars_rails/generators/templates/config_vars/new.html.erb",
41
- "lib/configvars_rails/generators/templates/config_vars/show.html.erb",
42
42
  "lib/configvars_rails/generators/templates/config_vars_controller.rb",
43
43
  "lib/configvars_rails/generators/templates/config_vars_controller_test.rb",
44
+ "lib/configvars_rails/generators/templates/config_vars_initializer.rb",
44
45
  "lib/configvars_rails/model.rb",
45
46
  "test/config_var_test.rb",
46
47
  "test/config_vars_controller_api_test.rb",
48
+ "test/descriptor_test.rb",
47
49
  "test/helpers/application_controller.rb",
48
50
  "test/helpers/db_setup.rb",
51
+ "test/helpers/initializers.rb",
49
52
  "test/helpers/routes.rb",
50
53
  "test/helpers/view_helpers.rb",
51
54
  "test/test_helper.rb"
@@ -58,7 +61,9 @@ Gem::Specification.new do |s|
58
61
  s.test_files = [
59
62
  "test/test_helper.rb",
60
63
  "test/config_vars_controller_api_test.rb",
64
+ "test/descriptor_test.rb",
61
65
  "test/helpers/application_controller.rb",
66
+ "test/helpers/initializers.rb",
62
67
  "test/helpers/routes.rb",
63
68
  "test/helpers/db_setup.rb",
64
69
  "test/helpers/view_helpers.rb",
@@ -3,6 +3,7 @@ module ConfigvarsRails
3
3
  end
4
4
 
5
5
  require 'configvars_rails/controller.rb'
6
+ require 'configvars_rails/descriptor.rb'
6
7
  require 'configvars_rails/model.rb'
7
8
 
8
9
  if defined?(Rails)
@@ -30,27 +30,27 @@ module ControllerInstanceMethods
30
30
  # GET /config_vars
31
31
  # GET /config_vars.xml
32
32
  def index
33
- @config_vars = ConfigVar.all
34
-
35
- respond_to do |format|
36
- format.html # index.html.erb
33
+ @config_vars = ConfigVar.order(:name).all
34
+
35
+ defined_names = ConfigvarsRails.variable_names
36
+ default_names = defined_names - @config_vars.map { |var| var.name.to_sym }
37
+ @default_vars = {}
38
+ default_names.map(&:to_s).sort.each do |name|
39
+ @default_vars[name] = ConfigvarsRails.variable_descriptor(name)
37
40
  end
38
- end
39
-
40
- # GET /config_vars/1
41
- # GET /config_vars/1.xml
42
- def show
43
- @config_var = ConfigVar.find(params[:id])
44
41
 
45
42
  respond_to do |format|
46
- format.html # show.html.erb
43
+ format.html # index.html.erb
47
44
  end
48
45
  end
49
46
 
50
47
  # GET /config_vars/new
51
48
  # GET /config_vars/new.xml
52
49
  def new
53
- @config_var = ConfigVar.new
50
+ @config_var = ConfigVar.new :name => params[:name]
51
+ if params[:name] and descriptor = ConfigvarsRails.variable_descriptor(params[:name])
52
+ @config_var.value = descriptor.default_value
53
+ end
54
54
 
55
55
  respond_to do |format|
56
56
  format.html # new.html.erb
@@ -69,7 +69,7 @@ module ControllerInstanceMethods
69
69
 
70
70
  respond_to do |format|
71
71
  if @config_var.save!
72
- format.html { redirect_to(@config_var, :notice => 'Configuration variable was successfully created.') }
72
+ format.html { redirect_to(config_vars_url, :notice => 'Configuration variable was successfully created.') }
73
73
  else
74
74
  format.html { render :action => :new }
75
75
  end
@@ -83,7 +83,7 @@ module ControllerInstanceMethods
83
83
 
84
84
  respond_to do |format|
85
85
  if @config_var.update_attributes(params[:config_var])
86
- format.html { redirect_to(@config_var, :notice => 'Config flag was successfully updated.') }
86
+ format.html { redirect_to(config_vars_url, :notice => 'Configuration variable was successfully updated.') }
87
87
  else
88
88
  format.html { render :action => :edit }
89
89
  end
@@ -0,0 +1,62 @@
1
+ # :nodoc: namespace
2
+ module ConfigvarsRails
3
+ @vars = {}
4
+
5
+ # Configuration variable descriptor.
6
+ class Descriptor
7
+ # Creates a new variable descriptor.
8
+ #
9
+ # Args:
10
+ # type:: the type of values the variable can take
11
+ # default_value:: a Proc or default value for the configuration variable
12
+ def initialize(value_type, default_value)
13
+ @value_type = value_type.to_sym
14
+ @default = default_value.dup
15
+ end
16
+
17
+ # The default value to be used if the variable doesn't have an explicit
18
+ # value.
19
+ def default_value
20
+ if @default.kind_of? Proc
21
+ @default.call
22
+ else
23
+ @default.dup
24
+ end
25
+ end
26
+
27
+ # The type of values that the variable takes.
28
+ attr_reader :value_type
29
+ end
30
+
31
+ # Registers a new configuration variable.
32
+ def self.add_variable(name, descriptor)
33
+ @vars[name.to_sym] = descriptor
34
+ end
35
+
36
+ # The descriptor for a configuration variable.
37
+ def self.variable_descriptor(name)
38
+ @vars[name.to_sym]
39
+ end
40
+
41
+ # The names for all the configuration variables.
42
+ def self.variable_names
43
+ @vars.keys
44
+ end
45
+ end # namespace ConfigvarsRails
46
+
47
+
48
+ #
49
+ module ConfigVars
50
+ # Declares a configuration variable with string values.
51
+ #
52
+ # Args:
53
+ # name:: the variable's name
54
+ # default_value:: a string
55
+ #
56
+ # Optionally, takes a block that will be called when the variable's default
57
+ # value is requested.
58
+ def self.string(name, default_value = nil, &block)
59
+ descriptor = ConfigvarsRails::Descriptor.new :string, default_value || block
60
+ ConfigvarsRails.add_variable name, descriptor
61
+ end
62
+ end # namespace ConfigVars
@@ -21,13 +21,16 @@ class AllGenerator < Rails::Generators::Base
21
21
  copy_file File.join('config_vars_controller_test.rb'),
22
22
  File.join('test', 'functional', 'config_vars_controller_test.rb')
23
23
  [
24
- '_form.html.erb', 'edit.html.erb', 'index.html.erb', 'new.html.erb',
25
- 'show.html.erb'
24
+ '_form.html.erb', 'edit.html.erb', 'index.html.erb', 'new.html.erb'
26
25
  ].each do |view_name|
27
26
  copy_file File.join('config_vars', view_name),
28
27
  File.join('app', 'views', 'config_vars', view_name)
29
28
  end
30
29
  route 'resources :config_vars'
30
+
31
+ copy_file 'config_vars_initializer.rb',
32
+ File.join('config', 'initializers', 'config_vars.rb')
33
+
31
34
  end
32
35
  end # class ConfigvarsRails::ConfigVarsGenerator
33
36
 
@@ -2,5 +2,4 @@
2
2
 
3
3
  <%= render 'form' %>
4
4
 
5
- <%= link_to 'Show', @config_var %> |
6
5
  <%= link_to 'Back', config_vars_path %>
@@ -1,9 +1,11 @@
1
- <h1>Listing Configuration Variables</h1>
1
+ <h1>Set Configuration Variables</h1>
2
2
 
3
- <table>
3
+ <table class="configuration_variables">
4
4
  <tr>
5
5
  <th>Name</th>
6
+ <th>Type</th>
6
7
  <th>Value</th>
8
+ <th>Default Value</th>
7
9
  <th></th>
8
10
  <th></th>
9
11
  <th></th>
@@ -12,14 +14,39 @@
12
14
  <% @config_vars.each do |config_var| %>
13
15
  <tr>
14
16
  <td><%= config_var.name %></td>
17
+ <td>
18
+ <%= config_var.descriptor ? config_var.descriptor.value_type :
19
+ 'undefined' %>
20
+ </td>
15
21
  <td><%= config_var.value %></td>
16
- <td><%= link_to 'Show', config_var %></td>
22
+ <td>
23
+ <%= config_var.descriptor ? config_var.descriptor.default_value :
24
+ 'undefined' %>
25
+ </td>
17
26
  <td><%= link_to 'Edit', edit_config_var_path(config_var) %></td>
18
- <td><%= link_to 'Destroy', config_var, :confirm => 'Are you sure?', :method => :delete %></td>
27
+ <td><%= link_to 'Reset to default', config_var, :method => :delete %></td>
19
28
  </tr>
20
29
  <% end %>
21
30
  </table>
22
31
 
23
- <br />
32
+ <h1>Available Configuration Variables</h1>
24
33
 
25
- <%= link_to 'New Configuration Variable', new_config_var_path %>
34
+ <table class="configuration_variables">
35
+ <tr>
36
+ <th>Name</th>
37
+ <th>Type</th>
38
+ <th>Default Value</th>
39
+ <th></th>
40
+ <th></th>
41
+ <th></th>
42
+ </tr>
43
+
44
+ <% @default_vars.each do |name, descriptor| %>
45
+ <tr>
46
+ <td><%= name %></td>
47
+ <td><%= descriptor.value_type %></td>
48
+ <td><%= descriptor.default_value %></td>
49
+ <td><%= link_to 'Edit', new_config_var_path(:name => name) %></td>
50
+ </tr>
51
+ <% end %>
52
+ </table>
@@ -1,4 +1,4 @@
1
- <h1>New Configuration Variable</h1>
1
+ <h1>Editing Configuration Variable</h1>
2
2
 
3
3
  <%= render 'form' %>
4
4
 
@@ -5,9 +5,8 @@ class ConfigVarsControllerTest < ActionController::TestCase
5
5
  @config_var = config_vars(:app_uri)
6
6
  end
7
7
 
8
- test "cannot access config var without authentication" do
9
- get :show, :id => @config_var.to_param
10
-
8
+ test "cannot access config vars without authentication" do
9
+ get :index
11
10
  assert_response :unauthorized
12
11
  end
13
12
  end
@@ -0,0 +1,4 @@
1
+ # Definitions for configuration variables used in this application.
2
+
3
+ ConfigVars.string 'simple_var', 'simple_val'
4
+ ConfigVars.string('block_var') { Time.now }
@@ -35,10 +35,13 @@ end # module ConfigvarsRails::Model::ModelClassMethods
35
35
  module ModelMetaclassMethods
36
36
  # Access configuration flags by ConfigVar['flag_name'].
37
37
  def [](name)
38
- unless flag = where(:name => name).first
39
- raise IndexError, "Configuration variable #{name} not found"
40
- end
41
- flag.value
38
+ var = where(:name => name).first
39
+ return var.value if var
40
+
41
+ descriptor = ConfigvarsRails.variable_descriptor name
42
+ return descriptor.default_value if descriptor
43
+
44
+ raise IndexError, "Configuration variable #{name} not found"
42
45
  end
43
46
 
44
47
  # Set configuration flags by ConfigVar['flag_name'] = 'flag_value'.
@@ -54,6 +57,10 @@ end # module ConfigvarsRails::Model::ModelMetaclassMethods
54
57
 
55
58
  # Included in models that call config_vars_model.
56
59
  module ModelInstanceMethods
60
+ # The descriptor for this variable, or nil if no descriptor was defined.
61
+ def descriptor
62
+ ConfigvarsRails.variable_descriptor name
63
+ end
57
64
  end # module ConfigvarsRails::Model::ModelInstanceMethods
58
65
 
59
66
  ActiveRecord::Base.send :include, ModelMixin
@@ -17,6 +17,10 @@ class ConfigVarTest < ActiveSupport::TestCase
17
17
  test "convenience get" do
18
18
  @var.save!
19
19
  assert_equal 'var_value', ConfigVar['var']
20
+
21
+ assert_raise IndexError do
22
+ assert_equal 'failure', ConfigVar['undefined']
23
+ end
20
24
  end
21
25
 
22
26
  test "convenience set" do
@@ -11,19 +11,36 @@ class ConfigVarsControllerApiTest < ActionController::TestCase
11
11
 
12
12
  setup do
13
13
  @config_var = config_vars(:app_uri)
14
- request.env['HTTP_AUTHORIZATION'] = encode_credentials('config', 'vars')
14
+ request.env['HTTP_AUTHORIZATION'] = encode_credentials('config', 'vars')
15
15
  end
16
16
 
17
17
  test "should get index" do
18
18
  get :index
19
19
  assert_response :success
20
- assert_not_nil assigns(:config_vars)
20
+
21
+ assert assigns(:config_vars).include?(config_vars(:app_uri)),
22
+ "@config_vars doesn't have a database fixture"
23
+ assert assigns(:default_vars).has_key?('simple_var'),
24
+ "@default_vars doesn't have a simple_var"
21
25
  end
22
26
 
23
27
  test "should get new" do
24
28
  get :new
25
29
  assert_response :success
26
30
  end
31
+
32
+ test "new with preset name" do
33
+ get :new, :name => 'undefined'
34
+ assert_response :success
35
+ assert_equal 'undefined', assigns(:config_var).name
36
+ end
37
+
38
+ test "new with preset name and default value" do
39
+ get :new, :name => 'simple_var'
40
+ assert_response :success
41
+ assert_equal 'simple_var', assigns(:config_var).name
42
+ assert_equal 'simple_val', assigns(:config_var).value
43
+ end
27
44
 
28
45
  test "should create config_var" do
29
46
  attributes = @config_var.attributes.merge 'name' => 'other_uri'
@@ -31,12 +48,7 @@ class ConfigVarsControllerApiTest < ActionController::TestCase
31
48
  post :create, :config_var => attributes
32
49
  end
33
50
 
34
- assert_redirected_to config_var_path(assigns(:config_var))
35
- end
36
-
37
- test "should show config_var" do
38
- get :show, :id => @config_var.to_param
39
- assert_response :success
51
+ assert_redirected_to config_vars_url
40
52
  end
41
53
 
42
54
  test "should get edit" do
@@ -47,7 +59,7 @@ class ConfigVarsControllerApiTest < ActionController::TestCase
47
59
  test "should update config_var" do
48
60
  put :update, :id => @config_var.to_param,
49
61
  :config_var => @config_var.attributes
50
- assert_redirected_to config_var_path(assigns(:config_var))
62
+ assert_redirected_to config_vars_url
51
63
  end
52
64
 
53
65
  test "should destroy config_var" do
@@ -55,7 +67,7 @@ class ConfigVarsControllerApiTest < ActionController::TestCase
55
67
  delete :destroy, :id => @config_var.to_param
56
68
  end
57
69
 
58
- assert_redirected_to config_vars_path
70
+ assert_redirected_to config_vars_url
59
71
  end
60
72
 
61
73
  # Verbatim, from ActiveController's own unit tests.
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../test_helper', __FILE__)
2
+
3
+ class DescriptorTest < ActiveSupport::TestCase
4
+ setup do
5
+ @simple_desc = ConfigvarsRails.variable_descriptor 'simple_var'
6
+ @block_desc = ConfigvarsRails.variable_descriptor 'block_var'
7
+ end
8
+
9
+ test 'default_value' do
10
+ assert_equal 'simple_val', @simple_desc.default_value
11
+ assert_in_delta Time.now, @block_desc.default_value, 0.1,
12
+ 'first block call'
13
+ end
14
+
15
+ test 'value_type' do
16
+ assert_equal :string, @simple_desc.value_type
17
+ end
18
+
19
+ test 'default_value fallback in ConfigVar[]' do
20
+ assert_equal 'simple_val', ConfigVar['simple_var']
21
+ end
22
+ end
@@ -0,0 +1 @@
1
+ require 'configvars_rails/generators/templates/config_vars_initializer.rb'
data/test/test_helper.rb CHANGED
@@ -13,4 +13,5 @@ require 'helpers/view_helpers.rb'
13
13
  # NOTE: application_controller has to follow view_helpers
14
14
  require 'helpers/application_controller.rb'
15
15
  require 'helpers/db_setup.rb'
16
+ require 'helpers/initializers.rb'
16
17
  require 'helpers/routes.rb'
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configvars_rails
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Victor Costan
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-08 00:00:00 -04:00
18
+ date: 2010-08-09 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -74,6 +74,7 @@ files:
74
74
  - configvars_rails.gemspec
75
75
  - lib/configvars_rails.rb
76
76
  - lib/configvars_rails/controller.rb
77
+ - lib/configvars_rails/descriptor.rb
77
78
  - lib/configvars_rails/engine.rb
78
79
  - lib/configvars_rails/generators/all_generator.rb
79
80
  - lib/configvars_rails/generators/templates/001_create_config_vars.rb
@@ -83,14 +84,16 @@ files:
83
84
  - lib/configvars_rails/generators/templates/config_vars/edit.html.erb
84
85
  - lib/configvars_rails/generators/templates/config_vars/index.html.erb
85
86
  - lib/configvars_rails/generators/templates/config_vars/new.html.erb
86
- - lib/configvars_rails/generators/templates/config_vars/show.html.erb
87
87
  - lib/configvars_rails/generators/templates/config_vars_controller.rb
88
88
  - lib/configvars_rails/generators/templates/config_vars_controller_test.rb
89
+ - lib/configvars_rails/generators/templates/config_vars_initializer.rb
89
90
  - lib/configvars_rails/model.rb
90
91
  - test/config_var_test.rb
91
92
  - test/config_vars_controller_api_test.rb
93
+ - test/descriptor_test.rb
92
94
  - test/helpers/application_controller.rb
93
95
  - test/helpers/db_setup.rb
96
+ - test/helpers/initializers.rb
94
97
  - test/helpers/routes.rb
95
98
  - test/helpers/view_helpers.rb
96
99
  - test/test_helper.rb
@@ -131,7 +134,9 @@ summary: Global configuration variables for Rails 3 applications.
131
134
  test_files:
132
135
  - test/test_helper.rb
133
136
  - test/config_vars_controller_api_test.rb
137
+ - test/descriptor_test.rb
134
138
  - test/helpers/application_controller.rb
139
+ - test/helpers/initializers.rb
135
140
  - test/helpers/routes.rb
136
141
  - test/helpers/db_setup.rb
137
142
  - test/helpers/view_helpers.rb
@@ -1,15 +0,0 @@
1
- <p id="notice"><%= notice %></p>
2
-
3
- <p>
4
- <b>Name:</b>
5
- <%= @config_var.name %>
6
- </p>
7
-
8
- <p>
9
- <b>Value:</b>
10
- <%= @config_var.value %>
11
- </p>
12
-
13
-
14
- <%= link_to 'Edit', edit_config_var_path(@config_var) %> |
15
- <%= link_to 'Back', config_vars_path %>