runo 0.1.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/LICENSE +19 -0
- data/README.rdoc +120 -0
- data/bin/runo +35 -0
- data/lib/_error.rb +14 -0
- data/lib/_field.rb +260 -0
- data/lib/_i18n.rb +141 -0
- data/lib/_parser.rb +243 -0
- data/lib/_path.rb +86 -0
- data/lib/_storage/_storage.rb +213 -0
- data/lib/_storage/file.rb +200 -0
- data/lib/_storage/sequel.rb +174 -0
- data/lib/_storage/temp.rb +73 -0
- data/lib/_widget/action_create.rb +23 -0
- data/lib/_widget/action_login.rb +22 -0
- data/lib/_widget/action_signup.rb +16 -0
- data/lib/_widget/action_update.rb +16 -0
- data/lib/_widget/crumb.rb +24 -0
- data/lib/_widget/done.rb +16 -0
- data/lib/_widget/login.rb +25 -0
- data/lib/_widget/me.rb +31 -0
- data/lib/_widget/message.rb +51 -0
- data/lib/_widget/navi.rb +88 -0
- data/lib/_widget/submit.rb +49 -0
- data/lib/_widget/view_ym.rb +77 -0
- data/lib/_workflow/_workflow.rb +89 -0
- data/lib/_workflow/attachment.rb +50 -0
- data/lib/_workflow/blog.rb +28 -0
- data/lib/_workflow/contact.rb +23 -0
- data/lib/_workflow/forum.rb +26 -0
- data/lib/_workflow/register.rb +39 -0
- data/lib/meta/_meta.rb +20 -0
- data/lib/meta/group.rb +19 -0
- data/lib/meta/id.rb +59 -0
- data/lib/meta/owner.rb +21 -0
- data/lib/meta/timestamp.rb +118 -0
- data/lib/runo.rb +396 -0
- data/lib/scalar/checkbox.rb +68 -0
- data/lib/scalar/file.rb +144 -0
- data/lib/scalar/img.rb +112 -0
- data/lib/scalar/password.rb +58 -0
- data/lib/scalar/radio.rb +47 -0
- data/lib/scalar/select.rb +47 -0
- data/lib/scalar/text.rb +38 -0
- data/lib/scalar/textarea.rb +35 -0
- data/lib/scalar/textarea_pre.rb +14 -0
- data/lib/scalar/textarea_wiki.rb +173 -0
- data/lib/set/_set.rb +195 -0
- data/lib/set/dynamic.rb +177 -0
- data/lib/set/static.rb +102 -0
- data/lib/set/static_folder.rb +96 -0
- data/locale/en/index.po +242 -0
- data/locale/index.pot +243 -0
- data/locale/ja/index.po +242 -0
- data/locale/lazy_parser.rb +54 -0
- data/skel/config.ru +27 -0
- data/skel/skin/_users/00000000_frank-avatar.jpg +0 -0
- data/skel/skin/_users/00000000_frank-avatar_small.jpg +0 -0
- data/skel/skin/_users/00000000_frank.yaml +12 -0
- data/skel/skin/_users/00000000_root-avatar.jpg +0 -0
- data/skel/skin/_users/00000000_root-avatar_small.jpg +0 -0
- data/skel/skin/_users/00000000_root.yaml +11 -0
- data/skel/skin/_users/css/users.css +21 -0
- data/skel/skin/_users/css/users.less +25 -0
- data/skel/skin/_users/done.html +42 -0
- data/skel/skin/_users/index.html +46 -0
- data/skel/skin/_users/index.yaml +3 -0
- data/skel/skin/_users/summary.html +40 -0
- data/skel/skin/css/base.css +93 -0
- data/skel/skin/css/base.less +139 -0
- data/skel/skin/css/coax.css +199 -0
- data/skel/skin/css/coax.less +244 -0
- data/skel/skin/examples/blog/20091214_0001.yaml +8 -0
- data/skel/skin/examples/blog/20100630_0001.yaml +8 -0
- data/skel/skin/examples/blog/20100630_0002.yaml +14 -0
- data/skel/skin/examples/blog/20100701_0001.yaml +8 -0
- data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg +0 -0
- data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg +0 -0
- data/skel/skin/examples/blog/20100701_0002.yaml +19 -0
- data/skel/skin/examples/blog/frank/20100701_0001.yaml +10 -0
- data/skel/skin/examples/blog/frank/index.yaml +4 -0
- data/skel/skin/examples/blog/index.html +51 -0
- data/skel/skin/examples/blog/rss.xml +18 -0
- data/skel/skin/examples/contact/20100701_0001-file.txt +1 -0
- data/skel/skin/examples/contact/20100701_0001.yaml +15 -0
- data/skel/skin/examples/contact/20100701_0002.yaml +8 -0
- data/skel/skin/examples/contact/20100701_0003.yaml +9 -0
- data/skel/skin/examples/contact/index.html +47 -0
- data/skel/skin/examples/contact/js/contact.js +13 -0
- data/skel/skin/examples/contact/summary.html +54 -0
- data/skel/skin/examples/forum/20100701_0001.yaml +41 -0
- data/skel/skin/examples/forum/20100701_0002.yaml +25 -0
- data/skel/skin/examples/forum/index.html +68 -0
- data/skel/skin/examples/forum/summary.html +47 -0
- data/skel/skin/examples/index.html +75 -0
- data/skel/skin/index.html +41 -0
- data/skel/skin/js/base.js +50 -0
- data/t/locale/de/index.po +19 -0
- data/t/locale/en-GB/index.po +25 -0
- data/t/locale/ja/index.po +30 -0
- data/t/skin/_users/00000000_test.yaml +3 -0
- data/t/skin/_users/index.html +13 -0
- data/t/skin/foo/20091120_0001.yaml +7 -0
- data/t/skin/foo/bar/20091120_0001.yaml +5 -0
- data/t/skin/foo/bar/index.yaml +5 -0
- data/t/skin/foo/baz/css/baz.css +1 -0
- data/t/skin/foo/css/foo.css +1 -0
- data/t/skin/foo/index.html +14 -0
- data/t/skin/foo/index.yaml +7 -0
- data/t/skin/foo/not_css/foo.css +1 -0
- data/t/skin/foo/sub-20100306_0001.yaml +3 -0
- data/t/skin/index.yaml +3 -0
- data/t/skin/t_attachment/index.html +13 -0
- data/t/skin/t_contact/done.html +6 -0
- data/t/skin/t_contact/index.html +9 -0
- data/t/skin/t_file/index.html +16 -0
- data/t/skin/t_img/index.html +14 -0
- data/t/skin/t_img/test.jpg +0 -0
- data/t/skin/t_select/index.html +9 -0
- data/t/skin/t_store/index.html +9 -0
- data/t/skin/t_summary/20100326_0001.yaml +3 -0
- data/t/skin/t_summary/create.html +9 -0
- data/t/skin/t_summary/index.html +9 -0
- data/t/skin/t_summary/summary.html +9 -0
- data/t/t.rb +27 -0
- data/t/test_checkbox.rb +273 -0
- data/t/test_field.rb +330 -0
- data/t/test_file.rb +900 -0
- data/t/test_id.rb +215 -0
- data/t/test_img.rb +328 -0
- data/t/test_meta.rb +57 -0
- data/t/test_parser.rb +1266 -0
- data/t/test_password.rb +188 -0
- data/t/test_radio.rb +226 -0
- data/t/test_role.rb +249 -0
- data/t/test_runo.rb +742 -0
- data/t/test_runo_call.rb +1286 -0
- data/t/test_runo_i18n.rb +318 -0
- data/t/test_select.rb +182 -0
- data/t/test_set_complex.rb +527 -0
- data/t/test_set_dynamic.rb +1504 -0
- data/t/test_set_folder.rb +515 -0
- data/t/test_set_permit.rb +246 -0
- data/t/test_set_static.rb +445 -0
- data/t/test_storage.rb +915 -0
- data/t/test_text.rb +125 -0
- data/t/test_textarea.rb +138 -0
- data/t/test_timestamp.rb +473 -0
- data/t/test_workflow.rb +367 -0
- metadata +345 -0
data/t/test_workflow.rb
ADDED
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
# Author:: Akira FUNAI
|
|
4
|
+
# Copyright:: Copyright (c) 2009 Akira FUNAI
|
|
5
|
+
|
|
6
|
+
require "#{::File.dirname __FILE__}/t"
|
|
7
|
+
|
|
8
|
+
class TC_Workflow < Test::Unit::TestCase
|
|
9
|
+
|
|
10
|
+
class Runo::Workflow::Foo < Runo::Workflow
|
|
11
|
+
PERM = {
|
|
12
|
+
:create => 0b11000,
|
|
13
|
+
:read => 0b11110,
|
|
14
|
+
:update => 0b10100,
|
|
15
|
+
:delete => 0b11000,
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def setup
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def teardown
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_instance
|
|
26
|
+
sd = Runo::Set::Dynamic.new
|
|
27
|
+
assert_instance_of(
|
|
28
|
+
Runo::Workflow,
|
|
29
|
+
Runo::Workflow.instance(sd),
|
|
30
|
+
'Runo::Workflow.instance should return a Workflow instance if sd[:workflow] is nil'
|
|
31
|
+
)
|
|
32
|
+
sd = Runo::Set::Static::Folder.root.item('foo', 'main')
|
|
33
|
+
assert_instance_of(
|
|
34
|
+
Runo::Workflow::Blog,
|
|
35
|
+
Runo::Workflow.instance(sd),
|
|
36
|
+
'Runo::Workflow.instance should return a instance according to sd[:workflow]'
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
assert_equal(
|
|
40
|
+
sd,
|
|
41
|
+
Runo::Workflow.instance(sd).sd,
|
|
42
|
+
'Runo::Workflow.instance should set @sd'
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_roles
|
|
47
|
+
assert_equal(
|
|
48
|
+
%w(none),
|
|
49
|
+
Runo::Workflow.roles(0b00001),
|
|
50
|
+
'Runo::Workflow.roles should return a human-readable string of the given roles'
|
|
51
|
+
)
|
|
52
|
+
assert_equal(
|
|
53
|
+
%w(owner),
|
|
54
|
+
Runo::Workflow.roles(0b00100),
|
|
55
|
+
'Runo::Workflow.roles should return a human-readable string of the given roles'
|
|
56
|
+
)
|
|
57
|
+
assert_equal(
|
|
58
|
+
%w(admin),
|
|
59
|
+
Runo::Workflow.roles(0b10000),
|
|
60
|
+
'Runo::Workflow.roles should return a human-readable string of the given roles'
|
|
61
|
+
)
|
|
62
|
+
assert_equal(
|
|
63
|
+
%w(admin owner user),
|
|
64
|
+
Runo::Workflow.roles(0b10110),
|
|
65
|
+
'Runo::Workflow.roles should return a human-readable string of the given roles'
|
|
66
|
+
)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_wf_permit_guest?
|
|
70
|
+
wf = Runo::Workflow::Foo.new(nil)
|
|
71
|
+
assert(
|
|
72
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_USER, :create),
|
|
73
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
74
|
+
)
|
|
75
|
+
assert(
|
|
76
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_USER, :read),
|
|
77
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
78
|
+
)
|
|
79
|
+
assert(
|
|
80
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_USER, :update),
|
|
81
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
82
|
+
)
|
|
83
|
+
assert(
|
|
84
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_USER, :delete),
|
|
85
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
86
|
+
)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def test_wf_permit_owner?
|
|
90
|
+
wf = Runo::Workflow::Foo.new(nil)
|
|
91
|
+
assert(
|
|
92
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_OWNER, :create),
|
|
93
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
94
|
+
)
|
|
95
|
+
assert(
|
|
96
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_OWNER, :read),
|
|
97
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
98
|
+
)
|
|
99
|
+
assert(
|
|
100
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_OWNER, :update),
|
|
101
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
102
|
+
)
|
|
103
|
+
assert(
|
|
104
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_OWNER, :delete),
|
|
105
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
106
|
+
)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_wf_permit_group?
|
|
110
|
+
wf = Runo::Workflow::Foo.new(nil)
|
|
111
|
+
assert(
|
|
112
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_GROUP, :create),
|
|
113
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
114
|
+
)
|
|
115
|
+
assert(
|
|
116
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_GROUP, :read),
|
|
117
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
118
|
+
)
|
|
119
|
+
assert(
|
|
120
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_GROUP, :update),
|
|
121
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
122
|
+
)
|
|
123
|
+
assert(
|
|
124
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_GROUP, :delete),
|
|
125
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
126
|
+
)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_wf_permit_admin?
|
|
130
|
+
wf = Runo::Workflow::Foo.new(nil)
|
|
131
|
+
assert(
|
|
132
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_ADMIN, :create),
|
|
133
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
134
|
+
)
|
|
135
|
+
assert(
|
|
136
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_ADMIN, :read),
|
|
137
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
138
|
+
)
|
|
139
|
+
assert(
|
|
140
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_ADMIN, :update),
|
|
141
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
142
|
+
)
|
|
143
|
+
assert(
|
|
144
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_ADMIN, :delete),
|
|
145
|
+
'Set::Workflow#permit? should return whether it permits the client the action or not'
|
|
146
|
+
)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_wf_permit_login_action?
|
|
150
|
+
wf = Runo::Workflow::Foo.new(nil)
|
|
151
|
+
assert(
|
|
152
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_USER, :login),
|
|
153
|
+
'Set::Workflow#permit? should always permit :login'
|
|
154
|
+
)
|
|
155
|
+
assert(
|
|
156
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_OWNER, :login),
|
|
157
|
+
'Set::Workflow#permit? should always permit :login'
|
|
158
|
+
)
|
|
159
|
+
assert(
|
|
160
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_GROUP, :login),
|
|
161
|
+
'Set::Workflow#permit? should always permit :login'
|
|
162
|
+
)
|
|
163
|
+
assert(
|
|
164
|
+
wf.send(:'permit?', Runo::Workflow::ROLE_ADMIN, :login),
|
|
165
|
+
'Set::Workflow#permit? should always permit :login'
|
|
166
|
+
)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def test_wf_permit_abnormal_action?
|
|
170
|
+
wf = Runo::Workflow::Foo.new(nil)
|
|
171
|
+
assert(
|
|
172
|
+
!wf.send(:'permit?', Runo::Workflow::ROLE_ADMIN, :'non-exist'),
|
|
173
|
+
'Set::Workflow#permit? should always return false for non-exist actions'
|
|
174
|
+
)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def test_permit_nobody?
|
|
178
|
+
sd = Runo::Set::Static::Folder.root.item('foo', 'bar', 'main')
|
|
179
|
+
Runo.client = nil
|
|
180
|
+
assert(
|
|
181
|
+
!sd.permit?(:create),
|
|
182
|
+
"'nobody' should not create"
|
|
183
|
+
)
|
|
184
|
+
assert(
|
|
185
|
+
sd.item('20091120_0001').permit?(:read),
|
|
186
|
+
"'nobody' should be able to read the item"
|
|
187
|
+
)
|
|
188
|
+
assert(
|
|
189
|
+
!sd.item('20091120_0001').permit?(:update),
|
|
190
|
+
"'nobody' should not update carl's item"
|
|
191
|
+
)
|
|
192
|
+
assert(
|
|
193
|
+
!sd.item('20091120_0001').permit?(:delete),
|
|
194
|
+
"'nobody' should not delete carl's item"
|
|
195
|
+
)
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def test_permit_don?
|
|
199
|
+
sd = Runo::Set::Static::Folder.root.item('foo', 'bar', 'main')
|
|
200
|
+
Runo.client = 'don' # don belongs to the group of foo/bar/
|
|
201
|
+
assert(
|
|
202
|
+
sd.permit?(:create),
|
|
203
|
+
'don should be able to create'
|
|
204
|
+
)
|
|
205
|
+
assert(
|
|
206
|
+
sd.item('20091120_0001').permit?(:read),
|
|
207
|
+
'don should be able to read the item'
|
|
208
|
+
)
|
|
209
|
+
assert(
|
|
210
|
+
!sd.item('20091120_0001').permit?(:update),
|
|
211
|
+
"don should not update carl's item"
|
|
212
|
+
)
|
|
213
|
+
assert(
|
|
214
|
+
!sd.item('20091120_0001').permit?(:delete),
|
|
215
|
+
"don should not delete carl's item"
|
|
216
|
+
)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def test_permit_carl?
|
|
220
|
+
sd = Runo::Set::Static::Folder.root.item('foo', 'bar', 'main')
|
|
221
|
+
Runo.client = 'carl' # carl belongs to the group of foo/bar/, and the owner of the item #0001
|
|
222
|
+
assert(
|
|
223
|
+
sd.permit?(:create),
|
|
224
|
+
'carl should be able to create'
|
|
225
|
+
)
|
|
226
|
+
assert(
|
|
227
|
+
sd.item('20091120_0001').permit?(:read),
|
|
228
|
+
'carl should be able to read the item'
|
|
229
|
+
)
|
|
230
|
+
assert(
|
|
231
|
+
sd.item('20091120_0001').permit?(:update),
|
|
232
|
+
"carl should be able to update his own item"
|
|
233
|
+
)
|
|
234
|
+
assert(
|
|
235
|
+
sd.item('20091120_0001').permit?(:delete),
|
|
236
|
+
"carl should be able to delete his own item"
|
|
237
|
+
)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def test_permit_frank?
|
|
241
|
+
sd = Runo::Set::Static::Folder.root.item('foo', 'bar', 'main')
|
|
242
|
+
Runo.client = 'frank' # frank is an admin of foo/bar/
|
|
243
|
+
assert(
|
|
244
|
+
sd.permit?(:create),
|
|
245
|
+
'frank should be able to create'
|
|
246
|
+
)
|
|
247
|
+
assert(
|
|
248
|
+
sd.item('20091120_0001').permit?(:read),
|
|
249
|
+
'frank should be able to read the item'
|
|
250
|
+
)
|
|
251
|
+
assert(
|
|
252
|
+
sd.item('20091120_0001').permit?(:update),
|
|
253
|
+
"frank should be able to update his own item"
|
|
254
|
+
)
|
|
255
|
+
assert(
|
|
256
|
+
sd.item('20091120_0001').permit?(:delete),
|
|
257
|
+
"frank should be able to delete his own item"
|
|
258
|
+
)
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def test_permit_abnormal_action?
|
|
262
|
+
sd = Runo::Set::Static::Folder.root.item('foo', 'bar', 'main')
|
|
263
|
+
Runo.client = 'frank'
|
|
264
|
+
assert(
|
|
265
|
+
!sd.permit?(:'****'),
|
|
266
|
+
'frank should not **** on the stage'
|
|
267
|
+
)
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
class Runo::Workflow::Test_default_action < Runo::Workflow
|
|
271
|
+
DEFAULT_SUB_ITEMS = {
|
|
272
|
+
'_owner' => {:klass => 'meta-owner'},
|
|
273
|
+
'_group' => {:klass => 'meta-group'},
|
|
274
|
+
}
|
|
275
|
+
PERM = {
|
|
276
|
+
:create => 0b11000,
|
|
277
|
+
:read => 0b10000,
|
|
278
|
+
:update => 0b11100,
|
|
279
|
+
:foo => 0b11110,
|
|
280
|
+
}
|
|
281
|
+
end
|
|
282
|
+
def test_default_action
|
|
283
|
+
sd = Runo::Set::Dynamic.new(
|
|
284
|
+
:workflow => 'test_default_action',
|
|
285
|
+
:group => ['roy']
|
|
286
|
+
)
|
|
287
|
+
def sd.meta_admins
|
|
288
|
+
['frank']
|
|
289
|
+
end
|
|
290
|
+
sd.load(
|
|
291
|
+
'20091122_0001' => {'_owner' => 'carl'},
|
|
292
|
+
'20091122_0002' => {'_owner' => 'frank'}
|
|
293
|
+
)
|
|
294
|
+
assert_equal('carl', sd.item('20091122_0001')[:owner])
|
|
295
|
+
assert_equal('frank', sd.item('20091122_0002')[:owner])
|
|
296
|
+
|
|
297
|
+
Runo.client = nil
|
|
298
|
+
assert_equal(
|
|
299
|
+
nil,
|
|
300
|
+
sd.default_action,
|
|
301
|
+
'Workflow#default_action should return a permitted action for the client'
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
Runo.client = 'carl' # carl is not the member of the group
|
|
305
|
+
assert_equal(
|
|
306
|
+
:foo,
|
|
307
|
+
sd.default_action,
|
|
308
|
+
'Workflow#default_action should return a permitted action for the client'
|
|
309
|
+
)
|
|
310
|
+
assert_equal(
|
|
311
|
+
:update,
|
|
312
|
+
sd.item('20091122_0001').default_action,
|
|
313
|
+
'Workflow#default_action should see the given conds'
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
Runo.client = 'roy' # roy belongs to the group
|
|
317
|
+
assert_equal(
|
|
318
|
+
:create,
|
|
319
|
+
sd.default_action,
|
|
320
|
+
'Workflow#default_action should return a permitted action for the client'
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
Runo.client = 'frank' # frank is the admin
|
|
324
|
+
assert_equal(
|
|
325
|
+
:read,
|
|
326
|
+
sd.default_action,
|
|
327
|
+
'Workflow#default_action should return a permitted action for the client'
|
|
328
|
+
)
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
class Runo::Workflow::Test_default_sub_items < Runo::Workflow
|
|
332
|
+
DEFAULT_SUB_ITEMS = {
|
|
333
|
+
'_timestamp' => {:klass => 'meta-timestamp'},
|
|
334
|
+
}
|
|
335
|
+
end
|
|
336
|
+
def test_default_sub_items
|
|
337
|
+
sd = Runo::Set::Dynamic.new(
|
|
338
|
+
:workflow => 'test_default_sub_items'
|
|
339
|
+
)
|
|
340
|
+
assert_equal(
|
|
341
|
+
{'_timestamp' => {:klass => 'meta-timestamp'}},
|
|
342
|
+
sd[:item]['default'][:item],
|
|
343
|
+
'Workflow#default_sub_items should supply DEFAULT_SUB_ITEMS to sd[:item][*]'
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
sd = Runo::Set::Dynamic.new(
|
|
347
|
+
:workflow => 'test_default_sub_items',
|
|
348
|
+
:item => {
|
|
349
|
+
'default' => {
|
|
350
|
+
:item => {
|
|
351
|
+
'_timestamp' => {:klass => 'meta-timestamp', :can_update => true},
|
|
352
|
+
'foo' => {:klass => 'text'},
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
}
|
|
356
|
+
)
|
|
357
|
+
assert_equal(
|
|
358
|
+
{
|
|
359
|
+
'_timestamp' => {:klass => 'meta-timestamp', :can_update => true},
|
|
360
|
+
'foo' => {:klass => 'text'},
|
|
361
|
+
},
|
|
362
|
+
sd[:item]['default'][:item],
|
|
363
|
+
'Workflow#default_sub_items should be overriden by sd[:item]'
|
|
364
|
+
)
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: runo
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease: false
|
|
5
|
+
segments:
|
|
6
|
+
- 0
|
|
7
|
+
- 1
|
|
8
|
+
- 0
|
|
9
|
+
version: 0.1.0
|
|
10
|
+
platform: ruby
|
|
11
|
+
authors:
|
|
12
|
+
- Akira FUNAI
|
|
13
|
+
autorequire:
|
|
14
|
+
bindir: bin
|
|
15
|
+
cert_chain: []
|
|
16
|
+
|
|
17
|
+
date: 2010-07-01 00:00:00 +09:00
|
|
18
|
+
default_executable: runo
|
|
19
|
+
dependencies:
|
|
20
|
+
- !ruby/object:Gem::Dependency
|
|
21
|
+
name: rack
|
|
22
|
+
prerelease: false
|
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
|
24
|
+
requirements:
|
|
25
|
+
- - ">="
|
|
26
|
+
- !ruby/object:Gem::Version
|
|
27
|
+
segments:
|
|
28
|
+
- 0
|
|
29
|
+
- 9
|
|
30
|
+
version: "0.9"
|
|
31
|
+
type: :runtime
|
|
32
|
+
version_requirements: *id001
|
|
33
|
+
- !ruby/object:Gem::Dependency
|
|
34
|
+
name: sequel
|
|
35
|
+
prerelease: false
|
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ">="
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
segments:
|
|
41
|
+
- 3
|
|
42
|
+
- 0
|
|
43
|
+
version: "3.0"
|
|
44
|
+
type: :runtime
|
|
45
|
+
version_requirements: *id002
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: ya2yaml
|
|
48
|
+
prerelease: false
|
|
49
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
segments:
|
|
54
|
+
- 0
|
|
55
|
+
- 26
|
|
56
|
+
version: "0.26"
|
|
57
|
+
type: :runtime
|
|
58
|
+
version_requirements: *id003
|
|
59
|
+
- !ruby/object:Gem::Dependency
|
|
60
|
+
name: gettext
|
|
61
|
+
prerelease: false
|
|
62
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - ">="
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
segments:
|
|
67
|
+
- 2
|
|
68
|
+
- 1
|
|
69
|
+
- 0
|
|
70
|
+
version: 2.1.0
|
|
71
|
+
type: :development
|
|
72
|
+
version_requirements: *id004
|
|
73
|
+
- !ruby/object:Gem::Dependency
|
|
74
|
+
name: jeweler
|
|
75
|
+
prerelease: false
|
|
76
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
|
77
|
+
requirements:
|
|
78
|
+
- - ">="
|
|
79
|
+
- !ruby/object:Gem::Version
|
|
80
|
+
segments:
|
|
81
|
+
- 1
|
|
82
|
+
- 4
|
|
83
|
+
- 0
|
|
84
|
+
version: 1.4.0
|
|
85
|
+
type: :development
|
|
86
|
+
version_requirements: *id005
|
|
87
|
+
- !ruby/object:Gem::Dependency
|
|
88
|
+
name: mocha
|
|
89
|
+
prerelease: false
|
|
90
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
|
91
|
+
requirements:
|
|
92
|
+
- - ">="
|
|
93
|
+
- !ruby/object:Gem::Version
|
|
94
|
+
segments:
|
|
95
|
+
- 0
|
|
96
|
+
- 9
|
|
97
|
+
- 8
|
|
98
|
+
version: 0.9.8
|
|
99
|
+
type: :development
|
|
100
|
+
version_requirements: *id006
|
|
101
|
+
- !ruby/object:Gem::Dependency
|
|
102
|
+
name: quick_magick
|
|
103
|
+
prerelease: false
|
|
104
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
|
105
|
+
requirements:
|
|
106
|
+
- - ">="
|
|
107
|
+
- !ruby/object:Gem::Version
|
|
108
|
+
segments:
|
|
109
|
+
- 0
|
|
110
|
+
- 7
|
|
111
|
+
- 4
|
|
112
|
+
version: 0.7.4
|
|
113
|
+
type: :development
|
|
114
|
+
version_requirements: *id007
|
|
115
|
+
- !ruby/object:Gem::Dependency
|
|
116
|
+
name: sqlite3-ruby
|
|
117
|
+
prerelease: false
|
|
118
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
|
119
|
+
requirements:
|
|
120
|
+
- - ">="
|
|
121
|
+
- !ruby/object:Gem::Version
|
|
122
|
+
segments:
|
|
123
|
+
- 1
|
|
124
|
+
- 2
|
|
125
|
+
- 5
|
|
126
|
+
version: 1.2.5
|
|
127
|
+
type: :development
|
|
128
|
+
version_requirements: *id008
|
|
129
|
+
description: |
|
|
130
|
+
Runo is a web application framework that can make feature-rich apps by HTML files only.
|
|
131
|
+
You need no database setup (by default), no scheme definition, no command-line voodoo.
|
|
132
|
+
Just put a good old HTML file under skin/, and your new app is already running.
|
|
133
|
+
|
|
134
|
+
email: akira@funai.com
|
|
135
|
+
executables:
|
|
136
|
+
- runo
|
|
137
|
+
extensions: []
|
|
138
|
+
|
|
139
|
+
extra_rdoc_files:
|
|
140
|
+
- LICENSE
|
|
141
|
+
- README.rdoc
|
|
142
|
+
files:
|
|
143
|
+
- bin/runo
|
|
144
|
+
- lib/_error.rb
|
|
145
|
+
- lib/_field.rb
|
|
146
|
+
- lib/_i18n.rb
|
|
147
|
+
- lib/_parser.rb
|
|
148
|
+
- lib/_path.rb
|
|
149
|
+
- lib/_storage/_storage.rb
|
|
150
|
+
- lib/_storage/file.rb
|
|
151
|
+
- lib/_storage/sequel.rb
|
|
152
|
+
- lib/_storage/temp.rb
|
|
153
|
+
- lib/_widget/action_create.rb
|
|
154
|
+
- lib/_widget/action_login.rb
|
|
155
|
+
- lib/_widget/action_signup.rb
|
|
156
|
+
- lib/_widget/action_update.rb
|
|
157
|
+
- lib/_widget/crumb.rb
|
|
158
|
+
- lib/_widget/done.rb
|
|
159
|
+
- lib/_widget/login.rb
|
|
160
|
+
- lib/_widget/me.rb
|
|
161
|
+
- lib/_widget/message.rb
|
|
162
|
+
- lib/_widget/navi.rb
|
|
163
|
+
- lib/_widget/submit.rb
|
|
164
|
+
- lib/_widget/view_ym.rb
|
|
165
|
+
- lib/_workflow/_workflow.rb
|
|
166
|
+
- lib/_workflow/attachment.rb
|
|
167
|
+
- lib/_workflow/blog.rb
|
|
168
|
+
- lib/_workflow/contact.rb
|
|
169
|
+
- lib/_workflow/forum.rb
|
|
170
|
+
- lib/_workflow/register.rb
|
|
171
|
+
- lib/meta/_meta.rb
|
|
172
|
+
- lib/meta/group.rb
|
|
173
|
+
- lib/meta/id.rb
|
|
174
|
+
- lib/meta/owner.rb
|
|
175
|
+
- lib/meta/timestamp.rb
|
|
176
|
+
- lib/runo.rb
|
|
177
|
+
- lib/scalar/checkbox.rb
|
|
178
|
+
- lib/scalar/file.rb
|
|
179
|
+
- lib/scalar/img.rb
|
|
180
|
+
- lib/scalar/password.rb
|
|
181
|
+
- lib/scalar/radio.rb
|
|
182
|
+
- lib/scalar/select.rb
|
|
183
|
+
- lib/scalar/text.rb
|
|
184
|
+
- lib/scalar/textarea.rb
|
|
185
|
+
- lib/scalar/textarea_pre.rb
|
|
186
|
+
- lib/scalar/textarea_wiki.rb
|
|
187
|
+
- lib/set/_set.rb
|
|
188
|
+
- lib/set/dynamic.rb
|
|
189
|
+
- lib/set/static.rb
|
|
190
|
+
- lib/set/static_folder.rb
|
|
191
|
+
- locale/en/index.po
|
|
192
|
+
- locale/index.pot
|
|
193
|
+
- locale/ja/index.po
|
|
194
|
+
- locale/lazy_parser.rb
|
|
195
|
+
- skel/config.ru
|
|
196
|
+
- skel/skin/_users/00000000_frank-avatar.jpg
|
|
197
|
+
- skel/skin/_users/00000000_frank-avatar_small.jpg
|
|
198
|
+
- skel/skin/_users/00000000_frank.yaml
|
|
199
|
+
- skel/skin/_users/00000000_root-avatar.jpg
|
|
200
|
+
- skel/skin/_users/00000000_root-avatar_small.jpg
|
|
201
|
+
- skel/skin/_users/00000000_root.yaml
|
|
202
|
+
- skel/skin/_users/css/users.css
|
|
203
|
+
- skel/skin/_users/css/users.less
|
|
204
|
+
- skel/skin/_users/done.html
|
|
205
|
+
- skel/skin/_users/index.html
|
|
206
|
+
- skel/skin/_users/index.yaml
|
|
207
|
+
- skel/skin/_users/summary.html
|
|
208
|
+
- skel/skin/css/base.css
|
|
209
|
+
- skel/skin/css/base.less
|
|
210
|
+
- skel/skin/css/coax.css
|
|
211
|
+
- skel/skin/css/coax.less
|
|
212
|
+
- skel/skin/examples/blog/20091214_0001.yaml
|
|
213
|
+
- skel/skin/examples/blog/20100630_0001.yaml
|
|
214
|
+
- skel/skin/examples/blog/20100630_0002.yaml
|
|
215
|
+
- skel/skin/examples/blog/20100701_0001.yaml
|
|
216
|
+
- skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg
|
|
217
|
+
- skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg
|
|
218
|
+
- skel/skin/examples/blog/20100701_0002.yaml
|
|
219
|
+
- skel/skin/examples/blog/frank/20100701_0001.yaml
|
|
220
|
+
- skel/skin/examples/blog/frank/index.yaml
|
|
221
|
+
- skel/skin/examples/blog/index.html
|
|
222
|
+
- skel/skin/examples/blog/rss.xml
|
|
223
|
+
- skel/skin/examples/contact/20100701_0001-file.txt
|
|
224
|
+
- skel/skin/examples/contact/20100701_0001.yaml
|
|
225
|
+
- skel/skin/examples/contact/20100701_0002.yaml
|
|
226
|
+
- skel/skin/examples/contact/20100701_0003.yaml
|
|
227
|
+
- skel/skin/examples/contact/index.html
|
|
228
|
+
- skel/skin/examples/contact/js/contact.js
|
|
229
|
+
- skel/skin/examples/contact/summary.html
|
|
230
|
+
- skel/skin/examples/forum/20100701_0001.yaml
|
|
231
|
+
- skel/skin/examples/forum/20100701_0002.yaml
|
|
232
|
+
- skel/skin/examples/forum/index.html
|
|
233
|
+
- skel/skin/examples/forum/summary.html
|
|
234
|
+
- skel/skin/examples/index.html
|
|
235
|
+
- skel/skin/index.html
|
|
236
|
+
- skel/skin/js/base.js
|
|
237
|
+
- t/locale/de/index.po
|
|
238
|
+
- t/locale/en-GB/index.po
|
|
239
|
+
- t/locale/ja/index.po
|
|
240
|
+
- t/skin/_users/00000000_test.yaml
|
|
241
|
+
- t/skin/_users/index.html
|
|
242
|
+
- t/skin/foo/20091120_0001.yaml
|
|
243
|
+
- t/skin/foo/bar/20091120_0001.yaml
|
|
244
|
+
- t/skin/foo/bar/index.yaml
|
|
245
|
+
- t/skin/foo/baz/css/baz.css
|
|
246
|
+
- t/skin/foo/css/foo.css
|
|
247
|
+
- t/skin/foo/index.html
|
|
248
|
+
- t/skin/foo/index.yaml
|
|
249
|
+
- t/skin/foo/not_css/foo.css
|
|
250
|
+
- t/skin/foo/sub-20100306_0001.yaml
|
|
251
|
+
- t/skin/index.yaml
|
|
252
|
+
- t/skin/t_attachment/index.html
|
|
253
|
+
- t/skin/t_contact/done.html
|
|
254
|
+
- t/skin/t_contact/index.html
|
|
255
|
+
- t/skin/t_file/index.html
|
|
256
|
+
- t/skin/t_img/index.html
|
|
257
|
+
- t/skin/t_img/test.jpg
|
|
258
|
+
- t/skin/t_select/index.html
|
|
259
|
+
- t/skin/t_store/index.html
|
|
260
|
+
- t/skin/t_summary/20100326_0001.yaml
|
|
261
|
+
- t/skin/t_summary/create.html
|
|
262
|
+
- t/skin/t_summary/index.html
|
|
263
|
+
- t/skin/t_summary/summary.html
|
|
264
|
+
- t/t.rb
|
|
265
|
+
- t/test_checkbox.rb
|
|
266
|
+
- t/test_field.rb
|
|
267
|
+
- t/test_file.rb
|
|
268
|
+
- t/test_id.rb
|
|
269
|
+
- t/test_img.rb
|
|
270
|
+
- t/test_meta.rb
|
|
271
|
+
- t/test_parser.rb
|
|
272
|
+
- t/test_password.rb
|
|
273
|
+
- t/test_radio.rb
|
|
274
|
+
- t/test_role.rb
|
|
275
|
+
- t/test_runo.rb
|
|
276
|
+
- t/test_runo_call.rb
|
|
277
|
+
- t/test_runo_i18n.rb
|
|
278
|
+
- t/test_select.rb
|
|
279
|
+
- t/test_set_complex.rb
|
|
280
|
+
- t/test_set_dynamic.rb
|
|
281
|
+
- t/test_set_folder.rb
|
|
282
|
+
- t/test_set_permit.rb
|
|
283
|
+
- t/test_set_static.rb
|
|
284
|
+
- t/test_storage.rb
|
|
285
|
+
- t/test_text.rb
|
|
286
|
+
- t/test_textarea.rb
|
|
287
|
+
- t/test_timestamp.rb
|
|
288
|
+
- t/test_workflow.rb
|
|
289
|
+
- LICENSE
|
|
290
|
+
- README.rdoc
|
|
291
|
+
has_rdoc: true
|
|
292
|
+
homepage: http://github.com/afunai/runo
|
|
293
|
+
licenses: []
|
|
294
|
+
|
|
295
|
+
post_install_message:
|
|
296
|
+
rdoc_options:
|
|
297
|
+
- --charset=UTF-8
|
|
298
|
+
require_paths:
|
|
299
|
+
- lib
|
|
300
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
301
|
+
requirements:
|
|
302
|
+
- - ">="
|
|
303
|
+
- !ruby/object:Gem::Version
|
|
304
|
+
segments:
|
|
305
|
+
- 0
|
|
306
|
+
version: "0"
|
|
307
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
308
|
+
requirements:
|
|
309
|
+
- - ">="
|
|
310
|
+
- !ruby/object:Gem::Version
|
|
311
|
+
segments:
|
|
312
|
+
- 0
|
|
313
|
+
version: "0"
|
|
314
|
+
requirements: []
|
|
315
|
+
|
|
316
|
+
rubyforge_project: runo
|
|
317
|
+
rubygems_version: 1.3.6
|
|
318
|
+
signing_key:
|
|
319
|
+
specification_version: 3
|
|
320
|
+
summary: The laziest web application framework
|
|
321
|
+
test_files:
|
|
322
|
+
- t/test_set_static.rb
|
|
323
|
+
- t/test_set_permit.rb
|
|
324
|
+
- t/test_role.rb
|
|
325
|
+
- t/test_meta.rb
|
|
326
|
+
- t/test_set_complex.rb
|
|
327
|
+
- t/test_timestamp.rb
|
|
328
|
+
- t/test_field.rb
|
|
329
|
+
- t/test_workflow.rb
|
|
330
|
+
- t/test_set_dynamic.rb
|
|
331
|
+
- t/test_runo_i18n.rb
|
|
332
|
+
- t/test_runo_call.rb
|
|
333
|
+
- t/test_parser.rb
|
|
334
|
+
- t/test_storage.rb
|
|
335
|
+
- t/test_set_folder.rb
|
|
336
|
+
- t/test_runo.rb
|
|
337
|
+
- t/test_img.rb
|
|
338
|
+
- t/test_checkbox.rb
|
|
339
|
+
- t/test_radio.rb
|
|
340
|
+
- t/test_text.rb
|
|
341
|
+
- t/test_file.rb
|
|
342
|
+
- t/test_id.rb
|
|
343
|
+
- t/test_password.rb
|
|
344
|
+
- t/test_textarea.rb
|
|
345
|
+
- t/test_select.rb
|