traver 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -0
- data/lib/traver/factories_loader.rb +25 -10
- data/lib/traver/{factory_definer.rb → factories_store.rb} +9 -16
- data/lib/traver/factory.rb +9 -5
- data/lib/traver/graph_creator.rb +4 -4
- data/lib/traver/list_creator.rb +4 -4
- data/lib/traver/object_creator.rb +15 -4
- data/lib/traver/traver_constructor.rb +8 -8
- data/lib/traver/version.rb +1 -1
- data/lib/traver.rb +14 -29
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e838d558b8741411bdab9c41672ac65a733faffd
|
4
|
+
data.tar.gz: 759f5ec6c9a5df7217e9e2b024ca56ec8d6bd1f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a405141440336994abd7a0f0cb690ccc1b72fd14cffc10436a38a551f76105b02e6526a64c889db02641862eea4084f1ab526c2c8e9ab1495331fc1a56876e46
|
7
|
+
data.tar.gz: 385c70481788c78c80c4d27f46702df68b97e106702cf17f7691ab346416844b7f0c70144c91942b4838d4c04cc96aa19cf0f3945c55ce3292172be51ecfb3ef
|
data/README.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Traver [![Build Status](https://travis-ci.org/yukas/traver.svg?branch=master)](https://travis-ci.org/yukas/traver)
|
2
2
|
|
3
|
+
## Fixtures
|
4
|
+
There are number of problems with fixtures:
|
5
|
+
|
6
|
+
1. Magic values — you don't see there attribute values comes from
|
7
|
+
2. You don't know how the record is setup, because it is not happening in context of the test
|
8
|
+
3. Test data is centarized - if you need to change something, good chance you'll brake a lot of tests
|
9
|
+
4. Hard to maintain — you need to manually change every fixture if your model changes
|
10
|
+
|
11
|
+
## FactoryGirl
|
3
12
|
The problem with the FactoryGirl is that it is complicated. It helps you define almost anything in terms of how complex your data model is. The thing is though — the more complex your factories the more complex seem to be the design of your system. Nobody wants to work with overcomplicated systems.
|
4
13
|
|
5
14
|
We believe that factories should be simple and lightweight just to make it possible to pass validations, everything else should be defined inside the spec itself, so the person who's working with the spec has all the information in place. It is possible with FactoryGirl, but it is too verbose.
|
@@ -130,6 +139,13 @@ Create associated collections using factory names:
|
|
130
139
|
Traver.create(blog: { title: "Hello", posts: [:published_post, :draft_post] })
|
131
140
|
```
|
132
141
|
|
142
|
+
Create associated with already existing objects:
|
143
|
+
|
144
|
+
```ruby
|
145
|
+
Traver.create(blog: { title: "Hello", posts: [post1, post2] })
|
146
|
+
```
|
147
|
+
|
148
|
+
|
133
149
|
Create lists with sequences:
|
134
150
|
|
135
151
|
```ruby
|
@@ -197,6 +213,10 @@ post = Traver.create(:post) #=> #<Post>
|
|
197
213
|
post.blog #=> #<Blog>
|
198
214
|
```
|
199
215
|
|
216
|
+
## Plays well with FactoryGirl
|
217
|
+
|
218
|
+
If you want to try out Traver for your new specs and keep using FactoryGirl for the old ones, no problem with that. Traver will detect FactoryGirl and will searching for factories inside `spec/traver_factories.rb` or `test/traver_factories.rb`.
|
219
|
+
|
200
220
|
## Development
|
201
221
|
|
202
222
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -3,28 +3,43 @@ module Traver
|
|
3
3
|
attr_reader :base_dir, :folder_name
|
4
4
|
attr_reader :factories_loaded
|
5
5
|
|
6
|
-
|
6
|
+
FOLDER_NAMES = ["test", "spec"]
|
7
|
+
FILE_NAMES = ["factories.rb", "traver_factories.rb"]
|
7
8
|
|
8
|
-
def initialize(base_dir
|
9
|
+
def initialize(base_dir)
|
9
10
|
@base_dir = base_dir
|
10
|
-
@folder_name = folder_name
|
11
11
|
|
12
12
|
@factories_loaded = false
|
13
13
|
end
|
14
14
|
|
15
15
|
def load_factories
|
16
16
|
unless factories_loaded
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
FOLDER_NAMES.each do |folder_name|
|
18
|
+
FILE_NAMES.each do |file_name|
|
19
|
+
load_file(folder_name, file_name)
|
20
|
+
end
|
21
|
+
end
|
20
22
|
|
21
23
|
@factories_loaded = true
|
22
24
|
end
|
23
25
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
def
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def load_file(folder_name, file_name)
|
30
|
+
file_path = File.join(base_dir, folder_name, file_name)
|
31
|
+
|
32
|
+
if file_class.exist?(file_path)
|
33
|
+
kernel_module.require file_path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def kernel_module
|
38
|
+
Kernel
|
39
|
+
end
|
40
|
+
|
41
|
+
def file_class
|
42
|
+
File
|
28
43
|
end
|
29
44
|
end
|
30
45
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Traver
|
2
|
-
class
|
2
|
+
class FactoriesStore
|
3
3
|
def initialize
|
4
4
|
undefine_all_factories
|
5
5
|
end
|
@@ -8,23 +8,14 @@ module Traver
|
|
8
8
|
factories[factory_name] = Factory.new(factory_name, params, factory_by_name(parent_name))
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
def factory_params(factory_name)
|
14
|
-
factory_by_name(factory_name).params
|
15
|
-
end
|
16
|
-
|
17
|
-
def parent_factory_name(factory_name)
|
18
|
-
factory_by_name(factory_name).parent_factory &&
|
19
|
-
factory_by_name(factory_name).parent_factory.name
|
20
|
-
end
|
21
|
-
|
22
|
-
def parent_factory_params(factory_name)
|
23
|
-
factory_by_name(factory_name).parent_factory.params
|
11
|
+
def factory_defined?(factory_name)
|
12
|
+
factories.has_key?(factory_name)
|
24
13
|
end
|
25
14
|
|
26
15
|
def factory_by_name(factory_name)
|
27
|
-
|
16
|
+
if factory_name
|
17
|
+
factories[factory_name] || empty_factory(factory_name)
|
18
|
+
end
|
28
19
|
end
|
29
20
|
|
30
21
|
def undefine_all_factories
|
@@ -35,10 +26,12 @@ module Traver
|
|
35
26
|
factories.keys.length
|
36
27
|
end
|
37
28
|
|
29
|
+
alias :factory :define_factory
|
30
|
+
|
38
31
|
private
|
39
32
|
attr_reader :factories
|
40
33
|
|
41
|
-
def
|
34
|
+
def empty_factory(factory_name)
|
42
35
|
Factory.new(factory_name, {}, nil)
|
43
36
|
end
|
44
37
|
end
|
data/lib/traver/factory.rb
CHANGED
@@ -9,9 +9,17 @@ module Traver
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def root_factory
|
12
|
-
|
12
|
+
if parent_factory
|
13
|
+
parent_factory.root_factory
|
14
|
+
else
|
15
|
+
self
|
16
|
+
end
|
13
17
|
end
|
14
18
|
|
19
|
+
def root_name
|
20
|
+
root_factory.name
|
21
|
+
end
|
22
|
+
|
15
23
|
def inherited_params
|
16
24
|
if parent_factory
|
17
25
|
parent_factory.inherited_params.merge(params)
|
@@ -20,10 +28,6 @@ module Traver
|
|
20
28
|
end
|
21
29
|
end
|
22
30
|
|
23
|
-
def root_name
|
24
|
-
root_factory.name
|
25
|
-
end
|
26
|
-
|
27
31
|
def object_class_name
|
28
32
|
root_factory.name.to_s.camelize
|
29
33
|
end
|
data/lib/traver/graph_creator.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module Traver
|
2
2
|
class GraphCreator
|
3
|
-
attr_reader :factory_name, :params, :
|
3
|
+
attr_reader :factory_name, :params, :factories_store, :sequencer
|
4
4
|
attr_reader :graph
|
5
5
|
|
6
|
-
def initialize(factory_name, params,
|
6
|
+
def initialize(factory_name, params, factories_store, sequencer)
|
7
7
|
@factory_name = factory_name
|
8
8
|
@params = params
|
9
|
-
@
|
9
|
+
@factories_store = factories_store
|
10
10
|
@sequencer = sequencer
|
11
11
|
|
12
|
-
@object_creator = ObjectCreator.new(factory_name, params,
|
12
|
+
@object_creator = ObjectCreator.new(factory_name, params, factories_store, sequencer)
|
13
13
|
|
14
14
|
@graph = Graph.new
|
15
15
|
end
|
data/lib/traver/list_creator.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
module Traver
|
2
2
|
class ListCreator
|
3
|
-
attr_reader :num, :factory_name, :params, :
|
3
|
+
attr_reader :num, :factory_name, :params, :factories_store, :sequencer
|
4
4
|
attr_reader :list
|
5
5
|
|
6
|
-
def initialize(num, factory_name, params,
|
6
|
+
def initialize(num, factory_name, params, factories_store, sequencer)
|
7
7
|
@num = num
|
8
8
|
@factory_name = factory_name
|
9
9
|
@params = params
|
10
|
-
@
|
10
|
+
@factories_store = factories_store
|
11
11
|
@sequencer = sequencer
|
12
12
|
end
|
13
13
|
|
14
14
|
def create_list
|
15
15
|
@list = num.times.map do
|
16
|
-
object_creator.create_object(factory_name, params,
|
16
|
+
object_creator.create_object(factory_name, params, factories_store, sequencer)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
@@ -44,6 +44,7 @@ module Traver
|
|
44
44
|
set_nested_objects
|
45
45
|
set_attributes
|
46
46
|
persist_object
|
47
|
+
cache_object
|
47
48
|
set_has_one_objects
|
48
49
|
set_nested_collections
|
49
50
|
call_after_create_hook
|
@@ -118,6 +119,7 @@ module Traver
|
|
118
119
|
set_attribute(name, create_nested_object(value, {}))
|
119
120
|
else
|
120
121
|
set_attribute(name, value)
|
122
|
+
cache[name] = value
|
121
123
|
end
|
122
124
|
end
|
123
125
|
|
@@ -178,10 +180,16 @@ module Traver
|
|
178
180
|
else
|
179
181
|
raise "Wrong collection params #{params_array}"
|
180
182
|
end
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
183
|
+
|
184
|
+
params_array.map do |params|
|
185
|
+
create_nested_object(factory_name, params)
|
186
|
+
end
|
187
|
+
elsif params_array.first.is_a?(Hash)
|
188
|
+
params_array.map do |params|
|
189
|
+
create_nested_object(factory_name, params)
|
190
|
+
end
|
191
|
+
else
|
192
|
+
params_array
|
185
193
|
end
|
186
194
|
end
|
187
195
|
end
|
@@ -207,6 +215,9 @@ module Traver
|
|
207
215
|
|
208
216
|
def persist_object
|
209
217
|
object_persister.persist_object(object)
|
218
|
+
end
|
219
|
+
|
220
|
+
def cache_object
|
210
221
|
cache[factory.root_name] = object
|
211
222
|
end
|
212
223
|
|
@@ -1,22 +1,22 @@
|
|
1
1
|
module Traver
|
2
2
|
class TraverConstructor
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :factories_store, :sequencer
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
@
|
6
|
+
@factories_store = FactoriesStore.new
|
7
7
|
@sequencer = Sequencer.new
|
8
8
|
end
|
9
9
|
|
10
10
|
def create(*options)
|
11
11
|
factory_name, params = parse_create_options(options)
|
12
12
|
|
13
|
-
ObjectCreator.create_object(factory_name, params,
|
13
|
+
ObjectCreator.create_object(factory_name, params, factories_store, sequencer)
|
14
14
|
end
|
15
15
|
|
16
16
|
def create_graph(*options)
|
17
17
|
factory_name, params = parse_create_options(options)
|
18
18
|
|
19
|
-
graph_creator = GraphCreator.new(factory_name, params,
|
19
|
+
graph_creator = GraphCreator.new(factory_name, params, factories_store, sequencer)
|
20
20
|
graph_creator.create_graph
|
21
21
|
|
22
22
|
graph_creator.graph
|
@@ -25,7 +25,7 @@ module Traver
|
|
25
25
|
def create_list(num, *options)
|
26
26
|
factory_name, params = parse_create_options(options)
|
27
27
|
|
28
|
-
list_creator = ListCreator.new(num, factory_name, params,
|
28
|
+
list_creator = ListCreator.new(num, factory_name, params, factories_store, sequencer)
|
29
29
|
list_creator.create_list
|
30
30
|
|
31
31
|
list_creator.list
|
@@ -40,17 +40,17 @@ module Traver
|
|
40
40
|
def define_factory(factory_name, *options)
|
41
41
|
parent_factory_name, params = parse_factory_options(options)
|
42
42
|
|
43
|
-
|
43
|
+
factories_store.define_factory(factory_name, parent_factory_name, params)
|
44
44
|
end
|
45
45
|
|
46
46
|
alias :factory :define_factory
|
47
47
|
|
48
48
|
def undefine_all_factories
|
49
|
-
|
49
|
+
factories_store.undefine_all_factories
|
50
50
|
end
|
51
51
|
|
52
52
|
def factories_count
|
53
|
-
|
53
|
+
factories_store.factories_count
|
54
54
|
end
|
55
55
|
|
56
56
|
private
|
data/lib/traver/version.rb
CHANGED
data/lib/traver.rb
CHANGED
@@ -6,42 +6,39 @@ module Traver
|
|
6
6
|
class Error < Exception; end
|
7
7
|
|
8
8
|
class << self
|
9
|
-
|
10
|
-
|
11
|
-
def create(*options)
|
9
|
+
def create(*args)
|
12
10
|
load_factories
|
13
11
|
|
14
|
-
traver_constructor.create(*
|
12
|
+
traver_constructor.create(*args)
|
15
13
|
end
|
16
14
|
|
17
|
-
def create_graph(*
|
15
|
+
def create_graph(*args)
|
18
16
|
load_factories
|
19
17
|
|
20
|
-
traver_constructor.create_graph(*
|
18
|
+
traver_constructor.create_graph(*args)
|
21
19
|
end
|
22
20
|
|
23
|
-
def create_list(
|
21
|
+
def create_list(*args)
|
24
22
|
load_factories
|
25
23
|
|
26
|
-
traver_constructor.create_list(
|
24
|
+
traver_constructor.create_list(*args)
|
27
25
|
end
|
28
26
|
|
29
|
-
def define_factory(
|
30
|
-
traver_constructor.define_factory(
|
27
|
+
def define_factory(*args)
|
28
|
+
traver_constructor.define_factory(*args)
|
31
29
|
end
|
32
30
|
|
33
|
-
alias :factory :define_factory
|
34
|
-
|
35
31
|
def define_factories(&block)
|
36
32
|
traver_constructor.define_factories(&block)
|
37
33
|
end
|
38
|
-
|
39
|
-
alias :factories :define_factories
|
40
34
|
|
41
35
|
def undefine_all_factories
|
42
36
|
traver_constructor.undefine_all_factories
|
43
37
|
end
|
44
|
-
|
38
|
+
|
39
|
+
alias :factory :define_factory
|
40
|
+
alias :factories :define_factories
|
41
|
+
|
45
42
|
private
|
46
43
|
|
47
44
|
def traver_constructor
|
@@ -49,23 +46,11 @@ module Traver
|
|
49
46
|
end
|
50
47
|
|
51
48
|
def load_factories
|
52
|
-
|
53
|
-
factories_loader.load_factories
|
54
|
-
|
55
|
-
@factories_loaded = true
|
56
|
-
end
|
49
|
+
factories_loader.load_factories
|
57
50
|
end
|
58
51
|
|
59
52
|
def factories_loader
|
60
|
-
|
61
|
-
if defined?(RSpec)
|
62
|
-
FactoriesLoader.new(Rails.root, "spec")
|
63
|
-
else
|
64
|
-
FactoriesLoader.new(Rails.root, "test")
|
65
|
-
end
|
66
|
-
else
|
67
|
-
NilFactoriesLoader.new
|
68
|
-
end
|
53
|
+
@factories_loader ||= FactoriesLoader.new(Dir.getwd)
|
69
54
|
end
|
70
55
|
end
|
71
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: traver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuri Kaspervich
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -116,8 +116,8 @@ files:
|
|
116
116
|
- lib/traver/default_params_creators/active_record_default_params_creator.rb
|
117
117
|
- lib/traver/default_params_creators/poro_default_params_creator.rb
|
118
118
|
- lib/traver/factories_loader.rb
|
119
|
+
- lib/traver/factories_store.rb
|
119
120
|
- lib/traver/factory.rb
|
120
|
-
- lib/traver/factory_definer.rb
|
121
121
|
- lib/traver/graph.rb
|
122
122
|
- lib/traver/graph_creator.rb
|
123
123
|
- lib/traver/list_creator.rb
|