concealer 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.rdoc +148 -0
- data/Rakefile +10 -0
- data/concealer.gemspec +24 -0
- data/lib/concealer/fallback/nil.rb +5 -0
- data/lib/concealer/fallback/paperclip.rb +5 -0
- data/lib/concealer/fallback/string.rb +10 -0
- data/lib/concealer/fallback.rb +12 -0
- data/lib/concealer/proxy.rb +20 -0
- data/lib/concealer/strategy/allow.rb +5 -0
- data/lib/concealer/strategy/blacklist.rb +17 -0
- data/lib/concealer/strategy/deny.rb +5 -0
- data/lib/concealer/strategy/multi_level.rb +38 -0
- data/lib/concealer/strategy/whitelist.rb +17 -0
- data/lib/concealer/strategy.rb +14 -0
- data/lib/concealer/version.rb +3 -0
- data/lib/concealer.rb +43 -0
- data/spec/concealer/fallback/nil_spec.rb +9 -0
- data/spec/concealer/fallback/paperclip_spec.rb +11 -0
- data/spec/concealer/fallback/string_spec.rb +9 -0
- data/spec/concealer/fallback_spec.rb +9 -0
- data/spec/concealer/proxy_spec.rb +37 -0
- data/spec/concealer/strategy/allow_spec.rb +7 -0
- data/spec/concealer/strategy/blacklist_spec.rb +15 -0
- data/spec/concealer/strategy/deny_spec.rb +7 -0
- data/spec/concealer/strategy/multi_level_spec.rb +41 -0
- data/spec/concealer/strategy/whitelist_spec.rb +15 -0
- data/spec/concealer/strategy_spec.rb +7 -0
- data/spec/concealer_spec.rb +62 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/concealed_model.rb +11 -0
- data/spec/support/paperclip.rb +6 -0
- data/spec/support/user.rb +13 -0
- metadata +163 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 flinc AG
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
= concealer
|
2
|
+
|
3
|
+
Privacy control your models (or any other Ruby object) with ease.
|
4
|
+
|
5
|
+
== Requirements
|
6
|
+
|
7
|
+
* activesupport (~> 3.0)
|
8
|
+
|
9
|
+
|
10
|
+
== Install
|
11
|
+
|
12
|
+
To install concealer, simply add it to your Gemfile:
|
13
|
+
|
14
|
+
gem 'concealer'
|
15
|
+
|
16
|
+
In order to get the latest development version of concealer:
|
17
|
+
|
18
|
+
gem 'concealer', :git => 'git://github.com/flinc/concealer'
|
19
|
+
|
20
|
+
Finally run:
|
21
|
+
|
22
|
+
bundle install
|
23
|
+
|
24
|
+
|
25
|
+
== Usage
|
26
|
+
|
27
|
+
To use concealer simply include the Concealer module:
|
28
|
+
|
29
|
+
class User
|
30
|
+
include Concealer
|
31
|
+
|
32
|
+
attr_accessor :name, :email
|
33
|
+
end
|
34
|
+
|
35
|
+
This will add a #concealed method to your object. Calling this will return a proxy object that checks every call and only forwards allowed ones to the original object.
|
36
|
+
|
37
|
+
user = User.new
|
38
|
+
user.concealed.name # => user.name
|
39
|
+
user.concealed.email # => user.email
|
40
|
+
|
41
|
+
=== Strategies
|
42
|
+
|
43
|
+
The default strategy for Concealer is Concealer::Strategy::Allow which forwards every call to the original object. At the moment there are several other strategies available:
|
44
|
+
|
45
|
+
* Concealer::Strategy::Allow
|
46
|
+
* Concealer::Strategy::Deny
|
47
|
+
* Concealer::Strategy::Whitelist
|
48
|
+
* Concealer::Strategy::Blacklist
|
49
|
+
|
50
|
+
You can set the strategy for Concealer using <tt>Concealer.strategy=</tt>
|
51
|
+
|
52
|
+
Concealer.strategy = Concealer::Strategy::Deny.new
|
53
|
+
|
54
|
+
user = User.new
|
55
|
+
user.concealed.name # => nil
|
56
|
+
user.concealed.email # => nil
|
57
|
+
|
58
|
+
=== Advanced Strategies
|
59
|
+
|
60
|
+
There is one more advanced privacy strategies available: <tt>Concealer::Strategy::MultiLevel</tt>.
|
61
|
+
To use it you'll have to implement your own subclass of it to match your domain model. The example below illustrates what it might look like.
|
62
|
+
|
63
|
+
Your custom multi level privacy strategy:
|
64
|
+
|
65
|
+
class CustomPrivacyStrategy < Concealer::Strategy::MultiLevel
|
66
|
+
|
67
|
+
def required_level_for(model, name, args)
|
68
|
+
case model
|
69
|
+
when Profile, User:
|
70
|
+
return privacy_level_for(owner_of(model), :name) if [:firstname, :lastname].include?(name.to_sym)
|
71
|
+
return privacy_level_for(owner_of(model), :age) if [:age].include?(name.to_sym)
|
72
|
+
end
|
73
|
+
|
74
|
+
:myself
|
75
|
+
end
|
76
|
+
|
77
|
+
protected
|
78
|
+
|
79
|
+
def privacy_level_for(user, key)
|
80
|
+
user.privacy_settings.send(key).try(:to_sym)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
Your User model:
|
86
|
+
|
87
|
+
class User
|
88
|
+
|
89
|
+
# ...
|
90
|
+
|
91
|
+
def relation_level_to(other)
|
92
|
+
if other == self
|
93
|
+
:myself
|
94
|
+
elsif self.friend_of?(other)
|
95
|
+
:friends
|
96
|
+
else
|
97
|
+
:everyone
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
In your Rails ApplicationController:
|
103
|
+
|
104
|
+
around_filter :setup_privacy_strategy
|
105
|
+
|
106
|
+
def setup_privacy_strategy(&block)
|
107
|
+
Concealer.with_strategy(CustomPrivacyStrategy.new(current_user, [:myself, :friends, :everyone]), &block)
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
=== Implementing Strategies
|
112
|
+
|
113
|
+
You can implement your own strategies by subclassing Concealer::Strategy or adding an <tt>#allow?(model, attribute, args)</tt> method to any object you pass into <tt>Concealer.strategy=</tt>.
|
114
|
+
|
115
|
+
|
116
|
+
=== Fallbacks
|
117
|
+
|
118
|
+
In some cases you don't want to just return nil for unallowed method calls. In order to provide sensible return values Concealer has a fallbacks. Available fallbacks are:
|
119
|
+
|
120
|
+
* Concealer::Fallback::Nil
|
121
|
+
* Concealer::Fallback::String
|
122
|
+
* Concealer::Fallback::Paperclip
|
123
|
+
|
124
|
+
You can add fallbacks for method calls like this:
|
125
|
+
|
126
|
+
Concealer.register_fallback(User, :email, Concealer::Fallback::String.new("unkown"))
|
127
|
+
Concealer.register_fallback(User, :avatar, Concealer::Fallback::Paperclip.new)
|
128
|
+
Concealer.register_fallback(User, :name, lambda { |model, method, args| "#{model.send(method).at(0)}." })
|
129
|
+
|
130
|
+
|
131
|
+
== Known issues
|
132
|
+
|
133
|
+
See https://github.com/flinc/concealer/issues
|
134
|
+
|
135
|
+
|
136
|
+
== Repository
|
137
|
+
|
138
|
+
See https://github.com/flinc/concealer and feel free to fork it!
|
139
|
+
|
140
|
+
|
141
|
+
== Contributors
|
142
|
+
|
143
|
+
See a list of all contributors at https://github.com/flinc/concealer/contributors. Thanks a lot everyone!
|
144
|
+
|
145
|
+
|
146
|
+
== Copyright
|
147
|
+
|
148
|
+
Copyright (c) 2011 flinc AG. See LICENSE for details.
|
data/Rakefile
ADDED
data/concealer.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "concealer/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "concealer"
|
7
|
+
s.version = Concealer::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Benedikt Deicke", "Christian Bäuerlein"]
|
10
|
+
s.email = ["benedikt@synatic.net", "fabrik42@gmail.com"]
|
11
|
+
s.homepage = "https://flinc.github.com/concealer"
|
12
|
+
s.summary = %q{Privacy control your models with ease}
|
13
|
+
s.description = %q{Privacy control your models with ease}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_runtime_dependency('activesupport', ['~> 3.0'])
|
21
|
+
|
22
|
+
s.add_development_dependency('rspec', ['~> 2.3'])
|
23
|
+
s.add_development_dependency('rake')
|
24
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Concealer
|
2
|
+
class Fallback
|
3
|
+
|
4
|
+
autoload :Nil, 'concealer/fallback/nil'
|
5
|
+
autoload :String, 'concealer/fallback/string'
|
6
|
+
autoload :Paperclip, 'concealer/fallback/paperclip'
|
7
|
+
|
8
|
+
def call(model, method, args)
|
9
|
+
raise "The fallback must implement #call(model, method, args)"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Concealer
|
2
|
+
class Proxy
|
3
|
+
instance_methods.each { |m| undef_method(m) unless m =~ /(^__|^send$|^object_id$)/ }
|
4
|
+
|
5
|
+
def initialize(target, strategy)
|
6
|
+
@target = target
|
7
|
+
@strategy = strategy
|
8
|
+
end
|
9
|
+
|
10
|
+
protected
|
11
|
+
|
12
|
+
def method_missing(name, *args, &block)
|
13
|
+
if @strategy.allow?(@target, name, args)
|
14
|
+
@target.send(name, *args, &block)
|
15
|
+
else
|
16
|
+
Concealer.fallback_for(@target, name).call(@target, name, args)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Concealer::Strategy::Blacklist < Concealer::Strategy::Allow
|
2
|
+
|
3
|
+
def initialize(blacklist)
|
4
|
+
@blacklist = blacklist
|
5
|
+
end
|
6
|
+
|
7
|
+
def allow?(model, method, args)
|
8
|
+
return false if blacklisted_methods(model).include?(method)
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def blacklisted_methods(model)
|
15
|
+
@blacklist[model.class] ||= []
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class Concealer::Strategy::MultiLevel < Concealer::Strategy
|
2
|
+
|
3
|
+
def initialize(current_user, levels)
|
4
|
+
@current_user = current_user
|
5
|
+
@levels = levels
|
6
|
+
end
|
7
|
+
|
8
|
+
def allow?(model, method, args)
|
9
|
+
required_level = required_level_for(model, method, args)
|
10
|
+
actual_level = @current_user.relation_level_to(owner_of(model))
|
11
|
+
|
12
|
+
raise "The level #{required_level} is not valid." unless @levels.include?(required_level)
|
13
|
+
raise "The level #{actual_level} is not valid." unless @levels.include?(actual_level)
|
14
|
+
|
15
|
+
return @levels.index(actual_level) <= @levels.index(required_level)
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def current_user
|
21
|
+
@current_user
|
22
|
+
end
|
23
|
+
|
24
|
+
def required_level_for(model, method, args)
|
25
|
+
@levels.first
|
26
|
+
end
|
27
|
+
|
28
|
+
def owner_of(model)
|
29
|
+
if model.respond_to?(:relation_level_to)
|
30
|
+
model
|
31
|
+
elsif model.respond_to?(:user)
|
32
|
+
model.user
|
33
|
+
else
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Concealer::Strategy::Whitelist < Concealer::Strategy::Deny
|
2
|
+
|
3
|
+
def initialize(whitelist)
|
4
|
+
@whitelist = whitelist
|
5
|
+
end
|
6
|
+
|
7
|
+
def allow?(model, method, args)
|
8
|
+
return true if whitelisted_methods(model).include?(method)
|
9
|
+
super
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def whitelisted_methods(model)
|
15
|
+
@whitelist[model.class] ||= []
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Concealer
|
2
|
+
class Strategy
|
3
|
+
|
4
|
+
autoload :Allow, 'concealer/strategy/allow'
|
5
|
+
autoload :Deny, 'concealer/strategy/deny'
|
6
|
+
autoload :Blacklist, 'concealer/strategy/blacklist'
|
7
|
+
autoload :Whitelist, 'concealer/strategy/whitelist'
|
8
|
+
autoload :MultiLevel, 'concealer/strategy/multi_level'
|
9
|
+
|
10
|
+
def allow?(model, method, args)
|
11
|
+
raise "The stragegy must implement #allow?(model, method, args)"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/concealer.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
require 'active_support/core_ext/object/try'
|
3
|
+
require 'active_support/core_ext/module/attribute_accessors'
|
4
|
+
|
5
|
+
module Concealer
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
autoload :Proxy, 'concealer/proxy'
|
9
|
+
autoload :Strategy, 'concealer/strategy'
|
10
|
+
autoload :Fallback, 'concealer/fallback'
|
11
|
+
|
12
|
+
mattr_accessor :default_fallback
|
13
|
+
@@default_fallback = Concealer::Fallback::Nil.new
|
14
|
+
|
15
|
+
def self.strategy=(strategy)
|
16
|
+
Thread.current[:concealer_strategy] = strategy
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.strategy
|
20
|
+
Thread.current[:concealer_strategy] || Concealer::Strategy::Allow.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.with_strategy(strategy)
|
24
|
+
save, self.strategy = self.strategy, strategy
|
25
|
+
yield
|
26
|
+
self.strategy = save
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.register_fallback(model, method, fallback)
|
30
|
+
@@fallbacks ||= {}
|
31
|
+
@@fallbacks[model.to_s.to_sym] ||= {}
|
32
|
+
@@fallbacks[model.to_s.to_sym][method] = fallback
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.fallback_for(model, method)
|
36
|
+
@@fallbacks ||= {}
|
37
|
+
@@fallbacks.try(:[], model.class.to_s.to_sym).try(:[], method.to_sym) || @@default_fallback
|
38
|
+
end
|
39
|
+
|
40
|
+
def concealed
|
41
|
+
Proxy.new(self, Concealer.strategy)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Concealer::Fallback::Paperclip do
|
4
|
+
describe '#call' do
|
5
|
+
it "should return a paperclip attachment" do
|
6
|
+
ConcealedModel.stub!(:attachment_definitions).and_return({ :avatar => :something })
|
7
|
+
Paperclip::Attachment.should_receive(:new).with(:avatar, anything, :something).and_return(:paperclip)
|
8
|
+
subject.call(ConcealedModel.new, :avatar, nil).should eq(:paperclip)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Concealer::Proxy do
|
4
|
+
|
5
|
+
let(:model) { ConcealedModel.new }
|
6
|
+
let(:strategy) { Concealer::Strategy::Allow.new }
|
7
|
+
subject { Concealer::Proxy.new(model, strategy) }
|
8
|
+
|
9
|
+
describe "#initializer" do
|
10
|
+
it "should require a target and a strategy" do
|
11
|
+
expect { Concealer::Proxy.new }.to raise_error ArgumentError
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should accept a target object and a strategy" do
|
15
|
+
expect { Concealer::Proxy.new(model, Concealer.strategy) }.to_not raise_error ArgumentError
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should delegate all unknown method calls to the target" do
|
20
|
+
model.should_receive(:allowed_method)
|
21
|
+
subject.allowed_method
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should ask the strategy whether the method is allowed for the object" do
|
25
|
+
strategy.should_receive(:allow?).with(model, :allowed_method, [:args])
|
26
|
+
subject.allowed_method(:args)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should return the fallback for unallowed methods" do
|
30
|
+
strategy.stub!(:allow?).and_return(false)
|
31
|
+
|
32
|
+
fallback = mock(Concealer::Fallback, :call => :fallback)
|
33
|
+
Concealer.stub!(:fallback_for).and_return(fallback)
|
34
|
+
|
35
|
+
subject.allowed_method.should eq(:fallback)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Concealer::Strategy::Blacklist do
|
4
|
+
|
5
|
+
subject { Concealer::Strategy::Blacklist.new({ ConcealedModel => [:denied_method] }) }
|
6
|
+
|
7
|
+
it "should allow unlisted methods" do
|
8
|
+
subject.allow?(ConcealedModel.new, :some_method, nil).should be_true
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should allow unlisted methods" do
|
12
|
+
subject.allow?(ConcealedModel.new, :denied_method, nil).should be_false
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Concealer::Strategy::MultiLevel do
|
4
|
+
|
5
|
+
let(:levels) { [:myself, :friends, :friends_of_friends, :everyone] }
|
6
|
+
|
7
|
+
let(:current_user) { User.new("benedikt") }
|
8
|
+
let(:other_user) { User.new("christian") }
|
9
|
+
|
10
|
+
subject { Concealer::Strategy::MultiLevel.new(current_user, levels) }
|
11
|
+
|
12
|
+
context 'required level higher than actual level' do
|
13
|
+
before(:each) do
|
14
|
+
subject.stub!(:required_level_for).and_return(:myself)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should deny the call" do
|
18
|
+
subject.allow?(other_user, :name, nil).should be_false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'required level lower than actual level' do
|
23
|
+
before(:each) do
|
24
|
+
subject.stub!(:required_level_for).and_return(:friends_of_friends)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should allow the call" do
|
28
|
+
subject.allow?(other_user, :name, nil).should be_true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'required level equals actual level' do
|
33
|
+
before(:each) do
|
34
|
+
subject.stub!(:required_level_for).and_return(:friends)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should allow the call" do
|
38
|
+
subject.allow?(other_user, :name, nil).should be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Concealer::Strategy::Whitelist do
|
4
|
+
|
5
|
+
subject { Concealer::Strategy::Whitelist.new({ ConcealedModel => [:allowed_method] }) }
|
6
|
+
|
7
|
+
it "should deny unlisted methods" do
|
8
|
+
subject.allow?(ConcealedModel.new, :some_method, nil).should be_false
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should deny unlisted methods" do
|
12
|
+
subject.allow?(ConcealedModel.new, :allowed_method, nil).should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Concealer do
|
4
|
+
|
5
|
+
subject { ConcealedModel.new }
|
6
|
+
|
7
|
+
describe '.strategy' do
|
8
|
+
|
9
|
+
it "should be Concealer::Strategy::Allow by default" do
|
10
|
+
Concealer.strategy.should be_kind_of(Concealer::Strategy::Allow)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
describe '.with_strategy' do
|
17
|
+
|
18
|
+
it "should change the strategy within the block" do
|
19
|
+
strategy = Concealer::Strategy::Deny.new
|
20
|
+
Concealer.with_strategy(strategy) do
|
21
|
+
Concealer.strategy.should be(strategy)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should reset the strategy after the block was executed" do
|
26
|
+
strategy = Concealer.strategy
|
27
|
+
Concealer.with_strategy(Concealer::Strategy::Deny.new) {}
|
28
|
+
Concealer.strategy.should be(strategy)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '.default_fallback' do
|
34
|
+
|
35
|
+
it "should default to Concealer::Fallback::Nil" do
|
36
|
+
Concealer.default_fallback.should be_kind_of(Concealer::Fallback::Nil)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '.fallback_for' do
|
42
|
+
|
43
|
+
it "should return the default_fallback if no specific fallback is found" do
|
44
|
+
Concealer.fallback_for(ConcealedModel.new, :unknown_method).should be_kind_of(Concealer::Fallback::Nil)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
describe '#concealed' do
|
51
|
+
|
52
|
+
it "should be defined on the model" do
|
53
|
+
should respond_to(:concealed)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should return a proxy object" do
|
57
|
+
subject.concealed.should be
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,163 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: concealer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Benedikt Deicke
|
14
|
+
- "Christian B\xC3\xA4uerlein"
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-02-28 00:00:00 +01:00
|
20
|
+
default_executable:
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 0
|
33
|
+
version: "3.0"
|
34
|
+
requirement: *id001
|
35
|
+
name: activesupport
|
36
|
+
type: :runtime
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 5
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 3
|
48
|
+
version: "2.3"
|
49
|
+
requirement: *id002
|
50
|
+
name: rspec
|
51
|
+
type: :development
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
prerelease: false
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
version: "0"
|
63
|
+
requirement: *id003
|
64
|
+
name: rake
|
65
|
+
type: :development
|
66
|
+
description: Privacy control your models with ease
|
67
|
+
email:
|
68
|
+
- benedikt@synatic.net
|
69
|
+
- fabrik42@gmail.com
|
70
|
+
executables: []
|
71
|
+
|
72
|
+
extensions: []
|
73
|
+
|
74
|
+
extra_rdoc_files: []
|
75
|
+
|
76
|
+
files:
|
77
|
+
- .gitignore
|
78
|
+
- .rspec
|
79
|
+
- Gemfile
|
80
|
+
- LICENSE
|
81
|
+
- README.rdoc
|
82
|
+
- Rakefile
|
83
|
+
- concealer.gemspec
|
84
|
+
- lib/concealer.rb
|
85
|
+
- lib/concealer/fallback.rb
|
86
|
+
- lib/concealer/fallback/nil.rb
|
87
|
+
- lib/concealer/fallback/paperclip.rb
|
88
|
+
- lib/concealer/fallback/string.rb
|
89
|
+
- lib/concealer/proxy.rb
|
90
|
+
- lib/concealer/strategy.rb
|
91
|
+
- lib/concealer/strategy/allow.rb
|
92
|
+
- lib/concealer/strategy/blacklist.rb
|
93
|
+
- lib/concealer/strategy/deny.rb
|
94
|
+
- lib/concealer/strategy/multi_level.rb
|
95
|
+
- lib/concealer/strategy/whitelist.rb
|
96
|
+
- lib/concealer/version.rb
|
97
|
+
- spec/concealer/fallback/nil_spec.rb
|
98
|
+
- spec/concealer/fallback/paperclip_spec.rb
|
99
|
+
- spec/concealer/fallback/string_spec.rb
|
100
|
+
- spec/concealer/fallback_spec.rb
|
101
|
+
- spec/concealer/proxy_spec.rb
|
102
|
+
- spec/concealer/strategy/allow_spec.rb
|
103
|
+
- spec/concealer/strategy/blacklist_spec.rb
|
104
|
+
- spec/concealer/strategy/deny_spec.rb
|
105
|
+
- spec/concealer/strategy/multi_level_spec.rb
|
106
|
+
- spec/concealer/strategy/whitelist_spec.rb
|
107
|
+
- spec/concealer/strategy_spec.rb
|
108
|
+
- spec/concealer_spec.rb
|
109
|
+
- spec/spec_helper.rb
|
110
|
+
- spec/support/concealed_model.rb
|
111
|
+
- spec/support/paperclip.rb
|
112
|
+
- spec/support/user.rb
|
113
|
+
has_rdoc: true
|
114
|
+
homepage: https://flinc.github.com/concealer
|
115
|
+
licenses: []
|
116
|
+
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
hash: 3
|
128
|
+
segments:
|
129
|
+
- 0
|
130
|
+
version: "0"
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
hash: 3
|
137
|
+
segments:
|
138
|
+
- 0
|
139
|
+
version: "0"
|
140
|
+
requirements: []
|
141
|
+
|
142
|
+
rubyforge_project:
|
143
|
+
rubygems_version: 1.3.7
|
144
|
+
signing_key:
|
145
|
+
specification_version: 3
|
146
|
+
summary: Privacy control your models with ease
|
147
|
+
test_files:
|
148
|
+
- spec/concealer/fallback/nil_spec.rb
|
149
|
+
- spec/concealer/fallback/paperclip_spec.rb
|
150
|
+
- spec/concealer/fallback/string_spec.rb
|
151
|
+
- spec/concealer/fallback_spec.rb
|
152
|
+
- spec/concealer/proxy_spec.rb
|
153
|
+
- spec/concealer/strategy/allow_spec.rb
|
154
|
+
- spec/concealer/strategy/blacklist_spec.rb
|
155
|
+
- spec/concealer/strategy/deny_spec.rb
|
156
|
+
- spec/concealer/strategy/multi_level_spec.rb
|
157
|
+
- spec/concealer/strategy/whitelist_spec.rb
|
158
|
+
- spec/concealer/strategy_spec.rb
|
159
|
+
- spec/concealer_spec.rb
|
160
|
+
- spec/spec_helper.rb
|
161
|
+
- spec/support/concealed_model.rb
|
162
|
+
- spec/support/paperclip.rb
|
163
|
+
- spec/support/user.rb
|