rufus-doric 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +6 -0
- data/TODO.txt +3 -3
- data/lib/rufus/doric/model.rb +67 -8
- data/lib/rufus/doric/version.rb +1 -1
- data/rufus-doric.gemspec +1 -1
- data/test/ut_11_model_view_range.rb +9 -6
- data/test/ut_16_model_custom_view.rb +8 -3
- metadata +2 -2
data/CHANGELOG.txt
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
= rufus-doric CHANGELOG.txt
|
3
3
|
|
4
4
|
|
5
|
+
== rufus-doric - 0.1.8 released 2010/04/16
|
6
|
+
|
7
|
+
- view_by 'funcname', 'func' creates a 'funcname' method, not a 'by_funcname'
|
8
|
+
- ranges must now be specified with :start[key] and/or :end[key]
|
9
|
+
|
10
|
+
|
5
11
|
== rufus-doric - 0.1.7 released 2010/04/16
|
6
12
|
|
7
13
|
- view_by 'tysec', "emit(doc.type + '__' + doc.security_level, null);"
|
data/TODO.txt
CHANGED
@@ -6,12 +6,12 @@
|
|
6
6
|
[o] all, by : limit and skip (pagination)
|
7
7
|
[o] pagination for everybody in Model (DRY)
|
8
8
|
[o] eventually : pagination for the text index
|
9
|
+
[o] view_by 'name', %{ emit(doc.nada) }
|
10
|
+
[o] start and end key should be by_x(:start => a, :end => b)
|
9
11
|
|
10
12
|
[x] lsof check (jig / patron)
|
11
13
|
|
12
14
|
[ ] eventually : cache the text index
|
13
15
|
|
14
|
-
[ ] view_by '
|
15
|
-
%{ emit(doc.nada) }
|
16
|
-
end
|
16
|
+
[ ] view_by 'x', 'emit' ==> view 'x', 'emit' ==> Model.x(key)...
|
17
17
|
|
data/lib/rufus/doric/model.rb
CHANGED
@@ -103,6 +103,49 @@ module Doric
|
|
103
103
|
@_id_field
|
104
104
|
end
|
105
105
|
|
106
|
+
# Creates a by_{key} method.
|
107
|
+
#
|
108
|
+
# If a func (a String) is passed, a {key} method is created that
|
109
|
+
# uses the given view function fragment.
|
110
|
+
#
|
111
|
+
# == example
|
112
|
+
#
|
113
|
+
# class Task < Rufus::Doric::Model
|
114
|
+
#
|
115
|
+
# property :user
|
116
|
+
# property :status
|
117
|
+
# property :date_terminated
|
118
|
+
#
|
119
|
+
# view_by :user
|
120
|
+
#
|
121
|
+
# view_by 'open_tasks', %{
|
122
|
+
# if (doc.date_terminated) return;
|
123
|
+
# if (doc.status == 'suspended') return;
|
124
|
+
# emit(doc.user, null);
|
125
|
+
# }
|
126
|
+
# end
|
127
|
+
#
|
128
|
+
# will thus have a by_user method and a open_tasks method
|
129
|
+
#
|
130
|
+
# Task.by_user('john')
|
131
|
+
# # lists all the tasks for the user 'john'
|
132
|
+
#
|
133
|
+
# Task.open_tasks('john')
|
134
|
+
# # lists all the open tasks for the user 'john'
|
135
|
+
#
|
136
|
+
# Task.open_tasks('john', :skip => 5, :limit => 10)
|
137
|
+
# # lists 10 open tasks for the user 'john' (skipping the first 5)
|
138
|
+
#
|
139
|
+
# == options
|
140
|
+
#
|
141
|
+
# The methods generated by view_by support the following options :
|
142
|
+
#
|
143
|
+
# :limit, :skip, :inclusive_end, :descending, :start[key], :end[key]
|
144
|
+
#
|
145
|
+
# See http://wiki.apache.org/couchdb/HTTP_view_API#Querying_Options
|
146
|
+
#
|
147
|
+
# The all method supports the same options.
|
148
|
+
#
|
106
149
|
def self.view_by (key, func=nil)
|
107
150
|
|
108
151
|
if func
|
@@ -110,7 +153,7 @@ module Doric
|
|
110
153
|
k = { key => func }
|
111
154
|
|
112
155
|
instance_eval %{
|
113
|
-
def
|
156
|
+
def #{key} (val, opts={})
|
114
157
|
by(#{k.inspect}, val, opts)
|
115
158
|
end
|
116
159
|
}
|
@@ -534,20 +577,36 @@ module Doric
|
|
534
577
|
result['rows'].collect { |r| r['doc'] }
|
535
578
|
end
|
536
579
|
|
537
|
-
|
580
|
+
# A helper method for .by
|
581
|
+
#
|
582
|
+
def self.is_option_hash (h)
|
538
583
|
|
539
|
-
|
584
|
+
return false unless h.is_a?(Hash)
|
585
|
+
h.keys.each { |k| return false unless k.is_a?(Symbol) }
|
586
|
+
true
|
587
|
+
end
|
540
588
|
|
541
|
-
|
589
|
+
# view_by uses this .by method in the background
|
590
|
+
#
|
591
|
+
def self.by (key, val, opts={})
|
542
592
|
|
543
|
-
|
544
|
-
qs << "startkey=#{Rufus::Doric.escape(st)}" if st
|
545
|
-
qs << "endkey=#{Rufus::Doric.escape(en)}" if en
|
546
|
-
else
|
593
|
+
#p [ key, val, opts ]
|
547
594
|
|
595
|
+
qs = [ 'include_docs=true' ]
|
596
|
+
|
597
|
+
if is_option_hash(val)
|
598
|
+
opts = val
|
599
|
+
else
|
548
600
|
qs << "key=#{Rufus::Doric.escape(val)}"
|
549
601
|
end
|
550
602
|
|
603
|
+
if st = opts[:start] || opts[:startkey]
|
604
|
+
qs << "startkey=#{Rufus::Doric.escape(st)}"
|
605
|
+
end
|
606
|
+
if en = opts[:end] || opts[:endkey]
|
607
|
+
qs << "endkey=#{Rufus::Doric.escape(en)}"
|
608
|
+
end
|
609
|
+
|
551
610
|
add_common_options(qs, opts)
|
552
611
|
|
553
612
|
skey = case key
|
data/lib/rufus/doric/version.rb
CHANGED
data/rufus-doric.gemspec
CHANGED
@@ -50,18 +50,21 @@ class UtModelViewRangeTest < Test::Unit::TestCase
|
|
50
50
|
|
51
51
|
assert_equal(
|
52
52
|
%w[ climbing drinking ],
|
53
|
-
Schedule.by_day(
|
53
|
+
Schedule.by_day(:start => '20101226').collect { |s| s.name })
|
54
54
|
assert_equal(
|
55
55
|
%w[ climbing drinking ],
|
56
|
-
Schedule.by_day(
|
56
|
+
Schedule.by_day(:start => '20101226', :end => nil).collect { |s| s.name })
|
57
57
|
|
58
58
|
assert_equal(
|
59
59
|
%w[ shopping wrestling cooking ],
|
60
|
-
Schedule.by_day(
|
60
|
+
Schedule.by_day(:end => '20101225').collect { |s| s.name })
|
61
|
+
assert_equal(
|
62
|
+
%w[ shopping wrestling cooking ],
|
63
|
+
Schedule.by_day(:start => nil, :end => '20101225').collect { |s| s.name })
|
61
64
|
|
62
65
|
assert_equal(
|
63
66
|
%w[ drinking climbing cooking ],
|
64
|
-
Schedule.by_day(
|
67
|
+
Schedule.by_day(:end => '20101225', :descending => true).collect { |s| s.name })
|
65
68
|
end
|
66
69
|
|
67
70
|
def test_view_limit
|
@@ -72,10 +75,10 @@ class UtModelViewRangeTest < Test::Unit::TestCase
|
|
72
75
|
|
73
76
|
assert_equal(
|
74
77
|
%w[ climbing ],
|
75
|
-
Schedule.by_day(
|
78
|
+
Schedule.by_day(:start => '20101226', :limit => 1).collect { |s| s.name })
|
76
79
|
assert_equal(
|
77
80
|
%w[ drinking ],
|
78
|
-
Schedule.by_day(
|
81
|
+
Schedule.by_day(:start => '20101226', :skip => 1).collect { |s| s.name })
|
79
82
|
end
|
80
83
|
|
81
84
|
def test_all_opts
|
@@ -22,6 +22,9 @@ class Team < Rufus::Doric::Model
|
|
22
22
|
view_by 'tysec', %{
|
23
23
|
emit(doc.type + '__' + doc.security_level, null);
|
24
24
|
}
|
25
|
+
view_by 'tysec2', %{
|
26
|
+
emit([ doc.type, doc.security_level ], null);
|
27
|
+
}
|
25
28
|
end
|
26
29
|
|
27
30
|
|
@@ -40,7 +43,7 @@ class UtModelCustomViewTest < Test::Unit::TestCase
|
|
40
43
|
#def teardown
|
41
44
|
#end
|
42
45
|
|
43
|
-
def
|
46
|
+
def test_views
|
44
47
|
|
45
48
|
Team.new(
|
46
49
|
'type' => 'rifle',
|
@@ -63,8 +66,10 @@ class UtModelCustomViewTest < Test::Unit::TestCase
|
|
63
66
|
'security_level' => 'c'
|
64
67
|
).save!
|
65
68
|
|
66
|
-
assert_equal 2, Team.
|
67
|
-
assert_equal 1, Team.
|
69
|
+
assert_equal 2, Team.tysec('rifle__a').size
|
70
|
+
assert_equal 1, Team.tysec('rifle__b').size
|
71
|
+
|
72
|
+
assert_equal 2, Team.tysec2(%w[ rifle a ]).size
|
68
73
|
end
|
69
74
|
end
|
70
75
|
|