zena 1.0.0.beta2 → 1.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/.gitignore +2 -0
  2. data/History.txt +12 -0
  3. data/app/controllers/application_controller.rb +0 -1
  4. data/app/controllers/columns_controller.rb +11 -1
  5. data/app/controllers/nodes_controller.rb +79 -19
  6. data/app/controllers/versions_controller.rb +0 -2
  7. data/app/controllers/virtual_classes_controller.rb +19 -6
  8. data/app/models/column.rb +5 -1
  9. data/app/models/comment.rb +1 -6
  10. data/app/models/node.rb +21 -3
  11. data/app/models/role.rb +21 -0
  12. data/app/models/site.rb +7 -2
  13. data/app/models/template.rb +3 -3
  14. data/app/models/text_document.rb +4 -4
  15. data/app/models/user.rb +21 -8
  16. data/app/views/columns/_li.html.erb +1 -0
  17. data/app/views/nodes/_groups.rhtml +1 -1
  18. data/app/views/sites/_form.erb +3 -1
  19. data/app/views/sites/_li.erb +1 -0
  20. data/app/views/sites/index.erb +1 -1
  21. data/app/views/virtual_classes/_form.erb +11 -2
  22. data/app/views/virtual_classes/_li.erb +5 -2
  23. data/bin/zena +1 -1
  24. data/bricks/math/lib/bricks/math.rb +1 -1
  25. data/bricks/mongrel/README +3 -0
  26. data/bricks/mongrel/zena/deploy.rb +56 -0
  27. data/bricks/passenger/README +3 -0
  28. data/bricks/passenger/zena/deploy.rb +49 -0
  29. data/config/bricks.yml +6 -0
  30. data/config/deploy.rb +24 -18
  31. data/config/gems.yml +3 -3
  32. data/db/migrate/20100915062903_add_api_group_id_to_site.rb +9 -0
  33. data/lib/tasks/zena.rake +39 -35
  34. data/lib/zena.rb +5 -6
  35. data/lib/zena/acts/enrollable.rb +37 -6
  36. data/lib/zena/app.rb +4 -2
  37. data/lib/zena/deploy.rb +110 -150
  38. data/lib/zena/deploy/awstats.conf.rhtml +4 -4
  39. data/lib/zena/deploy/httpd.rhtml +2 -1
  40. data/lib/zena/deploy/stats.vhost.rhtml +7 -7
  41. data/lib/zena/deploy/vhost.rhtml +1 -1
  42. data/lib/zena/deploy/vhost_www.rhtml +4 -4
  43. data/lib/zena/foxy_parser.rb +6 -5
  44. data/lib/zena/info.rb +1 -1
  45. data/lib/zena/integration/test_case.rb +8 -3
  46. data/lib/zena/parser.rb +11 -11
  47. data/lib/zena/parser/zafu_tags.rb +2 -2
  48. data/lib/zena/remote.rb +16 -0
  49. data/lib/zena/remote/connection.rb +67 -0
  50. data/lib/zena/remote/interface.rb +405 -0
  51. data/lib/zena/remote/klass.rb +14 -0
  52. data/lib/zena/remote/mock.rb +58 -0
  53. data/lib/zena/remote/node.rb +76 -0
  54. data/lib/zena/routes.rb +2 -1
  55. data/lib/zena/use.rb +9 -4
  56. data/lib/zena/use/ajax.rb +3 -3
  57. data/lib/zena/use/authlogic.rb +8 -1
  58. data/lib/zena/use/context.rb +22 -21
  59. data/lib/zena/use/dates.rb +26 -3
  60. data/lib/zena/use/display.rb +33 -5
  61. data/lib/zena/use/forms.rb +90 -12
  62. data/lib/zena/use/fulltext.rb +1 -1
  63. data/lib/zena/use/i18n.rb +118 -31
  64. data/lib/zena/use/query_builder.rb +7 -5
  65. data/lib/zena/use/query_node.rb +30 -4
  66. data/lib/zena/use/rendering.rb +1 -1
  67. data/lib/zena/use/search.rb +10 -7
  68. data/lib/zena/use/urls.rb +3 -3
  69. data/lib/zena/use/zafu_attributes.rb +2 -2
  70. data/lib/zena/use/zafu_eval.rb +1 -1
  71. data/lib/zena/use/zafu_safe_definitions.rb +1 -0
  72. data/lib/zena/use/zafu_templates.rb +1 -1
  73. data/lib/zena/zafu_compiler.rb +5 -1
  74. data/public/javascripts/zena.js +4 -4
  75. data/public/stylesheets/admin.css +1 -0
  76. data/test/custom_queries/complex.host.yml +3 -3
  77. data/test/fixtures/files/translations_fr.yml +4 -1
  78. data/test/functional/application_controller_test.rb +2 -2
  79. data/test/functional/nodes_controller_test.rb +57 -5
  80. data/test/functional/users_controller_test.rb +10 -9
  81. data/test/functional/virtual_classes_controller_test.rb +48 -0
  82. data/test/integration/navigation_test.rb +13 -1
  83. data/test/integration/query_node/filters.yml +5 -0
  84. data/test/integration/query_node_test.rb +1 -1
  85. data/test/integration/zafu_compiler/ajax.yml +13 -19
  86. data/test/integration/zafu_compiler/basic.yml +0 -72
  87. data/test/integration/zafu_compiler/complex.yml +1 -1
  88. data/test/integration/zafu_compiler/complex_ok.yml +19 -0
  89. data/test/integration/zafu_compiler/dates.yml +62 -1
  90. data/test/integration/zafu_compiler/display.yml +4 -4
  91. data/test/integration/zafu_compiler/forms.yml +19 -7
  92. data/test/integration/zafu_compiler/i18n.yml +56 -1
  93. data/test/integration/zafu_compiler/later.yml +23 -1
  94. data/test/integration/zafu_compiler/relations.yml +1 -1
  95. data/test/integration/zafu_compiler/roles.yml +29 -1
  96. data/test/integration/zafu_compiler/safe_definitions.yml +1 -1
  97. data/test/integration/zafu_compiler/zafu_attributes.yml +2 -1
  98. data/test/integration/zafu_compiler_test.rb +5 -3
  99. data/test/sites/zena/columns.yml +3 -0
  100. data/test/sites/zena/roles.yml +0 -1
  101. data/test/sites/zena/sites.yml +1 -0
  102. data/test/sites/zena/versions.yml +2 -0
  103. data/test/unit/node_test.rb +27 -9
  104. data/test/unit/relation_proxy_test.rb +7 -4
  105. data/test/unit/remote_test.rb +379 -0
  106. data/test/unit/user_test.rb +47 -0
  107. data/test/unit/zena/acts/enrollable_test.rb +36 -7
  108. data/test/unit/zena/acts/serializable_test.rb +14 -2
  109. data/test/unit/zena/use/i18n_test.rb +32 -5
  110. data/test/unit/zena/use/query_node_test.rb +13 -1
  111. data/zena.gemspec +25 -11
  112. metadata +24 -10
@@ -246,4 +246,4 @@ all_course_emp_dates_paginate:
246
246
  ref_date: 2004-03-01
247
247
  # in 6 months = before 2004-09-01
248
248
  src: "<r:all_course_emp_dates where='last_date is null or (repeat_every is not null and next_date lt REF_DATE + 6 month)' order='priority desc, log_at asc, node_name ASC' limit='3' paginate='p'><r:link page='list'/> <r:each join=',' do='node_name'/>"
249
- res: "/1 <a.*>2</a> <a.*>3</a> <a.*>4</a> resp_management, secure_a_site, team_motivation/"
249
+ res: "/1 <a.*>2</a> <a.*>3</a> <a.*>4</a> resp_management, secure_a_site, team_motivation/"
@@ -0,0 +1,19 @@
1
+ it_should_compile_custom_select:
2
+ context:
3
+ node_name: '@node'
4
+ node: roger
5
+ visitor: complex_admin
6
+ site: complex
7
+ ref_date: 2004-09-01
8
+ src: "<r:emp_form_dates do='each' join=', '><r:show attr='node_name'/>(<r:priority/>)</r:emp_form_dates>"
9
+ res: 'secureASite(10), winchUsage(10), dangerousTransportations(10), engine(5), transmitInformation(5), fiberJunction(5), formulateProblems(5), radioUsage(1)'
10
+
11
+ it_should_group_by_custom_select:
12
+ context:
13
+ node_name: '@node'
14
+ node: roger
15
+ visitor: complex_admin
16
+ site: complex
17
+ ref_date: 2004-09-01
18
+ src: "<r:emp_form_dates do='group' by='priority' do='each_group' join=', '><r:show attr='priority'/></r:emp_form_dates>"
19
+ res: '10, 5, 1'
@@ -55,4 +55,65 @@ show_date_foo:
55
55
  lang: fr
56
56
  src: "<r:show eval='date' format='%A %d.%m.%Y'/>"
57
57
  tem: "/main_date/"
58
- res: 'dimanche 16.05.2010'
58
+ res: 'dimanche 16.05.2010'
59
+
60
+ strftime:
61
+ src: "<p do='log_at.strftime(\"%d-%m\")'/>"
62
+ res: "<p>05-04</p>"
63
+
64
+ date_tformat:
65
+ context:
66
+ node: 'people'
67
+ lang: 'fr'
68
+ src: "<r:show date='created_at' tformat='%d %B %Y'/>"
69
+ tem: "<%= format_date(@node.created_at, :format => \"%d %B %Y\") %>"
70
+ res: "10 mars 2006"
71
+
72
+ date_tz:
73
+ context:
74
+ visitor: 'ant'
75
+ node: 'people'
76
+ lang: 'en'
77
+ src: "<r:show date='created_at' format='%H:%M'/> / <r:show date='created_at' format='%H:%M' tz='Asia/Jakarta'/>"
78
+ res: "01:00 / 07:00"
79
+
80
+ date_tz_field:
81
+ context:
82
+ node: nature
83
+ src: "<r:nodes do='each' join=', '><r:show attr='node_name'/>: <r:show date='created_at' format='%H:%M' tz='#{tz || \"Europe/Zurich\"}'/> | <r:show date='created_at' format='%H:%M' tz='UTC'/></r:nodes>"
84
+ res: "forest: 01:00 | 00:00, tree: 07:00 | 00:00"
85
+
86
+ date_fr:
87
+ context:
88
+ visitor: ant
89
+ lang: 'fr'
90
+ src: "<r:show date='created_at' format='%a'/>"
91
+ res: "ven"
92
+
93
+ date_fr_lang:
94
+ context:
95
+ lang: 'fr'
96
+ old_src: "<r:show date='created_at' format='%a' lang='en'/>"
97
+ src: "<r:show attr='created_at' format='%a' lang='en'/>"
98
+ tem: "<%= format_date(@node.created_at, :lang => \"en\", :format => \"%a\") %>"
99
+ res: "Fri"
100
+
101
+ date_context:
102
+ old_src: "<r:date select='2008-03-02'><r:show date='current_date' format='%A %d.%m.%Y'/></r:date>"
103
+ src: "<r:show eval='parse_date(\"2008-03-02\")' format='%A %d.%m.%Y'/>"
104
+ res: "Sunday 02.03.2008"
105
+
106
+ date_from_params:
107
+ context:
108
+ year: 1975
109
+ old_src: "<r:date select='[param:year]-01-01'><r:show date='current_date' format='%A %d.%m.%Y'/></r:date>"
110
+ src: "<r:show eval='parse_date(\"#{params[:year]}-01-01\")' format='%A %d.%m.%Y'/>"
111
+ tem: "<%= format_date(parse_date(\"#{params[:year]}-01-01\"), :format => \"%A %d.%m.%Y\") %>"
112
+ res: "Wednesday 01.01.1975"
113
+
114
+ date_from_params_in_query:
115
+ context:
116
+ year: 2006
117
+ src: "<r:date text='#{params[:year]}/04/03' format='%Y/%m/%d' do='show' eval='date' format='%Y-%m-%d'/>"
118
+ tem: "/_zdate = \"#\{params\[:year\]\}/04/03\".to_utc\(\"%Y/%m/%d\"\) -%>/"
119
+ res: "2006-04-03"
@@ -63,21 +63,21 @@ show_live_no_tag:
63
63
 
64
64
  show_format:
65
65
  old_src: "<b do='[id]' format='%.2f'/>"
66
- src: "<b do='#{id}' format='%.2f'/>"
66
+ src: "<b do='id' format='%.2f'/>"
67
67
  res: "<b>22.00</b>"
68
68
 
69
69
  show_format_nil:
70
70
  context:
71
71
  node: 'bird_jpg'
72
72
  old_src: "<b do='[d_id]' format='%.2f'/>"
73
- src: "<b do='#{weight}' format='%.2f'/>"
73
+ src: "<b do='weight' format='%.2f'/>"
74
74
  res: "<b>0.00</b>"
75
75
 
76
76
  show_format_hide_zero:
77
77
  context:
78
78
  node: 'bird_jpg'
79
79
  old_src: "<b do='[d_id]' format='%.2f' zero='hide'/>"
80
- src: "<b do='#{weight}' format='%.2f' zero='hide'/>"
80
+ src: "<b do='weight' format='%.2f' zero='hide'/>"
81
81
  res: "<b></b>"
82
82
 
83
83
  show_edit_preview:
@@ -93,7 +93,7 @@ title_in_version_context:
93
93
 
94
94
  show_shortcut:
95
95
  old_src: "<p do='[title]'>hello</p>"
96
- src: "<p do='#{title}'>hello</p>"
96
+ src: "<p do='title'>hello</p>"
97
97
  tem: "<p><%= @node.prop['title'] %></p>"
98
98
  res: "<p>status title</p>"
99
99
 
@@ -14,6 +14,24 @@ add_btn:
14
14
  </table>"
15
15
  res: "/<tr class='btn_add' id='list1_add'><td><b><a href='#' onclick/"
16
16
 
17
+ form_put:
18
+ # default should be a put method
19
+ src: "<r:form></r:form>"
20
+ tem: "/form_for.*:url.*node_path\(@node\.zip\)/"
21
+ res: '/<form action="/nodes/\d+".*method="post".*input name="_method" type="hidden" value="put"/'
22
+
23
+ form_post:
24
+ # Should make a post on new objects
25
+ src: "<r:new klass='Post' title='Joe'><r:form></r:form></r:new>"
26
+ tem: "/if var1 = new_instance\(\"Post\", :title => \"Joe\"\)/"
27
+ res: "!/\"put\"/"
28
+
29
+ new:
30
+ # Should accept allowed params (from class and roles) and transform ids to zip (back and forth)
31
+ src: "<r:new klass='Letter' title='Joe' parent_id='#{project.id}' paper='white' origin='Mars' bad='value'><r:form><r:input name='title'/> <r:input name='parent_id'/></r:form></r:new>"
32
+ tem: "/:title => \"Joe\", :parent_id => .*@node.project.zip.*, :paper => \"white\", :origin => \"Mars\"/"
33
+ res: "/<input type='text' name='node\[title\]' value='Joe'/> <input type='text' name='node\[parent_id\]' value='21'/><div class='hidden'><input type='hidden' name='node\[klass\]' value='Letter'/><input type='hidden' name='node\[paper\]' value='white'/><input type='hidden' name='node\[origin\]' value='Mars'/></div>/"
34
+
17
35
  translate_id_to_zip:
18
36
  src: "<b do='hot_id'/><i do='parent_id'/>"
19
37
  tem: "<b><%= @node.rel[\"hot\"].try(:other_zip) %></b><i><%= @node.parent_zip %></i>"
@@ -48,12 +66,6 @@ select_nodes_show_attr:
48
66
  src: "<r:form><r:select name='title' nodes='images in site' attr='ext' show='title'/></r:form>"
49
67
  res: "/name=.node\[title\].>.*<option value=\"jpg\">flower</option>\n<option value=\"jpg\">it's a lake</option>/"
50
68
 
51
- select_nodes_data_list:
52
- context:
53
- node: status
54
- src: "<r:data><r:each><r:form><select nodes='projects in site' name='node_a_id'/></r:form></r:each></r:data>"
55
- res: "/option\s* value=.29.\s* selected=.selected.>wiki/"
56
-
57
69
  select_time_zone:
58
70
  src: "<r:form><r:select type='time_zone' name='d_tz'/></r:form>"
59
71
  res: "/Asia/Jakarta.*Europe/Zurich.*US/Hawai"
@@ -127,4 +139,4 @@ input_new:
127
139
  show_in_form:
128
140
  src: "<r:form><b do='title'/></r:form>"
129
141
  tem: "/<b><%= @node.prop\['title'\] %></b>/"
130
- res: '/<b>status title</b>/'
142
+ res: '/<b>status title</b>/'
@@ -78,10 +78,18 @@ trans_attr:
78
78
  res: "english"
79
79
 
80
80
  trans_text_dyn_string:
81
+ context:
82
+ lang: 'fr'
81
83
  src: "<r:trans text='lang_#{ref_lang}'/>"
82
84
  tem: "<%= trans(\"lang_#{@node.ref_lang}\") %>"
83
85
  res: "lang_en"
84
86
 
87
+ trans_rubyless_dyn_string:
88
+ context:
89
+ lang: 'fr'
90
+ src: "<r:load dictionary='/default/translations'><p do='t(\"lang_#{ref_lang}\")'/></r:load>"
91
+ res: "<p>anglais</p>"
92
+
85
93
  trans_literal_string:
86
94
  src: "<r:trans text='e#{\"\"}n'/>"
87
95
  tem: "english"
@@ -104,4 +112,51 @@ complex_lang_list:
104
112
  <ul do='site.lang_list'>
105
113
  <li do='each' class='#{this == visitor.lang ? "on" : "off"}' do='zen_path(@node, :lang =&gt; this)'/>
106
114
  </ul>
107
- res: "/li class='on'>/oo/projects/cleanWater/page22.html\?lang=en</"
115
+ res: "/li class='on'>/oo/projects/cleanWater/page22.html\?lang=en</"
116
+
117
+ html_lang_and_dict:
118
+ src: "<html xmlns='http://www.w3.org/1999/xhtml' lang='#{v.lang}' do='load' dictionary='/default/translations' xml:lang='en'></html>"
119
+ res: "<html xmlns='http://www.w3.org/1999/xhtml' lang='en'></html>"
120
+
121
+ dictionary_fr:
122
+ context:
123
+ lang: 'fr'
124
+ src: "<r:load dictionary='/default/translations'><r:trans>foo</r:trans>: <r:t>I love</r:t> <r:trans>words</r:trans></r:load>"
125
+ tem: "<% _zdict = load_dictionary(828931430) -%>foo: j'aime les mots"
126
+ res: "foo: j'aime les mots"
127
+
128
+ dynamic_dictionary_eval_fr:
129
+ context:
130
+ lang: 'fr'
131
+ node: status
132
+ src: "<r:load dictionary='/default/translations'><r:eval>trans(node_name)</r:eval></r:load>"
133
+ tem: "<% _zdict = load_dictionary(828931430) -%><%= _zdict.get(@node.node_name) %>"
134
+ res: "statut"
135
+
136
+ dynamic_dictionary_t_fr:
137
+ context:
138
+ lang: 'fr'
139
+ node: status
140
+ src: "<r:load dictionary='/default/translations'><r:t attr='node_name'/></r:load>"
141
+ tem: "<% _zdict = load_dictionary(828931430) -%><%= _zdict.get(@node.node_name) %>"
142
+ res: "statut"
143
+
144
+ dynamic_dictionary_literal_fr:
145
+ context:
146
+ lang: 'fr'
147
+ node: status
148
+ src: "<r:load dictionary='/default/translations'><r:eval>trans('status')</r:eval></r:load>"
149
+ tem: "<% _zdict = load_dictionary(828931430) -%>statut"
150
+ res: "statut"
151
+
152
+ dictionary_de:
153
+ context:
154
+ lang: 'de'
155
+ src: "<r:load dictionary='/default/translations'><r:trans>foo</r:trans>: <r:trans>I love</r:trans> <r:trans>words</r:trans></r:load>"
156
+ tem: "<% _zdict = load_dictionary(828931430) -%>foo: Ich liebe Wörter"
157
+ res: "foo: Ich liebe Wörter"
158
+
159
+ dictionary_tformat:
160
+ src: "<r:load dictionary='/default/translations'><r:show date='created_at' tformat='date_format'/></r:load>"
161
+ tem: "<% _zdict = load_dictionary(828931430) -%><%= format_date(@node.created_at, :format => \"[%d.%m]\") %>"
162
+ res: "[10.03]"
@@ -28,4 +28,26 @@ each_in_each_dom_id:
28
28
  # [swap] needs to be reimplemented
29
29
  swap_in_each:
30
30
  src: "<r:pages><li do='each'><span do='swap' attr='origin' states='todo,done,alert'/></li></r:pages>"
31
- tem: "/<li id='list1_<%= var1.zip %>'><span>.*var1.can_write?.*tag_to_remote.*else.*var1.version.dyn\[\"status\"\]/"
31
+ tem: "/<li id='list1_<%= var1.zip %>'><span>.*var1.can_write?.*tag_to_remote.*else.*var1.version.dyn\[\"status\"\]/"
32
+
33
+
34
+ # [ajax] zazen edit=true (maybe should implement in zafu_attributes with filter_edit)
35
+ zazen_edit:
36
+ src: "<r:zazen attr='node_name' edit='true'/>"
37
+ tem: "<div class='zazen' id='list1_name'><% if @node.can_write? -%><span class='zazen_edit'><%= link_to_remote(\"edit\", :url => edit_node_path(@node.zip) + \"?attribute=name&dom_id=list1_name&zazen=true\", :method => :get) %></span><% end -%><%= zazen(@node.node_name, :node=>@node) %></div>"
38
+ res: "/div class='zazen' id='list1_name'>.*Ajax\.Request\('/nodes/22/edit\?attribute=name/"
39
+
40
+ zazen_edit_publish_force:
41
+ src: "<r:zazen attr='node_name' edit='true' publish='force'/>"
42
+ tem: "/attribute=node_name&dom_id=.*_node_name&publish=force&zazen=true/"
43
+
44
+ zazen_edit_publish_true:
45
+ src: "<r:zazen attr='node_name' edit='true' publish='true'/>"
46
+ tem: "/attribute=node_name&dom_id=.*_node_name&publish=true&zazen=true/"
47
+
48
+ # Update query builder for DataEntry
49
+ select_nodes_data_list:
50
+ context:
51
+ node: status
52
+ src: "<r:data><r:each><r:form><select nodes='projects in site' name='node_a_id'/></r:form></r:each></r:data>"
53
+ res: "/option\s* value=.29.\s* selected=.selected.>wiki/"
@@ -336,7 +336,7 @@ else:
336
336
 
337
337
  incompatible_else:
338
338
  src: "<r:letters where='node_name = 1' in='site' else='this' do='each' join=',' do='node_name'/>"
339
- tem: "/\(Node\).*finder \(\[Letter\]\)/"
339
+ tem: "/Incompatible.*\(Node\).*finder \(\[Letter\]\)/"
340
340
 
341
341
  where_not:
342
342
  context:
@@ -25,4 +25,32 @@ show_property_filter_role_has_role:
25
25
 
26
26
  show_bad_role:
27
27
  src: "<r:Foo>abc</r:Foo>"
28
- tem: "/Invalid role or class 'Foo'/"
28
+ tem: "/Invalid role or class 'Foo'/"
29
+
30
+ form_with_all_roles:
31
+ context:
32
+ node: tree_jpg
33
+ src: |
34
+ <r:possible_roles>
35
+ <fieldset do='each'>
36
+ <legend do='name'/>
37
+ <ul do='columns'>
38
+ <li do='each'><label do='name'/> <r:input/></li>
39
+ </ul>
40
+ </fieldset>
41
+ </r:possible_roles>
42
+ res: "/label.weight.*node\[weight\].*origin.*value='Big Bang'.*assigned/"
43
+
44
+ show_all_properties:
45
+ context:
46
+ node: tree_jpg
47
+ src: |
48
+ <r:roles>
49
+ <fieldset do='each'>
50
+ <legend do='name'/>
51
+ <ul do='columns'>
52
+ <li do='each' do='if' test='@node.send(name)'><label do='name'/> <r:eval>@node.send(name)</r:eval></li>
53
+ </ul>
54
+ </fieldset>
55
+ </r:roles>
56
+ res: "/<label>origin</label> Big Bang</li>/"
@@ -11,7 +11,7 @@ params:
11
11
  context:
12
12
  d: 'hello ladies'
13
13
  old_src: "<i do='show' param='d'/>"
14
- src: "<i do='#{params[:d]}'/>"
14
+ src: "<i do='params[:d]'/>"
15
15
  tem: "<i><%= params[:d] %></i>"
16
16
  res: "<i>hello ladies</i>"
17
17
 
@@ -137,7 +137,8 @@ test_negative_value:
137
137
  tem: "<div class='<%= ((@node.custom_a==-10)) ? ' off' : '' %>'>...</div>"
138
138
 
139
139
  anchor_attribute:
140
- src: "<p do='#{id}' anchor='#{node_name}'>hello</p>"
140
+ # Use to_s so that the method executed replaces the dummy text.
141
+ src: "<p do='id.to_s' anchor='#{node_name}'>hello</p>"
141
142
  res: "<a class='anchor' name='status'></a><p>22</p>"
142
143
 
143
144
  anchor_true:
@@ -25,21 +25,23 @@ class ZafuCompilerTest < Zena::Controller::TestCase
25
25
  'zafu_attributes',
26
26
  'zazen',
27
27
  'security',
28
+ 'ajax',
29
+ 'complex_ok',
30
+ 'forms',
28
31
  ]
29
32
 
30
33
  BUG = [
31
- 'ajax',
32
34
  'apphelper',
33
35
  'basic',
34
36
  'complex',
35
37
  'data',
36
38
  'eval',
37
- 'forms',
39
+ 'complex',
38
40
  ]
39
41
 
40
42
  LATER = %w{later}
41
43
 
42
- yamltest :directories => ([:default] + Bricks.zafu_tests), :files => OK #+ BUG
44
+ yamltest :directories => ([:default] + Bricks.zafu_tests), :files => OK
43
45
 
44
46
  Section # make sure we load Section links before trying relations
45
47
 
@@ -8,5 +8,8 @@ Original_origin:
8
8
  Original_weight:
9
9
  ptype: integer
10
10
 
11
+ Original_tz:
12
+ ptype: string
13
+
11
14
  Letter_paper:
12
15
  ptype: string
@@ -22,7 +22,6 @@ Tracker:
22
22
  Tag:
23
23
  kpath: NPT
24
24
  real_class: Page
25
- create_group: admin
26
25
 
27
26
  Task:
28
27
  kpath: N
@@ -11,6 +11,7 @@ zena:
11
11
  languages: en,fr,de,es
12
12
  default_lang: en
13
13
  formats_updated_at: 2008-05-01
14
+ api_group: managers
14
15
  prop:
15
16
  recaptcha_pub: 'pub'
16
17
  recaptcha_priv: 'priv'
@@ -175,6 +175,7 @@ cleanWater_en:
175
175
  prop:
176
176
  assigned: gaspard
177
177
  tz: Asia/Jakarta
178
+ foo: Some old legacy stuff
178
179
  title: Clean Water project
179
180
 
180
181
 
@@ -420,6 +421,7 @@ tree_jpg_en:
420
421
  summary: "photography © André Karwath 2004"
421
422
  text: ""
422
423
  origin: Big Bang
424
+ tz: Asia/Jakarta
423
425
  cached_role_ids: Original
424
426
  content_type: image/jpeg
425
427
  ext: jpg
@@ -1027,22 +1027,31 @@ done: \"I am done\""
1027
1027
  end
1028
1028
 
1029
1029
  def test_classes_for_form
1030
- assert_equal [["Page", "Page"],
1031
- ["  Project", "Project"],
1032
- ["  Section", "Section"],
1033
- ["    Skin", "Skin"]], Node.classes_for_form(:class=>'Page', :without=>'Document')
1030
+ Node.get_class('Tag')
1031
+ assert_equal [
1032
+ ["Page", "Page"],
1033
+ ["  Project", "Project"],
1034
+ ["  Section", "Section"],
1035
+ ["    Skin", "Skin"],
1036
+ ["  Tag", "Tag"],
1037
+ ], Node.classes_for_form(:class=>'Page', :without=>'Document')
1034
1038
  end
1035
1039
 
1036
1040
  def test_change_to_classes_for_form
1037
- assert_equal [["Page", "Page"],
1038
- ["  Project", "Project"],
1039
- ["  Section", "Section"],
1040
- ["    Skin", "Skin"]], Project.classes_for_form(:class=>'Page', :without=>'Document')
1041
+ Node.get_class('Tag')
1042
+ assert_equal [
1043
+ ["Page", "Page"],
1044
+ ["  Project", "Project"],
1045
+ ["  Section", "Section"],
1046
+ ["    Skin", "Skin"],
1047
+ ["  Tag", "Tag"],
1048
+ ], Project.classes_for_form(:class=>'Page', :without=>'Document')
1041
1049
  end
1042
1050
 
1043
1051
  def test_allowed_change_to_classes
1052
+ Node.get_class('Tag')
1044
1053
  node_changes = Node.allowed_change_to_classes.reject{|k| k[/Dummy/]} # In case we are testing after Secure
1045
- assert_equal %w{Node Note Letter Post Page Project Section Skin Reference}, node_changes
1054
+ assert_equal %w{Node Note Letter Post Page Project Section Skin Tag Reference}, node_changes
1046
1055
 
1047
1056
  assert_equal node_changes, Page.allowed_change_to_classes.reject{|k| k[/Dummy/]}
1048
1057
  assert_equal node_changes, Project.allowed_change_to_classes.reject{|k| k[/Dummy/]}
@@ -1447,4 +1456,13 @@ done: \"I am done\""
1447
1456
  note = secure(Node) { nodes(:opening) }
1448
1457
  assert_equal %w{text title}, note.parse_keys.sort
1449
1458
  end
1459
+
1460
+ def test_safe_send
1461
+ node = secure(Node) { nodes(:status) }
1462
+ assert_equal 'safe_send("title")', RubyLess.translate(Node, 'send("title")')
1463
+
1464
+ assert_equal 'status title', node.safe_send("title")
1465
+ assert_equal nodes_zip(:status).to_s, node.safe_send("id")
1466
+ assert_equal nil, node.safe_send("object_id")
1467
+ end
1450
1468
  end