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.
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