hanswurst 0.3.0 → 0.4.0
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.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:
|