social_stream-base 0.7.11 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/app/assets/javascripts/ties.js +67 -0
- data/app/assets/stylesheets/activities.css +1 -1
- data/app/assets/stylesheets/base.css +3 -2
- data/app/assets/stylesheets/ties.css +10 -0
- data/app/controllers/ties_controller.rb +8 -0
- data/app/helpers/subjects_helper.rb +5 -5
- data/app/models/actor.rb +21 -0
- data/app/views/ties/index.html.erb +8 -0
- data/config/locales/en.yml +1 -1
- data/config/routes.rb +1 -0
- data/lib/mailboxer/notification_decoder.rb +8 -8
- data/lib/social_stream/base/version.rb +1 -1
- data/lib/social_stream/controllers/helpers.rb +4 -6
- data/lib/social_stream/d3.rb +53 -0
- data/lib/social_stream/toolbar_config.rb +1 -0
- data/lib/social_stream-base.rb +9 -3
- data/lib/tasks/db/populate.rake +60 -54
- data/social_stream-base.gemspec +10 -11
- data/spec/dummy/app/assets/javascripts/application.js +8 -0
- data/spec/dummy/app/assets/stylesheets/application.css +8 -0
- data/spec/dummy/db/schema.rb +2 -9
- data/vendor/assets/javascripts/d3.geom.js +825 -0
- data/vendor/assets/javascripts/d3.js +4013 -0
- data/vendor/assets/javascripts/d3.layout.js +1865 -0
- data/vendor/assets/stylesheets/jquery-ui.css +1 -1
- metadata +84 -90
data/.gitignore
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
//= require d3
|
2
|
+
//= require d3.layout
|
3
|
+
//= require d3.geom
|
4
|
+
|
5
|
+
(function( $ ){
|
6
|
+
$.fn.tiesGraph = function( data ) {
|
7
|
+
//TODO: better handling of width and height
|
8
|
+
var w = 860,
|
9
|
+
h = 500,
|
10
|
+
fill = d3.scale.category20();
|
11
|
+
|
12
|
+
var vis = d3.select(this.selector)
|
13
|
+
.append("svg:svg")
|
14
|
+
.attr("width", w)
|
15
|
+
.attr("height", h);
|
16
|
+
|
17
|
+
var force = d3.layout.force()
|
18
|
+
.charge(-120)
|
19
|
+
.linkDistance(40)
|
20
|
+
.nodes(data.nodes)
|
21
|
+
.links(data.links)
|
22
|
+
.size([w, h])
|
23
|
+
.start();
|
24
|
+
|
25
|
+
var link = vis.selectAll("line.link")
|
26
|
+
.data(data.links)
|
27
|
+
.enter().append("svg:line")
|
28
|
+
.attr("class", "link")
|
29
|
+
.style("stroke-width", function(d) { return Math.sqrt(d.value); })
|
30
|
+
.attr("x1", function(d) { return d.source.x; })
|
31
|
+
.attr("y1", function(d) { return d.source.y; })
|
32
|
+
.attr("x2", function(d) { return d.target.x; })
|
33
|
+
.attr("y2", function(d) { return d.target.y; });
|
34
|
+
|
35
|
+
var node = vis.selectAll("g.node")
|
36
|
+
.data(data.nodes)
|
37
|
+
.enter().append("svg:g")
|
38
|
+
.attr("class", "node")
|
39
|
+
.call(force.drag);
|
40
|
+
|
41
|
+
node.append("svg:image")
|
42
|
+
.attr("class", "circle")
|
43
|
+
.attr("xlink:href", function(d) { return d.logo; })
|
44
|
+
.attr("x", "-10px")
|
45
|
+
.attr("y", "-10px")
|
46
|
+
.attr("width", "20px")
|
47
|
+
.attr("height", "20px");
|
48
|
+
|
49
|
+
node.append("svg:title")
|
50
|
+
.text(function(d) { return d.name; });
|
51
|
+
|
52
|
+
vis.style("opacity", 1e-6)
|
53
|
+
.transition()
|
54
|
+
.duration(1000)
|
55
|
+
.style("opacity", 1);
|
56
|
+
|
57
|
+
force.on("tick", function() {
|
58
|
+
link.attr("x1", function(d) { return d.source.x; })
|
59
|
+
.attr("y1", function(d) { return d.source.y; })
|
60
|
+
.attr("x2", function(d) { return d.target.x; })
|
61
|
+
.attr("y2", function(d) { return d.target.y; });
|
62
|
+
|
63
|
+
node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
|
64
|
+
});
|
65
|
+
};
|
66
|
+
})( jQuery );
|
67
|
+
|
@@ -23,7 +23,7 @@
|
|
23
23
|
.activity { text-align:left; display: block; vertical-align: top; padding: 10px 0px 5px 0px;
|
24
24
|
display: inline-block; color: #000; font-size: 13px; color: #2A3890;border-bottom:1px solid #E9E9E9;}
|
25
25
|
.actor_logo { width: 38px; padding: 8px 0px 5px 5px; display: inline-block; vertical-align: top;}
|
26
|
-
.activity_content { padding: 8px 0px 0px 0px; display: inline-block; color: #000; width:
|
26
|
+
.activity_content { padding: 8px 0px 0px 0px; display: inline-block; color: #000; width: 89%;}
|
27
27
|
.actor_name {font-size: 13px;}
|
28
28
|
.actor_name a{font-weight: bold;}
|
29
29
|
.post a { color: #2A3890;}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*************Basic SECTION ********************/
|
2
2
|
* { margin: 0; padding: 0; font-family: Arial; }
|
3
|
-
html, body {height:
|
3
|
+
html, body {height: auto;}
|
4
4
|
.p { margin: 0px; padding: 0px; font-size: inherit; font-family: inherit; font-weight: inherit;
|
5
5
|
text-align: inherit; color: inherit; line-height: inherit; vertical-align: top;}
|
6
6
|
p { padding-top: 0px; margin-top: 0px;}
|
@@ -15,7 +15,7 @@ h2{padding-left:10px;}
|
|
15
15
|
|
16
16
|
|
17
17
|
/******* Main Structure SECTION***************************/
|
18
|
-
body{font-size:1.0em; color:#2A3890; background-color:#ffffff; }
|
18
|
+
body{font-size:1.0em; color:#2A3890; background-color:#ffffff; overflow-y: scroll;}
|
19
19
|
#wrapper { background-color: #f5f5f5; width: 100%; margin: 0px auto; }
|
20
20
|
#wrapper_body{min-height: 552px; width: 960px; margin:0px auto; margin-left: auto; margin-right: auto;
|
21
21
|
margin-top: auto; margin-bottom:auto;}
|
@@ -102,6 +102,7 @@ textarea.new_contact_text_area{ height: 100px; color: #2A3890;}
|
|
102
102
|
.block .header_icon{ margin-top: 2px; width:14px; height:14px; }
|
103
103
|
.block .header_icon_right { float: right; padding-right: 5px; padding-top: 3px;}
|
104
104
|
.block .header_text { margin-top: 3px; display: inline-block;}
|
105
|
+
.block .header_title { margin-top: 3px; display: inline-block; font-weight: bold}
|
105
106
|
.block .logo{ display: inline-block; vertical-align:top;}
|
106
107
|
.block .right{padding-right:20px; float:right;}
|
107
108
|
.block .row { display: block;}
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module SubjectsHelper
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
NAME_MAX_LENGTH = 30
|
4
|
+
|
5
5
|
# Return a link to this subject with the name
|
6
6
|
def link_name(subject, options = {})
|
7
7
|
link_to subject.name, subject, options
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
# Return the truncated name
|
11
11
|
def truncate_name(name, options={})
|
12
|
-
options = {:length =>
|
12
|
+
options = {:length => NAME_MAX_LENGTH, :separator => ' '}.merge options
|
13
13
|
truncate(name,options)
|
14
14
|
end
|
15
15
|
end
|
data/app/models/actor.rb
CHANGED
@@ -280,6 +280,13 @@ class Actor < ActiveRecord::Base
|
|
280
280
|
ties_to(subject).present?
|
281
281
|
end
|
282
282
|
|
283
|
+
# The {Tie ties} sent by this actor, plus the second grade ties
|
284
|
+
def egocentric_ties
|
285
|
+
@egocentric_ties ||=
|
286
|
+
load_egocentric_ties
|
287
|
+
end
|
288
|
+
|
289
|
+
|
283
290
|
# Can this actor be represented by subject. Does she has permissions for it?
|
284
291
|
def represented_by?(subject)
|
285
292
|
return false if subject.blank?
|
@@ -444,4 +451,18 @@ class Actor < ActiveRecord::Base
|
|
444
451
|
create_profile
|
445
452
|
end
|
446
453
|
end
|
454
|
+
|
455
|
+
# Calculate {#egocentric_ties}
|
456
|
+
def load_egocentric_ties
|
457
|
+
ties = sent_ties.includes(:contact).to_a
|
458
|
+
|
459
|
+
contact_ids = ties.map{ |t| t.contact.receiver_id }
|
460
|
+
|
461
|
+
second_grade_ties =
|
462
|
+
contact_ids.
|
463
|
+
map{ |i| Tie.sent_by(i) }.
|
464
|
+
flatten
|
465
|
+
|
466
|
+
ties + second_grade_ties
|
467
|
+
end
|
447
468
|
end
|
data/config/locales/en.yml
CHANGED
@@ -307,7 +307,7 @@ en:
|
|
307
307
|
title: "Privacy & context"
|
308
308
|
relation_public:
|
309
309
|
name: "Public"
|
310
|
-
required: "* These fields are required"
|
310
|
+
required: "(*) These fields are required"
|
311
311
|
settings:
|
312
312
|
error: "Some errors raised when saving your changes"
|
313
313
|
for: "Settings for"
|
data/config/routes.rb
CHANGED
@@ -4,11 +4,11 @@ module Mailboxer
|
|
4
4
|
def decode_notification notification_text, activity
|
5
5
|
return if activity.nil?
|
6
6
|
notification_text = notification_text.gsub(/\%\{sender\}/, link_to(truncate_name(activity.sender.name),
|
7
|
-
url_for(:controller=> activity.sender.subject.class.to_s.
|
7
|
+
url_for(:controller=> activity.sender.subject.class.to_s.underscore.pluralize,
|
8
8
|
:action=> :show, :id=> activity.sender.subject.slug, :only_path => false)))
|
9
9
|
notification_text = notification_text.gsub(/\%\{confirm\}/,link_to(t('notification.confirm'),edit_contact_url(activity.receiver.contact_to!(activity.sender), :s => activity.sender.slug)))
|
10
10
|
notification_text = notification_text.gsub(/\%\{look\}/,link_to(t('notification.look'),
|
11
|
-
url_for(:controller=> activity.sender.subject.class.to_s.
|
11
|
+
url_for(:controller=> activity.sender.subject.class.to_s.underscore.pluralize,
|
12
12
|
:action=> :show, :id=> activity.sender.subject.slug, :only_path => false)))
|
13
13
|
notification_text = notification_text.gsub(/\%\{sender.name\}/,truncate_name(activity.sender.name))
|
14
14
|
|
@@ -23,12 +23,12 @@ module Mailboxer
|
|
23
23
|
if activity.direct_object.present?
|
24
24
|
object = activity.direct_object
|
25
25
|
object = object.subject if object.is_a? Actor
|
26
|
-
notification_text=notification_text.gsub(/\%\{object\}/,link_to(object.class.to_s.
|
27
|
-
url_for(:controller=> object.class.to_s.
|
26
|
+
notification_text=notification_text.gsub(/\%\{object\}/,link_to(object.class.to_s.underscore,
|
27
|
+
url_for(:controller=> object.class.to_s.underscore.pluralize, :action=> :show,
|
28
28
|
:id=> object.id, :only_path => false)))
|
29
|
-
notification_text=notification_text.gsub(/\%\{object.name\}/,object.class.to_s.
|
29
|
+
notification_text=notification_text.gsub(/\%\{object.name\}/,object.class.to_s.underscore)
|
30
30
|
notification_text=notification_text.gsub(/\%\{object.text\}/,link_to(object.text.truncate(100, :separator =>' '),
|
31
|
-
url_for(:controller=> object.class.to_s.
|
31
|
+
url_for(:controller=> object.class.to_s.underscore.pluralize, :action=> :show,
|
32
32
|
:id=> object.id, :only_path => false))) if object.respond_to? :text
|
33
33
|
|
34
34
|
#notification_text=notification_text.gsub(/\%\{object.image\}/,thumb_for(object)) if SocialStream.activity_forms.include? :document and object.is_a? Document
|
@@ -59,8 +59,8 @@ module Mailboxer
|
|
59
59
|
if activity.direct_object.present?
|
60
60
|
object = activity.direct_object
|
61
61
|
object = object.subject if object.is_a? Actor
|
62
|
-
notification_text=notification_text.gsub(/\%\{object\}/,object.class.to_s.
|
63
|
-
notification_text=notification_text.gsub(/\%\{object.name\}/,object.class.to_s.
|
62
|
+
notification_text=notification_text.gsub(/\%\{object\}/,object.class.to_s.underscore)
|
63
|
+
notification_text=notification_text.gsub(/\%\{object.name\}/,object.class.to_s.underscore)
|
64
64
|
notification_text=notification_text.gsub(/\%\{object.text\}/,object.text.truncate(100, :separator =>' ')) if object.respond_to? :text
|
65
65
|
|
66
66
|
#notification_text=notification_text.gsub(/\%\{object.image\}/,thumb_for(object)) if SocialStream.activity_forms.include? :document and object.is_a? Document
|
@@ -57,9 +57,8 @@ module SocialStream
|
|
57
57
|
# Requirements: the controller must inherit from +InheritedResources::Base+ and the method
|
58
58
|
# {ClassMethods#belongs_to_subjects} must be called
|
59
59
|
#
|
60
|
-
#
|
61
60
|
# class PostsController < InheritedResources::Base
|
62
|
-
# belongs_to_subjects
|
61
|
+
# belongs_to_subjects :optional => true
|
63
62
|
# end
|
64
63
|
#
|
65
64
|
# # /users/demo/posts
|
@@ -100,10 +99,9 @@ module SocialStream
|
|
100
99
|
|
101
100
|
subject = Actor.find_by_slug!(params[:s]).subject
|
102
101
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
#end
|
102
|
+
unless subject.represented_by?(current_user)
|
103
|
+
raise CanCan::AccessDenied.new("Not authorized!", :represent, subject.name)
|
104
|
+
end
|
107
105
|
|
108
106
|
self.current_subject = subject
|
109
107
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module SocialStream
|
2
|
+
# Methods for d3.js library
|
3
|
+
# http://mbostock.github.com/d3/
|
4
|
+
module D3
|
5
|
+
class Force
|
6
|
+
def initialize(ties, view)
|
7
|
+
@view = view
|
8
|
+
|
9
|
+
@force =
|
10
|
+
ties.inject({ :nodes => [], :links => [] }) { |result, t|
|
11
|
+
add_node(result[:nodes], t.sender)
|
12
|
+
add_node(result[:nodes], t.receiver)
|
13
|
+
|
14
|
+
add_link(result[:links], t, result[:nodes])
|
15
|
+
|
16
|
+
result
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json
|
21
|
+
@force.to_json
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def node(actor)
|
27
|
+
{
|
28
|
+
:name => actor.name,
|
29
|
+
:logo => @view.image_path(actor.logo.url(:representation)),
|
30
|
+
:group => SocialStream.subjects.index(actor.subject_type.underscore.to_sym) + 1
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_node(nodes, actor)
|
35
|
+
return if nodes_actor_index(nodes, actor)
|
36
|
+
|
37
|
+
nodes << node(actor)
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_link(links, tie, nodes)
|
41
|
+
links << {
|
42
|
+
:source => nodes_actor_index(nodes, tie.sender),
|
43
|
+
:target => nodes_actor_index(nodes, tie.receiver),
|
44
|
+
:value => 1
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
def nodes_actor_index(nodes, actor)
|
49
|
+
nodes.index(nodes.find{ |n| n[:name] == actor.name })
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -43,6 +43,7 @@ module SocialStream
|
|
43
43
|
:options => {:link => {:id => "contacts_menu"}},
|
44
44
|
:items => [
|
45
45
|
{:key => :invitations, :name => image_tag("btn/btn_friend.png")+t('contact.current'), :url => contacts_path},
|
46
|
+
{:key => :contacts_graph, :name => image_tag("btn/btn_friend.png")+t('contact.graph'), :url => ties_path},
|
46
47
|
{:key => :invitations, :name => image_tag("btn/btn_friend.png")+t('contact.pending.other'), :url => contacts_path(:pending=>true)},
|
47
48
|
{:key => :invitations, :name => image_tag("btn/btn_invitation.png")+t('invitation.toolbar'), :url => new_invitation_path}
|
48
49
|
]}
|
data/lib/social_stream-base.rb
CHANGED
@@ -39,6 +39,7 @@ require 'modernizr-rails'
|
|
39
39
|
# Provides your Rails application with social network and activity stream support
|
40
40
|
module SocialStream
|
41
41
|
autoload :Ability, 'social_stream/ability'
|
42
|
+
autoload :D3, 'social_stream/d3'
|
42
43
|
autoload :Populate, 'social_stream/populate'
|
43
44
|
autoload :Relations, 'social_stream/relations'
|
44
45
|
autoload :TestHelpers, 'social_stream/test_helpers'
|
@@ -95,11 +96,16 @@ module SocialStream
|
|
95
96
|
#
|
96
97
|
# Maybe Rails provides some method to do this, in this case, please tell!!
|
97
98
|
def require_model(m)
|
98
|
-
|
99
|
+
paths = $:.find_all{ |f| f =~ Regexp.new(File.join('social_stream.*', 'app', 'models')) }
|
99
100
|
|
100
|
-
raise "Can't find social_stream path" if
|
101
|
+
raise "Can't find social_stream path" if paths.blank?
|
102
|
+
|
103
|
+
paths.each do |path|
|
104
|
+
if File.exists?(File.join(path, "#{m}.rb"))
|
105
|
+
require_dependency File.join(path, m)
|
106
|
+
end
|
107
|
+
end
|
101
108
|
|
102
|
-
require_dependency File.join(path, m)
|
103
109
|
end
|
104
110
|
end
|
105
111
|
end
|
data/lib/tasks/db/populate.rake
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
namespace :db do
|
2
2
|
desc 'Populate database with fake data for development'
|
3
3
|
task :populate => [ 'db:seed', 'db:populate:create' ]
|
4
|
-
|
4
|
+
|
5
5
|
namespace :populate do
|
6
|
-
|
6
|
+
|
7
7
|
desc "Reload populate data"
|
8
8
|
task :reload => [ 'db:reset', :create ]
|
9
|
-
|
9
|
+
|
10
10
|
desc "Create populate data"
|
11
11
|
task :create => :environment do
|
12
|
-
|
12
|
+
|
13
13
|
LOGOS_PATH = File.join(Rails.root, 'lib', 'logos')
|
14
|
-
|
14
|
+
|
15
15
|
Mailboxer.setup do |config|
|
16
16
|
config.uses_emails = false
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def set_logos(klass)
|
20
20
|
klass.all.each do |i|
|
21
21
|
logo = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first
|
22
22
|
avatar = Dir[File.join(LOGOS_PATH, klass.to_s.tableize, "#{ i.id }.*")].first
|
23
|
-
|
23
|
+
|
24
24
|
if avatar.present? && File.exists?(avatar)
|
25
25
|
Avatar.copy_to_temp_file(avatar)
|
26
26
|
dimensions = Avatar.get_image_dimensions(avatar)
|
@@ -30,7 +30,7 @@ namespace :db do
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
def set_tags(klass)
|
35
35
|
klass.all.each do |el|
|
36
36
|
el.tag_list = Forgery::LoremIpsum.words(1,:random => true)+", "+
|
@@ -39,12 +39,12 @@ namespace :db do
|
|
39
39
|
el.save!
|
40
40
|
end
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
puts 'User population'
|
44
44
|
users_start = Time.now
|
45
|
-
|
45
|
+
|
46
46
|
# = Users
|
47
|
-
|
47
|
+
|
48
48
|
# Create demo user if not present
|
49
49
|
if User.find_by_name('demo').blank?
|
50
50
|
User.create! :name => 'Demo',
|
@@ -52,100 +52,98 @@ namespace :db do
|
|
52
52
|
:password => 'demonstration',
|
53
53
|
:password_confirmation => 'demonstration'
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
require 'forgery'
|
57
|
-
|
57
|
+
|
58
58
|
9.times do
|
59
59
|
User.create! :name => Forgery::Name.full_name,
|
60
60
|
:email => Forgery::Internet.email_address,
|
61
61
|
:password => 'demonstration',
|
62
62
|
:password_confirmation => 'demonstration'
|
63
63
|
end
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
users_end = Time.now
|
64
|
+
|
65
|
+
|
66
|
+
users_end = Time.now
|
68
67
|
puts ' -> ' + (users_end - users_start).round(4).to_s + 's'
|
69
|
-
|
68
|
+
|
70
69
|
puts 'Groups population'
|
71
70
|
groups_start = Time.now
|
72
|
-
|
71
|
+
|
73
72
|
# = Groups
|
74
73
|
available_actors = Actor.all
|
75
74
|
|
76
75
|
10.times do
|
77
76
|
founder = available_actors[rand(available_actors.size)]
|
78
|
-
|
77
|
+
|
79
78
|
Group.create! :name => Forgery::Name.company_name,
|
80
79
|
:email => Forgery::Internet.email_address,
|
81
80
|
:_founder => founder.slug
|
82
81
|
end
|
83
|
-
|
84
|
-
set_logos(Group)
|
82
|
+
|
85
83
|
set_tags(Group)
|
86
|
-
|
87
|
-
groups_end = Time.now
|
84
|
+
|
85
|
+
groups_end = Time.now
|
88
86
|
puts ' -> ' + (groups_end - groups_start).round(4).to_s + 's'
|
89
|
-
|
90
|
-
|
87
|
+
|
88
|
+
|
91
89
|
puts 'Ties population'
|
92
90
|
ties_start = Time.now
|
93
|
-
|
91
|
+
|
94
92
|
# Reload actors to include groups
|
95
|
-
available_actors = Actor.all
|
96
|
-
|
93
|
+
available_actors = Actor.all
|
94
|
+
|
97
95
|
# = Ties
|
98
96
|
available_actors.each do |a|
|
99
97
|
actors = available_actors.dup - Array(a)
|
100
98
|
relations = a.relations
|
101
|
-
|
99
|
+
|
102
100
|
Forgery::Basic.number(:at_most => actors.size).times do
|
103
101
|
actor = actors.delete_at((rand * actors.size).to_i)
|
104
|
-
a.contact_to!(actor).relation_ids = Array(relations.random.id)
|
102
|
+
a.contact_to!(actor).relation_ids = Array(Forgery::Extensions::Array.new(relations).random.id)
|
105
103
|
end
|
106
104
|
end
|
107
|
-
|
105
|
+
|
108
106
|
ties_end = Time.now
|
109
107
|
puts ' -> ' + (ties_end - ties_start).round(4).to_s + 's'
|
110
|
-
|
108
|
+
|
111
109
|
# = Posts
|
112
|
-
|
110
|
+
|
113
111
|
puts 'Post population'
|
114
112
|
posts_start = Time.now
|
115
|
-
|
113
|
+
|
116
114
|
SocialStream::Populate.power_law(Tie.all) do |t|
|
117
115
|
updated = Time.at(rand(Time.now.to_i))
|
118
|
-
|
116
|
+
|
119
117
|
p = Post.create :text =>
|
120
118
|
"This post should be for #{ t.relation.name } of #{ t.sender.name }.\n#{ Forgery::LoremIpsum.paragraph(:random => true) }",
|
121
119
|
:created_at => Time.at(rand(updated.to_i)),
|
122
120
|
:updated_at => updated,
|
123
121
|
:_contact_id => t.contact_id,
|
124
122
|
:_relation_ids => Array(t.relation_id)
|
125
|
-
|
123
|
+
|
126
124
|
p.post_activity.update_attributes(:created_at => p.created_at,
|
127
125
|
:updated_at => p.updated_at)
|
128
126
|
end
|
129
|
-
|
130
|
-
posts_end = Time.now
|
127
|
+
|
128
|
+
posts_end = Time.now
|
131
129
|
puts ' -> ' + (posts_end - posts_start).round(4).to_s + 's'
|
132
|
-
|
130
|
+
|
133
131
|
puts 'Mailboxer population'
|
134
132
|
mailboxer_start = Time.now
|
135
|
-
|
133
|
+
|
136
134
|
# = Mailboxer
|
137
135
|
available_actors = Actor.all
|
138
|
-
|
136
|
+
|
139
137
|
available_actors.each do |a|
|
140
138
|
actors = available_actors.dup - Array(a)
|
141
|
-
|
139
|
+
|
142
140
|
mult_recp = actors.uniq
|
143
141
|
if (demo = User.find_by_name('demo')) and !mult_recp.include? Actor.normalize(demo)
|
144
142
|
mult_recp << Actor.normalize(demo)
|
145
143
|
end
|
146
144
|
actor = mult_recp[(rand * mult_recp.size).to_i]
|
147
145
|
mult_recp.delete(actor)
|
148
|
-
mail = actor.send_message(mult_recp, "Hello all, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
|
146
|
+
mail = actor.send_message(mult_recp, "Hello all, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
|
149
147
|
actor = mult_recp[(rand * mult_recp.size).to_i]
|
150
148
|
mail = actor.reply_to_all(mail, "Well, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
|
151
149
|
actor = mult_recp[(rand * mult_recp.size).to_i]
|
@@ -153,11 +151,11 @@ namespace :db do
|
|
153
151
|
actor = mult_recp[(rand * mult_recp.size).to_i]
|
154
152
|
mail = actor.reply_to_all(mail, "Pretty well, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
|
155
153
|
actor = mult_recp[(rand * mult_recp.size).to_i]
|
156
|
-
actor.reply_to_all(mail, "Finally, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
|
157
|
-
|
158
|
-
|
154
|
+
actor.reply_to_all(mail, "Finally, I am #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
|
155
|
+
|
156
|
+
|
159
157
|
if (demo = User.find_by_name('demo'))
|
160
|
-
next if Actor.normalize(demo)==Actor.normalize(a)
|
158
|
+
next if Actor.normalize(demo)==Actor.normalize(a)
|
161
159
|
mail = a.send_message(demo, "Hello, #{demo.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
|
162
160
|
if rand > 0.5
|
163
161
|
mail = demo.reply_to_sender(mail, "Pretty well #{a.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
|
@@ -168,11 +166,11 @@ namespace :db do
|
|
168
166
|
if rand > 0.75
|
169
167
|
mail.conversation.move_to_trash(demo)
|
170
168
|
end
|
171
|
-
end
|
172
|
-
|
169
|
+
end
|
170
|
+
|
173
171
|
Forgery::Basic.number(:at_most => actors.size).times do
|
174
172
|
actor = actors.delete_at((rand * actors.size).to_i)
|
175
|
-
next if Actor.normalize(actor)==Actor.normalize(a)
|
173
|
+
next if Actor.normalize(actor)==Actor.normalize(a)
|
176
174
|
mail = a.send_message(actor, "Hello, #{actor.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}", Forgery::LoremIpsum.words(10,:random => true))
|
177
175
|
if rand > 0.5
|
178
176
|
mail = actor.reply_to_sender(mail, "Pretty well #{a.name}. #{Forgery::LoremIpsum.sentences(2,:random => true)}")
|
@@ -182,13 +180,21 @@ namespace :db do
|
|
182
180
|
end
|
183
181
|
if rand > 0.75
|
184
182
|
mail.conversation.move_to_trash(actor)
|
185
|
-
end
|
183
|
+
end
|
186
184
|
end
|
187
185
|
end
|
188
|
-
|
186
|
+
|
189
187
|
mailboxer_end = Time.now
|
190
188
|
puts ' -> ' + (mailboxer_end - mailboxer_start).round(4).to_s + 's'
|
191
|
-
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
puts 'Avatar population'
|
193
|
+
avatar_start = Time.now
|
194
|
+
SocialStream.subjects.each {|a| set_logos(Kernel.const_get(a.to_s.classify)) }
|
195
|
+
avatar_end = Time.now
|
196
|
+
puts ' -> ' + (avatar_end - avatar_start).round(4).to_s + 's'
|
197
|
+
|
192
198
|
end
|
193
199
|
end
|
194
200
|
end
|