with_model 0.1.1 → 0.1.2
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 +2 -0
- data/CHANGELOG +3 -0
- data/README.rdoc +128 -0
- data/Rakefile +9 -0
- data/lib/with_model/base.rb +17 -12
- data/lib/with_model/dsl.rb +1 -1
- data/lib/with_model/version.rb +1 -1
- data/spec/active_record_behaviors_spec.rb +16 -2
- data/spec/readme_spec.rb +81 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/with_model_spec.rb +6 -4
- data/with_model.gemspec +0 -1
- metadata +10 -23
- data/README +0 -1
- data/gemfiles/rspec1/Gemfile.lock +0 -20
- data/gemfiles/rspec2/Gemfile.lock +0 -39
data/.gitignore
CHANGED
data/CHANGELOG
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
= with_model
|
2
|
+
|
3
|
+
* http://github.com/casecommons/with_model/
|
4
|
+
|
5
|
+
== DESCRIPTION
|
6
|
+
|
7
|
+
+with_model+ dynamically builds an ActiveRecord model (with table) within an RSpec context. Outside of the context, the model is no longer present.
|
8
|
+
|
9
|
+
== INSTALL
|
10
|
+
|
11
|
+
gem install with_model
|
12
|
+
|
13
|
+
=== RSpec 2
|
14
|
+
|
15
|
+
In spec_helper.rb:
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.extend WithModel
|
19
|
+
end
|
20
|
+
|
21
|
+
=== Rspec 1
|
22
|
+
|
23
|
+
In spec_helper.rb:
|
24
|
+
|
25
|
+
Spec::Runner.configure do |config|
|
26
|
+
config.extend WithModel
|
27
|
+
end
|
28
|
+
|
29
|
+
== USAGE
|
30
|
+
|
31
|
+
In an RSpec example group, call +with_model+ and inside its block pass it a +table+ block and a +model+ block.
|
32
|
+
|
33
|
+
require 'spec_helper'
|
34
|
+
|
35
|
+
describe "A blog post" do
|
36
|
+
|
37
|
+
with_model :blog_post do
|
38
|
+
# The table block works just like a migration.
|
39
|
+
table do |t|
|
40
|
+
t.string :title
|
41
|
+
t.timestamps
|
42
|
+
end
|
43
|
+
|
44
|
+
# The model block works just like the class definition.
|
45
|
+
model do
|
46
|
+
include SomeModule
|
47
|
+
has_many :comments
|
48
|
+
validates_presence_of :title
|
49
|
+
|
50
|
+
def self.some_class_method
|
51
|
+
'chunky'
|
52
|
+
end
|
53
|
+
|
54
|
+
def some_instance_method
|
55
|
+
'bacon'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# with_model classes can have associations.
|
61
|
+
with_model :comment do
|
62
|
+
table do |t|
|
63
|
+
t.string :text
|
64
|
+
t.belongs_to :blog_post
|
65
|
+
t.timestamps
|
66
|
+
end
|
67
|
+
|
68
|
+
model do
|
69
|
+
belongs_to :blog_post
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it "can be accessed as a constant" do
|
74
|
+
BlogPost.should be
|
75
|
+
end
|
76
|
+
|
77
|
+
it "can be accessed as a local variable" do
|
78
|
+
blog_post.should be
|
79
|
+
end
|
80
|
+
|
81
|
+
it "can be accessed as an instance variable" do
|
82
|
+
@blog_post.should be
|
83
|
+
end
|
84
|
+
|
85
|
+
it "has the module" do
|
86
|
+
BlogPost.include?(SomeModule).should be_true
|
87
|
+
end
|
88
|
+
|
89
|
+
it "has the class method" do
|
90
|
+
BlogPost.some_class_method.should == 'chunky'
|
91
|
+
end
|
92
|
+
|
93
|
+
it "has the instance method" do
|
94
|
+
BlogPost.new.some_instance_method.should == 'bacon'
|
95
|
+
end
|
96
|
+
|
97
|
+
it "can do all the things a regular model can" do
|
98
|
+
record = BlogPost.new
|
99
|
+
record.should_not be_valid
|
100
|
+
record.title = "foo"
|
101
|
+
record.should be_valid
|
102
|
+
record.save.should be_true
|
103
|
+
record.reload.should == record
|
104
|
+
record.comments.create!(:text => "Lorem ipsum")
|
105
|
+
record.comments.count.should == 1
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe "another example group" do
|
110
|
+
it "should not have the constant anymore" do
|
111
|
+
defined?(BlogPost).should be_false
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
=== Mixico
|
116
|
+
|
117
|
+
If you have the +mixico+ gem installed, WithModel will automatically unmix any modules that were mixed into your model class. Without +mixico+, each module will hold a reference to the class for the remainder of your test suite.
|
118
|
+
|
119
|
+
Usually unmixing isn't necessary, but it can be helpful if you use something like Module#included_in_classes (from Active Support 2.3) in a later test to ask a module which classes it has been mixed into.
|
120
|
+
|
121
|
+
== REQUIREMENTS
|
122
|
+
|
123
|
+
* RSpec
|
124
|
+
* ActiveRecord 2 or 3
|
125
|
+
|
126
|
+
== LICENSE:
|
127
|
+
|
128
|
+
MIT
|
data/Rakefile
CHANGED
data/lib/with_model/base.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
|
-
|
1
|
+
begin
|
2
|
+
require 'mixico'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
2
5
|
|
3
6
|
module WithModel
|
4
7
|
class Base < ActiveRecord::Base
|
@@ -7,20 +10,22 @@ module WithModel
|
|
7
10
|
true
|
8
11
|
end
|
9
12
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@modules_to_unmix
|
13
|
+
if defined?(Mixico)
|
14
|
+
def include(*args)
|
15
|
+
@modules_to_unmix ||= []
|
16
|
+
args.each do |mod|
|
17
|
+
unless @modules_to_unmix.include?(mod)
|
18
|
+
@modules_to_unmix << mod
|
19
|
+
end
|
15
20
|
end
|
21
|
+
super
|
16
22
|
end
|
17
|
-
super
|
18
|
-
end
|
19
23
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
+
def _with_model_deconstructor
|
25
|
+
@modules_to_unmix.each do |mod|
|
26
|
+
disable_mixin mod
|
27
|
+
end if defined?(@modules_to_unmix)
|
28
|
+
end
|
24
29
|
end
|
25
30
|
end
|
26
31
|
end
|
data/lib/with_model/dsl.rb
CHANGED
@@ -32,7 +32,7 @@ module WithModel
|
|
32
32
|
end
|
33
33
|
|
34
34
|
example_group.after do
|
35
|
-
model._with_model_deconstructor
|
35
|
+
model._with_model_deconstructor if defined?(Mixico)
|
36
36
|
Object.send(:remove_const, const_name)
|
37
37
|
Object.const_set(const_name, original_const_value) if original_const_defined
|
38
38
|
end
|
data/lib/with_model/version.rb
CHANGED
@@ -4,7 +4,14 @@ describe "ActiveRecord behaviors" do
|
|
4
4
|
describe "a temporary ActiveRecord model created with with_model that has a named_scope" do
|
5
5
|
before do
|
6
6
|
class RegularModel < ActiveRecord::Base
|
7
|
-
|
7
|
+
scope_method =
|
8
|
+
if respond_to?(:scope) && !protected_methods.include?('scope')
|
9
|
+
:scope # ActiveRecord 3.x
|
10
|
+
else
|
11
|
+
:named_scope # ActiveRecord 2.x
|
12
|
+
end
|
13
|
+
|
14
|
+
send scope_method, :title_is_foo, :conditions => {:title => 'foo'}
|
8
15
|
end
|
9
16
|
RegularModel.connection.drop_table(RegularModel.table_name) rescue nil
|
10
17
|
RegularModel.connection.create_table(RegularModel.table_name) do |t|
|
@@ -26,7 +33,14 @@ describe "ActiveRecord behaviors" do
|
|
26
33
|
end
|
27
34
|
|
28
35
|
model do
|
29
|
-
|
36
|
+
scope_method =
|
37
|
+
if respond_to?(:scope) && !protected_methods.include?('scope')
|
38
|
+
:scope # ActiveRecord 3.x
|
39
|
+
else
|
40
|
+
:named_scope # ActiveRecord 2.x
|
41
|
+
end
|
42
|
+
|
43
|
+
send scope_method, :title_is_foo, :conditions => {:title => 'foo'}
|
30
44
|
end
|
31
45
|
end
|
32
46
|
|
data/spec/readme_spec.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "A blog post" do
|
4
|
+
|
5
|
+
with_model :blog_post do
|
6
|
+
# The table block works just like a migration.
|
7
|
+
table do |t|
|
8
|
+
t.string :title
|
9
|
+
t.timestamps
|
10
|
+
end
|
11
|
+
|
12
|
+
# The model block works just like the class definition.
|
13
|
+
model do
|
14
|
+
include SomeModule
|
15
|
+
has_many :comments
|
16
|
+
validates_presence_of :title
|
17
|
+
|
18
|
+
def self.some_class_method
|
19
|
+
'chunky'
|
20
|
+
end
|
21
|
+
|
22
|
+
def some_instance_method
|
23
|
+
'bacon'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# with_model classes can have associations.
|
29
|
+
with_model :comment do
|
30
|
+
table do |t|
|
31
|
+
t.string :text
|
32
|
+
t.belongs_to :blog_post
|
33
|
+
t.timestamps
|
34
|
+
end
|
35
|
+
|
36
|
+
model do
|
37
|
+
belongs_to :blog_post
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
it "can be accessed as a constant" do
|
42
|
+
BlogPost.should be
|
43
|
+
end
|
44
|
+
|
45
|
+
it "can be accessed as a local variable" do
|
46
|
+
blog_post.should be
|
47
|
+
end
|
48
|
+
|
49
|
+
it "can be accessed as an instance variable" do
|
50
|
+
@blog_post.should be
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has the module" do
|
54
|
+
BlogPost.include?(SomeModule).should be_true
|
55
|
+
end
|
56
|
+
|
57
|
+
it "has the class method" do
|
58
|
+
BlogPost.some_class_method.should == 'chunky'
|
59
|
+
end
|
60
|
+
|
61
|
+
it "has the instance method" do
|
62
|
+
BlogPost.new.some_instance_method.should == 'bacon'
|
63
|
+
end
|
64
|
+
|
65
|
+
it "can do all the things a regular model can" do
|
66
|
+
record = BlogPost.new
|
67
|
+
record.should_not be_valid
|
68
|
+
record.title = "foo"
|
69
|
+
record.should be_valid
|
70
|
+
record.save.should be_true
|
71
|
+
record.reload.should == record
|
72
|
+
record.comments.create!(:text => "Lorem ipsum")
|
73
|
+
record.comments.count.should == 1
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "another example group" do
|
78
|
+
it "should not have the constant anymore" do
|
79
|
+
defined?(BlogPost).should be_false
|
80
|
+
end
|
81
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -16,3 +16,6 @@ end
|
|
16
16
|
# WithModel requires ActiveRecord::Base.connection to be established.
|
17
17
|
# If ActiveRecord already has a connection, as in a Rails app, this is unnecessary.
|
18
18
|
ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ":memory:")
|
19
|
+
|
20
|
+
# For readme_spec.rb
|
21
|
+
module SomeModule; end
|
data/spec/with_model_spec.rb
CHANGED
@@ -117,10 +117,12 @@ describe "a temporary ActiveRecord model created with with_model" do
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
120
|
+
if defined?(Mixico)
|
121
|
+
context "after a context that uses a mixin" do
|
122
|
+
it "should not have the mixin" do
|
123
|
+
lambda { ::ModelWithMixin.new.foo }.should raise_error(NoMethodError)
|
124
|
+
::ModelWithMixin.include?(AMixin).should be_false
|
125
|
+
end
|
124
126
|
end
|
125
127
|
end
|
126
128
|
|
data/with_model.gemspec
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: with_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 31
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Case Commons, LLC
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-02-03 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -42,20 +42,6 @@ dependencies:
|
|
42
42
|
version: 4.0.0
|
43
43
|
type: :runtime
|
44
44
|
version_requirements: *id001
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: mixico
|
47
|
-
prerelease: false
|
48
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
hash: 3
|
54
|
-
segments:
|
55
|
-
- 0
|
56
|
-
version: "0"
|
57
|
-
type: :runtime
|
58
|
-
version_requirements: *id002
|
59
45
|
description: Dynamically build a model within an Rspec context
|
60
46
|
email:
|
61
47
|
- casecommons-dev@googlegroups.com
|
@@ -68,20 +54,20 @@ extra_rdoc_files: []
|
|
68
54
|
files:
|
69
55
|
- .autotest
|
70
56
|
- .gitignore
|
57
|
+
- CHANGELOG
|
71
58
|
- Gemfile
|
72
59
|
- LICENSE
|
73
|
-
- README
|
60
|
+
- README.rdoc
|
74
61
|
- Rakefile
|
75
62
|
- gemfiles/Gemfile.common
|
76
63
|
- gemfiles/rspec1/Gemfile
|
77
|
-
- gemfiles/rspec1/Gemfile.lock
|
78
64
|
- gemfiles/rspec2/Gemfile
|
79
|
-
- gemfiles/rspec2/Gemfile.lock
|
80
65
|
- lib/with_model.rb
|
81
66
|
- lib/with_model/base.rb
|
82
67
|
- lib/with_model/dsl.rb
|
83
68
|
- lib/with_model/version.rb
|
84
69
|
- spec/active_record_behaviors_spec.rb
|
70
|
+
- spec/readme_spec.rb
|
85
71
|
- spec/spec_helper.rb
|
86
72
|
- spec/with_model_spec.rb
|
87
73
|
- with_model.gemspec
|
@@ -115,11 +101,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
101
|
requirements: []
|
116
102
|
|
117
103
|
rubyforge_project:
|
118
|
-
rubygems_version: 1.
|
104
|
+
rubygems_version: 1.4.2
|
119
105
|
signing_key:
|
120
106
|
specification_version: 3
|
121
107
|
summary: Dynamically build a model within an Rspec context
|
122
108
|
test_files:
|
123
109
|
- spec/active_record_behaviors_spec.rb
|
110
|
+
- spec/readme_spec.rb
|
124
111
|
- spec/spec_helper.rb
|
125
112
|
- spec/with_model_spec.rb
|
data/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
See spec/spec_helper.rb and spec/with_model_spec.rb for usage.
|
@@ -1,20 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activerecord (2.3.5)
|
5
|
-
activesupport (= 2.3.5)
|
6
|
-
activesupport (2.3.5)
|
7
|
-
autotest (4.4.2)
|
8
|
-
mixico (0.1.4)
|
9
|
-
rspec (1.3.1)
|
10
|
-
sqlite3-ruby (1.3.2)
|
11
|
-
|
12
|
-
PLATFORMS
|
13
|
-
ruby
|
14
|
-
|
15
|
-
DEPENDENCIES
|
16
|
-
activerecord (~> 2.3.5)
|
17
|
-
autotest
|
18
|
-
mixico
|
19
|
-
rspec (~> 1.0)
|
20
|
-
sqlite3-ruby
|
@@ -1,39 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: http://rubygems.org/
|
3
|
-
specs:
|
4
|
-
activemodel (3.0.3)
|
5
|
-
activesupport (= 3.0.3)
|
6
|
-
builder (~> 2.1.2)
|
7
|
-
i18n (~> 0.4)
|
8
|
-
activerecord (3.0.3)
|
9
|
-
activemodel (= 3.0.3)
|
10
|
-
activesupport (= 3.0.3)
|
11
|
-
arel (~> 2.0.2)
|
12
|
-
tzinfo (~> 0.3.23)
|
13
|
-
activesupport (3.0.3)
|
14
|
-
arel (2.0.4)
|
15
|
-
autotest (4.4.4)
|
16
|
-
builder (2.1.2)
|
17
|
-
diff-lcs (1.1.2)
|
18
|
-
i18n (0.4.2)
|
19
|
-
mixico (0.1.4)
|
20
|
-
rspec (2.1.0)
|
21
|
-
rspec-core (~> 2.1.0)
|
22
|
-
rspec-expectations (~> 2.1.0)
|
23
|
-
rspec-mocks (~> 2.1.0)
|
24
|
-
rspec-core (2.1.0)
|
25
|
-
rspec-expectations (2.1.0)
|
26
|
-
diff-lcs (~> 1.1.2)
|
27
|
-
rspec-mocks (2.1.0)
|
28
|
-
sqlite3-ruby (1.3.2)
|
29
|
-
tzinfo (0.3.23)
|
30
|
-
|
31
|
-
PLATFORMS
|
32
|
-
ruby
|
33
|
-
|
34
|
-
DEPENDENCIES
|
35
|
-
activerecord (~> 3.0.0)
|
36
|
-
autotest
|
37
|
-
mixico
|
38
|
-
rspec (~> 2.0)
|
39
|
-
sqlite3-ruby
|