lolita 3.3.9 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8100b8ed2afcaecc1e852b9165d5e5f29a2f4a04
4
- data.tar.gz: ff559fb108e2a5ec335fd16e6ad03eb0c30ac0ee
3
+ metadata.gz: 4b73d7232b6d16a4d0b0b0c0c35a1928fe316390
4
+ data.tar.gz: 8f0f31e08f83abff1884b007b8559fa96c25108c
5
5
  SHA512:
6
- metadata.gz: 707395307c6fbe049f7a1fbe8ff2c5bae14658c5bd1548887594926dbaf2fe9a74cc5d5403082d1f06a719bc0e6ba9389a18e367fadcfbcf296d0a0c87bd9ef6
7
- data.tar.gz: cebbb5d41e485b07bbe9a39f94e8ac4baf450eeaf4b1e430a87492ed38a8da9308af2560eceddacb560b34d2ab41052ca1d4a6e8125d8d0d6a49affc82efe63e
6
+ metadata.gz: 25028f189a32ad2a665b3f4cbfff3002e5517845d6c1e84a2d2d329cd0f18fd1e0a8ebec07d8118cb2471260fb263b632667b9065fd506cebe493d669d8baaf9
7
+ data.tar.gz: 502fd36b78421dcb183bf3c9a03ac535653f257773a3742065bf1b3197948648e0fc37fa9c3057f3fd974ef71fcca2431896ae0d38b5cde59e8d6fa07a3b6c6c
data/.gitignore CHANGED
@@ -33,3 +33,4 @@ pkg
33
33
  tags
34
34
  .gemtags
35
35
  .ruby-version
36
+ .local.vimrc
data/Gemfile CHANGED
@@ -4,7 +4,7 @@ gemspec
4
4
 
5
5
  group :test, :development do
6
6
  unless ENV['CI']
7
- gem 'byebug'
7
+ gem 'pry-byebug'
8
8
  end
9
9
  gem 'fabrication', '~> 1.3.2'
10
10
  gem 'rspec', '~> 2.13'
data/README.md CHANGED
@@ -14,7 +14,7 @@ password: lolita
14
14
 
15
15
  First add Lolita gem to your Gemfile
16
16
 
17
- gem 'lolita', '~> 3.3.0'
17
+ gem 'lolita', '~> 3.4.0'
18
18
 
19
19
  Then go to your rails project and
20
20
 
@@ -431,7 +431,13 @@ tr.nested-list td{
431
431
  display: inline-block;
432
432
  margin-right: 10px;
433
433
  }
434
-
434
+ #main .box form.filter .field {
435
+ overflow: inherit;
436
+ }
437
+ .filter button[type='submit'] {
438
+ float: right;
439
+ margin-top: 8px;
440
+ }
435
441
  /* --------------------------------------------- */
436
442
 
437
443
  /* Pagination */
@@ -4,7 +4,7 @@ class Lolita::InfoController < ApplicationController
4
4
 
5
5
  def index
6
6
  if Lolita.mappings.any?
7
- if available_mapping = Lolita.mappings.detect{ |name,mapping| authorization_proxy.authorize!(:read, mapping.to) }
7
+ if available_mapping = Lolita.mappings.detect{ |name,mapping| authorization_proxy.can?(:read, mapping.to) }
8
8
  mapping = available_mapping.last
9
9
  return redirect_to(lolita_resources_path(mapping))
10
10
  end
@@ -50,6 +50,8 @@ module Lolita
50
50
  def ability_criteria
51
51
  @ability_criteria ||= if @adapter.klass.respond_to?(:accessible_by)
52
52
  @adapter.klass.accessible_by(current_ability)
53
+ elsif current_ability.respond_to?(:scope)
54
+ current_ability.scope
53
55
  else
54
56
  nil
55
57
  end
@@ -216,4 +218,4 @@ module Lolita
216
218
 
217
219
  end
218
220
  end
219
- end
221
+ end
@@ -7,10 +7,11 @@ module Lolita
7
7
  include Lolita::Controllers::InternalHelpers
8
8
  include Lolita::Controllers::AuthenticationHelpers
9
9
  if Lolita.rails?
10
- include Lolita::Controllers::RailsHelpers
10
+ include Lolita::Controllers::RailsHelpers
11
11
  end
12
+ attr_accessor :current_ability
12
13
  end
13
14
  end
14
15
 
15
16
  end
16
- end
17
+ end
@@ -1,7 +1,7 @@
1
1
  module Lolita
2
2
  module Extensions
3
3
  module Authentication
4
-
4
+
5
5
  class DefaultAdapter
6
6
  def initialize context, options={}
7
7
  end
@@ -9,7 +9,7 @@ module Lolita
9
9
  def current_user
10
10
  nil
11
11
  end
12
-
12
+
13
13
  def user_signed_in?
14
14
  false
15
15
  end
@@ -21,4 +21,4 @@ module Lolita
21
21
 
22
22
  end
23
23
  end
24
- end
24
+ end
@@ -1,9 +1,9 @@
1
1
  module Lolita
2
2
  module Extensions
3
3
  module Authorization
4
-
4
+
5
5
  class CanCanAdapter
6
-
6
+
7
7
  def initialize context, options={}
8
8
  raise NameError, "CanCan is not defined" unless defined?(CanCan)
9
9
  raise Lolita::NoAuthorizationDefinedError, "Lolita.authorization is not defined" unless Lolita.authorization
@@ -32,7 +32,7 @@ module Lolita
32
32
  def authorize! *args
33
33
  current_ability && @context && @context.authorize!(*args) || current_ability.authorize!(*args)
34
34
  end
35
-
35
+
36
36
  private
37
37
 
38
38
  def set_default_options
@@ -42,4 +42,4 @@ module Lolita
42
42
 
43
43
  end
44
44
  end
45
- end
45
+ end
@@ -1,9 +1,10 @@
1
1
  require "#{File.dirname(__FILE__)}/default_adapter"
2
2
  require "#{File.dirname(__FILE__)}/cancan_adapter"
3
+ require "#{File.dirname(__FILE__)}/pundit_adapter"
3
4
 
4
5
  module Lolita
5
6
  class NoAuthorizationDefinedError < ArgumentError ; end
6
-
7
+
7
8
  module Extensions
8
9
  module Authorization
9
10
 
@@ -31,7 +32,7 @@ module Lolita
31
32
  def current_ability *args
32
33
  @adapter.current_ability *args
33
34
  end
34
-
35
+
35
36
  private
36
37
 
37
38
  def get_adapter
@@ -45,4 +46,4 @@ module Lolita
45
46
 
46
47
  end
47
48
  end
48
- end
49
+ end
@@ -0,0 +1,77 @@
1
+ module Lolita
2
+ module Extensions
3
+ module Authorization
4
+ class PunditAdapter
5
+
6
+ def initialize context, options={}
7
+ raise NameError, "Pundit is not defined" unless defined?(Pundit)
8
+ raise Lolita::NoAuthorizationDefinedError, "Lolita.authorization is not defined" unless Lolita.authorization
9
+ @context = context
10
+ @options = options
11
+ current_ability
12
+ end
13
+
14
+ def can? *args
15
+ !!(ability = current_ability(*args) and ability.send(policy_method(args)))
16
+ end
17
+
18
+ def cannot? *args
19
+ !can?(*args)
20
+ end
21
+
22
+ def current_ability *args
23
+ if current_user && record = get_record(*args)
24
+ @current_ability = Pundit.policy(current_user, record) || Lolita.policy_class.new(current_user, record)
25
+ @context && @context.instance_variable_set(:"@current_ability", @current_ability)
26
+ end
27
+ @current_ability
28
+ end
29
+
30
+ def authorize! *args
31
+ unless ability = current_ability(*args) and ability.public_send(policy_method(args))
32
+ raise Pundit::NotAuthorizedError.new("not allowed to #{args.first} this #{args.last}")
33
+ end
34
+ true
35
+ end
36
+
37
+ private
38
+
39
+ def current_user
40
+ @context && @context.authentication_proxy.current_user
41
+ end
42
+
43
+ def get_record *args
44
+ if args.any?
45
+ record_as_instance(args.last)
46
+ else
47
+ mapping = @options[:request].env["lolita.mapping"] and mapping.class_name.constantize
48
+ end
49
+ end
50
+
51
+ def policy_method args
52
+ "#{args.first}?"
53
+ end
54
+
55
+ # pundit can receive only instance as record, but Lolita can give
56
+ # sometime instance sometimes class or module, so we try to make it
57
+ # as instance
58
+ def record_as_instance record
59
+ if is_instance?(record)
60
+ record
61
+ elsif is_module?(record)
62
+ Object.new
63
+ else
64
+ record.new
65
+ end
66
+ end
67
+
68
+ def is_module? obj
69
+ obj.class == Module
70
+ end
71
+ def is_instance? obj
72
+ !obj.respond_to? :ancestors
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -25,7 +25,7 @@ module Lolita
25
25
  load_extension_proxy(type,context,options)
26
26
  end
27
27
  end
28
-
28
+
29
29
  def load_extension_proxy type,context=self,options={}
30
30
  proxy_class = "Lolita::Extensions::#{type.to_s.camelize}::Proxy".constantize
31
31
  initialize_arity = proxy_class.instance_method(:initialize).arity
@@ -63,4 +63,4 @@ Lolita::Extensions.add :authentication
63
63
  Lolita::Extensions.add :authorization
64
64
 
65
65
  require 'lolita/extensions/authorization/proxy'
66
- require 'lolita/extensions/authentication/proxy'
66
+ require 'lolita/extensions/authentication/proxy'
@@ -3,7 +3,7 @@ module Lolita
3
3
  class Base
4
4
  attr_reader :scope, :modules, :routes, :controllers,:resources
5
5
  attr_accessor :mappings,:default_route,:user_classes,:authentication,:authorization
6
- attr_writer :default_locale, :ability_class
6
+ attr_writer :default_locale, :ability_class, :policy_class
7
7
 
8
8
  def initialize(scope)
9
9
  @scope=scope
@@ -31,11 +31,17 @@ module Lolita
31
31
  end
32
32
  Lolita::Navigation::Tree[:"left_side_navigation"]
33
33
  end
34
-
34
+
35
+ # ability class for CanCan
35
36
  def ability_class
36
37
  @ability_class || (::Ability rescue nil) || raise("No ability class found.")
37
38
  end
38
39
 
40
+ # policy class for Pundit
41
+ def policy_class
42
+ @policy_class || (::LolitaPolicy rescue nil) || raise("No policy class found.")
43
+ end
44
+
39
45
  def locales=(value)
40
46
  unless value.is_a?(Array)
41
47
  @locales=[value]
@@ -95,7 +101,7 @@ module Lolita
95
101
  end
96
102
  }.flatten.compact.uniq
97
103
  end
98
-
104
+
99
105
  # Include module in Lolita, don't know why i need this
100
106
  def use(module_name)
101
107
  Lolita.send(:include,module_name)
@@ -165,4 +171,4 @@ module Lolita
165
171
 
166
172
  end
167
173
  end
168
- end
174
+ end
@@ -1,8 +1,8 @@
1
1
  module Lolita
2
2
  module Version
3
3
  MAJOR = 3
4
- MINOR = 3
5
- PATCH = 9
4
+ MINOR = 4
5
+ PATCH = 0
6
6
  BUILD = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
@@ -91,6 +91,9 @@ describe Lolita::Configuration::Filter do
91
91
 
92
92
  describe "Filtering list" do
93
93
  let(:list){ Lolita::Configuration::List}
94
+ let(:request){
95
+ double('request', headers: {}, params: {})
96
+ }
94
97
 
95
98
  it "should filter with default filters" do
96
99
  tags = %w(Android Linux Windows).map{|name| Fabricate(:tag, :name => name )}
@@ -101,16 +104,11 @@ describe Lolita::Configuration::Filter do
101
104
  field :tags
102
105
  end
103
106
  end
104
- list_conf.paginate(1).should have(3).items
105
- request = Object.new
106
- request.class_eval do
107
- def params
108
- {:filter => {:tag_ids => Tag.where(:name => 'Android').first.id}}
109
- end
110
- end
111
- list_conf.paginate(1,request).should have(1).items
107
+ list_conf.paginate(1, request).should have(3).items
108
+ request.stub(params: {:filter => {:tag_ids => Tag.where(:name => 'Android').first.id}})
109
+ list_conf.paginate(1, request).should have(1).items
112
110
  end
113
-
111
+
114
112
  it "should filter with custom search" do
115
113
  tags = %w(Android Linux Windows).map{|name| Fabricate(:tag, :name => name )}
116
114
  3.times {|i| Fabricate(:post,:tags => [tags[i]])}
@@ -125,13 +123,8 @@ describe Lolita::Configuration::Filter do
125
123
  search :custom_filter
126
124
  end
127
125
  end
128
- list_conf.paginate(1).should have(3).items
129
- request = Object.new
130
- request.class_eval do
131
- def params
132
- {:filter => {:tag_ids => Tag.where(:name => 'Android').first.id}}
133
- end
134
- end
126
+ list_conf.paginate(1, request).should have(3).items
127
+ request.stub(params: {:filter => {:tag_ids => Tag.where(:name => 'Android').first.id}})
135
128
  list_conf.paginate(1,request).should have(2).items
136
129
  end
137
130
  end
@@ -71,8 +71,8 @@ describe Lolita::Extensions::Authorization::CanCanAdapter do
71
71
  it "should authorize resource" do
72
72
  adapter2 = klass.new(nil)
73
73
  expect do
74
- adapter2.authorize!(:read,Object).should == "ability_response"
75
- adapter.authorize!(:read,Object).should == "context_response"
74
+ adapter2.authorize!(:read, Object).should == "ability_response"
75
+ adapter.authorize!(:read, Object).should == "context_response"
76
76
  end.not_to raise_error
77
77
  end
78
78
  end
@@ -91,4 +91,4 @@ describe Lolita::Extensions::Authorization::CanCanAdapter do
91
91
  proxy.adapter.current_ability == adapter.current_ability
92
92
  end
93
93
  end
94
- end
94
+ end
@@ -0,0 +1,104 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../simple_spec_helper')
2
+
3
+ class TestApplicationController
4
+ include Lolita::Extensions
5
+ end
6
+
7
+ class TestPolicy
8
+ def initialize user, record
9
+ end
10
+
11
+ def read?
12
+ true
13
+ end
14
+
15
+ def create?
16
+ false
17
+ end
18
+ end
19
+
20
+ module Pundit
21
+ class NotAuthorizedError < StandardError ; end
22
+
23
+ def self.policy user, record
24
+ end
25
+ end
26
+
27
+ describe Lolita::Extensions::Authorization::PunditAdapter do
28
+ let(:klass){ Lolita::Extensions::Authorization::PunditAdapter }
29
+ around(:each){|example|
30
+ Lolita.authorization = 'Pundit'
31
+ Lolita.policy_class = TestPolicy
32
+ example.run
33
+ Lolita.authorization = nil
34
+ Lolita.policy_class = nil
35
+ }
36
+ let(:adapter){ klass.new(TestApplicationController.new,{request: double(env: {})}) }
37
+
38
+ it "should create new" do
39
+ expect do
40
+ klass.new(TestApplicationController.new,{request: double(env: {})})
41
+ end.not_to raise_error
42
+ end
43
+
44
+ it "should raise error without authorization" do
45
+ expect do
46
+ Lolita.authorization = nil
47
+ klass.new(TestApplicationController.new,{request: double(env: {})})
48
+ end.to raise_error(Lolita::NoAuthorizationDefinedError)
49
+ end
50
+
51
+ context "current user" do
52
+
53
+ before do
54
+ TestApplicationController.any_instance.stub(authentication_proxy: double(current_user: double('Admin')))
55
+ end
56
+
57
+ it "can do some action with current policy" do
58
+ adapter.can?(:read,"HiddenText".class).should be_true
59
+ adapter.can?(:create,"HiddenText".class).should be_false
60
+ end
61
+
62
+ it "can ONLY do actions from policy" do
63
+ adapter.cannot?(:read,"HiddenText".class).should be_false
64
+ adapter.cannot?(:create,"HiddenText".class).should be_true
65
+ end
66
+
67
+ it "should have current policy" do
68
+ adapter.current_ability(Object.new).should be_a(Lolita.policy_class)
69
+ end
70
+
71
+ it "should not authorize resource without current_user" do
72
+ adapter2 = klass.new(nil)
73
+ expect do
74
+ adapter2.authorize!(:read, Object)
75
+ end.to raise_error
76
+ end
77
+
78
+ it "should authorize resource" do
79
+ expect do
80
+ adapter.authorize!(:read, Object).should be_true
81
+ end.to_not raise_error
82
+ end
83
+ end
84
+
85
+ describe 'Integration with proxy' do
86
+ let(:proxy){
87
+ mock_class = Object.new
88
+ mock_class.class_eval{include Lolita::Extensions}
89
+ Lolita::Extensions::Authorization::Proxy.new(mock_class,{request: double(env: {})})
90
+ }
91
+
92
+ before do
93
+ TestApplicationController.any_instance.stub(authentication_proxy: double(current_user: double('Admin')))
94
+ end
95
+
96
+ it "should have the same method results for adapter and proxy" do
97
+ proxy.adapter = adapter
98
+ %w(can? cannot? authorize!).each do |name|
99
+ proxy.send(name,:read, String).should eql(adapter.send(name,:read,String))
100
+ end
101
+ proxy.adapter.current_ability(Object) == adapter.current_ability(Object)
102
+ end
103
+ end
104
+ end
@@ -1 +1,6 @@
1
1
  require_relative '../lib/lolita'
2
+ require 'rubygems'
3
+ require 'bundler/setup'
4
+ unless ENV['CI']
5
+ require 'pry-byebug'
6
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
  unless ENV['CI']
4
- require 'byebug'
4
+ require 'pry-byebug'
5
5
  end
6
6
  # require 'simplecov'
7
7
  # SimpleCov.start do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lolita
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.9
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ITHouse (Latvia) and Arturs Meisters
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-18 00:00:00.000000000 Z
11
+ date: 2014-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kaminari
@@ -329,6 +329,7 @@ files:
329
329
  - lib/lolita/extensions/authorization/cancan_adapter.rb
330
330
  - lib/lolita/extensions/authorization/default_adapter.rb
331
331
  - lib/lolita/extensions/authorization/proxy.rb
332
+ - lib/lolita/extensions/authorization/pundit_adapter.rb
332
333
  - lib/lolita/extensions/extensions.rb
333
334
  - lib/lolita/helpers.rb
334
335
  - lib/lolita/hooks.rb
@@ -383,6 +384,7 @@ files:
383
384
  - spec/extensions/authorization/cancan_adapter_spec.rb
384
385
  - spec/extensions/authorization/default_adapter_spec.rb
385
386
  - spec/extensions/authorization/proxy_spec.rb
387
+ - spec/extensions/authorization/pundit_adapter_spec.rb
386
388
  - spec/extensions/extensions_spec.rb
387
389
  - spec/fabricators/category_fabricator.rb
388
390
  - spec/fabricators/post_fabricator.rb
@@ -552,6 +554,7 @@ test_files:
552
554
  - spec/extensions/authorization/cancan_adapter_spec.rb
553
555
  - spec/extensions/authorization/default_adapter_spec.rb
554
556
  - spec/extensions/authorization/proxy_spec.rb
557
+ - spec/extensions/authorization/pundit_adapter_spec.rb
555
558
  - spec/extensions/extensions_spec.rb
556
559
  - spec/fabricators/category_fabricator.rb
557
560
  - spec/fabricators/post_fabricator.rb