couchmodel 0.1.2 → 0.1.3
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/README.rdoc +3 -1
- data/Rakefile +2 -2
- data/lib/couch_model/base/accessor.rb +61 -8
- data/lib/couch_model/base/association.rb +1 -1
- data/spec/integration/associations_spec.rb +2 -2
- data/spec/integration/models.rb +6 -5
- data/spec/integration/saved_model_spec.rb +11 -6
- data/spec/lib/couch_model/base/accessor_spec.rb +60 -2
- metadata +3 -3
data/README.rdoc
CHANGED
@@ -38,6 +38,7 @@ To define a model, it's necessary to create a subclass of <tt>CouchModel::Base</
|
|
38
38
|
key_accessor :name
|
39
39
|
key_accessor :email
|
40
40
|
key_accessor :language, :default => "en"
|
41
|
+
key_accessor :birthday, :type => :date
|
41
42
|
|
42
43
|
end
|
43
44
|
|
@@ -52,7 +53,8 @@ manually by calling <tt>CouchModel::Configuration.setup_databases</tt> and
|
|
52
53
|
|
53
54
|
The method <tt>key_accessor</tt> defined access methods to the given keys of the CouchDB document. It's also possible
|
54
55
|
to use <tt>key_reader</tt> and <tt>key_writer</tt> here. If the <tt>:default</tt> option is passed, the key will get
|
55
|
-
a default value assigned during initialization of the class.
|
56
|
+
a default value assigned during initialization of the class. The <tt>:type</tt> option specifies the type of the
|
57
|
+
attribute. Currently the types <tt>:integer</tt>, <tt>:string</tt>, <tt>:date</tt> and <tt>:time</tt> are supported.
|
56
58
|
|
57
59
|
== Design documents
|
58
60
|
|
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-
|
12
|
+
specification.version = "0.1.3"
|
13
|
+
specification.date = "2010-07-09"
|
14
14
|
|
15
15
|
specification.authors = [ "Philipp Bruell" ]
|
16
16
|
specification.email = "b.phifty@gmail.com"
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'time'
|
1
2
|
|
2
3
|
module CouchModel
|
3
4
|
|
@@ -16,18 +17,20 @@ module CouchModel
|
|
16
17
|
|
17
18
|
def key_reader(key, options = { })
|
18
19
|
raise ArgumentError, "method #{key} is already defined" if method_defined?(:"#{key}")
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
default, type = options.values_at :default, :type
|
21
|
+
set_default key, default if default
|
22
|
+
send :"define_#{type || :string}_reader", key
|
23
|
+
rescue NoMethodError
|
24
|
+
raise ArgumentError, "type #{type} isn't supported"
|
23
25
|
end
|
24
26
|
|
25
27
|
def key_writer(key, options = { })
|
26
28
|
raise ArgumentError, "method #{key}= is already defined" if method_defined?(:"#{key}=")
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
29
|
+
default, type = options.values_at :default, :type
|
30
|
+
set_default key, default if default
|
31
|
+
send :"define_#{type || :string}_writer", key
|
32
|
+
rescue NoMethodError
|
33
|
+
raise ArgumentError, "type #{type} isn't supported"
|
31
34
|
end
|
32
35
|
|
33
36
|
def key_accessor(*arguments)
|
@@ -35,6 +38,56 @@ module CouchModel
|
|
35
38
|
key_writer *arguments
|
36
39
|
end
|
37
40
|
|
41
|
+
private
|
42
|
+
|
43
|
+
def define_integer_reader(name)
|
44
|
+
define_method :"#{name}" do
|
45
|
+
@attributes[name.to_s].to_i
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def define_integer_writer(name)
|
50
|
+
define_method :"#{name}=" do |value|
|
51
|
+
@attributes[name.to_s] = value.to_i
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def define_string_reader(name)
|
56
|
+
define_method :"#{name}" do
|
57
|
+
@attributes[name.to_s]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def define_string_writer(name)
|
62
|
+
define_method :"#{name}=" do |value|
|
63
|
+
@attributes[name.to_s] = value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def define_date_reader(name)
|
68
|
+
define_method :"#{name}" do
|
69
|
+
Date.parse @attributes[name.to_s]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def define_date_writer(name)
|
74
|
+
define_method :"#{name}=" do |value|
|
75
|
+
@attributes[name.to_s] = value.to_s
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def define_time_reader(name)
|
80
|
+
define_method :"#{name}" do
|
81
|
+
Time.parse @attributes[name.to_s]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def define_time_writer(name)
|
86
|
+
define_method :"#{name}=" do |value|
|
87
|
+
@attributes[name.to_s] = value.strftime("%Y-%m-%d %H:%M:%S %z")
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
38
91
|
end
|
39
92
|
|
40
93
|
end
|
@@ -31,8 +31,8 @@ describe "integration" do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should use the selector" do
|
34
|
-
@user_one.memberships("
|
35
|
-
@user_one.memberships("
|
34
|
+
@user_one.memberships(Time.parse("2010-07-07").strftime("%Y-%m-%d %H:%M:%S %z")).should include(@membership_one)
|
35
|
+
@user_one.memberships(Time.parse("2010-07-08").strftime("%Y-%m-%d %H:%M:%S %z")).should_not include(@membership_one)
|
36
36
|
end
|
37
37
|
|
38
38
|
end
|
data/spec/integration/models.rb
CHANGED
@@ -15,6 +15,7 @@ class User < CouchModel::Base
|
|
15
15
|
|
16
16
|
key_accessor :username
|
17
17
|
key_accessor :email, :default => "no email"
|
18
|
+
key_accessor :birthday, :type => :date
|
18
19
|
|
19
20
|
has_many :memberships,
|
20
21
|
:class_name => "Membership",
|
@@ -27,15 +28,15 @@ class Membership < CouchModel::Base
|
|
27
28
|
|
28
29
|
setup_database DATABASE
|
29
30
|
|
30
|
-
key_accessor :created_at
|
31
|
+
key_accessor :created_at, :type => :time
|
31
32
|
|
32
33
|
belongs_to :user, :class_name => "User"
|
33
34
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def create_users_and_memberships
|
37
|
-
@user_one = User.create :username => "user one"
|
38
|
-
@user_two = User.create :username => "user two"
|
39
|
-
@membership_one = Membership.create :created_at => "
|
40
|
-
@membership_two = Membership.create :created_at => "
|
38
|
+
@user_one = User.create :username => "user one", :birthday => Date.parse("2000-07-07")
|
39
|
+
@user_two = User.create :username => "user two", :birthday => Date.parse("2000-07-07")
|
40
|
+
@membership_one = Membership.create :created_at => Time.parse("2010-07-07"), :user => @user_one
|
41
|
+
@membership_two = Membership.create :created_at => Time.parse("2010-07-07"), :user => @user_two
|
41
42
|
end
|
@@ -50,12 +50,7 @@ describe "integration" do
|
|
50
50
|
describe "all" do
|
51
51
|
|
52
52
|
it "should include the saved user" do
|
53
|
-
|
54
|
-
User.all.should include(@user_one)
|
55
|
-
rescue Object => error
|
56
|
-
puts error.backtrace
|
57
|
-
raise error
|
58
|
-
end
|
53
|
+
User.all.should include(@user_one)
|
59
54
|
User.all.should include(@user_two)
|
60
55
|
end
|
61
56
|
|
@@ -73,4 +68,14 @@ describe "integration" do
|
|
73
68
|
|
74
69
|
end
|
75
70
|
|
71
|
+
describe "birthday" do
|
72
|
+
|
73
|
+
it "should return a time" do
|
74
|
+
@user_one.birthday.should be_instance_of(Date)
|
75
|
+
user = User.find @user_one.id
|
76
|
+
user.birthday.should be_instance_of(Date)
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
76
81
|
end
|
@@ -8,6 +8,12 @@ class AccessorTestModel < CouchModel::Base
|
|
8
8
|
key_reader :test_one, :default => "test default"
|
9
9
|
key_writer :test_two, :default => "test default"
|
10
10
|
key_accessor :test_three, :default => "test default"
|
11
|
+
|
12
|
+
key_accessor :test_integer, :type => :integer
|
13
|
+
key_accessor :test_string, :type => :string
|
14
|
+
key_accessor :test_date, :type => :date
|
15
|
+
key_accessor :test_time, :type => :time
|
16
|
+
|
11
17
|
end
|
12
18
|
|
13
19
|
describe AccessorTestModel do
|
@@ -30,7 +36,33 @@ describe AccessorTestModel do
|
|
30
36
|
@model.test_one.should == "test default"
|
31
37
|
end
|
32
38
|
|
33
|
-
it "should raise an
|
39
|
+
it "should raise an ArgumentError on unsupported type" do
|
40
|
+
lambda do
|
41
|
+
AccessorTestModel.key_reader :test, :type => :unsupported
|
42
|
+
end.should raise_error(ArgumentError)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should define readers for integer types" do
|
46
|
+
@model.test_integer = 3
|
47
|
+
@model.test_integer.should be_instance_of(Fixnum)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should define readers for string types" do
|
51
|
+
@model.test_string = "3"
|
52
|
+
@model.test_string.should be_instance_of(String)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should define readers for date types" do
|
56
|
+
@model.test_date = Date.today
|
57
|
+
@model.test_date.should be_instance_of(Date)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should define readers for time types" do
|
61
|
+
@model.test_time = Time.now
|
62
|
+
@model.test_time.should be_instance_of(Time)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should raise an ArgumentError if the reader method is already defined" do
|
34
66
|
lambda do
|
35
67
|
AccessorTestModel.key_reader :test_one
|
36
68
|
end.should raise_error(ArgumentError)
|
@@ -52,6 +84,32 @@ describe AccessorTestModel do
|
|
52
84
|
AccessorTestModel.defaults["test_two"].should == "test default"
|
53
85
|
end
|
54
86
|
|
87
|
+
it "should raise an ArgumentError on unsupported type" do
|
88
|
+
lambda do
|
89
|
+
AccessorTestModel.key_writer :test, :type => :unsupported
|
90
|
+
end.should raise_error(ArgumentError)
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should define writers for integer types" do
|
94
|
+
@model.test_integer = 3
|
95
|
+
@model.attributes["test_integer"].should == 3
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should define writers for string types" do
|
99
|
+
@model.test_string = "3"
|
100
|
+
@model.attributes["test_string"].should == "3"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should define writers for date types" do
|
104
|
+
@model.test_date = Date.parse("2010-07-07")
|
105
|
+
@model.attributes["test_date"].should == "2010-07-07"
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should define writers for time types" do
|
109
|
+
@model.test_time = Time.parse("2010-07-07 10:10:10")
|
110
|
+
@model.attributes["test_time"].should == "2010-07-07 10:10:10 +0200"
|
111
|
+
end
|
112
|
+
|
55
113
|
it "should raise an exception if the writer method is already defined" do
|
56
114
|
lambda do
|
57
115
|
AccessorTestModel.key_writer :test_two
|
@@ -76,4 +134,4 @@ describe AccessorTestModel do
|
|
76
134
|
|
77
135
|
end
|
78
136
|
|
79
|
-
end
|
137
|
+
end
|
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
|
+
- 3
|
9
|
+
version: 0.1.3
|
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-
|
17
|
+
date: 2010-07-09 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|