machinist 1.0.5 → 1.0.6
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/.autotest +7 -0
- data/.gitignore +4 -0
- data/FAQ.markdown +18 -0
- data/MIT-LICENSE +20 -0
- data/README.markdown +317 -0
- data/Rakefile +37 -0
- data/VERSION +1 -0
- data/init.rb +2 -0
- data/lib/machinist/active_record.rb +1 -1
- data/machinist.gemspec +72 -0
- data/spec/active_record_spec.rb +194 -0
- data/spec/data_mapper_spec.rb +134 -0
- data/spec/db/.gitignore +1 -0
- data/spec/db/schema.rb +20 -0
- data/spec/log/.gitignore +1 -0
- data/spec/machinist_spec.rb +190 -0
- data/spec/sequel_spec.rb +146 -0
- data/spec/sham_spec.rb +95 -0
- data/spec/spec_helper.rb +9 -0
- metadata +47 -14
data/spec/sequel_spec.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
require 'machinist/sequel'
|
3
|
+
|
4
|
+
# We have to define this here because Sequel needs a DB connection
|
5
|
+
# setup before you can define models
|
6
|
+
DB = Sequel.sqlite(:logger => Logger.new(File.dirname(__FILE__) + "/log/test.log"))
|
7
|
+
|
8
|
+
DB.create_table :people do
|
9
|
+
primary_key :id
|
10
|
+
String :name
|
11
|
+
String :type
|
12
|
+
String :password
|
13
|
+
Boolean :admin, :default => false
|
14
|
+
end
|
15
|
+
|
16
|
+
DB.create_table :posts do
|
17
|
+
primary_key :id
|
18
|
+
String :title
|
19
|
+
String :body
|
20
|
+
Boolean :published, :default => true
|
21
|
+
end
|
22
|
+
|
23
|
+
DB.create_table :comments do
|
24
|
+
primary_key :id
|
25
|
+
Integer :post_id
|
26
|
+
Integer :author_id
|
27
|
+
String :body
|
28
|
+
end
|
29
|
+
|
30
|
+
module MachinistSequelSpecs
|
31
|
+
|
32
|
+
class Person < Sequel::Model
|
33
|
+
set_restricted_columns :password
|
34
|
+
end
|
35
|
+
|
36
|
+
class Post < Sequel::Model
|
37
|
+
one_to_many :comments, :class => "MachinistSequelSpecs::Comment"
|
38
|
+
end
|
39
|
+
|
40
|
+
class Comment < Sequel::Model
|
41
|
+
many_to_one :post, :class => "MachinistSequelSpecs::Post"
|
42
|
+
many_to_one :author, :class => "MachinistSequelSpecs::Person"
|
43
|
+
end
|
44
|
+
|
45
|
+
describe Machinist, "Sequel adapter" do
|
46
|
+
|
47
|
+
before(:each) do
|
48
|
+
Person.clear_blueprints!
|
49
|
+
Post.clear_blueprints!
|
50
|
+
Comment.clear_blueprints!
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "make method" do
|
54
|
+
it "should save the constructed object" do
|
55
|
+
Person.blueprint { }
|
56
|
+
person = Person.make
|
57
|
+
person.should_not be_new
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should create and object through a many_to_one association" do
|
61
|
+
Post.blueprint { }
|
62
|
+
Comment.blueprint { post }
|
63
|
+
Comment.make.post.class.should == Post
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should create an object through many_to_one association with a class_name attribute" do
|
67
|
+
Person.blueprint { }
|
68
|
+
Comment.blueprint { author }
|
69
|
+
Comment.make.author.class.should == Person
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should allow setting a protected attribute in the blueprint" do
|
73
|
+
Person.blueprint do
|
74
|
+
password "Test"
|
75
|
+
end
|
76
|
+
Person.make.password.should == "Test"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should allow overriding a protected attribute" do
|
80
|
+
Person.blueprint do
|
81
|
+
password "Test"
|
82
|
+
end
|
83
|
+
Person.make(:password => "New").password.should == "New"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should allow setting the id attribute in a blueprint" do
|
87
|
+
Person.blueprint { id 12345 }
|
88
|
+
Person.make.id.should == 12345
|
89
|
+
end
|
90
|
+
|
91
|
+
# it "should allow setting the type attribute in a blueprint" do
|
92
|
+
# Person.blueprint { type "Person" }
|
93
|
+
# Person.make.type.should == "Person"
|
94
|
+
# end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "plan method" do
|
98
|
+
it "should not save the constructed object" do
|
99
|
+
lambda {
|
100
|
+
Person.blueprint { }
|
101
|
+
person = Person.plan
|
102
|
+
}.should_not change(Person,:count)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should return a regular attribute in the hash" do
|
106
|
+
Post.blueprint { title "Test" }
|
107
|
+
post = Post.plan
|
108
|
+
post[:title].should == "Test"
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should create an object through a many_to_one association, and return its id" do
|
112
|
+
Post.blueprint { }
|
113
|
+
Comment.blueprint { post }
|
114
|
+
lambda {
|
115
|
+
comment = Comment.plan
|
116
|
+
comment[:post].should be_nil
|
117
|
+
comment[:post_id].should_not be_nil
|
118
|
+
}.should change(Post, :count).by(1)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Note that building up an unsaved object graph using just the
|
123
|
+
# association methods is not possible in Sequel, so
|
124
|
+
# make_unsaved will break in amusing ways unless you manually
|
125
|
+
# override the setters.
|
126
|
+
#
|
127
|
+
# From sequel-talk "Sequel does not have such an API and will not be adding one"
|
128
|
+
# Feb 17
|
129
|
+
describe "make_unsaved method" do
|
130
|
+
it "should not save the constructed object" do
|
131
|
+
Person.blueprint { }
|
132
|
+
person = Person.make_unsaved
|
133
|
+
person.should be_new
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should save objects made within a passed-in block" do
|
137
|
+
Post.blueprint { }
|
138
|
+
Comment.blueprint { }
|
139
|
+
comment = nil
|
140
|
+
post = Post.make_unsaved { comment = Comment.make }
|
141
|
+
post.should be_new
|
142
|
+
comment.should_not be_new
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
data/spec/sham_spec.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
require 'sham'
|
3
|
+
|
4
|
+
describe Sham do
|
5
|
+
it "should ensure generated values are unique" do
|
6
|
+
Sham.clear
|
7
|
+
Sham.half_index {|index| index/2 }
|
8
|
+
values = (1..10).map { Sham.half_index }
|
9
|
+
values.should == (0..9).to_a
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should generate non-unique values when asked" do
|
13
|
+
Sham.clear
|
14
|
+
Sham.coin_toss(:unique => false) {|index| index % 2 == 1 ? 'heads' : 'tails' }
|
15
|
+
values = (1..4).map { Sham.coin_toss }
|
16
|
+
values.should == ['heads', 'tails', 'heads', 'tails']
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should generate more than a dozen values" do
|
20
|
+
Sham.clear
|
21
|
+
Sham.index {|index| index }
|
22
|
+
values = (1..25).map { Sham.index }
|
23
|
+
values.should == (1..25).to_a
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should generate the same sequence of values after a reset" do
|
27
|
+
Sham.clear
|
28
|
+
Sham.random { rand }
|
29
|
+
values1 = (1..10).map { Sham.random }
|
30
|
+
Sham.reset
|
31
|
+
values2 = (1..10).map { Sham.random }
|
32
|
+
values2.should == values1
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should alias reset with reset(:before_all)" do
|
36
|
+
Sham.clear
|
37
|
+
Sham.random { rand }
|
38
|
+
values1 = (1..10).map { Sham.random }
|
39
|
+
Sham.reset(:before_all)
|
40
|
+
values2 = (1..10).map { Sham.random }
|
41
|
+
values2.should == values1
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should generate the same sequence of values after each reset(:before_each)" do
|
45
|
+
Sham.clear
|
46
|
+
Sham.random { rand }
|
47
|
+
values1 = (1..10).map { Sham.random }
|
48
|
+
Sham.reset(:before_each)
|
49
|
+
values2 = (1..10).map { Sham.random }
|
50
|
+
Sham.reset(:before_each)
|
51
|
+
values3 = (1..10).map { Sham.random }
|
52
|
+
values2.should_not == values1
|
53
|
+
values3.should == values2
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should generate a different sequence of values after reset(:before_all) followed by reset(:before_each)" do
|
57
|
+
Sham.clear
|
58
|
+
Sham.random { rand }
|
59
|
+
(1..10).map { Sham.random }
|
60
|
+
Sham.reset(:before_each)
|
61
|
+
values1 = (1..10).map { Sham.random }
|
62
|
+
Sham.reset(:before_all)
|
63
|
+
(1..5).map { Sham.random }
|
64
|
+
Sham.reset(:before_each)
|
65
|
+
values2 = (1..10).map { Sham.random }
|
66
|
+
values2.should_not == values1
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should die when it runs out of unique values" do
|
70
|
+
Sham.clear
|
71
|
+
Sham.limited {|index| index%10 }
|
72
|
+
lambda {
|
73
|
+
(1..100).map { Sham.limited }
|
74
|
+
}.should raise_error(RuntimeError)
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should allow over-riding the name method" do
|
78
|
+
Sham.clear
|
79
|
+
Sham.name {|index| index }
|
80
|
+
Sham.name.should == 1
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "define method" do
|
84
|
+
it "should repeat messages in its block to Sham" do
|
85
|
+
block = Proc.new {}
|
86
|
+
Sham.should_receive(:name).with(&block).once.ordered
|
87
|
+
Sham.should_receive(:slug).with(:arg, &block).once.ordered
|
88
|
+
Sham.define do
|
89
|
+
name &block
|
90
|
+
slug :arg, &block
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: machinist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pete Yandell
|
@@ -9,33 +9,60 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-11-29 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rspec
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.2.8
|
24
|
+
version:
|
16
25
|
description:
|
17
|
-
email: pete@
|
26
|
+
email: pete@notahat.com
|
18
27
|
executables: []
|
19
28
|
|
20
29
|
extensions: []
|
21
30
|
|
22
|
-
extra_rdoc_files:
|
23
|
-
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README.markdown
|
24
33
|
files:
|
34
|
+
- .autotest
|
35
|
+
- .gitignore
|
36
|
+
- FAQ.markdown
|
37
|
+
- MIT-LICENSE
|
38
|
+
- README.markdown
|
39
|
+
- Rakefile
|
40
|
+
- VERSION
|
41
|
+
- init.rb
|
25
42
|
- lib/machinist.rb
|
26
|
-
- lib/sham.rb
|
27
|
-
- lib/machinist/blueprints.rb
|
28
|
-
- lib/machinist/object.rb
|
29
43
|
- lib/machinist/active_record.rb
|
44
|
+
- lib/machinist/blueprints.rb
|
30
45
|
- lib/machinist/data_mapper.rb
|
46
|
+
- lib/machinist/object.rb
|
31
47
|
- lib/machinist/sequel.rb
|
48
|
+
- lib/sham.rb
|
49
|
+
- machinist.gemspec
|
50
|
+
- spec/active_record_spec.rb
|
51
|
+
- spec/data_mapper_spec.rb
|
52
|
+
- spec/db/.gitignore
|
53
|
+
- spec/db/schema.rb
|
54
|
+
- spec/log/.gitignore
|
55
|
+
- spec/machinist_spec.rb
|
56
|
+
- spec/sequel_spec.rb
|
57
|
+
- spec/sham_spec.rb
|
58
|
+
- spec/spec_helper.rb
|
32
59
|
has_rdoc: true
|
33
60
|
homepage: http://github.com/notahat/machinist
|
34
61
|
licenses: []
|
35
62
|
|
36
63
|
post_install_message:
|
37
|
-
rdoc_options:
|
38
|
-
|
64
|
+
rdoc_options:
|
65
|
+
- --charset=UTF-8
|
39
66
|
require_paths:
|
40
67
|
- lib
|
41
68
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -57,5 +84,11 @@ rubygems_version: 1.3.5
|
|
57
84
|
signing_key:
|
58
85
|
specification_version: 3
|
59
86
|
summary: Fixtures aren't fun. Machinist is.
|
60
|
-
test_files:
|
61
|
-
|
87
|
+
test_files:
|
88
|
+
- spec/active_record_spec.rb
|
89
|
+
- spec/data_mapper_spec.rb
|
90
|
+
- spec/db/schema.rb
|
91
|
+
- spec/machinist_spec.rb
|
92
|
+
- spec/sequel_spec.rb
|
93
|
+
- spec/sham_spec.rb
|
94
|
+
- spec/spec_helper.rb
|