m4dbi 0.8.2 → 0.8.3

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.
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