hanswurst 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +13 -1
- data/VERSION +1 -1
- data/lib/hanswurst.rb +31 -31
- data/test/test_hanswurst.rb +35 -15
- metadata +23 -23
data/README.md
CHANGED
@@ -5,7 +5,19 @@ Hanswurst is a library that uses couch potato to create arbitrary
|
|
5
5
|
objects that may have different roles. The roles determine the
|
6
6
|
properties and they can be mixed and matched at will.
|
7
7
|
|
8
|
-
|
8
|
+
|
9
|
+
Installation
|
10
|
+
------------
|
11
|
+
_hanswurst_ is only tested with ruby 1.9.2 and above.
|
12
|
+
|
13
|
+
Install it as a gem:
|
14
|
+
|
15
|
+
sudo gem install hanswurst
|
16
|
+
|
17
|
+
or in rvm:
|
18
|
+
|
19
|
+
gem install hanswurst
|
20
|
+
|
9
21
|
|
10
22
|
Example:
|
11
23
|
--------
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/hanswurst.rb
CHANGED
@@ -44,7 +44,7 @@ class Hanswurst
|
|
44
44
|
errors = @value.errors.messages.collect do |field, err|
|
45
45
|
"#{field} #{err.join('/')}"
|
46
46
|
end.join(" # ")
|
47
|
-
"role not valid
|
47
|
+
"#{@role} not valid: #{errors}"
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -61,7 +61,7 @@ class Hanswurst
|
|
61
61
|
# I keep this commented out to inform the reader that we don't want this in order to easily reuse general lists
|
62
62
|
#options[:list] &&= :"#{role_alias}_#{options[:list]}"
|
63
63
|
options[:conditions] &&= " && ( #{options[:conditions]} )"
|
64
|
-
options[:conditions] = "(doc.
|
64
|
+
options[:conditions] = "(doc.hanswurst_roles.#{role_alias} !== undefined)#{options[:conditions]}"
|
65
65
|
self.view :"#{role_alias}_#{viewname}", options
|
66
66
|
end
|
67
67
|
|
@@ -106,12 +106,12 @@ class Hanswurst
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
-
property :
|
110
|
-
property :
|
109
|
+
property :hanswurst_roles
|
110
|
+
property :hanswurst_data
|
111
111
|
|
112
112
|
# check if every role is valid before saving
|
113
113
|
before_save do
|
114
|
-
self.
|
114
|
+
self.hanswurst_data.each do |role,val|
|
115
115
|
unless val.valid?
|
116
116
|
raise RoleNotValid.new(role, val)
|
117
117
|
end
|
@@ -145,33 +145,33 @@ class Hanswurst
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
# add more
|
148
|
+
# add more hanswurst_roles at once
|
149
149
|
def add_roles(hsh)
|
150
|
-
self.
|
151
|
-
self.
|
150
|
+
self.hanswurst_data ||= {}
|
151
|
+
self.hanswurst_roles ||= {}
|
152
152
|
hsh.each do |role,klass|
|
153
153
|
raise "class expected: #{klass.inspect}" unless klass.is_a? Class
|
154
154
|
handle_dependancies(role, klass)
|
155
155
|
handle_shared(role, klass)
|
156
|
-
self.
|
156
|
+
self.hanswurst_roles.update role.to_s => klass.name
|
157
157
|
end
|
158
|
-
self.
|
158
|
+
self.hanswurst_roles
|
159
159
|
end
|
160
160
|
|
161
161
|
# does he have a role
|
162
162
|
def role_exists?(role)
|
163
|
-
self.
|
163
|
+
self.hanswurst_roles and self.hanswurst_roles[role.to_s]
|
164
164
|
end
|
165
165
|
|
166
|
-
# does he have
|
167
|
-
def
|
168
|
-
self.
|
166
|
+
# does he have hanswurst_data for the role
|
167
|
+
def hanswurst_data_exists?(role)
|
168
|
+
self.hanswurst_data and self.hanswurst_data[role.to_s]
|
169
169
|
end
|
170
170
|
|
171
171
|
# set a property of a role
|
172
172
|
def set_property(role, property, value)
|
173
173
|
return unless role_exists? role
|
174
|
-
create(role) unless
|
174
|
+
create(role) unless hanswurst_data_exists? role
|
175
175
|
update role, property, value
|
176
176
|
end
|
177
177
|
|
@@ -182,46 +182,46 @@ class Hanswurst
|
|
182
182
|
|
183
183
|
# delete a role
|
184
184
|
def delete_role(role)
|
185
|
-
delete role # delete the
|
186
|
-
self.
|
185
|
+
delete role # delete the hanswurst_data
|
186
|
+
self.hanswurst_roles.delete role.to_s # and the role itself
|
187
187
|
end
|
188
188
|
|
189
189
|
# set instance for a role
|
190
190
|
def set(role, val)
|
191
|
-
self.
|
192
|
-
self.
|
191
|
+
self.hanswurst_data ||= {}
|
192
|
+
self.hanswurst_data.update role.to_s => val
|
193
193
|
end
|
194
194
|
|
195
195
|
# create a new instance of a role
|
196
196
|
def create(role)
|
197
197
|
raise "unknown role #{role.inspect}" unless role_exists? role.to_s
|
198
|
-
self.
|
199
|
-
self.
|
198
|
+
self.hanswurst_data ||= {}
|
199
|
+
self.hanswurst_data[role.to_s] = self.class.getClass(self.hanswurst_roles[role.to_s]).new
|
200
200
|
end
|
201
201
|
|
202
202
|
# delete a role
|
203
203
|
def delete(role)
|
204
|
-
self.
|
205
|
-
hsh = self.
|
204
|
+
self.hanswurst_data ||= {}
|
205
|
+
hsh = self.hanswurst_data
|
206
206
|
hsh.delete(role.to_s)
|
207
|
-
self.
|
208
|
-
self.
|
207
|
+
self.hanswurst_data = {} # we have to do this, otherwise it won't save?!
|
208
|
+
self.hanswurst_data = hsh
|
209
209
|
end
|
210
210
|
|
211
211
|
# read a property of a role
|
212
212
|
def read(role, property)
|
213
|
-
return self.
|
213
|
+
return self.hanswurst_data[role.to_s].send(property.to_sym) if hanswurst_data_exists?(role.to_s)
|
214
214
|
nil
|
215
215
|
end
|
216
216
|
|
217
217
|
# update a property of a role
|
218
218
|
# we have to use this method in order to make sure that everything is saved
|
219
219
|
def update(role, property, value)
|
220
|
-
if
|
221
|
-
self.
|
222
|
-
hsh = self.
|
223
|
-
self.
|
224
|
-
self.
|
220
|
+
if hanswurst_data_exists? role
|
221
|
+
self.hanswurst_data[role.to_s].send(:"#{property}=", value)
|
222
|
+
hsh = self.hanswurst_data.merge(role.to_s => self.hanswurst_data[role.to_s])
|
223
|
+
self.hanswurst_data = {} # we have to do this, otherwise it won't save?!
|
224
|
+
self.hanswurst_data = hsh
|
225
225
|
end
|
226
226
|
end
|
227
227
|
end
|
data/test/test_hanswurst.rb
CHANGED
@@ -45,15 +45,24 @@ class E
|
|
45
45
|
property :e
|
46
46
|
end
|
47
47
|
|
48
|
+
|
49
|
+
class F
|
50
|
+
include CouchPotato::Persistence
|
51
|
+
include Hanswurst::Depends
|
52
|
+
|
53
|
+
depends_on 'd', D
|
54
|
+
property :f
|
55
|
+
|
56
|
+
end
|
48
57
|
Hanswurst.list_for :pers, :complete_name, %q|
|
49
58
|
function(head, req) {
|
50
59
|
var row;
|
51
60
|
var rows = [];
|
52
61
|
send('{"rows": ');
|
53
62
|
while(row = getRow()) {
|
54
|
-
row.doc.
|
55
|
-
if(req.query["startkey_docid"] && row.doc.
|
56
|
-
row.doc.
|
63
|
+
row.doc.hanswurst_data.q = req.query;
|
64
|
+
if(req.query["startkey_docid"] && row.doc.hanswurst_data.pers.firstname == req.query["startkey_docid"]){
|
65
|
+
row.doc.hanswurst_data.pers.complete_name = row.doc.hanswurst_data.pers.firstname + ' ' + row.doc.hanswurst_data.pers.lastname;
|
57
66
|
rows[rows.length] = row;
|
58
67
|
}
|
59
68
|
};
|
@@ -107,14 +116,14 @@ class TestCouch < Test::Unit::TestCase
|
|
107
116
|
o.person = Pers.new( :firstname => 'Donald', :lastname => 'Duck' )
|
108
117
|
save o
|
109
118
|
o = load(o._id)
|
110
|
-
|
111
|
-
assert_equal
|
112
|
-
assert_equal 'prod1', o.
|
113
|
-
assert_equal 'Donald', o.
|
119
|
+
hanswurst_roles = {'person' => 'Pers', 'product' => 'Prod'}
|
120
|
+
assert_equal hanswurst_roles, o.hanswurst_roles
|
121
|
+
assert_equal 'prod1', o.hanswurst_data["product"].name
|
122
|
+
assert_equal 'Donald', o.hanswurst_data["person"].firstname
|
114
123
|
assert_equal 'Donald', o.person___firstname
|
115
124
|
end
|
116
125
|
|
117
|
-
should "save
|
126
|
+
should "save hanswurst_roles" do
|
118
127
|
o = Hanswurst.new
|
119
128
|
o.add_role 'person', Pers
|
120
129
|
o.add_role 'product', Prod
|
@@ -124,8 +133,8 @@ class TestCouch < Test::Unit::TestCase
|
|
124
133
|
o.person___lastname = "Bunny"
|
125
134
|
save o
|
126
135
|
o = load(o._id)
|
127
|
-
|
128
|
-
assert_equal
|
136
|
+
hanswurst_roles = {'person' => 'Pers', 'product' => 'Prod'}
|
137
|
+
assert_equal hanswurst_roles, o.hanswurst_roles
|
129
138
|
assert_equal 'Bugs', o.person___firstname
|
130
139
|
assert_equal 'Bunny', o.person___lastname
|
131
140
|
assert_equal 'abc', o.product___article_number
|
@@ -141,7 +150,7 @@ class TestCouch < Test::Unit::TestCase
|
|
141
150
|
save o
|
142
151
|
o = load(o._id)
|
143
152
|
assert_equal nil, o.product___name
|
144
|
-
assert !o.
|
153
|
+
assert !o.hanswurst_roles.has_key?("product")
|
145
154
|
assert_equal 'Bugs', o.person___firstname
|
146
155
|
assert_equal nil, o.product___article_number
|
147
156
|
end
|
@@ -152,8 +161,8 @@ class TestCouch < Test::Unit::TestCase
|
|
152
161
|
o.thing___a = "hiho"
|
153
162
|
save o
|
154
163
|
o = load(o._id)
|
155
|
-
|
156
|
-
assert_equal
|
164
|
+
hanswurst_roles = {'thing' => 'Thing::A'}
|
165
|
+
assert_equal hanswurst_roles, o.hanswurst_roles
|
157
166
|
assert_equal 'hiho', o.thing___a
|
158
167
|
end
|
159
168
|
|
@@ -176,8 +185,8 @@ class TestCouch < Test::Unit::TestCase
|
|
176
185
|
a.add_role 'pers', Pers
|
177
186
|
a.pers = Pers.new :firstname => "Mickey", :lastname => "Mouse"
|
178
187
|
save a
|
179
|
-
assert_equal "Donald Duck", view(Hanswurst.pers_all_names(:startkey_docid => "Donald")).first.
|
180
|
-
assert_equal "Donald", view(Hanswurst.pers_all_names(:startkey_docid => "Donald")).first.
|
188
|
+
assert_equal "Donald Duck", view(Hanswurst.pers_all_names(:startkey_docid => "Donald")).first.hanswurst_data["pers"].complete_name
|
189
|
+
assert_equal "Donald", view(Hanswurst.pers_all_names(:startkey_docid => "Donald")).first.hanswurst_data["pers"].firstname
|
181
190
|
end
|
182
191
|
|
183
192
|
should "create dependancies based on definitions" do
|
@@ -213,6 +222,17 @@ class TestCouch < Test::Unit::TestCase
|
|
213
222
|
assert_equal "4AD", o.do___e
|
214
223
|
assert_equal "Duck", o.person___lastname
|
215
224
|
end
|
225
|
+
|
226
|
+
should "create shared dependancies based on definitions" do
|
227
|
+
o = Hanswurst.new
|
228
|
+
o.add_role 'fff', F
|
229
|
+
o.fff___f = "FFF"
|
230
|
+
o.fff__d__person___lastname = "Duck"
|
231
|
+
save o
|
232
|
+
q = load(o._id)
|
233
|
+
assert_equal "FFF", q.fff___f
|
234
|
+
assert_equal "Duck", q.fff__d__person___lastname
|
235
|
+
end
|
216
236
|
end
|
217
237
|
|
218
238
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanswurst
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-01-
|
12
|
+
date: 2012-01-14 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: couch_potato
|
16
|
-
requirement: &
|
16
|
+
requirement: &15343840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *15343840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: yard
|
27
|
-
requirement: &
|
27
|
+
requirement: &15343060 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.6.0
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *15343060
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &15342300 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *15342300
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &15341560 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.5.2
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *15341560
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rcov
|
60
|
-
requirement: &
|
60
|
+
requirement: &15340960 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *15340960
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: mocha
|
71
|
-
requirement: &
|
71
|
+
requirement: &15340260 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *15340260
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: shoulda
|
82
|
-
requirement: &
|
82
|
+
requirement: &15339560 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,10 +87,10 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *15339560
|
91
91
|
- !ruby/object:Gem::Dependency
|
92
92
|
name: linecache19
|
93
|
-
requirement: &
|
93
|
+
requirement: &15322280 !ruby/object:Gem::Requirement
|
94
94
|
none: false
|
95
95
|
requirements:
|
96
96
|
- - ! '>='
|
@@ -98,10 +98,10 @@ dependencies:
|
|
98
98
|
version: '0'
|
99
99
|
type: :development
|
100
100
|
prerelease: false
|
101
|
-
version_requirements: *
|
101
|
+
version_requirements: *15322280
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: ruby-debug19
|
104
|
-
requirement: &
|
104
|
+
requirement: &15321680 !ruby/object:Gem::Requirement
|
105
105
|
none: false
|
106
106
|
requirements:
|
107
107
|
- - ! '>='
|
@@ -109,10 +109,10 @@ dependencies:
|
|
109
109
|
version: '0'
|
110
110
|
type: :development
|
111
111
|
prerelease: false
|
112
|
-
version_requirements: *
|
112
|
+
version_requirements: *15321680
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
114
|
name: couch_potato
|
115
|
-
requirement: &
|
115
|
+
requirement: &15321080 !ruby/object:Gem::Requirement
|
116
116
|
none: false
|
117
117
|
requirements:
|
118
118
|
- - ! '>='
|
@@ -120,7 +120,7 @@ dependencies:
|
|
120
120
|
version: '0'
|
121
121
|
type: :runtime
|
122
122
|
prerelease: false
|
123
|
-
version_requirements: *
|
123
|
+
version_requirements: *15321080
|
124
124
|
description: flexible enhancement of couch potato
|
125
125
|
email: ! 'Base64.decode64(''bGludXhAbWFyY3JlbmVhcm5zLmRl
|
126
126
|
|
@@ -155,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
155
155
|
version: '0'
|
156
156
|
segments:
|
157
157
|
- 0
|
158
|
-
hash:
|
158
|
+
hash: -2504078645592477714
|
159
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
160
|
none: false
|
161
161
|
requirements:
|