fluent_fixtures 0.4.0 → 0.5.0.pre.20170515170202

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 04ae27c7451ece98c029d41e761a6cb221e5c8da
4
- data.tar.gz: f380b5322b4c13da8fb5a0f3ab8219002d18d3b9
2
+ SHA256:
3
+ metadata.gz: ebb817e0b2fc99aa884784742e8bb0deb77befcdaecf5683a08e8d696edb5192
4
+ data.tar.gz: 30eafd70938cfe9d9677b4f7a7847e8b00d8666eafdbbe9927dac1a568a1c120
5
5
  SHA512:
6
- metadata.gz: faf29bb484053e605d19134703fdf9e708aadd30ab797ae8cfba1a66307ba1af42ee9b42b8e365b3d5675caa06e11f783d316bf278e47fd698c5782eda01785c
7
- data.tar.gz: c37d481e8ab51e49b21147da7889102b8ec82b600619a74ba516615442c65442adfdb291e74541e8317fe145a27af57568555f10a77ebcb5d85d983375c9e000
6
+ metadata.gz: 87590528c3dfefb068c667397e9edf77df914789147a7e52bd162b0622637c0968d28ec70f43ee0b3a3fdd5baffd197e2d071383c68874197ba9cf1a6a420de1
7
+ data.tar.gz: 5704dc5782a7a78da0c17c1d35e86d24fc1b0ce0010a28f8771a743ba54c2ae8fda1a7428dca6ef2814afecef929faf99953d1fe36cc6a8195769b02b32613b0
data/History.md CHANGED
@@ -1,6 +1,13 @@
1
+ ## v0.5.0 [2017-05-12] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Enhancements:
4
+
5
+ - Add a `presave` option for decorators that need a saved instance.
6
+
7
+
1
8
  ## v0.4.0 [2016-12-13] Michael Granger <ged@FaerieMUD.org>
2
9
 
3
- Enchancements:
10
+ Enhancements:
4
11
 
5
12
  - Added `depends_on` to the fixture DSL.
6
13
 
@@ -79,6 +79,7 @@ module FluentFixtures::Collection
79
79
 
80
80
  fixture_mod.extend( FluentFixtures::DSL )
81
81
  fixture_mod.instance_variable_set( :@decorators, {} )
82
+ fixture_mod.instance_variable_set( :@decorator_options, {} )
82
83
  fixture_mod.instance_variable_set( :@fixtured_class, nil )
83
84
  fixture_mod.instance_variable_set( :@base_fixture, nil )
84
85
 
@@ -14,6 +14,9 @@ module FluentFixtures::DSL
14
14
  # The Hash of decorators declared for this fixture module
15
15
  attr_reader :decorators
16
16
 
17
+ # The Hash of options hashes for declared decorators
18
+ attr_reader :decorator_options
19
+
17
20
  ##
18
21
  # The name of the base fixture for the fixture module as a Symbol
19
22
  attr_accessor :base_fixture
@@ -57,8 +60,10 @@ module FluentFixtures::DSL
57
60
 
58
61
  ### Declare a decorator for the fixture with the specified +name+ that will use the
59
62
  ### given +block+.
60
- def decorator( name, &block )
61
- self.decorators[ name.to_sym ] = block
63
+ def decorator( name, **options, &block )
64
+ name = name.to_sym
65
+ self.decorators[ name ] = block
66
+ self.decorator_options[ name ] = options
62
67
  end
63
68
 
64
69
 
@@ -75,7 +75,7 @@ class FluentFixtures::Factory
75
75
  if !decorator_name
76
76
  self.apply_inline_decorator( instance, block )
77
77
  elsif self.fixture_module.decorators.key?( decorator_name )
78
- self.apply_named_decorator( instance, decorator_args, decorator_name )
78
+ instance = self.apply_named_decorator( instance, decorator_args, decorator_name )
79
79
  else
80
80
  self.apply_method_decorator( instance, decorator_args, decorator_name, block )
81
81
  end
@@ -105,13 +105,7 @@ class FluentFixtures::Factory
105
105
  def create( args={}, &block )
106
106
  obj = self.with_transaction do
107
107
  obj = self.instance( args, &block )
108
- obj = self.fixture_module.call_before_saving( obj ) if
109
- self.fixture_module.respond_to?( :call_before_saving )
110
-
111
- self.try_to_save( obj )
112
-
113
- obj = self.fixture_module.call_after_saving( obj ) if
114
- self.fixture_module.respond_to?( :call_after_saving )
108
+ obj = self.try_to_save( obj )
115
109
  obj
116
110
  end
117
111
 
@@ -186,9 +180,14 @@ class FluentFixtures::Factory
186
180
  ### +decorator_name+ to the specified +instance+.
187
181
  def apply_named_decorator( instance, args, decorator_name )
188
182
  decorator_block = self.fixture_module.decorators[ decorator_name ]
189
- self.log.debug "Applying decorator %p (%p) to a %p with args: %p" %
190
- [ decorator_name, decorator_block, instance.class, args ]
183
+ decorator_options = self.fixture_module.decorator_options[ decorator_name ] || {}
184
+ self.log.debug "Applying decorator %p (%p - %p) to a %p with args: %p" %
185
+ [ decorator_name, decorator_block, decorator_options, instance.class, args ]
186
+
187
+ instance = self.try_to_save( instance ) if decorator_options[:presave]
191
188
  instance.instance_exec( *args, &decorator_block )
189
+
190
+ return instance
192
191
  end
193
192
 
194
193
 
@@ -222,11 +221,23 @@ class FluentFixtures::Factory
222
221
  ### Try various methods for saving the given +object+, logging a warning if it doesn't
223
222
  ### respond to any of them.
224
223
  def try_to_save( object )
225
- CREATE_METHODS.each do |methodname|
226
- return object.public_send( methodname ) if object.respond_to?( methodname )
224
+ object = self.fixture_module.call_before_saving( object ) if
225
+ self.fixture_module.respond_to?( :call_before_saving )
226
+
227
+ save_method = CREATE_METHODS.find do |methodname|
228
+ object.respond_to?( methodname )
227
229
  end
228
230
 
229
- self.log.warn "create: don't know how to save %p" % [ object ]
231
+ if save_method
232
+ object.public_send( save_method )
233
+ else
234
+ self.log.warn "create: don't know how to save %p" % [ object ]
235
+ end
236
+
237
+ object = self.fixture_module.call_after_saving( object ) if
238
+ self.fixture_module.respond_to?( :call_after_saving )
239
+
240
+ return object
230
241
  end
231
242
 
232
243
 
@@ -11,10 +11,10 @@ module FluentFixtures
11
11
 
12
12
 
13
13
  # Package version
14
- VERSION = '0.4.0'
14
+ VERSION = '0.5.0'
15
15
 
16
16
  # Version control revision
17
- REVISION = %q$Revision: 08f17f26d0cb $
17
+ REVISION = %q$Revision: ed67198925b5 $
18
18
 
19
19
 
20
20
  # Loggability API -- set up a named logger
@@ -136,6 +136,7 @@ describe FluentFixtures::Collection do
136
136
 
137
137
  it "adds instance data to its fixture modules" do
138
138
  expect( extending_module.decorators ).to be_a( Hash )
139
+ expect( extending_module.decorator_options ).to be_a( Hash )
139
140
  end
140
141
 
141
142
  end
@@ -86,6 +86,17 @@ describe FluentFixtures::DSL do
86
86
  end
87
87
 
88
88
 
89
+ it "can indicate that an object needs to be saved before a decorator is applied" do
90
+ with_associated_object_block = Proc.new {|obj| self.associated_object = obj }
91
+ fixture_module.decorator( :with_associated_object, presave: true, &with_associated_object_block )
92
+
93
+ expect( fixture_module ).to have_decorator( :with_associated_object )
94
+
95
+ expect( fixture_module.decorators[:with_associated_object] ).to be( with_associated_object_block )
96
+ expect( fixture_module.decorator_options[:with_associated_object] ).to include( presave: true )
97
+ end
98
+
99
+
89
100
  it "can declare an alias for an already-declared decorator" do
90
101
  fixture_module.decorator( :with_no_email ) { self.email = nil }
91
102
  fixture_module.alias_decorator( :emailless, :with_no_email )
@@ -15,14 +15,20 @@ describe FluentFixtures::Factory do
15
15
  def initialize( params={} )
16
16
  @saved = false
17
17
  @deleted = false
18
+ @roles = []
19
+ @copied = false
18
20
  params.each do |name, value|
19
21
  self.send( "#{name}=", value )
20
22
  end
21
23
  yield if block_given?
22
24
  end
23
- attr_accessor :name, :login, :email
25
+ def initialize_copy( _original )
26
+ @copied = true
27
+ end
28
+ attr_accessor :name, :login, :email, :roles
24
29
  def save; @saved = true; end
25
30
  def saved?; @saved; end
31
+ def copied?; @copied; end
26
32
  def bizarroify
27
33
  self.name = "Bizarro #{self.name}"
28
34
  self.email = "bizarro+#{self.email}"
@@ -31,6 +37,10 @@ describe FluentFixtures::Factory do
31
37
  end
32
38
  def delete; @deleted = true; end
33
39
  def deleted?; @deleted; end
40
+ def add_role( role )
41
+ raise "not saved" unless self.saved?
42
+ self.roles << role
43
+ end
34
44
  end
35
45
  end
36
46
 
@@ -266,6 +276,39 @@ describe FluentFixtures::Factory do
266
276
  end
267
277
 
268
278
 
279
+ it "supports decorators that save the object before running" do
280
+ fixture_module.decorator( :with_role, presave: true ) do |role|
281
+ self.add_role( role )
282
+ end
283
+
284
+ object = factory.with_role( 'admin' ).instance
285
+
286
+ expect( object ).to be_saved
287
+ expect( object.roles ).to include( 'admin' )
288
+ end
289
+
290
+
291
+ it "calls pre- and post-save hooks for decorators with presaving" do
292
+ fixture_module.decorator( :with_role, presave: true ) do |role|
293
+ self.add_role( role )
294
+ end
295
+ def fixture_module.call_before_saving( instance )
296
+ instance.dup
297
+ end
298
+ def fixture_module.call_after_saving( instance )
299
+ instance.delete
300
+ instance
301
+ end
302
+
303
+ object = factory.with_role( 'admin' ).instance
304
+
305
+ expect( object ).to be_saved
306
+ expect( object ).to be_copied
307
+ expect( object ).to be_deleted
308
+ expect( object.roles ).to include( 'admin' )
309
+ end
310
+
311
+
269
312
  it "allows ad-hoc decorators declared as inline blocks" do
270
313
  counter = 0
271
314
  result = factory.decorated_with do |obj|
metadata CHANGED
@@ -1,41 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent_fixtures
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0.pre.20170515170202
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
- - |
12
- -----BEGIN CERTIFICATE-----
13
- MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
14
- GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
15
- HhcNMTYwODIwMTgxNzQyWhcNMTcwODIwMTgxNzQyWjA+MQwwCgYDVQQDDANnZWQx
16
- GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
17
- ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
18
- 83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
19
- ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
20
- TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
21
- 4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
22
- cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
23
- +QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
24
- soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
25
- /D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
26
- BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
27
- MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
28
- YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQAPJzKiT0zBU7kpqe0aS2qb
29
- FI0PJ4y5I8buU4IZGUD5NEt/N7pZNfOyBxkrZkXhS44Fp+xwBH5ebLbq/WY78Bqd
30
- db0z6ZgW4LMYMpWFfbXsRbd9TU2f52L8oMAhxOvF7Of5qJMVWuFQ8FPagk2iHrdH
31
- inYLQagqAF6goWTXgAJCdPd6SNeeSNqA6vlY7CV1Jh5kfNJJ6xu/CVij1GzCLu/5
32
- DMOr26DBv+qLJRRC/2h34uX71q5QgeOyxvMg+7V3u/Q06DXyQ2VgeeqiwDFFpEH0
33
- PFkdPO6ZqbTRcLfNH7mFgCBJjsfSjJrn0sPBlYyOXgCoByfZnZyrIMH/UY+lgQqS
34
- 6Von1VDsfQm0eJh5zYZD64ZF86phSR7mUX3mXItwH04HrZwkWpvgd871DZVR3i1n
35
- w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
36
- p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
37
- -----END CERTIFICATE-----
38
- date: 2016-12-14 00:00:00.000000000 Z
11
+ - certs/ged.pem
12
+ date: 2017-05-16 00:00:00.000000000 Z
39
13
  dependencies:
40
14
  - !ruby/object:Gem::Dependency
41
15
  name: loggability
@@ -85,14 +59,14 @@ dependencies:
85
59
  requirements:
86
60
  - - "~>"
87
61
  - !ruby/object:Gem::Version
88
- version: '0.8'
62
+ version: '0.9'
89
63
  type: :development
90
64
  prerelease: false
91
65
  version_requirements: !ruby/object:Gem::Requirement
92
66
  requirements:
93
67
  - - "~>"
94
68
  - !ruby/object:Gem::Version
95
- version: '0.8'
69
+ version: '0.9'
96
70
  - !ruby/object:Gem::Dependency
97
71
  name: hoe-highline
98
72
  requirement: !ruby/object:Gem::Requirement
@@ -169,14 +143,14 @@ dependencies:
169
143
  requirements:
170
144
  - - "~>"
171
145
  - !ruby/object:Gem::Version
172
- version: '3.15'
146
+ version: '3.16'
173
147
  type: :development
174
148
  prerelease: false
175
149
  version_requirements: !ruby/object:Gem::Requirement
176
150
  requirements:
177
151
  - - "~>"
178
152
  - !ruby/object:Gem::Version
179
- version: '3.15'
153
+ version: '3.16'
180
154
  description: |-
181
155
  FluentFixtures is a toolkit for building testing objects with a fluent interface.
182
156
 
@@ -232,12 +206,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
232
206
  version: 2.2.0
233
207
  required_rubygems_version: !ruby/object:Gem::Requirement
234
208
  requirements:
235
- - - ">="
209
+ - - ">"
236
210
  - !ruby/object:Gem::Version
237
- version: '0'
211
+ version: 1.3.1
238
212
  requirements: []
239
213
  rubyforge_project:
240
- rubygems_version: 2.6.8
214
+ rubygems_version: 2.6.12
241
215
  signing_key:
242
216
  specification_version: 4
243
217
  summary: FluentFixtures is a toolkit for building testing objects with a fluent interface
checksums.yaml.gz.sig DELETED
Binary file
data.tar.gz.sig DELETED
Binary file
metadata.gz.sig DELETED
Binary file