ohm-contrib 0.0.16 → 0.0.17

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -106,4 +106,4 @@ Note on Patches/Pull Requests
106
106
 
107
107
  Copyright
108
108
  ---------
109
- Copyright (c) 2010 Cyril David. See LICENSE for details.
109
+ Copyright (c) 2010 Cyril David. See LICENSE for details.
data/Rakefile CHANGED
@@ -53,4 +53,4 @@ Rake::RDocTask.new do |rdoc|
53
53
  rdoc.title = "ohm-contrib #{version}"
54
54
  rdoc.rdoc_files.include('README*')
55
55
  rdoc.rdoc_files.include('lib/**/*.rb')
56
- end
56
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.16
1
+ 0.0.17
@@ -23,11 +23,11 @@ module Ohm
23
23
  def first
24
24
  all.first
25
25
  end
26
-
26
+
27
27
  # @todo Add support for passing in conditions
28
28
  def last
29
29
  self[db.get(key(:id))]
30
30
  end
31
31
  end
32
32
  end
33
- end
33
+ end
@@ -36,7 +36,7 @@ module Ohm
36
36
  # end
37
37
  # end
38
38
  #
39
-
39
+
40
40
  module Callbacks
41
41
  def self.included(base)
42
42
  base.extend Macros
@@ -66,7 +66,7 @@ module Ohm
66
66
  #
67
67
  # @param [Symbol] method the method type, `:validate`, `:create`, or `:save`
68
68
  # @param [Symbol] callback the name of the method to execute
69
- # @return [Array<callback>, nil] the callback wrapped in an array or nil
69
+ # @return [Array<callback>, nil] the callback wrapped in an array or nil
70
70
  # if the callback exists
71
71
  def before(method, callback)
72
72
  unless callbacks[:before][method].include? callback
@@ -97,18 +97,20 @@ module Ohm
97
97
  #
98
98
  # @param [Symbol] method the method type, `:validate`, `:create`, or `:save`
99
99
  # @param [Symbol] callback the name of the method to execute
100
- # @return [Array<callback>, nil] the callback in an array or nil if the
100
+ # @return [Array<callback>, nil] the callback in an array or nil if the
101
101
  # callback exists
102
102
  def after(method, callback)
103
- callbacks[:after][method] << callback
103
+ unless callbacks[:after][method].include? callback
104
+ callbacks[:after][method] << callback
105
+ end
104
106
  end
105
-
107
+
106
108
  # @private internally used to maintain the state of callbacks
107
109
  def callbacks
108
110
  @callbacks ||= Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] }}
109
111
  end
110
112
  end
111
-
113
+
112
114
  # Overrides the validate method of Ohm::Model. This is a bit tricky,
113
115
  # since typically you override this. Make sure you do something like:
114
116
  #
@@ -128,7 +130,7 @@ module Ohm
128
130
  super
129
131
  execute_callback(:after, :validate)
130
132
  end
131
-
133
+
132
134
  # The overriden create of Ohm::Model. It checks if the
133
135
  # model is valid, and executes all before :create callbacks.
134
136
  #
@@ -141,7 +143,7 @@ module Ohm
141
143
  execute_callback(:after, :create) if is_created
142
144
  end
143
145
  end
144
-
146
+
145
147
  # The overridden save of Ohm::Model. It checks if the model
146
148
  # is valid, and executes all before :save callbacks.
147
149
  #
@@ -5,7 +5,7 @@ module Ohm
5
5
  #
6
6
  # class Post < Ohm::Model
7
7
  # include Ohm::ExtraValidations
8
- #
8
+ #
9
9
  # attribute :price
10
10
  # attribute :state
11
11
  # attribute :slug
@@ -36,6 +36,6 @@ module Ohm
36
36
  protected
37
37
  def assert_member(att, set, error = [att, :not_member])
38
38
  assert set.include?(send(att)), error
39
- end
39
+ end
40
40
  end
41
- end
41
+ end
@@ -5,9 +5,9 @@ module Ohm
5
5
  # In addition, since future ohm versions might drop mutexes, I thought it
6
6
  # might be a good idea to preseve this feature as a drop-in module.
7
7
  module Locking
8
- # Lock the object before executing the block, and release it once the block
8
+ # Lock the object before executing the block, and release it once the block
9
9
  # is done.
10
- #
10
+ #
11
11
  # @example
12
12
  #
13
13
  # post = Order.create(:customer => Customer.create)
@@ -52,4 +52,4 @@ module Ohm
52
52
  lock.to_f < Time.now.to_f
53
53
  end
54
54
  end
55
- end
55
+ end
@@ -9,4 +9,4 @@ module Ohm
9
9
  assert_format(att, /^(\d+)?(\.\d+)?$/, error)
10
10
  end
11
11
  end
12
- end
12
+ end
@@ -34,4 +34,4 @@ module Ohm
34
34
  super
35
35
  end
36
36
  end
37
- end
37
+ end
@@ -3,7 +3,7 @@ module Ohm
3
3
  # is that it chose the albeit better whitelisted approach.
4
4
  #
5
5
  # @example
6
- #
6
+ #
7
7
  # # this is the core Ohm#to_hash implementation
8
8
  # class Post < Ohm::Model
9
9
  # attribute :body
@@ -34,4 +34,4 @@ module Ohm
34
34
  end
35
35
  alias :to_h :to_hash
36
36
  end
37
- end
37
+ end
@@ -71,10 +71,10 @@ module Ohm
71
71
  class Time < Primitive
72
72
  class << self
73
73
  extend Forwardable
74
- def_delegators :Time,
75
- :_load, :apply_offset, :at, :gm, :httpdate, :json_create, :local,
76
- :make_time, :mktime, :month_days, :now, :parse, :rfc2822,
77
- :strptime, :utc, :w3cdtf, :xmlschema, :yaml_new, :zone_offset,
74
+ def_delegators :Time,
75
+ :_load, :apply_offset, :at, :gm, :httpdate, :json_create, :local,
76
+ :make_time, :mktime, :month_days, :now, :parse, :rfc2822,
77
+ :strptime, :utc, :w3cdtf, :xmlschema, :yaml_new, :zone_offset,
78
78
  :zone_utc?
79
79
  end
80
80
 
@@ -87,10 +87,10 @@ module Ohm
87
87
  class Date < Primitive
88
88
  class << self
89
89
  extend Forwardable
90
- def_delegators :Date,
91
- :_parse, :_strptime, :civil, :commercial, :gregorian_leap?, :jd,
92
- :json_create, :julian_leap?, :now, :nth_kday, :ordinal, :parse, :s3e,
93
- :strptime, :today, :valid_civil?, :valid_commercial?, :valid_jd?,
90
+ def_delegators :Date,
91
+ :_parse, :_strptime, :civil, :commercial, :gregorian_leap?, :jd,
92
+ :json_create, :julian_leap?, :now, :nth_kday, :ordinal, :parse, :s3e,
93
+ :strptime, :today, :valid_civil?, :valid_commercial?, :valid_jd?,
94
94
  :valid_ordinal?, :weeknum
95
95
  end
96
96
 
@@ -100,14 +100,14 @@ module Ohm
100
100
  end
101
101
  end
102
102
  end
103
-
104
- # Provides unobtrusive, non-explosive typecasting.Instead of exploding on set
105
- # of an invalid value, this module takes the approach of just taking in
106
- # parameters and letting you do validation yourself. The only thing this
103
+
104
+ # Provides unobtrusive, non-explosive typecasting.Instead of exploding on set
105
+ # of an invalid value, this module takes the approach of just taking in
106
+ # parameters and letting you do validation yourself. The only thing this
107
107
  # module does for you is the boilerplate casting you might need to do.
108
108
  #
109
109
  # @example
110
- #
110
+ #
111
111
  # # without typecasting
112
112
  # class Item < Ohm::Model
113
113
  # attribute :price
@@ -122,7 +122,7 @@ module Ohm
122
122
  # # => true
123
123
  #
124
124
  # # you can opt to manually cast everytime, or do it in the model, i.e.
125
- #
125
+ #
126
126
  # class Item
127
127
  # def price
128
128
  # BigDecimal(read_local(:price))
@@ -174,4 +174,4 @@ module Ohm
174
174
  end
175
175
  end
176
176
  end
177
- end
177
+ end
@@ -32,4 +32,4 @@ module Ohm
32
32
  assert_ipv4(att, error)
33
33
  end
34
34
  end
35
- end
35
+ end
data/lib/ohm/contrib.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Ohm
2
2
  module Contrib
3
- VERSION = '0.0.16'
3
+ VERSION = '0.0.17'
4
4
  end
5
5
 
6
6
  autoload :Boundaries, "ohm/contrib/boundaries"
data/ohm-contrib.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ohm-contrib}
8
- s.version = "0.0.16"
8
+ s.version = "0.0.17"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Cyril David"]
@@ -48,4 +48,4 @@ class TestOhmContrib < Test::Unit::TestCase
48
48
  Ohm::ExtraValidations
49
49
  end
50
50
  end
51
- end
51
+ end
@@ -5,7 +5,7 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
5
5
  include Ohm::Callbacks
6
6
 
7
7
  attribute :body
8
-
8
+
9
9
  before :validate, :do_before_validate
10
10
  after :validate, :do_after_validate
11
11
 
@@ -25,13 +25,25 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
25
25
  instance_variable_get("@#{ action }")
26
26
  end
27
27
 
28
+ def count(action)
29
+ instance_variable_get("@#{ action }")
30
+ end
31
+
28
32
  protected
29
- def do_before_validate() @do_before_validate = true end
30
- def do_after_validate() @do_after_validate = true end
31
- def do_before_create() @do_before_create = true end
32
- def do_after_create() @do_after_create = true end
33
- def do_before_save() @do_before_save = true end
34
- def do_after_save() @do_after_save = true end
33
+ def do_before_validate() incr(:do_before_validate) end
34
+ def do_after_validate() incr(:do_after_validate) end
35
+ def do_before_create() incr(:do_before_create) end
36
+ def do_after_create() incr(:do_after_create) end
37
+ def do_before_save() incr(:do_before_save) end
38
+ def do_after_save() incr(:do_after_save) end
39
+
40
+ def incr(action)
41
+ val = instance_variable_get("@#{ action }")
42
+ val ||= 0
43
+ val += 1
44
+
45
+ instance_variable_set("@#{ action }", val)
46
+ end
35
47
  end
36
48
 
37
49
  context "on save when invalid state" do
@@ -39,9 +51,9 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
39
51
  @post = Post.new
40
52
  @post.save
41
53
  end
42
-
54
+
43
55
  should "still call before / after validate" do
44
- assert @post.did?(:do_before_validate)
56
+ assert @post.did?(:do_before_validate)
45
57
  assert @post.did?(:do_after_validate)
46
58
  end
47
59
 
@@ -58,7 +70,7 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
58
70
  @post = Post.new(:body => "The Body")
59
71
  @post.save
60
72
  end
61
-
73
+
62
74
  should "call all callbacks" do
63
75
  assert @post.did?(:do_before_validate)
64
76
  assert @post.did?(:do_after_validate)
@@ -67,6 +79,13 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
67
79
  assert @post.did?(:do_before_save)
68
80
  assert @post.did?(:do_after_save)
69
81
  end
82
+
83
+ should "call create / save callbacks only once" do
84
+ assert_equal 1, @post.count(:do_before_create)
85
+ assert_equal 1, @post.count(:do_after_create)
86
+ assert_equal 1, @post.count(:do_before_save)
87
+ assert_equal 1, @post.count(:do_after_create)
88
+ end
70
89
  end
71
90
 
72
91
  context "on save of an existing object" do
@@ -76,7 +95,7 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
76
95
 
77
96
  @post.save
78
97
  end
79
-
98
+
80
99
  should "not call create related callbacks" do
81
100
  assert ! @post.did?(:do_before_create)
82
101
  assert ! @post.did?(:do_after_create)
@@ -87,7 +106,12 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
87
106
  assert @post.did?(:do_after_validate)
88
107
  assert @post.did?(:do_before_save)
89
108
  assert @post.did?(:do_after_save)
90
- end
109
+ end
110
+
111
+ should "call save callbacks only once" do
112
+ assert_equal 1, @post.count(:do_before_save)
113
+ assert_equal 1, @post.count(:do_after_save)
114
+ end
91
115
  end
92
116
 
93
117
  context "on save of an existing invalid object" do
@@ -103,7 +127,7 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
103
127
  assert @post.did?(:do_before_validate)
104
128
  assert @post.did?(:do_after_validate)
105
129
  end
106
-
130
+
107
131
  should "not call create related callbacks" do
108
132
  assert ! @post.did?(:do_before_create)
109
133
  assert ! @post.did?(:do_after_create)
@@ -114,4 +138,4 @@ class OhmContribCallbacksTest < Test::Unit::TestCase
114
138
  assert ! @post.did?(:do_after_save)
115
139
  end
116
140
  end
117
- end
141
+ end
@@ -29,4 +29,4 @@ class OhmExtraValidationsTest < Test::Unit::TestCase
29
29
  assert_equal [[:state, :not_member]], order.errors
30
30
  end
31
31
  end
32
- end
32
+ end
@@ -209,7 +209,7 @@ class TestOhmTypecast < Test::Unit::TestCase
209
209
  Time
210
210
  end
211
211
  end
212
-
212
+
213
213
  test "still able to access top level Time" do
214
214
  post = Post.new
215
215
  assert_equal post.now.to_s, Time.now.to_s
@@ -219,11 +219,11 @@ class TestOhmTypecast < Test::Unit::TestCase
219
219
  post = Post.new
220
220
  methods = [
221
221
  :_load, :apply_offset, :at, :gm, :httpdate, :json_create, :local,
222
- :make_time, :mktime, :month_days, :new, :now, :parse, :rfc2822,
223
- :strptime, :utc, :w3cdtf, :xmlschema, :yaml_new, :zone_offset,
222
+ :make_time, :mktime, :month_days, :new, :now, :parse, :rfc2822,
223
+ :strptime, :utc, :w3cdtf, :xmlschema, :yaml_new, :zone_offset,
224
224
  :zone_utc?
225
225
  ]
226
-
226
+
227
227
  methods.each do |m|
228
228
  assert_respond_to post.time, m
229
229
  end
@@ -281,7 +281,7 @@ class TestOhmTypecast < Test::Unit::TestCase
281
281
  Date.today
282
282
  end
283
283
  end
284
-
284
+
285
285
  test "still able to get top level methods" do
286
286
  assert_equal Date.today, Post.new.base_today
287
287
  end
@@ -290,9 +290,9 @@ class TestOhmTypecast < Test::Unit::TestCase
290
290
  post = Post.new
291
291
 
292
292
  methods = [
293
- :_parse, :_strptime, :civil, :commercial, :gregorian_leap?, :jd,
294
- :json_create, :julian_leap?, :now, :nth_kday, :ordinal, :parse, :s3e,
295
- :strptime, :today, :valid_civil?, :valid_commercial?, :valid_jd?,
293
+ :_parse, :_strptime, :civil, :commercial, :gregorian_leap?, :jd,
294
+ :json_create, :julian_leap?, :now, :nth_kday, :ordinal, :parse, :s3e,
295
+ :strptime, :today, :valid_civil?, :valid_commercial?, :valid_jd?,
296
296
  :valid_ordinal?, :weeknum
297
297
  ]
298
298
  methods.each do |m|
@@ -335,4 +335,4 @@ class TestOhmTypecast < Test::Unit::TestCase
335
335
  assert_equal Date.today, Post.new.today
336
336
  end
337
337
  end
338
- end
338
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 16
9
- version: 0.0.16
8
+ - 17
9
+ version: 0.0.17
10
10
  platform: ruby
11
11
  authors:
12
12
  - Cyril David