zena 1.2.4 → 1.2.5

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