m4dbi 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/m4dbi/model.rb CHANGED
@@ -142,14 +142,22 @@ module M4DBI
142
142
  end
143
143
  if ! pk_hash.empty?
144
144
  rec = self.one_where( pk_hash )
145
- callbacks[:after_create].each do |block|
146
- block.yield rec
145
+ if callbacks[:active]
146
+ callbacks[:after_create].each do |block|
147
+ callbacks[:active] = false
148
+ block.yield rec
149
+ callbacks[:active] = true
150
+ end
147
151
  end
148
152
  else
149
153
  begin
150
154
  rec = last_record( dbh_ )
151
- callbacks[:after_create].each do |block|
152
- block.yield rec
155
+ if callbacks[:active]
156
+ callbacks[:after_create].each do |block|
157
+ callbacks[:active] = false
158
+ block.yield rec
159
+ callbacks[:active] = true
160
+ end
153
161
  end
154
162
  rescue NoMethodError => e
155
163
  # ignore
@@ -231,6 +239,14 @@ module M4DBI
231
239
  callbacks[:after_create] << block
232
240
  end
233
241
 
242
+ def self.after_update(&block)
243
+ callbacks[:after_update] << block
244
+ end
245
+
246
+ def self.after_delete(&block)
247
+ callbacks[:after_delete] << block
248
+ end
249
+
234
250
  # Example:
235
251
  # M4DBI::Model.one_to_many( Author, Post, :posts, :author, :author_id )
236
252
  # her_posts = some_author.posts
@@ -379,6 +395,13 @@ module M4DBI
379
395
  hash.each do |key,value|
380
396
  @row[ key ] = value
381
397
  end
398
+ if self.class.callbacks[:active]
399
+ self.class.callbacks[:after_update].each do |block|
400
+ self.class.callbacks[:active] = false
401
+ block.yield self
402
+ self.class.callbacks[:active] = true
403
+ end
404
+ end
382
405
  end
383
406
  num_updated
384
407
  end
@@ -387,7 +410,18 @@ module M4DBI
387
410
  def delete
388
411
  st = prepare("DELETE FROM #{table} WHERE #{pk_clause}")
389
412
  num_deleted = st.execute( *pk_values ).affected_count
390
- num_deleted == 1
413
+ if num_deleted != 1
414
+ false
415
+ else
416
+ if self.class.callbacks[:active]
417
+ self.class.callbacks[:after_delete].each do |block|
418
+ self.class.callbacks[:active] = false
419
+ block.yield self
420
+ self.class.callbacks[:active] = true
421
+ end
422
+ end
423
+ true
424
+ end
391
425
  end
392
426
 
393
427
  # save does nothing. It exists to provide compatibility with other ORMs.
@@ -429,8 +463,11 @@ module M4DBI
429
463
  :columns => h.table_schema( table.to_sym ).columns,
430
464
  :st => Hash.new, # prepared statements for all queries
431
465
  :callbacks => {
432
- after_create: []
433
- }
466
+ after_create: [],
467
+ after_update: [],
468
+ after_delete: [],
469
+ active: true,
470
+ },
434
471
  } )
435
472
 
436
473
  meta_def( 'pk_str'.to_sym ) do
@@ -481,6 +518,14 @@ module M4DBI
481
518
  if num_changed > 0
482
519
  @row[ colname ] = new_value
483
520
  end
521
+ if self.class.callbacks[:active]
522
+ self.class.callbacks[:after_update].each do |block|
523
+ self.class.callbacks[:active] = false
524
+ block.yield self
525
+ self.class.callbacks[:active] = true
526
+ end
527
+ end
528
+ new_value
484
529
  end
485
530
 
486
531
  class_def( '[]='.to_sym ) do |colname, new_value|
data/lib/m4dbi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module M4DBI
2
- VERSION = '0.8.2'
2
+ VERSION = '0.8.3'
3
3
  end
data/spec/model.rb CHANGED
@@ -823,6 +823,29 @@ describe 'A created M4DBI::Model subclass instance' do
823
823
  a_ = @m_author[ 1 ]
824
824
  h[ a_ ].should.equal 123
825
825
  end
826
+
827
+ it 'after setting data, executes code provided in an after_update hook' do
828
+ class Author < M4DBI::Model( :authors )
829
+ after_update do |author|
830
+ $test = 3
831
+ author.name = 'different name'
832
+ end
833
+ end
834
+
835
+ $test.should.not.equal 3
836
+ a = Author.create(name: 'theauthor')
837
+ $test.should.not.equal 3
838
+ a.set name: 'foobar'
839
+ $test.should.equal 3
840
+ a.name.should.equal 'different name'
841
+
842
+ $test = nil
843
+ a = Author.create(name: 'theauthor')
844
+ $test.should.not.equal 3
845
+ a.name = 'foobar'
846
+ $test.should.equal 3
847
+ a.name.should.equal 'different name'
848
+ end
826
849
  end
827
850
 
828
851
  describe 'A found M4DBI::Model subclass instance' do
@@ -950,6 +973,19 @@ describe 'A found M4DBI::Model subclass instance' do
950
973
  reset_data
951
974
  end
952
975
 
976
+ it 'after deletion, executes code provided in an after_delete hook' do
977
+ class Author < M4DBI::Model( :authors )
978
+ after_delete do |author|
979
+ $test = 4
980
+ end
981
+ end
982
+ $test.should.not.equal 4
983
+ a = Author.create(name: 'theauthor')
984
+ $test.should.not.equal 4
985
+ a.delete
986
+ $test.should.equal 4
987
+ end
988
+
953
989
  it 'does nothing on #save' do
954
990
  p = @m_post[ 1 ]
955
991
  should.not.raise do
metadata CHANGED
@@ -1,61 +1,58 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: m4dbi
3
- version: !ruby/object:Gem::Version
4
- hash: 59
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.8.3
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 8
9
- - 2
10
- version: 0.8.2
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Pistos
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-06-25 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-07-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: metaid
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: rdbi
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rdbi
32
+ requirement: !ruby/object:Gem::Requirement
38
33
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
46
38
  type: :runtime
47
- version_requirements: *id002
48
- description: M4DBI provides models, associations and some convenient extensions to RDBI.
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: M4DBI provides models, associations and some convenient extensions to
47
+ RDBI.
49
48
  email: m4dbi dot pistos at purepistos dot net
50
49
  executables: []
51
-
52
50
  extensions: []
53
-
54
- extra_rdoc_files:
51
+ extra_rdoc_files:
55
52
  - README.rdoc
56
53
  - CHANGELOG
57
54
  - LICENCE
58
- files:
55
+ files:
59
56
  - README.rdoc
60
57
  - CHANGELOG
61
58
  - LICENCE
@@ -76,38 +73,30 @@ files:
76
73
  - spec/hash.rb
77
74
  homepage: https://github.com/Pistos/m4dbi
78
75
  licenses: []
79
-
80
76
  post_install_message:
81
77
  rdoc_options: []
82
-
83
- require_paths:
78
+ require_paths:
84
79
  - lib
85
- required_ruby_version: !ruby/object:Gem::Requirement
80
+ required_ruby_version: !ruby/object:Gem::Requirement
86
81
  none: false
87
- requirements:
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- hash: 3
91
- segments:
92
- - 0
93
- version: "0"
94
- required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
87
  none: false
96
- requirements:
97
- - - ">="
98
- - !ruby/object:Gem::Version
99
- hash: 3
100
- segments:
101
- - 0
102
- version: "0"
103
- requirements:
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements:
104
93
  - bacon (optional)
105
94
  rubyforge_project:
106
- rubygems_version: 1.8.24
95
+ rubygems_version: 1.8.18
107
96
  signing_key:
108
97
  specification_version: 3
109
98
  summary: Models (and More) for RDBI
110
- test_files:
99
+ test_files:
111
100
  - spec/database.rb
112
101
  - spec/model.rb
113
102
  - spec/helper.rb