social_stream 0.21.4 → 0.22.0

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 (56) hide show
  1. data/README.rdoc +11 -5
  2. data/base/app/assets/stylesheets/cheesecake.css.scss +1 -0
  3. data/base/app/views/cheesecake/_cheesecake.html.erb +3 -0
  4. data/base/app/views/cheesecake/_index.html.erb +88 -41
  5. data/base/app/views/cheesecake/_sector_form.html.erb +12 -12
  6. data/base/lib/social_stream/base/version.rb +1 -1
  7. data/base/lib/social_stream/test_helpers/controllers.rb +19 -2
  8. data/base/lib/tasks/db/populate.rake +190 -165
  9. data/base/social_stream-base.gemspec +1 -1
  10. data/base/spec/controllers/posts_controller_spec.rb +19 -1
  11. data/lib/social_stream/version.rb +1 -1
  12. data/presence/app/assets/images/status/chat.png +0 -0
  13. data/presence/app/assets/javascripts/chat_interface_manager.js.erb +42 -45
  14. data/presence/app/assets/javascripts/chat_parser.js +5 -5
  15. data/presence/app/assets/javascripts/chat_persistence.js +25 -26
  16. data/presence/app/assets/javascripts/chat_utilities.js +15 -11
  17. data/presence/app/assets/javascripts/chat_window_manager.js +129 -26
  18. data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +22 -3
  19. data/presence/app/assets/javascripts/social_stream-presence.js +1 -0
  20. data/presence/app/assets/javascripts/videochat.js.erb +459 -0
  21. data/presence/app/assets/javascripts/xmpp_client_management.js.erb +303 -65
  22. data/presence/app/assets/stylesheets/chat.css.scss +42 -1
  23. data/presence/app/controllers/xmpp_controller.rb +20 -3
  24. data/presence/app/views/chat/_index.html.erb +7 -2
  25. data/presence/app/views/xmpp/getOpenTokSessionIDAndToken.xml.builder +6 -0
  26. data/presence/config/locales/en.yml +22 -1
  27. data/presence/config/locales/es.yml +23 -2
  28. data/presence/config/routes.rb +2 -0
  29. data/presence/ejabberd/conf/ssconfig_example.cfg +4 -3
  30. data/presence/ejabberd/ejabberd_files.zip +0 -0
  31. data/presence/ejabberd/ejabberd_scripts/authentication_script +22 -12
  32. data/presence/ejabberd/ejabberd_scripts/development_scripts/show_config.sh +9 -10
  33. data/presence/ejabberd/ejabberd_scripts/emanagement +275 -178
  34. data/presence/ejabberd/ejabberd_scripts/manageWebDomains +164 -0
  35. data/presence/ejabberd/ejabberd_scripts/rest_api_client_script +75 -32
  36. data/presence/ejabberd/ejabberd_scripts/synchronize_presence_script +81 -34
  37. data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  38. data/presence/ejabberd/mod_sspresence/mod_sspresence.erl +27 -23
  39. data/presence/lib/OpenTok/Exceptions.rb +11 -0
  40. data/presence/lib/OpenTok/OpenTokSDK.rb +184 -0
  41. data/presence/lib/OpenTok/Session.rb +27 -0
  42. data/presence/lib/generators/social_stream/presence/templates/initializer.rb +8 -2
  43. data/presence/lib/open_tok.rb +31 -0
  44. data/presence/lib/opentok.rb +29 -0
  45. data/presence/lib/social_stream-presence.rb +4 -0
  46. data/presence/lib/social_stream/presence/models/buddy_manager.rb +1 -1
  47. data/presence/lib/social_stream/presence/version.rb +1 -1
  48. data/presence/lib/social_stream/presence/xmpp_server_order.rb +96 -76
  49. data/presence/lib/social_stream/presence/xmpp_ssclient.rb +54 -0
  50. data/presence/lib/tasks/presence/multidomain.rake +45 -0
  51. data/presence/lib/tasks/presence/synchronize.rake +18 -4
  52. data/presence/vendor/assets/javascripts/TB.min.js +4329 -0
  53. data/social_stream.gemspec +2 -2
  54. metadata +40 -30
  55. data/presence/ejabberd/ejabberd_scripts/reset_connection_script +0 -300
  56. data/presence/ejabberd/ejabberd_scripts/set_script_header.sh +0 -112
data/README.rdoc CHANGED
@@ -30,7 +30,7 @@ add your own activities easily.
30
30
 
31
31
  = Installation
32
32
 
33
- Add to your Gemfile:
33
+ Add the following to the Gemfile of the your Rails application:
34
34
 
35
35
  gem 'social_stream', '>= 0.19.0'
36
36
 
@@ -50,12 +50,16 @@ Since {Social Stream}[http://github.com/ging/social_stream] depends on {Devise}[
50
50
 
51
51
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
52
52
 
53
- = Social Stream modules
53
+ = Social Stream components
54
54
 
55
- Social Stream is divided in modules. Developers can customize their social
56
- network with the functionalities they need for each case.
55
+ Social Stream is divided into components. Developers can customize their social
56
+ network with the functionalities they need for each case. For instance, the Gemfile
57
+ in an application using documents and links only would contain the following:
57
58
 
58
- Current Social Stream distribution includes:
59
+ gem 'social_stream-documents'
60
+ gem 'social_stream-linkser'
61
+
62
+ Current Social Stream distribution include the following components:
59
63
 
60
64
  * {Base}[https://github.com/ging/social_stream/tree/master/base], basic functionalities of contacts, streams and walls,
61
65
  along with users, group, post and comments
@@ -69,6 +73,8 @@ Current Social Stream distribution includes:
69
73
 
70
74
  {Social Stream documentation is available at rdoc.info}[http://rubydoc.info/gems/social_stream/frames]
71
75
 
76
+ However, most of the documentation is in {the base gem}[http://rubydoc.info/gems/social_stream-base/frames].
77
+
72
78
  = Discussion
73
79
 
74
80
  We are reaching beta phase of development.
@@ -318,6 +318,7 @@
318
318
  text-align: center;
319
319
  font-size: 15px;
320
320
  font-weight: bold;
321
+ cursor: pointer;
321
322
  }
322
323
  #sector_form .add_subsector:hover {
323
324
  background: $auxiliar-bright-color;
@@ -73,6 +73,9 @@ $(function(){
73
73
  $("#sector_editor").data("hide")();
74
74
  }
75
75
  };
76
+ cheese.onSubsectorAdded = function(subsector){
77
+ $("#sector_editor").data("prepare")(subsector.getCheesecake(),subsector);
78
+ };
76
79
  $("#contacts_filter_input").keyup(function(){
77
80
  cheese.searchEngine.filter($("#contacts_filter_input").val());
78
81
  //TODO: Make users unfiltered visible again
@@ -119,18 +119,20 @@
119
119
  });
120
120
  });
121
121
  $("#sector_editor").data("hide", function(callback){
122
- $("#sector_editor").stop().animate({width: 0},500, function(){
123
- $(".add_subsector_clone").remove();
124
- });
122
+ $("#sector_editor").stop().animate({width: 0},500);
125
123
  $("#contacts_explorer").stop().animate({width: 300},500, function(){
126
124
  if(callback) callback();
127
125
  });
128
126
  });
129
- $("#sector_editor").data("prepare", function(cheese){
127
+ $("#sector_editor").data("prepare", function(cheese, newSubsector){
130
128
  var sector = cheese.getFocusedSector();
131
- var subsector_count = sector.subsectors.length;
132
- var original_add_sector_row = $("#original_add_subsector_row");
129
+ var newIndex = -1;
130
+ if(newSubsector){
131
+ newIndex = newSubsector.getIndex();
132
+ }
133
133
  if(sector){
134
+ var subsector_count = sector.subsectors.length;
135
+ var maxReached = (subsector_count==4);
134
136
  $("#form_sector_name").val(sector.label);
135
137
  $("#edited_sector_name").html(sector.label);
136
138
  $("#form_sector_name").off("keyup");
@@ -138,44 +140,89 @@
138
140
  $("#edited_sector_name").html($("#form_sector_name").val());
139
141
  sector.changeLabel($("#form_sector_name").val());
140
142
  });
141
- $(".add_subsector_clone").remove();
142
- for(var i = 0; i < 4; i++){
143
- var subsector = sector.subsectors[i];
144
- if(subsector){
145
- var add_subsector_clone = original_add_sector_row.clone().attr("id", "add_subsector_" + i).addClass("add_subsector_clone").show();
146
- $("#subsector_" + i).parent().before(add_subsector_clone);
147
- $("#form_subsector_name_" + i).val(subsector.label);
148
- $("#edited_subsector_name_" + i).html(subsector.label);
149
- $("#form_subsector_name_" + i).off("keyup");
150
- $("#form_subsector_name_" + i).on("keyup", [i,subsector],function(event){
151
- $("#edited_subsector_name_" + event.data[0]).html($("#form_subsector_name_" + event.data[0]).val());
152
- event.data[1].changeLabel($("#form_subsector_name_" + event.data[0]).val());
153
- });
154
- $("#subsector_" + i).find(".permissions_field .permission").each(function(){
155
- var permission_field = $(this);
156
- var update_state = function(){
157
- var label_class = permission_field.attr("id").replace("form_", "edited_");
158
- if(permission_field.is(":checked")){
159
- $("." + label_class).removeClass("negative").addClass("positive");
160
- $("." + label_class).find(".negative_message").hide();
161
- $("." + label_class).find(".positive_message").show();
162
- }else{
163
- $("." + label_class).removeClass("positive").addClass("negative");
164
- $("." + label_class).find(".positive_message").hide();
165
- $("." + label_class).find(".negative_message").show();
143
+ if(maxReached){
144
+ $(".add_subsector").each(function(){
145
+ if($(this).is(':visible')){
146
+ $(this).slideToggle();
147
+ }
148
+ })
149
+ }
150
+ for(var i = 3; i >= 0; i--){
151
+ (function(){
152
+ var subsector = sector.subsectors[i];
153
+ var index = i;
154
+ var recentlyCreated = (newIndex != -1)&&(newIndex == index);
155
+ if(subsector){
156
+ if(!$("#subsector_" + i).is(':visible')){
157
+ $("#subsector_" + i).slideToggle();
158
+ }
159
+ if(recentlyCreated || ((newIndex == -1)&&(i == 0))){
160
+ if(!$("#subsector_" + i).find(".content").is(':visible')){
161
+ $("#subsector_" + i).find(".content").slideToggle();
162
+ }
163
+ }else{
164
+ if($("#subsector_" + i).find(".content").is(':visible')){
165
+ $("#subsector_" + i).find(".content").slideToggle();
166
166
  }
167
167
  }
168
- update_state();
169
- permission_field.on("change",update_state);
170
- });
171
- $("#subsector_" + i).show();
172
- }else{
173
- if(sector.subsectors[i-1]){
174
- var add_subsector_clone = original_add_sector_row.clone().attr("id", "add_subsector_" + i).addClass("add_subsector_clone").show();
175
- $("#subsector_" + (i-1)).parent().after(add_subsector_clone);
168
+ if(!maxReached){
169
+ if(sector.subsectors[i+1]==undefined){
170
+ $("#add_subsector_" + (i+1)).off("click");
171
+ if(!$("#add_subsector_" + (i+1)).is(':visible')){
172
+ $("#add_subsector_" + (i+1)).slideToggle();
173
+ }
174
+ $("#add_subsector_" + (i+1)).on("click",function(){
175
+ cheese.addNewSubsector(index+1);
176
+ $(".subsector .content").each(function(){
177
+ if($(this).is(':visible')){
178
+ $(this).slideToggle();
179
+ }
180
+ });
181
+ });
182
+ }
183
+ $("#add_subsector_" + i).off("click");
184
+ if(!$("#add_subsector_" + i).is(':visible')){
185
+ $("#add_subsector_" + i).slideToggle();
186
+ }
187
+ $("#add_subsector_" + i).on("click",function(){
188
+ cheese.addNewSubsector(index);
189
+ $(".subsector .content").each(function(){
190
+ if($(this).is(':visible')){
191
+ $(this).slideToggle();
192
+ }
193
+ });
194
+ });
195
+ }
196
+ $("#form_subsector_name_" + i).val(subsector.label);
197
+ $("#edited_subsector_name_" + i).html(subsector.label);
198
+ $("#form_subsector_name_" + i).off("keyup");
199
+ $("#form_subsector_name_" + i).on("keyup", [i,subsector],function(event){
200
+ $("#edited_subsector_name_" + event.data[0]).html($("#form_subsector_name_" + event.data[0]).val());
201
+ event.data[1].changeLabel($("#form_subsector_name_" + event.data[0]).val());
202
+ });
203
+ $("#subsector_" + i).find(".permissions_field .permission").each(function(){
204
+ var permission_field = $(this);
205
+ var update_state = function(){
206
+ var label_class = permission_field.attr("id").replace("form_", "edited_");
207
+ if(permission_field.is(":checked")){
208
+ $("." + label_class).removeClass("negative").addClass("positive");
209
+ $("." + label_class).find(".negative_message").hide();
210
+ $("." + label_class).find(".positive_message").show();
211
+ }else{
212
+ $("." + label_class).removeClass("positive").addClass("negative");
213
+ $("." + label_class).find(".positive_message").hide();
214
+ $("." + label_class).find(".negative_message").show();
215
+ }
216
+ }
217
+ update_state();
218
+ permission_field.on("change",update_state);
219
+ });
220
+ }else{
221
+ $("#subsector_" + i).hide();
222
+ $("#add_subsector_" + i).off("click");
223
+ $("#add_subsector_" + i).hide();
176
224
  }
177
- $("#subsector_" + i).hide();
178
- }
225
+ })();
179
226
  }
180
227
  }
181
228
  });
@@ -20,13 +20,8 @@
20
20
  <div id="edited_sector_color_in"></div>
21
21
  </div>
22
22
  </div>
23
- </div>
24
- <div class="form_row less_padding" id="original_add_subsector_row" style="display:none;">
25
- <div class="add_subsector">
26
- +
27
- </div>
28
- </div>
29
- <% for i in 0..3 do %>
23
+ </div>
24
+ <% 3.downto(0) do |i|%>
30
25
  <div class="form_row less_padding">
31
26
  <div class="subsector" id="subsector_<%= i %>">
32
27
  <div class="title">
@@ -48,17 +43,17 @@
48
43
  </div>
49
44
  <div class="form_row less_padding">
50
45
  <div class="form_field permissions_field">
51
- <% default_permissions.each_with_index do |p, i| %>
46
+ <% default_permissions.each_with_index do |p, j| %>
52
47
  <div contain=<%= dom_id p %> class="checkboxPermissionOptionLeft">
53
- <input id="form_subsector_<%= i %>_<%= dom_id p %>" class="permission <%= dom_id p %>" type="checkbox"/>
54
- <label for="form_subsector_<%= i %>_<%= dom_id p %>"><%= p.description(:brief, :relation => "%RELATION_NAME%", :subject => current_subject) %></label>
48
+ <input id="form_subsector_<%= j %>_<%= dom_id p %>" class="permission <%= dom_id p %>" type="checkbox"/>
49
+ <label for="form_subsector_<%= j %>_<%= dom_id p %>"><%= p.description(:brief, :relation => "%RELATION_NAME%", :subject => current_subject) %></label>
55
50
  <div class="clearfloat"></div>
56
51
  </div>
57
52
  <% end %>
58
53
  </div>
59
54
  <div class="permissions_explanation" style="display:none;">
60
- <% default_permissions.each_with_index do |p, i| %>
61
- <div class="permission <%= dom_id p %> positive edited_subsector_<%= i %>_<%= dom_id p %>">
55
+ <% default_permissions.each_with_index do |p, j| %>
56
+ <div class="permission <%= dom_id p %> positive edited_subsector_<%= j %>_<%= dom_id p %>">
62
57
  <div class="positive_message">
63
58
  <%= p.description(:detailed, :relation => "%RELATION_NAME%", :subject => current_subject, :state => "positive") %>
64
59
  </div>
@@ -72,6 +67,11 @@
72
67
  </div>
73
68
  </div>
74
69
  </div>
70
+ <div class="form_row less_padding">
71
+ <div class="add_subsector" id="add_subsector_<%= i %>">
72
+ +
73
+ </div>
74
+ </div>
75
75
  <% end %>
76
76
  </div>
77
77
  </form>
@@ -1,5 +1,5 @@
1
1
  module SocialStream
2
2
  module Base
3
- VERSION = "0.16.2".freeze
3
+ VERSION = "0.16.3".freeze
4
4
  end
5
5
  end
@@ -33,9 +33,7 @@ module SocialStream
33
33
  end
34
34
 
35
35
  def model_assigned_to contact, relation_ids
36
- model_attributes[:author_id] = contact.sender.id
37
36
  model_attributes[:owner_id] = contact.receiver.id
38
- model_attributes[:user_author_id] = contact.sender.id
39
37
  model_attributes[:_relation_ids] = Array(relation_ids).map(&:id)
40
38
  end
41
39
 
@@ -67,6 +65,25 @@ module SocialStream
67
65
  end
68
66
  end
69
67
 
68
+ shared_examples_for "Allow Reading" do
69
+ it "should read" do
70
+ get :show, :id => @current_model.to_param
71
+
72
+ response.should be_success
73
+ end
74
+ end
75
+
76
+ shared_examples_for "Deny Reading" do
77
+ it "should not read" do
78
+ begin
79
+ get :show, :id => @current_model.to_param
80
+
81
+ assert false
82
+ rescue CanCan::AccessDenied
83
+ end
84
+ end
85
+ end
86
+
70
87
  shared_examples_for "Allow Updating" do
71
88
  it "should update" do
72
89
  put :update, updating_attributes
@@ -7,73 +7,45 @@ namespace :db do
7
7
  desc "Reload populate data"
8
8
  task :reload => [ 'db:reset', :create ]
9
9
 
10
+ desc "Reload populate data for Cheesecake testing"
11
+ task :cheesecake => [ 'db:reset', :read_environment, :create_users, :create_groups, :create_cheesecake_ties, :create_avatars ]
12
+
10
13
  desc "Create populate data"
11
- task :create => :environment do
14
+ task :create => [ :read_environment, :create_users, :create_groups, :create_ties, :create_posts, :create_messages, :create_avatars ]
15
+
16
+ desc "INTERNAL: read needed environment data and setup variables"
17
+ task :read_environment => :environment do
12
18
  require 'forgery'
13
19
 
14
- LOGOS_PATH = File.join(Rails.root, 'lib', 'logos')
15
- LOGOS_TOTAL = (ENV["LOGOS_TOTAL"] || 10).to_i
16
- USERS = (ENV["USERS"] || 9).to_i
17
- GROUPS = (ENV["GROUPS"] || 10).to_i
18
- CHEESECAKE = (ENV["CHEESECAKE"].present? || false)
19
- if CHEESECAKE
20
- puts "Cheesecake Testing mode: ON"
21
- end
20
+ @LOGOS_PATH = File.join(Rails.root, 'lib', 'logos')
21
+ @LOGOS_TOTAL = (ENV["LOGOS_TOTAL"] || 10).to_i
22
+ @USERS = (ENV["USERS"] || 9).to_i
23
+ @GROUPS = (ENV["GROUPS"] || 10).to_i
22
24
  if ENV["HARDCORE"].present?
23
- USERS = 999
24
- GROUPS = 1000
25
+ @USERS = 999
26
+ @GROUPS = 1000
25
27
  puts "Hardcore mode: ON (May the Force be with you brave Padawan)"
26
- if CHEESECAKE
27
- puts "WARNING: Hardcore and Cheesecake Modes activated. This situation is really slow. Please, avoid it."
28
- end
29
28
  end
30
- if USERS < 9
31
- USERS = 9
29
+ if @USERS < 9
30
+ @USERS = 9
32
31
  puts "WARNING: There should be at least 10 users (Demo user and 9 more). Changing USERS to 9."
33
32
  end
34
- if GROUPS < 10
35
- GROUPS = 10
33
+ if @GROUPS < 10
34
+ @GROUPS = 10
36
35
  puts "WARNING: There should be at least 10 groups. Changing GROUPS to 10."
37
36
  end
38
37
 
39
38
  Mailboxer.setup do |config|
40
39
  config.uses_emails = false
41
40
  end
41
+ end
42
42
 
43
- def set_logos(klass)
44
- klass.all.each do |i|
45
- if LOGOS_TOTAL
46
- logo = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ rand(LOGOS_TOTAL) + 1 }.*")].first
47
- avatar = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ rand(LOGOS_TOTAL) + 1 }.*")].first
48
- else
49
- logo = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first
50
- avatar = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first
51
- end
52
-
53
- if avatar.present? && File.exists?(avatar)
54
- Avatar.copy_to_temp_file(avatar)
55
- dimensions = Avatar.get_image_dimensions(avatar)
56
- l = Avatar.new(:actor => i.actor,:logo => File.open(avatar), :name => File.basename(avatar), :crop_x => 0, :crop_y => 0, :crop_w => dimensions[:width], :crop_h => dimensions[:height] )
57
- l.active = true
58
- l.save!
59
- end
60
- end
61
- end
62
-
63
- def set_tags(klass)
64
- klass.all.each do |el|
65
- el.tag_list = Forgery::LoremIpsum.words(1,:random => true)+", "+
66
- Forgery::LoremIpsum.words(1,:random => true)+", "+
67
- Forgery::LoremIpsum.words(1,:random => true)
68
- el.save!
69
- end
70
- end
71
-
72
- puts 'User population (Demo and ' + USERS.to_s + ' users more)'
43
+ # USERS
44
+ desc "Create users"
45
+ task :create_users => :read_environment do
46
+ puts 'User population (Demo and ' + @USERS.to_s + ' users more)'
73
47
  users_start = Time.now
74
48
 
75
- # = Users
76
-
77
49
  # Create demo user if not present
78
50
  if User.find_by_name('demo').blank?
79
51
  User.create! :name => 'Demo',
@@ -82,27 +54,39 @@ namespace :db do
82
54
  :password_confirmation => 'demonstration'
83
55
  end
84
56
 
85
- require 'forgery'
86
-
87
- USERS.times do
57
+ @USERS.times do
88
58
  User.create! :name => Forgery::Name.full_name,
89
59
  :email => Forgery::Internet.email_address,
90
60
  :password => 'demonstration',
91
61
  :password_confirmation => 'demonstration'
92
62
  end
93
63
 
64
+ # Reload actors to include new users
65
+ @available_actors = Actor.all
94
66
 
95
67
  users_end = Time.now
96
68
  puts ' -> ' + (users_end - users_start).round(4).to_s + 's'
69
+ end
70
+
97
71
 
98
- puts 'Groups population (' + GROUPS.to_s + ' groups)'
72
+ # GROUPS
73
+ desc "Create groups"
74
+ task :create_groups => :read_environment do
75
+ puts 'Groups population (' + @GROUPS.to_s + ' groups)'
99
76
  groups_start = Time.now
100
77
 
101
- # = Groups
102
- available_actors = Actor.all
78
+ def set_tags(klass)
79
+ klass.all.each do |el|
80
+ el.tag_list = Forgery::LoremIpsum.words(1,:random => true)+", "+
81
+ Forgery::LoremIpsum.words(1,:random => true)+", "+
82
+ Forgery::LoremIpsum.words(1,:random => true)
83
+ el.save!
84
+ end
85
+ end
86
+
103
87
 
104
- GROUPS.times do
105
- founder = available_actors[rand(available_actors.size)]
88
+ @GROUPS.times do
89
+ founder = @available_actors[rand(@available_actors.size)]
106
90
 
107
91
  Group.create! :name => Forgery::Name.company_name,
108
92
  :email => Forgery::Internet.email_address,
@@ -112,147 +96,188 @@ namespace :db do
112
96
 
113
97
  set_tags(Group)
114
98
 
99
+ # Reload actors to include groups
100
+ @available_actors = Actor.all
101
+
115
102
  groups_end = Time.now
116
103
  puts ' -> ' + (groups_end - groups_start).round(4).to_s + 's'
104
+ end
117
105
 
118
106
 
107
+ # TIES
108
+ desc "Create ties"
109
+ task :create_ties => :read_environment do
119
110
  puts 'Ties population'
120
111
  ties_start = Time.now
121
112
 
122
- # Reload actors to include groups
123
- available_actors = Actor.all
113
+ @available_actors.each do |a|
114
+ actors = @available_actors.dup - Array(a)
115
+ relations = a.relation_customs + Array.wrap(Relation::Reject.instance)
116
+ break if actors.size==0
117
+ Forgery::Basic.number(:at_most => actors.size).times do
118
+ actor = actors.delete_at((rand * actors.size).to_i)
119
+ contact = a.contact_to!(actor)
120
+ contact.user_author = a.user_author if a.subject_type != "User"
121
+ contact.relation_ids = Array(Forgery::Extensions::Array.new(relations).random.id) unless a==actor
122
+ end
123
+ end
124
+
125
+ ties_end = Time.now
126
+ puts ' -> ' + (ties_end - ties_start).round(4).to_s + 's'
127
+ end
124
128
 
125
- # = Ties
126
- available_actors.each do |a|
127
- actors = available_actors.dup - Array(a)
129
+
130
+ # TIES, special version for cheesecake testing
131
+ desc "Create cheesecake ties"
132
+ task :create_cheesecake_ties => :read_environment do
133
+ puts 'Ties population (Cheesecake version)'
134
+ ties_start = Time.now
135
+
136
+ @available_actors.each do |a|
137
+ actors = @available_actors.dup - Array(a)
128
138
  relations = a.relation_customs + Array.wrap(Relation::Reject.instance)
129
- break if actors.size==0
130
- if CHEESECAKE
131
- actor = Actor.first
132
- unless a==actor
133
- puts a.name + " connecting with " + actor.name
134
- # DRY! :-S
135
- contact = a.contact_to!(actor)
136
- contact.user_author = a.user_author if a.subject_type != "User"
137
- contact.relation_ids = Array(Forgery::Extensions::Array.new(a.relation_customs).random.id)
138
-
139
- contact = actor.contact_to!(a)
140
- contact.user_author = actor.user_author if actor.subject_type != "User"
141
- contact.relation_ids = Array(Forgery::Extensions::Array.new(actor.relation_customs).random.id)
142
- end
143
- else
144
- Forgery::Basic.number(:at_most => actors.size).times do
145
- actor = actors.delete_at((rand * actors.size).to_i)
146
- contact = a.contact_to!(actor)
147
- contact.user_author = a.user_author if a.subject_type != "User"
148
- contact.relation_ids = Array(Forgery::Extensions::Array.new(relations).random.id) unless a==actor
149
- end
139
+ break if actors.size==0
140
+ actor = Actor.first
141
+ unless a==actor
142
+ puts a.name + " connecting with " + actor.name
143
+ # DRY! :-S
144
+ contact = a.contact_to!(actor)
145
+ contact.user_author = a.user_author if a.subject_type != "User"
146
+ contact.relation_ids = Array(Forgery::Extensions::Array.new(a.relation_customs).random.id)
147
+
148
+ contact = actor.contact_to!(a)
149
+ contact.user_author = actor.user_author if actor.subject_type != "User"
150
+ contact.relation_ids = Array(Forgery::Extensions::Array.new(actor.relation_customs).random.id)
150
151
  end
151
152
  end
152
153
 
153
154
  ties_end = Time.now
154
155
  puts ' -> ' + (ties_end - ties_start).round(4).to_s + 's'
156
+ end
155
157
 
156
- # = Posts
158
+
159
+ # POSTS
160
+ desc "Create posts"
161
+ task :create_posts => :read_environment do
157
162
  puts 'Post population'
158
- unless CHEESECAKE
159
- posts_start = Time.now
160
-
161
- SocialStream::Populate.power_law(Tie.all) do |t|
162
- updated = Time.at(rand(Time.now.to_i))
163
-
164
- author = t.sender
165
- owner = t.receiver
166
- user_author = ( t.sender.subject_type == "User" ? t.sender : t.sender.user_author )
167
-
168
- p = Post.create :text =>
169
- "This post sActorhould be for #{ t.relation.name } of #{ t.sender.name }.\n#{ Forgery::LoremIpsum.paragraph(:random => true) }",
170
- :created_at => Time.at(rand(updated.to_i)),
171
- :updated_at => updated,
172
- :author_id => author.id,
173
- :owner_id => owner.id,
174
- :user_author_id => user_author.id,
175
- :_relation_ids => Array(t.relation_id)
176
-
177
- p.post_activity.update_attributes(:created_at => p.created_at,
178
- :updated_at => p.updated_at)
179
- end
180
-
181
- posts_end = Time.now
182
- puts ' -> ' + (posts_end - posts_start).round(4).to_s + 's'
183
- else
184
- puts ' -> Cheesecake Testing Mode. Avoiding Post Population.'
163
+ posts_start = Time.now
164
+
165
+ SocialStream::Populate.power_law(Tie.all) do |t|
166
+ updated = Time.at(rand(Time.now.to_i))
167
+
168
+ author = t.sender
169
+ owner = t.receiver
170
+ user_author = ( t.sender.subject_type == "User" ? t.sender : t.sender.user_author )
171
+
172
+ p = Post.create :text =>
173
+ "This post sActorhould be for #{ t.relation.name } of #{ t.sender.name }.\n#{ Forgery::LoremIpsum.paragraph(:random => true) }",
174
+ :created_at => Time.at(rand(updated.to_i)),
175
+ :updated_at => updated,
176
+ :author_id => author.id,
177
+ :owner_id => owner.id,
178
+ :user_author_id => user_author.id,
179
+ :_relation_ids => Array(t.relation_id)
180
+
181
+ p.post_activity.update_attributes(:created_at => p.created_at,
182
+ :updated_at => p.updated_at)
185
183
  end
186
184
 
187
- # = Mailboxer
185
+ posts_end = Time.now
186
+ puts ' -> ' + (posts_end - posts_start).round(4).to_s + 's'
187
+ end
188
+
189
+
190
+ # MESSAGES
191
+ desc "Create messages using mailboxer"
192
+ task :create_messages => :read_environment do
188
193
  puts 'Mailboxer population'
189
- unless CHEESECAKE
190
- mailboxer_start = Time.now
191
- available_actors = Actor.all
192
-
193
- available_actors.each do |a|
194
- actors = available_actors.dup - Array(a)
195
-
196
- mult_recp = actors.uniq
197
- if (demo = User.find_by_name('demo')) and !mult_recp.include? Actor.normalize(demo)
198
- mult_recp << Actor.normalize(demo)
199
- end
200
- actor = mult_recp[(rand * mult_recp.size).to_i]
201
- mult_recp.delete(actor)
202
- mail = actor.send_message(mult_recp, "Hello all, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
203
- actor = mult_recp[(rand * mult_recp.size).to_i]
204
- mail = actor.reply_to_all(mail, "Well, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
205
- actor = mult_recp[(rand * mult_recp.size).to_i]
206
- mail = actor.reply_to_all(mail, "Ok, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
207
- actor = mult_recp[(rand * mult_recp.size).to_i]
208
- mail = actor.reply_to_all(mail, "Pretty well, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
209
- actor = mult_recp[(rand * mult_recp.size).to_i]
210
- actor.reply_to_all(mail, "Finally, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
211
-
212
-
213
- if (demo = User.find_by_name('demo'))
214
- next if Actor.normalize(demo)==Actor.normalize(a)
215
- mail = a.send_message(demo, "Hello, #{demo.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
194
+ mailboxer_start = Time.now
195
+ @available_actors = Actor.all
196
+
197
+ @available_actors.each do |a|
198
+ actors = @available_actors.dup - Array(a)
199
+
200
+ mult_recp = actors.uniq
201
+ if (demo = User.find_by_name('demo')) and !mult_recp.include? Actor.normalize(demo)
202
+ mult_recp << Actor.normalize(demo)
203
+ end
204
+ actor = mult_recp[(rand * mult_recp.size).to_i]
205
+ mult_recp.delete(actor)
206
+ mail = actor.send_message(mult_recp, "Hello all, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
207
+ actor = mult_recp[(rand * mult_recp.size).to_i]
208
+ mail = actor.reply_to_all(mail, "Well, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
209
+ actor = mult_recp[(rand * mult_recp.size).to_i]
210
+ mail = actor.reply_to_all(mail, "Ok, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
211
+ actor = mult_recp[(rand * mult_recp.size).to_i]
212
+ mail = actor.reply_to_all(mail, "Pretty well, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
213
+ actor = mult_recp[(rand * mult_recp.size).to_i]
214
+ actor.reply_to_all(mail, "Finally, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
215
+
216
+
217
+ if (demo = User.find_by_name('demo'))
218
+ next if Actor.normalize(demo)==Actor.normalize(a)
219
+ mail = a.send_message(demo, "Hello, #{demo.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
220
+ if rand > 0.5
221
+ mail = demo.reply_to_sender(mail, "Pretty well #{a.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
216
222
  if rand > 0.5
217
- mail = demo.reply_to_sender(mail, "Pretty well #{a.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
218
- if rand > 0.5
219
- a.reply_to_sender(mail, "Ok #{demo.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
220
- end
221
- end
222
- if rand > 0.75
223
- mail.conversation.move_to_trash(demo)
223
+ a.reply_to_sender(mail, "Ok #{demo.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
224
224
  end
225
225
  end
226
-
227
- Forgery::Basic.number(:at_most => actors.size).times do
228
- actor = actors.delete_at((rand * actors.size).to_i)
229
- next if Actor.normalize(actor)==Actor.normalize(a)
230
- mail = a.send_message(actor, "Hello, #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
226
+ if rand > 0.75
227
+ mail.conversation.move_to_trash(demo)
228
+ end
229
+ end
230
+
231
+ Forgery::Basic.number(:at_most => actors.size).times do
232
+ actor = actors.delete_at((rand * actors.size).to_i)
233
+ next if Actor.normalize(actor)==Actor.normalize(a)
234
+ mail = a.send_message(actor, "Hello, #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
235
+ if rand > 0.5
236
+ mail = actor.reply_to_sender(mail, "Pretty well #{a.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
231
237
  if rand > 0.5
232
- mail = actor.reply_to_sender(mail, "Pretty well #{a.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
233
- if rand > 0.5
234
- a.reply_to_sender(mail, "Ok #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
235
- end
236
- end
237
- if rand > 0.75
238
- mail.conversation.move_to_trash(actor)
238
+ a.reply_to_sender(mail, "Ok #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
239
239
  end
240
240
  end
241
+ if rand > 0.75
242
+ mail.conversation.move_to_trash(actor)
243
+ end
241
244
  end
242
-
243
- mailboxer_end = Time.now
244
- puts ' -> ' + (mailboxer_end - mailboxer_start).round(4).to_s + 's'
245
- else
246
- puts ' -> Cheesecake Testing Mode. Avoiding Mailboxer Population.'
247
245
  end
248
246
 
247
+ mailboxer_end = Time.now
248
+ puts ' -> ' + (mailboxer_end - mailboxer_start).round(4).to_s + 's'
249
+
250
+ end
251
+
252
+
253
+ # AVATARS
254
+ desc "Create avatars"
255
+ task :create_avatars => :read_environment do
256
+ def set_logos(klass)
257
+ klass.all.each do |i|
258
+ if @LOGOS_TOTAL
259
+ logo = Dir[File.join(@LOGOS_PATH, klass.to_s.tableize, "#{ rand(@LOGOS_TOTAL) + 1 }.*")].first
260
+ avatar = Dir[File.join(@LOGOS_PATH, klass.to_s.tableize, "#{ rand(@LOGOS_TOTAL) + 1 }.*")].first
261
+ else
262
+ logo = Dir[File.join(@LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first
263
+ avatar = Dir[File.join(@LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first
264
+ end
265
+
266
+ if avatar.present? && File.exists?(avatar)
267
+ Avatar.copy_to_temp_file(avatar)
268
+ dimensions = Avatar.get_image_dimensions(avatar)
269
+ l = Avatar.new(:actor => i.actor,:logo => File.open(avatar), :name => File.basename(avatar), :crop_x => 0, :crop_y => 0, :crop_w => dimensions[:width], :crop_h => dimensions[:height] )
270
+ l.active = true
271
+ l.save!
272
+ end
273
+ end
274
+ end
249
275
 
250
276
  puts 'Avatar population'
251
277
  avatar_start = Time.now
252
278
  SocialStream.subjects.each {|a| set_logos(Kernel.const_get(a.to_s.classify)) }
253
279
  avatar_end = Time.now
254
280
  puts ' -> ' + (avatar_end - avatar_start).round(4).to_s + 's'
255
-
256
281
  end
257
282
  end
258
283
  end