cantango-core 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +7 -1
- data/Gemfile.lock +70 -12
- data/README.mdown +16 -14
- data/VERSION +1 -1
- data/cantango-core.gemspec +41 -51
- data/lib/cantango/ability/base/callbacks.rb +37 -0
- data/lib/cantango/ability/base.rb +21 -8
- data/lib/cantango/ability/cache.rb +1 -1
- data/lib/cantango/ability/executor/modes.rb +6 -6
- data/lib/cantango/ability/executor/no_cache_mode.rb +2 -6
- data/lib/cantango/ability/executor.rb +1 -1
- data/lib/cantango/ability/helper/account.rb +6 -10
- data/lib/cantango/ability/helper/engine.rb +22 -26
- data/lib/cantango/ability/helper/user.rb +10 -14
- data/lib/cantango/ability/helper.rb +1 -1
- data/lib/cantango/ability.rb +7 -2
- data/lib/cantango/adaptor/active_record.rb +6 -0
- data/lib/cantango/adaptor/data_mapper.rb +5 -0
- data/lib/cantango/adaptor/generic.rb +12 -0
- data/lib/cantango/adaptor/mongo.rb +13 -0
- data/lib/cantango/adaptor/mongo_mapper.rb +5 -0
- data/lib/cantango/adaptor/mongoid.rb +5 -0
- data/lib/cantango/adaptor/relational.rb +8 -0
- data/lib/cantango/{rules/adaptor.rb → adaptor.rb} +4 -4
- data/lib/cantango/{rules → cancan}/rule_class.rb +1 -1
- data/lib/cantango/cancan.rb +5 -0
- data/lib/cantango/core.rb +5 -13
- data/lib/cantango/engine.rb +6 -16
- data/lib/cantango/filter/base.rb +1 -1
- data/lib/cantango/helpers/debug.rb +31 -1
- data/lib/cantango/loader/yaml.rb +2 -11
- data/lib/cantango/model/guest.rb +3 -1
- data/spec/cantango/ability/base_spec.rb +13 -63
- data/spec/cantango/ability/cache/simple_key_spec.rb +29 -0
- data/spec/cantango/ability/executor/base_spec.rb +12 -52
- data/spec/cantango/ability/executor/custom_spec.rb +51 -0
- data/spec/cantango/ability/executor/modes_spec.rb +27 -49
- data/spec/cantango/ability/executor/no_cache_mode_spec.rb +29 -0
- data/spec/cantango/ability/helper/account_spec.rb +37 -0
- data/spec/cantango/ability/helper/engine_spec.rb +36 -0
- data/spec/cantango/ability/helper/user_spec.rb +38 -0
- data/spec/cantango/adaptor/active_record_spec.rb +38 -0
- data/spec/cantango/adaptor/data_mapper_spec.rb +39 -0
- data/spec/cantango/{rules/adaptor → adaptor}/mongo_mapper_spec.rb +0 -0
- data/spec/cantango/{rules/adaptor → adaptor}/mongoid_spec.rb +0 -0
- data/spec/cantango/cancan/rule_spec.rb +5 -0
- data/spec/cantango/core_spec.rb +0 -2
- data/spec/cantango/engine_spec.rb +51 -0
- data/spec/cantango/filter/base_spec.rb +25 -0
- data/spec/cantango/helpers/debug_spec.rb +29 -0
- data/spec/cantango/loader/yaml_spec.rb +5 -0
- data/spec/cantango/model/guest_spec.rb +14 -0
- data/spec/cantango/rspec/be_allowed_to_spec.rb +5 -0
- data/spec/cantango/scope/ability_spec.rb +33 -0
- data/spec/fixtures/models/account.rb +7 -0
- data/spec/fixtures/models/admin.rb +2 -0
- data/spec/fixtures/models/admin_account.rb +8 -0
- data/spec/fixtures/models/items.rb +11 -0
- data/spec/fixtures/models/user.rb +20 -0
- data/spec/fixtures/models.rb +2 -0
- data/spec/spec_helper.rb +4 -0
- metadata +60 -67
- data/lib/cantango/ability/executor/cache_mode.rb +0 -33
- data/lib/cantango/ability/helper/role.rb +0 -21
- data/lib/cantango/ability/helper/role_group.rb +0 -21
- data/lib/cantango/macros/account.rb +0 -14
- data/lib/cantango/macros/user.rb +0 -16
- data/lib/cantango/macros.rb +0 -11
- data/lib/cantango/rules/adaptor/active_record.rb +0 -10
- data/lib/cantango/rules/adaptor/data_mapper.rb +0 -11
- data/lib/cantango/rules/adaptor/generic.rb +0 -16
- data/lib/cantango/rules/adaptor/mongo.rb +0 -19
- data/lib/cantango/rules/adaptor/mongo_mapper.rb +0 -10
- data/lib/cantango/rules/adaptor/mongoid.rb +0 -9
- data/lib/cantango/rules/adaptor/relational.rb +0 -13
- data/lib/cantango/rules/dsl.rb +0 -24
- data/lib/cantango/rules/relation.rb +0 -67
- data/lib/cantango/rules/scope.rb +0 -24
- data/lib/cantango/rules.rb +0 -8
- data/spec/cantango/ability/cached_spec.rb +0 -0
- data/spec/cantango/ability/executor/base2.rb +0 -75
- data/spec/cantango/ability/executor/cache_mode_spec.rb +0 -77
- data/spec/cantango/macros/account_spec.rb +0 -0
- data/spec/cantango/macros/user_spec.rb +0 -0
- data/spec/cantango/rules/adaptor/active_record_spec.rb +0 -0
- data/spec/cantango/rules/adaptor/data_mapper_spec.rb +0 -0
- data/spec/cantango/rules/adaptor_spec.rb +0 -0
- data/spec/cantango/rules/dsl_spec.rb +0 -0
- data/spec/cantango/rules/relation_spec.rb +0 -0
- data/spec/cantango/rules/rule_class_spec.rb +0 -0
- data/spec/cantango/rules/scope_spec.rb +0 -0
- data/spec/cantango/rules_spec.rb +0 -55
@@ -1,68 +1,46 @@
|
|
1
|
-
require '
|
2
|
-
require 'cantango'
|
3
|
-
# require 'simple_roles'
|
1
|
+
require 'spec_helper'
|
4
2
|
require 'fixtures/models'
|
5
|
-
require 'cantango/rspec'
|
6
3
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
config.clear!
|
13
|
-
config.permits.enabled_types = [:role]
|
14
|
-
end
|
15
|
-
CanTango.debug!
|
16
|
-
|
17
|
-
class User
|
18
|
-
tango_user
|
19
|
-
include_and_extend SimpleRoles
|
20
|
-
end
|
21
|
-
|
22
|
-
class AdminRolePermit < CanTango::Permit::Role
|
23
|
-
def initialize ability
|
24
|
-
super
|
25
|
-
end
|
26
|
-
|
27
|
-
protected
|
28
|
-
|
29
|
-
def static_rules
|
30
|
-
can :read, Article
|
4
|
+
module CanTango::Ability::Executor
|
5
|
+
class CacheMode
|
6
|
+
def permit_rules
|
7
|
+
can :read, Post
|
8
|
+
end
|
31
9
|
end
|
10
|
+
end
|
32
11
|
|
33
|
-
|
12
|
+
module CanTango::Ability::Executor
|
13
|
+
class NoCacheMode
|
34
14
|
def permit_rules
|
35
|
-
can :
|
36
|
-
can :delete, Article
|
15
|
+
can :write, Post
|
37
16
|
end
|
38
17
|
end
|
39
18
|
end
|
40
19
|
|
41
20
|
describe CanTango::Ability::Executor::Modes do
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
@user = User.new 'admin', 'admin@mail.ru', :role => 'admin'
|
47
|
-
@abil = CanTango::AbilityExecutor.new @user
|
48
|
-
end
|
49
|
-
|
50
|
-
subject { CanTango::AbilityExecutor.new @user }
|
51
|
-
|
52
|
-
describe 'config no_cache' do
|
53
|
-
specify { CanTango.configure.ability.modes.should == [:no_cache] }
|
54
|
-
end
|
21
|
+
before do
|
22
|
+
@user = User.new 'admin', 'admin@mail.ru'
|
23
|
+
end
|
55
24
|
|
56
|
-
|
57
|
-
|
25
|
+
context 'Set execution modes via :modes option'
|
26
|
+
subject do
|
27
|
+
modes_executor = CanTango::Ability::Executor::Modes.new @user
|
28
|
+
modes_executor.modes << :no_cache
|
29
|
+
modes_executor
|
58
30
|
end
|
59
31
|
|
60
|
-
its(:
|
32
|
+
its(:modes) { should include(:no_cache) }
|
61
33
|
its(:non_cached_rules) { should_not be_empty }
|
62
34
|
|
63
35
|
describe 'rules contain only non-cached rules' do
|
64
|
-
specify { subject.rules.size.should ==
|
65
|
-
specify { subject.rules.size.should ==
|
36
|
+
specify { subject.rules.size.should == subject.non_cached_rules.size }
|
37
|
+
specify { subject.rules.size.should == 1 }
|
66
38
|
end
|
67
39
|
end
|
40
|
+
|
41
|
+
context 'Set execution modes via :modes option'
|
42
|
+
subject { @CanTango::Ability::Executor::Modes.new @user, :modes => [:no_cache] }
|
43
|
+
|
44
|
+
its(:modes) { should include(:no_cache) }
|
45
|
+
end
|
68
46
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fixtures/models'
|
3
|
+
|
4
|
+
module CanTango::Ability::Executor
|
5
|
+
class NoCacheMode
|
6
|
+
def permit_rules
|
7
|
+
can :read, Post
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe CanTango::Ability::Executor::NoCacheMode do
|
13
|
+
context 'no_cached mode only' do
|
14
|
+
before do
|
15
|
+
@user = User.new 'admin', 'admin@mail.ru'
|
16
|
+
@ability = CanTango::Ability::Base.new @user
|
17
|
+
end
|
18
|
+
|
19
|
+
subject { CanTango::Ability::Executor::NoCacheMode.new @ability }
|
20
|
+
|
21
|
+
its(:non_cached_rules) { should be_empty }
|
22
|
+
|
23
|
+
describe 'rules contain only non-cached rules' do
|
24
|
+
specify { subject.rules.size.should == @abil.cached_rules.size }
|
25
|
+
specify { subject.rules.size.should == 1 }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module CanTango::Ability
|
4
|
+
class Base
|
5
|
+
include CanTango::Ability::Helper::Account
|
6
|
+
|
7
|
+
def permit_rules
|
8
|
+
can :edit, Project
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class MyAccount
|
14
|
+
end
|
15
|
+
|
16
|
+
class User
|
17
|
+
attr_accessor :account
|
18
|
+
end
|
19
|
+
|
20
|
+
describe CanTango::Ability::Helper::Account do
|
21
|
+
before do
|
22
|
+
@user = User.new
|
23
|
+
@account = MyAccount.new
|
24
|
+
@user.account = @account
|
25
|
+
end
|
26
|
+
|
27
|
+
subject do
|
28
|
+
CanTango::Ability::Base.new @user
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'Ability should have' do
|
32
|
+
describe '#account method' do
|
33
|
+
specify { subject.account.should == @account }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module CanTango::Ability
|
4
|
+
class Base
|
5
|
+
include CanTango::Ability::Helper::Engine
|
6
|
+
|
7
|
+
def permit_rules
|
8
|
+
can :edit, Project
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class MyAccount
|
14
|
+
end
|
15
|
+
|
16
|
+
class User
|
17
|
+
attr_accessor :account
|
18
|
+
end
|
19
|
+
|
20
|
+
describe CanTango::Ability::Helper::Engine do
|
21
|
+
before do
|
22
|
+
@user = User.new
|
23
|
+
end
|
24
|
+
|
25
|
+
subject do
|
26
|
+
CanTango::Ability::Base.new @user
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'Ability should have' do
|
30
|
+
[:engines, :each_engine, :execute_engines!].each do |method_name|
|
31
|
+
describe "#{method_name} method" do
|
32
|
+
specify { subject.should respond_to(method_name) }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class MyAccount
|
4
|
+
end
|
5
|
+
|
6
|
+
class User
|
7
|
+
attr_accessor :account
|
8
|
+
end
|
9
|
+
|
10
|
+
module CanTango::Ability
|
11
|
+
class Base
|
12
|
+
include CanTango::Ability::Helper::User
|
13
|
+
|
14
|
+
def permit_rules
|
15
|
+
can :edit, Project
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe CanTango::Ability::Helper::User do
|
21
|
+
before do
|
22
|
+
@user = User.new
|
23
|
+
end
|
24
|
+
|
25
|
+
subject do
|
26
|
+
CanTango::Ability::Base.new @user
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'Ability should have' do
|
30
|
+
describe '#user method' do
|
31
|
+
specify { subject.user.should == @user }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#user_key_field' do
|
35
|
+
specify { subject.should respond_to(:user_key_field) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# This is used to wrap the CanCan ORM adapters, that enable convenient
|
2
|
+
# 'simple' queries using hashes similar to 'metawhere' gem
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
class Poster < ActiveRecord::Base
|
6
|
+
end
|
7
|
+
|
8
|
+
module CanTango::Ability
|
9
|
+
class Base
|
10
|
+
def permit_rules
|
11
|
+
can :read, Poster, :owner => user
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
describe CanTango::Adaptor::ActiveRecord do
|
18
|
+
before do
|
19
|
+
@user = User.new 'admin', 'admin@mail.ru'
|
20
|
+
@stranger = User.new 'stranger', 'stranger@mail.ru'
|
21
|
+
|
22
|
+
@poster = Poster.create :owner => @user
|
23
|
+
@poster.owner = @user
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'subject is owner of poster' do
|
27
|
+
subject { CanTango::Ability::Executor::Base.new @user }
|
28
|
+
|
29
|
+
specify { subject.should be_allowed_to(:read, @poster) }
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'subject is NOT owner of poster' do
|
33
|
+
subject { CanTango::Ability::Executor::Base.new @stranger }
|
34
|
+
|
35
|
+
specify { subject.should_not be_allowed_to(:read, @poster) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# This is used to wrap the CanCan ORM adapters, that enable convenient
|
2
|
+
# 'simple' queries using hashes similar to 'metawhere' gem
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
class Chair
|
6
|
+
include DataMapper::Resource
|
7
|
+
end
|
8
|
+
|
9
|
+
module CanTango::Ability
|
10
|
+
class Base
|
11
|
+
def permit_rules
|
12
|
+
can :read, Chair, :owner => user
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
describe CanTango::Adaptor::DataMapper do
|
19
|
+
before do
|
20
|
+
@user = User.new 'admin', 'admin@mail.ru'
|
21
|
+
@stranger = User.new 'stranger', 'stranger@mail.ru'
|
22
|
+
|
23
|
+
@chair = Chair.create :owner => @user
|
24
|
+
@chair.owner = @user
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'subject is owner of poster' do
|
28
|
+
subject { CanTango::Ability::Executor::Base.new @user }
|
29
|
+
|
30
|
+
specify { subject.should be_allowed_to(:read, @chair) }
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'subject is NOT owner of poster' do
|
34
|
+
subject { CanTango::Ability::Executor::Base.new @stranger }
|
35
|
+
|
36
|
+
specify { subject.should_not be_allowed_to(:read, @chair) }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
File without changes
|
File without changes
|
data/spec/cantango/core_spec.rb
CHANGED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fixtures/models'
|
3
|
+
|
4
|
+
describe CanTango::Engine do
|
5
|
+
before do
|
6
|
+
@user = User.new 'admin', 'admin@mail.ru'
|
7
|
+
@ability = CanTango::Ability::Base.new @user
|
8
|
+
end
|
9
|
+
|
10
|
+
context '#initilize with ability' do
|
11
|
+
subject { CanTango::Engine.new @ability }
|
12
|
+
|
13
|
+
specify { subject.should be_a CanTango::Engine }
|
14
|
+
|
15
|
+
specify do
|
16
|
+
lambda { subject.execute! }.should raise_error
|
17
|
+
end
|
18
|
+
|
19
|
+
specify do
|
20
|
+
lambda { subject.engine_name }.should raise_error
|
21
|
+
end
|
22
|
+
|
23
|
+
specify do
|
24
|
+
subject.modes.should be_empty
|
25
|
+
end
|
26
|
+
|
27
|
+
specify do
|
28
|
+
subject.valid_mode?(:no_cache).should be_false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context '#initilize with ability and :no_cache mode' do
|
33
|
+
subject { CanTango::Engine.new @ability, :modes => [:no_cache] }
|
34
|
+
|
35
|
+
specify do
|
36
|
+
subject.modes.should_not be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
specify do
|
40
|
+
subject.modes.should include(:no_cache)
|
41
|
+
end
|
42
|
+
|
43
|
+
specify do
|
44
|
+
subject.valid_mode?(:no_cache).should be_true
|
45
|
+
end
|
46
|
+
|
47
|
+
specify do
|
48
|
+
subject.valid_mode?(:cache).should be_false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class MyFilter < CanTango::Filter::Base
|
4
|
+
def initialize item, list
|
5
|
+
super
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe CanTango::Filter::Base do
|
10
|
+
context "a and list of a,b,c" do
|
11
|
+
before do
|
12
|
+
@list = ['a', 'b', 'c']
|
13
|
+
end
|
14
|
+
subject { MyFilter.new 'a', @list }
|
15
|
+
|
16
|
+
its(:include_list) { should == @list.map(&:to_sym) }
|
17
|
+
its(:item) { should == :a }
|
18
|
+
|
19
|
+
its(:valid?) { should be_true }
|
20
|
+
its(:in_include_list?) { should be_true }
|
21
|
+
|
22
|
+
its(:not_only?) { should be_false }
|
23
|
+
its(:excluded?) { should be_false }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Paper
|
4
|
+
include CanTango::Helpers::Debug
|
5
|
+
end
|
6
|
+
|
7
|
+
module Writer
|
8
|
+
def self.global_buffer
|
9
|
+
@global_buffer ||= ""
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe CanTango::Helpers::Debug do
|
14
|
+
before do
|
15
|
+
@paper = Paper.new
|
16
|
+
@paper.debug_writer = lambda {|m| Writer.global_buffer << m }
|
17
|
+
@paper.do_debug = true
|
18
|
+
end
|
19
|
+
|
20
|
+
subject { @paper }
|
21
|
+
|
22
|
+
describe 'should write to writer' do
|
23
|
+
before do
|
24
|
+
@paper.debug 'hello'
|
25
|
+
end
|
26
|
+
|
27
|
+
specify { Writer.global_buffer.should == 'hello'}
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Guest
|
4
|
+
include CanTango::Model::Guest
|
5
|
+
end
|
6
|
+
|
7
|
+
describe CanTango::Model::Guest do
|
8
|
+
subject { Guest.new }
|
9
|
+
|
10
|
+
its(:email) { should == 'guest@example.com' }
|
11
|
+
|
12
|
+
specify { subject.has_role?(:guest).should be_true }
|
13
|
+
specify { subject.has_role?(:user).should be_false }
|
14
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fixtures/models'
|
3
|
+
|
4
|
+
module CanTango::Ability
|
5
|
+
class Base
|
6
|
+
include CanTango::Ability::Helper::Account
|
7
|
+
|
8
|
+
def permit_rules
|
9
|
+
can :read, Project
|
10
|
+
cannot :edit, Project
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe CanTango::Scope::Ability do
|
16
|
+
before do
|
17
|
+
@user = User.new 'krisy', 'kris@gmail.com'
|
18
|
+
@ability = CanTango::Ability::Base.new @user
|
19
|
+
|
20
|
+
@project = Project.new
|
21
|
+
end
|
22
|
+
|
23
|
+
subject { CanTango::Scope::Ability.new @ability }
|
24
|
+
|
25
|
+
specify do
|
26
|
+
subject.can?(:read, @project).should be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
specify do
|
30
|
+
subject.cannot?(:edit, @project).should be_true
|
31
|
+
subject.can?(:edit, @project).should be_false
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class User
|
2
|
+
attr_accessor :name, :account, :email
|
3
|
+
|
4
|
+
def initialize name, email = nil, options = {}
|
5
|
+
@name = name
|
6
|
+
@email = email
|
7
|
+
set_option_vars options
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_option_vars options = {}
|
11
|
+
options.each_pair do |name, value|
|
12
|
+
var = :"@#{name}"
|
13
|
+
self.instance_variable_set(var, value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def email
|
18
|
+
@email ||= 'default@gmail.com'
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'rspec'
|
2
|
+
require 'cantango/rspec'
|
2
3
|
require 'cantango/core'
|
3
4
|
|
5
|
+
class Project
|
6
|
+
end
|
7
|
+
|
4
8
|
# Requires supporting files with custom matchers and macros, etc,
|
5
9
|
# in ./support/ and its subdirectories.
|
6
10
|
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|