canard 0.5.0.pre → 0.6.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +5 -5
  2. data/.hound.yml +3 -0
  3. data/.rubocop.yml +27 -0
  4. data/.rubocop_todo.yml +37 -0
  5. data/.travis.yml +1 -1
  6. data/Gemfile +7 -6
  7. data/README.md +40 -37
  8. data/Rakefile +5 -2
  9. data/canard.gemspec +8 -7
  10. data/lib/ability.rb +14 -13
  11. data/lib/canard.rb +4 -2
  12. data/lib/canard/abilities.rb +7 -9
  13. data/lib/canard/adapters/active_record.rb +32 -29
  14. data/lib/canard/adapters/mongoid.rb +18 -11
  15. data/lib/canard/find_abilities.rb +8 -9
  16. data/lib/canard/railtie.rb +11 -16
  17. data/lib/canard/user_model.rb +66 -67
  18. data/lib/canard/version.rb +3 -1
  19. data/lib/generators/ability_definition.rb +16 -14
  20. data/lib/generators/canard/ability/ability_generator.rb +16 -12
  21. data/lib/generators/rspec/ability/ability_generator.rb +9 -9
  22. data/lib/tasks/canard.rake +6 -6
  23. data/test/abilities/administrators.rb +2 -2
  24. data/test/canard/abilities_test.rb +14 -21
  25. data/test/canard/ability_test.rb +40 -52
  26. data/test/canard/adapters/active_record_test.rb +71 -135
  27. data/test/canard/adapters/mongoid_test.rb +61 -132
  28. data/test/canard/canard_test.rb +8 -10
  29. data/test/canard/find_abilities_test.rb +9 -11
  30. data/test/canard/user_model_test.rb +22 -32
  31. data/test/dummy/Rakefile +3 -1
  32. data/test/dummy/app/abilities/admins.rb +4 -4
  33. data/test/dummy/app/abilities/authors.rb +3 -3
  34. data/test/dummy/app/abilities/editors.rb +2 -2
  35. data/test/dummy/app/abilities/guests.rb +3 -3
  36. data/test/dummy/app/abilities/users.rb +4 -4
  37. data/test/dummy/app/controllers/application_controller.rb +2 -0
  38. data/test/dummy/app/models/activity.rb +3 -1
  39. data/test/dummy/app/models/member.rb +3 -3
  40. data/test/dummy/app/models/mongoid_user.rb +5 -3
  41. data/test/dummy/app/models/plain_ruby_non_user.rb +2 -2
  42. data/test/dummy/app/models/plain_ruby_user.rb +3 -3
  43. data/test/dummy/app/models/post.rb +3 -1
  44. data/test/dummy/app/models/user.rb +3 -2
  45. data/test/dummy/app/models/user_without_role.rb +4 -4
  46. data/test/dummy/app/models/user_without_role_mask.rb +3 -3
  47. data/test/dummy/config.ru +3 -1
  48. data/test/dummy/config/application.rb +9 -8
  49. data/test/dummy/config/boot.rb +4 -2
  50. data/test/dummy/config/environment.rb +3 -1
  51. data/test/dummy/config/environments/development.rb +2 -0
  52. data/test/dummy/config/environments/test.rb +4 -2
  53. data/test/dummy/config/initializers/secret_token.rb +2 -0
  54. data/test/dummy/config/initializers/session_store.rb +3 -1
  55. data/test/dummy/config/initializers/wrap_parameters.rb +3 -1
  56. data/test/dummy/config/mongoid3.yml +5 -1
  57. data/test/dummy/config/routes.rb +2 -0
  58. data/test/dummy/db/migrate/20120430083231_initialize_db.rb +7 -7
  59. data/test/dummy/db/schema.rb +11 -11
  60. data/test/dummy/script/rails +4 -2
  61. data/test/support/reloadable.rb +14 -15
  62. data/test/test_helper.rb +7 -13
  63. metadata +18 -18
  64. data/test/dummy/config/mongoid2.yml +0 -9
@@ -1,30 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
  require 'canard'
3
5
 
4
6
  describe Canard do
5
-
6
- describe "ability_definitions" do
7
-
8
- it "should be an accessor" do
7
+ describe 'ability_definitions' do
8
+ it 'should be an accessor' do
9
9
  Canard.must_respond_to(:ability_definitions)
10
10
  end
11
11
 
12
- it "should be a hash" do
12
+ it 'should be a hash' do
13
13
  Canard.ability_definitions.must_be_instance_of Hash
14
14
  end
15
-
16
15
  end
17
16
 
18
- describe "ability_key" do
19
-
20
- it "returns a snake case version of the string" do
17
+ describe 'ability_key' do
18
+ it 'returns a snake case version of the string' do
21
19
  class_name = 'CamelCaseString'
22
20
  key = :camel_case_string
23
21
 
24
22
  Canard.ability_key(class_name).must_equal key
25
23
  end
26
24
 
27
- it "prepends namespaces to the class name" do
25
+ it 'prepends namespaces to the class name' do
28
26
  class_name = 'Namespace::CamelCaseString'
29
27
  key = :namespace_camel_case_string
30
28
 
@@ -1,35 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  describe Canard do
4
-
5
- describe "find_abilities" do
6
-
6
+ describe 'find_abilities' do
7
7
  before do
8
- Canard::Abilities.definition_paths = [File.expand_path('../../dummy/app/abilities', __FILE__)]
8
+ Canard::Abilities.definition_paths = [File.expand_path('../dummy/app/abilities', __dir__)]
9
9
  end
10
10
 
11
- it "loads the abilities into ability_definitions" do
11
+ it 'loads the abilities into ability_definitions' do
12
12
  Canard.find_abilities
13
13
 
14
14
  Canard.ability_definitions.keys.must_include :admin
15
15
  end
16
16
 
17
- it "finds abilities in the default path" do
17
+ it 'finds abilities in the default path' do
18
18
  Canard.find_abilities
19
19
 
20
20
  Canard.ability_definitions.keys.must_include :author
21
21
  Canard.ability_definitions.keys.wont_include :administrator
22
22
  end
23
23
 
24
- it "finds abilities in additional paths" do
25
- Canard::Abilities.definition_paths << File.expand_path('../../abilities', __FILE__)
24
+ it 'finds abilities in additional paths' do
25
+ Canard::Abilities.definition_paths << File.expand_path('../abilities', __dir__)
26
26
  Canard.find_abilities
27
27
 
28
28
  Canard.ability_definitions.keys.must_include :author
29
29
  Canard.ability_definitions.keys.must_include :administrator
30
30
  end
31
31
 
32
- it "reloads existing abilities" do
32
+ it 'reloads existing abilities' do
33
33
  Canard.find_abilities
34
34
  Canard::Abilities.send(:instance_variable_set, '@definitions', {})
35
35
  Canard.find_abilities
@@ -37,7 +37,5 @@ describe Canard do
37
37
  Canard.ability_definitions.keys.must_include :author
38
38
  Canard.ability_definitions.keys.must_include :admin
39
39
  end
40
-
41
40
  end
42
-
43
41
  end
@@ -1,11 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  describe Canard::UserModel do
4
-
5
6
  describe 'acts_as_user' do
6
-
7
- describe "integrating RoleModel" do
8
-
7
+ describe 'integrating RoleModel' do
9
8
  before do
10
9
  PlainRubyUser.acts_as_user
11
10
  end
@@ -16,21 +15,18 @@ describe Canard::UserModel do
16
15
  end
17
16
  end
18
17
 
19
- describe "with a roles_mask" do
20
-
18
+ describe 'with a roles_mask' do
21
19
  describe 'and :roles => [] specified' do
22
-
23
20
  before do
24
- PlainRubyUser.acts_as_user :roles => [:viewer, :author, :admin]
21
+ PlainRubyUser.acts_as_user roles: %i[viewer author admin]
25
22
  end
26
23
 
27
24
  it 'sets the valid_roles for the class' do
28
- PlainRubyUser.valid_roles.must_equal [:viewer, :author, :admin]
25
+ PlainRubyUser.valid_roles.must_equal %i[viewer author admin]
29
26
  end
30
27
  end
31
28
 
32
29
  describe 'and no :roles => [] specified' do
33
-
34
30
  before do
35
31
  PlainRubyUser.acts_as_user
36
32
  end
@@ -41,41 +37,37 @@ describe Canard::UserModel do
41
37
  end
42
38
  end
43
39
 
44
- describe "with no roles_mask" do
45
-
40
+ describe 'with no roles_mask' do
46
41
  before do
47
- PlainRubyNonUser.acts_as_user :roles => [:viewer, :author, :admin]
42
+ PlainRubyNonUser.acts_as_user roles: %i[viewer author admin]
48
43
  end
49
44
 
50
- it "sets no roles" do
45
+ it 'sets no roles' do
51
46
  PlainRubyNonUser.valid_roles.must_equal []
52
47
  end
53
48
  end
54
49
 
55
- describe "setting the role_mask" do
56
-
50
+ describe 'setting the role_mask' do
57
51
  before do
58
52
  PlainRubyNonUser.send :attr_accessor, :my_roles
59
- PlainRubyNonUser.acts_as_user :roles => [:viewer, :author], :roles_mask => :my_roles
53
+ PlainRubyNonUser.acts_as_user roles: %i[viewer author], roles_mask: :my_roles
60
54
  end
61
55
 
62
56
  it 'sets the valid_roles for the class' do
63
- PlainRubyNonUser.valid_roles.must_equal [:viewer, :author]
57
+ PlainRubyNonUser.valid_roles.must_equal %i[viewer author]
64
58
  end
65
59
  end
66
60
  end
67
61
 
68
- describe "scopes" do
69
-
62
+ describe 'scopes' do
70
63
  before do
71
- PlainRubyUser.acts_as_user :roles => [:viewer, :author, :admin]
64
+ PlainRubyUser.acts_as_user roles: %i[viewer author admin]
72
65
  end
73
66
 
74
- describe "on a plain Ruby class" do
75
-
67
+ describe 'on a plain Ruby class' do
76
68
  subject { PlainRubyUser }
77
69
 
78
- it "creates no scope methods" do
70
+ it 'creates no scope methods' do
79
71
  subject.wont_respond_to :admins
80
72
  subject.wont_respond_to :authors
81
73
  subject.wont_respond_to :viewers
@@ -90,26 +82,24 @@ describe Canard::UserModel do
90
82
  end
91
83
 
92
84
  describe Canard::UserModel::InstanceMethods do
93
-
94
85
  before do
95
- Canard::Abilities.default_path = File.expand_path('../../dummy/app/abilities', __FILE__)
86
+ Canard::Abilities.default_path = File.expand_path('../dummy/app/abilities', __dir__)
96
87
  # reload abilities because the reloader will have removed them after the railtie ran
97
88
  Canard.find_abilities
98
89
  end
99
90
 
100
- describe "ability" do
101
-
91
+ describe 'ability' do
102
92
  before do
103
- PlainRubyUser.acts_as_user :roles => [:admin, :author]
93
+ PlainRubyUser.acts_as_user roles: %i[admin author]
104
94
  end
105
95
 
106
96
  subject { PlainRubyUser.new(:author).ability }
107
97
 
108
- it "returns an ability for this instance" do
98
+ it 'returns an ability for this instance' do
109
99
  subject.must_be_instance_of Ability
110
100
  end
111
101
 
112
- it "has the users abilities" do
102
+ it 'has the users abilities' do
113
103
  subject.can?(:new, Post).must_equal true
114
104
  subject.can?(:create, Post).must_equal true
115
105
  subject.can?(:edit, Post).must_equal true
@@ -118,7 +108,7 @@ describe Canard::UserModel::InstanceMethods do
118
108
  subject.can?(:index, Post).must_equal true
119
109
  end
120
110
 
121
- it "has no other abilities" do
111
+ it 'has no other abilities' do
122
112
  subject.cannot?(:destroy, Post).must_equal true
123
113
  end
124
114
  end
@@ -1,7 +1,9 @@
1
1
  #!/usr/bin/env rake
2
+ # frozen_string_literal: true
3
+
2
4
  # Add your own tasks in files placed in lib/tasks ending in .rake,
3
5
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
6
 
5
- require File.expand_path('../config/application', __FILE__)
7
+ require File.expand_path('config/application', __dir__)
6
8
 
7
9
  Dummy::Application.load_tasks
@@ -1,9 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Canard::Abilities.for(:admin) do
2
-
3
4
  can :manage, [Post, User]
4
-
5
+
5
6
  cannot :destroy, User do |u|
6
7
  (user == u)
7
8
  end
8
-
9
- end
9
+ end
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Canard::Abilities.for(:author) do
2
-
3
- can [:create, :update, :read], Post
4
-
4
+ can %i[create update read], Post
5
5
  end
@@ -1,7 +1,7 @@
1
- Canard::Abilities.for(:editor) do
1
+ # frozen_string_literal: true
2
2
 
3
+ Canard::Abilities.for(:editor) do
3
4
  includes_abilities_of :author
4
5
 
5
6
  cannot :create, Post
6
-
7
7
  end
@@ -1,5 +1,5 @@
1
- Canard::Abilities.for(:guest) do
1
+ # frozen_string_literal: true
2
2
 
3
+ Canard::Abilities.for(:guest) do
3
4
  can :read, Post
4
-
5
- end
5
+ end
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Canard::Abilities.for(:user) do
2
-
3
- can [:edit, :update], Member, :user_id => user.id
4
-
5
- end
4
+ can %i[edit update], Member, user_id: user.id
5
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class ApplicationController < ActionController::Base
2
4
  protect_from_forgery
3
5
  end
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Activity
2
- end
4
+ end
@@ -1,7 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Member < ActiveRecord::Base
2
-
3
4
  belongs_to :user
4
-
5
+
5
6
  attr_accessible :user, :user_id
6
-
7
7
  end
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class MongoidUser
2
4
  include Mongoid::Document
3
-
4
- acts_as_user :roles => [:viewer, :author, :admin]
5
- end
5
+
6
+ acts_as_user roles: %i[viewer author admin]
7
+ end
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class PlainRubyNonUser
2
-
3
4
  extend Canard::UserModel
4
-
5
5
  end
@@ -1,5 +1,6 @@
1
- class PlainRubyUser
1
+ # frozen_string_literal: true
2
2
 
3
+ class PlainRubyUser
3
4
  extend Canard::UserModel
4
5
 
5
6
  attr_accessor :roles_mask
@@ -7,5 +8,4 @@ class PlainRubyUser
7
8
  def initialize(*roles)
8
9
  self.roles = roles
9
10
  end
10
-
11
- end
11
+ end
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Post < ActiveRecord::Base
2
- end
4
+ end
@@ -1,6 +1,7 @@
1
- class User < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
2
 
3
- acts_as_user :roles => [:viewer, :author, :admin, :editor]
3
+ class User < ActiveRecord::Base
4
+ acts_as_user roles: %i[viewer author admin editor]
4
5
 
5
6
  attr_accessible :roles
6
7
  end
@@ -1,7 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class UserWithoutRole < ActiveRecord::Base
2
-
3
- acts_as_user
4
-
4
+ acts_as_user
5
+
5
6
  attr_accessible :roles
6
7
  end
7
-
@@ -1,5 +1,5 @@
1
- class UserWithoutRoleMask < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
2
 
3
+ class UserWithoutRoleMask < ActiveRecord::Base
3
4
  attr_accessible :roles
4
-
5
- end
5
+ end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This file is used by Rack-based servers to start the application.
2
4
 
3
- require ::File.expand_path('../config/environment', __FILE__)
5
+ require ::File.expand_path('../config/environment', __FILE__)
4
6
  run Dummy::Application
@@ -1,18 +1,20 @@
1
- require File.expand_path('../boot', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('boot', __dir__)
2
4
 
3
5
  # Pick the frameworks you want:
4
- require "active_record/railtie"
5
- require "action_controller/railtie"
6
- require "active_resource/railtie"
7
- require "rails/test_unit/railtie"
6
+ require 'active_record/railtie'
7
+ require 'action_controller/railtie'
8
+ require 'active_resource/railtie'
9
+ require 'rails/test_unit/railtie'
8
10
 
9
- Bundler.require if defined?(Bundler)
11
+ Bundler.require if defined?(Bundler)
10
12
  require 'canard'
11
13
 
12
14
  module Dummy
13
15
  class Application < Rails::Application
14
16
  # Configure the default encoding used in templates for Ruby 1.9.
15
- config.encoding = "utf-8"
17
+ config.encoding = 'utf-8'
16
18
 
17
19
  # Configure sensitive parameters which will be filtered from the log file.
18
20
  config.filter_parameters += [:password]
@@ -29,4 +31,3 @@ module Dummy
29
31
  config.active_record.whitelist_attributes = true
30
32
  end
31
33
  end
32
-
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
- gemfile = File.expand_path('../../../../Gemfile', __FILE__)
4
+ gemfile = File.expand_path('../../../Gemfile', __dir__)
3
5
 
4
6
  if File.exist?(gemfile)
5
7
  ENV['BUNDLE_GEMFILE'] = gemfile
@@ -7,4 +9,4 @@ if File.exist?(gemfile)
7
9
  Bundler.setup
8
10
  end
9
11
 
10
- $:.unshift File.expand_path('../../../../lib', __FILE__)
12
+ $LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)