concealer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+
3
+ # Specify your gem's dependencies in concealer.gemspec
4
+ gemspec
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
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ require 'bundler/setup'
3
+
4
+ require 'rspec/core/rake_task'
5
+
6
+ Bundler::GemHelper.install_tasks
7
+
8
+ RSpec::Core::RakeTask.new(:spec)
9
+
10
+ task :default => :spec
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,5 @@
1
+ class Concealer::Fallback::Nil
2
+ def call(model, method, args)
3
+ nil
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Concealer::Fallback::Paperclip
2
+ def call(model, method, args)
3
+ ::Paperclip::Attachment.new(method, model.class.new, model.class.attachment_definitions[method])
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ class Concealer::Fallback::String
2
+
3
+ def initialize(value = "")
4
+ @value = value
5
+ end
6
+
7
+ def call(model, method, args)
8
+ @value
9
+ end
10
+ 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,5 @@
1
+ class Concealer::Strategy::Allow < Concealer::Strategy
2
+ def allow?(model, method, args)
3
+ true
4
+ end
5
+ 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,5 @@
1
+ class Concealer::Strategy::Deny < Concealer::Strategy
2
+ def allow?(model, method, args)
3
+ false
4
+ end
5
+ 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
@@ -0,0 +1,3 @@
1
+ module Concealer
2
+ VERSION = "0.0.1"
3
+ 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,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Concealer::Fallback::Nil do
4
+ describe '#call' do
5
+ it "should return nil" do
6
+ subject.call(nil, nil, nil).should be_nil
7
+ end
8
+ end
9
+ 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,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Concealer::Fallback::String do
4
+ describe '#call' do
5
+ it "should return an empty string" do
6
+ subject.call(nil, nil, nil).should eq("")
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Concealer::Fallback do
4
+ describe '#call' do
5
+ it "should raise an exception when called directly" do
6
+ expect { subject.call(nil, nil, nil) }.to raise_error /must implement/
7
+ end
8
+ end
9
+ 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,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Concealer::Strategy::Allow do
4
+ it "should allow everything" do
5
+ subject.allow?(nil, nil, nil).should be_true
6
+ end
7
+ 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,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Concealer::Strategy::Deny do
4
+ it "should deny everything" do
5
+ subject.allow?(nil, nil, nil).should be_false
6
+ end
7
+ 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,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Concealer::Strategy do
4
+ it "should raise an exception when called directly" do
5
+ expect { subject.allow?(nil, nil, nil) }.to raise_error /must implement/
6
+ end
7
+ 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
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
+ require 'rspec'
5
+ require 'concealer'
6
+
7
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
8
+
9
+ RSpec.configure do |config|
10
+ config.mock_with :rspec
11
+ end
@@ -0,0 +1,11 @@
1
+ class ConcealedModel
2
+ include Concealer
3
+
4
+ def allowed_method
5
+ :allowed_method
6
+ end
7
+
8
+ def denied_method
9
+ :denied_method
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ module Paperclip
2
+ class Attachment
3
+ def initialize(*args)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ class User
2
+
3
+ attr_reader :name
4
+
5
+ def initialize(name)
6
+ @name = name
7
+ end
8
+
9
+ def relation_level_to(user)
10
+ (user == self) ? :myself : :friends
11
+ end
12
+
13
+ end
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