ohm-contrib 0.0.1

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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ .rvmrc
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Cyril David
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,44 @@
1
+ ohm-contrib
2
+ ===========
3
+
4
+ A collection of drop-in modules for Ohm.
5
+
6
+ List of modules
7
+ ---------------
8
+ * `Ohm::Boundaries`
9
+ * `Ohm::Timestamping`
10
+ * `Ohm::ToHash`
11
+
12
+ Example usage
13
+ -------------
14
+
15
+ require 'ohm'
16
+ require 'ohm/contrib'
17
+
18
+ class Post < Ohm::Model
19
+ include Ohm::Timestamping
20
+ include Ohm::ToHash
21
+ include Ohm::Boundaries
22
+ end
23
+
24
+ Post.first
25
+ Post.last
26
+ Post.new.to_hash
27
+ Post.create.to_hash
28
+ Post.create.created_at
29
+ Post.create.updated_at
30
+
31
+ Note on Patches/Pull Requests
32
+ -----------------------------
33
+ * Fork the project.
34
+ * Make your feature addition or bug fix.
35
+ * Add tests for it. This is important so I don't break it in a
36
+ future version unintentionally.
37
+ * Commit, do not mess with rakefile, version, or history.
38
+ (if you want to have your own version, that is fine but bump version in a
39
+ commit by itself I can ignore when I pull)
40
+ * Send me a pull request. Bonus points for topic branches.
41
+
42
+ Copyright
43
+ ---------
44
+ Copyright (c) 2010 Cyril David. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "ohm-contrib"
8
+ gem.summary = %Q{A collection of ohm related modules}
9
+ gem.description = %Q{Highly decoupled drop-in functionality for Ohm models}
10
+ gem.email = "cyx.ucron@gmail.com"
11
+ gem.homepage = "http://github.com/sinefunc/ohm-contrib"
12
+ gem.authors = ["Cyril David"]
13
+ gem.add_development_dependency "contest", ">= 0"
14
+ gem.add_development_dependency "redis", ">= 0"
15
+ gem.add_development_dependency "ohm", ">= 0"
16
+ gem.add_development_dependency "timecop", ">= 0"
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/test_*.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "ohm-contrib #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,17 @@
1
+ module Ohm
2
+ module Boundaries
3
+ def self.included(base)
4
+ base.extend ClassMethods
5
+ end
6
+
7
+ module ClassMethods
8
+ def first
9
+ all.first
10
+ end
11
+
12
+ def last
13
+ self[db.get(key(:id))]
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ module Ohm
2
+ module NumberValidations
3
+
4
+ protected
5
+ def assert_decimal(att, error = [att, :not_decimal])
6
+ assert_format(att, /^(\d+)?(\.\d+)?$/, error)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ module Ohm
2
+ module Timestamping
3
+ def self.included(base)
4
+ base.attribute :created_at
5
+ base.attribute :updated_at
6
+ end
7
+
8
+ def create
9
+ self.created_at ||= Time.now.utc
10
+
11
+ super
12
+ end
13
+
14
+ protected
15
+ def write
16
+ self.updated_at ||= Time.now.utc
17
+
18
+ super
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,11 @@
1
+ module Ohm
2
+ module ToHash
3
+ def to_hash
4
+ atts = attributes + counters
5
+ hash = atts.inject({}) { |h, att| h[att] = send(att); h }
6
+ hash[:id] = @id
7
+ hash
8
+ end
9
+ alias :to_h :to_hash
10
+ end
11
+ end
@@ -0,0 +1,35 @@
1
+ module Ohm
2
+ # All credit goes to gnrfan of github
3
+ # Basically an extraction from http://github.com/gnrfan/ohm_extra_validations
4
+ module WebValidations
5
+
6
+ protected
7
+ def assert_slug(att, error = [att, :not_slug])
8
+ if assert_present(att, error) and assert_unique(att)
9
+ assert_format(att, /^[-\w]+$/, error)
10
+ end
11
+ end
12
+
13
+ def assert_email(att, error = [att, :not_email])
14
+ if assert_present(att, error)
15
+ assert_format(att, /^([^@\s*]+)@((?:[-a-z0-9]+\.)+[a-z]{2,6})$/i, error)
16
+ end
17
+ end
18
+
19
+ def assert_url(att, error = [att, :not_url])
20
+ if assert_present(att, error)
21
+ assert_format(att, /^(http|https):\/\/([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}|(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}|localhost)(:[0-9]{1,5})?(\/.*)?$/ix, error)
22
+ end
23
+ end
24
+
25
+ def assert_ipv4(att, error = [att, :not_ipv4])
26
+ if assert_present(att, error)
27
+ assert_format(att, /^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/, error)
28
+ end
29
+ end
30
+
31
+ def assert_ipaddr(att, error = [att, :not_ipaddr])
32
+ assert_ipv4(att, error)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ module Ohm
2
+ VERSION = '0.0.1'
3
+
4
+ autoload :Boundaries, "ohm/contrib/boundaries"
5
+ autoload :Timestamping, "ohm/contrib/timestamping"
6
+ autoload :ToHash, "ohm/contrib/to_hash"
7
+ autoload :WebValidations, "ohm/contrib/web_validations"
8
+ autoload :NumberValidations, "ohm/contrib/number_validations"
9
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'contest'
4
+ require 'redis'
5
+ require 'ohm'
6
+ require 'timecop'
7
+
8
+ Ohm.connect :host => "localhost", :port => "6380"
9
+
10
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
11
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
12
+ require 'ohm/contrib'
13
+
14
+ class Test::Unit::TestCase
15
+ end
@@ -0,0 +1,52 @@
1
+ require "helper"
2
+
3
+ class TestOhmBoundaries < Test::Unit::TestCase
4
+ setup do
5
+ Ohm.flush
6
+ end
7
+
8
+ class Person < Ohm::Model
9
+ include Ohm::Boundaries
10
+
11
+ attribute :name
12
+ end
13
+
14
+ context "when there are no People" do
15
+ should "have a nil Person.first" do
16
+ assert_nil Person.first
17
+ end
18
+
19
+ should "have a nil Person.last" do
20
+ assert_nil Person.last
21
+ end
22
+ end
23
+
24
+ context "after creating a single Person named matz" do
25
+ setup do
26
+ @matz = Person.create(:name => "matz")
27
+ end
28
+
29
+ should "have matz as the first person" do
30
+ assert_equal @matz, Person.first
31
+ end
32
+
33
+ should "have matz as the last person" do
34
+ assert_equal @matz, Person.last
35
+ end
36
+ end
37
+
38
+ context "after creating matz first then linus next" do
39
+ setup do
40
+ @matz = Person.create(:name => "matz")
41
+ @linus = Person.create(:name => "linus")
42
+ end
43
+
44
+ should "have matz as the first Person" do
45
+ assert_equal @matz, Person.first
46
+ end
47
+
48
+ should "have linus as the last Person" do
49
+ assert_equal @linus, Person.last
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,34 @@
1
+ require 'helper'
2
+
3
+ class TestOhmContrib < Test::Unit::TestCase
4
+ test "autoloading of Boundaries" do
5
+ assert_nothing_raised NameError, LoadError do
6
+ Ohm::Boundaries
7
+ end
8
+ end
9
+
10
+ test "autoloading of timestamping" do
11
+ assert_nothing_raised NameError, LoadError do
12
+ Ohm::Timestamping
13
+ end
14
+ end
15
+
16
+ test "autoloading of ToHash" do
17
+ assert_nothing_raised NameError, LoadError do
18
+ Ohm::ToHash
19
+ end
20
+ end
21
+
22
+ test "autoloading of WebValidations" do
23
+ assert_nothing_raised NameError, LoadError do
24
+ Ohm::WebValidations
25
+ end
26
+ end
27
+
28
+ test "autoloading of NumberValidations" do
29
+ assert_nothing_raised NameError, LoadError do
30
+ Ohm::NumberValidations
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,59 @@
1
+ require "helper"
2
+
3
+ class TestOhmNumberValidations < Test::Unit::TestCase
4
+ class Product < Ohm::Model
5
+ include Ohm::NumberValidations
6
+
7
+ attribute :price
8
+ attribute :optional_price
9
+
10
+ def validate
11
+ assert_decimal :price
12
+ assert_decimal :optional_price unless optional_price.to_s.empty?
13
+ end
14
+ end
15
+
16
+ context "given no price" do
17
+ should "still validate as :not_decimal" do
18
+ product = Product.new(:price => nil)
19
+ product.valid?
20
+
21
+ assert_equal [[:price, :not_decimal]], product.errors
22
+ end
23
+ end
24
+
25
+ context "given a 0.10 value" do
26
+ should "validate as a decimal" do
27
+ product = Product.new(:price => 0.10)
28
+
29
+ assert product.valid?
30
+ end
31
+ end
32
+
33
+ context "given 1 as a value" do
34
+ should "validate as a decimal" do
35
+ product = Product.new(:price => 1)
36
+
37
+ assert product.valid?
38
+ end
39
+ end
40
+
41
+ context "given 1 dot as a value" do
42
+ should "not validate as a decimal" do
43
+ product = Product.new(:price => "1.")
44
+
45
+ assert ! product.valid?
46
+ assert_equal [[:price, :not_decimal]], product.errors
47
+ end
48
+ end
49
+
50
+ context "given no value for optional price" do
51
+ should "have no validation errors" do
52
+ product = Product.new(:price => 10.1, :optional_price => nil)
53
+ assert product.valid?
54
+
55
+ product = Product.new(:price => 10.1, :optional_price => '')
56
+ assert product.valid?
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,60 @@
1
+ require "helper"
2
+
3
+ class TestOhmTimestamping < Test::Unit::TestCase
4
+ setup do
5
+ Ohm.flush
6
+ end
7
+
8
+ class Person < Ohm::Model
9
+ include Ohm::Timestamping
10
+ end
11
+
12
+ context "a new? record" do
13
+ should "have no created_at" do
14
+ assert_nil Person.new.created_at
15
+ end
16
+
17
+ should "have no updated_at" do
18
+ assert_nil Person.new.updated_at
19
+ end
20
+ end
21
+
22
+ context "on create" do
23
+ setup do
24
+ @now = Time.utc(2010, 5, 12)
25
+ Timecop.freeze(@now)
26
+ @person = Person.create
27
+ @person = Person[@person.id]
28
+ end
29
+
30
+
31
+ should "set the created_at equal to the current time" do
32
+ assert_equal @now.to_s, @person.created_at
33
+ end
34
+
35
+ should "also set the updated_at equal to the current time" do
36
+ assert_equal @now.to_s, @person.updated_at
37
+ end
38
+ end
39
+
40
+ context "on update" do
41
+ setup do
42
+ @person = Person.create
43
+ @old_created_at = @person.created_at.to_s
44
+
45
+ @now = Time.utc(2010, 10, 31)
46
+ Timecop.freeze(@now)
47
+
48
+ @person.save
49
+ @person = Person[@person.id]
50
+ end
51
+
52
+ should "leave created_at unchanged" do
53
+ assert_equal @old_created_at, @person.created_at
54
+ end
55
+
56
+ should "set updated_at to the current Time" do
57
+ assert_equal @now.to_s, @person.updated_at
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,67 @@
1
+ require "helper"
2
+
3
+ class TestOhmToHash < Test::Unit::TestCase
4
+ setup do
5
+ Ohm.flush
6
+ end
7
+
8
+ context "a Person with name: matz, age: nil, skills: 10" do
9
+ class Person < Ohm::Model
10
+ include Ohm::ToHash
11
+
12
+ attribute :name
13
+ attribute :age
14
+ attribute :skills
15
+ end
16
+
17
+ setup do
18
+ @person = Person.create(:name => 'matz', :skills => 10)
19
+ @person = Person[@person.id]
20
+ end
21
+
22
+ should "have a to_hash of { id: 1, name: 'matz', age: nil, skills: 10 }" do
23
+ assert_equal(
24
+ { :id => '1', :name => "matz", :age => nil, :skills => '10' },
25
+ @person.to_hash
26
+ )
27
+ end
28
+ end
29
+
30
+ context "when a Post has a votes counter" do
31
+ class Post < Ohm::Model
32
+ include Ohm::ToHash
33
+
34
+ counter :votes
35
+ end
36
+
37
+ setup do
38
+ @post = Post.create
39
+ @post.incr :votes
40
+ @post.incr :votes
41
+ @post.incr :votes
42
+ end
43
+
44
+ should "include the votes in the hash" do
45
+ assert_equal({ :id => '1', :votes => 3 }, @post.to_hash)
46
+ end
47
+ end
48
+
49
+ context "when a comment has a reference to a person" do
50
+ Person = Class.new(Ohm::Model)
51
+
52
+ class Comment < Ohm::Model
53
+ include Ohm::ToHash
54
+
55
+ reference :person, Person
56
+ end
57
+
58
+ setup do
59
+ @person = Person.create
60
+ @comment = Comment.create(:person => @person)
61
+ end
62
+
63
+ should "have the person_id in the hash" do
64
+ assert_equal({ :id => '1', :person_id => '1' }, @comment.to_hash)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,113 @@
1
+ require "helper"
2
+
3
+ class TestOhmWebValidations < Test::Unit::TestCase
4
+ class BlogPost < Ohm::Model
5
+ include Ohm::WebValidations
6
+
7
+ attribute :slug
8
+
9
+ index :slug
10
+
11
+ def validate
12
+ assert_slug :slug
13
+ end
14
+ end
15
+
16
+ class Comment < Ohm::Model
17
+ include Ohm::WebValidations
18
+
19
+ attribute :ip_address
20
+ attribute :homepage
21
+ attribute :email
22
+
23
+ def validate
24
+ assert_ipaddr :ip_address
25
+ assert_url :homepage
26
+ assert_email :email
27
+ end
28
+ end
29
+
30
+ context "The slug should be valid" do
31
+ def setup
32
+ @blog_post_01 = BlogPost.new
33
+ @blog_post_02 = BlogPost.new
34
+ end
35
+
36
+ should "fail if the slug is not valid" do
37
+ @blog_post_01.slug = "This is a title, not a SLUG"
38
+ @blog_post_01.create
39
+
40
+ assert @blog_post_01.new?
41
+ assert_equal [[:slug, :not_slug]], @blog_post_01.errors
42
+ end
43
+
44
+ #should "succeed if the slug is valid" do
45
+ # @blog_post_02.slug = "this-is-a-valid-slug"
46
+ # @blog_post_02.create
47
+ # assert_not_nil @blog_post_02.id
48
+ #end
49
+
50
+ should "fail if the slug is not unique" do
51
+
52
+ @blog_post_01.slug = "this-is-a-valid-slug"
53
+ @blog_post_01.create
54
+
55
+ @blog_post_02.slug = "this-is-a-valid-slug"
56
+ @blog_post_02.create
57
+
58
+ assert @blog_post_02.new?
59
+ assert_equal [[:slug, :not_unique]], @blog_post_02.errors
60
+ end
61
+ end
62
+
63
+ context "the ip address should be valid" do
64
+ def setup
65
+ @comment = Comment.new
66
+ end
67
+
68
+ should "fail if the ip address is not valid" do
69
+ @comment.ip_address = "400.500.600.700"
70
+ @comment.create
71
+
72
+ assert @comment.new?
73
+ assert @comment.errors.include? [:ip_address, :not_ipaddr]
74
+ end
75
+ end
76
+
77
+ context "the email address should be valid" do
78
+ def setup
79
+ @comment = Comment.new
80
+ end
81
+
82
+ should "fail if the email address is not valid" do
83
+ @comment.email = "something.com"
84
+ @comment.create
85
+
86
+ assert @comment.new?
87
+ assert @comment.errors.include? [:email, :not_email]
88
+ end
89
+ end
90
+
91
+ context "the homepage URL should be valid" do
92
+ def setup
93
+ @comment = Comment.new
94
+ end
95
+
96
+ should "fail if the homepage URL is not valid" do
97
+ @comment.homepage = "something"
98
+ @comment.create
99
+
100
+ assert @comment.new?
101
+ assert @comment.errors.include? [:homepage, :not_url]
102
+ end
103
+
104
+ should "fail if the homepage URL protocol is not http or https" do
105
+ @comment.homepage = "irc://irc.freenode.net/something"
106
+ @comment.create
107
+
108
+ assert @comment.new?
109
+ assert @comment.errors.include? [:homepage, :not_url]
110
+ end
111
+
112
+ end
113
+ end
metadata ADDED
@@ -0,0 +1,134 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ohm-contrib
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Cyril David
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-13 00:00:00 +08:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: contest
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :development
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: redis
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :development
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: ohm
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :development
55
+ version_requirements: *id003
56
+ - !ruby/object:Gem::Dependency
57
+ name: timecop
58
+ prerelease: false
59
+ requirement: &id004 !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ type: :development
67
+ version_requirements: *id004
68
+ description: Highly decoupled drop-in functionality for Ohm models
69
+ email: cyx.ucron@gmail.com
70
+ executables: []
71
+
72
+ extensions: []
73
+
74
+ extra_rdoc_files:
75
+ - LICENSE
76
+ - README.markdown
77
+ files:
78
+ - .document
79
+ - .gitignore
80
+ - LICENSE
81
+ - README.markdown
82
+ - Rakefile
83
+ - VERSION
84
+ - lib/ohm/contrib.rb
85
+ - lib/ohm/contrib/boundaries.rb
86
+ - lib/ohm/contrib/number_validations.rb
87
+ - lib/ohm/contrib/timestamping.rb
88
+ - lib/ohm/contrib/to_hash.rb
89
+ - lib/ohm/contrib/web_validations.rb
90
+ - test/helper.rb
91
+ - test/test_ohm_boundaries.rb
92
+ - test/test_ohm_contrib.rb
93
+ - test/test_ohm_number_validations.rb
94
+ - test/test_ohm_timestamping.rb
95
+ - test/test_ohm_to_hash.rb
96
+ - test/test_ohm_web_validations.rb
97
+ has_rdoc: true
98
+ homepage: http://github.com/sinefunc/ohm-contrib
99
+ licenses: []
100
+
101
+ post_install_message:
102
+ rdoc_options:
103
+ - --charset=UTF-8
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ segments:
111
+ - 0
112
+ version: "0"
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ segments:
118
+ - 0
119
+ version: "0"
120
+ requirements: []
121
+
122
+ rubyforge_project:
123
+ rubygems_version: 1.3.6
124
+ signing_key:
125
+ specification_version: 3
126
+ summary: A collection of ohm related modules
127
+ test_files:
128
+ - test/helper.rb
129
+ - test/test_ohm_boundaries.rb
130
+ - test/test_ohm_contrib.rb
131
+ - test/test_ohm_number_validations.rb
132
+ - test/test_ohm_timestamping.rb
133
+ - test/test_ohm_to_hash.rb
134
+ - test/test_ohm_web_validations.rb