Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
jimweirich committed Mar 8, 2012
0 parents commit 3d75028
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 0 deletions.
1 change: 1 addition & 0 deletions .rspec
@@ -0,0 +1 @@
-I. --color
1 change: 1 addition & 0 deletions .togglerc
@@ -0,0 +1 @@
(buffer-toggle-style 'jw-spec)
10 changes: 10 additions & 0 deletions Rakefile
@@ -0,0 +1,10 @@
#!/usr/bin/env ruby

require 'rake/clean'
require 'rake/testtask'

task :default => :spec

task :spec do
sh "rspec ."
end
40 changes: 40 additions & 0 deletions protection_proxy.rb
@@ -0,0 +1,40 @@
class ProtectionProxy

def self.role(role_name)
@current_list = []
yield
writable_fields[role_name] = @current_list
end

def self.find_proxy(object, role)
new(object, writable_fields[role])
end

def self.writable(*names)
names.each do |name|
@current_list << name
end
end

def self.writable_fields
@writable_fields ||= {}
end

def initialize(object, writable_fields)
@object = object
@writable_fields = writable_fields
end

def method_missing(sym, *args, &block)
method_name = sym.to_s
if ! method_name.end_with?("=")
@object.send(sym, *args, &block)
else
field_name = method_name[0...-1].to_sym
if @writable_fields.include?(field_name)
@object.send(sym, *args, &block)
end
end
end

end
59 changes: 59 additions & 0 deletions protection_proxy_spec.rb
@@ -0,0 +1,59 @@
require 'rspec/given'
require 'protection_proxy'

describe ProtectionProxy do
class User
attr_accessor :name, :email, :membership_level

def initialize(name, email, membership_level)
@name = name
@email = email
@membership_level = membership_level
end
end

class ProtectedUser < ProtectionProxy
role :owner do
writable :membership_level
end
role :browser do
writable :name, :email
writable :password
end
end

Given(:user) { User.new("Jim", "jim@somewhere.com", "Beginner") }

context "when user the owner role" do
Given(:proxy) { ProtectedUser.find_proxy(user, :owner) }

Then { proxy.name.should == "Jim" }

context "when I change a writable attribute" do
When { proxy.membership_level = "Advanced" }
Then { proxy.membership_level.should == "Advanced" }
end

context "when I change a protected attribute" do
When { proxy.name = "Joe" }
Then { proxy.name.should == "Jim" }
end
end

context "when user the browser role" do
Given(:proxy) { ProtectedUser.find_proxy(user, :browser) }

Then { proxy.name.should == "Jim" }

context "when I change a writable attribute" do
When { proxy.name = "Joe" }
Then { proxy.name.should == "Joe" }
end

context "when I change a protected attribute" do
When { proxy.membership_level = "SuperUser" }
Then { proxy.membership_level.should == "Beginner" }
end
end

end

0 comments on commit 3d75028

Please sign in to comment.