ohm-contrib 1.1.0 → 1.2
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/ohm/datatypes.rb +9 -0
- data/lib/ohm/scope.rb +27 -7
- data/ohm-contrib.gemspec +2 -2
- data/test/plugin.rb +27 -0
- metadata +4 -4
data/lib/ohm/datatypes.rb
CHANGED
@@ -2,6 +2,7 @@ require "bigdecimal"
|
|
2
2
|
require "date"
|
3
3
|
require "json"
|
4
4
|
require "time"
|
5
|
+
require "set"
|
5
6
|
|
6
7
|
module Ohm
|
7
8
|
module DataTypes
|
@@ -9,12 +10,14 @@ module Ohm
|
|
9
10
|
Integer = lambda { |x| x.to_i }
|
10
11
|
Decimal = lambda { |x| BigDecimal(x.to_s) }
|
11
12
|
Float = lambda { |x| x.to_f }
|
13
|
+
Symbol = lambda { |x| x.to_sym }
|
12
14
|
Boolean = lambda { |x| Ohm::DataTypes.bool(x) }
|
13
15
|
Time = lambda { |t| t && (t.kind_of?(::Time) ? t : ::Time.parse(t)) }
|
14
16
|
Date = lambda { |d| d && (d.kind_of?(::Date) ? d : ::Date.parse(d)) }
|
15
17
|
Timestamp = lambda { |t| t && UnixTime.at(t.to_i) }
|
16
18
|
Hash = lambda { |h| h && SerializedHash[h.kind_of?(::Hash) ? h : JSON(h)] }
|
17
19
|
Array = lambda { |a| a && SerializedArray.new(a.kind_of?(::Array) ? a : JSON(a)) }
|
20
|
+
Set = lambda { |s| s && SerializedSet.new(s.kind_of?(::Set) ? s : JSON(s)) }
|
18
21
|
end
|
19
22
|
|
20
23
|
def self.bool(val)
|
@@ -43,5 +46,11 @@ module Ohm
|
|
43
46
|
JSON.dump(self)
|
44
47
|
end
|
45
48
|
end
|
49
|
+
|
50
|
+
class SerializedSet < ::Set
|
51
|
+
def to_s
|
52
|
+
JSON.dump(to_a.sort)
|
53
|
+
end
|
54
|
+
end
|
46
55
|
end
|
47
56
|
end
|
data/lib/ohm/scope.rb
CHANGED
@@ -14,16 +14,36 @@ module Ohm
|
|
14
14
|
self::DefinedScopes.send(:include, scope) if scope
|
15
15
|
end
|
16
16
|
end
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
# In Ohm v1.2, the Set and MultiSet initialize methods
|
20
|
+
# are defined on themselves. Hence the trick of doing a
|
21
|
+
# module OverloadedSet with an initialize method doesn't
|
22
|
+
# work anymore.
|
23
|
+
#
|
24
|
+
# The simplest way to solve that as of now is to duplicate
|
25
|
+
# and extend the #initialize method for each of these.
|
26
|
+
#
|
27
|
+
# Granted it's not the _ideal_ way, the drawbacks are
|
28
|
+
# outweighed by the simplicity and performance of this
|
29
|
+
# approach versus other monkey-patching techniques.
|
30
|
+
class Set
|
31
|
+
def initialize(key, namespace, model)
|
32
|
+
@key = key
|
33
|
+
@namespace = namespace
|
34
|
+
@model = model
|
21
35
|
|
22
|
-
|
23
|
-
end
|
36
|
+
extend model::DefinedScopes if defined?(model::DefinedScopes)
|
24
37
|
end
|
25
38
|
end
|
26
39
|
|
27
|
-
|
28
|
-
|
40
|
+
class MultiSet
|
41
|
+
def initialize(namespace, model, command)
|
42
|
+
@namespace = namespace
|
43
|
+
@model = model
|
44
|
+
@command = command
|
45
|
+
|
46
|
+
extend model::DefinedScopes if defined?(model::DefinedScopes)
|
47
|
+
end
|
48
|
+
end
|
29
49
|
end
|
data/ohm-contrib.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "ohm-contrib"
|
3
|
-
s.version = "1.
|
3
|
+
s.version = "1.2"
|
4
4
|
s.summary = %{A collection of decoupled drop-in modules for Ohm.}
|
5
5
|
s.description = %{Includes a couple of core functions such as callbacks, timestamping, typecasting and lots of generic validation routines.}
|
6
6
|
s.author = "Cyril David"
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
s.rubyforge_project = "ohm-contrib"
|
23
23
|
|
24
|
-
s.add_dependency "ohm", "~> 1.
|
24
|
+
s.add_dependency "ohm", "~> 1.2"
|
25
25
|
|
26
26
|
s.add_development_dependency "cutest"
|
27
27
|
s.add_development_dependency "redis"
|
data/test/plugin.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
require File.expand_path("../helper", __FILE__)
|
4
|
+
require 'set'
|
4
5
|
|
5
6
|
class Comment < Ohm::Model
|
6
7
|
include Ohm::Timestamps
|
@@ -159,6 +160,8 @@ scope do
|
|
159
160
|
attribute :sizes, Type::Hash
|
160
161
|
attribute :stores, Type::Array
|
161
162
|
attribute :published, Type::Boolean
|
163
|
+
attribute :state, Type::Symbol
|
164
|
+
attribute :comments, Type::Set
|
162
165
|
end
|
163
166
|
|
164
167
|
test "Type::Integer" do
|
@@ -269,4 +272,28 @@ scope do
|
|
269
272
|
assert_equal "false", p.key.hget(:published)
|
270
273
|
assert_equal false, p.published
|
271
274
|
end
|
275
|
+
|
276
|
+
test "Type::Symbol" do
|
277
|
+
p = Product.new(:state => 'available')
|
278
|
+
|
279
|
+
assert_equal :available, p.state
|
280
|
+
p.save
|
281
|
+
|
282
|
+
p = Product[p.id]
|
283
|
+
assert_equal :available, p.state
|
284
|
+
end
|
285
|
+
|
286
|
+
test "Type::Set" do
|
287
|
+
comments = ::Set.new(["Good product", "Awesome!", "Great."])
|
288
|
+
p = Product.new(:comments => comments)
|
289
|
+
assert p.comments.kind_of?(::Set)
|
290
|
+
|
291
|
+
p.save
|
292
|
+
|
293
|
+
p = Product[p.id]
|
294
|
+
|
295
|
+
assert_equal comments, p.comments
|
296
|
+
assert_equal %Q(["Awesome!","Good product","Great."]), p.key.hget(:comments)
|
297
|
+
assert_equal %Q(["Awesome!","Good product","Great."]), p.comments.to_s
|
298
|
+
end
|
272
299
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm-contrib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.2'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ohm
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '1.
|
21
|
+
version: '1.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '1.
|
29
|
+
version: '1.2'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: cutest
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|