access_schema 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 +7 -0
- data/.rspec +2 -0
- data/Gemfile +15 -0
- data/Guardfile +5 -0
- data/LICENSE +21 -0
- data/README.md +102 -0
- data/Rakefile +1 -0
- data/access_schema.gemspec +24 -0
- data/lib/access_schema/assert.rb +24 -0
- data/lib/access_schema/builders/asserts_builder.rb +12 -0
- data/lib/access_schema/builders/basic_builder.rb +11 -0
- data/lib/access_schema/builders/element_builder.rb +10 -0
- data/lib/access_schema/builders/namespace_builder.rb +16 -0
- data/lib/access_schema/builders/roles_builder.rb +11 -0
- data/lib/access_schema/builders/schema_builder.rb +36 -0
- data/lib/access_schema/element.rb +24 -0
- data/lib/access_schema/exceptions.rb +9 -0
- data/lib/access_schema/expectation.rb +17 -0
- data/lib/access_schema/namespace.rb +16 -0
- data/lib/access_schema/proxy.rb +27 -0
- data/lib/access_schema/schema.rb +80 -0
- data/lib/access_schema/version.rb +3 -0
- data/lib/access_schema.rb +33 -0
- data/spec/access_schema_spec.rb +43 -0
- data/spec/assess_schema/proxy_spec.rb +0 -0
- data/spec/assess_schema/schema_builder_spec.rb +110 -0
- data/spec/assess_schema/schema_spec.rb +39 -0
- data/spec/schema_example.rb +27 -0
- data/spec/spec_helper.rb +8 -0
- metadata +81 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in hydroplan.gemspec
|
4
|
+
gemspec
|
5
|
+
|
6
|
+
group :development, :test do
|
7
|
+
gem "rake"
|
8
|
+
|
9
|
+
gem "rspec"
|
10
|
+
gem "rack-test"
|
11
|
+
gem "guard"
|
12
|
+
gem "guard-rspec"
|
13
|
+
gem "rb-fsevent", :require => false
|
14
|
+
end
|
15
|
+
|
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2012 Victor Gumayunov
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
# AccessSchema gem - ACL/plans for your app
|
2
|
+
|
3
|
+
AccessSchema provides a tool to define ACL schema with simple DSL.
|
4
|
+
Inspired by [ya_acl](https://github.com/kaize/ya_acl)
|
5
|
+
|
6
|
+
With a couple of aliases in DSL it enables you to deal with tariff plans. Plan and role, feature and privilege are synonyms.
|
7
|
+
|
8
|
+
```
|
9
|
+
gem install access_schema
|
10
|
+
```
|
11
|
+
|
12
|
+
## An example of typical use
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
#somewhere.rb
|
16
|
+
|
17
|
+
acl.require! review, :edit
|
18
|
+
|
19
|
+
plan.allow? review, :add_photo
|
20
|
+
|
21
|
+
plan.require! review, :mark_featured
|
22
|
+
|
23
|
+
```
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
# config/plans.rb
|
27
|
+
plans do
|
28
|
+
plan :none
|
29
|
+
plan :bulb
|
30
|
+
plan :flower
|
31
|
+
plan :bouquet
|
32
|
+
end
|
33
|
+
|
34
|
+
asserts do
|
35
|
+
|
36
|
+
assert :photo_limit, [:limit] do
|
37
|
+
subject.photos_count < limit
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
namespace "Review" do
|
43
|
+
|
44
|
+
feature :mark_featured, [:flower, :bouquet]
|
45
|
+
|
46
|
+
feature :add_photo, [:bouquet] do
|
47
|
+
assert :photo_limit, [:none], :limit => 1
|
48
|
+
assert :photo_limit, [:bulb], :limit => 5
|
49
|
+
assert :photo_limit, [:flower], :limit => 10
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
# config/acl.rb
|
57
|
+
roles do
|
58
|
+
role :none
|
59
|
+
role :admin
|
60
|
+
end
|
61
|
+
|
62
|
+
asserts do
|
63
|
+
|
64
|
+
assert :owner, [:user_id] do
|
65
|
+
subject.author.id == user_id
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
namespace "Review" do
|
71
|
+
|
72
|
+
privilege :edit, [:admin] do
|
73
|
+
assert :owner, [:none]
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
#access_schema_helper.rb
|
82
|
+
|
83
|
+
class AccessSchemaHelper
|
84
|
+
|
85
|
+
def plan
|
86
|
+
@plan ||= AccessSchema.build_file "config/plans.rb"
|
87
|
+
AccessSchema.with_options(@plan, {
|
88
|
+
:plan => Rails.development? && params[:debug_plan] || current_user.try(:plan) || :none
|
89
|
+
})
|
90
|
+
end
|
91
|
+
|
92
|
+
def acl
|
93
|
+
@acl ||= AccessSchema.build_file "config/acl.rb"
|
94
|
+
AccessSchema.with_options(@acl, {
|
95
|
+
:role => current_user.try(:role) || :none,
|
96
|
+
:user_id => current_user.try(:id)
|
97
|
+
})
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "access_schema/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "access_schema"
|
7
|
+
s.version = AccessSchema::VERSION
|
8
|
+
s.authors = ["Victor Gumayunov"]
|
9
|
+
s.email = ["gumayunov@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{AccessSchema is an ACL tool}
|
12
|
+
s.description = %q{AccessSchema is a tool for ACL or tariff plans schema definition and checks}
|
13
|
+
|
14
|
+
s.rubyforge_project = "access_schema"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
# s.add_runtime_dependency "rest-client"
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class Assert
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name, vars, &block)
|
6
|
+
@name = name
|
7
|
+
@block = block
|
8
|
+
vars << :subject unless vars.include?(:subject)
|
9
|
+
(class << self; self; end).class_eval do
|
10
|
+
vars.each do |name|
|
11
|
+
define_method name do
|
12
|
+
@options[name]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def check?(options)
|
19
|
+
@options = options
|
20
|
+
self.instance_eval(&@block)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class NamespaceBuilder < BasicBuilder
|
3
|
+
|
4
|
+
def privilege(name, roles, &block)
|
5
|
+
element = Element.new(name.to_sym, roles.map(&:to_sym))
|
6
|
+
if block_given?
|
7
|
+
builder = ElementBuilder.new(element)
|
8
|
+
builder.instance_eval(&block)
|
9
|
+
end
|
10
|
+
schema.add_element(element)
|
11
|
+
end
|
12
|
+
|
13
|
+
alias :feature :privilege
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class SchemaBuilder < BasicBuilder
|
3
|
+
|
4
|
+
def self.build(&block)
|
5
|
+
builder = new(Schema.new)
|
6
|
+
builder.instance_eval(&block)
|
7
|
+
builder.schema.freeze
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.build_file(filename)
|
11
|
+
builder = new(Schema.new)
|
12
|
+
builder.instance_eval(File.read(filename))
|
13
|
+
builder.schema.freeze
|
14
|
+
end
|
15
|
+
|
16
|
+
def roles(&block)
|
17
|
+
builder = RolesBuilder.new(schema)
|
18
|
+
builder.instance_eval(&block)
|
19
|
+
end
|
20
|
+
|
21
|
+
alias :plans :roles
|
22
|
+
|
23
|
+
def asserts(&block)
|
24
|
+
builder = AssertsBuilder.new(schema)
|
25
|
+
builder.instance_eval(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def namespace(name, &block)
|
29
|
+
namespace = Namespace.new(name.to_sym)
|
30
|
+
builder = NamespaceBuilder.new(namespace)
|
31
|
+
builder.instance_eval(&block)
|
32
|
+
schema.add_namespace(namespace)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class Element
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name, roles, &block)
|
6
|
+
@name = name
|
7
|
+
@roles = roles
|
8
|
+
@block = block
|
9
|
+
@expectations = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_expectation(expectation)
|
13
|
+
@expectations << expectation
|
14
|
+
end
|
15
|
+
|
16
|
+
def allow?(role)
|
17
|
+
@roles.include?(role) || begin
|
18
|
+
checklist = @expectations.select { |exp| exp.for?(role) }
|
19
|
+
checklist.length > 0 && checklist.all? { |exp| yield(exp) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class Expectation
|
3
|
+
attr_reader :name
|
4
|
+
attr_reader :roles
|
5
|
+
attr_reader :options
|
6
|
+
|
7
|
+
def initialize(name, roles, options)
|
8
|
+
@name = name
|
9
|
+
@roles = roles
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def for?(role)
|
14
|
+
@roles.include?(role)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class Proxy
|
3
|
+
|
4
|
+
def initialize(schema, options)
|
5
|
+
@schema = schema
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def allow?(*args)
|
10
|
+
namespace = args[0]
|
11
|
+
feature = args[1]
|
12
|
+
role, options = case args[2]
|
13
|
+
when Symbol, String
|
14
|
+
[args[2], args[3]]
|
15
|
+
else
|
16
|
+
[@options[:role] || @options[:plan], args[2]]
|
17
|
+
end
|
18
|
+
|
19
|
+
@schema.allow?(namespace, feature, role, options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def require!(*args)
|
23
|
+
@schema.require!(*args)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module AccessSchema
|
2
|
+
class Schema
|
3
|
+
|
4
|
+
attr_reader :roles
|
5
|
+
alias :plans :roles
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@roles = []
|
9
|
+
@asserts = {}
|
10
|
+
@namespaces = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_role(role)
|
14
|
+
@roles << role
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_assert(assert)
|
18
|
+
@asserts[assert.name] = assert
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_namespace(namespace)
|
22
|
+
@namespaces[namespace.name] = namespace
|
23
|
+
end
|
24
|
+
|
25
|
+
def allow?(*args)
|
26
|
+
require!(*args)
|
27
|
+
rescue NotAlowedError => e
|
28
|
+
false
|
29
|
+
else
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def require!(*args)
|
34
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
35
|
+
case args[0]
|
36
|
+
when String, Symbol
|
37
|
+
check!(args[0].to_sym, args[1].to_sym, args[2].to_sym, options)
|
38
|
+
else
|
39
|
+
check!(args[0].class.name.to_sym, args[1].to_sym, args[2].to_sym, options.merge(:subject => args[0]) )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def check!(namespace_name, element_name, role, options)
|
46
|
+
|
47
|
+
allowed = for_element(namespace_name, element_name) do |element|
|
48
|
+
element.allow?(role) do |expectation|
|
49
|
+
check_assert(expectation, options)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
unless allowed
|
54
|
+
raise NotAlowedError.new
|
55
|
+
else
|
56
|
+
true
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
def check_assert(expectation, options)
|
62
|
+
@asserts[expectation.name].check?(expectation.options.merge(options))
|
63
|
+
end
|
64
|
+
|
65
|
+
def for_element(namespace, element)
|
66
|
+
ns = namespace.to_sym
|
67
|
+
fn = element.to_sym
|
68
|
+
allowed = elements_for(ns).any? do |element|
|
69
|
+
if element.name == fn
|
70
|
+
yield(element)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def elements_for(namespace)
|
76
|
+
@namespaces[namespace].elements
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'access_schema/version'
|
2
|
+
require 'access_schema/exceptions'
|
3
|
+
|
4
|
+
require 'access_schema/schema'
|
5
|
+
require 'access_schema/assert'
|
6
|
+
require 'access_schema/namespace'
|
7
|
+
require 'access_schema/element'
|
8
|
+
require 'access_schema/expectation'
|
9
|
+
|
10
|
+
require 'access_schema/builders/basic_builder'
|
11
|
+
require 'access_schema/builders/roles_builder'
|
12
|
+
require 'access_schema/builders/asserts_builder'
|
13
|
+
require 'access_schema/builders/namespace_builder'
|
14
|
+
require 'access_schema/builders/element_builder'
|
15
|
+
require 'access_schema/builders/schema_builder'
|
16
|
+
|
17
|
+
require 'access_schema/proxy'
|
18
|
+
|
19
|
+
module AccessSchema
|
20
|
+
|
21
|
+
def self.build(*args)
|
22
|
+
SchemaBuilder.build(*args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.build_file(*args)
|
26
|
+
SchemaBuilder.build_file(*args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.with_options(schema, options)
|
30
|
+
Proxy.new(schema, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AccessSchema do
|
4
|
+
|
5
|
+
describe "#build" do
|
6
|
+
it "returns schema"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#build_file" do
|
10
|
+
it "returns schema"
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#with_options" do
|
14
|
+
|
15
|
+
before do
|
16
|
+
@schema = AccessSchema.build_file('spec/schema_example.rb')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "takes schema and options" do
|
20
|
+
lambda {
|
21
|
+
AccessSchema.with_options(@schema, {:plan => :none})
|
22
|
+
}.should_not raise_error
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns schema" do
|
26
|
+
result = AccessSchema.with_options(@schema, {:plan => :none})
|
27
|
+
%w{allow? require!}.should be_all{|m| result.respond_to?(m)}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "allows to not specify plan for schema calls" do
|
31
|
+
schema = AccessSchema.with_options(@schema, {:plan => :flower})
|
32
|
+
schema.allow?("Review", :mark_featured).should be_true
|
33
|
+
end
|
34
|
+
|
35
|
+
it "but it accepts plan too" do
|
36
|
+
schema = AccessSchema.with_options(@schema, {})
|
37
|
+
schema.allow?("Review", :mark_featured, :flower).should be_true
|
38
|
+
schema.allow?("Review", :mark_featured, :none).should be_false
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
File without changes
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AccessSchema::SchemaBuilder do
|
4
|
+
|
5
|
+
before do
|
6
|
+
end
|
7
|
+
|
8
|
+
it "builds schema from block" do
|
9
|
+
@schema = AccessSchema::SchemaBuilder.build do
|
10
|
+
plans do
|
11
|
+
plan :none
|
12
|
+
end
|
13
|
+
end
|
14
|
+
@schema.should be
|
15
|
+
end
|
16
|
+
|
17
|
+
it "builds schema from file" do
|
18
|
+
@schema = AccessSchema::SchemaBuilder.build_file('spec/schema_example.rb')
|
19
|
+
@schema.should be
|
20
|
+
end
|
21
|
+
|
22
|
+
it "raises error if file dows not exists" do
|
23
|
+
lambda { @schema = AccessSchema::SchemaBuilder.build_file('abc') }.should raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
class Review; end
|
30
|
+
|
31
|
+
describe AccessSchema::SchemaBuilder, "produced schema example" do
|
32
|
+
|
33
|
+
before do
|
34
|
+
@review = Review.new
|
35
|
+
@review.stub(:photos_count) { @photo_count }
|
36
|
+
@schema = AccessSchema::SchemaBuilder.build_file('spec/schema_example.rb')
|
37
|
+
end
|
38
|
+
|
39
|
+
it "creates plans" do
|
40
|
+
@schema.plans.should == [:none, :bulb, :flower, :bouquet]
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when checking against plan 'none'" do
|
44
|
+
|
45
|
+
it "does not allows to mark featured" do
|
46
|
+
@schema.allow?(@review, :mark_featured, :none).should be_false
|
47
|
+
end
|
48
|
+
|
49
|
+
it "allows to add first photo" do
|
50
|
+
@photo_count = 0
|
51
|
+
@schema.allow?(@review, :add_photo, :none).should be_true
|
52
|
+
end
|
53
|
+
|
54
|
+
it "does not allow to add second one" do
|
55
|
+
@photo_count = 1
|
56
|
+
@schema.allow?(@review, :add_photo, :none).should be_false
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when checking against plan 'bulb'" do
|
62
|
+
|
63
|
+
it "does not allow to mark featured" do
|
64
|
+
@schema.allow?(@review, :mark_featured, :bulb).should be_false
|
65
|
+
end
|
66
|
+
|
67
|
+
it "allows to add up to 5 photos" do
|
68
|
+
@photo_count = 4
|
69
|
+
@schema.allow?(@review, :add_photo, :bulb).should be_true
|
70
|
+
end
|
71
|
+
|
72
|
+
it "does not allow to add more then 5" do
|
73
|
+
@photo_count = 5
|
74
|
+
@schema.allow?(@review, :add_photo, :bulb).should be_false
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
context "when checking against plan 'flower'" do
|
80
|
+
|
81
|
+
it "allows to mark featured" do
|
82
|
+
@schema.allow?(@review, :mark_featured, :flower).should be_true
|
83
|
+
end
|
84
|
+
|
85
|
+
it "allows to add up to 10 photos" do
|
86
|
+
@photo_count = 9
|
87
|
+
@schema.allow?(@review, :add_photo, :flower).should be_true
|
88
|
+
end
|
89
|
+
|
90
|
+
it "does not allow to add more then 10" do
|
91
|
+
@photo_count = 10
|
92
|
+
@schema.allow?(@review, :add_photo, :flower).should be_false
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
context "when checking against plan 'bouquet'" do
|
98
|
+
|
99
|
+
it "allows to mark featured" do
|
100
|
+
@schema.allow?(@review, :mark_featured, :bouquet).should be_true
|
101
|
+
end
|
102
|
+
|
103
|
+
it "allows to add over 9000 photos" do
|
104
|
+
@photo_count = 9000
|
105
|
+
@schema.allow?(@review, :add_photo, :bouquet).should be_true
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe AccessSchema::Schema, "errors rising" do
|
4
|
+
|
5
|
+
describe "#add_plan" do
|
6
|
+
|
7
|
+
it "raises error if duplicate"
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#add_assert" do
|
12
|
+
|
13
|
+
it "raises error if duplicate"
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#add_feature" do
|
18
|
+
|
19
|
+
it "raises error if duplicate"
|
20
|
+
it "raises error for invalid plan"
|
21
|
+
it "raises error for invalid assert"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#allow?" do
|
26
|
+
|
27
|
+
it "raises exception on invalid namespace"
|
28
|
+
it "raises exception on invalid feature"
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#require!" do
|
33
|
+
|
34
|
+
it "raises en error is feature is nt allowed"
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
plans do
|
3
|
+
plan :none
|
4
|
+
plan :bulb
|
5
|
+
plan :flower
|
6
|
+
plan :bouquet
|
7
|
+
end
|
8
|
+
|
9
|
+
asserts do
|
10
|
+
|
11
|
+
assert :photo_limit, [:limit] do
|
12
|
+
subject.photos_count < limit
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
namespace "Review" do
|
18
|
+
|
19
|
+
feature :mark_featured, [:flower, :bouquet]
|
20
|
+
|
21
|
+
feature :add_photo, [:bouquet] do
|
22
|
+
assert :photo_limit, [:none], :limit => 1
|
23
|
+
assert :photo_limit, [:bulb], :limit => 5
|
24
|
+
assert :photo_limit, [:flower], :limit => 10
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: access_schema
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Victor Gumayunov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-27 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: AccessSchema is a tool for ACL or tariff plans schema definition and
|
15
|
+
checks
|
16
|
+
email:
|
17
|
+
- gumayunov@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- .rspec
|
24
|
+
- Gemfile
|
25
|
+
- Guardfile
|
26
|
+
- LICENSE
|
27
|
+
- README.md
|
28
|
+
- Rakefile
|
29
|
+
- access_schema.gemspec
|
30
|
+
- lib/access_schema.rb
|
31
|
+
- lib/access_schema/assert.rb
|
32
|
+
- lib/access_schema/builders/asserts_builder.rb
|
33
|
+
- lib/access_schema/builders/basic_builder.rb
|
34
|
+
- lib/access_schema/builders/element_builder.rb
|
35
|
+
- lib/access_schema/builders/namespace_builder.rb
|
36
|
+
- lib/access_schema/builders/roles_builder.rb
|
37
|
+
- lib/access_schema/builders/schema_builder.rb
|
38
|
+
- lib/access_schema/element.rb
|
39
|
+
- lib/access_schema/exceptions.rb
|
40
|
+
- lib/access_schema/expectation.rb
|
41
|
+
- lib/access_schema/namespace.rb
|
42
|
+
- lib/access_schema/proxy.rb
|
43
|
+
- lib/access_schema/schema.rb
|
44
|
+
- lib/access_schema/version.rb
|
45
|
+
- spec/access_schema_spec.rb
|
46
|
+
- spec/assess_schema/proxy_spec.rb
|
47
|
+
- spec/assess_schema/schema_builder_spec.rb
|
48
|
+
- spec/assess_schema/schema_spec.rb
|
49
|
+
- spec/schema_example.rb
|
50
|
+
- spec/spec_helper.rb
|
51
|
+
homepage: ''
|
52
|
+
licenses: []
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
require_paths:
|
56
|
+
- lib
|
57
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
requirements: []
|
70
|
+
rubyforge_project: access_schema
|
71
|
+
rubygems_version: 1.8.16
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: AccessSchema is an ACL tool
|
75
|
+
test_files:
|
76
|
+
- spec/access_schema_spec.rb
|
77
|
+
- spec/assess_schema/proxy_spec.rb
|
78
|
+
- spec/assess_schema/schema_builder_spec.rb
|
79
|
+
- spec/assess_schema/schema_spec.rb
|
80
|
+
- spec/schema_example.rb
|
81
|
+
- spec/spec_helper.rb
|