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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 23992917260bb77f633cbfb7d24dbe491c966ac4
4
- data.tar.gz: e435d995edbaa5cb92dd02da794be371ade59921
3
+ metadata.gz: e838d558b8741411bdab9c41672ac65a733faffd
4
+ data.tar.gz: 759f5ec6c9a5df7217e9e2b024ca56ec8d6bd1f1
5
5
  SHA512:
6
- metadata.gz: 8984fe4739d900b9c7d68368b35bd1df98d643f940d607b246ac989ded037abad1528e31f455f90c6c52e710bcaf25ebeb5fe91c1a3c7583fdc3222d33286ee4
7
- data.tar.gz: 11153c311605240e4e8b543e4796301f90728c83befb9850a0d82cc33fb1a04d1a916f7e097aab17202990f70bd51ab30c04133672620e32aa01e188f692e885
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
- FILE_NAME = "factories.rb"
6
+ FOLDER_NAMES = ["test", "spec"]
7
+ FILE_NAMES = ["factories.rb", "traver_factories.rb"]
7
8
 
8
- def initialize(base_dir, folder_name = "test")
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
- factories_file_path = File.join(base_dir, folder_name, FILE_NAME)
18
-
19
- require factories_file_path
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
- end
25
-
26
- class NilFactoriesLoader
27
- def load_factories
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 FactoryDefiner
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
- alias :factory :define_factory
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
- factories[factory_name] || default_factory(factory_name) if factory_name
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 default_factory(factory_name)
34
+ def empty_factory(factory_name)
42
35
  Factory.new(factory_name, {}, nil)
43
36
  end
44
37
  end
@@ -9,9 +9,17 @@ module Traver
9
9
  end
10
10
 
11
11
  def root_factory
12
- parent_factory ? parent_factory.root_factory : self
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
@@ -1,15 +1,15 @@
1
1
  module Traver
2
2
  class GraphCreator
3
- attr_reader :factory_name, :params, :factory_definer, :sequencer
3
+ attr_reader :factory_name, :params, :factories_store, :sequencer
4
4
  attr_reader :graph
5
5
 
6
- def initialize(factory_name, params, factory_definer, sequencer)
6
+ def initialize(factory_name, params, factories_store, sequencer)
7
7
  @factory_name = factory_name
8
8
  @params = params
9
- @factory_definer = factory_definer
9
+ @factories_store = factories_store
10
10
  @sequencer = sequencer
11
11
 
12
- @object_creator = ObjectCreator.new(factory_name, params, factory_definer, sequencer)
12
+ @object_creator = ObjectCreator.new(factory_name, params, factories_store, sequencer)
13
13
 
14
14
  @graph = Graph.new
15
15
  end
@@ -1,19 +1,19 @@
1
1
  module Traver
2
2
  class ListCreator
3
- attr_reader :num, :factory_name, :params, :factory_definer, :sequencer
3
+ attr_reader :num, :factory_name, :params, :factories_store, :sequencer
4
4
  attr_reader :list
5
5
 
6
- def initialize(num, factory_name, params, factory_definer, sequencer)
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
- @factory_definer = factory_definer
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, factory_definer, sequencer)
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
- end
182
-
183
- params_array.map do |params|
184
- create_nested_object(factory_name, params)
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 :factory_definer, :sequencer
3
+ attr_reader :factories_store, :sequencer
4
4
 
5
5
  def initialize
6
- @factory_definer = FactoryDefiner.new
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, factory_definer, sequencer)
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, factory_definer, sequencer)
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, factory_definer, sequencer)
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
- factory_definer.define_factory(factory_name, parent_factory_name, params)
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
- factory_definer.undefine_all_factories
49
+ factories_store.undefine_all_factories
50
50
  end
51
51
 
52
52
  def factories_count
53
- factory_definer.factories_count
53
+ factories_store.factories_count
54
54
  end
55
55
 
56
56
  private
@@ -1,3 +1,3 @@
1
1
  module Traver
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.3"
3
3
  end
data/lib/traver.rb CHANGED
@@ -6,42 +6,39 @@ module Traver
6
6
  class Error < Exception; end
7
7
 
8
8
  class << self
9
- attr_reader :factories_loaded
10
-
11
- def create(*options)
9
+ def create(*args)
12
10
  load_factories
13
11
 
14
- traver_constructor.create(*options)
12
+ traver_constructor.create(*args)
15
13
  end
16
14
 
17
- def create_graph(*options)
15
+ def create_graph(*args)
18
16
  load_factories
19
17
 
20
- traver_constructor.create_graph(*options)
18
+ traver_constructor.create_graph(*args)
21
19
  end
22
20
 
23
- def create_list(num, *options)
21
+ def create_list(*args)
24
22
  load_factories
25
23
 
26
- traver_constructor.create_list(num, *options)
24
+ traver_constructor.create_list(*args)
27
25
  end
28
26
 
29
- def define_factory(factory_name, *options)
30
- traver_constructor.define_factory(factory_name, *options)
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
- unless factories_loaded
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
- if defined?(Rails)
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.2
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-04-08 00:00:00.000000000 Z
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