factories 0.2.0 → 0.3.0
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.
- checksums.yaml +4 -4
- data/README.md +62 -5
- data/lib/factories/base_factory.rb +32 -3
- data/lib/factories/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 577970216f6b30979e8c42ea55938faf27e10f77
|
4
|
+
data.tar.gz: c815d216346373943ef008780a7b271e973dc62d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b37ea3cbeae780d09ac5047e93f1185de6c5265c5fcfd51c1ae54d8aa085ba654e4cd57f7076382097d8de1de080afdb0f70d9e2c59196df6f194f434dd1470
|
7
|
+
data.tar.gz: de1b4c1da9aefff43879aca225009a250ec376636832664241682bfcfcb1b6bbe1f5d07a1c1cca0b9d1d75ae6ccc7a244d2ad50215e5f97023c3f715b3d011eb
|
data/README.md
CHANGED
@@ -25,11 +25,9 @@ class User < ActiveRecord::Base
|
|
25
25
|
end
|
26
26
|
|
27
27
|
Factories.gen :user do
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
}
|
32
|
-
end
|
28
|
+
defaults {{
|
29
|
+
name: "Nathan"
|
30
|
+
}}
|
33
31
|
end
|
34
32
|
|
35
33
|
user = Factories.build(:user)
|
@@ -88,3 +86,62 @@ describe User do
|
|
88
86
|
end
|
89
87
|
end
|
90
88
|
```
|
89
|
+
|
90
|
+
### Procs
|
91
|
+
|
92
|
+
To delay execution time and get a hold of the model instance a proc can
|
93
|
+
be provided. An example that shows a problem this might solve are
|
94
|
+
circular `belong_to`s:
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
class Account
|
98
|
+
belongs_to :owner, class_name: 'User'
|
99
|
+
end
|
100
|
+
|
101
|
+
class User
|
102
|
+
belongs_to :account
|
103
|
+
end
|
104
|
+
```
|
105
|
+
|
106
|
+
This can be expressed in factories by delaying the default values with procs:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
Factories.gen :user do
|
110
|
+
defaults {{
|
111
|
+
account: ->(m) { Factories.build(:account, owner: m) },
|
112
|
+
name: Faker::Name.name,
|
113
|
+
email: Faker::Internet.email
|
114
|
+
}}
|
115
|
+
end
|
116
|
+
|
117
|
+
Factories.gen :account do
|
118
|
+
defaults {{
|
119
|
+
owner: ->(m) { Factories.build(:user, account: m) },
|
120
|
+
name: Faker::Company.name
|
121
|
+
}}
|
122
|
+
end
|
123
|
+
|
124
|
+
Factories.create(:account) # => #<Account id: ...>
|
125
|
+
Factories.create(:user) # => #<User id: ...>
|
126
|
+
```
|
127
|
+
|
128
|
+
This works because when creating an account the `owner` field's default
|
129
|
+
is overriden inside the lambda value for the account of the user. The
|
130
|
+
same is true when creating a user: the owner for the account is
|
131
|
+
overriden inside the lambda value for the account. Yeah.
|
132
|
+
|
133
|
+
### Override magic class name
|
134
|
+
|
135
|
+
You can provide your own class to create as many factories as you like:
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
Factorie.gen :owner do
|
139
|
+
model_class User
|
140
|
+
|
141
|
+
defaults {{
|
142
|
+
name: '...'
|
143
|
+
}}
|
144
|
+
end
|
145
|
+
|
146
|
+
Factories.create(:owner) # => #<User id: ...>
|
147
|
+
```
|
@@ -10,8 +10,12 @@ module Factories
|
|
10
10
|
new(opts).build
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.model_class
|
14
|
-
|
13
|
+
def self.model_class(klass = nil)
|
14
|
+
if klass
|
15
|
+
@model_class = klass
|
16
|
+
else
|
17
|
+
@model_class ||= Inflecto.constantize(Inflecto.demodulize(name.gsub(/Factory$/, '')))
|
18
|
+
end
|
15
19
|
end
|
16
20
|
|
17
21
|
def model_class
|
@@ -22,6 +26,10 @@ module Factories
|
|
22
26
|
raise "not implimented"
|
23
27
|
end
|
24
28
|
|
29
|
+
def self.defaults(&blk)
|
30
|
+
define_method(:defaults, &blk)
|
31
|
+
end
|
32
|
+
|
25
33
|
def initialize(opts = {})
|
26
34
|
@opts = opts
|
27
35
|
@attributes = defaults.merge(opts)
|
@@ -32,7 +40,28 @@ module Factories
|
|
32
40
|
end
|
33
41
|
|
34
42
|
def build
|
35
|
-
model_class.new
|
43
|
+
model_class.new.tap do |instance|
|
44
|
+
attrs = expand_procs @attributes, instance
|
45
|
+
instance.assign_attributes attrs
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def expand_procs(hash, instance)
|
52
|
+
hash.each_with_object({}) do |(k, v), h|
|
53
|
+
v = if v.is_a?(Proc)
|
54
|
+
if v.arity == 1
|
55
|
+
v.call(instance)
|
56
|
+
else
|
57
|
+
v.call
|
58
|
+
end
|
59
|
+
else
|
60
|
+
v
|
61
|
+
end
|
62
|
+
|
63
|
+
h[k] = v
|
64
|
+
end
|
36
65
|
end
|
37
66
|
end
|
38
67
|
end
|
data/lib/factories/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factories
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Herald
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|