zena 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/History.txt +29 -1
  2. data/Rakefile +0 -1
  3. data/app/controllers/documents_controller.rb +1 -1
  4. data/app/controllers/nodes_controller.rb +34 -8
  5. data/app/controllers/sites_controller.rb +8 -1
  6. data/app/controllers/user_sessions_controller.rb +13 -3
  7. data/app/models/acl.rb +16 -0
  8. data/app/models/document.rb +33 -14
  9. data/app/models/idx_nodes_integer.rb +5 -0
  10. data/app/models/image.rb +16 -4
  11. data/app/models/node.rb +16 -3
  12. data/app/models/relation_proxy.rb +3 -3
  13. data/app/models/site.rb +11 -1
  14. data/app/models/string_hash.rb +1 -1
  15. data/app/models/template.rb +1 -1
  16. data/app/models/user.rb +6 -1
  17. data/app/models/virtual_class.rb +36 -1
  18. data/app/views/acls/_form.rhtml +5 -1
  19. data/app/views/acls/_li.rhtml +1 -1
  20. data/app/views/templates/document_create_tabs/_file.rhtml +1 -0
  21. data/app/views/templates/document_create_tabs/_template.rhtml +1 -1
  22. data/app/views/users/_form.rhtml +1 -0
  23. data/app/views/virtual_classes/_form.erb +8 -7
  24. data/bricks/acls/lib/bricks/acls.rb +43 -15
  25. data/bricks/acls/zena/migrate/20130313110443_add_create_kpath_to_acl.rb +13 -0
  26. data/bricks/acls/zena/migrate/20130429073432_fix_create_kpath_default.rb +8 -0
  27. data/bricks/acls/zena/test/integration/acl_integration_test.rb +53 -1
  28. data/bricks/acls/zena/test/sites/erebus/acls.yml +21 -0
  29. data/bricks/acls/zena/test/unit/acl_test.rb +35 -2
  30. data/bricks/math/lib/bricks/math.rb +1 -1
  31. data/bricks/sphinx/zena/tasks.rb +1 -1
  32. data/bricks/spreadsheet/lib/bricks/spreadsheet.rb +1 -1
  33. data/bricks/worker/zena/worker +25 -0
  34. data/config/environment.rb +1 -1
  35. data/config/environments/production.rb +1 -1
  36. data/config/gems.yml +6 -5
  37. data/lib/bricks/requirements_validation.rb +1 -1
  38. data/lib/log_recorder/lib/log_recorder.rb +1 -1
  39. data/lib/tasks/zena.rake +10 -2
  40. data/lib/zena.rb +4 -3
  41. data/lib/zena/app.rb +1 -0
  42. data/lib/zena/deploy/httpd.rhtml +2 -2
  43. data/lib/zena/deploy/template.rb +15 -5
  44. data/lib/zena/info.rb +1 -1
  45. data/lib/zena/parser/zazen_rules.rb +9 -2
  46. data/lib/zena/remote/connection.rb +2 -2
  47. data/lib/zena/remote/interface.rb +8 -2
  48. data/lib/zena/remote/node.rb +1 -1
  49. data/lib/zena/routes.rb +2 -1
  50. data/lib/zena/use/action.rb +8 -2
  51. data/lib/zena/use/ajax.rb +31 -20
  52. data/lib/zena/use/calendar.rb +2 -0
  53. data/lib/zena/use/conditional.rb +15 -14
  54. data/lib/zena/use/dates.rb +5 -2
  55. data/lib/zena/use/display.rb +3 -2
  56. data/lib/zena/use/forms.rb +36 -9
  57. data/lib/zena/use/i18n.rb +8 -2
  58. data/lib/zena/use/image_builder.rb +7 -0
  59. data/lib/zena/use/query_node.rb +24 -8
  60. data/lib/zena/use/relations.rb +2 -6
  61. data/lib/zena/use/rendering.rb +10 -6
  62. data/lib/zena/use/upload.rb +6 -4
  63. data/lib/zena/use/urls.rb +13 -5
  64. data/lib/zena/use/zafu_safe_definitions.rb +1 -1
  65. data/public/javascripts/grid.js +11 -2
  66. data/public/javascripts/upload-progress.js +5 -3
  67. data/public/javascripts/zena.js +6 -2
  68. data/public/stylesheets/upload-progress.css +1 -0
  69. data/test/fixtures/files/TestNode.zafu +2 -2
  70. data/test/fixtures/files/translations_fr.yml +2 -1
  71. data/test/functional/acls_controller_test.rb +6 -0
  72. data/test/functional/nodes_controller_test.rb +1 -1
  73. data/test/functional/sites_controller_test.rb +19 -0
  74. data/test/integration/navigation_test.rb +7 -0
  75. data/test/integration/query_node/filters.yml +10 -0
  76. data/test/integration/zafu_compiler/action.yml +8 -4
  77. data/test/integration/zafu_compiler/ajax.yml +4 -4
  78. data/test/integration/zafu_compiler/calendar.yml +8 -15
  79. data/test/integration/zafu_compiler/context.yml +1 -1
  80. data/test/integration/zafu_compiler/dates.yml +5 -1
  81. data/test/integration/zafu_compiler/display.yml +1 -2
  82. data/test/integration/zafu_compiler/forms.yml +37 -10
  83. data/test/integration/zafu_compiler/query.yml +5 -5
  84. data/test/integration/zafu_compiler/relations.yml +8 -8
  85. data/test/integration/zafu_compiler/safe_definitions.yml +7 -2
  86. data/test/integration/zafu_compiler/urls.yml +24 -3
  87. data/test/integration/zafu_compiler/zazen.yml +9 -1
  88. data/test/selenium/Destroy/destroy1.rsel +2 -1
  89. data/test/selenium/Destroy/destroy2.rsel +17 -0
  90. data/test/unit/document_test.rb +17 -4
  91. data/test/unit/relation_proxy_test.rb +19 -8
  92. data/test/unit/string_hash_test.rb +1 -1
  93. data/test/unit/template_test.rb +3 -3
  94. data/test/unit/virtual_class_test.rb +77 -0
  95. data/test/unit/zena/use/urls_test.rb +9 -1
  96. data/vendor/plugins/selenium-on-rails/lib/selenium_on_rails_config.rb +1 -1
  97. data/zena.gemspec +60 -53
  98. metadata +145 -125
@@ -33,7 +33,7 @@ icon:
33
33
  node: 'cleanWater'
34
34
  src: "<r:icon do='title'/>"
35
35
  tem: "/ORDER BY links.id DESC/"
36
- res: "it's a lake"
36
+ res: "it&#39;s a lake"
37
37
 
38
38
  pages:
39
39
  context:
@@ -91,7 +91,7 @@ pages_random:
91
91
 
92
92
  nodes_in_project:
93
93
  src: "<r:nodes in='project' limit='2'><r:each join=', '><r:show attr='title'/></r:each></r:nodes>"
94
- res: "it's a lake, Lake Tanganyika"
94
+ res: "it&#39;s a lake, Lake Tanganyika"
95
95
 
96
96
  nodes_in_project_stored:
97
97
  src: "<r:void set_foo='this'><r:node where='id = 29 in site'>from <r:show attr='title'/>, look at <r:foo do='title'/>: <r:foo do='pages in project' do='each' join=', ' do='title'/></r:node></r:void>"
@@ -289,7 +289,7 @@ projects:
289
289
 
290
290
  nodes:
291
291
  src: "<r:nodes in='project'><r:each join=', ' do='show' attr='title'/></r:nodes>"
292
- res: "it's a lake, Lake Tanganyika, parc opening, status title, water"
292
+ res: "it&#39;s a lake, Lake Tanganyika, parc opening, status title, water"
293
293
 
294
294
  menu_with_favorites:
295
295
  context:
@@ -348,7 +348,7 @@ where:
348
348
 
349
349
  where_like:
350
350
  src: "<r:images where='title like \"%ke\"' in='site' do='each' join=',' do='title'/>"
351
- res: "it's a lake"
351
+ res: "it&#39;s a lake"
352
352
 
353
353
  else:
354
354
  src: "<r:nodes where='id = 1' in='site' else='[this]' do='each' join=',' do='title'/>"
@@ -363,7 +363,7 @@ where_not:
363
363
  context:
364
364
  node: 'cleanWater'
365
365
  src: "<r:nodes where='title ne \"status title\"' do='each' join=',' do='title'/>"
366
- res: "it's a lake,Lake Tanganyika,parc opening,water"
366
+ res: "it&#39;s a lake,Lake Tanganyika,parc opening,water"
367
367
 
368
368
  where_two_attributes:
369
369
  src: "<r:nodes where='log_at ne event_at' in='site' do='each' join=', ' do='title'/>"
@@ -373,7 +373,7 @@ where_two_attributes:
373
373
  many_or:
374
374
  # old: or='images in site' or='tags in site'
375
375
  src: "<r:tagged in='site or images in site or tags in site' do='each' join=',' do='title'/>"
376
- res: "Art,bird,Clean Water project,flower,it's a lake,News list,parc opening,Top menu"
376
+ res: "Art,bird,Clean Water project,flower,it&#39;s a lake,News list,parc opening,Top menu"
377
377
 
378
378
  hot_or_page:
379
379
  context:
@@ -405,11 +405,11 @@ group_by_project_sort_zip:
405
405
  context:
406
406
  visitor: ant
407
407
  src: "<r:images in='site' order='zip ASC' do='group' by='project' sort='id'><b do='project' do='title'/>: <r:each join=', ' do='title'/></r:images>"
408
- res: "<b>Clean Water project</b>: it's a lake<b>a wiki with Zena</b>: bird, flower<b>Zena the wild CMS</b>: Autumn Tree"
408
+ res: "<b>Clean Water project</b>: it&#39;s a lake<b>a wiki with Zena</b>: bird, flower<b>Zena the wild CMS</b>: Autumn Tree"
409
409
 
410
410
  group_by_parent_sort:
411
411
  src: "<r:images in='site' order='title ASC' do='group' by='parent' sort='title'><b do='parent' do='title'/>: <r:each join=', ' do='title'/></r:images>"
412
- res: "<b>a wiki with Zena</b>: bird, flower<b>Clean Water project</b>: it's a lake"
412
+ res: "<b>a wiki with Zena</b>: bird, flower<b>Clean Water project</b>: it&#39;s a lake"
413
413
 
414
414
  nodes_in_site_group_by_year:
415
415
  old_src: "<r:nodes in='site' group='log_at:year' order='log_at:year asc, title ASC' do='each' join=', '><r:show attr='log_at' format='%Y'/></r:nodes>"
@@ -96,7 +96,7 @@ map_join:
96
96
  node: 'cleanWater'
97
97
  src: "<r:children do='map(\"title\").join(\",\")'/>"
98
98
  tem: "/var1.map\{\|_map_obj\| _map_obj.prop\['title'\]\}/"
99
- res: "crocodiles,it's a lake,The lake we love,parc opening,status title,water"
99
+ res: "crocodiles,it&#39;s a lake,The lake we love,parc opening,status title,water"
100
100
 
101
101
  sum:
102
102
  context:
@@ -145,7 +145,12 @@ range:
145
145
  x: 4
146
146
  src: "<r:void do='(0..params[:x].to_i).to_a'><span do='each' join=' ' do='this'/></r:void>"
147
147
  res: '<span>0</span> <span>1</span> <span>2</span> <span>3</span> <span>4</span>'
148
-
148
+
149
+ range_literal:
150
+ src: "<r:void do='(0..4).to_a'><span do='each' join=' ' do='this'/></r:void>"
151
+ tem: '/\(0..4\)/'
152
+ res: '<span>0</span> <span>1</span> <span>2</span> <span>3</span> <span>4</span>'
153
+
149
154
  hash_to_params:
150
155
  context:
151
156
  q:
@@ -187,10 +187,19 @@ encode_params:
187
187
  b: 'Bee'
188
188
  c: 'Sea'
189
189
  x: ''
190
- src: "<r:link encode_params='a,c,x,y'/>"
191
- tem: "/:encode_params => \"a,c,x,y\"/"
190
+ src: "<r:link encode_params='a,c,x,y,mode'/>"
191
+ tem: "/:encode_params => \"a,c,x,y,mode\"/"
192
192
  res: "/page22\.html\?a%5Bb%5D=Bee&c=Sea'/"
193
193
 
194
+ encode_params_mode:
195
+ context:
196
+ mode: 'print'
197
+ a: 'Sea'
198
+ b: ''
199
+ src: "<r:link encode_params='a,b,mode'/>"
200
+ tem: "/:encode_params => \"a,b,mode\"/"
201
+ res: "/page22_print\.html\?a=Sea'/"
202
+
194
203
  title_link_mode:
195
204
  old_src: "<h2 do='title' link='details'/>"
196
205
  src: "<h2 do='link' mode='details' do='title' live='true'/>"
@@ -264,7 +273,19 @@ target_blank:
264
273
 
265
274
  action_destroy:
266
275
  src: "<r:link action='destroy'/>"
267
- res: "<a data-confirm='Destroy status title ?' href='/nodes/22' onclick='return Zena.m(this,\"delete\")'>status title</a>"
276
+ res: "<a data-confirm='Destroy \"status title\" ?' href='/nodes/22' onclick='return Zena.m(this,\"delete\")'>status title</a>"
277
+
278
+ action_destroy_message_apos:
279
+ context:
280
+ p: "O'Hear"
281
+ src: "<r:link action='destroy' confirm='#{params[:p]}'/>"
282
+ res: "<a data-confirm='O&apos;Hear' href='/nodes/22' onclick='return Zena.m(this,\"delete\")'>status title</a>"
283
+
284
+ action_destroy_message_apos_remote:
285
+ context:
286
+ p: "O'Hear"
287
+ src: "<div id='foo' do='block'></div><r:link action='destroy' confirm='#{params[:p]}' update='foo'/>"
288
+ res: "/confirm\(this.getAttribute\(.data-confirm.\)\)/"
268
289
 
269
290
  action_publish:
270
291
  src: "<r:link action='publish'/>"
@@ -125,4 +125,12 @@ target:
125
125
  src: |
126
126
  <r:zazen text='"":12' target="foobar"/>
127
127
  tem: /:target => "foobar"/
128
- res: /<div class='zazen'><p><a .* target=\"foobar\"/
128
+ res: /<div class='zazen'><p><a .* target=\"foobar\"/
129
+
130
+ notextile_not_auth:
131
+ src: "<r:zazen text='<notextile>hello</notextile>'/>"
132
+ res: "<div class='zazen'></div>"
133
+
134
+ notextile_auth:
135
+ src: "<r:zazen notextile='true' text='<notextile>hello\nblah\nblah</notextile>'/>"
136
+ res: "<div class='zazen'>hello\nblah\nblah</div>"
@@ -4,11 +4,12 @@ verify_element_not_present 'destroy_destroy1'
4
4
 
5
5
  click 'css=img[alt=add]'
6
6
  type 'destroy_list1_title', 'destroy1'
7
+ type 'destroy_list1_summary', 'destroy1'
7
8
  click 'css=input[type=submit]'
8
9
  wait_for_element_present 'destroy_destroy1'
9
10
 
10
11
  click 'css=#destroy_destroy1 a'
11
- assert_confirmation 'Destroy destroy1 ?'
12
+ assert_confirmation 'Destroy "destroy1" ?'
12
13
  wait_for_element_not_present 'destroy_destroy1'
13
14
 
14
15
  # Reload
@@ -0,0 +1,17 @@
1
+ # Add first element
2
+ open '/oo/testnode37.html?test=destroy1'
3
+ verify_element_not_present 'destroy_destroy2'
4
+
5
+ click 'css=img[alt=add]'
6
+ type 'destroy_list1_title', "rock'n rol\"l"
7
+ type 'destroy_list1_summary', 'destroy2'
8
+ click 'css=input[type=submit]'
9
+ wait_for_element_present 'destroy_destroy2'
10
+
11
+ click 'css=#destroy_destroy2 a'
12
+ assert_confirmation 'Destroy "rock\'n rol"l" ?'
13
+ wait_for_element_not_present 'destroy_destroy2'
14
+
15
+ # Reload
16
+ open '/oo/testnode37.html?test=destroy2'
17
+ verify_element_not_present 'destroy_destroy2'
@@ -7,19 +7,32 @@ class DocumentTest < Zena::Unit::TestCase
7
7
  should 'return self on unknown content_type' do
8
8
  class Dummy < Document
9
9
  end
10
- assert_equal Dummy, Dummy.document_class_from_content_type('zorglub')
10
+ assert_equal 'DocumentTest::Dummy', Dummy.document_class_from_content_type('zorglub').to_s
11
11
  end
12
12
 
13
13
  should 'return Image on image types' do
14
- assert_equal Image, Document.document_class_from_content_type('image/png')
14
+ assert_equal 'Image', Document.document_class_from_content_type('image/png').to_s
15
15
  end
16
16
 
17
17
  should 'not return Image on svg' do
18
- assert_equal TextDocument, Document.document_class_from_content_type('image/svg+xml')
18
+ assert_equal 'TextDocument', Document.document_class_from_content_type('image/svg+xml').to_s
19
19
  end
20
20
 
21
21
  should 'return TextDocument on nil' do
22
- assert_equal TextDocument, Document.document_class_from_content_type(nil)
22
+ assert_equal 'TextDocument', Document.document_class_from_content_type(nil).to_s
23
+ end
24
+
25
+ should 'return matching content_type sub-class' do
26
+ login(:lion)
27
+ secure(VirtualClass) {
28
+ VirtualClass.create(
29
+ :superclass => 'TextDocument',
30
+ :name => 'HtmlDoc',
31
+ :create_group_id => groups_id(:public),
32
+ :content_type => 'text/html'
33
+ )}
34
+ assert_equal VirtualClass['HtmlDoc'], Document.document_class_from_content_type('text/html')
35
+ assert_equal VirtualClass['TextDocument'], Document.document_class_from_content_type('text/plain')
23
36
  end
24
37
  end
25
38
 
@@ -572,22 +572,33 @@ class RelationProxyTest < Zena::Unit::TestCase
572
572
  subject do
573
573
  node = secure(Node) { nodes(:cleanWater)}
574
574
  end
575
-
576
- setup do
575
+
576
+ should 'update with string list of ids' do
577
577
  login(:lion)
578
578
  node = secure(Node) { nodes(:cleanWater)}
579
579
  assert_difference('Link.count', 3) do
580
- node.update_attributes_with_transformation('reference_ids' => [:art, :menu, :bird_jpg].map {|s| nodes_zip(s)})
580
+ node.update_attributes_with_transformation('reference_ids' => [:art, :menu, :bird_jpg].map {|s| nodes_zip(s)}.join(', '))
581
581
  end
582
582
  end
583
+
584
+ context 'updating' do
583
585
 
584
- should 'use other_id to update status' do
585
- assert_difference('Link.count', 0) do
586
- assert subject.update_attributes_with_transformation('rel' => {'reference' => {'other_id' => nodes_zip(:art), :status => 100}})
587
- err subject
586
+ setup do
587
+ login(:lion)
588
+ node = secure(Node) { nodes(:cleanWater)}
589
+ assert_difference('Link.count', 3) do
590
+ node.update_attributes_with_transformation('reference_ids' => [:art, :menu, :bird_jpg].map {|s| nodes_zip(s)})
591
+ end
588
592
  end
589
593
 
590
- assert_equal 100, subject.find(:first, 'reference where l_status = 100').l_status
594
+ should 'use other_id to update status' do
595
+ assert_difference('Link.count', 0) do
596
+ assert subject.update_attributes_with_transformation('rel' => {'reference' => {'other_id' => nodes_zip(:art), :status => 100}})
597
+ err subject
598
+ end
599
+
600
+ assert_equal 100, subject.find(:first, 'reference where l_status = 100').l_status
601
+ end
591
602
  end
592
603
  end # With many links
593
604
  end
@@ -12,7 +12,7 @@ class StringHashTest < Test::Unit::TestCase
12
12
  end
13
13
 
14
14
  should 'convert to json' do
15
- assert_match %r{"json_class":"StringHash",\{"data":\{"b":"2","a":"1"|"a":"1","b":"2"\}\}|\{"data":\{"b":"2","a":"1"|"a":"1","b":"2"\},"json_class":"StringHash"\}}, subject.to_json
15
+ assert_match %r{"json_class":"StringHash","data":\{"b":"2","a":"1"|"a":"1","b":"2"\}|"data":\{"b":"2","a":"1"|"a":"1","b":"2"\},"json_class":"StringHash"}, subject.to_json
16
16
  end
17
17
 
18
18
  should 'create from json' do
@@ -123,7 +123,7 @@ class TemplateTest < Zena::Unit::TestCase
123
123
 
124
124
  context 'with a blank title' do
125
125
  subject do
126
- secure(Template) { Template.create(:parent_id=>nodes_id(:default), :target_klass => 'Section') }
126
+ secure(Template) { Template.create(:parent_id => nodes_id(:default), :target_klass => 'Section') }
127
127
  end
128
128
 
129
129
  should 'use target_klass as title' do
@@ -198,9 +198,9 @@ class TemplateTest < Zena::Unit::TestCase
198
198
  secure!(Document) { Document.create(:parent_id => nodes_id(:default), :title => 'sub.html')}
199
199
  end
200
200
 
201
- should 'create a Template' do
201
+ should 'create a TextDocument' do
202
202
  assert !subject.new_record?
203
- assert_kind_of Template, subject
203
+ assert_kind_of TextDocument, subject
204
204
  end
205
205
  end # with an html extension
206
206
 
@@ -60,6 +60,17 @@ class VirtualClassTest < Zena::Unit::TestCase
60
60
  assert !classes_for_form.include?("Page")
61
61
  assert !classes_for_form.include?("Reference")
62
62
  end
63
+
64
+ def test_sub_classes
65
+ # add a sub class
66
+ login(:lion)
67
+ vclass = VirtualClass.create(:superclass => 'Post', :name => 'Super', :create_group_id => groups_id(:public))
68
+ assert !vclass.new_record?
69
+
70
+ login(:anon)
71
+
72
+ assert_equal %w{Post Super}, VirtualClass['Post'].sub_classes.map(&:name)
73
+ end
63
74
 
64
75
  def test_post_classes_for_form_opt
65
76
  # add a sub class
@@ -808,8 +819,74 @@ class VirtualClassTest < Zena::Unit::TestCase
808
819
  should 'consider role methods as safe' do
809
820
  assert_equal Hash[:class=>String, :method=>"prop['assigned']", :nil=>true], subject.safe_method_type(['assigned'])
810
821
  end
822
+
823
+ # with content_type
824
+ #
811
825
  end # A virtual class
826
+
827
+ context 'Creating a virtual class' do
828
+ context 'with an admin visitor' do
829
+ setup do
830
+ login(:lion)
831
+ end
832
+
833
+ context 'with content_type' do
834
+ subject do
835
+ {
836
+ :superclass => 'Document',
837
+ :name => 'HtmlDoc',
838
+ :create_group_id => groups_id(:public),
839
+ :content_type => 'text/html'}
840
+ end
841
+
842
+ should 'save and create regexp' do
843
+ v = secure(VirtualClass) { VirtualClass.new(subject) }
844
+ assert v.save
845
+ assert_equal %r{^text/html$}, v.content_type_re
846
+ end
847
+
848
+ should 'add an error on bad content_type' do
849
+ v = secure(VirtualClass) { VirtualClass.new(subject.merge(:content_type => '(')) }
850
+ assert !v.save
851
+ assert_equal 'invalid characters', v.errors[:content_type]
852
+ end
853
+
854
+ end
855
+ end
856
+ end
857
+
858
+ context 'A Virtual class' do
859
+ context 'subclass of Document with content_type' do
860
+ setup do
861
+ login(:lion)
862
+ end
863
+
864
+ context 'with content_type' do
865
+ subject do
866
+ secure(VirtualClass) {
867
+ VirtualClass.create(
868
+ :superclass => 'TextDocument',
869
+ :name => 'HtmlDoc',
870
+ :create_group_id => groups_id(:public),
871
+ :content_type => 'text/html'
872
+ )}
873
+ end
812
874
 
875
+ should 'be used to create matching content_type documents' do
876
+ klass = subject
877
+ n = secure!(Document) { Document.create(
878
+ :parent_id => nodes_id(:cleanWater),
879
+ :content_type => 'text/html',
880
+ :file => uploaded_text('some.txt'))
881
+ }
882
+
883
+ assert !n.new_record?
884
+ assert_equal subject.name, n.klass
885
+ end
886
+ end
887
+ end
888
+ end
889
+
813
890
  context 'A visitor with write access' do
814
891
  setup do
815
892
  login(:tiger)
@@ -53,6 +53,14 @@ class UrlsTest < Zena::View::TestCase
53
53
  assert_equal '/en/projects-list/Clean-Water-project/page22.html?a%5Bb%5D=Bee&p=Pepe', zen_path(node, :encode_params => 'p,a')
54
54
  end
55
55
 
56
+ def test_zen_path_query_params_array
57
+ login(:anon)
58
+ node = secure!(Node) { nodes(:status) }
59
+ assert_equal '/en/projects-list/Clean-Water-project/page22.html?p=5', zen_path(node, :p => 5)
60
+ @params = {'p' => 'Pepe', 'b' => ['','bee','c','','dee']}
61
+ assert_equal '/en/projects-list/Clean-Water-project/page22.html?b%5B%5D=bee&b%5B%5D=c&b%5B%5D=dee&p=Pepe', zen_path(node, :encode_params => 'p,b')
62
+ end
63
+
56
64
  def test_zen_path_cache_stamp
57
65
  login(:ant)
58
66
  node = secure!(Node) { nodes(:zena) }
@@ -127,7 +135,7 @@ class UrlsTest < Zena::View::TestCase
127
135
  end
128
136
 
129
137
  def test_data_path_for_public_documents
130
- login(:ant)
138
+ login(:lion)
131
139
  node = secure!(Node) { nodes(:water_pdf) }
132
140
  assert_equal "/en/projects-list/Clean-Water-project/document25.pdf", data_path(node)
133
141
  node = secure!(Node) { nodes(:status) }
@@ -1,4 +1,4 @@
1
- require 'yaml'
1
+ require 'safe_yaml'
2
2
  require 'erb'
3
3
 
4
4
  class SeleniumOnRailsConfig
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zena}
8
- s.version = "1.2.3"
8
+ s.version = "1.2.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gaspard Bucher"]
12
- s.date = %q{2013-03-11}
12
+ s.date = %q{2013-06-13}
13
13
  s.default_executable = %q{zena}
14
14
  s.description = %q{zena is a Ruby on Rails CMS (content managment system) with a focus on usability, ease of customization and web 2.0 goodness (application like behaviour).}
15
15
  s.email = %q{gaspard@teti.ch}
@@ -68,6 +68,7 @@ Gem::Specification.new do |s|
68
68
  "app/models/group.rb",
69
69
  "app/models/idx_nodes_datetime.rb",
70
70
  "app/models/idx_nodes_float.rb",
71
+ "app/models/idx_nodes_integer.rb",
71
72
  "app/models/idx_nodes_ml_string.rb",
72
73
  "app/models/idx_nodes_string.rb",
73
74
  "app/models/idx_project.rb",
@@ -285,6 +286,8 @@ Gem::Specification.new do |s|
285
286
  "bricks/acls/zena/init.rb",
286
287
  "bricks/acls/zena/migrate/20110509141600_create_acls.rb",
287
288
  "bricks/acls/zena/migrate/20110627193757_add_allowed_mode_and_format_to_acl.rb",
289
+ "bricks/acls/zena/migrate/20130313110443_add_create_kpath_to_acl.rb",
290
+ "bricks/acls/zena/migrate/20130429073432_fix_create_kpath_default.rb",
288
291
  "bricks/acls/zena/test/integration/acl_integration_test.rb",
289
292
  "bricks/acls/zena/test/sites/erebus/acls.yml",
290
293
  "bricks/acls/zena/test/sites/erebus/groups.yml",
@@ -2011,6 +2014,7 @@ Gem::Specification.new do |s|
2011
2014
  "test/selenium/Add/add3.rsel",
2012
2015
  "test/selenium/Destroy/0setup.rsel",
2013
2016
  "test/selenium/Destroy/destroy1.rsel",
2017
+ "test/selenium/Destroy/destroy2.rsel",
2014
2018
  "test/selenium/Drop/0setup.rsel",
2015
2019
  "test/selenium/Drop/drop1.rsel",
2016
2020
  "test/selenium/Drop/drop2.rsel",
@@ -2473,84 +2477,87 @@ Gem::Specification.new do |s|
2473
2477
  s.specification_version = 3
2474
2478
 
2475
2479
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
2476
- s.add_runtime_dependency(%q<rails>, ["= 2.3.11"])
2477
- s.add_runtime_dependency(%q<differ>, ["= 0.1.2"])
2480
+ s.add_runtime_dependency(%q<tzinfo>, [">= 0"])
2478
2481
  s.add_runtime_dependency(%q<fast_gettext>, ["~> 0.4.16"])
2479
- s.add_runtime_dependency(%q<shoulda>, ["= 2.10.3"])
2480
- s.add_runtime_dependency(%q<open4>, [">= 0"])
2481
- s.add_runtime_dependency(%q<authlogic>, ["= 2.1.3"])
2482
- s.add_runtime_dependency(%q<querybuilder>, ["= 1.2.1"])
2482
+ s.add_runtime_dependency(%q<rubyless>, ["= 0.8.10"])
2483
2483
  s.add_runtime_dependency(%q<jeweler>, [">= 0"])
2484
- s.add_runtime_dependency(%q<yamltest>, ["= 0.7.0"])
2485
2484
  s.add_runtime_dependency(%q<json>, ["= 1.5.1"])
2485
+ s.add_runtime_dependency(%q<shoulda>, ["= 2.10.3"])
2486
+ s.add_runtime_dependency(%q<httmultiparty>, ["= 0.3.8"])
2487
+ s.add_runtime_dependency(%q<gem_plugin>, [">= 0"])
2486
2488
  s.add_runtime_dependency(%q<daemons>, [">= 0"])
2487
- s.add_runtime_dependency(%q<property>, ["= 2.3.2"])
2488
- s.add_runtime_dependency(%q<versions>, ["= 0.3.1"])
2489
- s.add_runtime_dependency(%q<simple_xlsx_writer>, [">= 0"])
2489
+ s.add_runtime_dependency(%q<yamltest>, ["= 0.7.0"])
2490
+ s.add_runtime_dependency(%q<open4>, [">= 0"])
2491
+ s.add_runtime_dependency(%q<authlogic>, ["= 2.1.3"])
2492
+ s.add_runtime_dependency(%q<safe_yaml>, ["= 0.8.0"])
2493
+ s.add_runtime_dependency(%q<rails>, ["= 2.3.18"])
2490
2494
  s.add_runtime_dependency(%q<hpricot>, [">= 0"])
2491
- s.add_runtime_dependency(%q<gettext>, ["= 2.1.0"])
2492
- s.add_runtime_dependency(%q<ruby-recaptcha>, ["= 1.0.3"])
2493
- s.add_runtime_dependency(%q<tzinfo>, [">= 0"])
2494
- s.add_runtime_dependency(%q<gem_plugin>, [">= 0"])
2495
- s.add_runtime_dependency(%q<rubyless>, ["= 0.8.8"])
2496
- s.add_runtime_dependency(%q<syntax>, ["= 1.0.0"])
2495
+ s.add_runtime_dependency(%q<querybuilder>, ["= 1.2.2"])
2496
+ s.add_runtime_dependency(%q<simple_xlsx_writer>, [">= 0"])
2497
+ s.add_runtime_dependency(%q<property>, ["= 2.3.2"])
2497
2498
  s.add_runtime_dependency(%q<uuidtools>, ["= 2.0.0"])
2499
+ s.add_runtime_dependency(%q<syntax>, ["= 1.0.0"])
2498
2500
  s.add_runtime_dependency(%q<will_paginate>, ["~> 2.3.12"])
2499
- s.add_runtime_dependency(%q<httparty>, ["= 0.7.8"])
2501
+ s.add_runtime_dependency(%q<ruby-recaptcha>, ["= 1.0.3"])
2500
2502
  s.add_runtime_dependency(%q<RedCloth>, ["= 3.0.4"])
2503
+ s.add_runtime_dependency(%q<versions>, ["= 0.3.1"])
2504
+ s.add_runtime_dependency(%q<differ>, ["= 0.1.2"])
2505
+ s.add_runtime_dependency(%q<gettext>, ["= 2.1.0"])
2501
2506
  else
2502
- s.add_dependency(%q<rails>, ["= 2.3.11"])
2503
- s.add_dependency(%q<differ>, ["= 0.1.2"])
2507
+ s.add_dependency(%q<tzinfo>, [">= 0"])
2504
2508
  s.add_dependency(%q<fast_gettext>, ["~> 0.4.16"])
2505
- s.add_dependency(%q<shoulda>, ["= 2.10.3"])
2506
- s.add_dependency(%q<open4>, [">= 0"])
2507
- s.add_dependency(%q<authlogic>, ["= 2.1.3"])
2508
- s.add_dependency(%q<querybuilder>, ["= 1.2.1"])
2509
+ s.add_dependency(%q<rubyless>, ["= 0.8.10"])
2509
2510
  s.add_dependency(%q<jeweler>, [">= 0"])
2510
- s.add_dependency(%q<yamltest>, ["= 0.7.0"])
2511
2511
  s.add_dependency(%q<json>, ["= 1.5.1"])
2512
+ s.add_dependency(%q<shoulda>, ["= 2.10.3"])
2513
+ s.add_dependency(%q<httmultiparty>, ["= 0.3.8"])
2514
+ s.add_dependency(%q<gem_plugin>, [">= 0"])
2512
2515
  s.add_dependency(%q<daemons>, [">= 0"])
2513
- s.add_dependency(%q<property>, ["= 2.3.2"])
2514
- s.add_dependency(%q<versions>, ["= 0.3.1"])
2515
- s.add_dependency(%q<simple_xlsx_writer>, [">= 0"])
2516
+ s.add_dependency(%q<yamltest>, ["= 0.7.0"])
2517
+ s.add_dependency(%q<open4>, [">= 0"])
2518
+ s.add_dependency(%q<authlogic>, ["= 2.1.3"])
2519
+ s.add_dependency(%q<safe_yaml>, ["= 0.8.0"])
2520
+ s.add_dependency(%q<rails>, ["= 2.3.18"])
2516
2521
  s.add_dependency(%q<hpricot>, [">= 0"])
2517
- s.add_dependency(%q<gettext>, ["= 2.1.0"])
2518
- s.add_dependency(%q<ruby-recaptcha>, ["= 1.0.3"])
2519
- s.add_dependency(%q<tzinfo>, [">= 0"])
2520
- s.add_dependency(%q<gem_plugin>, [">= 0"])
2521
- s.add_dependency(%q<rubyless>, ["= 0.8.8"])
2522
- s.add_dependency(%q<syntax>, ["= 1.0.0"])
2522
+ s.add_dependency(%q<querybuilder>, ["= 1.2.2"])
2523
+ s.add_dependency(%q<simple_xlsx_writer>, [">= 0"])
2524
+ s.add_dependency(%q<property>, ["= 2.3.2"])
2523
2525
  s.add_dependency(%q<uuidtools>, ["= 2.0.0"])
2526
+ s.add_dependency(%q<syntax>, ["= 1.0.0"])
2524
2527
  s.add_dependency(%q<will_paginate>, ["~> 2.3.12"])
2525
- s.add_dependency(%q<httparty>, ["= 0.7.8"])
2528
+ s.add_dependency(%q<ruby-recaptcha>, ["= 1.0.3"])
2526
2529
  s.add_dependency(%q<RedCloth>, ["= 3.0.4"])
2530
+ s.add_dependency(%q<versions>, ["= 0.3.1"])
2531
+ s.add_dependency(%q<differ>, ["= 0.1.2"])
2532
+ s.add_dependency(%q<gettext>, ["= 2.1.0"])
2527
2533
  end
2528
2534
  else
2529
- s.add_dependency(%q<rails>, ["= 2.3.11"])
2530
- s.add_dependency(%q<differ>, ["= 0.1.2"])
2535
+ s.add_dependency(%q<tzinfo>, [">= 0"])
2531
2536
  s.add_dependency(%q<fast_gettext>, ["~> 0.4.16"])
2532
- s.add_dependency(%q<shoulda>, ["= 2.10.3"])
2533
- s.add_dependency(%q<open4>, [">= 0"])
2534
- s.add_dependency(%q<authlogic>, ["= 2.1.3"])
2535
- s.add_dependency(%q<querybuilder>, ["= 1.2.1"])
2537
+ s.add_dependency(%q<rubyless>, ["= 0.8.10"])
2536
2538
  s.add_dependency(%q<jeweler>, [">= 0"])
2537
- s.add_dependency(%q<yamltest>, ["= 0.7.0"])
2538
2539
  s.add_dependency(%q<json>, ["= 1.5.1"])
2540
+ s.add_dependency(%q<shoulda>, ["= 2.10.3"])
2541
+ s.add_dependency(%q<httmultiparty>, ["= 0.3.8"])
2542
+ s.add_dependency(%q<gem_plugin>, [">= 0"])
2539
2543
  s.add_dependency(%q<daemons>, [">= 0"])
2540
- s.add_dependency(%q<property>, ["= 2.3.2"])
2541
- s.add_dependency(%q<versions>, ["= 0.3.1"])
2542
- s.add_dependency(%q<simple_xlsx_writer>, [">= 0"])
2544
+ s.add_dependency(%q<yamltest>, ["= 0.7.0"])
2545
+ s.add_dependency(%q<open4>, [">= 0"])
2546
+ s.add_dependency(%q<authlogic>, ["= 2.1.3"])
2547
+ s.add_dependency(%q<safe_yaml>, ["= 0.8.0"])
2548
+ s.add_dependency(%q<rails>, ["= 2.3.18"])
2543
2549
  s.add_dependency(%q<hpricot>, [">= 0"])
2544
- s.add_dependency(%q<gettext>, ["= 2.1.0"])
2545
- s.add_dependency(%q<ruby-recaptcha>, ["= 1.0.3"])
2546
- s.add_dependency(%q<tzinfo>, [">= 0"])
2547
- s.add_dependency(%q<gem_plugin>, [">= 0"])
2548
- s.add_dependency(%q<rubyless>, ["= 0.8.8"])
2549
- s.add_dependency(%q<syntax>, ["= 1.0.0"])
2550
+ s.add_dependency(%q<querybuilder>, ["= 1.2.2"])
2551
+ s.add_dependency(%q<simple_xlsx_writer>, [">= 0"])
2552
+ s.add_dependency(%q<property>, ["= 2.3.2"])
2550
2553
  s.add_dependency(%q<uuidtools>, ["= 2.0.0"])
2554
+ s.add_dependency(%q<syntax>, ["= 1.0.0"])
2551
2555
  s.add_dependency(%q<will_paginate>, ["~> 2.3.12"])
2552
- s.add_dependency(%q<httparty>, ["= 0.7.8"])
2556
+ s.add_dependency(%q<ruby-recaptcha>, ["= 1.0.3"])
2553
2557
  s.add_dependency(%q<RedCloth>, ["= 3.0.4"])
2558
+ s.add_dependency(%q<versions>, ["= 0.3.1"])
2559
+ s.add_dependency(%q<differ>, ["= 0.1.2"])
2560
+ s.add_dependency(%q<gettext>, ["= 2.1.0"])
2554
2561
  end
2555
2562
  end
2556
2563