couchmodel 0.1.4 → 0.1.5
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/Rakefile +2 -2
- data/lib/couch_model/active_model.rb +15 -0
- data/lib/couch_model/base.rb +6 -14
- data/lib/couch_model/base/accessor.rb +14 -7
- data/spec/integration/models.rb +22 -5
- data/spec/integration/new_model_spec.rb +26 -1
- data/spec/integration/saved_model_spec.rb +18 -5
- data/spec/lib/couch_model/active_model_spec.rb +27 -0
- data/spec/lib/couch_model/base/accessor_spec.rb +9 -1
- metadata +3 -3
data/Rakefile
CHANGED
@@ -9,8 +9,8 @@ task :default => :spec
|
|
9
9
|
|
10
10
|
specification = Gem::Specification.new do |specification|
|
11
11
|
specification.name = "couchmodel"
|
12
|
-
specification.version = "0.1.
|
13
|
-
specification.date = "2010-07-
|
12
|
+
specification.version = "0.1.5"
|
13
|
+
specification.date = "2010-07-15"
|
14
14
|
|
15
15
|
specification.authors = [ "Philipp Bruell" ]
|
16
16
|
specification.email = "b.phifty@gmail.com"
|
@@ -78,6 +78,21 @@ module CouchModel
|
|
78
78
|
@changed_attributes = { }
|
79
79
|
end
|
80
80
|
|
81
|
+
def merge_multiparameter_attributes(attributes)
|
82
|
+
result = attributes.stringify_keys
|
83
|
+
self.class.key_definitions.each do |key, definition|
|
84
|
+
case definition[:type]
|
85
|
+
when :date
|
86
|
+
parameters = attributes.values_at(*(1..3).map{ |index| "#{key}(#{index}i)" }).map(&:to_i)
|
87
|
+
result[key] = Date.civil *parameters rescue nil unless result[key].is_a?(Date)
|
88
|
+
when :time
|
89
|
+
parameters = attributes.values_at(*(1..6).map{ |index| "#{key}(#{index}i)" }).map(&:to_i)
|
90
|
+
result[key] = Time.mktime *parameters rescue nil unless result[key].is_a?(Time)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
result
|
94
|
+
end
|
95
|
+
|
81
96
|
class << self
|
82
97
|
|
83
98
|
alias key_accessor_without_dirty key_accessor
|
data/lib/couch_model/base.rb
CHANGED
@@ -31,12 +31,13 @@ module CouchModel
|
|
31
31
|
@attributes = { Configuration::CLASS_KEY => klass.to_s }
|
32
32
|
self.attributes = attributes
|
33
33
|
|
34
|
-
klass.
|
35
|
-
@attributes[key] =
|
36
|
-
end
|
34
|
+
klass.key_definitions.each do |key, definition|
|
35
|
+
@attributes[key] = definition[:default] if definition.has_key?(:default) && !@attributes.has_key?(key)
|
36
|
+
end
|
37
37
|
end
|
38
38
|
|
39
39
|
def attributes=(attributes)
|
40
|
+
attributes = merge_multiparameter_attributes attributes
|
40
41
|
attributes.each { |key, value| self.send :"#{key}=", value if self.respond_to?(:"#{key}=") }
|
41
42
|
end
|
42
43
|
|
@@ -96,7 +97,7 @@ module CouchModel
|
|
96
97
|
private
|
97
98
|
|
98
99
|
def rev=(value)
|
99
|
-
@attributes["_rev"] = value
|
100
|
+
@attributes["_rev"] = value
|
100
101
|
end
|
101
102
|
|
102
103
|
def load_response(response)
|
@@ -130,15 +131,6 @@ module CouchModel
|
|
130
131
|
raise error
|
131
132
|
end
|
132
133
|
|
133
|
-
def self.set_default(key, value)
|
134
|
-
@defaults ||= { }
|
135
|
-
@defaults[key.to_s] = value
|
136
|
-
end
|
137
|
-
|
138
|
-
def self.defaults
|
139
|
-
@defaults || { }
|
140
|
-
end
|
141
|
-
|
142
134
|
def self.create(*arguments)
|
143
135
|
model = new *arguments
|
144
136
|
model.save ? model : nil
|
@@ -152,4 +144,4 @@ module CouchModel
|
|
152
144
|
|
153
145
|
end
|
154
146
|
|
155
|
-
end
|
147
|
+
end
|
@@ -15,20 +15,22 @@ module CouchModel
|
|
15
15
|
|
16
16
|
module ClassMethods
|
17
17
|
|
18
|
+
attr_reader :key_definitions
|
19
|
+
|
18
20
|
def key_reader(key, options = { })
|
19
21
|
raise ArgumentError, "method #{key} is already defined" if method_defined?(:"#{key}")
|
20
|
-
|
21
|
-
|
22
|
-
send :"define_#{type
|
22
|
+
set_key_definition key, options
|
23
|
+
type = options[:type] || :string
|
24
|
+
send :"define_#{type}_reader", key
|
23
25
|
rescue NoMethodError
|
24
26
|
raise ArgumentError, "type #{type} isn't supported"
|
25
27
|
end
|
26
28
|
|
27
29
|
def key_writer(key, options = { })
|
28
30
|
raise ArgumentError, "method #{key}= is already defined" if method_defined?(:"#{key}=")
|
29
|
-
|
30
|
-
|
31
|
-
send :"define_#{type
|
31
|
+
set_key_definition key, options
|
32
|
+
type = options[:type] || :string
|
33
|
+
send :"define_#{type}_writer", key
|
32
34
|
rescue NoMethodError
|
33
35
|
raise ArgumentError, "type #{type} isn't supported"
|
34
36
|
end
|
@@ -40,6 +42,11 @@ module CouchModel
|
|
40
42
|
|
41
43
|
private
|
42
44
|
|
45
|
+
def set_key_definition(key, definition)
|
46
|
+
@key_definitions ||= { }
|
47
|
+
@key_definitions[key.to_s] = definition
|
48
|
+
end
|
49
|
+
|
43
50
|
def define_integer_reader(name)
|
44
51
|
define_method :"#{name}" do
|
45
52
|
@attributes[name.to_s].to_i
|
@@ -86,7 +93,7 @@ module CouchModel
|
|
86
93
|
|
87
94
|
def define_time_writer(name)
|
88
95
|
define_method :"#{name}=" do |value|
|
89
|
-
@attributes[name.to_s] = value ? value.strftime("%Y-%m-%d %H:%M:%S %z") :
|
96
|
+
@attributes[name.to_s] = value.is_a?(Time) ? value.strftime("%Y-%m-%d %H:%M:%S %z") : value
|
90
97
|
end
|
91
98
|
end
|
92
99
|
|
data/spec/integration/models.rb
CHANGED
@@ -14,8 +14,9 @@ class User < CouchModel::Base
|
|
14
14
|
setup_database DATABASE
|
15
15
|
|
16
16
|
key_accessor :username
|
17
|
-
key_accessor :email,
|
17
|
+
key_accessor :email, :default => "no email"
|
18
18
|
key_accessor :birthday, :type => :date
|
19
|
+
key_accessor :lunch, :type => :time
|
19
20
|
|
20
21
|
has_many :memberships,
|
21
22
|
:class_name => "Membership",
|
@@ -35,8 +36,24 @@ class Membership < CouchModel::Base
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def create_users_and_memberships
|
38
|
-
@user_one = User.create :username => "user one",
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
@user_one = User.create :username => "user one",
|
40
|
+
:birthday => Date.parse("2000-07-07"),
|
41
|
+
:lunch => Time.parse("2010/10/21 12:13:14")
|
42
|
+
|
43
|
+
@user_two = User.create :username => "user two",
|
44
|
+
"birthday(1i)" => "2010",
|
45
|
+
"birthday(2i)" => "2",
|
46
|
+
"birthday(3i)" => "20",
|
47
|
+
"lunch(1i)" => "2010",
|
48
|
+
"lunch(2i)" => "10",
|
49
|
+
"lunch(3i)" => "21",
|
50
|
+
"lunch(4i)" => "12",
|
51
|
+
"lunch(5i)" => "13",
|
52
|
+
"lunch(6i)" => "14"
|
53
|
+
|
54
|
+
@membership_one = Membership.create :created_at => Time.parse("2010-07-07"),
|
55
|
+
:user => @user_one
|
56
|
+
|
57
|
+
@membership_two = Membership.create :created_at => Time.parse("2010-07-07"),
|
58
|
+
:user => @user_two
|
42
59
|
end
|
@@ -6,7 +6,16 @@ describe "integration" do
|
|
6
6
|
use_real_transport!
|
7
7
|
|
8
8
|
before :each do
|
9
|
-
@user = User.new
|
9
|
+
@user = User.new "username" => "user",
|
10
|
+
"birthday(1i)" => "2010",
|
11
|
+
"birthday(2i)" => "3",
|
12
|
+
"birthday(3i)" => "15",
|
13
|
+
"lunch(1i)" => "2010",
|
14
|
+
"lunch(2i)" => "10",
|
15
|
+
"lunch(3i)" => "21",
|
16
|
+
"lunch(4i)" => "12",
|
17
|
+
"lunch(5i)" => "13",
|
18
|
+
"lunch(6i)" => "14"
|
10
19
|
end
|
11
20
|
|
12
21
|
describe "setup" do
|
@@ -29,6 +38,22 @@ describe "integration" do
|
|
29
38
|
|
30
39
|
end
|
31
40
|
|
41
|
+
describe "birthday" do
|
42
|
+
|
43
|
+
it "should return the correct date" do
|
44
|
+
@user.birthday.should == Date.parse("2010/03/15")
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "lunch" do
|
50
|
+
|
51
|
+
it "should return the correct time" do
|
52
|
+
@user.lunch.should == Time.parse("2010/10/21 12:13:14")
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
32
57
|
describe "save" do
|
33
58
|
|
34
59
|
it "should create the model" do
|
@@ -70,11 +70,24 @@ describe "integration" do
|
|
70
70
|
|
71
71
|
describe "birthday" do
|
72
72
|
|
73
|
-
it "should return
|
74
|
-
@user_one.
|
75
|
-
|
76
|
-
|
77
|
-
@user_two.
|
73
|
+
it "should return the correct date" do
|
74
|
+
@user_one.reload
|
75
|
+
@user_one.birthday.should == Date.parse("2000/07/07")
|
76
|
+
|
77
|
+
@user_two.reload
|
78
|
+
@user_two.birthday.should == Date.parse("2010/02/20")
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "lunch" do
|
84
|
+
|
85
|
+
it "should return the correct time" do
|
86
|
+
@user_one.reload
|
87
|
+
@user_one.lunch.should == Time.parse("2010/10/21 12:13:14")
|
88
|
+
|
89
|
+
@user_two.reload
|
90
|
+
@user_two.lunch.should == Time.parse("2010/10/21 12:13:14")
|
78
91
|
end
|
79
92
|
|
80
93
|
end
|
@@ -7,6 +7,8 @@ class ActiveTestModel < CouchModel::Base
|
|
7
7
|
|
8
8
|
key_accessor :name
|
9
9
|
key_accessor :email
|
10
|
+
key_accessor :date, :type => :date
|
11
|
+
key_accessor :time, :type => :time
|
10
12
|
|
11
13
|
validates_presence_of :name
|
12
14
|
|
@@ -125,6 +127,31 @@ describe ActiveTestModel do
|
|
125
127
|
|
126
128
|
end
|
127
129
|
|
130
|
+
describe "attributes=" do
|
131
|
+
|
132
|
+
it "should convert multiple date parameters into one date field" do
|
133
|
+
@model.attributes = {
|
134
|
+
"date(1i)" => "2010",
|
135
|
+
"date(2i)" => "3",
|
136
|
+
"date(3i)" => "15"
|
137
|
+
}
|
138
|
+
@model.date.should == Date.parse("2010/03/15")
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should convert multiple time parameters into one time field" do
|
142
|
+
@model.attributes = {
|
143
|
+
"time(1i)" => "2010",
|
144
|
+
"time(2i)" => "3",
|
145
|
+
"time(3i)" => "15",
|
146
|
+
"time(4i)" => "10",
|
147
|
+
"time(5i)" => "11",
|
148
|
+
"time(6i)" => "12"
|
149
|
+
}
|
150
|
+
@model.time.should == Time.parse("2010/03/15 10:11:12")
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
128
155
|
describe "save" do
|
129
156
|
|
130
157
|
before :each do
|
@@ -81,7 +81,7 @@ describe AccessorTestModel do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it "should set a default value" do
|
84
|
-
AccessorTestModel.
|
84
|
+
AccessorTestModel.key_definitions["test_two"].should == { :default => "test default" }
|
85
85
|
end
|
86
86
|
|
87
87
|
it "should raise an ArgumentError on unsupported type" do
|
@@ -103,11 +103,19 @@ describe AccessorTestModel do
|
|
103
103
|
it "should define writers for date types" do
|
104
104
|
@model.test_date = Date.parse("2010-07-07")
|
105
105
|
@model.attributes["test_date"].should == "2010-07-07"
|
106
|
+
|
107
|
+
@model.test_date = "2010-07-07"
|
108
|
+
@model.attributes["test_date"].should == "2010-07-07"
|
109
|
+
@model.test_date.should == Date.parse("2010-07-07")
|
106
110
|
end
|
107
111
|
|
108
112
|
it "should define writers for time types" do
|
109
113
|
@model.test_time = Time.parse("2010-07-07 10:10:10")
|
110
114
|
@model.attributes["test_time"].should == "2010-07-07 10:10:10 +0200"
|
115
|
+
|
116
|
+
@model.test_time = "2010-07-07 10:10:10"
|
117
|
+
@model.attributes["test_time"].should == "2010-07-07 10:10:10"
|
118
|
+
@model.test_time.should == Time.parse("2010-07-07 10:10:10")
|
111
119
|
end
|
112
120
|
|
113
121
|
it "should raise an exception if the writer method is already defined" do
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 0.1.
|
8
|
+
- 5
|
9
|
+
version: 0.1.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Philipp Bruell
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-07-
|
17
|
+
date: 2010-07-15 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|