runo 0.2.1 → 0.2.2

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