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 +52 -7
- data/lib/m4dbi/version.rb +1 -1
- data/spec/model.rb +36 -0
- metadata +50 -61
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[:
|
146
|
-
|
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[:
|
152
|
-
|
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
|
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
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
|
-
|
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
|
-
|
19
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
46
38
|
type: :runtime
|
47
|
-
|
48
|
-
|
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
|
-
|
91
|
-
|
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
|
-
|
100
|
-
|
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.
|
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
|