runo 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (151) hide show
  1. data/README.rdoc +1 -118
  2. data/bin/runo +4 -29
  3. data/lib/dummy.rb +0 -0
  4. metadata +12 -278
  5. data/lib/_error.rb +0 -14
  6. data/lib/_field.rb +0 -260
  7. data/lib/_i18n.rb +0 -144
  8. data/lib/_parser.rb +0 -256
  9. data/lib/_path.rb +0 -86
  10. data/lib/_storage/_storage.rb +0 -215
  11. data/lib/_storage/file.rb +0 -201
  12. data/lib/_storage/sequel.rb +0 -174
  13. data/lib/_storage/temp.rb +0 -73
  14. data/lib/_widget/action_create.rb +0 -23
  15. data/lib/_widget/action_login.rb +0 -22
  16. data/lib/_widget/action_signup.rb +0 -16
  17. data/lib/_widget/action_update.rb +0 -16
  18. data/lib/_widget/crumb.rb +0 -24
  19. data/lib/_widget/done.rb +0 -16
  20. data/lib/_widget/login.rb +0 -25
  21. data/lib/_widget/me.rb +0 -31
  22. data/lib/_widget/message.rb +0 -51
  23. data/lib/_widget/navi.rb +0 -88
  24. data/lib/_widget/submit.rb +0 -49
  25. data/lib/_widget/view_ym.rb +0 -77
  26. data/lib/_workflow/_workflow.rb +0 -89
  27. data/lib/_workflow/attachment.rb +0 -50
  28. data/lib/_workflow/blog.rb +0 -28
  29. data/lib/_workflow/contact.rb +0 -23
  30. data/lib/_workflow/forum.rb +0 -26
  31. data/lib/_workflow/register.rb +0 -39
  32. data/lib/meta/_meta.rb +0 -20
  33. data/lib/meta/group.rb +0 -19
  34. data/lib/meta/id.rb +0 -59
  35. data/lib/meta/owner.rb +0 -21
  36. data/lib/meta/timestamp.rb +0 -118
  37. data/lib/runo.rb +0 -396
  38. data/lib/scalar/checkbox.rb +0 -68
  39. data/lib/scalar/file.rb +0 -144
  40. data/lib/scalar/img.rb +0 -112
  41. data/lib/scalar/password.rb +0 -58
  42. data/lib/scalar/radio.rb +0 -47
  43. data/lib/scalar/select.rb +0 -47
  44. data/lib/scalar/text.rb +0 -38
  45. data/lib/scalar/textarea.rb +0 -35
  46. data/lib/scalar/textarea_pre.rb +0 -14
  47. data/lib/scalar/textarea_wiki.rb +0 -173
  48. data/lib/set/_set.rb +0 -196
  49. data/lib/set/dynamic.rb +0 -177
  50. data/lib/set/static.rb +0 -102
  51. data/lib/set/static_folder.rb +0 -96
  52. data/locale/en/index.po +0 -242
  53. data/locale/index.pot +0 -243
  54. data/locale/ja/index.po +0 -242
  55. data/locale/lazy_parser.rb +0 -54
  56. data/skel/config.ru +0 -27
  57. data/skel/skin/_users/00000000_frank-avatar.jpg +0 -0
  58. data/skel/skin/_users/00000000_frank-avatar_small.jpg +0 -0
  59. data/skel/skin/_users/00000000_frank.yaml +0 -12
  60. data/skel/skin/_users/00000000_root-avatar.jpg +0 -0
  61. data/skel/skin/_users/00000000_root-avatar_small.jpg +0 -0
  62. data/skel/skin/_users/00000000_root.yaml +0 -11
  63. data/skel/skin/_users/css/users.css +0 -21
  64. data/skel/skin/_users/css/users.less +0 -25
  65. data/skel/skin/_users/done.html +0 -42
  66. data/skel/skin/_users/index.html +0 -46
  67. data/skel/skin/_users/index.yaml +0 -3
  68. data/skel/skin/_users/summary.html +0 -40
  69. data/skel/skin/css/base.css +0 -93
  70. data/skel/skin/css/base.less +0 -139
  71. data/skel/skin/css/coax.css +0 -199
  72. data/skel/skin/css/coax.less +0 -244
  73. data/skel/skin/examples/blog/20091214_0001.yaml +0 -8
  74. data/skel/skin/examples/blog/20100630_0001.yaml +0 -8
  75. data/skel/skin/examples/blog/20100630_0002.yaml +0 -14
  76. data/skel/skin/examples/blog/20100701_0001.yaml +0 -8
  77. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg +0 -0
  78. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg +0 -0
  79. data/skel/skin/examples/blog/20100701_0002.yaml +0 -19
  80. data/skel/skin/examples/blog/frank/20100701_0001.yaml +0 -10
  81. data/skel/skin/examples/blog/frank/index.yaml +0 -4
  82. data/skel/skin/examples/blog/index.html +0 -51
  83. data/skel/skin/examples/blog/rss.xml +0 -18
  84. data/skel/skin/examples/contact/20100701_0001-file.txt +0 -1
  85. data/skel/skin/examples/contact/20100701_0001.yaml +0 -15
  86. data/skel/skin/examples/contact/20100701_0002.yaml +0 -8
  87. data/skel/skin/examples/contact/20100701_0003.yaml +0 -9
  88. data/skel/skin/examples/contact/index.html +0 -47
  89. data/skel/skin/examples/contact/js/contact.js +0 -13
  90. data/skel/skin/examples/contact/summary.html +0 -54
  91. data/skel/skin/examples/forum/20100701_0001.yaml +0 -41
  92. data/skel/skin/examples/forum/20100701_0002.yaml +0 -25
  93. data/skel/skin/examples/forum/index.html +0 -68
  94. data/skel/skin/examples/forum/summary.html +0 -47
  95. data/skel/skin/examples/index.html +0 -73
  96. data/skel/skin/index.html +0 -39
  97. data/skel/skin/js/base.js +0 -50
  98. data/t/locale/de/index.po +0 -19
  99. data/t/locale/en-GB/index.po +0 -25
  100. data/t/locale/ja/index.po +0 -30
  101. data/t/skin/_users/00000000_test.yaml +0 -3
  102. data/t/skin/_users/index.html +0 -13
  103. data/t/skin/foo/20091120_0001.yaml +0 -7
  104. data/t/skin/foo/bar/20091120_0001.yaml +0 -5
  105. data/t/skin/foo/bar/index.yaml +0 -5
  106. data/t/skin/foo/baz/css/baz.css +0 -1
  107. data/t/skin/foo/css/foo.css +0 -1
  108. data/t/skin/foo/index.html +0 -14
  109. data/t/skin/foo/index.yaml +0 -7
  110. data/t/skin/foo/not_css/foo.css +0 -1
  111. data/t/skin/foo/qux/index.html +0 -8
  112. data/t/skin/foo/qux/moo/index.html +0 -6
  113. data/t/skin/foo/sub-20100306_0001.yaml +0 -3
  114. data/t/skin/index.yaml +0 -3
  115. data/t/skin/t_attachment/index.html +0 -13
  116. data/t/skin/t_contact/done.html +0 -6
  117. data/t/skin/t_contact/index.html +0 -9
  118. data/t/skin/t_file/index.html +0 -16
  119. data/t/skin/t_img/index.html +0 -14
  120. data/t/skin/t_img/test.jpg +0 -0
  121. data/t/skin/t_select/index.html +0 -9
  122. data/t/skin/t_store/index.html +0 -9
  123. data/t/skin/t_summary/20100326_0001.yaml +0 -3
  124. data/t/skin/t_summary/create.html +0 -9
  125. data/t/skin/t_summary/index.html +0 -9
  126. data/t/skin/t_summary/summary.html +0 -9
  127. data/t/t.rb +0 -27
  128. data/t/test_checkbox.rb +0 -273
  129. data/t/test_field.rb +0 -330
  130. data/t/test_file.rb +0 -900
  131. data/t/test_id.rb +0 -215
  132. data/t/test_img.rb +0 -328
  133. data/t/test_meta.rb +0 -57
  134. data/t/test_parser.rb +0 -1516
  135. data/t/test_password.rb +0 -188
  136. data/t/test_radio.rb +0 -226
  137. data/t/test_role.rb +0 -249
  138. data/t/test_runo.rb +0 -768
  139. data/t/test_runo_call.rb +0 -1281
  140. data/t/test_runo_i18n.rb +0 -325
  141. data/t/test_select.rb +0 -182
  142. data/t/test_set_complex.rb +0 -527
  143. data/t/test_set_dynamic.rb +0 -1504
  144. data/t/test_set_folder.rb +0 -515
  145. data/t/test_set_permit.rb +0 -246
  146. data/t/test_set_static.rb +0 -468
  147. data/t/test_storage.rb +0 -915
  148. data/t/test_text.rb +0 -125
  149. data/t/test_textarea.rb +0 -138
  150. data/t/test_timestamp.rb +0 -473
  151. data/t/test_workflow.rb +0 -367
@@ -1,174 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- require 'rubygems'
7
- require 'sequel'
8
- require 'yaml'
9
- require 'ya2yaml'
10
-
11
- class Runo::Storage::Sequel < Runo::Storage
12
-
13
- def self.db
14
- if Runo['storage']['Sequel'] && Runo['storage']['Sequel']['uri']
15
- @db ||= ::Sequel.connect Runo['storage']['Sequel']['uri']
16
- self.load_skel unless @db.table_exists? :runo_main
17
- end
18
- @db
19
- end
20
-
21
- def self.load_skel
22
- @db.create_table(:runo_main) {
23
- String :full_name
24
- String :ext
25
- String :owner
26
- String :body
27
- File :binary_body
28
- primary_key :full_name
29
- } unless @db.table_exists? :runo_main
30
- Runo::Storage::File.traverse('/', Runo['skin_dir']) {|entry|
31
- @db[:runo_main].insert(
32
- :full_name => entry[:full_name],
33
- :ext => entry[:ext],
34
- :owner => entry[:val]['_owner'],
35
- :body => entry[:val].ya2yaml(:syck_compatible => true),
36
- :binary_body => (entry[:ext] == 'yaml') ? nil : entry[:val].to_sequel_blob
37
- ) unless @db[:runo_main][:full_name => entry[:full_name]]
38
- }
39
- end
40
-
41
- def self.available?
42
- self.db
43
- end
44
-
45
- def initialize(sd)
46
- super
47
- @dataset = Runo::Storage::Sequel.db[:runo_main]
48
- @dirname = @sd[:full_name]
49
- end
50
-
51
- def val(id = nil)
52
- if id
53
- load id
54
- else
55
- # this could be HUGE.
56
- _select_all({}).inject({}) {|v, id|
57
- v[id] = load id
58
- v
59
- }
60
- end
61
- end
62
-
63
- def build(v)
64
- clear
65
- v.each {|id, v| store(id, v) } if v
66
- self
67
- end
68
-
69
- def clear
70
- @dataset.grep(:full_name, _full_name('%')).delete
71
- self
72
- end
73
-
74
- def store(id, v, ext = nil)
75
- save(id, v, ext)
76
- end
77
-
78
- def delete(id)
79
- @dataset.filter(_conds(id)).delete &&
80
- @dataset.grep(:full_name, _full_name("#{id}-%")).and(~:ext => 'yaml').delete &&
81
- id
82
- end
83
-
84
- def move(old_id, new_id)
85
- rename(old_id, new_id) && new_id
86
- end
87
-
88
- private
89
-
90
- def _select_by_id(conds)
91
- @dataset.filter(_conds(conds[:id])).collect {|v| _id v[:full_name] }
92
- end
93
-
94
- def _select_by_d(conds)
95
- @dataset.
96
- grep(:full_name, _full_name("#{conds[:d]}%")).
97
- and(:ext => 'yaml').
98
- collect {|v| _id v[:full_name] }
99
- end
100
-
101
- def _select_all(conds)
102
- @dataset.
103
- grep(:full_name, _full_name('%')).
104
- and(:ext => 'yaml').
105
- collect {|v| _id v[:full_name] }
106
- end
107
-
108
- # TODO: overrride _sort() & _page() (they can be done in _select_*)
109
-
110
- def _conds(id)
111
- (id == :all) ? {} : {:full_name => _full_name(id)}
112
- end
113
-
114
- def _full_name(id)
115
- "#{@dirname}-#{id.is_a?(::Array) ? id.first : id}"
116
- end
117
-
118
- def _id(full_name)
119
- full_name.sub("#{@dirname}-", '')
120
- end
121
-
122
- def load(id)
123
- # TODO: cache in _select_*
124
- v = @dataset[:full_name => _full_name(id)]
125
- (v[:ext] == 'yaml' ? YAML.load(v[:body]) : v[:binary_body]) if v
126
- end
127
-
128
- def save(id, v, ext)
129
- Runo::Storage::Sequel.db.transaction {
130
- if new_id?(id, v)
131
- old_id = id
132
- id = new_id v
133
- end
134
-
135
- full_name = _full_name id
136
-
137
- if ext
138
- ext = 'y' if ext == 'yaml'
139
- val = {
140
- :full_name => full_name,
141
- :ext => ext,
142
- :binary_body => v.to_sequel_blob,
143
- }
144
- else
145
- val = {
146
- :full_name => full_name,
147
- :ext => 'yaml',
148
- :owner => v['_owner'],
149
- :body => v.ya2yaml(:syck_compatible => true),
150
- }
151
- end
152
-
153
- if old_id
154
- return if @dataset[:full_name => full_name] # duplicate id
155
- move(old_id, id) unless old_id == :new_id
156
- end
157
- if @dataset[:full_name => full_name]
158
- @dataset[:full_name => full_name] = val
159
- else
160
- @dataset.insert val
161
- end
162
- id
163
- }
164
- end
165
-
166
- def rename(old_id, new_id)
167
- @dataset.grep(:full_name, _full_name("#{old_id}%")).each {|v|
168
- @dataset[:full_name => v[:full_name]] = v.merge(
169
- :full_name => v[:full_name].sub(_full_name(old_id), _full_name(new_id))
170
- )
171
- }
172
- end
173
-
174
- end
@@ -1,73 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009 Akira FUNAI
5
-
6
- class Runo::Storage::Temp < Runo::Storage
7
-
8
- def self.available?
9
- true
10
- end
11
-
12
- def persistent?
13
- false
14
- end
15
-
16
- def val(id = nil)
17
- @val ||= {}
18
- id ? @val[id] : @val
19
- end
20
-
21
- def build(v)
22
- @val = v
23
- self
24
- end
25
-
26
- def clear
27
- @val = {}
28
- self
29
- end
30
-
31
- def store(id, v, ext = :unused)
32
- if new_id?(id, v)
33
- old_id = id
34
- id = new_id v
35
- return if val[id] # duplicate id
36
- move(old_id, id) unless old_id == :new_id
37
- end
38
- val[id] = v
39
- id
40
- end
41
-
42
- def delete(id)
43
- @val.delete id
44
- id
45
- end
46
-
47
- def move(old_id, new_id)
48
- rex = /\A#{old_id}/
49
- val.keys.each {|id|
50
- if id =~ rex
51
- to_id = id.sub(rex, new_id)
52
- @val[to_id] = @val.delete id
53
- end
54
- }
55
- new_id
56
- end
57
-
58
- private
59
-
60
- def _select_by_id(conds)
61
- val.keys & Array(conds[:id])
62
- end
63
-
64
- def _select_by_d(conds)
65
- rex_d = /^#{conds[:d]}/
66
- val.keys.select {|id| id[rex_d] }
67
- end
68
-
69
- def _select_all(conds)
70
- val.keys
71
- end
72
-
73
- end
@@ -1,23 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Dynamic
7
-
8
- private
9
-
10
- def _g_action_create(arg)
11
- label = _('create new %{item}...') % {
12
- :item => _((my[:item].size == 1 && my[:item]['default'][:label]) || my[:item_label])
13
- }
14
- (_get_by_action_tmpl(arg) || <<_html) if permit? :create
15
- <div class="action_create"><a href="#{_g_uri_create arg}">#{label}</a></div>
16
- _html
17
- end
18
-
19
- def _g_uri_create(arg)
20
- "#{my[:path]}/create.html"
21
- end
22
-
23
- end
@@ -1,22 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Static::Folder
7
-
8
- private
9
-
10
- def _g_action_login(arg)
11
- if Runo.client == 'nobody'
12
- <<_html
13
- <div class="action_login"><a href="#{my[:dir]}/login.html">#{_ 'login'}</a></div>
14
- _html
15
- else
16
- <<_html
17
- <div class="action_logout"><a href="#{my[:dir]}/logout.html?_token=#{Runo.token}">#{_ 'logout'}</a></div>
18
- _html
19
- end
20
- end
21
-
22
- end
@@ -1,16 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Static::Folder
7
-
8
- private
9
-
10
- def _g_action_signup(arg)
11
- (_get_by_action_tmpl(arg) || <<_html) if Runo.client == 'nobody'
12
- <div class="action_signup"><a href="/_users/create.html">#{_ 'signup'}</a></div>
13
- _html
14
- end
15
-
16
- end
@@ -1,16 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Static
7
-
8
- private
9
-
10
- def _g_action_update(arg)
11
- (_get_by_action_tmpl(arg) || <<_html.chomp) if permit_get?(:action => :update)
12
- <div class="action_update"><a href="#{_g_uri_update arg}">#{_ 'update...'}</a></div>
13
- _html
14
- end
15
-
16
- end
@@ -1,24 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Static::Folder
7
-
8
- private
9
-
10
- def _g_crumb(arg)
11
- <<_html
12
- <div class="crumb">
13
- #{_crumb}</div>
14
- _html
15
- end
16
-
17
- def _crumb
18
- crumb = <<_html
19
- <a href="#{Runo.uri}#{my[:dir]}/">#{my[:label] || my[:id]}</a>
20
- _html
21
- my[:parent] ? [my[:parent].send(:_crumb), crumb].join(" &raquo;\n") : crumb
22
- end
23
-
24
- end
@@ -1,16 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Dynamic
7
-
8
- private
9
-
10
- def _g_done(arg)
11
- (_get_by_action_tmpl(arg) || <<_html.chomp) if arg[:orig_action] == :done
12
- <div class="done">#{_ 'done.'}</div>
13
- _html
14
- end
15
-
16
- end
@@ -1,25 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Dynamic
7
-
8
- private
9
-
10
- def _g_login(arg)
11
- path = Runo::Path.path_of arg[:conds]
12
- action = arg[:dest_action]
13
- <<_html
14
- <form id="form_#{my[:name]}" method="post" action="#{my[:base_path]}/#{path}login.html">
15
- <div class="login">
16
- <input type="hidden" name="dest_action" value="#{action}" />
17
- <label for="login_id">#{_ 'ID'}</label><input type="text" id="login_id" name="id" size="10" value="" />
18
- <label for="login_pw">#{_ 'Password'}</label><input type="password" id="login_pw" name="pw" size="10" value="" />
19
- <input type="submit" value="#{_ 'login'}" />
20
- </div>
21
- </form>
22
- _html
23
- end
24
-
25
- end
@@ -1,31 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Static::Folder
7
-
8
- private
9
-
10
- def _g_me(arg)
11
- if Runo.client == 'nobody'
12
- <<_html
13
- <div class="me">
14
- #{_g_action_login arg}</div>
15
- _html
16
- else
17
- img = Runo::Set::Static::Folder.root.item('_users', 'main', Runo.client, 'avatar')
18
- roles = Runo::Workflow.roles my[:roles]
19
- <<_html
20
- <div class="me">
21
- <a href="#{Runo.uri}/_users/id=#{Runo.client}/update.html">
22
- #{img.send(:_get_by_self_reference, :sub_action => :without_link) if img}
23
- </a>
24
- <div class="client">#{Runo.client}</div>
25
- <div class="roles">(#{roles.join ', '})</div>
26
- #{_g_action_login arg}</div>
27
- _html
28
- end
29
- end
30
-
31
- end
@@ -1,51 +0,0 @@
1
- # encoding: UTF-8
2
-
3
- # Author:: Akira FUNAI
4
- # Copyright:: Copyright (c) 2009-2010 Akira FUNAI
5
-
6
- class Runo::Set::Dynamic
7
-
8
- private
9
-
10
- def _g_message(arg)
11
- return if arg[:orig_action] == :done && my[:tmpl][:done]
12
- return unless self == Runo.base
13
-
14
- if arg[:dest_action]
15
- message = {:alert => _('please login.')}
16
- elsif arg[:orig_action] == :preview
17
- message = {:notice => _('please confirm.')}
18
- elsif !self.valid? && arg[:orig_action] != :create
19
- message = {:error => _('malformed input.')}
20
- elsif Runo.transaction[my[:tid]].is_a? ::Hash
21
- message = {
22
- :notice => Runo.transaction[my[:tid]].keys.collect {|item_result|
23
- n = Runo.transaction[my[:tid]][item_result]
24
- _('%{result} %{n} %{item}.') % {
25
- :result => {
26
- :create => _('created'),
27
- :update => _('updated'),
28
- :delete => _('deleted'),
29
- }[item_result],
30
- :n => n,
31
- :item => n_(
32
- (my[:item].size == 1 && my[:item]['default'][:label]) || my[:item_label],
33
- '',
34
- n
35
- )
36
- }
37
- }
38
- } unless Runo.transaction[my[:tid]].empty?
39
- Runo.transaction[my[:tid]] = :expired
40
- end
41
-
42
- message.keys.collect {|type|
43
- lis = Array(message[type]).collect {|m| " <li>#{Runo::Field.h m}</li>\n" }
44
- <<_html
45
- <ul class="message #{type}">
46
- #{lis.join}</ul>
47
- _html
48
- }.join if message
49
- end
50
-
51
- end