social_stream 0.4.3 → 0.4.4

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 (94) hide show
  1. data/app/controllers/api_controller.rb +1 -1
  2. data/app/controllers/contacts_controller.rb +1 -1
  3. data/app/controllers/conversations_controller.rb +5 -5
  4. data/app/controllers/groups_controller.rb +1 -0
  5. data/app/controllers/likes_controller.rb +17 -5
  6. data/app/controllers/messages_controller.rb +3 -1
  7. data/app/controllers/profiles_controller.rb +4 -0
  8. data/app/controllers/representations_controller.rb +12 -1
  9. data/app/controllers/tags_controller.rb +15 -0
  10. data/app/controllers/users_controller.rb +3 -0
  11. data/app/helpers/activities_helper.rb +13 -6
  12. data/app/models/activity.rb +53 -52
  13. data/app/models/activity_object.rb +2 -0
  14. data/app/models/actor.rb +85 -19
  15. data/app/models/avatar.rb +2 -1
  16. data/app/models/like.rb +28 -13
  17. data/app/models/permission.rb +7 -7
  18. data/app/models/profile.rb +1 -1
  19. data/app/models/relation/custom.rb +111 -0
  20. data/app/models/relation/public.rb +42 -0
  21. data/app/models/relation.rb +1 -89
  22. data/app/models/sphere.rb +7 -0
  23. data/app/models/tie.rb +65 -52
  24. data/app/models/tie_activity.rb +38 -0
  25. data/app/views/activities/_new.html.erb +4 -4
  26. data/app/views/activities/_options.html.erb +2 -2
  27. data/app/views/actors/_actor.html.erb +0 -0
  28. data/app/views/avatars/index.html.erb +5 -2
  29. data/app/views/comments/_new.html.erb +2 -2
  30. data/app/views/contacts/index.html.erb +5 -1
  31. data/app/views/conversations/edit.html.erb +4 -0
  32. data/app/views/conversations/index.html.erb +5 -1
  33. data/app/views/conversations/show.html.erb +4 -0
  34. data/app/views/frontpage/index.html.erb +4 -0
  35. data/app/views/groups/_sidebar_index.html.erb +7 -42
  36. data/app/views/groups/index.html.erb +3 -0
  37. data/app/views/groups/new.html.erb +3 -0
  38. data/app/views/groups/show.html.erb +7 -0
  39. data/app/views/layouts/_account.html.erb +16 -0
  40. data/app/views/layouts/_footer.html.erb +1 -1
  41. data/app/views/layouts/_header.erb +7 -22
  42. data/app/views/layouts/_representation.html.erb +25 -12
  43. data/app/views/layouts/application.html.erb +6 -3
  44. data/app/views/layouts/frontpage.html.erb +1 -1
  45. data/app/views/likes/create.js.erb +1 -1
  46. data/app/views/likes/destroy.js.erb +1 -1
  47. data/app/views/messages/new.html.erb +7 -5
  48. data/app/views/profiles/_profile.html.erb +20 -0
  49. data/app/views/profiles/edit.html.erb +42 -0
  50. data/app/views/profiles/show.html.erb +4 -0
  51. data/app/views/profiles/update.js.erb +5 -0
  52. data/app/views/subjects/_toolbar_profile_menu_tie_options.html.erb +3 -1
  53. data/app/views/ties/_new.html.erb +1 -1
  54. data/app/views/users/index.html.erb +4 -0
  55. data/app/views/users/show.html.erb +5 -0
  56. data/config/locales/en.yml +54 -1
  57. data/config/routes.rb +3 -1
  58. data/lib/generators/social_stream/install_generator.rb +2 -1
  59. data/lib/generators/social_stream/templates/migration.rb +23 -27
  60. data/lib/generators/social_stream/templates/public/images/btn/error.png +0 -0
  61. data/lib/generators/social_stream/templates/public/images/btn/info.png +0 -0
  62. data/lib/generators/social_stream/templates/public/images/btn/like.png +0 -0
  63. data/lib/generators/social_stream/templates/public/images/btn/nolike.png +0 -0
  64. data/lib/generators/social_stream/templates/public/images/btn/success.png +0 -0
  65. data/lib/generators/social_stream/templates/public/images/btn/warning.png +0 -0
  66. data/lib/generators/social_stream/templates/public/javascripts/ajax.paginate.js +12 -19
  67. data/lib/generators/social_stream/templates/public/javascripts/jquery.validate.js +1 -1
  68. data/lib/generators/social_stream/templates/public/javascripts/main.js +20 -10
  69. data/lib/generators/social_stream/templates/public/stylesheets/default/base.css +21 -4
  70. data/lib/generators/social_stream/templates/public/stylesheets/default/header.css +8 -3
  71. data/lib/generators/social_stream/templates/relations.yml +7 -13
  72. data/lib/social_stream/ability.rb +39 -20
  73. data/lib/social_stream/controllers/helpers.rb +6 -0
  74. data/lib/social_stream/models/object.rb +8 -4
  75. data/lib/social_stream/models/subject.rb +6 -0
  76. data/lib/social_stream/rails.rb +6 -3
  77. data/lib/social_stream/version.rb +1 -1
  78. data/lib/tasks/db/populate.rake +11 -1
  79. data/social_stream.gemspec +7 -8
  80. data/spec/controllers/comments_controller_spec.rb +6 -2
  81. data/spec/controllers/posts_controller_spec.rb +93 -5
  82. data/spec/controllers/profiles_controller_spec.rb +58 -1
  83. data/spec/controllers/representations_controller_spec.rb +51 -0
  84. data/spec/controllers/users_controller_spec.rb +28 -0
  85. data/spec/dummy/config/relations.yml +7 -13
  86. data/spec/dummy/db/schema.rb +2 -13
  87. data/spec/factories/tie.rb +1 -1
  88. data/spec/models/activity_spec.rb +28 -67
  89. data/spec/models/profile_spec.rb +38 -0
  90. data/spec/models/tie_activity_spec.rb +88 -31
  91. data/spec/models/tie_spec.rb +20 -14
  92. data/spec/support/db.rb +8 -10
  93. data/spec/support/migrations.rb +24 -0
  94. metadata +74 -59
@@ -85,8 +85,8 @@ class CreateSocialStream < ActiveRecord::Migration
85
85
 
86
86
  create_table "permissions", :force => true do |t|
87
87
  t.string "action"
88
- t.string "object"
89
- t.string "function"
88
+ t.string "object", :default => nil
89
+ t.string "function", :default => nil
90
90
  t.datetime "created_at"
91
91
  t.datetime "updated_at"
92
92
  end
@@ -137,31 +137,27 @@ class CreateSocialStream < ActiveRecord::Migration
137
137
  add_index "relation_permissions", "permission_id"
138
138
 
139
139
  create_table "relations", :force => true do |t|
140
- t.string "name", :limit => 45
140
+ t.string "type"
141
+ t.string "name"
141
142
  t.datetime "created_at"
142
143
  t.datetime "updated_at"
143
144
  t.string "sender_type"
144
145
  t.string "receiver_type"
145
- t.integer "parent_id"
146
- t.integer "lft"
147
- t.integer "rgt"
146
+ t.string "ancestry"
147
+ t.integer "sphere_id"
148
148
  end
149
149
 
150
- add_index "relations", "parent_id"
151
-
152
- create_table "tags", :force => true do |t|
153
- t.string "name", :limit => 45
150
+ add_index "relations", "ancestry"
151
+ add_index "relations", "sphere_id"
152
+
153
+ create_table "spheres", :force => true do |t|
154
+ t.string "name"
155
+ t.integer "actor_id"
154
156
  t.datetime "created_at"
155
157
  t.datetime "updated_at"
156
158
  end
157
-
158
- create_table "tags_activity_objects", :force => true do |t|
159
- t.integer "tag_id"
160
- t.integer "activity_object_id"
161
- end
162
-
163
- add_index "tags_activity_objects", "activity_object_id"
164
- add_index "tags_activity_objects", "tag_id"
159
+
160
+ add_index "spheres", "actor_id"
165
161
 
166
162
  create_table "tie_activities", :force => true do |t|
167
163
  t.integer "tie_id"
@@ -229,9 +225,10 @@ class CreateSocialStream < ActiveRecord::Migration
229
225
  add_foreign_key "relation_permissions", "relations", :name => "relation_permissions_on_relation_id"
230
226
  add_foreign_key "relation_permissions", "permissions", :name => "relation_permissions_on_permission_id"
231
227
 
232
- add_foreign_key "tags_activity_objects", "activity_objects", :name => "tags_activity_objects_on_activity_object_id"
233
- add_foreign_key "tags_activity_objects", "tags", :name => "tags_activity_objects_on_tag_id"
234
-
228
+ add_foreign_key "relations", "spheres", :name => "relations_on_sphere_id"
229
+
230
+ add_foreign_key "spheres", "actors", :name => "spheres_on_actor_id"
231
+
235
232
  add_foreign_key "tie_activities", "ties", :name => "tie_activities_on_tie_id"
236
233
  add_foreign_key "tie_activities", "activities", :name => "tie_activities_on_activity_id"
237
234
 
@@ -265,9 +262,10 @@ class CreateSocialStream < ActiveRecord::Migration
265
262
 
266
263
  remove_foreign_key "relation_permissions", :name => "relation_permissions_on_relation_id"
267
264
  remove_foreign_key "relation_permissions", :name => "relation_permissions_on_permission_id"
268
-
269
- remove_foreign_key "tags_activity_objects", :name => "tags_activity_objects_on_activity_object_id"
270
- remove_foreign_key "tags_activity_objects", :name => "tags_activity_objects_on_tag_id"
265
+
266
+ remove_foreign_key "relations", :name => "relations_on_sphere_id"
267
+
268
+ remove_foreign_key "spheres", :name => "spheres_on_actor_id"
271
269
 
272
270
  remove_foreign_key "tie_activities", :name => "tie_activities_on_tie_id"
273
271
  remove_foreign_key "tie_activities", :name => "tie_activities_on_activity_id"
@@ -292,10 +290,8 @@ class CreateSocialStream < ActiveRecord::Migration
292
290
  drop_table :profiles
293
291
  drop_table :relation_permissions
294
292
  drop_table :relations
295
- drop_table :tags
296
- drop_table :tags_activity_objects
293
+ drop_table :spheres
297
294
  drop_table :ties
298
295
  drop_table :users
299
-
300
296
  end
301
297
  end
@@ -20,34 +20,27 @@ $(function(){
20
20
 
21
21
  $('.pagination a').live('click',function(){
22
22
  $('#list_users_ajax').html("<div id='ajax_loader_icon'><img src='../images/loader.gif'></div>");
23
- $.setFragment({ "page" : $.queryString(this.href).page });
23
+ $.setFragment({ "page" : $.queryString(this.href).page});
24
+ $.setFragment({ "letter" : $.queryString(this.href).letter});
25
+ $.setFragment({ "search" : $.queryString(this.href).search});
26
+ $.setFragment({ "tag" : $.queryString(this.href).tag});
27
+
24
28
  $.getScript(this.href);
25
29
  return false;
26
30
  });
27
31
 
28
32
  $('.user_letter_link').live('click',function(){
29
33
  $('#list_users_ajax').html("<div id='ajax_loader_icon'><img src='../images/loader.gif'></div>");
30
- $.setFragment({ "page" : $.queryString(this.href).page });
31
- $.setFragment({ "letter" : $.queryString(this.href).letter });
34
+ $.setFragment({ "letter" : $.queryString(this.href).letter});
32
35
  $.getScript(this.href);
33
36
  return false;
34
37
  });
35
38
 
36
- $.fragmentChange(true);
37
- $(document).bind("fragmentChange.page", function() {
38
- $.getScript($.queryString(document.location.href, { "page" : $.fragment().page,
39
- "letter": $.fragment().letter}));
40
- });
41
- $(document).bind("fragmentChange.letter", function() {
42
- $.getScript($.queryString(document.location.href, { "page" : $.fragment().page,
43
- "letter": $.fragment().letter}));
44
- });
45
-
46
- if ($.fragment().page) {
47
- $(document).trigger("fragmentChange.page");
48
- }
49
- if ($.fragment().letter) {
50
- $(document).trigger("fragmentChange.letter");
51
- }
39
+ $('#wordcloud a').live('click', function(){
40
+ $('#list_users_ajax').html("<div id='ajax_loader_icon'><img src='../images/loader.gif'></div>");
41
+ $.setFragment({ "tag" : $.queryString(this.href).tag});
42
+ $.getScript(this.href);
43
+ return false;
44
+ });
52
45
 
53
46
  });
@@ -194,7 +194,7 @@ $.extend($.validator, {
194
194
  messages: {},
195
195
  groups: {},
196
196
  rules: {},
197
- errorClass: "error",
197
+ errorClass: "validation_error",
198
198
  errorElement: "label",
199
199
  focusInvalid: true,
200
200
  errorContainer: $( [] ),
@@ -1,18 +1,28 @@
1
1
  // initialise plugins
2
2
  jQuery(function(){
3
- jQuery('ul.sf-menu').superfish({
4
- delay: 1000, // one second delay on mouseout
5
- animation: {height:'show'}, // fade-in and slide-down animation
6
- speed: 'fast', // faster animation speed
7
- autoArrows: false,
8
- dropShadows: false // disable drop shadows
9
- });
10
-
3
+
4
+
5
+ jQuery('ul.sf-menu').superfish({
6
+ delay: 2000, // one second delay on mouseout
7
+ animation: {
8
+ height: 'show'
9
+ }, // fade-in and slide-down animation
10
+ speed: 'fast', // faster animation speed
11
+ autoArrows: false,
12
+ dropShadows: false // disable drop shadows
13
+ });
14
+
15
+
11
16
  });
12
17
 
13
18
 
14
19
 
15
- $(document).ready(function() {
16
- $('#tabright> ul').tabs({ fx: { height: 'toggle', opacity: 'toggle' } });
20
+ $(document).ready(function(){
21
+ $('#tabright> ul').tabs({
22
+ fx: {
23
+ height: 'toggle',
24
+ opacity: 'toggle'
25
+ }
26
+ });
17
27
  });
18
28
 
@@ -22,10 +22,27 @@ margin-top: auto; margin-bottom:auto;}
22
22
 
23
23
 
24
24
  /*********** Notices SECTION *********************/
25
- .error, .notice, .success {padding:.8em;margin-bottom:1em;}
26
- .notice {color:#1F4A75; font-weight:bold; font-size:1.3em; display:block; text-align:center;}
27
- .error{color:red;}
28
- .success {color: #088A08}
25
+ .notice, .success, .alert, .error, .validation {
26
+ border: 1px solid;
27
+ margin: 10px 0px;
28
+ padding:15px 10px 15px 50px;
29
+ background-repeat: no-repeat;
30
+ background-position: 10px center;
31
+ width: 440px;
32
+ margin-left: auto;
33
+ margin-right: auto;
34
+ font-weight: bold;
35
+ }
36
+ .notice ul, .success ul, .alert ul, .error ul, .validation ul{
37
+ margin-left:50px;
38
+
39
+ }
40
+ label.validation_error{color: #D8000C;background-color: #FFBABA;border: 1px solid;
41
+ display: block;padding-left:5px;padding-right:5px;width:90%;}
42
+ .notice {color: #00529B;background-color: #BDE5F8;background-image: url('/images/btn/info.png');}
43
+ .success {color: #4F8A10;background-color: #DFF2BF;background-image:url('/images/btn/success.png');}
44
+ .alert {color: #9F6000;background-color: #FEEFB3;background-image: url('/images/btn/warning.png');}
45
+ .error {color: #D8000C;background-color: #FFBABA;background-image: url('/images/btn/error.png');}
29
46
 
30
47
  /************Forms SECTION **************/
31
48
  input.other_blue{ background:#497FC1; border:0px; cursor:pointer; font-size:1.0em; line-height:135%;
@@ -42,9 +42,15 @@ li.btn_menu_browse{background: transparent url("/images/btn/btn_browse.png") no-
42
42
  #menu_account ul{ list-style: none; margin: 0px; float:left;}
43
43
  #menu_account ul li{ line-height:20px; padding:5px 0px 5px 20px; vertical-align:top;}
44
44
 
45
- #account{display:inline-block;vertical-align: top; height:22px;}
45
+ #menu_pipe{ vertical-align: top; height:23px; }
46
+ #menu_pipe span { float:right; padding-right: 5px; vertical-align: top; padding-top: 5px;}
47
+ #menu_pipe ul{ list-style: none; margin: 0px; float:left;}
48
+ #menu_pipe ul li{ line-height:20px; padding:5px 0px 5px 0px; vertical-align:top;}
46
49
 
47
50
 
51
+ #account, #representation_li,#current_user_info, #representations_menu {display:inline-block;vertical-align: top; height:22px; color:#FFF;}
52
+ #representation_li{margin-left:10px;display:none;}
53
+
48
54
  li.btn_menu_exit{background: transparent url("/images/btn/btn_exit.png") no-repeat left center;}
49
55
  li.btn_menu_representation{}
50
56
  #menu_home ul li.pipe,#menu_account ul li.pipe{padding:0px 3px 0px 3px; margin:0px;}
@@ -119,9 +125,8 @@ ul.sf-menu li li li.sfHover ul {
119
125
  /*margin-bottom: 1em; */
120
126
  }
121
127
  .sf-menu a {
122
- padding: .55em 1em;
128
+ padding: .40em 1em .70em 2em;
123
129
  text-decoration:none;
124
- padding-left:2em;
125
130
  }
126
131
  .sf-menu a, .sf-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/
127
132
  color: #fff;
@@ -12,20 +12,17 @@ user:
12
12
  name: friend
13
13
  permissions:
14
14
  - [ follow ] # follow the activities of the friend
15
- - [ create, activity, tie ] # let the friend create activities to the same tie
15
+ - [ create, activity ] # let the friend create activities
16
16
  - [ read, activity, star_ties ] # friend can read activities from the other friends
17
- - [ update, activity, tie ] # update activities to the same tie
18
- - [ destroy, activity, tie ] # destroy activities to the same tie
17
+ - [ update, activity ] # update her activities
18
+ - [ destroy, activity ] # destroy her activities
19
+ sphere: personal
19
20
  acquaintance:
20
21
  name: acquaintance
21
22
  parent: friend # friend relation is stronger than acquaintance
22
23
  permissions:
23
24
  - [ read, activity, star_ties ]
24
- public:
25
- name: public
26
- parent: acquaintance # acquaintance is stronger than public
27
- permissions:
28
- - [ read, activity, star_ties ]
25
+ sphere: personal
29
26
 
30
27
  group:
31
28
  member:
@@ -37,13 +34,10 @@ group:
37
34
  - [ update, activity, weak_star_ties ] # update and destroy activities to members,
38
35
  - [ destroy, activity, weak_star_ties ] # acquaintance and public
39
36
  - [ read, tie, weak_star_ties ]
37
+ sphere: organization
40
38
  partner:
41
39
  name: partner
42
40
  parent: member # member is stronger than partner
43
41
  permissions:
44
42
  - [ read, activity, star_ties ]
45
- public:
46
- name: public
47
- parent: partner # partner is stronger than public
48
- permissions:
49
- - [ read, activity, star_ties ]
43
+ sphere: organization
@@ -2,62 +2,81 @@ module SocialStream
2
2
  class Ability
3
3
  include CanCan::Ability
4
4
 
5
- def initialize(user)
5
+ def initialize(subject)
6
+
6
7
  # Activity Objects
7
8
  (SocialStream.objects - [ :actor ]).map{ |obj|
8
9
  obj.to_s.classify.constantize
9
10
  }.each do |klass|
10
- can :create, klass do |k|
11
- k._activity_tie.allows?(user, 'create', 'activity')
11
+ can :create, klass do |k| # can :create, Post do |post|
12
+ k._activity_tie.sender_id == subject.actor_id &&
13
+ k._activity_tie.receiver.allow?(subject, 'create', 'activity')
12
14
  end
13
15
 
14
- can :read, klass do |k|
15
- k._activity_tie.allows?(user, 'read', 'activity')
16
+ can :read, klass do |k| # can :read, Post do |post|
17
+ k.post_activity.tie.allow?(subject, 'read', 'activity')
16
18
  end
17
19
 
18
- can :update, klass do |k|
19
- k._activity_tie.allows?(user, 'update', 'activity')
20
+ can :update, klass do |k| # can :update, Post do |post|
21
+ k.post_activity.tie.allow?(subject, 'update', 'activity')
20
22
  end
21
23
 
22
- can :destroy, klass do |k|
23
- k._activity_tie.allows?(user, 'destroy', 'activity')
24
+ can :destroy, klass do |k| # can :destroy, Post do |post|
25
+ k.post_activity.tie.sender_id == Actor.normalize_id(subject) ||
26
+ k.post_activity.tie.allow?(subject, 'destroy', 'activity')
24
27
  end
25
28
  end
26
29
 
27
30
  # Activities
28
31
  can :create, Activity do |a|
29
- a.tie.allows?(user, 'create', 'activity')
32
+ a.tie.allow?(subject, 'create', 'activity')
30
33
  end
31
34
 
32
35
  can :read, Activity do |a|
33
- a.tie.allows?(user, 'read', 'activity')
36
+ a.tie.allow?(subject, 'read', 'activity')
34
37
  end
35
38
 
36
39
  can :update, Activity do |a|
37
- a.tie.allows?(user, 'update', 'activity')
40
+ a.tie.allow?(subject, 'update', 'activity')
38
41
  end
39
42
 
40
43
  can :destroy, Activity do |a|
41
- a.tie.allows?(user, 'destroy', 'activity')
44
+ a.tie.allow?(subject, 'destroy', 'activity')
45
+ end
46
+
47
+ # Users
48
+ can :read, User
49
+
50
+ can :update, User do |u|
51
+ u.represented_by?(subject)
42
52
  end
43
53
 
44
54
  # Groups
45
55
  can :read, Group
46
56
 
47
57
  can :create, Group do |g|
48
- user.present? &&
49
- ( g._founder == user.slug ||
50
- Actor.find_by_slug!(g._founder).sent_ties.received_by(user).with_permissions('represent', nil).any? )
58
+ subject.present? &&
59
+ g._founder == subject.slug
51
60
  end
52
61
 
53
62
  can :update, Group do |g|
54
- user.present? &&
55
- g.sent_ties.received_by(user).with_permissions('represent', nil).any?
63
+ g.represented_by?(subject)
56
64
  end
57
65
 
58
66
  can :destroy, Group do |g|
59
- user.present? &&
60
- g.sent_ties.received_by(user).with_permissions('represent', nil).any?
67
+ g.represented_by?(subject)
68
+ end
69
+
70
+ can :read, Profile
71
+
72
+ # Profile
73
+ can :update, Profile do |p|
74
+ p.subject.represented_by?(subject)
75
+ end
76
+
77
+ # Representation
78
+ can :create, Representation do |r|
79
+ r.subject.represented_by?(subject)
61
80
  end
62
81
  end
63
82
  end
@@ -44,6 +44,12 @@ module SocialStream
44
44
  @current_subject = instance
45
45
  end
46
46
 
47
+ # Override Cancan#current_ability method to use {#current_subject}
48
+ def current_ability
49
+ @current_ability ||=
50
+ Ability.new(current_subject)
51
+ end
52
+
47
53
  private
48
54
 
49
55
  # Get represented subject from session
@@ -10,7 +10,7 @@ module SocialStream
10
10
  attr_accessor :_activity_tie_id
11
11
  attr_accessor :_activity_parent_id
12
12
 
13
- belongs_to :activity_object, :dependent => :destroy
13
+ belongs_to :activity_object, :dependent => :destroy, :autosave => true
14
14
  has_many :activity_object_activities, :through => :activity_object
15
15
 
16
16
  delegate :post_activity, :to => :activity_object
@@ -61,9 +61,13 @@ module SocialStream
61
61
  end
62
62
 
63
63
  def create_activity(verb)
64
- activity_object.activities.create! :verb => verb,
65
- :_tie => _activity_tie,
66
- :parent_id => _activity_parent_id
64
+ a = Activity.new :verb => verb,
65
+ :_tie => _activity_tie,
66
+ :parent_id => _activity_parent_id
67
+
68
+ a.activity_objects << activity_object
69
+
70
+ a.save!
67
71
  end
68
72
  end
69
73
  end
@@ -43,6 +43,12 @@ module SocialStream
43
43
  scope :search, lambda{ |param|
44
44
  joins(:actor).merge(Actor.search(param))
45
45
  }
46
+
47
+ scope :tagged_with, lambda { |param|
48
+ if param.present?
49
+ joins(:actor => :activity_object).merge(ActivityObject.tagged_with(param))
50
+ end
51
+ }
46
52
 
47
53
  scope :distinct_initials, joins(:actor).merge(Actor.distinct_initials)
48
54
 
@@ -4,9 +4,7 @@ require 'foreigner'
4
4
  require 'jquery-rails'
5
5
  # Permalinks:
6
6
  require 'stringex'
7
- # Hierarchical relationships in Relation:
8
- require 'nested_set'
9
- # Hierarchical relationships in Activity:
7
+ # Hierarchical relationships in Activity and Relation:
10
8
  require 'ancestry'
11
9
  # Messages
12
10
  require 'mailboxer'
@@ -27,11 +25,14 @@ require 'will_paginate'
27
25
  require 'omniauth/oauth'
28
26
  # CSS themes
29
27
  require 'rails_css_themes'
28
+ #Tags
29
+ require 'acts-as-taggable-on'
30
30
 
31
31
  module SocialStream
32
32
  class Engine < ::Rails::Engine #:nodoc:
33
33
  config.app_generators.authentication :devise
34
34
  config.app_generators.messages :mailboxer
35
+ config.app_generators.taggings :acts_as_taggable_on
35
36
 
36
37
  config.to_prepare do
37
38
  %w( actor activity_object ).each do |supertype|
@@ -43,6 +44,8 @@ module SocialStream
43
44
  ApplicationController.helper SubjectsHelper
44
45
  ApplicationController.helper TiesHelper
45
46
  ApplicationController.helper LocationHelper
47
+
48
+ ActsAsTaggableOn::TagsHelper
46
49
  end
47
50
 
48
51
  initializer "social_stream.inflections" do
@@ -1,3 +1,3 @@
1
1
  module SocialStream
2
- VERSION = "0.4.3".freeze
2
+ VERSION = "0.4.4".freeze
3
3
  end
@@ -34,6 +34,15 @@ namespace :db do
34
34
  end
35
35
  end
36
36
 
37
+ def set_tags(klass)
38
+ klass.all.each do |el|
39
+ el.tag_list = Forgery::LoremIpsum.words(1,:random => true)+", "+
40
+ Forgery::LoremIpsum.words(1,:random => true)+", "+
41
+ Forgery::LoremIpsum.words(1,:random => true)
42
+ el.save!
43
+ end
44
+ end
45
+
37
46
  puts 'User population'
38
47
  users_start = Time.now
39
48
 
@@ -66,7 +75,7 @@ namespace :db do
66
75
 
67
76
  # = Groups
68
77
  available_actors = Actor.all
69
-
78
+
70
79
  10.times do
71
80
  founder = available_actors[rand(available_actors.size)]
72
81
 
@@ -76,6 +85,7 @@ namespace :db do
76
85
  end
77
86
 
78
87
  set_logos(Group)
88
+ set_tags(Group)
79
89
 
80
90
  groups_end = Time.now
81
91
  puts ' -> ' + (groups_end - groups_start).round(4).to_s + 's'
@@ -12,10 +12,8 @@ Gem::Specification.new do |s|
12
12
 
13
13
  # Gem dependencies
14
14
  #
15
- # Activity hierarchies
16
- s.add_runtime_dependency('atd-ancestry', '1.3.0')
17
- # Relation hierarchies
18
- s.add_runtime_dependency('nested_set', '~> 1.5.3')
15
+ # Activity and Relation hierarchies
16
+ s.add_runtime_dependency('ancestry', '~> 1.2.3')
19
17
  # SQL foreign keys
20
18
  s.add_runtime_dependency('foreigner', '~> 0.9.1')
21
19
  # Authentication
@@ -29,7 +27,7 @@ Gem::Specification.new do |s|
29
27
  # jQuery
30
28
  s.add_runtime_dependency('jquery-rails', '~> 0.2.5')
31
29
  # Authorization
32
- s.add_runtime_dependency('cancan', '~> 1.6.2')
30
+ s.add_runtime_dependency('cancan', '~> 1.6.4')
33
31
  # Pagination
34
32
  s.add_runtime_dependency('will_paginate', '~> 3.0.pre2')
35
33
  # OAuth client
@@ -39,13 +37,14 @@ Gem::Specification.new do |s|
39
37
  # Theme support
40
38
  s.add_runtime_dependency('rails_css_themes','~> 1.0.0')
41
39
  # Messages
42
- s.add_runtime_dependency('mailboxer','~> 0.0.14')
40
+ s.add_runtime_dependency('mailboxer','~> 0.0.16')
43
41
  # Avatar manipulation
44
42
  s.add_runtime_dependency('rmagick','~> 2.13.1')
45
-
43
+ # Tagging
44
+ s.add_runtime_dependency('acts-as-taggable-on','~> 2.0.6')
46
45
 
47
46
  # Development Gem dependencies
48
- s.add_development_dependency('rails', '~> 3.0.6')
47
+ s.add_development_dependency('rails', '~> 3.0.7')
49
48
  # Integration testing
50
49
  s.add_development_dependency('capybara', '~> 0.3.9')
51
50
  # Testing database
@@ -21,7 +21,9 @@ describe CommentsController do
21
21
 
22
22
  describe "comment from friend" do
23
23
  before do
24
- model_assigned_to Factory(:friend, :receiver => @user.actor)
24
+ f = Factory(:friend, :receiver => @user.actor).sender
25
+
26
+ model_assigned_to Factory(:friend, :sender => @user.actor, :receiver => f)
25
27
  end
26
28
 
27
29
  it_should_behave_like "Allow Creating"
@@ -29,7 +31,9 @@ describe CommentsController do
29
31
 
30
32
  describe "post from acquaintance" do
31
33
  before do
32
- model_assigned_to Factory(:acquaintance, :receiver => @user.actor)
34
+ a = Factory(:acquaintance, :receiver => @user.actor).sender
35
+
36
+ model_assigned_to Factory(:friend, :sender => @user.actor, :receiver => a)
33
37
  end
34
38
 
35
39
  it_should_behave_like "Deny Creating"