ohm-contrib 0.0.14 → 0.0.15

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -1,16 +1,20 @@
1
1
  ohm-contrib
2
2
  ===========
3
3
 
4
- A collection of drop-in modules for Ohm.
4
+ A collection of drop-in modules for Ohm. Read the full documentation at
5
+ [http://labs.sinefunc.com/ohm-contrib](http://labs.sinefunc.com/ohm-contrib).
5
6
 
6
7
  List of modules
7
8
  ---------------
8
- * `Ohm::Boundaries`
9
- * `Ohm::Timestamping`
10
- * `Ohm::ToHash`
11
- * `Ohm::WebValidations`
12
- * `Ohm::NumberValidations`
13
- * `Ohm::Typecast`
9
+ 1. [`Ohm::Boundaries`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/Boundaries.html)
10
+ 2. [`Ohm::Callbacks`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/Callbacks.html)
11
+ 3. [`Ohm::Timestamping`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/Timestamping.html)
12
+ 4. [`Ohm::ToHash`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/ToHash.html)
13
+ 5. [`Ohm::WebValidations`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/WebValidations.html)
14
+ 6. [`Ohm::NumberValidations`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/NumberValidations.html)
15
+ 7. [`Ohm::ExtraValidations`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/ExtraValidations.html)
16
+ 8. [`Ohm::Typecast`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/Typecast.html)
17
+ 9. [`Ohm::Locking`](http://labs.sinefunc.com/ohm-contrib/doc/Ohm/Locking.html)
14
18
 
15
19
  Example usage
16
20
  -------------
@@ -102,4 +106,4 @@ Note on Patches/Pull Requests
102
106
 
103
107
  Copyright
104
108
  ---------
105
- Copyright (c) 2010 Cyril David. See LICENSE for details.
109
+ Copyright (c) 2010 Cyril David. See LICENSE for details.
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ begin
8
8
  gem.summary = %Q{A collection of ohm related modules}
9
9
  gem.description = %Q{Highly decoupled drop-in functionality for Ohm models}
10
10
  gem.email = "cyx.ucron@gmail.com"
11
- gem.homepage = "http://github.com/sinefunc/ohm-contrib"
11
+ gem.homepage = "http://labs.sinefunc.com/ohm-contrib"
12
12
  gem.authors = ["Cyril David"]
13
13
  gem.add_development_dependency "contest", ">= 0"
14
14
  gem.add_development_dependency "redis", ">= 0"
@@ -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.14
1
+ 0.0.15
data/lib/ohm/contrib.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Ohm
2
2
  module Contrib
3
- VERSION = '0.0.14'
3
+ VERSION = '0.0.15'
4
4
  end
5
5
 
6
6
  autoload :Boundaries, "ohm/contrib/boundaries"
@@ -1,4 +1,19 @@
1
1
  module Ohm
2
+ # Dirt cheap ::first and ::last support.
3
+ #
4
+ # @example
5
+ #
6
+ # class Post < Ohm::Model
7
+ # include Ohm::Boundaries
8
+ # end
9
+ #
10
+ # post1 = Post.create
11
+ # post2 = Post.create
12
+ # post1 == Post.first
13
+ # # => true
14
+ #
15
+ # post2 == Post.last
16
+ # # => true
2
17
  module Boundaries
3
18
  def self.included(base)
4
19
  base.extend ClassMethods
@@ -8,10 +23,11 @@ module Ohm
8
23
  def first
9
24
  all.first
10
25
  end
11
-
26
+
27
+ # @todo Add support for passing in conditions
12
28
  def last
13
29
  self[db.get(key(:id))]
14
30
  end
15
31
  end
16
32
  end
17
- end
33
+ end
@@ -1,5 +1,5 @@
1
1
  module Ohm
2
- # Minimalist callback support for Ohm::Model.
2
+ # Minimalistic callback support for Ohm::Model.
3
3
  #
4
4
  # @example
5
5
  #
@@ -1,4 +1,34 @@
1
1
  module Ohm
2
+ # Includes Ohm::NumberValidations and Ohm::WebValidations.
3
+ #
4
+ # @example
5
+ #
6
+ # class Post < Ohm::Model
7
+ # include Ohm::ExtraValidations
8
+ #
9
+ # attribute :price
10
+ # attribute :state
11
+ # attribute :slug
12
+ # attribute :author_email
13
+ # attribute :url
14
+ # attribute :ipaddr
15
+ #
16
+ # def validate
17
+ # super
18
+ #
19
+ # assert_decimal :price
20
+ # assert_member :state, ['published', 'unpublished']
21
+ # assert_ipaddr :ipaddr
22
+ # assert_url :url
23
+ # assert_email :author_email
24
+ # end
25
+ # end
26
+ #
27
+ # post = Post.new
28
+ # post.valid?
29
+ # post.errors
30
+ # # [[:price, :not_decimal], [:state, :not_member], [:ipaddr, :not_ipaddr],
31
+ # # [:url, :not_url], [:author_email, :not_email]]
2
32
  module ExtraValidations
3
33
  include NumberValidations
4
34
  include WebValidations
@@ -1,12 +1,14 @@
1
1
  module Ohm
2
2
  # This module is a straight extraction from Ohm. The only difference is
3
3
  # that this allows for a custom sleep value.
4
+ #
4
5
  # In addition, since future ohm versions might drop mutexes, I thought it
5
6
  # might be a good idea to preseve this feature as a drop-in module.
6
7
  module Locking
7
- # Public: Lock the object before executing the block, and release it once the block is done.
8
+ # Lock the object before executing the block, and release it once the block
9
+ # is done.
8
10
  #
9
- # Examples:
11
+ # @example
10
12
  #
11
13
  # post = Order.create(:customer => Customer.create)
12
14
  # post.mutex(0.01) do
@@ -1,4 +1,7 @@
1
1
  module Ohm
2
+ # This module will include all numeric validation needs.
3
+ # As of VERSION 0.0.15, Ohm::NumberValidations#assert_decimal
4
+ # is the only method provided.
2
5
  module NumberValidations
3
6
 
4
7
  protected
@@ -6,4 +9,4 @@ module Ohm
6
9
  assert_format(att, /^(\d+)?(\.\d+)?$/, error)
7
10
  end
8
11
  end
9
- end
12
+ end
@@ -1,4 +1,20 @@
1
1
  module Ohm
2
+ # Provides created_at / updated_at timestamps.
3
+ #
4
+ # @example
5
+ #
6
+ # class Post < Ohm::Model
7
+ # include Ohm::Timestamping
8
+ # end
9
+ #
10
+ # post = Post.create
11
+ # post.created_at.to_s == Time.now.utc.to_s
12
+ # # => true
13
+ #
14
+ # post = Post[post.id]
15
+ # post.save
16
+ # post.updated_at.to_s == Time.now.utc.to_s
17
+ # # => true
2
18
  module Timestamping
3
19
  def self.included(base)
4
20
  base.attribute :created_at
@@ -18,4 +34,4 @@ module Ohm
18
34
  super
19
35
  end
20
36
  end
21
- end
37
+ end
@@ -1,4 +1,30 @@
1
1
  module Ohm
2
+ # Ohm has already added its own `to_hash` method. The difference
3
+ # is that it chose the albeit better whitelisted approach.
4
+ #
5
+ # @example
6
+ #
7
+ # # this is the core Ohm#to_hash implementation
8
+ # class Post < Ohm::Model
9
+ # attribute :body
10
+ # def validate
11
+ # assert_present :body
12
+ # end
13
+ # end
14
+ #
15
+ # Post.create.to_hash == { :errors => [[:body, :not_present]] }
16
+ # # => true
17
+ #
18
+ # Post.create(:body => "The body").to_hash == { :id => 1 }
19
+ # # => true
20
+ #
21
+ # # now this is the all-in-one (kinda Railsy) method.
22
+ # class Post < Ohm::Model
23
+ # attribute :body
24
+ # end
25
+ #
26
+ # Post.create(:body => "Body").to_hash == { :id => 1, :body => "Body" }
27
+ # # => true
2
28
  module ToHash
3
29
  def to_hash
4
30
  atts = attributes + counters
@@ -8,4 +34,4 @@ module Ohm
8
34
  end
9
35
  alias :to_h :to_hash
10
36
  end
11
- end
37
+ end
@@ -3,6 +3,14 @@ require 'time'
3
3
  require 'date'
4
4
 
5
5
  module Ohm
6
+ # Provides all the primitive types. The following are included:
7
+ #
8
+ # * String
9
+ # * Decimal
10
+ # * Integer
11
+ # * Float
12
+ # * Date
13
+ # * Time
6
14
  module Types
7
15
  class Primitive < BasicObject
8
16
  def initialize(value)
@@ -73,7 +81,58 @@ module Ohm
73
81
  end
74
82
  end
75
83
  end
76
-
84
+
85
+ # Provides unobtrusive, non-explosive typecasting.Instead of exploding on set
86
+ # of an invalid value, this module takes the approach of just taking in
87
+ # parameters and letting you do validation yourself. The only thing this
88
+ # module does for you is the boilerplate casting you might need to do.
89
+ #
90
+ # @example
91
+ #
92
+ # # without typecasting
93
+ # class Item < Ohm::Model
94
+ # attribute :price
95
+ # attribute :posted
96
+ # end
97
+ #
98
+ # item = Item.create(:price => 299, :posted => Time.now.utc)
99
+ # item = Item[item.id]
100
+ #
101
+ # # now when you try and grab `item.price`, its a string.
102
+ # "299" == item.price
103
+ # # => true
104
+ #
105
+ # # you can opt to manually cast everytime, or do it in the model, i.e.
106
+ #
107
+ # class Item
108
+ # def price
109
+ # BigDecimal(read_local(:price))
110
+ # end
111
+ # end
112
+ #
113
+ # The Typecasted way
114
+ # ------------------
115
+ #
116
+ # class Item < Ohm::Model
117
+ # include Ohm::Typecast
118
+ #
119
+ # attribute :price, Decimal
120
+ # attribute :posted, Time
121
+ # end
122
+ #
123
+ # item = Item.create(:price => "299", :posted => Time.now.utc)
124
+ # item = Item[item.id]
125
+ # item.price.class == Ohm::Types::Decimal
126
+ # # => true
127
+ #
128
+ # item.price.to_s == "299"
129
+ # # => true
130
+ #
131
+ # item.price * 2 == 598
132
+ # # => true
133
+ #
134
+ # item.posted.strftime('%m/%d/%Y')
135
+ # # => works!!!
77
136
  module Typecast
78
137
  include Types
79
138
 
@@ -96,4 +155,4 @@ module Ohm
96
155
  end
97
156
  end
98
157
  end
99
- end
158
+ end
@@ -32,4 +32,4 @@ module Ohm
32
32
  assert_ipv4(att, error)
33
33
  end
34
34
  end
35
- end
35
+ end
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.14"
8
+ s.version = "0.0.15"
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"]
@@ -45,7 +45,7 @@ Gem::Specification.new do |s|
45
45
  "test/test_ohm_typecast.rb",
46
46
  "test/test_ohm_web_validations.rb"
47
47
  ]
48
- s.homepage = %q{http://github.com/sinefunc/ohm-contrib}
48
+ s.homepage = %q{http://labs.sinefunc.com/ohm-contrib}
49
49
  s.rdoc_options = ["--charset=UTF-8"]
50
50
  s.require_paths = ["lib"]
51
51
  s.rubygems_version = %q{1.3.6}
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 14
9
- version: 0.0.14
8
+ - 15
9
+ version: 0.0.15
10
10
  platform: ruby
11
11
  authors:
12
12
  - Cyril David
@@ -115,7 +115,7 @@ files:
115
115
  - test/test_ohm_typecast.rb
116
116
  - test/test_ohm_web_validations.rb
117
117
  has_rdoc: true
118
- homepage: http://github.com/sinefunc/ohm-contrib
118
+ homepage: http://labs.sinefunc.com/ohm-contrib
119
119
  licenses: []
120
120
 
121
121
  post_install_message: