governor 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -15,10 +15,4 @@ group :development, :test do
15
15
  gem 'devise'
16
16
  gem 'governor', :path => './'
17
17
  gem 'dynamic_form'
18
- end
19
- # group :development do
20
- # gem "rspec", "~> 2.3.0"
21
- # gem "bundler", "~> 1.0.0"
22
- # gem "jeweler", "~> 1.5.2"
23
- # gem "rcov", ">= 0"
24
- # end
18
+ end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ./
3
3
  specs:
4
- governor (0.1.0)
4
+ governor (0.1.1)
5
5
  rails (~> 3.0.5)
6
6
 
7
7
  GEM
@@ -12,13 +12,8 @@ try the specs, they're fresh!
12
12
  Dependencies
13
13
  ------------
14
14
 
15
- Some day, Governor will be somewhat independent, but for now, there are some
16
- explicit and implicit dependencies. There's the obvious hard dependency on
17
- Rails, but the following implicit dependencies exist at the moment:
18
-
19
15
  * ActiveRecord
20
16
  * [will_paginate](https://github.com/mislav/will_paginate)
21
- * [Devise](https://github.com/plataformatec/devise)
22
17
 
23
18
  At some point (at least by v1.0), these dependencies will be removed. Sorry
24
19
  about the meantime.
@@ -52,6 +47,10 @@ Now that you have an article model and a set of routes, you're ready to plug
52
47
  it into your app. I'd recommend running `rake routes` to see what routes have
53
48
  been added, as they depend on the model name you chose.
54
49
 
50
+ The Governor initialization will check if Devise is installed, and will try to
51
+ Do The Right Thing if it is. If not, it'll yell at you, so be sure to set up
52
+ your authorization rules in this file.
53
+
55
54
  Authentication/Authorization
56
55
  ----------------------------
57
56
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.2.0
@@ -3,6 +3,7 @@ class Governor::ArticlesController < ApplicationController
3
3
  before_filter :init_resource, :only => [:show, :edit, :update, :destroy]
4
4
  before_filter :authorize_governor!, :only => [:new, :edit, :create, :update, :destroy]
5
5
  helper :governor
6
+
6
7
  helper Governor::Controllers::Helpers
7
8
 
8
9
  # GET /articles
@@ -43,7 +44,7 @@ class Governor::ArticlesController < ApplicationController
43
44
  # POST /articles.xml
44
45
  def create
45
46
  set_resource model_class.new(params[mapping.singular])
46
- resource.author = GOVERNOR_AUTHOR.call(self)
47
+ resource.author = the_governor
47
48
 
48
49
  respond_to do |format|
49
50
  if resource.save
@@ -78,7 +79,7 @@ class Governor::ArticlesController < ApplicationController
78
79
  resource.destroy
79
80
 
80
81
  respond_to do |format|
81
- format.html { redirect_to(resources_url) }
82
+ format.html { redirect_to(polymorphic_path(mapping.plural)) }
82
83
  format.xml { head :ok }
83
84
  end
84
85
  end
@@ -1,13 +1,17 @@
1
1
  module GovernorHelper
2
2
  @@months = %w(January February March April May June July August September October November December)
3
3
 
4
+ Governor::PluginManager.plugins.map{|p| p.helpers }.flatten.each do |mod|
5
+ include mod.constantize # FIXME this feels pretty dirty, there has to be a better way
6
+ end
7
+
4
8
  def render_plugin_partial(where, options = {})
5
- output = ""
6
- Governor::PluginManager.view_hooks[where].each do |f|
7
- opts = options.merge( {:file => f} )
9
+ output = ''
10
+ Governor::PluginManager.plugins.map{|p| p.partial_for(where) }.compact.each do |partial|
11
+ opts = options.merge( {:partial => "governor/#{partial}"} )
8
12
  output << render(opts)
9
13
  end
10
- return output
14
+ return output.html_safe
11
15
  end
12
16
 
13
17
  def get_date_label
@@ -2,7 +2,7 @@
2
2
  <div class='subtitle'>
3
3
  <div class='desc'>
4
4
  <%= resource.description %>
5
- <%= render_plugin_partial('after_desc', :locals => {:article => resource}) %>
5
+ <%= render_plugin_partial(:after_article_description, :locals => {:article => resource}) %>
6
6
  </div>
7
7
  <div class='date'>
8
8
  posted <%= show_time_ago resource.created_at %>
@@ -3,4 +3,4 @@
3
3
  <%= render :partial => 'form' %>
4
4
 
5
5
  <%= link_to 'Show', resource %> |
6
- <%= link_to 'Back', resources_url %>
6
+ <%= link_to 'Back', polymorphic_path(mapping.plural) %>
@@ -3,4 +3,4 @@
3
3
  <%= link_to resource.title, resource %><br>
4
4
  <% end %>
5
5
 
6
- <p><%= link_to 'New', new_resource_url %></p>
6
+ <p><%= link_to 'New', polymorphic_path(mapping.singular, :action => :new) %></p>
@@ -2,4 +2,4 @@
2
2
 
3
3
  <%= render :partial => 'form' %>
4
4
 
5
- <%= link_to 'Back', resources_url %>
5
+ <%= link_to 'Back', polymorphic_path(mapping.plural) %>
@@ -2,10 +2,12 @@
2
2
  <div class="articles">
3
3
  <%= render resource %>
4
4
  </div>
5
- <%= render_plugin_partial('after_article_on_article_page', :locals => {:article => resource}) %>
5
+ <%= render_plugin_partial(:after_article_whole, :locals => {:article => resource}) %>
6
6
  </div>
7
- <%= link_to 'Back', resources_url %>
7
+ <%= link_to 'Back', polymorphic_path(mapping.plural) %>
8
8
  <% if governor_authorized?(:edit, resource) %>
9
- | <%= link_to 'Edit', edit_resource_url(resource) %>
10
- | <%= link_to 'Delete', resource, :method => :delete %>
9
+ | <%= link_to 'Edit', polymorphic_path(resource, :action => :edit) %>
11
10
  <% end %>
11
+ <% if governor_authorized?(:destroy, resource) %>
12
+ | <%= link_to 'Delete', resource, :method => :delete %>
13
+ <% end %>
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{governor}
8
- s.version = "0.1.1"
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 = ["Liam Morley"]
12
- s.date = %q{2011-04-02}
12
+ s.date = %q{2011-04-10}
13
13
  s.description = %q{Because Blogojevich would be too tough to remember. It's a pluggable blogging system for Rails 3.}
14
14
  s.email = %q{liam@carpeliam.com}
15
15
  s.extra_rdoc_files = [
@@ -53,9 +53,11 @@ Gem::Specification.new do |s|
53
53
  "lib/governor/rails/routes.rb",
54
54
  "lib/tasks/.gitkeep",
55
55
  "script/rails",
56
+ "spec/action_dispatch/routing/mapper_spec.rb",
56
57
  "spec/controllers/governor/articles_controller_spec.rb",
57
58
  "spec/governor/article_spec.rb",
58
59
  "spec/governor/plugin_manager_spec.rb",
60
+ "spec/governor/plugin_spec.rb",
59
61
  "spec/governor_spec.rb",
60
62
  "spec/rails_app/.gitignore",
61
63
  "spec/rails_app/Gemfile",
@@ -117,9 +119,11 @@ Gem::Specification.new do |s|
117
119
  s.rubygems_version = %q{1.3.7}
118
120
  s.summary = %q{A pluggable blogging system for Rails 3.}
119
121
  s.test_files = [
122
+ "spec/action_dispatch/routing/mapper_spec.rb",
120
123
  "spec/controllers/governor/articles_controller_spec.rb",
121
124
  "spec/governor/article_spec.rb",
122
125
  "spec/governor/plugin_manager_spec.rb",
126
+ "spec/governor/plugin_spec.rb",
123
127
  "spec/governor_spec.rb",
124
128
  "spec/rails_app/app/controllers/application_controller.rb",
125
129
  "spec/rails_app/app/controllers/home_controller.rb",
@@ -1,22 +1,36 @@
1
- GOVERNOR_AUTHOR = Proc.new do |actor|
2
- if actor.respond_to?(:current_user)
3
- actor.current_user
1
+ # Any code below will be evaluated/executed within the scope of the caller.
2
+
3
+ # How to reference the author of an article
4
+ Governor.author = Proc.new do
5
+ if respond_to?(:current_user)
6
+ current_user
4
7
  else
5
- raise "Set up GOVERNOR_AUTHOR in #{File.expand_path(__FILE__)}"
8
+ raise "Set up Governor.author in #{File.expand_path(__FILE__)}"
6
9
  end
7
10
  end
8
11
 
9
- Governor.authorize_if do |actor, action, article|
12
+ # Rules for authorizing a particular action on a particular article
13
+ Governor.authorize_if do |action, article|
10
14
  case action.to_sym
11
15
  when :new, :create
12
- # if respond_to?(:user_signed_in?)
13
- actor.user_signed_in?
14
- # else
15
- # raise "Set up Governor.authorize_if in #{File.expand_path(__FILE__)}"
16
- # end
16
+ if respond_to?(:user_signed_in?)
17
+ user_signed_in?
18
+ else
19
+ raise "Set up Governor.authorize_if in #{File.expand_path(__FILE__)}"
20
+ end
17
21
  when :edit, :update, :destroy
18
- article.author == GOVERNOR_AUTHOR.call(actor)
22
+ article.author == instance_eval(&Governor.author)
19
23
  else
20
24
  raise ArgumentError.new('action must be new, create, edit, update, or destroy')
21
25
  end
22
26
  end
27
+
28
+ # What should Governor do if someone tries to do something they weren't
29
+ # authorized to do?
30
+ Governor.if_not_allowed do
31
+ if respond_to?(Devise)
32
+ send("authenticate_#{Devise.default_scope}!")
33
+ else
34
+ raise ArgumentError.new("Set up Governor.if_not_allowed in #{File.expand_path(__FILE__)}")
35
+ end
36
+ end
@@ -6,27 +6,19 @@ require 'governor/mapping'
6
6
 
7
7
  require 'governor/controllers/helpers'
8
8
 
9
- require 'rails'
10
9
  require 'governor/rails'
11
10
 
12
11
 
13
12
  module Governor
14
13
 
15
- mattr_accessor :resources
14
+ mattr_reader :resources, :authorization_rules, :default_resource
15
+ mattr_accessor :if_not_allowed, :author
16
16
  @@resources = {}
17
17
  def self.map(resource, options = {})
18
- self.resources[resource] = Governor::Mapping.new(resource, options)
19
- end
20
-
21
- def self.setup
22
- yield self
18
+ @@default_resource ||= self.resources[resource] = Governor::Mapping.new(resource, options)
23
19
  end
24
20
 
25
21
  def self.authorize_if(&blk)
26
- @@authz_rules = blk
27
- end
28
-
29
- def self.authorized?(actor, action, article=nil)
30
- @@authz_rules.call(actor, action, article)
22
+ @@authorization_rules = blk
31
23
  end
32
24
  end
@@ -2,6 +2,9 @@ module Governor
2
2
  module Article
3
3
  def self.included(base)
4
4
  base.belongs_to :author, :polymorphic => true
5
+ Governor::PluginManager.resources(:child_resources).each_key do |resource|
6
+ base.has_many resource
7
+ end
5
8
 
6
9
  def base.find_all_by_date(year, month = nil, day = nil, page = 1)
7
10
  from, to = self.time_delta(year, month, day)
@@ -1,18 +1,6 @@
1
1
  module Governor
2
2
  module Controllers
3
3
  module Helpers
4
- def resources_url
5
- url_for :controller => mapping.controller, :governor_mapping => params[:governor_mapping], :action => 'index'
6
- end
7
-
8
- def new_resource_url
9
- url_for :controller => mapping.controller, :governor_mapping => params[:governor_mapping], :action => 'new'
10
- end
11
-
12
- def edit_resource_url(resource)
13
- url_for :controller => mapping.controller, :governor_mapping => params[:governor_mapping], :action => 'edit', :id => resource.id
14
- end
15
-
16
4
  def resource
17
5
  instance_variable_get("@#{mapping.singular}")
18
6
  end
@@ -43,19 +31,27 @@ module Governor
43
31
  end
44
32
 
45
33
  def init_resource
46
- set_resource model_class.find(params[:id])
34
+ set_resource model_class.find(params["#{mapping.singular}_id"] || params[:id])
35
+ end
36
+
37
+ def the_governor
38
+ instance_eval(&Governor.author)
39
+ end
40
+
41
+ def governor_logged_in?
42
+ the_governor.present?
47
43
  end
48
44
 
49
45
  def authorize_governor!
50
46
  if defined?(resource)
51
47
  redirect_to root_path unless governor_authorized?(action_name, resource)
52
48
  else
53
- send("authenticate_#{Devise.default_scope}!") unless governor_authorized?(action_name)
49
+ instance_eval(&Governor.if_not_allowed) unless governor_authorized?(action_name)
54
50
  end
55
51
  end
56
52
 
57
53
  def governor_authorized?(action, article=nil)
58
- Governor.authorized?(self, action, article)
54
+ instance_exec(action, article, &Governor.authorization_rules)
59
55
  end
60
56
  end
61
57
  end
@@ -22,7 +22,7 @@ module Governor
22
22
  # This is the only formatter included within Governor
23
23
  def default_formatter
24
24
  Proc.new do |text|
25
- text.gsub("\r\n", "\n").gsub("\n", '<br>')
25
+ text.to_s.gsub("\r\n", "\n").gsub("\n", '<br>')
26
26
  end
27
27
  end
28
28
 
@@ -1,13 +1,34 @@
1
1
  module Governor
2
2
  class Plugin
3
- attr_reader :name, :migrations
3
+ attr_reader :name, :migrations, :resources, :helpers
4
4
  def initialize(name)
5
5
  @name = name
6
6
  @migrations = []
7
+ @helpers = []
8
+ @resources = {}
9
+ @partials = {}
7
10
  end
8
11
 
9
12
  def add_migration(path)
10
13
  @migrations << path
11
14
  end
15
+
16
+ def add_child_resource(name, options={}, &block)
17
+ options[:block] = block if block_given?
18
+ @resources[:child_resources] ||= {}
19
+ @resources[:child_resources][name] = options
20
+ end
21
+
22
+ def register_partial(type, path)
23
+ @partials[type.to_sym] = path
24
+ end
25
+
26
+ def partial_for(type)
27
+ @partials[type.to_sym]
28
+ end
29
+
30
+ def add_helper(mod)
31
+ @helpers << mod
32
+ end
12
33
  end
13
34
  end
@@ -4,16 +4,14 @@ module Governor
4
4
  cattr_reader :view_hooks
5
5
 
6
6
  class << self
7
- @@view_hooks = Hash.new []
7
+ @@plugins = []
8
8
 
9
- def register(plugin)
10
- @@plugins ||= []
11
- @@plugins << plugin
9
+ def register(*plugins)
10
+ @@plugins += plugins
12
11
  end
13
12
 
14
- def register_partial(where, partial_path)
15
- @@view_hooks[where] ||= []
16
- @@view_hooks[where] << partial_path
13
+ def resources(name)
14
+ @@plugins.map{|p| p.resources[name] }.compact.reduce({}, :merge)
17
15
  end
18
16
  end
19
17
  end
@@ -5,7 +5,15 @@ module ActionDispatch::Routing
5
5
  resources.map!(&:to_sym)
6
6
  resources.each do |resource|
7
7
  mapping = Governor.map(resource, options)
8
- resources mapping.resource, :controller => mapping.controller, :governor_mapping => resource
8
+ resources mapping.resource, :controller => mapping.controller, :governor_mapping => resource do
9
+ Governor::PluginManager.resources(:child_resources).each_pair do |child_resource, options|
10
+ options = {:module => :governor}.merge options
11
+ block = options.delete :block
12
+ resources(child_resource, options) do
13
+ instance_eval(&block) if block.present?
14
+ end
15
+ end
16
+ end
9
17
  end
10
18
  end
11
19
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ module ActionDispatch::Routing
4
+
5
+ describe Mapper do
6
+ context "#governate" do
7
+
8
+ before do
9
+ @plugin = Governor::Plugin.new('test')
10
+ @plugin.add_child_resource('test', :some_option => 'value')
11
+ Governor::PluginManager.register @plugin
12
+ end
13
+
14
+ it "doesn't alter a plugin's options" do
15
+ Rails.application.reload_routes!
16
+
17
+ @plugin.resources[:child_resources].should == {'test' => {:some_option => 'value'}}
18
+ end
19
+
20
+ after do
21
+ # reload routes to undo what we've done
22
+ Governor::PluginManager.remove_plugin(@plugin).should == @plugin
23
+ Rails.application.reload_routes!
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -9,55 +9,113 @@ module Governor
9
9
  @article = Factory(:article, :author => @user)
10
10
  end
11
11
  context "#index" do
12
- it "assigns the correct instance variable" do
12
+ it "renders the articles page" do
13
13
  get :index, :governor_mapping => :articles
14
14
  assigns[:articles].should == [@article]
15
+ response.should render_template(:index)
15
16
  end
16
17
  end
17
18
 
18
19
  context "#new" do
19
- it "assigns the correct instance variable" do
20
- sign_in @user
21
- get :new, :governor_mapping => :articles
22
- assigns[:article].should be_a ::Article
23
- assigns[:article].attributes.should == ::Article.new.attributes
20
+ context "when signed out" do
21
+ it "redirects back to the front page" do
22
+ get :new, :governor_mapping => :articles
23
+ response.should redirect_to(root_path)
24
+ end
25
+ end
26
+
27
+ context "when signed in" do
28
+ before(:each) { sign_in @user }
29
+
30
+ it "renders the new article page" do
31
+ get :new, :governor_mapping => :articles
32
+ assigns[:article].should be_a ::Article
33
+ assigns[:article].attributes.should == ::Article.new.attributes
34
+ response.should render_template(:new)
35
+ end
36
+ end
37
+ end
38
+
39
+ context "#show" do
40
+ it "renders the right article" do
41
+ get :show, :governor_mapping => :articles, :id => @article.id
42
+ assigns[:article].should == @article
43
+ response.should render_template(:show)
24
44
  end
25
45
  end
26
46
 
27
- %w(show edit).each do |action|
28
- context "##{action}" do
29
- it "assigns the correct instance variable" do
30
- get action, :governor_mapping => :articles, :id => @article.id
47
+ context "#edit" do
48
+ context "when signed out" do
49
+ it "redirects back to the front page" do
50
+ get :edit, :governor_mapping => :articles, :id => @article.id
51
+ response.should redirect_to(root_path)
52
+ end
53
+ end
54
+
55
+ context "when signed in" do
56
+ before(:each) { sign_in @user }
57
+ it "renders the edit page" do
58
+ get :edit, :governor_mapping => :articles, :id => @article.id
31
59
  assigns[:article].should == @article
60
+ response.should render_template(:edit)
32
61
  end
33
62
  end
34
63
  end
35
64
 
36
65
  context "#create" do
37
- it "creates a new instance of Article" do
38
- sign_in @user
39
- post :create, :governor_mapping => :articles
40
- assigns[:article].should be_a ::Article
41
- assigns[:article].should_not be_a_new_record
42
- assigns[:article].author.should == @user
66
+ context "when signed out" do
67
+ it "redirects back to the front page" do
68
+ post :create, :governor_mapping => :articles
69
+ response.should redirect_to(root_path)
70
+ end
71
+ end
72
+
73
+ context "when signed in" do
74
+ before(:each) { sign_in @user }
75
+ it "creates a new article and redirects to its page" do
76
+ post :create, :governor_mapping => :articles
77
+ assigns[:article].should be_a ::Article
78
+ assigns[:article].should_not be_a_new_record
79
+ assigns[:article].author.should == @user
80
+ response.should redirect_to(assigns[:article])
81
+ end
43
82
  end
44
83
  end
45
84
 
46
85
  context "#update" do
47
- it "updates the article" do
48
- sign_in @user
49
- put :update, :governor_mapping => :articles, :id => @article.id, :article => {:title => 'I am awesome, you are awesome'}
50
- assigns[:article].title.should == 'I am awesome, you are awesome'
86
+ context "when signed out" do
87
+ it "redirects back to the front page" do
88
+ put :update, :governor_mapping => :articles, :id => @article.id, :article => {:title => 'I am awesome, you are awesome'}
89
+ response.should redirect_to(root_path)
90
+ end
91
+ end
92
+
93
+ context "when signed in" do
94
+ before(:each) { sign_in @user }
95
+ it "updates the article" do
96
+ put :update, :governor_mapping => :articles, :id => @article.id, :article => {:title => 'I am awesome, you are awesome'}
97
+ assigns[:article].title.should == 'I am awesome, you are awesome'
98
+ end
51
99
  end
52
100
  end
53
101
 
54
102
  context "#destroy" do
55
- it "deletes the article" do
56
- sign_in @user
57
- delete :destroy, :governor_mapping => :articles, :id => @article.id
58
- assigns[:article].should == @article
59
- assigns[:article].should be_destroyed
60
- ::Article.count.should == 0
103
+ context "when signed out" do
104
+ it "redirects back to the front page" do
105
+ delete :destroy, :governor_mapping => :articles, :id => @article.id
106
+ response.should redirect_to(root_path)
107
+ end
108
+ end
109
+
110
+ context "when signed in" do
111
+ before(:each) { sign_in @user }
112
+ it "deletes the article" do
113
+ delete :destroy, :governor_mapping => :articles, :id => @article.id
114
+ assigns[:article].should == @article
115
+ assigns[:article].should be_destroyed
116
+ ::Article.count.should == 0
117
+ response.should redirect_to(articles_path)
118
+ end
61
119
  end
62
120
  end
63
121
  end
@@ -2,10 +2,30 @@ require 'spec_helper'
2
2
 
3
3
  module Governor
4
4
  describe PluginManager do
5
+ before do
6
+ @plugins = Governor::PluginManager.plugins
7
+ end
8
+
5
9
  it "should keep track of plugins I've added" do
6
- plugin = Plugin.new('my plugin')
10
+ plugin = Plugin.new('test 1')
7
11
  PluginManager.register plugin
8
12
  PluginManager.plugins.should include plugin
9
13
  end
14
+
15
+ it "collects resources for plugins" do
16
+ plugin1 = Plugin.new('test 1')
17
+ plugin1.add_child_resource(:moneys)
18
+ plugin2 = Plugin.new('test 2')
19
+ plugin2.add_child_resource(:powers, :module => :illinois)
20
+ PluginManager.register plugin1, plugin2
21
+ PluginManager.resources(:child_resources).should == {:moneys => {}, :powers => {:module => :illinois}}
22
+ end
23
+
24
+ after do
25
+ remove_plugins = Governor::PluginManager.plugins - @plugins
26
+ remove_plugins.each do |plugin|
27
+ Governor::PluginManager.remove_plugin(plugin).should == plugin
28
+ end
29
+ end
10
30
  end
11
31
  end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ module Governor
4
+ describe Plugin do
5
+ before(:each) {@plugin = Plugin.new('test')}
6
+ it "collects child resources" do
7
+ @plugin.add_child_resource('tests', :controller => 'governor/tests')
8
+ @plugin.resources.should == {:child_resources => {'tests' => {:controller => 'governor/tests'}}}
9
+ end
10
+ end
11
+ end
@@ -8,33 +8,30 @@ class FakeArticle < ActiveRecord::Base
8
8
  end
9
9
  end
10
10
 
11
- # we're going to need 'self' later
12
- GOVERNOR_SPEC = self
13
-
14
11
  describe Governor do
15
12
  context "authorization" do
16
13
 
17
14
  %w(new create).each do |action|
18
15
  it "should make sure a user is logged in when going to the #{action} page" do
19
- GOVERNOR_SPEC.expects(:user_signed_in?).returns false
20
- Governor.authorized?(GOVERNOR_SPEC, action).should be_false
21
- GOVERNOR_SPEC.expects(:user_signed_in?).returns true
22
- Governor.authorized?(GOVERNOR_SPEC, action).should be_true
16
+ self.expects(:user_signed_in?).returns false
17
+ instance_exec(action, &Governor.authorization_rules).should be_false
18
+ self.expects(:user_signed_in?).returns true
19
+ instance_exec(action, &Governor.authorization_rules).should be_true
23
20
  end
24
21
  end
25
22
 
26
23
  %w(edit update destroy).each do |action|
27
24
  it "should make sure the current user is the author when going to the #{action} page" do
28
25
  article = FakeArticle.new
29
- GOVERNOR_SPEC.expects(:current_user).returns('milorad')
30
- Governor.authorized?(GOVERNOR_SPEC, action, article).should be_false
31
- GOVERNOR_SPEC.expects(:current_user).returns('Rod')
32
- Governor.authorized?(GOVERNOR_SPEC, action, article).should be_true
26
+ self.expects(:current_user).returns('milorad')
27
+ instance_exec(action, article, &Governor.authorization_rules).should be_false
28
+ self.expects(:current_user).returns('Rod')
29
+ instance_exec(action, article, &Governor.authorization_rules).should be_true
33
30
  end
34
31
  end
35
32
 
36
33
  it "should raise an exception if any other action is requested" do
37
- lambda{Governor.authorized(GOVERNOR_SPEC, 'who knows what this is')}.should raise_error
34
+ lambda{instance_exec('some other action', &Governor.authorization_rules)}.should raise_error
38
35
  end
39
36
  end
40
37
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- governor (0.1.0)
4
+ governor (0.1.1)
5
5
  rails (~> 3.0.5)
6
6
 
7
7
  GEM
@@ -7,6 +7,14 @@
7
7
  <%= csrf_meta_tag %>
8
8
  </head>
9
9
  <body>
10
+ <% if user_signed_in? %>
11
+ <%= link_to 'new article', new_article_path %> |
12
+ <%= link_to 'sign out', destroy_user_session_path %>
13
+ <% else %>
14
+ <%= link_to 'sign in', new_user_session_path %> |
15
+ <%= link_to 'sign up', new_user_registration_path %>
16
+ <% end %>
17
+ | <%= link_to 'articles', articles_path %>
10
18
 
11
19
  <%= yield %>
12
20
 
@@ -18,4 +18,19 @@ Rspec.configure do |config|
18
18
  config.mock_with :mocha
19
19
 
20
20
  config.use_transactional_fixtures = true
21
+ end
22
+
23
+ # for removing plugins added in a test to make sure they don't bleed over
24
+ module Governor
25
+ class PluginManager
26
+ def self.remove_plugin(plugin_or_name)
27
+ case plugin_or_name
28
+ when Plugin then return @@plugins.delete(plugin_or_name)
29
+ else # Plugin Name
30
+ @@plugins.each do |plugin|
31
+ return @@plugins.delete(plugin) if plugin.name == plugin_or_name
32
+ end
33
+ end
34
+ end
35
+ end
21
36
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: governor
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Liam Morley
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-02 00:00:00 -04:00
18
+ date: 2011-04-10 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -243,9 +243,11 @@ files:
243
243
  - lib/governor/rails/routes.rb
244
244
  - lib/tasks/.gitkeep
245
245
  - script/rails
246
+ - spec/action_dispatch/routing/mapper_spec.rb
246
247
  - spec/controllers/governor/articles_controller_spec.rb
247
248
  - spec/governor/article_spec.rb
248
249
  - spec/governor/plugin_manager_spec.rb
250
+ - spec/governor/plugin_spec.rb
249
251
  - spec/governor_spec.rb
250
252
  - spec/rails_app/.gitignore
251
253
  - spec/rails_app/Gemfile
@@ -335,9 +337,11 @@ signing_key:
335
337
  specification_version: 3
336
338
  summary: A pluggable blogging system for Rails 3.
337
339
  test_files:
340
+ - spec/action_dispatch/routing/mapper_spec.rb
338
341
  - spec/controllers/governor/articles_controller_spec.rb
339
342
  - spec/governor/article_spec.rb
340
343
  - spec/governor/plugin_manager_spec.rb
344
+ - spec/governor/plugin_spec.rb
341
345
  - spec/governor_spec.rb
342
346
  - spec/rails_app/app/controllers/application_controller.rb
343
347
  - spec/rails_app/app/controllers/home_controller.rb