concealer 0.0.1

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 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