rufus-doric 0.1.13 → 0.1.14
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/CHANGELOG.txt +5 -0
- data/lib/rufus/doric/model.rb +39 -15
- data/lib/rufus/doric/version.rb +1 -1
- data/rufus-doric.gemspec +3 -2
- data/test/ut_16_model_custom_view.rb +26 -0
- data/test/ut_18_model_map_reduce.rb +65 -0
- data/test/ut_1_model.rb +9 -0
- metadata +4 -3
data/CHANGELOG.txt
CHANGED
data/lib/rufus/doric/model.rb
CHANGED
@@ -160,11 +160,11 @@ module Doric
|
|
160
160
|
#
|
161
161
|
# The all method supports the same options.
|
162
162
|
#
|
163
|
-
def self.view_by (key,
|
163
|
+
def self.view_by (key, map=nil, reduce=nil)
|
164
164
|
|
165
|
-
if
|
165
|
+
if map
|
166
166
|
|
167
|
-
k = { key =>
|
167
|
+
k = { :view => key, :map => map, :reduce => reduce }
|
168
168
|
|
169
169
|
instance_eval %{
|
170
170
|
def by_#{key} (val, opts={})
|
@@ -581,13 +581,22 @@ module Doric
|
|
581
581
|
"#{self.class.doric_type}__#{s}"
|
582
582
|
end
|
583
583
|
|
584
|
-
def self.func (body)
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
584
|
+
def self.func (body, type=:map)
|
585
|
+
|
586
|
+
if type == :map
|
587
|
+
%{
|
588
|
+
function (doc) {
|
589
|
+
if (doc.doric_type != '#{@doric_type}') return;
|
590
|
+
#{body}
|
591
|
+
}
|
589
592
|
}
|
590
|
-
|
593
|
+
else
|
594
|
+
%{
|
595
|
+
function (keys, values, rereduce) {
|
596
|
+
#{body}
|
597
|
+
}
|
598
|
+
}
|
599
|
+
end
|
591
600
|
end
|
592
601
|
|
593
602
|
def self.put_design_doc (key=nil)
|
@@ -626,9 +635,15 @@ module Doric
|
|
626
635
|
|
627
636
|
elsif key.is_a?(Hash)
|
628
637
|
|
629
|
-
|
630
|
-
|
631
|
-
|
638
|
+
h = {}
|
639
|
+
|
640
|
+
h['map'] = func(key[:map])
|
641
|
+
|
642
|
+
if red = key[:reduce]
|
643
|
+
h['reduce'] = func(red, :reduce)
|
644
|
+
end
|
645
|
+
|
646
|
+
ddoc['views']["by_#{key[:view]}"] = h
|
632
647
|
|
633
648
|
elsif key.is_a?(Array)
|
634
649
|
|
@@ -697,7 +712,9 @@ module Doric
|
|
697
712
|
|
698
713
|
#p [ key, val, opts ]
|
699
714
|
|
700
|
-
|
715
|
+
reduce = key.is_a?(Hash) && key[:reduce]
|
716
|
+
|
717
|
+
qs = reduce ? [] : [ 'include_docs=true' ]
|
701
718
|
|
702
719
|
if is_option_hash(val)
|
703
720
|
opts = val
|
@@ -716,7 +733,7 @@ module Doric
|
|
716
733
|
|
717
734
|
skey = case key
|
718
735
|
when Array then key.join('_and_')
|
719
|
-
when Hash then key
|
736
|
+
when Hash then key[:view]
|
720
737
|
else key
|
721
738
|
end
|
722
739
|
|
@@ -724,7 +741,14 @@ module Doric
|
|
724
741
|
|
725
742
|
result = get_result(path, key)
|
726
743
|
|
727
|
-
result['rows']
|
744
|
+
row = result['rows']
|
745
|
+
|
746
|
+
if reduce
|
747
|
+
r = result['rows'].first
|
748
|
+
r ? r['value'] : nil
|
749
|
+
else
|
750
|
+
result['rows'].collect { |r| self.new(r['doc']) }
|
751
|
+
end
|
728
752
|
end
|
729
753
|
|
730
754
|
# Ensures the necessary design_doc is loaded (if first query failed)
|
data/lib/rufus/doric/version.rb
CHANGED
data/rufus-doric.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rufus-doric}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.14"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Mettraux"]
|
12
|
-
s.date = %q{2010-05-
|
12
|
+
s.date = %q{2010-05-22}
|
13
13
|
s.description = %q{
|
14
14
|
something at the intersection of Rails3, CouchDB and rufus-jig
|
15
15
|
}
|
@@ -55,6 +55,7 @@ something at the intersection of Rails3, CouchDB and rufus-jig
|
|
55
55
|
"test/ut_15_model_view_by_and.rb",
|
56
56
|
"test/ut_16_model_custom_view.rb",
|
57
57
|
"test/ut_17_model_and_attachments.rb",
|
58
|
+
"test/ut_18_model_map_reduce.rb",
|
58
59
|
"test/ut_1_model.rb",
|
59
60
|
"test/ut_2_model_view.rb",
|
60
61
|
"test/ut_3_model_lint.rb",
|
@@ -27,6 +27,32 @@ class Team < Rufus::Doric::Model
|
|
27
27
|
}
|
28
28
|
end
|
29
29
|
|
30
|
+
#class City < Rufus::Doric::Model
|
31
|
+
#
|
32
|
+
# db :doric
|
33
|
+
# doric_type :cities
|
34
|
+
#
|
35
|
+
# id_field :name
|
36
|
+
#
|
37
|
+
# h_accessor :name
|
38
|
+
# h_accessor :sister
|
39
|
+
#
|
40
|
+
# view_by 'sister', %{
|
41
|
+
# emit(doc.sister, null);
|
42
|
+
# }
|
43
|
+
#end
|
44
|
+
#
|
45
|
+
# def test_custom_properties_should_not_overwrite_properties
|
46
|
+
#
|
47
|
+
# City.new('name' => 'Zurich', 'sister' => 'Kunming').save!
|
48
|
+
# City.new('name' => 'Yokohama', 'sister' => 'Vancouver').save!
|
49
|
+
# City.new('name' => 'Portland', 'sister' => 'Sapporo').save!
|
50
|
+
# City.new('name' => 'Nara', 'sister' => 'Toledo').save!
|
51
|
+
# City.new('name' => "Xi'an", 'sister' => 'Quebec').save!
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
# keeping for a next round of testing
|
55
|
+
|
30
56
|
|
31
57
|
class UtModelCustomViewTest < Test::Unit::TestCase
|
32
58
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# testing rufus-doric
|
4
|
+
#
|
5
|
+
# Fri May 21 23:41:59 JST 2010
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.join(File.dirname(__FILE__), 'base')
|
9
|
+
|
10
|
+
require 'rufus/doric'
|
11
|
+
|
12
|
+
|
13
|
+
class Auth < Rufus::Doric::Model
|
14
|
+
|
15
|
+
db :doric
|
16
|
+
doric_type :auths
|
17
|
+
|
18
|
+
h_accessor :role
|
19
|
+
h_accessor :user
|
20
|
+
|
21
|
+
view_by 'roles', %{
|
22
|
+
emit(null, doc.role);
|
23
|
+
}, %{
|
24
|
+
// unique ...
|
25
|
+
var a = [];
|
26
|
+
for (var i = 0; i < values.length; i++) {
|
27
|
+
var v = values[i];
|
28
|
+
if (a.indexOf(v) < 0) a.push(v);
|
29
|
+
}
|
30
|
+
return a;
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
class UtModelMapReduceTest < Test::Unit::TestCase
|
36
|
+
|
37
|
+
def setup
|
38
|
+
|
39
|
+
Rufus::Doric.db('doric').delete('.')
|
40
|
+
Rufus::Doric.db('doric').put('.')
|
41
|
+
|
42
|
+
Rufus::Doric.db('doric').http.cache.clear
|
43
|
+
# CouchDB feeds the same etags for views, even after a db has
|
44
|
+
# been deleted and put back, so have to do that 'forgetting'
|
45
|
+
end
|
46
|
+
|
47
|
+
#def teardown
|
48
|
+
#end
|
49
|
+
|
50
|
+
def test_mr
|
51
|
+
|
52
|
+
Auth.new('role' => 'president', 'user' => 'Amedeo').save!
|
53
|
+
Auth.new('role' => 'prime minister', 'user' => 'Claudio').save!
|
54
|
+
Auth.new('role' => 'minister of war', 'user' => 'Sergio').save!
|
55
|
+
Auth.new('role' => 'minister of war', 'user' => 'John').save!
|
56
|
+
|
57
|
+
assert_equal(
|
58
|
+
[ 'president', 'prime minister', 'minister of war' ],
|
59
|
+
Auth.roles(nil))
|
60
|
+
assert_equal(
|
61
|
+
[ 'president', 'prime minister', 'minister of war' ],
|
62
|
+
Auth.by_roles(nil))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/test/ut_1_model.rb
CHANGED
@@ -205,5 +205,14 @@ class UtModelTest < Test::Unit::TestCase
|
|
205
205
|
Thing.find(nil)
|
206
206
|
end
|
207
207
|
end
|
208
|
+
|
209
|
+
def test_various_ids
|
210
|
+
|
211
|
+
Thing.new('name' => "Xi'an").save!
|
212
|
+
assert_not_nil Thing.find("Xi'an")
|
213
|
+
#Thing.all.each do |thing|
|
214
|
+
# p thing
|
215
|
+
#end
|
216
|
+
end
|
208
217
|
end
|
209
218
|
|
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
|
+
- 14
|
9
|
+
version: 0.1.14
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- John Mettraux
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-22 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- test/ut_15_model_view_by_and.rb
|
143
143
|
- test/ut_16_model_custom_view.rb
|
144
144
|
- test/ut_17_model_and_attachments.rb
|
145
|
+
- test/ut_18_model_map_reduce.rb
|
145
146
|
- test/ut_1_model.rb
|
146
147
|
- test/ut_2_model_view.rb
|
147
148
|
- test/ut_3_model_lint.rb
|