runo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. data/LICENSE +19 -0
  2. data/README.rdoc +120 -0
  3. data/bin/runo +35 -0
  4. data/lib/_error.rb +14 -0
  5. data/lib/_field.rb +260 -0
  6. data/lib/_i18n.rb +141 -0
  7. data/lib/_parser.rb +243 -0
  8. data/lib/_path.rb +86 -0
  9. data/lib/_storage/_storage.rb +213 -0
  10. data/lib/_storage/file.rb +200 -0
  11. data/lib/_storage/sequel.rb +174 -0
  12. data/lib/_storage/temp.rb +73 -0
  13. data/lib/_widget/action_create.rb +23 -0
  14. data/lib/_widget/action_login.rb +22 -0
  15. data/lib/_widget/action_signup.rb +16 -0
  16. data/lib/_widget/action_update.rb +16 -0
  17. data/lib/_widget/crumb.rb +24 -0
  18. data/lib/_widget/done.rb +16 -0
  19. data/lib/_widget/login.rb +25 -0
  20. data/lib/_widget/me.rb +31 -0
  21. data/lib/_widget/message.rb +51 -0
  22. data/lib/_widget/navi.rb +88 -0
  23. data/lib/_widget/submit.rb +49 -0
  24. data/lib/_widget/view_ym.rb +77 -0
  25. data/lib/_workflow/_workflow.rb +89 -0
  26. data/lib/_workflow/attachment.rb +50 -0
  27. data/lib/_workflow/blog.rb +28 -0
  28. data/lib/_workflow/contact.rb +23 -0
  29. data/lib/_workflow/forum.rb +26 -0
  30. data/lib/_workflow/register.rb +39 -0
  31. data/lib/meta/_meta.rb +20 -0
  32. data/lib/meta/group.rb +19 -0
  33. data/lib/meta/id.rb +59 -0
  34. data/lib/meta/owner.rb +21 -0
  35. data/lib/meta/timestamp.rb +118 -0
  36. data/lib/runo.rb +396 -0
  37. data/lib/scalar/checkbox.rb +68 -0
  38. data/lib/scalar/file.rb +144 -0
  39. data/lib/scalar/img.rb +112 -0
  40. data/lib/scalar/password.rb +58 -0
  41. data/lib/scalar/radio.rb +47 -0
  42. data/lib/scalar/select.rb +47 -0
  43. data/lib/scalar/text.rb +38 -0
  44. data/lib/scalar/textarea.rb +35 -0
  45. data/lib/scalar/textarea_pre.rb +14 -0
  46. data/lib/scalar/textarea_wiki.rb +173 -0
  47. data/lib/set/_set.rb +195 -0
  48. data/lib/set/dynamic.rb +177 -0
  49. data/lib/set/static.rb +102 -0
  50. data/lib/set/static_folder.rb +96 -0
  51. data/locale/en/index.po +242 -0
  52. data/locale/index.pot +243 -0
  53. data/locale/ja/index.po +242 -0
  54. data/locale/lazy_parser.rb +54 -0
  55. data/skel/config.ru +27 -0
  56. data/skel/skin/_users/00000000_frank-avatar.jpg +0 -0
  57. data/skel/skin/_users/00000000_frank-avatar_small.jpg +0 -0
  58. data/skel/skin/_users/00000000_frank.yaml +12 -0
  59. data/skel/skin/_users/00000000_root-avatar.jpg +0 -0
  60. data/skel/skin/_users/00000000_root-avatar_small.jpg +0 -0
  61. data/skel/skin/_users/00000000_root.yaml +11 -0
  62. data/skel/skin/_users/css/users.css +21 -0
  63. data/skel/skin/_users/css/users.less +25 -0
  64. data/skel/skin/_users/done.html +42 -0
  65. data/skel/skin/_users/index.html +46 -0
  66. data/skel/skin/_users/index.yaml +3 -0
  67. data/skel/skin/_users/summary.html +40 -0
  68. data/skel/skin/css/base.css +93 -0
  69. data/skel/skin/css/base.less +139 -0
  70. data/skel/skin/css/coax.css +199 -0
  71. data/skel/skin/css/coax.less +244 -0
  72. data/skel/skin/examples/blog/20091214_0001.yaml +8 -0
  73. data/skel/skin/examples/blog/20100630_0001.yaml +8 -0
  74. data/skel/skin/examples/blog/20100630_0002.yaml +14 -0
  75. data/skel/skin/examples/blog/20100701_0001.yaml +8 -0
  76. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg +0 -0
  77. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg +0 -0
  78. data/skel/skin/examples/blog/20100701_0002.yaml +19 -0
  79. data/skel/skin/examples/blog/frank/20100701_0001.yaml +10 -0
  80. data/skel/skin/examples/blog/frank/index.yaml +4 -0
  81. data/skel/skin/examples/blog/index.html +51 -0
  82. data/skel/skin/examples/blog/rss.xml +18 -0
  83. data/skel/skin/examples/contact/20100701_0001-file.txt +1 -0
  84. data/skel/skin/examples/contact/20100701_0001.yaml +15 -0
  85. data/skel/skin/examples/contact/20100701_0002.yaml +8 -0
  86. data/skel/skin/examples/contact/20100701_0003.yaml +9 -0
  87. data/skel/skin/examples/contact/index.html +47 -0
  88. data/skel/skin/examples/contact/js/contact.js +13 -0
  89. data/skel/skin/examples/contact/summary.html +54 -0
  90. data/skel/skin/examples/forum/20100701_0001.yaml +41 -0
  91. data/skel/skin/examples/forum/20100701_0002.yaml +25 -0
  92. data/skel/skin/examples/forum/index.html +68 -0
  93. data/skel/skin/examples/forum/summary.html +47 -0
  94. data/skel/skin/examples/index.html +75 -0
  95. data/skel/skin/index.html +41 -0
  96. data/skel/skin/js/base.js +50 -0
  97. data/t/locale/de/index.po +19 -0
  98. data/t/locale/en-GB/index.po +25 -0
  99. data/t/locale/ja/index.po +30 -0
  100. data/t/skin/_users/00000000_test.yaml +3 -0
  101. data/t/skin/_users/index.html +13 -0
  102. data/t/skin/foo/20091120_0001.yaml +7 -0
  103. data/t/skin/foo/bar/20091120_0001.yaml +5 -0
  104. data/t/skin/foo/bar/index.yaml +5 -0
  105. data/t/skin/foo/baz/css/baz.css +1 -0
  106. data/t/skin/foo/css/foo.css +1 -0
  107. data/t/skin/foo/index.html +14 -0
  108. data/t/skin/foo/index.yaml +7 -0
  109. data/t/skin/foo/not_css/foo.css +1 -0
  110. data/t/skin/foo/sub-20100306_0001.yaml +3 -0
  111. data/t/skin/index.yaml +3 -0
  112. data/t/skin/t_attachment/index.html +13 -0
  113. data/t/skin/t_contact/done.html +6 -0
  114. data/t/skin/t_contact/index.html +9 -0
  115. data/t/skin/t_file/index.html +16 -0
  116. data/t/skin/t_img/index.html +14 -0
  117. data/t/skin/t_img/test.jpg +0 -0
  118. data/t/skin/t_select/index.html +9 -0
  119. data/t/skin/t_store/index.html +9 -0
  120. data/t/skin/t_summary/20100326_0001.yaml +3 -0
  121. data/t/skin/t_summary/create.html +9 -0
  122. data/t/skin/t_summary/index.html +9 -0
  123. data/t/skin/t_summary/summary.html +9 -0
  124. data/t/t.rb +27 -0
  125. data/t/test_checkbox.rb +273 -0
  126. data/t/test_field.rb +330 -0
  127. data/t/test_file.rb +900 -0
  128. data/t/test_id.rb +215 -0
  129. data/t/test_img.rb +328 -0
  130. data/t/test_meta.rb +57 -0
  131. data/t/test_parser.rb +1266 -0
  132. data/t/test_password.rb +188 -0
  133. data/t/test_radio.rb +226 -0
  134. data/t/test_role.rb +249 -0
  135. data/t/test_runo.rb +742 -0
  136. data/t/test_runo_call.rb +1286 -0
  137. data/t/test_runo_i18n.rb +318 -0
  138. data/t/test_select.rb +182 -0
  139. data/t/test_set_complex.rb +527 -0
  140. data/t/test_set_dynamic.rb +1504 -0
  141. data/t/test_set_folder.rb +515 -0
  142. data/t/test_set_permit.rb +246 -0
  143. data/t/test_set_static.rb +445 -0
  144. data/t/test_storage.rb +915 -0
  145. data/t/test_text.rb +125 -0
  146. data/t/test_textarea.rb +138 -0
  147. data/t/test_timestamp.rb +473 -0
  148. data/t/test_workflow.rb +367 -0
  149. metadata +345 -0
@@ -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