congo 0.1.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 +23 -0
- data/LICENSE +20 -0
- data/README.rdoc +17 -0
- data/Rakefile +51 -0
- data/VERSION +1 -0
- data/config/locales/en.yml +18 -0
- data/config/locales/fr.yml +18 -0
- data/init.rb +2 -0
- data/lib/congo.rb +16 -0
- data/lib/congo/content_type.rb +107 -0
- data/lib/congo/grip/attachment.rb +22 -0
- data/lib/congo/grip/has_attachment.rb +99 -0
- data/lib/congo/list.rb +64 -0
- data/lib/congo/metadata/association.rb +24 -0
- data/lib/congo/metadata/key.rb +40 -0
- data/lib/congo/metadata/validation.rb +42 -0
- data/lib/congo/migration.rb +143 -0
- data/lib/congo/proxy_scoper.rb +18 -0
- data/lib/congo/scoper.rb +81 -0
- data/lib/congo/support.rb +19 -0
- data/lib/congo/types.rb +64 -0
- data/lib/congo/validation.rb +86 -0
- data/spec/assets/avatar.jpeg +0 -0
- data/spec/assets/dhh.jpg +0 -0
- data/spec/functional/content_type_spec.rb +152 -0
- data/spec/functional/functional_spec_helper.rb +11 -0
- data/spec/functional/grip_spec.rb +47 -0
- data/spec/functional/key_spec.rb +94 -0
- data/spec/functional/list_spec.rb +67 -0
- data/spec/functional/migration_spec.rb +167 -0
- data/spec/functional/scoper_spec.rb +128 -0
- data/spec/functional/validation_spec.rb +90 -0
- data/spec/models.rb +41 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/unit/key_spec.rb +63 -0
- data/spec/unit/scoper_spec.rb +19 -0
- data/spec/unit/unit_spec_helper.rb +3 -0
- metadata +142 -0
@@ -0,0 +1,128 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/functional_spec_helper')
|
2
|
+
|
3
|
+
describe 'Scoper' do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
Congo::ProxyScoper.destroy_all
|
7
|
+
Congo::ContentType.destroy_all
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should be used inside any AR models' do
|
11
|
+
website = Website.new(42, 'My simple website')
|
12
|
+
website.id.should == 42
|
13
|
+
lambda {
|
14
|
+
3.times do
|
15
|
+
website.content_types.should be_empty
|
16
|
+
end
|
17
|
+
}.should change(Congo::ProxyScoper, :count).by(1)
|
18
|
+
|
19
|
+
proxy = Congo::ProxyScoper.first
|
20
|
+
proxy.ext_id.should == 42
|
21
|
+
proxy.ext_type.should == 'Website'
|
22
|
+
|
23
|
+
another = Website.new(43, 'Another simple website')
|
24
|
+
lambda {
|
25
|
+
another.content_types.should be_empty
|
26
|
+
}.should change(Congo::ProxyScoper, :count).by(1)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should be used inside a MongoMapper document' do
|
30
|
+
account = Account.create(:email => 'layne_stanley@acme.org')
|
31
|
+
account.content_types.should be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should not break method_missing stuff from the scoper' do
|
35
|
+
website = Website.new(42, 'My simple website')
|
36
|
+
website.foo?.should == 'Hello foo !'
|
37
|
+
lambda {
|
38
|
+
website.bar
|
39
|
+
}.should raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
## Create content types ##
|
43
|
+
it 'should create a content type and use it straight from an AR object' do
|
44
|
+
website = Website.new(42, 'My simple website')
|
45
|
+
|
46
|
+
lambda {
|
47
|
+
create_blog_post_type(website)
|
48
|
+
}.should change(Congo::ContentType, :count).by(1)
|
49
|
+
|
50
|
+
website.content_types.should_not be_empty
|
51
|
+
|
52
|
+
website.blog_posts.count.should == 0
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should create a content type and use it straight from the MM document' do
|
56
|
+
account = Account.create!(:email => 'layne_stanley@acme.org')
|
57
|
+
|
58
|
+
lambda {
|
59
|
+
type = create_project_type(account)
|
60
|
+
type.slug.should == 'my_projects'
|
61
|
+
}.should change(Congo::ContentType, :count).by(1)
|
62
|
+
|
63
|
+
account.projects.count.should == 0
|
64
|
+
account.my_projects.count.should == 0
|
65
|
+
end
|
66
|
+
|
67
|
+
## Content type validation (own file ?) ##
|
68
|
+
it 'should not create a content type if it does not have a name' do
|
69
|
+
account = Account.create(:email => 'layne_stanley@acme.org')
|
70
|
+
lambda {
|
71
|
+
content_type = account.content_types.create(:metadata_keys => [ { :name => 'Title' } ])
|
72
|
+
content_type.errors.on(:name).should_not be_nil
|
73
|
+
}.should_not change(Congo::ContentType, :count).by(1)
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should not create a content type if it does not have keys' do
|
77
|
+
account = Account.create(:email => 'layne_stanley@acme.org')
|
78
|
+
lambda {
|
79
|
+
content_type = account.content_types.create(:name => 'Project')
|
80
|
+
content_type.errors.on(:metadata_keys).should_not be_nil
|
81
|
+
}.should_not change(Congo::ContentType, :count).by(1)
|
82
|
+
end
|
83
|
+
|
84
|
+
## Collections: add items, ...etc ##
|
85
|
+
it 'should add items into a collection' do
|
86
|
+
account = Account.create(:email => 'layne_stanley@acme.org')
|
87
|
+
create_project_type(account)
|
88
|
+
|
89
|
+
project = account.projects.build(:name => 'Congo', :description => 'bla bla')
|
90
|
+
project.save
|
91
|
+
project.respond_to?(:created_at).should == true
|
92
|
+
project.respond_to?(:updated_at).should == true
|
93
|
+
account.projects.count.should == 1
|
94
|
+
|
95
|
+
account.send(:projects).create(:name => 'CongoCMS', :description => 'bla bla')
|
96
|
+
account.projects.count.should == 2
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should add items into a collection thru the ProxyScoper' do
|
100
|
+
website = Website.new(42, 'My simple website')
|
101
|
+
create_blog_post_type(website)
|
102
|
+
|
103
|
+
website.blog_posts.create(:title => 'Hello world', :body => 'bla bla')
|
104
|
+
website.blog_posts.count.should == 1
|
105
|
+
end
|
106
|
+
|
107
|
+
def create_blog_post_type(website)
|
108
|
+
website.content_types.create!(:name => 'BlogPost',
|
109
|
+
:embedded => false,
|
110
|
+
:timestamps => true,
|
111
|
+
:metadata_keys => [
|
112
|
+
{ :name => 'title' },
|
113
|
+
{ :name => 'body' },
|
114
|
+
{ :name => 'tags', :type => 'Array' }
|
115
|
+
])
|
116
|
+
end
|
117
|
+
|
118
|
+
def create_project_type(account)
|
119
|
+
account.content_types.create!(:name => 'Project',
|
120
|
+
:collection_name => 'My projects',
|
121
|
+
:embedded => false,
|
122
|
+
:metadata_keys => [
|
123
|
+
{ :name => 'name' },
|
124
|
+
{ :name => 'description' }
|
125
|
+
])
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/functional_spec_helper')
|
2
|
+
|
3
|
+
describe 'Validation' do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
Account.destroy_all
|
7
|
+
Congo::ContentType.destroy_all
|
8
|
+
|
9
|
+
@account = Account.create(:email => 'layne_stanley@acme.org')
|
10
|
+
|
11
|
+
create_content_type
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should be valid' do
|
15
|
+
developer = build_developer
|
16
|
+
developer.should be_valid
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should not valid if a key (String type) is not present' do
|
20
|
+
developer = build_developer(:name => nil)
|
21
|
+
developer.should_not be_valid
|
22
|
+
developer.errors.on(:name).should_not be_empty
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should not valid if a key (File type) is not present' do
|
26
|
+
developer = build_developer(:picture => nil)
|
27
|
+
developer.should_not be_valid
|
28
|
+
developer.errors.on(:picture).should_not be_empty
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should not valid if a key (Email type) is not present' do
|
32
|
+
developer = build_developer(:email => nil)
|
33
|
+
developer.should_not be_valid
|
34
|
+
developer.errors.on(:email).should_not be_empty
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should not valid if email has a wrong format' do
|
38
|
+
developer = build_developer(:email => 'foo@foo')
|
39
|
+
developer.should_not be_valid
|
40
|
+
developer.errors.on(:email).should_not be_empty
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should not valid if a key has a wrong format' do
|
44
|
+
developer = build_developer(:blog_url => 'http:/foo.com')
|
45
|
+
developer.should_not be_valid
|
46
|
+
developer.errors.on(:blog_url).should_not be_empty
|
47
|
+
end
|
48
|
+
|
49
|
+
def build_developer(options = {})
|
50
|
+
@account.developers.create({
|
51
|
+
:name => 'Layne Stanley',
|
52
|
+
:bio => 'foo bar',
|
53
|
+
:picture => open_file('avatar.jpeg'),
|
54
|
+
:blog_url => 'http://myblog.com',
|
55
|
+
:email => 'layne.stanley@aic.com'
|
56
|
+
}.merge(options))
|
57
|
+
end
|
58
|
+
|
59
|
+
def create_content_type(options = {})
|
60
|
+
type = build_content_type
|
61
|
+
type.save!
|
62
|
+
type
|
63
|
+
end
|
64
|
+
|
65
|
+
def build_content_type(options = {})
|
66
|
+
default_options = {
|
67
|
+
:name => 'Developer',
|
68
|
+
:embedded => false,
|
69
|
+
:metadata_keys => [
|
70
|
+
{ :name => 'name', :type => 'String' },
|
71
|
+
{ :name => 'bio', :type => 'Text' },
|
72
|
+
{ :name => 'picture', :type => 'File' },
|
73
|
+
{ :name => 'blog_url', :type => 'String' },
|
74
|
+
{ :name => 'email', :type => 'Email' }
|
75
|
+
],
|
76
|
+
:metadata_validations => [
|
77
|
+
{ :key => 'name', :type => 'presence_of' },
|
78
|
+
{ :key => 'email', :type => 'presence_of' },
|
79
|
+
{ :key => 'picture', :type => 'presence_of' },
|
80
|
+
{ :key => 'blog_url', :type => 'presence_of' },
|
81
|
+
{ :key => 'blog_url', :type => 'format_of', :argument => '^http:\/\/(.*)$' }
|
82
|
+
] }
|
83
|
+
|
84
|
+
@account.content_types.build(default_options.merge(options))
|
85
|
+
end
|
86
|
+
|
87
|
+
def open_file(name)
|
88
|
+
File.open(File.join(File.dirname(__FILE__), '..', 'assets', name))
|
89
|
+
end
|
90
|
+
end
|
data/spec/models.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
class WebsiteParent
|
2
|
+
|
3
|
+
def method_missing(method, *args)
|
4
|
+
if method.to_s == 'foo?'
|
5
|
+
"Hello foo !"
|
6
|
+
else
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
class Website < WebsiteParent
|
14
|
+
|
15
|
+
acts_as_congo_scoper
|
16
|
+
|
17
|
+
attr_accessor :id, :title
|
18
|
+
|
19
|
+
def initialize(id, title)
|
20
|
+
self.id, self.title = id, title
|
21
|
+
end
|
22
|
+
|
23
|
+
def pages
|
24
|
+
[]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class Account
|
30
|
+
|
31
|
+
include MongoMapper::Document
|
32
|
+
|
33
|
+
acts_as_congo_scoper
|
34
|
+
|
35
|
+
key :email, String
|
36
|
+
|
37
|
+
def people
|
38
|
+
[]
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'mocha'
|
6
|
+
require 'mongo_mapper'
|
7
|
+
|
8
|
+
require 'congo'
|
9
|
+
require 'models'
|
10
|
+
require 'spec'
|
11
|
+
require 'spec/autorun'
|
12
|
+
|
13
|
+
TEST_DIR = File.expand_path(File.dirname(__FILE__) + '/../tmp')
|
14
|
+
|
15
|
+
FileUtils.mkdir_p(TEST_DIR) unless File.exist?(TEST_DIR)
|
16
|
+
|
17
|
+
|
18
|
+
I18n.load_path << Dir[File.join(File.dirname(__FILE__), '..', 'config', 'locales', '*.{rb,yml}') ]
|
19
|
+
I18n.default_locale = :en
|
20
|
+
|
21
|
+
Spec::Runner.configure do |config|
|
22
|
+
config.mock_with :mocha
|
23
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/unit_spec_helper')
|
2
|
+
|
3
|
+
describe 'Key' do
|
4
|
+
|
5
|
+
it 'should be valid' do
|
6
|
+
Congo::Metadata::Key.new(:name => 'title').should be_valid
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should not be valid without a name' do
|
10
|
+
key = Congo::Metadata::Key.new(:name => '')
|
11
|
+
key.should_not be_valid
|
12
|
+
key.errors.on(:name).should_not be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should be valid without a name if a label is provided' do
|
16
|
+
key = Congo::Metadata::Key.new(:name => '', :label => 'My title')
|
17
|
+
key.should be_valid
|
18
|
+
key.name.should == "my_title"
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should be valid without a type' do
|
22
|
+
key = Congo::Metadata::Key.new(:name => 'title', :type => nil)
|
23
|
+
key.should be_valid
|
24
|
+
key.type.should == "String"
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should have a valid name' do
|
28
|
+
key = Congo::Metadata::Key.new(:name => 'Title')
|
29
|
+
key.should be_valid
|
30
|
+
key.name.should == "title"
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "when applied" do
|
34
|
+
after do
|
35
|
+
@key.apply(@base, @scope)
|
36
|
+
end
|
37
|
+
|
38
|
+
before do
|
39
|
+
@base = mock('Base class')
|
40
|
+
@scope = mock('Scope')
|
41
|
+
@const = Class.new(String)
|
42
|
+
@scope.stubs(:content_type_as_const).with('Key').returns(@const)
|
43
|
+
@key = Congo::Metadata::Key.new(:name => 'mykey', :type => 'Key')
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should create the key in the base class" do
|
47
|
+
@base.expects(:key).with(:mykey, @const)
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "with validations" do
|
51
|
+
before do
|
52
|
+
@const.send(:include, Validatable)
|
53
|
+
@const.send(:validates_format_of, :to_s, :with => /[0-9]+/)
|
54
|
+
@scope.stubs(:content_type_as_const).with('Key').returns(@const)
|
55
|
+
@base.stubs(:key).with(:mykey, @const)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should use include_errors_from in the base class" do
|
59
|
+
@base.expects(:include_errors_from).with(:mykey)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/unit_spec_helper')
|
2
|
+
|
3
|
+
describe Congo::Scoper::InstanceMethods do
|
4
|
+
before do
|
5
|
+
@instance = Object.new
|
6
|
+
@instance.metaclass.send(:include, Congo::Scoper::InstanceMethods)
|
7
|
+
@instance.stubs(:content_types).returns(stub_everything)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "content_type_as_const" do
|
11
|
+
it "should support ruby types" do
|
12
|
+
@instance.content_type_as_const('String').should == String
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should support Congo Email type" do
|
16
|
+
@instance.content_type_as_const('Email').should == Congo::Types::Email
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: congo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
version: 0.1.1
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Rodrigo Alvarez
|
13
|
+
- Didier Lafforgue
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-04-07 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
segments:
|
29
|
+
- 1
|
30
|
+
- 2
|
31
|
+
- 9
|
32
|
+
version: 1.2.9
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: mongo_mapper
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
- 7
|
45
|
+
- 2
|
46
|
+
version: 0.7.2
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
description:
|
50
|
+
email:
|
51
|
+
- papipo@gmail.com
|
52
|
+
- didier@nocoffee.fr
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files:
|
58
|
+
- LICENSE
|
59
|
+
- README.rdoc
|
60
|
+
files:
|
61
|
+
- .gitignore
|
62
|
+
- LICENSE
|
63
|
+
- README.rdoc
|
64
|
+
- Rakefile
|
65
|
+
- VERSION
|
66
|
+
- config/locales/en.yml
|
67
|
+
- config/locales/fr.yml
|
68
|
+
- init.rb
|
69
|
+
- lib/congo.rb
|
70
|
+
- lib/congo/content_type.rb
|
71
|
+
- lib/congo/grip/attachment.rb
|
72
|
+
- lib/congo/grip/has_attachment.rb
|
73
|
+
- lib/congo/list.rb
|
74
|
+
- lib/congo/metadata/association.rb
|
75
|
+
- lib/congo/metadata/key.rb
|
76
|
+
- lib/congo/metadata/validation.rb
|
77
|
+
- lib/congo/migration.rb
|
78
|
+
- lib/congo/proxy_scoper.rb
|
79
|
+
- lib/congo/scoper.rb
|
80
|
+
- lib/congo/support.rb
|
81
|
+
- lib/congo/types.rb
|
82
|
+
- lib/congo/validation.rb
|
83
|
+
- spec/assets/avatar.jpeg
|
84
|
+
- spec/assets/dhh.jpg
|
85
|
+
- spec/functional/content_type_spec.rb
|
86
|
+
- spec/functional/functional_spec_helper.rb
|
87
|
+
- spec/functional/grip_spec.rb
|
88
|
+
- spec/functional/key_spec.rb
|
89
|
+
- spec/functional/list_spec.rb
|
90
|
+
- spec/functional/migration_spec.rb
|
91
|
+
- spec/functional/scoper_spec.rb
|
92
|
+
- spec/functional/validation_spec.rb
|
93
|
+
- spec/models.rb
|
94
|
+
- spec/spec.opts
|
95
|
+
- spec/spec_helper.rb
|
96
|
+
- spec/unit/key_spec.rb
|
97
|
+
- spec/unit/scoper_spec.rb
|
98
|
+
- spec/unit/unit_spec_helper.rb
|
99
|
+
has_rdoc: true
|
100
|
+
homepage: http://github.com/Papipo/congo
|
101
|
+
licenses: []
|
102
|
+
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options:
|
105
|
+
- --charset=UTF-8
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
segments:
|
113
|
+
- 0
|
114
|
+
version: "0"
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
requirements: []
|
123
|
+
|
124
|
+
rubyforge_project:
|
125
|
+
rubygems_version: 1.3.6
|
126
|
+
signing_key:
|
127
|
+
specification_version: 3
|
128
|
+
summary: Library to define flexible schemas for mongodb documents.
|
129
|
+
test_files:
|
130
|
+
- spec/functional/content_type_spec.rb
|
131
|
+
- spec/functional/functional_spec_helper.rb
|
132
|
+
- spec/functional/grip_spec.rb
|
133
|
+
- spec/functional/key_spec.rb
|
134
|
+
- spec/functional/list_spec.rb
|
135
|
+
- spec/functional/migration_spec.rb
|
136
|
+
- spec/functional/scoper_spec.rb
|
137
|
+
- spec/functional/validation_spec.rb
|
138
|
+
- spec/models.rb
|
139
|
+
- spec/spec_helper.rb
|
140
|
+
- spec/unit/key_spec.rb
|
141
|
+
- spec/unit/scoper_spec.rb
|
142
|
+
- spec/unit/unit_spec_helper.rb
|