basic_assumption 0.3.2 → 0.3.3

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/README.rdoc CHANGED
@@ -13,7 +13,7 @@ It represents an idiom for writing certain kinds of code in a declarative way.
13
13
  Particularly in your Rails apps, it's worth checking out. BasicAssumption is
14
14
  another implementation of the idiom. It exists largely because I felt like
15
15
  practicing writing a gem, though it does have a differentiating feature or two.
16
- Check the configuration options for enabling compatibility with the
16
+ Check the +Configuration+ options for enabling compatibility with the
17
17
  DecentExposure API.
18
18
 
19
19
  == Install BasicAssumption
@@ -34,18 +34,18 @@ For Rails 3, in your Gemfile:
34
34
 
35
35
  It's possible to use BasicAssumption in your Rails 3 app without requiring
36
36
  'basic_assumption/rails', and will in fact allow more flexibility if you don't,
37
- but will incure the cost of additional setup. See the file
37
+ but will incur the cost of additional setup. See the file
38
38
  'lib/basic_assumption/rails.rb' for guidance.
39
39
 
40
40
  To use the library in another context, it is enough to extend the
41
- BasicAssumption module with the classes you would like to use it in.
41
+ BasicAssumption module inside the class you would like it available.
42
42
 
43
43
  == Examples
44
44
 
45
45
  === Inside a Rails controller
46
46
 
47
47
  The presumed most-common use case for BasicAssumption is in a Rails app. By
48
- default, BasicAssumption is extended by ActionController::Base, making it
48
+ default, BasicAssumption is extended within ActionController::Base, making it
49
49
  available inside your controllers.
50
50
 
51
51
  The most important (of the few) methods made available in controller classes is
@@ -98,15 +98,48 @@ created by +assume+ whenever a block is not passed. Here is a simple example:
98
98
  ...
99
99
  end
100
100
 
101
- This will provide the same behavior as the similar example above. In Rails,
102
- a helpful default is already made available. Please see +SimpleRails+ for
103
- a discussion.
101
+ This will provide the same behavior as the similar example above. It is also
102
+ possible to pass a proc or lambda directly.
104
103
 
105
- === Supplying custome default behavior classes
104
+ Finally, a symbol may be passed if it corresponds to a
105
+ specifically-defined helper class that came packaged with the library or was
106
+ provided by the application.
107
+
108
+ === In Rails
109
+
110
+ In Rails, a useful default is already active out of the box. It attempts to
111
+ guess the name of a class derived from ActiveRecord::Base and do a find on it
112
+ based on an id available in the +params+ of the request. Because of this, the
113
+ following two constructs would be equivalent in your controllers:
114
+
115
+ assume(:film) { Film.find(params[:film_id] || params[:id]) }
116
+ # The above line is exactly the same as:
117
+ assume(:film)
118
+
119
+ Please see +SimpleRails+ for details of implementation. Because finding on :id
120
+ could be considered dangerous, there is another default available for use,
121
+ +CautiousRails+, that will only find on :name_id. (In the example above,
122
+ this would be :film_id.) Enable that for one of your controllers like so:
123
+
124
+ class FilmController < ActionController::Base
125
+ default_assumption :cautious_rails
126
+ end
127
+
128
+ Default assumptions are inherited by derived classes.
129
+
130
+ === Supplying custom default behavior classes
106
131
 
107
132
  There is an ability to provide custom, modular default extensions to
108
- BasicAssumption. Please see the documentation for +DefaultAssumption+
109
- for a discussion and +SimpleRails+ for an example.
133
+ BasicAssumption and then use them by passing a symbol, like so:
134
+
135
+ class WidgetController < ActionController::Base
136
+ default_assumption :my_custom_default_class
137
+ end
138
+
139
+ The symbol is converted to a class in the same manner as Rails classify/
140
+ constantize operates, but it is looked up in the
141
+ BasicAssumption::DefaultAssumption namespace. Please see the documentation for
142
+ +DefaultAssumption+ for a discussion and +SimpleRails+ for an example of this.
110
143
 
111
144
  === Configuration
112
145
 
@@ -114,8 +147,6 @@ There are a couple of simple configuration settings that can be set inside of
114
147
  a configuration block that can be used in places such as Rails initializer
115
148
  blocks. For more information, see +Configuration+.
116
149
 
117
- More are yet to come...
118
-
119
150
  == Issues
120
151
 
121
152
  === Memoization
@@ -28,14 +28,10 @@ module BasicAssumption
28
28
  # provides a +block+ instance method, and use the result as the default
29
29
  # behavior. See the +SimpleRails+ class for an example.
30
30
  module DefaultAssumption
31
- # Stores the +default+ as the default behavior for class +klass+ that
32
- # will be used by calls to +assume+.
33
31
  def self.register(klass, default) #:nodoc:
34
32
  registry[klass.object_id] = strategy(default)
35
33
  end
36
34
 
37
- # Returns the default behavior used by calls to +assume+ for the class
38
- # +klass+.
39
35
  def self.resolve(klass) #:nodoc:
40
36
  while !registry.has_key?(klass.object_id)
41
37
  klass = klass.superclass
@@ -44,7 +40,7 @@ module BasicAssumption
44
40
  registry[klass.object_id]
45
41
  end
46
42
 
47
- class << self
43
+ class << self
48
44
  attr_accessor :default #:nodoc:
49
45
 
50
46
  protected
@@ -0,0 +1,27 @@
1
+ module BasicAssumption
2
+ module DefaultAssumption
3
+ # Custom default behavior in the context of Rails.
4
+ class CautiousRails < BasicAssumption::DefaultAssumption::Base
5
+ # Returns a block that will attempt to find an instance of
6
+ # an ActiveRecord model based on the name that was given to
7
+ # BasicAssumption#assume and an id value in the parameters.
8
+ # It will not find based on params[:id], only params[:model_id].
9
+ # The following two examples would be equivalent:
10
+ #
11
+ # class WidgetController < ActionController::Base
12
+ # assume :widget
13
+ # end
14
+ #
15
+ # class WidgetController < ActionController::Base
16
+ # assume(:widget) { Widget.find(params[:widget_id]) }
17
+ # end
18
+ def block
19
+ Proc.new do |name|
20
+ model_class = name.to_s.classify.constantize
21
+ model_class.find(params["#{name}_id"])
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
@@ -1,3 +1,3 @@
1
1
  module BasicAssumption
2
- VERSION = '0.3.2'
2
+ VERSION = '0.3.3'
3
3
  end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+ require 'active_support'
3
+ require 'basic_assumption/default_assumption/cautious_rails'
4
+
5
+ describe BasicAssumption::DefaultAssumption::CautiousRails do
6
+ class Model; end
7
+
8
+ context "#block" do
9
+ let(:default) { BasicAssumption::DefaultAssumption::CautiousRails.new }
10
+ let(:params) { stub(:[] => 42) }
11
+
12
+ before(:each) do
13
+ Model.stub!(:find)
14
+ default.stub!(:params).and_return(params)
15
+ end
16
+
17
+ it "looks for a params[model_id] in its calling context" do
18
+ params.should_receive(:[]).with('model_id').and_return(nil)
19
+ default.block.call(:model)
20
+ end
21
+
22
+ it "does not look for params[id] in its calling context" do
23
+ params.should_receive(:[]).with('id').never
24
+ default.block.call(:model)
25
+ end
26
+
27
+ it "attempts to find a model instance based off the given name" do
28
+ Model.should_receive(:find).with(42).and_return(:model)
29
+ default.block.call(:model).should eql(:model)
30
+ end
31
+ end
32
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 2
9
- version: 0.3.2
8
+ - 3
9
+ version: 0.3.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Matt Yoho
@@ -73,6 +73,7 @@ files:
73
73
  - lib/basic_assumption/configuration.rb
74
74
  - lib/basic_assumption/default_assumption.rb
75
75
  - lib/basic_assumption/default_assumption/base.rb
76
+ - lib/basic_assumption/default_assumption/cautious_rails.rb
76
77
  - lib/basic_assumption/default_assumption/class_resolver.rb
77
78
  - lib/basic_assumption/default_assumption/rails.rb
78
79
  - lib/basic_assumption/default_assumption/simple_rails.rb
@@ -115,5 +116,6 @@ test_files:
115
116
  - spec/lib/basic_assumption/configuration_spec.rb
116
117
  - spec/lib/basic_assumption/default_assumption_spec.rb
117
118
  - spec/lib/basic_assumption/default_assumption/base_spec.rb
119
+ - spec/lib/basic_assumption/default_assumption/cautious_rails_spec.rb
118
120
  - spec/lib/basic_assumption/default_assumption/class_resolver_spec.rb
119
121
  - spec/lib/basic_assumption/default_assumption/simple_rails_spec.rb