monty 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/.gitignore CHANGED
@@ -3,3 +3,4 @@
3
3
  coverage
4
4
  doc
5
5
  pkg
6
+ monty.gemspec
data/README.md CHANGED
@@ -1,8 +1,82 @@
1
- = monty
1
+ monty
2
+ =============
2
3
 
3
- Description goes here.
4
+ Rack based authorization system.
4
5
 
5
- == Note on Patches/Pull Requests
6
+ [Yard docs](http://yardoc.org/docs/stonean-monty)
7
+
8
+ [RSpec Rails Helpers](http://github.com/stonean/monty-rspec-rails)
9
+
10
+ More to come, but here's the gist for rails 2.3.5:
11
+
12
+ In your environment.rb add:
13
+
14
+ require 'monty'
15
+ config.middleware.insert_after ActionController::ParamsParser, Monty::Watch
16
+
17
+ There may be other positions in the middleware stack that will work, I've tested this one.
18
+
19
+ Then you'll need to define your access rules. Create a file called authorization.rb in app/models.
20
+
21
+ Here's an example:
22
+
23
+ class Authorization
24
+ extend Monty::Access
25
+
26
+ # This creates the following regex matching: \/posts(\/.*)?
27
+ # Allows: /posts, /posts/, /posts/<any method>
28
+ permission 'posts'
29
+
30
+ # This creates the following regex matching: \/posts(?!\/(destroy))(\/.*)?
31
+ # Not allowed: /posts/destroy
32
+ # Allows: /posts, /posts/, /posts/<any method but destroy>
33
+ permission 'posts' do
34
+ resource 'posts' do
35
+ except 'destroy'
36
+ end
37
+ end
38
+
39
+ # This creates the following regex matching: \/posts\/(show|edit|update)
40
+ # Only allows: /posts/show, /posts/edit and /posts/update
41
+ permission 'posts' do
42
+ resource 'posts' do
43
+ only 'show', 'edit', 'update'
44
+ end
45
+ end
46
+
47
+ # Permissions can have more than one resource
48
+ permission 'public' do
49
+ resource 'posts'
50
+ resource 'welcome'
51
+ resource 'feeds'
52
+ end
53
+
54
+ permission 'my_account' do
55
+ resource 'users' do
56
+ only 'show', 'edit', 'update'
57
+ end
58
+ end
59
+
60
+ # To make one of the above permissions public
61
+ public_access 'public'
62
+
63
+ # To make one of the above permissions protected
64
+ protected_access 'my_account'
65
+ end
66
+
67
+
68
+ Monty only has the concept of public and protected right now. After you have authenticated your user, you'll need to have some code in your resource that looks like:
69
+
70
+ session[:access_rights] = Monty.authenticated_access
71
+
72
+ Don't forget to reset your session when the user logs out.
73
+
74
+ Ummm, I think that's it for now. Let me know if you have any questions.
75
+
76
+ This project is the replacement for Lockdown.
77
+
78
+ Note on Patches/Pull Requests
79
+ =============
6
80
 
7
81
  * Fork the project.
8
82
  * Make your feature addition or bug fix.
@@ -12,6 +86,7 @@ Description goes here.
12
86
  (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
87
  * Send me a pull request. Bonus points for topic branches.
14
88
 
15
- == Copyright
89
+ Copyright
90
+ =============
16
91
 
17
92
  Copyright (c) 2010 Andrew Stone. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,7 +1,8 @@
1
1
  require 'rubygems'
2
2
  require 'rake'
3
3
 
4
- require 'lib/monty.rb'
4
+ require 'lib/monty'
5
+
5
6
  begin
6
7
  require 'jeweler'
7
8
  Jeweler::Tasks.new do |gem|
@@ -3,17 +3,27 @@
3
3
  $:.unshift(File.dirname(__FILE__))
4
4
 
5
5
  module Monty
6
- def self.version
7
- '0.1.0'
8
- end
6
+ class << self
7
+ # App version
8
+ def version
9
+ '0.2.0'
10
+ end
9
11
 
10
- def self.authenticated_access
11
- Monty::Configuration.public_access + "|" + Monty::Configuration.protected_access
12
- end
13
- end
12
+ # @return [Regexp] with \A \z boundaries
13
+ def regex(string)
14
+ Regexp.new(/\A#{string}\z/)
15
+ end
16
+
17
+ # @return [String] concatentation of public_access + "|" + protected_access
18
+ def authenticated_access
19
+ Monty::Configuration.public_access + "|" + Monty::Configuration.protected_access
20
+ end
21
+ end # class block
22
+ end # Monty
14
23
 
15
24
  require 'monty/configuration'
16
25
  require 'monty/watch'
17
- require 'monty/controller'
26
+ require 'monty/delivery'
27
+ require 'monty/resource'
18
28
  require 'monty/permission'
19
29
  require 'monty/access'
@@ -3,30 +3,30 @@
3
3
  module Monty
4
4
  module Access
5
5
  # Define permision that defines how your application is accessed.
6
- # # All methods on the site controller will be open to users who have
6
+ # # All methods on the site resource will be open to users who have
7
7
  # # this permission.
8
8
  # permission :public_pages do
9
- # controller :site
9
+ # resource :site
10
10
  # end
11
11
  #
12
- # # Can use multiple controller statements
12
+ # # Can use multiple resource statements
13
13
  # permission :public_pages do
14
- # controller :site
15
- # controller :posts
14
+ # resource :site
15
+ # resource :posts
16
16
  # end
17
17
  #
18
- # # Only methods show, edit and update on the users controller will
18
+ # # Only methods show, edit and update on the users resource will
19
19
  # # be open to users who have this permission.
20
20
  # permission :my_account_pages do
21
- # controller :users do
21
+ # resource :users do
22
22
  # only :show, :edit, :update
23
23
  # end
24
24
  # end
25
25
  #
26
- # # All methods except destroy on the users controller will be
26
+ # # All methods except destroy on the users resource will be
27
27
  # # open to users who have this permission.
28
28
  # permission :manage_users do
29
- # controller :users do
29
+ # resource :users do
30
30
  # except :destroy
31
31
  # end
32
32
  # end
@@ -38,7 +38,7 @@ module Monty
38
38
  if block_given?
39
39
  permission.instance_eval(&block)
40
40
  else
41
- permission.controller(permission.name)
41
+ permission.resource(permission.name)
42
42
  end
43
43
 
44
44
  unless Monty::Configuration.has_permission?(permission)
@@ -0,0 +1,80 @@
1
+ # encoding: utf-8
2
+
3
+ $:.unshift(File.dirname(__FILE__))
4
+
5
+ module Monty
6
+ class Delivery
7
+ # env['REQUEST_PATH'] || env['PATH_INFO']
8
+ attr_accessor :path
9
+ # env['REQUEST_METHOD']
10
+ attr_accessor :method
11
+ # session[:access_rights]
12
+ attr_accessor :access_rights
13
+
14
+ def initialize(env)
15
+ @path = env['REQUEST_PATH'] || env['PATH_INFO']
16
+ @method = (env['REQUEST_METHOD'] || 'GET').to_s.downcase.to_sym
17
+ @post_body = env['rack.input']
18
+ session = env['rack.session'] || {}
19
+ @access_rights = session[:access_rights] || Monty::Configuration.public_access
20
+ end
21
+
22
+ # @return [true|false] if the given path and method are allowed
23
+ def allowed?
24
+ return true if @path == '/'
25
+
26
+ begin
27
+ ::Authorization.configure
28
+ rescue NameError
29
+ end
30
+
31
+ @access_rights_regex = Monty.regex(@access_rights)
32
+
33
+ @access_rights_regex.match(@path) || verb_match?
34
+ end
35
+
36
+ private
37
+
38
+ # Methods like create and update are determined by the HTTP verb.
39
+ # If the request is against the root resource path and the REQUEST_METHOD
40
+ # is POST, determine if the user has access rights to /create or
41
+ # /update (if _method=put)
42
+ #
43
+ # @return [true|false] if request is allowed when considering the HTTP verb
44
+ def verb_match?
45
+
46
+ return false if @method == :get || !Monty::Resource.regex.match(@path)
47
+
48
+ @path += "/" unless @path =~ /\/$/
49
+
50
+ if @method == :post
51
+ if put?
52
+ @access_rights_regex.match("#{@path}update")
53
+ else
54
+ @access_rights_regex.match("#{@path}create")
55
+ end
56
+ end
57
+ end
58
+
59
+ # In Rails, :put method is determined by _method parameter
60
+ def put?
61
+ request_query_params.include?('_method=put')
62
+ end
63
+
64
+ # Set request_query_params instance variable if not set
65
+ def request_query_params
66
+ @request_query_params ||= parse_request_query_params
67
+ end
68
+
69
+ # Parse out the query params
70
+ def parse_request_query_params
71
+ query_params = []
72
+ if @post_body
73
+ post_body_string = @post_body.read
74
+ query_params = post_body_string.split('&')
75
+ @post_body.rewind if @post_body.respond_to?(:rewind)
76
+ end
77
+ query_params
78
+ end
79
+ end # Delivery
80
+ end # Monty
@@ -4,27 +4,27 @@ module Monty
4
4
  class Permission
5
5
  # Name of permission
6
6
  attr_accessor :name
7
- # Array of controller objects that define the access rights for this permission
8
- attr_accessor :controllers
7
+ # Array of resource objects that define the access rights for this permission
8
+ attr_accessor :resources
9
9
 
10
10
  # @param [String,Symbol] name permission reference.
11
11
  def initialize(name)
12
12
  @name = name.to_s
13
- @controllers = []
13
+ @resources = []
14
14
  end
15
15
 
16
- # @param [String,Symbol] name controller reference.
17
- # @return new controller
18
- def controller(name, &block)
19
- controller = Monty::Controller.new(name)
20
- controller.instance_eval(&block) if block_given?
21
- @controllers << controller
22
- controller
16
+ # @param [String,Symbol] name resource reference.
17
+ # @return new resource
18
+ def resource(name, &block)
19
+ resource = Monty::Resource.new(name)
20
+ resource.instance_eval(&block) if block_given?
21
+ @resources << resource
22
+ resource
23
23
  end
24
24
 
25
- # @return String representing all controllers defining this permission
25
+ # @return String representing all resources defining this permission
26
26
  def regex_pattern
27
- controllers.collect{|c| "(#{c.regex_pattern})"}.join("|")
27
+ resources.collect{|r| "(#{r.regex_pattern})"}.join("|")
28
28
  end
29
29
  end # Permission
30
30
  end # Monty
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+
3
+ module Monty
4
+ class Resource
5
+ class << self
6
+ attr_accessor :resources, :resources_regex
7
+
8
+ # When a new resource is created, this method is called to register the root
9
+ def register_regex(resource)
10
+ resource = "(#{resource})"
11
+ @resources << resource unless @resources.include?(resource)
12
+ end
13
+
14
+ # @return [Regexp] created from resources' base regex
15
+ def regex
16
+ @resources_regex ||= Monty.regex(@resources.join("|"))
17
+ end
18
+ end # class block
19
+
20
+ # Initialize resources to empty array
21
+ @resources = []
22
+
23
+ # Name of the resource
24
+ attr_accessor :name
25
+ # Regular expression pattern
26
+ attr_accessor :regex_pattern
27
+ # The only methods restricted on the resource
28
+ attr_accessor :exceptions
29
+ # The only methods allowed on the resource
30
+ attr_accessor :inclusions
31
+
32
+
33
+ # @param [String,Symbol] name resource reference.
34
+ def initialize(name)
35
+ @name = name.to_s
36
+ @regex_pattern = "\/#{@name}(\/.*)?"
37
+ self.class.register_regex(@regex_pattern)
38
+ end
39
+
40
+ # @param *[String,Symbol] only methods restricted on the resource
41
+ def except(*methods)
42
+ return if methods.empty?
43
+ @exceptions = methods.collect{|m| m.to_s}
44
+ @regex_pattern = "\/#{@name}(?!\/(#{@exceptions.join('|')}))(\/.*)?"
45
+ end
46
+
47
+ # @param *[String,Symbol] only methods allowed on the resource
48
+ def only(*methods)
49
+ return if methods.empty?
50
+ @inclusions = methods.collect{|m| m.to_s}
51
+ @regex_pattern = "\/#{@name}\/(#{@inclusions.join('|')})(\/)?"
52
+ end
53
+ end # Resource
54
+ end # Monty
@@ -15,8 +15,9 @@ module Monty
15
15
 
16
16
  # Authorize request. Redirect if access is denied.
17
17
  def _call(env)
18
+ delivery = Monty::Delivery.new(env)
18
19
 
19
- unless allowed?(env)
20
+ unless delivery.allowed?
20
21
  return [302, redirect_headers, []]
21
22
  end
22
23
 
@@ -25,28 +26,6 @@ module Monty
25
26
 
26
27
  private
27
28
 
28
- # @return [True,False] created from value of rack.session[:access_rights]
29
- def allowed?(env)
30
- path = env['PATH_INFO']
31
-
32
- return true if path == '/'
33
-
34
- access_rights(env).match(path)
35
- end
36
-
37
- # @return [Regexp] created from value of rack.session[:access_rights]
38
- def access_rights(env)
39
- begin
40
- ::Authorization.configure
41
- rescue NameError
42
- end
43
-
44
- session = env['rack.session'] || {}
45
- regex_string = session[:access_rights] || Monty::Configuration.public_access
46
-
47
- Regexp.new(/\A#{regex_string}\z/)
48
- end
49
-
50
29
  def redirect_headers
51
30
  {'Location' => Monty::Configuration.access_denied_path, 'Content-Type' => 'text/html'}
52
31
  end
@@ -11,22 +11,22 @@ class TestMontyAccess < Test::Unit::TestCase
11
11
  assert_respond_to self, :permission
12
12
  end
13
13
 
14
- def test_permission_with_single_controller
14
+ def test_permission_with_single_resource
15
15
  perm = permission(:my_perm) do
16
- controller :my_controller
16
+ resource :my_resource
17
17
  end
18
18
 
19
- controller = perm.controllers.first
20
- assert_equal 'my_controller', controller.name
21
- assert_equal "\/my_controller(\/.*)?", controller.regex_pattern
19
+ resource = perm.resources.first
20
+ assert_equal 'my_resource', resource.name
21
+ assert_equal "\/my_resource(\/.*)?", resource.regex_pattern
22
22
  end
23
23
 
24
24
  def test_permission_without_block
25
25
  perm = permission(:users)
26
26
 
27
- controller = perm.controllers.first
28
- assert_equal 'users', controller.name
29
- assert_equal "\/users(\/.*)?", controller.regex_pattern
27
+ resource = perm.resources.first
28
+ assert_equal 'users', resource.name
29
+ assert_equal "\/users(\/.*)?", resource.regex_pattern
30
30
  end
31
31
 
32
32
  def test_public_access
@@ -8,35 +8,35 @@ class TestMontyPermission < Test::Unit::TestCase
8
8
 
9
9
  def test_initializer_sets_correct_state
10
10
  assert_equal @permission.name, 'my_account'
11
- assert_equal @permission.controllers, []
11
+ assert_equal @permission.resources, []
12
12
  end
13
13
 
14
- def test_controller
15
- @permission.controller(:users)
14
+ def test_resource
15
+ @permission.resource(:users)
16
16
 
17
- controller = @permission.controllers.first
18
- assert_equal controller.name, 'users'
17
+ resource = @permission.resources.first
18
+ assert_equal resource.name, 'users'
19
19
  end
20
20
 
21
- def test_controller_with_block
22
- @permission.controller(:users) do
21
+ def test_resource_with_block
22
+ @permission.resource(:users) do
23
23
  except :destroy
24
24
  end
25
25
 
26
- controller = @permission.controllers.first
27
- assert_equal controller.exceptions, ['destroy']
26
+ resource = @permission.resources.first
27
+ assert_equal resource.exceptions, ['destroy']
28
28
  end
29
29
 
30
30
 
31
31
  def test_regex_pattern
32
- @permission.controller(:users)
32
+ @permission.resource(:users)
33
33
 
34
34
  assert_equal @permission.regex_pattern, "(\/users(\/.*)?)"
35
35
  end
36
36
 
37
- def test_regex_pattern_with_multiple_controllers
38
- @permission.controller(:users)
39
- @permission.controller(:posts)
37
+ def test_regex_pattern_with_multiple_resources
38
+ @permission.resource(:users)
39
+ @permission.resource(:posts)
40
40
 
41
41
  assert_equal @permission.regex_pattern, "(\/users(\/.*)?)|(\/posts(\/.*)?)"
42
42
  end
@@ -0,0 +1,47 @@
1
+ require 'helper'
2
+
3
+ class TestMontyResource < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @resource = Monty::Resource.new(:users)
7
+ end
8
+
9
+ def test_initializer_sets_correct_state
10
+ assert_equal @resource.name, 'users'
11
+ assert_equal @resource.regex_pattern, "\/users(\/.*)?"
12
+ end
13
+
14
+ def test_except_sets_correct_regex_pattern
15
+ @resource.except(:destroy)
16
+ assert_equal @resource.regex_pattern, "\/users(?!\/(destroy))(\/.*)?"
17
+ end
18
+
19
+ def test_except_with_multiple_params_sets_correct_regex_pattern
20
+ @resource.except(:index, :destroy)
21
+ assert_equal @resource.regex_pattern, "\/users(?!\/(index|destroy))(\/.*)?"
22
+ end
23
+
24
+ def test_except_with_no_params_preserves_regex_pattern
25
+ resource = Monty::Resource.new(:users)
26
+ resource.except()
27
+ assert_equal resource.regex_pattern, "\/users(\/.*)?"
28
+ end
29
+
30
+ def test_only_sets_correct_regex_pattern
31
+ @resource.only(:index)
32
+ assert_equal @resource.regex_pattern, "\/users\/(index)(\/)?"
33
+ end
34
+
35
+ def test_only_with_multiple_params_sets_correct_regex_pattern
36
+ @resource.only(:show, :edit)
37
+ assert_equal @resource.regex_pattern, "\/users\/(show|edit)(\/)?"
38
+ end
39
+
40
+ def test_only_with_no_params_preserves_regex_pattern
41
+ resource = Monty::Resource.new(:users)
42
+ resource.only()
43
+ assert_equal resource.regex_pattern, "\/users(\/.*)?"
44
+ end
45
+
46
+ end
47
+
@@ -56,7 +56,7 @@ class TestMonty < Test::Unit::TestCase
56
56
 
57
57
  def test_it_allows_uri_access_to_only_show
58
58
  Authorization.permission :posts do
59
- controller :posts do
59
+ resource :posts do
60
60
  only :show
61
61
  end
62
62
  end
@@ -80,7 +80,7 @@ class TestMonty < Test::Unit::TestCase
80
80
 
81
81
  def test_it_allows_uri_access_to_all_except_show
82
82
  Authorization.permission :posts do
83
- controller :posts do
83
+ resource :posts do
84
84
  except :show
85
85
  end
86
86
  end
@@ -100,6 +100,51 @@ class TestMonty < Test::Unit::TestCase
100
100
 
101
101
  get '/posts/edit', {}
102
102
  assert last_response.ok?
103
+
104
+ get '/posts/edit/', {}
105
+ assert last_response.ok?
106
+ end
107
+
108
+ def test_it_allows_uri_access_to_create_as_post
109
+ Authorization.permission :posts do
110
+ resource :posts do
111
+ only :new, :create
112
+ end
113
+ end
114
+ Authorization.public_access :posts
115
+
116
+ post '/posts', {}
117
+ assert last_response.ok?
118
+
119
+ post '/posts/', {}
120
+ assert last_response.ok?
121
+
122
+ get '/posts/new', {}
123
+ assert last_response.ok?
124
+
125
+ get '/posts/new/', {}
126
+ assert last_response.ok?
127
+ end
128
+
129
+ def test_it_allows_uri_access_to_update_as_put
130
+ Authorization.permission :posts do
131
+ resource :posts do
132
+ only :show, :edit, :update
133
+ end
134
+ end
135
+ Authorization.public_access :posts
136
+
137
+ post '/posts', {:_method => "put"}
138
+ assert last_response.ok?
139
+
140
+ post '/posts/', {:_method => "put"}
141
+ assert last_response.ok?
142
+
143
+ get '/posts/show', {}
144
+ assert last_response.ok?
145
+
146
+ get '/posts/show/', {}
147
+ assert last_response.ok?
103
148
  end
104
149
  end
105
150
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - stonean
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-05 00:00:00 -04:00
17
+ date: 2010-05-19 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -48,15 +48,15 @@ files:
48
48
  - lib/monty.rb
49
49
  - lib/monty/access.rb
50
50
  - lib/monty/configuration.rb
51
- - lib/monty/controller.rb
51
+ - lib/monty/delivery.rb
52
52
  - lib/monty/permission.rb
53
+ - lib/monty/resource.rb
53
54
  - lib/monty/watch.rb
54
- - monty.gemspec
55
55
  - test/helper.rb
56
56
  - test/monty/test_access.rb
57
57
  - test/monty/test_configuration.rb
58
- - test/monty/test_controller.rb
59
58
  - test/monty/test_permission.rb
59
+ - test/monty/test_resource.rb
60
60
  - test/monty/test_watch.rb
61
61
  - test/rcov.opts
62
62
  - test/test_monty.rb
@@ -93,8 +93,8 @@ summary: Rack based authorization system
93
93
  test_files:
94
94
  - test/helper.rb
95
95
  - test/monty/test_configuration.rb
96
- - test/monty/test_controller.rb
97
96
  - test/monty/test_access.rb
98
97
  - test/monty/test_watch.rb
99
98
  - test/monty/test_permission.rb
99
+ - test/monty/test_resource.rb
100
100
  - test/test_monty.rb
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Monty
4
- class Controller
5
- # Name of the controller
6
- attr_accessor :name
7
- # Regular expression pattern
8
- attr_accessor :regex_pattern
9
- # The only methods restricted on the controller
10
- attr_accessor :exceptions
11
- # The only methods allowed on the controller
12
- attr_accessor :inclusions
13
-
14
-
15
- # @param [String,Symbol] name controller reference.
16
- def initialize(name)
17
- @name = name.to_s
18
- @regex_pattern = "\/#{@name}(\/.*)?"
19
- end
20
-
21
- # @param *[String,Symbol] only methods restricted on the controller
22
- def except(*methods)
23
- return if methods.empty?
24
- @exceptions = methods.collect{|m| m.to_s}
25
- @regex_pattern = "\/#{@name}(?!\/(#{@exceptions.join('|')}))(\/.*)?"
26
- end
27
-
28
- # @param *[String,Symbol] only methods allowed on the controller
29
- def only(*methods)
30
- return if methods.empty?
31
- @inclusions = methods.collect{|m| m.to_s}
32
- @regex_pattern = "\/#{@name}\/(#{@inclusions.join('|')})"
33
- end
34
- end # Controller
35
- end # Monty
@@ -1,68 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{monty}
8
- s.version = "0.1.0"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["stonean"]
12
- s.date = %q{2010-05-05}
13
- s.description = %q{Rack based authoriztion system.}
14
- s.email = %q{andy@stonean.com}
15
- s.extra_rdoc_files = [
16
- "LICENSE",
17
- "README.md"
18
- ]
19
- s.files = [
20
- ".gitignore",
21
- "LICENSE",
22
- "README.md",
23
- "Rakefile",
24
- "lib/monty.rb",
25
- "lib/monty/access.rb",
26
- "lib/monty/configuration.rb",
27
- "lib/monty/controller.rb",
28
- "lib/monty/permission.rb",
29
- "lib/monty/watch.rb",
30
- "monty.gemspec",
31
- "test/helper.rb",
32
- "test/monty/test_access.rb",
33
- "test/monty/test_configuration.rb",
34
- "test/monty/test_controller.rb",
35
- "test/monty/test_permission.rb",
36
- "test/monty/test_watch.rb",
37
- "test/rcov.opts",
38
- "test/test_monty.rb"
39
- ]
40
- s.homepage = %q{http://github.com/stonean/monty}
41
- s.rdoc_options = ["--charset=UTF-8"]
42
- s.require_paths = ["lib"]
43
- s.rubygems_version = %q{1.3.6}
44
- s.summary = %q{Rack based authorization system}
45
- s.test_files = [
46
- "test/helper.rb",
47
- "test/monty/test_configuration.rb",
48
- "test/monty/test_controller.rb",
49
- "test/monty/test_access.rb",
50
- "test/monty/test_watch.rb",
51
- "test/monty/test_permission.rb",
52
- "test/test_monty.rb"
53
- ]
54
-
55
- if s.respond_to? :specification_version then
56
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
- s.specification_version = 3
58
-
59
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
- s.add_development_dependency(%q<mocha>, [">= 0.9.8"])
61
- else
62
- s.add_dependency(%q<mocha>, [">= 0.9.8"])
63
- end
64
- else
65
- s.add_dependency(%q<mocha>, [">= 0.9.8"])
66
- end
67
- end
68
-
@@ -1,47 +0,0 @@
1
- require 'helper'
2
-
3
- class TestMontyController < Test::Unit::TestCase
4
-
5
- def setup
6
- @controller = Monty::Controller.new(:users)
7
- end
8
-
9
- def test_initializer_sets_correct_state
10
- assert_equal @controller.name, 'users'
11
- assert_equal @controller.regex_pattern, "\/users(\/.*)?"
12
- end
13
-
14
- def test_except_sets_correct_regex_pattern
15
- @controller.except(:destroy)
16
- assert_equal @controller.regex_pattern, "\/users(?!\/(destroy))(\/.*)?"
17
- end
18
-
19
- def test_except_with_multiple_params_sets_correct_regex_pattern
20
- @controller.except(:index, :destroy)
21
- assert_equal @controller.regex_pattern, "\/users(?!\/(index|destroy))(\/.*)?"
22
- end
23
-
24
- def test_except_with_no_params_preserves_regex_pattern
25
- controller = Monty::Controller.new(:users)
26
- controller.except()
27
- assert_equal controller.regex_pattern, "\/users(\/.*)?"
28
- end
29
-
30
- def test_only_sets_correct_regex_pattern
31
- @controller.only(:index)
32
- assert_equal @controller.regex_pattern, "\/users\/(index)"
33
- end
34
-
35
- def test_only_with_multiple_params_sets_correct_regex_pattern
36
- @controller.only(:show, :edit)
37
- assert_equal @controller.regex_pattern, "\/users\/(show|edit)"
38
- end
39
-
40
- def test_only_with_no_params_preserves_regex_pattern
41
- controller = Monty::Controller.new(:users)
42
- controller.only()
43
- assert_equal controller.regex_pattern, "\/users(\/.*)?"
44
- end
45
-
46
- end
47
-