zena 1.2.4 → 1.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/History.txt +18 -0
  2. data/app/controllers/nodes_controller.rb +11 -6
  3. data/app/controllers/sites_controller.rb +3 -2
  4. data/app/controllers/user_sessions_controller.rb +1 -1
  5. data/app/controllers/virtual_classes_controller.rb +3 -2
  6. data/app/models/document.rb +2 -2
  7. data/app/models/node.rb +6 -1
  8. data/app/models/note.rb +3 -27
  9. data/app/models/role.rb +11 -5
  10. data/app/models/site.rb +140 -43
  11. data/app/models/string_hash.rb +2 -0
  12. data/app/models/user.rb +9 -4
  13. data/app/models/user_session.rb +1 -1
  14. data/app/models/virtual_class.rb +49 -18
  15. data/app/views/sites/_form.erb +7 -4
  16. data/app/views/sites/_li.erb +15 -9
  17. data/app/views/users/_li.rhtml +3 -0
  18. data/app/views/users/index.rhtml +1 -1
  19. data/app/views/virtual_classes/_form.erb +1 -1
  20. data/bricks/acls/zena/init.rb +1 -2
  21. data/bricks/acls/zena/test/sites/erebus/roles.yml +4 -0
  22. data/bricks/activity/lib/bricks/activity.rb +24 -0
  23. data/bricks/activity/zena/migrate/20130711135905_add_activity_to_user.rb +9 -0
  24. data/bricks/activity/zena/test/integration/activity_integration_test.rb +29 -0
  25. data/bricks/captcha/zena/init.rb +0 -3
  26. data/bricks/fs_skin/lib/bricks/fs_skin.rb +3 -3
  27. data/bricks/fs_skin/zena/skins/blog/Node.zafu +1 -1
  28. data/bricks/fs_skin/zena/tasks.rb +2 -2
  29. data/bricks/fs_skin/zena/test/integration/fs_skin_integration_test.rb +2 -2
  30. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +1 -1
  31. data/bricks/math/zena/init.rb +0 -3
  32. data/bricks/pdf/zena/init.rb +1 -5
  33. data/bricks/worker/zena/init.rb +0 -2
  34. data/bricks/zena/zena/migrate/20130617164527_add_master_id_to_site.rb +13 -0
  35. data/bricks/zena/zena/migrate/20130712081512_alter_login_users.rb +9 -0
  36. data/config/bricks.yml +4 -1
  37. data/lib/bricks/loader.rb +17 -9
  38. data/lib/tasks/zena.rake +40 -5
  39. data/lib/zafu/process/ruby_less_processing.rb +3 -5
  40. data/lib/zena.rb +2 -0
  41. data/lib/zena/acts/secure.rb +11 -2
  42. data/lib/zena/console.rb +5 -4
  43. data/lib/zena/core_ext/string.rb +2 -2
  44. data/lib/zena/deploy.rb +22 -6
  45. data/lib/zena/deploy/logrotate_app.rhtml +10 -7
  46. data/lib/zena/deploy/logrotate_host.rhtml +21 -26
  47. data/lib/zena/deploy/vhost.rhtml +3 -3
  48. data/lib/zena/foxy_parser.rb +1 -1
  49. data/lib/zena/info.rb +1 -1
  50. data/lib/zena/site_worker.rb +2 -2
  51. data/lib/zena/use.rb +0 -1
  52. data/lib/zena/use/ancestry.rb +1 -1
  53. data/lib/zena/use/authlogic.rb +2 -1
  54. data/lib/zena/use/display.rb +6 -0
  55. data/lib/zena/use/query_builder.rb +1 -1
  56. data/lib/zena/use/query_node.rb +3 -3
  57. data/lib/zena/use/rendering.rb +47 -13
  58. data/lib/zena/use/test_helper.rb +1 -1
  59. data/lib/zena/use/urls.rb +6 -104
  60. data/lib/zena/use/zafu_safe_definitions.rb +9 -4
  61. data/lib/zena/use/zafu_templates.rb +1 -0
  62. data/locale/app.pot +4 -0
  63. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  64. data/locale/de/zena.po +6 -2
  65. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  66. data/locale/en/zena.po +6 -2
  67. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  68. data/locale/fr/zena.po +5 -1
  69. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  70. data/locale/it/zena.po +6 -2
  71. data/locale/zena.pot +4 -0
  72. data/test/functional/nodes_controller_test.rb +2 -133
  73. data/test/functional/sites_controller_test.rb +1 -1
  74. data/test/integration/multiple_hosts_test.rb +2 -1
  75. data/test/integration/navigation_test.rb +37 -0
  76. data/test/integration/query_node/basic.yml +1 -1
  77. data/test/integration/zafu_compiler/ajax.yml +7 -0
  78. data/test/integration/zafu_compiler/comments.yml +2 -2
  79. data/test/integration/zafu_compiler/context.yml +6 -2
  80. data/test/integration/zafu_compiler/display.yml +16 -4
  81. data/test/integration/zafu_compiler/forms.yml +1 -0
  82. data/test/integration/zafu_compiler/query.yml +7 -1
  83. data/test/integration/zafu_compiler/relations.yml +12 -7
  84. data/test/integration/zafu_compiler/roles.yml +3 -3
  85. data/test/integration/zafu_compiler/rubyless.yml +1 -2
  86. data/test/integration/zafu_compiler/safe_definitions.yml +5 -0
  87. data/test/sites/complex/roles.yml +1 -1
  88. data/test/sites/ocean/roles.yml +4 -0
  89. data/test/sites/zena/columns.yml +3 -1
  90. data/test/sites/zena/roles.yml +5 -1
  91. data/test/sites/zena/sites.yml +22 -0
  92. data/test/unit/document_test.rb +14 -0
  93. data/test/unit/node_test.rb +14 -0
  94. data/test/unit/role_test.rb +19 -4
  95. data/test/unit/site_test.rb +67 -0
  96. data/test/unit/user_test.rb +20 -0
  97. data/test/unit/virtual_class_test.rb +116 -11
  98. data/test/unit/zena/use/rendering_test.rb +1 -1
  99. data/zena.gemspec +67 -66
  100. metadata +126 -125
  101. data/bricks/fs_skin/zena/init.rb +0 -1
  102. data/bricks/grid/zena/init.rb +0 -4
  103. data/bricks/single/zena/init.rb +0 -1
  104. data/bricks/spreadsheet/zena/init.rb +0 -3
@@ -6,3 +6,7 @@ DEFAULTS:
6
6
  Contact:
7
7
  kpath: NC
8
8
  real_class: Node
9
+
10
+ Note:
11
+ kpath: NN
12
+ real_class: Note
@@ -38,4 +38,6 @@ Contact_email:
38
38
 
39
39
  Contact_address:
40
40
 
41
- Contact_country:
41
+ Contact_country:
42
+
43
+ Note_info:
@@ -60,4 +60,8 @@ Blog:
60
60
  prop:
61
61
  idx_class: IdxProject
62
62
  idx_scope: "{'blog' => 'self'}"
63
- idx_reverse_scope: "nodes in project"
63
+ idx_reverse_scope: "nodes in project"
64
+
65
+ Note:
66
+ kpath: NN
67
+ real_class: Note
@@ -1,5 +1,6 @@
1
1
  zena:
2
2
  host: test.host
3
+ orphan: zena
3
4
  root: zena
4
5
  anon: anon
5
6
  public_group: public
@@ -12,6 +13,27 @@ zena:
12
13
  formats_updated_at: 2008-05-01
13
14
  api_group: managers
14
15
  prop:
16
+ recaptcha_pub: 'pub'
17
+ recaptcha_priv: 'priv'
18
+ usr_prototype_attributes: "{'klass' => 'Contact', 'address' => 'Iping', 'name' => login}"
19
+
20
+ alias:
21
+ master: zena
22
+ host: alias.host
23
+ orphan: zena
24
+ root: wiki
25
+ anon: anon
26
+ public_group: public
27
+ site_group: workers
28
+ authentication: no
29
+ auto_publish: no
30
+ redit_time: 7200
31
+ languages:
32
+ default_lang:
33
+ formats_updated_at:
34
+ api_group:
35
+ prop:
36
+ ssl_on_auth: true
15
37
  recaptcha_pub: 'pub'
16
38
  recaptcha_priv: 'priv'
17
39
  usr_prototype_attributes: "{'klass' => 'Contact', 'address' => 'Iping', 'name' => login}"
@@ -80,6 +80,20 @@ class DocumentTest < Zena::Unit::TestCase
80
80
  assert_equal 'water-1', subject.title
81
81
  end
82
82
  end # with same title
83
+
84
+ context 'with a sub-class of Image' do
85
+ setup do
86
+ login(:lion)
87
+ vclass = secure(VirtualClass) { VirtualClass.create(:superclass => 'Image', :name => 'Video', :create_group_id => groups_id(:public))}
88
+ end
89
+
90
+ should 'create a document' do
91
+ assert_difference('Node.count', 1) do
92
+ assert !subject.new_record?
93
+ assert_equal Document, subject.class
94
+ end
95
+ end
96
+ end
83
97
 
84
98
  context 'without a file' do
85
99
  subject do
@@ -140,7 +140,21 @@ class NodeTest < Zena::Unit::TestCase
140
140
  end
141
141
  end
142
142
  end # setting with transformations
143
+
144
+ context 'saving multiple times' do
145
+ subject do
146
+ secure(Node) { nodes(:status) }
147
+ end
143
148
 
149
+ should 'not create multiple versions' do
150
+ assert_difference('Version.count', 1) do
151
+ subject.update_attributes_with_transformation(:title => 'One')
152
+ assert subject.update_attributes_with_transformation(:reference_id => '33')
153
+ assert subject.update_attributes_with_transformation(:reference_id => '34')
154
+ end
155
+ end
156
+ end
157
+
144
158
  end # on a node with write access
145
159
  end # A logged in user
146
160
 
@@ -250,14 +250,11 @@ class RoleTest < Zena::Unit::TestCase
250
250
  end
251
251
 
252
252
  context 'with invalid index' do
253
- should 'raise errors' do
253
+ should 'raise index errors' do
254
254
  e = nil
255
255
  assert_difference('Column.count', 0) do
256
256
  e = assert_raise(ActiveRecord::RecordInvalid) do
257
257
  subject.import_columns({
258
- 'one' => {
259
- 'ptype' => 'stringbar',
260
- },
261
258
  'two' => {
262
259
  'ptype' => 'integer',
263
260
  'index' => 'bad',
@@ -271,6 +268,24 @@ class RoleTest < Zena::Unit::TestCase
271
268
  end
272
269
  end # with invalid index
273
270
 
271
+ context 'with invalid ptype' do
272
+ should 'raise index errors' do
273
+ e = nil
274
+ assert_difference('Column.count', 0) do
275
+ e = assert_raise(ActiveRecord::RecordInvalid) do
276
+ subject.import_columns({
277
+ 'one' => {
278
+ 'ptype' => 'stringbar',
279
+ },
280
+ })
281
+ end
282
+ end
283
+
284
+ r = e.record
285
+ assert_equal "Column 'one' Validation failed: Ptype invalid", "#{r.class} '#{r.name}' #{e.message}"
286
+ end
287
+ end # with invalid ptype
288
+
274
289
  context 'with invalid column name' do
275
290
  should 'raise errors' do
276
291
  e = nil
@@ -362,7 +362,74 @@ class SiteTest < Zena::Unit::TestCase
362
362
  end
363
363
  end
364
364
 
365
+ context 'A site alias' do
366
+ subject do
367
+ Site.find_by_host('alias.host')
368
+ end
369
+
370
+ should 'return master' do
371
+ assert_equal sites_id('zena'), subject.id
372
+ end
373
+
374
+ should 'have alias' do
375
+ assert_equal sites_id('alias'), subject.alias.id
376
+ end
377
+
378
+ should 'return alias host' do
379
+ assert_equal 'alias.host', subject.host
380
+ end
381
+
382
+ should 'return master zafu path' do
383
+ assert_equal '/test.host/zafu', subject.zafu_path
384
+ end
385
+
386
+ should 'return master data path' do
387
+ assert_equal '/test.host/data', subject.data_path
388
+ end
389
+
390
+ should 'return alias public path' do
391
+ assert_equal '/alias.host/public', subject.public_path
392
+ end
393
+
394
+ should 'return alias cache path' do
395
+ assert_equal '/alias.host/public', subject.cache_path
396
+ end
397
+
398
+ should 'return alias auth settings' do
399
+ assert subject.ssl_on_auth
400
+ end
401
+
402
+ should 'return alias root node' do
403
+ assert_equal nodes_id(:wiki), subject.root_id
404
+ end
405
+ end
406
+
407
+ context 'Creating a site alias' do
408
+ subject do
409
+ Site.find_by_host('test.host')
410
+ end
411
+
412
+ should 'create site' do
413
+ assert_difference('Site.count', 1) do
414
+ assert_difference('Node.count', 0) do
415
+ assert_difference('User.count', 0) do
416
+ subject.create_alias('foo.bar')
417
+ end
418
+ end
419
+ end
420
+ end
365
421
 
422
+ should 'set master_id' do
423
+ ali = subject.create_alias('foo.bar')
424
+ assert_equal subject.id, ali.master_id
425
+ end
426
+
427
+ should 'set host name' do
428
+ ali = subject.create_alias('foo.bar')
429
+ assert_equal 'foo.bar', ali.host
430
+ end
431
+ end
432
+
366
433
  private
367
434
  def fullpath(*args)
368
435
  args.map {|sym| nodes_zip(sym).to_s}.join('/')
@@ -54,6 +54,26 @@ class UserTest < Zena::Unit::TestCase
54
54
  assert_nothing_raised { users(:ant).destroy }
55
55
  end
56
56
  end
57
+
58
+ class GroupsUsersCounter < ActiveRecord::Base
59
+ set_table_name :groups_users
60
+ end
61
+
62
+ should 'remove links to groups' do
63
+ assert_difference('User.count', -1) do
64
+ assert_difference('GroupsUsersCounter.count', -2) do
65
+ assert_nothing_raised { users(:ant).destroy }
66
+ end
67
+ end
68
+ end
69
+
70
+ should 'not remove linked node' do
71
+ assert_difference('User.count', -1) do
72
+ assert_difference('Node.count', 0) do
73
+ assert_nothing_raised { users(:ant).destroy }
74
+ end
75
+ end
76
+ end
57
77
  end # with admin rights
58
78
  end # Destroying a user
59
79
 
@@ -2,8 +2,8 @@
2
2
  require 'test_helper'
3
3
 
4
4
  class VirtualClassTest < Zena::Unit::TestCase
5
- POST_PROPERTIES = %w{assigned cached_role_ids date origin settings summary text title tz weight}
6
- NOTE_PROPERTIES = %w{assigned cached_role_ids origin settings summary text title tz weight}
5
+ POST_PROPERTIES = %w{assigned cached_role_ids date info origin settings summary text title tz weight}
6
+ NOTE_PROPERTIES = %w{assigned cached_role_ids info origin settings summary text title tz weight}
7
7
 
8
8
  def test_virtual_subclasse
9
9
  # add a sub class
@@ -427,8 +427,19 @@ class VirtualClassTest < Zena::Unit::TestCase
427
427
  end # that is not a virtual class instance
428
428
 
429
429
  end # from a node instance
430
-
431
430
  end # Loading a virtual class
431
+
432
+ context 'With a virtual class linked to a real class' do
433
+ setup do
434
+ login(:lion)
435
+ vclass = secure(VirtualClass) { VirtualClass.create(:superclass => 'Document', :name => 'Image')}
436
+ end
437
+
438
+ should 'description' do
439
+
440
+ end
441
+ end
442
+
432
443
 
433
444
  def self.should_clear_cache
434
445
 
@@ -509,7 +520,7 @@ class VirtualClassTest < Zena::Unit::TestCase
509
520
  should 'load new role from cache' do
510
521
  subject
511
522
  # no more linked to assigned
512
- assert_equal %w{assigned cached_role_ids date foo origin settings summary text title tz weight}, VirtualClass['Post'].column_names.sort
523
+ assert_equal %w{assigned cached_role_ids date foo info origin settings summary text title tz weight}, VirtualClass['Post'].column_names.sort
513
524
  end
514
525
 
515
526
  end # Creating a Column
@@ -528,7 +539,7 @@ class VirtualClassTest < Zena::Unit::TestCase
528
539
  should 'load new role from cache' do
529
540
  subject
530
541
  # no more linked to Original
531
- assert_equal %w{assigned cached_role_ids date summary text title}, VirtualClass['Post'].column_names.sort
542
+ assert_equal %w{assigned cached_role_ids date info summary text title}, VirtualClass['Post'].column_names.sort
532
543
  end
533
544
 
534
545
  end # Updating a Role
@@ -566,7 +577,7 @@ class VirtualClassTest < Zena::Unit::TestCase
566
577
  should 'load new role from cache' do
567
578
  subject
568
579
  # no more linked to Original
569
- assert_equal %w{assigned cached_role_ids date summary text title}, VirtualClass['Post'].column_names.sort
580
+ assert_equal %w{assigned cached_role_ids date info summary text title}, VirtualClass['Post'].column_names.sort
570
581
  end
571
582
 
572
583
  end # Deleting a Role
@@ -585,7 +596,7 @@ class VirtualClassTest < Zena::Unit::TestCase
585
596
  should 'load new role from cache' do
586
597
  subject
587
598
  # no more linked to assigned
588
- assert_equal %w{assigned cached_role_ids date origin settings summary text title weight}, VirtualClass['Post'].column_names.sort
599
+ assert_equal %w{assigned cached_role_ids date info origin settings summary text title weight}, VirtualClass['Post'].column_names.sort
589
600
  end
590
601
 
591
602
  end # Deleting a Column
@@ -710,6 +721,37 @@ class VirtualClassTest < Zena::Unit::TestCase
710
721
  assert_equal %w{Node Original Task}, subject.sorted_roles.map(&:name)
711
722
  end
712
723
  end
724
+
725
+ context 'linked to a real class' do
726
+ subject do
727
+ VirtualClass['Note']
728
+ end
729
+
730
+ should 'have an id' do
731
+ assert subject.id
732
+ end
733
+
734
+ should 'define superclass' do
735
+ assert_equal VirtualClass['Node'], subject.superclass
736
+ end
737
+
738
+ should 'be the superclass of descendants' do
739
+ assert_equal subject, VirtualClass['Post'].superclass
740
+ end
741
+
742
+ should 'load all properties' do
743
+ assert_equal %w{assigned cached_role_ids info origin settings summary text title tz weight}, subject.column_names.sort
744
+ end
745
+
746
+ should 'return list of roles' do
747
+ assert_equal %w{Node Original Task Note}, subject.sorted_roles.map(&:name)
748
+ end
749
+
750
+ should 'define safe columns' do
751
+ assert_equal %w{info}, subject.defined_safe_columns.map(&:name)
752
+ end
753
+ end
754
+
713
755
  end # of a real class
714
756
 
715
757
 
@@ -723,7 +765,7 @@ class VirtualClassTest < Zena::Unit::TestCase
723
765
  end
724
766
 
725
767
  should 'return safe columns' do
726
- assert_equal %w{summary text title assigned origin settings tz weight date}, subject.safe_columns.map(&:name)
768
+ assert_equal %w{summary text title assigned origin settings tz weight info date}, subject.safe_columns.map(&:name)
727
769
  end
728
770
 
729
771
  should 'return defined safe columns' do
@@ -731,7 +773,7 @@ class VirtualClassTest < Zena::Unit::TestCase
731
773
  end
732
774
 
733
775
  should 'return safe column types' do
734
- assert_equal %w{assigned date origin settings summary text title tz weight}, subject.safe_column_types.keys.sort
776
+ assert_equal %w{assigned date info origin settings summary text title tz weight}, subject.safe_column_types.keys.sort
735
777
  end
736
778
 
737
779
  should 'return type on safe method type' do
@@ -744,7 +786,7 @@ class VirtualClassTest < Zena::Unit::TestCase
744
786
  end
745
787
 
746
788
  should 'return list of roles' do
747
- assert_equal %w{Node Original Task Post}, subject.sorted_roles.map(&:name)
789
+ assert_equal %w{Node Original Task Note Post}, subject.sorted_roles.map(&:name)
748
790
  end
749
791
  end # of a virtual class
750
792
 
@@ -836,7 +878,8 @@ class VirtualClassTest < Zena::Unit::TestCase
836
878
  :superclass => 'Document',
837
879
  :name => 'HtmlDoc',
838
880
  :create_group_id => groups_id(:public),
839
- :content_type => 'text/html'}
881
+ :content_type => 'text/html',
882
+ }
840
883
  end
841
884
 
842
885
  should 'save and create regexp' do
@@ -852,6 +895,68 @@ class VirtualClassTest < Zena::Unit::TestCase
852
895
  end
853
896
 
854
897
  end
898
+
899
+ context 'linked to a real class' do
900
+ subject do
901
+ v = secure(VirtualClass) do
902
+ VirtualClass.new({
903
+ :superclass => 'Document',
904
+ :name => 'Page',
905
+ :create_group_id => groups_id(:public),
906
+ })
907
+ end
908
+ v.save
909
+ v
910
+ end
911
+
912
+ should 'save' do
913
+ assert !subject.new_record?
914
+ end
915
+
916
+ should 'rewrite superclass' do
917
+ subject
918
+ assert_equal VirtualClass['Node'], subject.superclass
919
+ end
920
+
921
+ should 'properly set real_class' do
922
+ assert_equal Page, subject.real_class
923
+ end
924
+
925
+ should 'echo kpath' do
926
+ assert_equal Page.kpath, subject.kpath
927
+ end
928
+ end
929
+
930
+
931
+ context 'linked to Node class' do
932
+ subject do
933
+ v = secure(VirtualClass) do
934
+ VirtualClass.new({
935
+ :name => 'Node',
936
+ :create_group_id => groups_id(:public),
937
+ })
938
+ end
939
+ v.save
940
+ v
941
+ end
942
+
943
+ should 'save' do
944
+ err subject
945
+ assert !subject.new_record?
946
+ end
947
+
948
+ should 'rewrite superclass' do
949
+ assert_equal Node, subject.superclass
950
+ end
951
+
952
+ should 'properly set real_class' do
953
+ assert_equal Node, subject.real_class
954
+ end
955
+
956
+ should 'echo kpath' do
957
+ assert_equal Node.kpath, subject.kpath
958
+ end
959
+ end
855
960
  end
856
961
  end
857
962