Merge branch 'master' of github.com:diaspora/diaspora

This commit is contained in:
ilya 2010-09-17 15:33:51 -07:00
commit 2b70317677
21 changed files with 152 additions and 100 deletions

View file

@ -3,7 +3,7 @@ You are welcome to contribute, add and extend Diaspora however you see fit. We
We need you to fill out a [contributor agreement form](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq) before we can accept your patches. The agreement gives Diaspora joint ownership of the patch so the copyright isn't scattered. You can find it [here](https://spreadsheets.google.com/a/joindiaspora.com/viewform?formkey=dGI2cHA3ZnNHLTJvbm10LUhXRTJjR0E6MQ&theme=0AX42CRMsmRFbUy1iOGYwN2U2Mi1hNWU0LTRlNjEtYWMyOC1lZmU4ODg1ODc1ODI&ifq).
All commits must be tested, and after each commit, all tests should be green before a pull request is sent. Please write your tests in Rspec or Test-Unit.
All commits must be tested, and after each commit, all tests should be green before a pull request is sent. Please write your tests in Rspec.
GEMS: We would like to keep external dependencies unduplicated. We're using Nokogiri, and Mongomapper, and EM::HttpRequest as much as possible. We have a few gems in the project we'd rather not use, but if you can, use dependencies we already have.
@ -195,9 +195,15 @@ If you installed the OsX package through "brew", MongoDB will need to be started
Diaspora will not run unless mongo is running. Mongo will not run by default, and will need to be started every time you wish to use or run the test suite for Diaspora.
### Run the server
`./script/server` will start both thin and the websocket server. If you want to run a different app server, you will have to run them separately. See below for instructions.
### Run the app server
Once mongo is running and bundler has finished, run `bundle exec thin start` from the root Diaspora directory. This will start the app server in development mode[.](http://bit.ly/9mwtUw)
### Run the websocket server
run `bundle exec ruby ./script/websocket_server` to start the websocket server on port 8080. Change the port in config/app_config.yml.
### Logging in
Run `rake db:seed:tom`, then login with user `tom` and password `evankorth`. More details in db/seeds/tom.rb.

View file

@ -26,7 +26,7 @@ class AlbumsController < ApplicationController
end
def destroy
@album = Album.find_by_id params[:id]
@album = current_user.album_by_id params[:id]
@album.destroy
flash[:notice] = "Album #{@album.name} deleted."
respond_with :location => albums_url
@ -41,12 +41,12 @@ class AlbumsController < ApplicationController
end
def edit
@album = Album.find_by_id params[:id]
@album = current_user.album_by_id params[:id]
redirect_to @album unless current_user.owns? @album
end
def update
@album = Album.find_by_id params[:id]
@album = current_user.album_by_id params[:id]
if @album.update_attributes params[:album]
flash[:notice] = "Album #{@album.name} successfully edited."
respond_with @album

View file

@ -7,13 +7,6 @@ class UsersController < ApplicationController
before_filter :authenticate_user!, :except => [:new, :create]
respond_to :html
respond_to :json, :only => :show
def show
@user = User.find_by_id params[:id]
@user_profile = @user.person.profile
respond_with @user
end
def edit
@user = current_user
@ -23,7 +16,7 @@ class UsersController < ApplicationController
end
def update
@user = User.find_by_id params[:id]
@user = current_user
prep_image_url(params[:user])
@user.update_profile params[:user]

View file

@ -89,6 +89,8 @@ class Person
f = Redfinger.finger(identifier)
rescue SocketError => e
raise "Diaspora server for #{identifier} not found" if e.message =~ /Name or service not known/
rescue Errno::ETIMEDOUT => e
raise "Connection timed out to Diaspora server for #{identifier}"
end
raise "No webfinger profile found at #{identifier}" if f.nil? || f.links.empty?
Person.from_webfinger_profile(identifier, f )

View file

@ -34,7 +34,6 @@ class User
many :aspects, :class_name => 'Aspect'
after_create :seed_aspects
before_validation_on_create :downcase_username
@ -239,8 +238,7 @@ class User
Rails.logger.info( "the person id is #{object.post_id} the friend found is #{visible_person_by_id(object.post_id).inspect}")
unfriended_by visible_person_by_id(object.post_id)
else
else
object.perform self.id
aspects = self.aspects_with_person(object.person)
aspects.each{ |aspect| aspect.post_ids.delete(object.post_id.to_id)

View file

@ -39,8 +39,6 @@ backers.each{ |backer|
# Start Nginx
after "deploy:cold" do
run("nginx stop")
run("killall nginx")
#run("nginx")
end

View file

@ -21,8 +21,19 @@ Diaspora::Application.configure do
config.action_controller.perform_caching = false
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false
config.action_mailer.raise_delivery_errors = true
config.active_support.deprecation = :log
config.middleware.use MongoMapper::ClearDevMemory
#config.threadsafe!
config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options = {:host => 'localhost:3000'}
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'mail.joindiaspora.com',
:authentication => 'plain',
:user_name => 'diaspora-pivots@joindiaspora.com',
:password => "xy289|]G+R*-kA",
:enable_starttls_auto => true
}
end

View file

@ -15,12 +15,12 @@ Diaspora::Application.configure do
config.action_controller.perform_caching = true
# Specifies the header that your server uses for sending files
config.action_dispatch.x_sendfile_header = "X-Sendfile"
#config.action_dispatch.x_sendfile_header = "X-Sendfile"
config.active_support.deprecation = :notify
# For nginx:
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
# If you have no front-end server that supports something like X-Sendfile,
# just comment this out and Rails will serve the files
@ -36,7 +36,7 @@ Diaspora::Application.configure do
# Disable Rails's static asset server
# In production, Apache or nginx will already do this
config.serve_static_assets = true
#config.serve_static_assets = true
# Enable serving of images, stylesheets, and javascripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"
@ -44,12 +44,20 @@ Diaspora::Application.configure do
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
config.threadsafe!
config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options = {:host => 'pivots.joindiaspora.com'}
config.action_mailer.smtp_settings = {
:address => 'smtp.gmail.com',
:port => 587,
:domain => 'mail.joindiaspora.com',
:authentication => 'plain',
:user_name => 'diaspora-pivots@joindiaspora.com',
:password => "xy289|]G+R*-kA",
:enable_starttls_auto => true
}
end

View file

@ -6,7 +6,7 @@
Diaspora::Application.routes.draw do
resources :people, :only => [:index, :show, :destroy]
resources :users, :except => [:create, :new]
resources :users, :except => [:create, :new, :show]
resources :status_messages, :only => [:create, :destroy, :show]
resources :comments, :except => [:index]
resources :requests, :except => [:edit, :update]

View file

@ -33,12 +33,14 @@ http {
# gzip_disable "MSIE [1-6]\.(?!.*SV1)";
upstream thin_cluster {
server unix:/tmp/thin.0.sock;
server unix:/tmp/thin.1.sock;
server unix:/tmp/thin.2.sock;
}
server {
listen 80;
server_name babycakes.sofaer.net www.babycakes.sofaer.net;
server_name pivots.joindiaspora.com www.pivots.joindiaspora.com;
root /usr/local/app/diaspora/current;
location / {

View file

@ -13,7 +13,7 @@ require '#{File.dirname(__FILE__)}/packages/server'
require '#{File.dirname(__FILE__)}/packages/scm'
require '#{File.dirname(__FILE__)}/packages/ruby'
policy :diaspora, :roles => [:tom,:backer] do
policy :diaspora, :roles => [:pivots] do
# requires :clean_dreamhost
requires :tools
requires :rubygems

View file

@ -13,7 +13,7 @@ max_conns: 1024
require: []
max_persistent_conns: 512
environment: development
environment: production
servers: 1
daemonize: true
#chdir: /usr/applications/localhash/current

View file

@ -7,6 +7,7 @@
require 'config/environment'
remote_url = "http://tom.joindiaspora.com/"
remote_url = "http://localhost:3000/"
# Create seed user
user = User.instantiate!( :email => "tom@tom.joindiaspora.com",
:username => "tom",

5
script/server Executable file
View file

@ -0,0 +1,5 @@
#!/bin/bash
mkdir -p -v log/thin/
bundle exec ruby ./script/websocket_server.rb&
bundle exec thin start $@

View file

@ -19,6 +19,7 @@ def process_message
end
begin
EM.run {
Diaspora::WebSocket.initialize_channels
@ -35,7 +36,13 @@ end
ws.onclose { Diaspora::WebSocket.unsubscribe(ws.request['Path'].gsub('/',''), sid) }
}
end
puts "Websocket server started."
process_message
}
rescue RuntimeError => e
raise e unless e.message.include?("no acceptor")
puts "Are you sure the websocket server isn't already running?"
puts "Just start thin with bundle exec thin start."
Process.exit
end

View file

@ -36,7 +36,7 @@ end
Factory.define :user do |u|
u.sequence(:username) {|n| "bob#{n}"}
u.sequence(:email) {|n| "bob#{n}@aol.com"}
u.sequence(:email) {|n| "bob#{n}@pivotallabs.com"}
u.password "bluepin7"
u.password_confirmation "bluepin7"
u.person { |a| Factory.create(:person_with_user, :owner_id => a._id)}

View file

@ -9,6 +9,7 @@ describe Diaspora::WebSocket do
@user = Factory.create(:user)
@aspect = @user.aspect(:name => "losers")
@post = @user.build_post(:status_message, :message => "hey", :to => @aspect.id)
unstub_sockets
end
it 'should queue a job' do
@ -16,10 +17,21 @@ describe Diaspora::WebSocket do
@post.socket_to_uid(@user.id, :aspect_ids => @aspect.id)
end
it 'The queued job should reach Magent' do
@post.socket_to_uid(@user.id, :aspect_ids => @aspect.id)
channel = Magent::GenericChannel.new('websocket')
channel.message_count.should == 1
describe 'queuing and dequeuing ' do
before do
@post.socket_to_uid(@user.id, :aspect_ids => @aspect.id)
@channel = Magent::GenericChannel.new('websocket')
end
it 'should send the queued job to Magent' do
@channel.message_count.should == 1
end
it 'should dequeue the job successfully' do
messages = @channel.message_count
@channel.dequeue
@channel.message_count.should == messages -1
end
end
end

View file

@ -2,87 +2,81 @@
# licensed under the Affero General Public License version 3. See
# the COPYRIGHT file.
require File.dirname(__FILE__) + '/../spec_helper'
require 'spec_helper'
describe Album do
before do
@fixture_name = File.dirname(__FILE__) + '/../fixtures/button.png'
@user = Factory.create(:user)
@user.person.save
@aspect = @user.aspect(:name => "Foo")
@album = @user.post(:album, :name => "test collection", :to => @aspect.id)
let(:user) { Factory.create(:user) }
let(:person) { user.person }
let(:aspect) { user.aspect(:name => "Foo") }
let(:album) { user.post(:album, :name => "test collection", :to => aspect.id) }
it 'is valid' do
album.should be_valid
end
it 'should require a name' do
@album.name = "test collection"
@album.valid?.should be true
@album.name = nil
@album.valid?.should be false
it 'validates presence of a name' do
album.name = nil
album.should_not be_valid
end
it 'should contain photos' do
photo = Factory.build(:photo, :person => @user.person)
@album.photos << photo
@album.photos.count.should == 1
it 'has many photos' do
album.associations[:photos].type == :many
end
it 'should remove all photos on album delete' do
photos = []
1.upto 3 do
photo = Photo.new(:person => @user.person, :album => @album, :created_at => Time.now)
photo.image.store! File.open @fixture_name
photos << photo
end
@album.photos += photos
Photo.all.count.should == 3
@album.destroy
Photo.all.count.should == 0
end
describe 'traversing' do
context 'when an album has two attached images' do
before do
@photos = []
1.upto 3 do |n|
photo = Photo.new(:person => @user.person, :album => @album, :created_at => Time.now + n)
photo.image.store! File.open @fixture_name
@photos << photo
2.times do
photo = Factory.build(:photo, :person => person, :album => album)
album.photos << photo
end
@album.photos += @photos
end
it 'should traverse the album correctly' do
#should retrieve the next photo relative to a given photo
@album.next_photo(@photos[1]).id.should == @photos[2].id
#should retrieve the previous photo relative to a given photo
@album.prev_photo(@photos[1]).id.should == @photos[0].id
#wrapping
#does next photo of last to first
@album.next_photo(@photos[2]).id.should == @photos[0].id
#does previous photo of first to last
@album.prev_photo(@photos[0]).id.should == @photos[2].id
context 'when the album is deleted' do
it 'removes all child photos' do
expect{ album.destroy }.to change(Photo, :count).from(2).to(0)
end
end
end
describe 'serialization' do
before do
@xml = @album.to_xml.to_s
context 'traversing photos' do
let(:attrs) { {:person => person, :album => album} }
let!(:photo_1) { Factory(:photo, attrs.merge(:created_at => 2.days.ago)) }
let!(:photo_2) { Factory(:photo, attrs.merge(:created_at => 1.day.ago)) }
let!(:photo_3) { Factory(:photo, attrs.merge(:created_at => Time.now)) }
describe '#next_photo' do
it 'returns the next photo' do
album.next_photo(photo_1).id.should == photo_2.id
end
it 'returns the first photo when given the last photo in the album' do
album.next_photo(photo_3).id.should == photo_1.id
end
end
it 'should have a person' do
@xml.include?(@album.person.id.to_s).should be true
describe '#prev_photo' do
it 'returns the previous photo' do
album.prev_photo(photo_2).id.should == photo_1.id
end
it 'returns the last photo when given the first photo in the album' do
album.prev_photo(photo_1).id.should == photo_3.id
end
end
it 'should have a name' do
@xml.include?(@album.name).should be true
end
describe '#to_xml' do
let(:doc) { album.to_xml }
it 'has a name' do
doc.at_xpath('./name').text.should == album.name
end
it 'should have an id' do
@xml.include?(@album.id.to_s).should be true
it 'has an id' do
doc.at_xpath('./_id').text.should == album.id.to_s
end
it 'includes the person' do
doc.at_xpath('./person/_id').text.should == album.person.id.to_s
end
end
end

View file

@ -19,8 +19,7 @@ describe Request do
person_request.valid?.should be true
end
it 'should generate xml for the User as a Person' do
it 'should generate xml for the User as a Person' do
request = @user.send_friend_request_to Factory.create(:person), @aspect
xml = request.to_xml.to_s

View file

@ -11,6 +11,15 @@ describe User do
@user = Factory.create(:user)
@aspect = @user.aspect(:name => 'heroes')
end
it 'should create with pivotal or allowed emails' do
user1 = Factory.create(:user, :email => "kimfuh@yahoo.com")
user2 = Factory.create(:user, :email => "awesome@sofaer.net")
user3 = Factory.create(:user, :email => "steveellis@pivotallabs.com")
user1.created_at.nil?.should be false
user2.created_at.nil?.should be false
user3.created_at.nil?.should be false
end
describe 'profiles' do
it 'should be able to update their profile and send it to their friends' do

View file

@ -38,6 +38,7 @@ RSpec.configure do |config|
config.before(:each) do
DatabaseCleaner.start
stub_sockets
User.stub!(:allowed_email?).and_return(:true)
end
config.after(:each) do
@ -45,11 +46,17 @@ RSpec.configure do |config|
end
end
def stub_sockets
Diaspora::WebSocket.stub!(:push_to_user).and_return(true)
Diaspora::WebSocket.stub!(:queue_to_user).and_return(true)
Diaspora::WebSocket.stub!(:subscribe).and_return(true)
Diaspora::WebSocket.stub!(:unsubscribe).and_return(true)
end
def unstub_sockets
Diaspora::WebSocket.unstub!(:queue_to_user)
Diaspora::WebSocket.unstub!(:subscribe)
Diaspora::WebSocket.unstub!(:unsubscribe)
end
def stub_signature_verification
(get_models.map{|model| model.camelize.constantize} - [User]).each do |model|
model.any_instance.stubs(:verify_signature).returns(true)