governor 0.1.1 → 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/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