diff --git a/.gitignore b/.gitignore index 89b33da60..571cd38ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,21 @@ .bundle +.DS_Store .idea +.rvmrc *.swap -*.swp *.swo +*.swp *~ -.bundle +bin/* +config/app_config.yml +config/fb_config.yml +config/initializers/secret_token.rb db/*.sqlite3 log/* -tmp/**/* +nbproject gpg/diaspora-development/*.gpg gpg/diaspora-production/*.gpg gpg/*/random_seed public/uploads/* -.rvmrc +public/source.tar +tmp/**/* diff --git a/COPYRIGHT b/COPYRIGHT index c1e5ed876..b150ae948 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1 +1,23 @@ -Diaspora is copyright Diaspora Inc., 2010, and files herein are licensed under the Affero General Public License version 3, the text of which can be found in GNU-AGPL-3.0, unless otherwise noted. Components of Diaspora, including Rails, JQuery, and Devise, are licensed under the MIT/X11 license. Blueprint-CSS is licensed under a modified version of the MIT/X11 license. All unmodified files from these and other sources retain their original copyright and license notices: see the relevant individual files. Attribution information for Diaspora is contained in the AUTHORS file. +Diaspora is copyright Diaspora Inc., 2010, and files herein are licensed +under the Affero General Public License version 3, the text of which can +be found in GNU-AGPL-3.0, or any later version of the AGPL, unless otherwise +noted. Components of Diaspora, including Rails, JQuery, and Devise, are +licensed under the MIT/X11 license. Blueprint-CSS is licensed under a +modified version of the MIT/X11 license. All unmodified files from these +and other sources retain their original copyright and license notices: see +the relevant individual files. Attribution information for Diaspora is +contained in the AUTHORS file. + +In addition, as a special exception, the copyright holders give +permission to link the code of portions of this program with the +OpenSSL library under certain conditions as described in each +individual source file, and distribute linked combinations +including the two. + +You must obey the GNU Affero General Public License V3 or later in all respects +for all of the code used other than OpenSSL or the components mentioned +above. If you modify file(s) with this exception, you may extend this +exception to your version of the file(s), but you are not obligated to +do so. If you do not wish to do so, delete this exception statement from your +version. If you delete this exception statement from all source files in the +program, then also delete it here. diff --git a/Capfile b/Capfile index af77f235a..306a9d64b 100644 --- a/Capfile +++ b/Capfile @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - load 'deploy' if respond_to?(:namespace) # cap2 differentiator Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) } diff --git a/Gemfile b/Gemfile index cc92bec3d..29ad0f73d 100644 --- a/Gemfile +++ b/Gemfile @@ -1,15 +1,13 @@ source 'http://rubygems.org' gem 'rails', '3.0.0' -gem 'bundler', '1.0.0' - +gem 'bundler', '>= 1.0.0' #Security gem 'devise', :git => 'http://github.com/BadMinus/devise.git' #Mongo -gem 'mongo_mapper', '0.8.4', :git => 'http://github.com/jnunemaker/mongomapper.git' -gem 'jnunemaker-validatable', '1.8.4', :git => 'http://github.com/jnunemaker/validatable.git' +gem 'mongo_mapper', :branch => 'rails3', :git => 'http://github.com/jnunemaker/mongomapper.git' gem 'bson_ext', '1.0.7' gem 'bson', '1.0.7' @@ -21,6 +19,7 @@ gem 'will_paginate', '3.0.pre2' gem 'roxml', :git => 'git://github.com/Empact/roxml.git' gem 'addressable', :require => 'addressable/uri' gem 'json' +gem 'mini_fb' #Standards gem 'pubsubhubbub' @@ -40,24 +39,23 @@ gem 'mini_magick' group :test, :development do gem 'factory_girl_rails' + gem 'ruby-debug' if RUBY_VERSION.include? "1.8" end group :test do - gem 'rspec', '>= 2.0.0.beta.17' - gem 'rspec-rails', '2.0.0.beta.17' + gem 'capybara', '~> 0.3.9' + gem 'cucumber-rails', '0.3.2' + gem 'rspec', '>= 2.0.0.beta.17' + gem 'rspec-rails', '2.0.0.beta.17' gem 'mocha' - gem 'webrat', '0.7.2.beta.1' - gem 'redgreen' + gem 'redgreen' if RUBY_VERSION.include? "1.8" gem 'autotest' gem 'database_cleaner' - gem 'saucelabs-adapter', '= 0.8.12' - gem 'selenium-rc' gem 'webmock' end group :development do gem 'nifty-generators' - gem 'ruby-debug' end group :deployment do diff --git a/Gemfile.lock b/Gemfile.lock index dd181b320..44d386e33 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -57,20 +57,14 @@ GIT GIT remote: http://github.com/jnunemaker/mongomapper.git - revision: 931dab779011aa7acf60c1a4c7ad19e1ba838345 + revision: b0eac421ef5b3bee782e15d391eca372a189d414 + branch: rails3 specs: mongo_mapper (0.8.4) - activesupport (>= 2.3.4) - jnunemaker-validatable (~> 1.8.4) + activemodel (~> 3.0.0) + activesupport (~> 3.0.0) plucky (~> 0.3.5) -GIT - remote: http://github.com/jnunemaker/validatable.git - revision: 8d7c3ce14133760e748a0e34b99dfe6ec4d69153 - specs: - jnunemaker-validatable (1.8.4) - activesupport (>= 2.3.4) - GEM remote: http://rubygems.org/ specs: @@ -115,8 +109,24 @@ GEM net-sftp (>= 2.0.0) net-ssh (>= 2.0.14) net-ssh-gateway (>= 1.0.0) + capybara (0.3.9) + culerity (>= 0.2.4) + mime-types (>= 1.16) + nokogiri (>= 1.3.3) + rack (>= 1.0.0) + rack-test (>= 0.5.4) + selenium-webdriver (>= 0.0.3) columnize (0.3.1) crack (0.1.8) + cucumber (0.9.0) + builder (~> 2.1.2) + diff-lcs (~> 1.1.2) + gherkin (~> 2.2.2) + json (~> 1.4.6) + term-ansicolor (~> 1.0.5) + cucumber-rails (0.3.2) + cucumber (>= 0.8.0) + culerity (0.2.12) daemons (1.1.0) database_cleaner (0.5.2) diff-lcs (1.1.2) @@ -130,18 +140,27 @@ GEM factory_girl_rails (1.0) factory_girl (~> 1.3) rails (>= 3.0.0.beta4) + ffi (0.6.3) + rake (>= 0.8.7) + gherkin (2.2.4) + json (~> 1.4.6) + term-ansicolor (~> 1.0.5) + trollop (~> 1.16.2) haml (3.0.18) hashie (0.4.0) highline (1.6.1) i18n (0.4.1) json (1.4.6) + json_pure (1.4.6) linecache (0.43) - lsof (0.3.0) mail (2.2.6.1) activesupport (>= 2.3.6) mime-types treetop (>= 1.4.5) mime-types (1.16) + mini_fb (1.1.3) + hashie + rest-client mini_magick (2.1) subexec (~> 0.0.4) mocha (0.9.8) @@ -203,16 +222,13 @@ GEM ruby-debug-base (~> 0.10.3.0) ruby-debug-base (0.10.3) linecache (>= 0.3) - saucelabs-adapter (0.8.12) - lsof (>= 0.3.0) - net-ssh (>= 2.0.12) - net-ssh-gateway (>= 1.0.1) - rest-client (>= 1.2.0) - selenium-client (>= 1.2.17) - selenium-client (1.2.18) - selenium-rc (2.2.4) - selenium-client (>= 1.2.18) + rubyzip (0.9.4) + selenium-webdriver (0.0.28) + ffi (>= 0.6.1) + json_pure + rubyzip subexec (0.0.4) + term-ansicolor (1.0.5) thin (1.2.7) daemons (>= 1.0.9) eventmachine (>= 0.12.6) @@ -220,6 +236,7 @@ GEM thor (0.14.0) treetop (1.4.8) polyglot (>= 0.3.1) + trollop (1.16.2) tzinfo (0.3.23) uuidtools (2.1.1) warden (0.10.7) @@ -241,20 +258,22 @@ DEPENDENCIES autotest bson (= 1.0.7) bson_ext (= 1.0.7) - bundler (= 1.0.0) + bundler (>= 1.0.0) + capybara (~> 0.3.9) carrierwave! + cucumber-rails (= 0.3.2) database_cleaner devise! em-http-request! em-websocket factory_girl_rails haml - jnunemaker-validatable (= 1.8.4)! json magent! + mini_fb mini_magick mocha - mongo_mapper (= 0.8.4)! + mongo_mapper! nifty-generators pubsubhubbub rails (= 3.0.0) @@ -264,10 +283,7 @@ DEPENDENCIES rspec (>= 2.0.0.beta.17) rspec-rails (= 2.0.0.beta.17) ruby-debug - saucelabs-adapter (= 0.8.12) - selenium-rc sprinkle! thin webmock - webrat (= 0.7.2.beta.1) will_paginate (= 3.0.pre2) diff --git a/README.md b/README.md index 066e4171c..bac9cd40f 100644 --- a/README.md +++ b/README.md @@ -1,241 +1,66 @@ -## Commit Guidlines -You are welcome to contribute, add and extend Diaspora however you see fit. We will do our best to incorporate everything that meets our guidelines. - -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. - -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. - # Diaspora -The privacy aware, personally controlled, do-it-all, open source social network. +The privacy aware, personally controlled, do-it-all, open source social +network. **DISCLAIMER: THIS IS PRE-ALPHA SOFTWARE AND SHOULD BE TREATED ACCORDINGLY.** -**PLEASE, DO NOT RUN IN PRODUCTION. IT IS FUN TO GET RUNNING, BUT EXPECT THINGS TO BE BROKEN** +**PLEASE, DO NOT RUN IN PRODUCTION. IT IS FUN TO GET RUNNING, BUT EXPECT THINGS +TO BE BROKEN** -Also, we really want to continue to focus on features and improving the code base. When we think it is -ready for general use, we will post more detailed instructions. +Initial installation instructions are [here](http://github.com/diaspora/diaspora/wiki/Installing-and-Running-Diaspora). +We are continuing to build features and improve the code base. +When we think it is ready for general use, we will post more final +instructions. +## Commit Guidlines -These instructions are for machines running [Ubuntu](http://www.ubuntu.com/), [Fedora](http://www.fedoraproject.org) or Mac OS X. We are developing Diaspora for the latest and greatest browsers, so please update your Firefox, Chrome or Safari to the latest and greatest. +You are welcome to contribute, add to and extend Diaspora however you see fit. We +will do our best to incorporate everything that meets our guidelines. -## Preparing your system -In order to run Diaspora, you will need to download the following dependencies (specific instructions follow): +Please make your changes on a topic branch in your repo and submit your pull request +from there, so that commits you don't want to submit aren't included. -- Build Tools - Packages needed to compile the components that follow. -- [Ruby](http://www.ruby-lang.org) - The Ruby programming language. (We're using **1.8.7**. It comes preinstalled on Mac OS X.) -- [MongoDB](http://www.mongodb.org) - A snappy noSQL database. -- [OpenSSL](http://www.openssl.org/) - An encryption library. (It comes preinstalled on Mac OS X and Ubuntu.) -- [ImageMagick](http://www.imagemagick.org/) - An Image processing library used to resize uploaded photos. -- [Git](http://git-scm.com/) - The fast version control system. +Please do not rebase our tree into yours. +See [here](http://www.mail-archive.com/dri-devel@lists.sourceforge.net/msg39091.html) +for when to rebase. -After you have Ruby installed on your system, you will need to get RubyGems, then install Bundler: +All commits must be tested, and all your tests should be green +before a pull request is sent. Please write your tests in Rspec. -- [RubyGems](http://rubygems.org/) - Source for Ruby gems. -- [Bundler](http://gembundler.com/) - Gem management tool for Ruby projects. +GEMS: We would like to keep external dependencies unduplicated. We're using +Nokogiri, 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. -**We suggest using a package management system to download these dependencies. Trust us, it's going to make your life a lot easier. If you're using Mac OS X, you can use [homebrew](http://mxcl.github.com/homebrew/); if you're using Ubuntu, just use [Synaptic](http://www.nongnu.org/synaptic/) (it comes pre-installed); if you're using Fedora simply use [yum](http://yum.baseurl.org/). The instructions below assume you have these installed.** - -### Build Tools - -To install build tools on **Ubuntu**, run the following (includes the gcc and xml parsing dependencies): - - sudo apt-get install build-essential libxslt1.1 libxslt1-dev libxml2 - -To install build tools on **Fedora**, run the following: - - sudo yum install libxslt libxslt-devel libxml2 libxml2-devel - -To install build tools on **Mac OS X**, you need to download and install [Xcode](http://developer.apple.com/technologies/tools/xcode.html). - -### Ruby - -To install Ruby 1.8.7 on **Ubuntu**, run the following command: - - sudo apt-get install ruby-full - -Please note that you need to have Universe enabled in your /etc/apt/sources.list file to install ruby using apt-get. - -At this time Fedora does not have Ruby 1.8.7. As a workaround it is possible to use [rvm](http://rvm.beginrescueend.com/) with a locally compiled Ruby installation. A semi automated method for doing this is available. It is highly recommended that you review the script before running it so you understand what will occur. The script can be executed by running the following command: - - ./script/bootstrap-fedora-diaspora.sh - -After reviewing and executing the above script you will need to follow the "MongoDB" section and then you should skip all the way down to "Start Mongo". - - -If you're on **Mac OS X**, you already have Ruby on your system. Yay! - -### MongoDB - -To install MongoDB on **Ubuntu**, add the official MongoDB repository from this link: - -http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages - -For Lucid, add the following line to your /etc/apt/sources.list (for other distros, see http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages): - - deb http://downloads.mongodb.org/distros/ubuntu 10.4 10gen - -And then run: - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 - sudo apt-get update - sudo apt-get install mongodb-stable - -You can also run the binary directly by doing the following: - -If you're running a 32-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.2.tgz`. If you're running a 64-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.2.tgz`. - - # extract - tar xzf mongodb-linux-i686-1.4.0.tgz - # create the required data directory - sudo mkdir -p /data/db - sudo chmod -Rv 777 /data/ - - -To install MongoDB on a x86_64 **Fedora** system, add the official MongoDB repository from MongoDB (http://www.mongodb.org/display/DOCS/CentOS+and+Fedora+Packages) into /etc/yum.repos.d/10gen.repo: - - [10gen] - name=10gen Repository - baseurl=http://downloads.mongodb.org/distros/fedora/13/os/x86_64/ - gpgcheck=0 - enabled=1 - - -Then use yum to install the packages: - - sudo yum install mongo-stable mongo-stable-server - - -If you're running a 32-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.6.2.tgz`. If you're running a 64-bit system, run `wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.6.2.tgz`. - - # extract - tar xzf mongodb-linux-i686-1.4.0.tgz - # create the required data directory - sudo mkdir -p /data/db - sudo chmod -Rv 777 /data/ - - -To install MongoDB on **Mac OS X**, run the following: - - brew install mongo - sudo mkdir -p /data/db - sudo chmod -Rv 777 /data/ - -### OpenSSL - -If you're running either **Ubuntu**, **Fedora** or **Mac OS X** you already have OpenSSL installed! - -### ImageMagick - -To install ImageMagick on **Ubuntu**, run the following: - - sudo apt-get install imagemagick libmagick9-dev - -To install ImageMagick on **Fedora**, run the following: - - sudo yum install ImageMagick - -To install ImageMagick on **Mac OS X**, run the following: - - brew install imagemagick - -### Git - -To install Git on **Ubuntu**, run the following: - - sudo apt-get install git-core - -To install Git on **Fedora**, run the following: - - sudo yum install git - - -To install Git on **Mac OS X**, run the following: - - brew install git - - -### Rubygems - -On **Ubuntu** 10.04, run the following: - - sudo add-apt-repository ppa:maco.m/ruby - sudo apt-get update - sudo apt-get install rubygems - -This PPA is maintained by an Ubuntu Developer. For Ubuntu 10.10, this version of rubygems is in the repositories. - -On **Fedora**, run the following: - - sudo yum install rubygems - -On **Mac OS X**, RubyGems comes preinstalled; however, you might need to update it for use with the latest Bundler. To update RubyGems, run `sudo gem update --system`. - - -### Bundler - -After RubyGems is updated, simply run `sudo gem install bundler` to get Bundler. If you're using Ubuntu repository .debs, bundler is found at /var/lib/gems/1.8/bin/bundle - - -## Getting Diaspora - - git clone http://github.com/diaspora/diaspora.git - -If you have never used github before, their [help desk](http://help.github.com/) has a pretty awesome guide on getting setup. - - -## Running Diaspora - -### Install required gems -To start the app server for the first time, you need to use Bundler to install Diaspora's gem depencencies. Run `bundle install` from Diaspora's root directory. Bundler will also warn you if there is a new dependency and you need to bundle install again. - -### Start Mongo -If you installed the Ubuntu package, MongoDB should already be running (if not, run `service mongodb start`). If you installed the binary manually, run `sudo mongod` from where mongo is installed to start mongo. - -If you installed the Fedora package, MongoDB will need to be started via `service mongodb start`. If you installed the binary manually, run `sudo mongod` from where mongo is installed to start mongo. - -If you installed the OsX package through "brew", MongoDB will need to be started via `sudo launchctl load /Library/LaunchDaemons/org.mongodb.mongod.plist`. (before you have to go to /Library/LaunchDaemons and add a symlink to /usr/local/Cellar/mongodb/1.6.2-x86_64/org.mongodb.mongod.plist) - -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. - - -### Testing -Diaspora's test suite uses [rspec](http://rspec.info/), a behavior driven testing framework. In order to run the tests, run `bundle exec rspec spec`. +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). ## Resources -We are maintaining a [public tracker project](http://www.pivotaltracker.com/projects/61641) and a [roadmap](https://github.com/diaspora/diaspora/wiki/Roadmap). Also, you can file [bug reports](https://github.com/diaspora/diaspora/issues) right here on github. +We are maintaining a +[public tracker project](http://www.pivotaltracker.com/projects/61641) +and a +[roadmap](https://github.com/diaspora/diaspora/wiki/Roadmap). Also, you can +file [bug reports](https://github.com/diaspora/diaspora/issues) right here on +github. Ongoing discussion: + - [Diaspora Developer Google Group](http://groups.google.com/group/diaspora-dev) - [Diaspora Discussion Google Group](http://groups.google.com/group/diaspora-discuss) - [Diaspora Q&A site](http://diaspora.shapado.com/) -- [#diaspora-dev](irc://irc.freenode.net/#diaspora-dev) +- [#diaspora-dev IRC channel](irc://irc.freenode.net/#diaspora-dev) + ([join via the web client](http://webchat.freenode.net?channels=diaspora-dev)) -More general info and updates about the project can be found on our [blog](http://joindiaspora.com), [twitter](http://twitter.com/joindiaspora). Also, be sure to join the official [mailing list](http://http://eepurl.com/Vebk). - -If you wish to contact us privately about any exploits in Diaspora you may find, you can email [exploits@joindiaspora.com](mailto:exploits@joindiaspora.com). - - -## License -Copyright 2010 Diaspora Inc. - -Diaspora is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - -Diaspora is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License along with Diaspora. If not, see . +More general info and updates about the project can be found on: +[Our blog](http://joindiaspora.com), +[and on Twitter](http://twitter.com/joindiaspora). +Also, be sure to join the official [mailing list](http://eepurl.com/Vebk). +If you wish to contact us privately about any exploits in Diaspora you may +find, you can email +[exploits@joindiaspora.com](mailto:exploits@joindiaspora.com). diff --git a/Rakefile b/Rakefile index c9b50786e..fa9be254a 100644 --- a/Rakefile +++ b/Rakefile @@ -2,12 +2,11 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) require 'rake' ENV['GNUPGHOME'] = File.expand_path("../../gpg/diaspora-#{Rails.env}/", __FILE__) + Diaspora::Application.load_tasks diff --git a/app/controllers/albums_controller.rb b/app/controllers/albums_controller.rb index dbd59c64e..9e4859830 100644 --- a/app/controllers/albums_controller.rb +++ b/app/controllers/albums_controller.rb @@ -15,9 +15,12 @@ class AlbumsController < ApplicationController end def create - aspect = params[:album][:to] - @album = current_user.post(:album, params[:album]) - flash[:notice] = "You've created an album called #{@album.name}." + aspect = params[:album][:to] + + data = clean_hash(params[:album]) + + @album = current_user.post(:album, data) + flash[:notice] = I18n.t 'albums.create.success', :name => @album.name redirect_to :action => :show, :id => @album.id, :aspect => aspect end @@ -26,34 +29,43 @@ class AlbumsController < ApplicationController end def destroy - @album = current_user.album_by_id params[:id] + @album = current_user.find_visible_post_by_id params[:id] @album.destroy - flash[:notice] = "Album #{@album.name} deleted." + flash[:notice] = I18n.t 'albums.destroy.success', :name => @album.name respond_with :location => albums_url end def show @photo = Photo.new - @album = Album.find_by_id params[:id] + @album = current_user.find_visible_post_by_id( params[:id] ) @album_photos = @album.photos - respond_with @album end def edit - @album = current_user.album_by_id params[:id] + @album = current_user.find_visible_post_by_id params[:id] redirect_to @album unless current_user.owns? @album end def update - @album = current_user.album_by_id params[:id] - if @album.update_attributes params[:album] - flash[:notice] = "Album #{@album.name} successfully edited." + @album = current_user.find_visible_post_by_id params[:id] + + data = clean_hash(params[:album]) + + if current_user.update_post( @album, data ) + flash[:notice] = I18n.t 'albums.update.success', :name => @album.name respond_with @album else - flash[:error] = "Failed to edit album #{@album.name}." + flash[:error] = I18n.t 'albums.update.failure', :name => @album.name render :action => :edit end end + private + def clean_hash(params) + return { + :name => params[:name], + :to => params[:to] + } + end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f0ca5bfc8..52975730b 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -2,13 +2,13 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class ApplicationController < ActionController::Base protect_from_forgery :except => :receive before_filter :set_friends_and_status, :except => [:create, :update] before_filter :count_requests + before_filter :fb_user_info layout :layout_by_resource @@ -22,7 +22,9 @@ class ApplicationController < ActionController::Base def set_friends_and_status if current_user - if params[:aspect] == nil || params[:aspect] == 'all' + if params[:action] == 'public' + @aspect = :public + elsif params[:aspect] == nil || params[:aspect] == 'all' @aspect = :all else @aspect = current_user.aspect_by_id( params[:aspect]) @@ -37,4 +39,11 @@ class ApplicationController < ActionController::Base @request_count = Request.for_user(current_user).size if current_user end + def fb_user_info + if current_user + @access_token = warden.session[:access_token] + @logged_in = @access_token.present? + end + end + end diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb index ab144ad12..81056ef10 100644 --- a/app/controllers/aspects_controller.rb +++ b/app/controllers/aspects_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class AspectsController < ApplicationController before_filter :authenticate_user! @@ -15,8 +14,12 @@ class AspectsController < ApplicationController end def create - @aspect = current_user.aspect params[:aspect] - flash[:notice] = "Click on the plus on the left side to tell Diaspora who can see your new aspect." + @aspect = current_user.aspect(params[:aspect]) + if @aspect.valid? + flash[:notice] = I18n.t('aspects.create.success') + else + flash[:error] = I18n.t('aspects.create.failure') + end respond_with :location => aspects_manage_path end @@ -25,11 +28,11 @@ class AspectsController < ApplicationController end def destroy - @aspect = Aspect.find_by_id params[:id] + @aspect = current_user.aspect_by_id params[:id] begin current_user.drop_aspect @aspect - flash[:notice] = "#{@aspect.name} was successfully removed." + flash[:notice] = I18n.t 'aspects.destroy.success',:name => @aspect.name rescue RuntimeError => e flash[:error] = e.message end @@ -38,22 +41,33 @@ class AspectsController < ApplicationController end def show - @aspect = Aspect.find_by_id params[:id] + @aspect = current_user.aspect_by_id params[:id] @friends = @aspect.people @posts = current_user.visible_posts( :by_members_of => @aspect ).paginate :per_page => 15, :order => 'created_at DESC' respond_with @aspect end + def public + # @fb_access_url = MiniFB.oauth_url(FB_APP_ID, APP_CONFIG[:pod_url] + "services/create", + # :scope=>MiniFB.scopes.join(",")) + + @posts = current_user.visible_posts(:person_id => current_user.person.id, :public => true).paginate :page => params[:page], :per_page => 15, :order => 'created_at DESC' + + respond_with @aspect + end + def manage @aspect = :manage @remote_requests = Request.for_user(current_user).all end def update - @aspect = Aspect.find_by_id(params[:id]) - @aspect.update_attributes(params[:aspect]) - flash[:notice] = "Your aspect, #{@aspect.name}, has been successfully edited." + @aspect = current_user.aspect_by_id(params[:id]) + + data = clean_hash(params[:aspect]) + @aspect.update_attributes( data ) + flash[:notice] = I18n.t 'aspects.update.success',:name => @aspect.name respond_with @aspect end @@ -61,26 +75,34 @@ class AspectsController < ApplicationController params[:moves].each{ |move| move = move[1] unless current_user.move_friend(move) - flash[:error] = "Aspect editing failed for friend #{Person.find_by_id( move[:friend_id] ).real_name}." - redirect_to Aspect.first, :action => "edit" + flash[:error] = I18n.t 'aspects.move_friends.failure', :real_name => Person.find_by_id( move[:friend_id] ).real_name + redirect_to aspects_manage_path return end } - flash[:notice] = "Aspects edited successfully." - redirect_to Aspect.first, :action => "edit" + flash[:notice] = I18n.t 'aspects.move_friends.success' + redirect_to aspects_manage_path end def move_friend unless current_user.move_friend( :friend_id => params[:friend_id], :from => params[:from], :to => params[:to][:to]) - flash[:error] = "didn't work #{params.inspect}" + flash[:error] = I18n.t 'aspects.move_friend.error',:inspect => params.inspect end - if aspect = Aspect.first(:id => params[:to][:to]) - flash[:notice] = "You are now showing your friend a different aspect of yourself." - respond_with aspect + if aspect = current_user.aspect_by_id(params[:to][:to]) + flash[:notice] = I18n.t 'aspects.move_friend.success' + render :nothing => true else - flash[:notice] = "You are now showing your friend a different aspect of yourself." - respond_with Person.first(:id => params[:friend_id]) + flash[:notice] = I18n.t 'aspects.move_friend.failure' + render aspects_manage_path end end + + private + def clean_hash(params) + return { + :name => params[:name] + } + end + end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index dc115ab5b..d1efc3e10 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class CommentsController < ApplicationController before_filter :authenticate_user! @@ -10,16 +9,11 @@ class CommentsController < ApplicationController respond_to :json, :only => :show def create - target = Post.find_by_id params[:comment][:post_id] + target = current_user.find_visible_post_by_id params[:comment][:post_id] text = params[:comment][:text] @comment = current_user.comment text, :on => target render :nothing => true end - def show - @comment = Comment.find_by_id params[:id] - respond_with @comment - end - end diff --git a/app/controllers/dev_utilities_controller.rb b/app/controllers/dev_utilities_controller.rb index bcb0dd4f7..e8a40a4c2 100644 --- a/app/controllers/dev_utilities_controller.rb +++ b/app/controllers/dev_utilities_controller.rb @@ -2,29 +2,10 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class DevUtilitiesController < ApplicationController before_filter :authenticate_user!, :except => [:set_backer_number] include ApplicationHelper include RequestsHelper -def warzombie - render :nothing => true - if current_user.email == "tom@tom.joindiaspora.com" && StatusMessage.where(:message => "There's a bomb in the lasagna!?").first == nil - current_user.post(:status_message, :message => "There's a bomb in the lasagna!?") - current_user.post(:status_message, :message => "xkcd \nhttp://xkcd.com/743/" ) - current_user.post(:status_message, :message => "I switched to Motoroi today, a Motorola Android-based phone, in Korea. Now, I am using Android phones in both the U.S. and Korea", :created_at => Time.now-930) - current_user.post(:status_message, :message => "I had 5 hours to study for it :-( GREs on Thursday. Wunderbar.", :created_at => Time.now-43990) - current_user.post(:status_message, :message => "Spotted in toy story 3: google maps, OSX, and windows XP. Two out of three isn't bad.", :created_at => Time.now-4390) - current_user.post(:status_message, :message => "Reddit\nhttp://reddit.com", :created_at => Time.now-54390) - current_user.post(:status_message, :message => "Commercials for IE make me SO MAD and my friends just don't get why.", :created_at => Time.now-30900) - current_user.post(:status_message, :message => "Zombo.com\nhttp://zombo.com", :created_at => Time.now-9090) - current_user.post(:status_message, :message => "Why do I have \"No More Heroes\" by Westlife on repeat all day?", :created_at => Time.now-590000) - current_user.post(:status_message, :message => "Mmm. Friday night. Acknowledged.", :created_at => Time.now-503900) - current_user.post(:status_message, :message => "Getting a universal remote is the epitome of laziness, I do declare.", :created_at => Time.now-4400) - current_user.post(:status_message, :message => "Does anyone know how to merge two Skype contact entries of the same person? (i.e. one Skype ID and one mobile number)", :created_at => Time.now-400239) - current_user.post(:status_message, :message => "A cool, cool morning for once.", :created_at => Time.now-150000) - end - end def zombiefriends render :nothing => true @@ -34,7 +15,7 @@ def warzombie bkr_info.each do |backer| backer_email = "#{backer['username']}@#{backer['username']}.joindiaspora.com" rel_hash = relationship_flow(backer_email) - logger.info "Zombefriending #{backer['given_name']} #{backer['family_name']}" + logger.info "Zombiefriending #{backer['given_name']} #{backer['family_name']}" logger.info "Calling send_friend_request with #{rel_hash[:friend]} and #{current_user.aspects.first}" current_user.send_friend_request_to(rel_hash[:friend], current_user.aspects.first) end @@ -48,11 +29,6 @@ def warzombie } end - def backer_info - config = YAML.load_file(File.dirname(__FILE__) + '/../../config/deploy_config.yml') - config['servers']['backer'] - end - def set_backer_number render :nothing => true seed_num_hash = {:seed_number => params[:number]} @@ -62,7 +38,6 @@ def warzombie end def set_profile_photo - render :nothing => true album = Album.create(:person => current_user.person, :name => "Profile Photos") current_user.raw_visible_posts << album @@ -71,7 +46,7 @@ def warzombie backer_number = YAML.load_file(Rails.root.join('config','backer_number.yml'))[:seed_number].to_i username = backer_info[backer_number]['username'].gsub(/ /,'').downcase - @fixture_name = File.dirname(__FILE__) + "/../../public/images/user/#{username}.jpg" + @fixture_name = File.join(File.dirname(__FILE__), "..", "..", "public", "images", "user", "#{username}.jpg") photo = Photo.new(:person => current_user.person, :album => album) photo.image.store! File.open(@fixture_name) @@ -81,7 +56,6 @@ def warzombie current_user.raw_visible_posts << photo current_user.save - current_user.update_profile(:image_url => photo.url(:thumb_medium)) current_user.save end @@ -91,4 +65,11 @@ def warzombie render "shared/log" end + + protected + + def backer_info + config = YAML.load_file(File.join(File.dirname(__FILE__), "..", "..", "config", "deploy_config.yml")) + config['servers']['backer'] + end end diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb index d85c67691..be1f89991 100644 --- a/app/controllers/people_controller.rb +++ b/app/controllers/people_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class PeopleController < ApplicationController before_filter :authenticate_user! @@ -22,7 +21,7 @@ class PeopleController < ApplicationController @profile = @person.profile @aspects_with_person = current_user.aspects_with_person(@person) @aspects_dropdown_array = current_user.aspects.collect{|x| [x.to_s, x.id]} - @posts = current_user.visible_posts_from_others(:from => @person).paginate :page => params[:page], :order => 'created_at DESC' + @posts = current_user.visible_posts(:person_id => @person.id).paginate :page => params[:page], :order => 'created_at DESC' @latest_status_message = current_user.raw_visible_posts.find_all_by__type_and_person_id("StatusMessage", params[:id]).last @post_count = @posts.count respond_with @person diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb index cefc8f5d6..dca510374 100644 --- a/app/controllers/photos_controller.rb +++ b/app/controllers/photos_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class PhotosController < ApplicationController before_filter :authenticate_user! @@ -10,8 +9,7 @@ class PhotosController < ApplicationController respond_to :json, :only => :show def create - - album = Album.find_by_id params[:album_id] + album = current_user.find_visible_post_by_id( params[:album_id] ) begin @@ -21,9 +19,15 @@ class PhotosController < ApplicationController # get file content type att_content_type = (request.content_type.to_s == "") ? "application/octet-stream" : request.content_type.to_s # create temporal file - file = Tempfile.new(file_name) + begin + file = Tempfile.new(file_name, {:encoding => 'BINARY'}) + file.print request.raw_post.force_encoding('BINARY') + rescue RuntimeError => e + raise e unless e.message.include?('cannot generate tempfile') + file = Tempfile.new(file_name) # Ruby 1.8 compatibility + file.print request.raw_post + end # put data into this file from raw post request - file.print request.raw_post # create several required methods for this temporal file Tempfile.send(:define_method, "content_type") {return att_content_type} @@ -31,24 +35,26 @@ class PhotosController < ApplicationController ############## - params[:user_file] = file - @photo = current_user.post(:photo, params) + + data = clean_hash(params) + + @photo = current_user.post(:photo, data) respond_to do |format| format.json{render(:layout => false , :json => {"success" => true, "data" => @photo}.to_json )} end rescue TypeError - message = "Photo upload failed. Are you sure an image was added?" + message = I18n.t 'photos.create.type_error' respond_with :location => album, :error => message rescue CarrierWave::IntegrityError - message = "Photo upload failed. Are you sure that was an image?" + message = I18n.t 'photos.create.integrity_error' respond_with :location => album, :error => message rescue RuntimeError => e - message = "Photo upload failed. Are you sure that your seatbelt is fastened?" + message = I18n.t 'photos.create.runtime_error' respond_with :location => album, :error => message raise e end @@ -61,34 +67,54 @@ class PhotosController < ApplicationController end def destroy - @photo = Photo.find_by_id params[:id] + @photo = current_user.find_visible_post_by_id params[:id] + @photo.destroy - flash[:notice] = "Photo deleted." + flash[:notice] = I18n.t 'photos.destroy.notice' respond_with :location => @photo.album end def show - @photo = Photo.find_by_id params[:id] + @photo = current_user.find_visible_post_by_id params[:id] @album = @photo.album - respond_with @photo, @album end def edit - @photo = Photo.find_by_id params[:id] + @photo = current_user.find_visible_post_by_id params[:id] @album = @photo.album redirect_to @photo unless current_user.owns? @album end def update - @photo = Photo.find_by_id params[:id] - if @photo.update_attributes params[:photo] - flash[:notice] = "Photo successfully updated." + @photo = current_user.find_visible_post_by_id params[:id] + + data = clean_hash(params) + + if current_user.update_post( @photo, data[:photo] ) + flash[:notice] = I18n.t 'photos.update.notice' respond_with @photo else - flash[:error] = "Failed to edit photo." + flash[:error] = I18n.t 'photos.update.error' render :action => :edit end end + + private + def clean_hash(params) + if params[:photo] + return { + :photo => { + :caption => params[:photo][:caption], + } + } + else + return{ + :album_id => params[:album_id], + :user_file => params[:user_file] + } + end + end + end diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb index 6f2b09c43..f57b94540 100644 --- a/app/controllers/publics_controller.rb +++ b/app/controllers/publics_controller.rb @@ -2,15 +2,14 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class PublicsController < ApplicationController - require 'lib/diaspora/parser' + require File.expand_path('../../../lib/diaspora/parser', __FILE__) include Diaspora::Parser + layout false def hcard @person = Person.find_by_id params[:id] - puts @person unless @person.nil? || @person.owner.nil? render 'hcard' end @@ -21,7 +20,7 @@ class PublicsController < ApplicationController end def webfinger - @person = Person.by_webfinger(params[:q], :local => true) + @person = Person.by_webfinger(params[:q], :local => true) if params[:q] unless @person.nil? || @person.owner.nil? render 'webfinger', :content_type => 'application/xrd+xml' else @@ -29,13 +28,20 @@ class PublicsController < ApplicationController end end + def hub + if params['hub.mode'] == 'subscribe' || params['hub.mode'] == 'unsubscribe' + render :text => params['hub.challenge'], :status => 202, :layout => false + end + end + def receive render :nothing => true return unless params[:xml] begin - @user = Person.first(:id => params[:id]).owner + person = Person.first(:id => params[:id]) + @user = person.owner rescue NoMethodError => e - Rails.logger.error("Received post #{params[:xml]} for nonexistent person #{params[:id]}") + Rails.logger.error("Received post for nonexistent person #{params[:id]}") return end @user.receive_salmon params[:xml] diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 8241aa294..b630c6617 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -15,9 +15,7 @@ class RegistrationsController < Devise::RegistrationsController flash[:error] = e.message end if user - #set_flash_message :notice, :signed_up - flash[:notice] = "You've joined Diaspora!" - #redirect_to root_url + flash[:notice] = I18n.t 'registrations.create.success' sign_in_and_redirect(:user, user) else redirect_to new_user_registration_path diff --git a/app/controllers/requests_controller.rb b/app/controllers/requests_controller.rb index 6087ebe85..31c6e6efd 100644 --- a/app/controllers/requests_controller.rb +++ b/app/controllers/requests_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class RequestsController < ApplicationController before_filter :authenticate_user! include RequestsHelper @@ -13,15 +12,15 @@ class RequestsController < ApplicationController if params[:accept] if params[:aspect_id] @friend = current_user.accept_and_respond( params[:id], params[:aspect_id]) - flash[:notice] = "You are now friends." + flash[:notice] = I18n.t 'requests.destroy.success' respond_with :location => current_user.aspect_by_id(params[:aspect_id]) else - flash[:error] = "Please select an aspect!" + flash[:error] = I18n.t 'requests.destroy.error' respond_with :location => requests_url end else current_user.ignore_friend_request params[:id] - flash[:notice] = "Ignored friend request." + flash[:notice] = I18n.t 'requests.destroy.ignore' respond_with :location => requests_url end end @@ -37,27 +36,28 @@ class RequestsController < ApplicationController rel_hash = relationship_flow(params[:request][:destination_url]) rescue Exception => e raise e unless e.message.include? "not found" - flash[:error] = "No diaspora seed found with this email!" + flash[:error] = I18n.t 'requests.create.error' respond_with :location => aspect return end + # rel_hash = {:friend => params[:friend_handle]} Rails.logger.debug("Sending request: #{rel_hash}") begin @request = current_user.send_friend_request_to(rel_hash[:friend], aspect) rescue Exception => e - raise e unless e.message.include? "already friends" - flash[:notice] = "You are already friends with #{params[:request][:destination_url]}!" + raise e unless e.message.include? "already" + flash[:notice] = I18n.t 'requests.create.already_friends', :destination_url => params[:request][:destination_url] respond_with :location => aspect return end if @request - flash[:notice] = "A friend request was sent to #{@request.destination_url}." + flash[:notice] = I18n.t 'requests.create.success',:destination_url => @request.destination_url respond_with :location => aspect else - flash[:error] = "Something went horribly wrong." + flash[:error] = I18n.t 'requests.create.horribly_wrong' respond_with :location => aspect end end diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb new file mode 100644 index 000000000..82a58c508 --- /dev/null +++ b/app/controllers/services_controller.rb @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + + +class ServicesController < ApplicationController + + def create + puts 'services/create' + p params + + code = params['code'] # Facebooks verification string + if code + access_token_hash = MiniFB.oauth_access_token(FB_APP_ID, APP_CONFIG[:pod_url] + "services/create", FB_SECRET, code) + p access_token_hash + @access_token = access_token_hash["access_token"] + + # TODO: This is where you'd want to store the token in your database + # but for now, we'll just keep it in the session so we don't need a database + warden.session[:access_token] = @access_token + flash[:success] = "Authentication successful." + end + redirect_to edit_user_url current_user + end + + def destroy + warden.session[:access_token] = nil + warden.session[:user_id] = nil + redirect_to edit_user_url current_user + end + + def fb_post + id = 'me' + type = 'feed' + + @res = MiniFB.post(@access_token, id, :type=>type, :metadata=>true, :params=>params) + redirect_to edit_user_url current_user + end + +end diff --git a/app/controllers/sockets_controller.rb b/app/controllers/sockets_controller.rb index 9b90ea831..88d8e6b40 100644 --- a/app/controllers/sockets_controller.rb +++ b/app/controllers/sockets_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class SocketsController < ApplicationController include ApplicationHelper include SocketsHelper diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb index 5a588fb99..137dd8a7e 100644 --- a/app/controllers/status_messages_controller.rb +++ b/app/controllers/status_messages_controller.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class StatusMessagesController < ApplicationController before_filter :authenticate_user! @@ -11,18 +10,39 @@ class StatusMessagesController < ApplicationController def create params[:status_message][:to] = params[:aspect_ids] - @status_message = current_user.post(:status_message, params[:status_message]) - respond_with @status_message + + data = clean_hash params[:status_message] + + if @logged_in && params[:status_message][:public] == 'true' + id = 'me' + type = 'feed' + + Rails.logger.info("Sending a message: #{params[:status_message][:message]} to Facebook") + @res = MiniFB.post(@access_token, id, :type=>type, + :metadata=>true, :params=>{:message => params[:status_message][:message]}) + end + + @status_message = current_user.post(:status_message, data) + render :nothing => true end def destroy - @status_message = StatusMessage.find_by_id params[:id] + @status_message = current_user.find_visible_post_by_id params[:id] @status_message.destroy respond_with :location => root_url end def show - @status_message = StatusMessage.find_by_id params[:id] + @status_message = current_user.find_visible_post_by_id params[:id] respond_with @status_message end + + private + def clean_hash(params) + return { + :message => params[:message], + :to => params[:to], + :public => params[:public] + } + end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 72666bc30..9b41b1fc9 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -2,34 +2,83 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class UsersController < ApplicationController - before_filter :authenticate_user!, :except => [:new, :create] + require File.expand_path('../../../lib/diaspora/ostatus_builder', __FILE__) + + before_filter :authenticate_user!, :except => [:new, :create, :public] respond_to :html def edit @user = current_user @person = @user.person - @profile = @user.profile - @photos = Photo.find_all_by_person_id(@person.id).paginate :page => params[:page], :order => 'created_at DESC' + @profile = @user.person.profile + @photos = current_user.visible_posts(:person_id => current_user.person.id, :_type => 'Photo').paginate :page => params[:page], :order => 'created_at DESC' + + @fb_access_url = MiniFB.oauth_url(FB_APP_ID, APP_CONFIG[:pod_url] + "services/create", + :scope=>MiniFB.scopes.join(",")) end def update @user = current_user - prep_image_url(params[:user]) + data = clean_hash params[:user] + prep_image_url(data) - @user.update_profile params[:user] - respond_with(@user, :location => root_url) + + params[:user].delete(:password) if params[:user][:password].blank? + params[:user].delete(:password_confirmation) if params[:user][:password].blank? and params[:user][:password_confirmation].blank? + + if params[:user][:password] && params[:user][:password_confirmation] + if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation]) + flash[:notice] = "Password Changed" + else + flash[:error] = "Password Change Failed" + end + + end + + @user.update_profile data + redirect_to edit_user_path(@user) + + end + + def public + user = User.find_by_username(params[:username]) + + if user + director = Diaspora::Director.new + ostatus_builder = Diaspora::OstatusBuilder.new(user) + + render :xml => director.build(ostatus_builder), :content_type => 'application/atom+xml' + else + flash[:error] = "User #{params[:username]} does not exist!" + redirect_to root_url + end end private - def prep_image_url(params) + url = APP_CONFIG[:pod_url].chop if APP_CONFIG[:pod_url][-1,1] == '/' if params[:profile][:image_url].empty? params[:profile].delete(:image_url) else - params[:profile][:image_url] = "http://" + request.host + ":" + request.port.to_s + params[:profile][:image_url] + if /^http:\/\// =~ params[:profile][:image_url] + params[:profile][:image_url] = params[:profile][:image_url] + else + params[:profile][:image_url] = url + params[:profile][:image_url] + end end end + + def clean_hash(params) + return { + :profile => + { + :first_name => params[:profile][:first_name], + :last_name => params[:profile][:last_name], + :image_url => params[:profile][:image_url] + } + } + end + end diff --git a/app/helpers/albums_helper.rb b/app/helpers/albums_helper.rb index 50b7fbaf7..6d85c747c 100644 --- a/app/helpers/albums_helper.rb +++ b/app/helpers/albums_helper.rb @@ -2,21 +2,20 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module AlbumsHelper def friends_albums_link if params[:friends] - "Friends Albums" + I18n.t('albums.helper.friends_albums') else - link_to 'Friends Albums', albums_path({:friends => true}) + link_to I18n.t('albums.helper.friends_albums'), albums_path({:friends => true}) end end def your_albums_link if params[:friends] - link_to 'Your Albums', albums_path + link_to I18n.t('albums.helper.your_albums'), albums_path else - 'Your Albums' + I18n.t('albums.helper.your_albums') end end end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f2a0a95fd..7745ace96 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module ApplicationHelper - def current_aspect?(aspect) !@aspect.is_a?(Symbol) && @aspect.id == aspect.id end @@ -28,7 +26,7 @@ module ApplicationHelper end def how_long_ago(obj) - "#{time_ago_in_words(obj.created_at)} ago." + "#{time_ago_in_words(obj.created_at)} ago" end def person_url(person) @@ -38,16 +36,16 @@ module ApplicationHelper when "Person" person_path(person) else - "unknown person" + I18n.t('application.helper.unknown_person') end end def owner_image_tag - person_image_tag(current_user) + person_image_tag(current_user.person) end def owner_image_link - person_image_link(current_user) + person_image_link(current_user.person) end def person_image_tag(person) @@ -62,11 +60,15 @@ module ApplicationHelper end def new_request(request_count) - "new_requests" if request_count > 0 + I18n.t('application.helper.new_requests') if request_count > 0 end def post_yield_tag(post) (':' + post.id.to_s).to_sym end + def connected_fb_as token + response_hash = MiniFB.get(token, 'me') + "Connected to facebook as #{response_hash[:name]}" + end end diff --git a/app/helpers/aspects_helper.rb b/app/helpers/aspects_helper.rb index 1c8f69b8a..66baffca2 100644 --- a/app/helpers/aspects_helper.rb +++ b/app/helpers/aspects_helper.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module AspectsHelper def link_for_aspect( aspect ) link_to aspect.name, aspect @@ -10,9 +9,9 @@ module AspectsHelper def remove_link( aspect ) if aspect.people.size == 0 - link_to "remove", aspect, :method => :delete + link_to I18n.t('aspects.helper.remove'), aspect, :method => :delete else - "remove" + "#{I18n.t('aspects.helper.remove')}" end end end diff --git a/app/helpers/dashboards_helper.rb b/app/helpers/dashboards_helper.rb index 542d938ee..e8a9d8f71 100644 --- a/app/helpers/dashboards_helper.rb +++ b/app/helpers/dashboards_helper.rb @@ -2,10 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module DashboardsHelper - def title_for_page - 'home' + I18n.t('dashboards.helper.home') end end diff --git a/app/helpers/error_messages_helper.rb b/app/helpers/error_messages_helper.rb index 699070b70..9a64dca36 100644 --- a/app/helpers/error_messages_helper.rb +++ b/app/helpers/error_messages_helper.rb @@ -2,13 +2,12 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module ErrorMessagesHelper # Render error messages for the given objects. The :message and :header_message options are allowed. def error_messages_for(*objects) options = objects.extract_options! - options[:header_message] ||= "Invalid Fields" - options[:message] ||= "Correct the following errors and try again." + options[:header_message] ||= I18n.t('error_messages.helper.invalid_fields') + options[:message] ||= I18n.t('error_messages.helper.correct_the_following_errors_and_try_again') messages = objects.compact.map { |o| o.errors.full_messages }.flatten unless messages.empty? content_tag(:div, :class => "error_messages") do diff --git a/app/helpers/layout_helper.rb b/app/helpers/layout_helper.rb index 2398771a3..e33556c35 100644 --- a/app/helpers/layout_helper.rb +++ b/app/helpers/layout_helper.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # These helper methods can be called in your template to set variables to be used in the layout # This module should be included in all views globally, # to do so you may need to add this line to your ApplicationController diff --git a/app/helpers/people_helper.rb b/app/helpers/people_helper.rb index 37d18d20f..f1fa6487f 100644 --- a/app/helpers/people_helper.rb +++ b/app/helpers/people_helper.rb @@ -2,14 +2,13 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module PeopleHelper def search_or_index if params[:q] - " results for #{params[:q]}" + I18n.t 'people.helper.results_for',:params => params[:q] else - " people on pod is aware of" + I18n.t "people.helper.people_on_pod_are_aware_of" end end diff --git a/app/helpers/photos_helper.rb b/app/helpers/photos_helper.rb index 2d0ddad6e..1f52daa0c 100644 --- a/app/helpers/photos_helper.rb +++ b/app/helpers/photos_helper.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module PhotosHelper - def linked_scaled_photo(photo, album) link_to (image_tag photo.url(:scaled_full)), photo_path(album.next_photo(photo)), :rel => "prefetch" end diff --git a/app/helpers/publics_helper.rb b/app/helpers/publics_helper.rb index 9e76f59f7..f14fad7a6 100644 --- a/app/helpers/publics_helper.rb +++ b/app/helpers/publics_helper.rb @@ -2,14 +2,12 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module PublicsHelper def subscribe(opts = {}) subscriber = Subscriber.first(:url => opts[:callback], :topic => opts[:topic]) subscriber ||= Subscriber.new(:url => opts[:callback], :topic => opts[:topic]) if subscriber.save - if opts[:verify] == 'sync' 204 elsif opts[:verify] == 'async' diff --git a/app/helpers/requests_helper.rb b/app/helpers/requests_helper.rb index 32ce79fd9..98ccc8f75 100644 --- a/app/helpers/requests_helper.rb +++ b/app/helpers/requests_helper.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module RequestsHelper - def subscription_mode(profile) if diaspora?(profile) :friend @@ -39,5 +37,4 @@ module RequestsHelper end { action => person } end - end diff --git a/app/helpers/sockets_helper.rb b/app/helpers/sockets_helper.rb index cbe465e7b..892e15f59 100644 --- a/app/helpers/sockets_helper.rb +++ b/app/helpers/sockets_helper.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module SocketsHelper include ApplicationHelper @@ -33,7 +32,4 @@ module SocketsHelper action_hash.to_json end - - - end diff --git a/app/helpers/status_messages_helper.rb b/app/helpers/status_messages_helper.rb index ff6c2674a..08461b635 100644 --- a/app/helpers/status_messages_helper.rb +++ b/app/helpers/status_messages_helper.rb @@ -2,13 +2,12 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - module StatusMessagesHelper def my_latest_message unless @latest_status_message.nil? return @latest_status_message.message else - return "No message to display." + return I18n.t('status_messages.helper.no_message_to_display') end end end diff --git a/app/models/album.rb b/app/models/album.rb index 10737bdfa..f62cbdb79 100644 --- a/app/models/album.rb +++ b/app/models/album.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Album < Post xml_reader :name @@ -17,7 +16,6 @@ class Album < Post before_destroy :destroy_photos - def self.mine_or_friends(friend_param, current_user) friend_param ? Album.find_all_by_person_id(current_user.friend_ids) : current_user.person.albums end diff --git a/app/models/aspect.rb b/app/models/aspect.rb index 96f94e8fe..10f7aba14 100644 --- a/app/models/aspect.rb +++ b/app/models/aspect.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Aspect include MongoMapper::Document @@ -39,5 +38,6 @@ class Aspect } } end + end diff --git a/app/models/comment.rb b/app/models/comment.rb index 3fa986503..4bf0dbd5e 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Comment include MongoMapper::Document include ROXML @@ -19,7 +18,6 @@ class Comment key :post_id, ObjectId key :person_id, ObjectId - belongs_to :post, :class_name => "Post" belongs_to :person, :class_name => "Person" diff --git a/app/models/fb_status.rb b/app/models/fb_status.rb new file mode 100644 index 000000000..40d9cb16e --- /dev/null +++ b/app/models/fb_status.rb @@ -0,0 +1,31 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + + +class FbStatus + include MongoMapper::Document + + key :graph_id, String + key :author_id, String + key :author_name, String + key :message, String + key :updated_time, Time + + timestamps! + + validates_presence_of :graph_id,:author_id,:author_name,:message,:updated_time + + def self.from_api(hash) + #just keeping them in memory for now + self.new( + :graph_id => hash['id'], + :author_id => hash['from']['id'], + :author_name => hash['from']['name'], + :message => hash['message'], + :updated_time => Time.parse(hash['updated_time']) + ) + end + +end + diff --git a/app/models/person.rb b/app/models/person.rb index 1e2a7b18d..8d1fee5d5 100644 --- a/app/models/person.rb +++ b/app/models/person.rb @@ -2,8 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - -require 'lib/hcard' +require File.expand_path('../../../lib/hcard', __FILE__) class Person include MongoMapper::Document @@ -18,7 +17,7 @@ class Person key :url, String key :diaspora_handle, String, :unique => true - key :serialized_key, String + key :serialized_public_key, String key :owner_id, ObjectId @@ -30,15 +29,13 @@ class Person before_destroy :remove_all_traces before_validation :clean_url - validates_presence_of :url, :profile, :serialized_key + validates_presence_of :url, :profile, :serialized_public_key validates_format_of :url, :with => /^(https?):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*(\.[a-z]{2,5})?(:[0-9]{1,5})?(\/.*)?$/ix - def self.search(query) - Person.all('$where' => "function() { return this.diaspora_handle.match(/^#{query}/i) || - this.profile.first_name.match(/^#{query}/i) || - this.profile.last_name.match(/^#{query}/i); }") + query = Regexp.escape( query.to_s.strip ) + Person.all('profile.first_name' => /^#{query}/i) | Person.all('profile.last_name' => /^#{query}/i) end def real_name @@ -52,36 +49,34 @@ class Person "#{self.url}receive/users/#{self.id}/" end - def encryption_key - OpenSSL::PKey::RSA.new( serialized_key ) + def public_url + "#{self.url}public/#{self.owner.username}" end - def encryption_key= new_key - raise TypeError unless new_key.class == OpenSSL::PKey::RSA - serialized_key = new_key.export - end def public_key_hash Base64.encode64 OpenSSL::Digest::SHA256.new(self.exported_key).to_s end def public_key - encryption_key.public_key + OpenSSL::PKey::RSA.new( serialized_public_key ) end def exported_key - encryption_key.public_key.export + serialized_public_key end def exported_key= new_key - raise "Don't change a key" if serialized_key - @serialized_key = new_key + raise "Don't change a key" if serialized_public_key + @serialized_public_key = new_key end def self.by_webfinger( identifier, opts = {}) - local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', '')) + #need to check if this is a valid email structure, maybe should do in JS + local_person = Person.first(:diaspora_handle => identifier.gsub('acct:', '').to_s.downcase) if local_person + Rails.logger.info("Do not need to webfinger, found a local person #{local_person.real_name}") local_person elsif !identifier.include?("localhost") && !opts[:local] begin @@ -101,11 +96,11 @@ class Person new_person = Person.new public_key_entry = profile.links.select{|x| x.rel == 'diaspora-public-key'} - + return nil unless public_key_entry - - public_key = public_key_entry.first.href - new_person.exported_key = Base64.decode64 public_key + + pubkey = public_key_entry.first.href + new_person.exported_key = Base64.decode64 pubkey guid = profile.links.select{|x| x.rel == 'http://joindiaspora.com/guid'}.first.href new_person.id = guid @@ -115,7 +110,7 @@ class Person hcard = HCard.find profile.hcard.first[:href] new_person.url = hcard[:url] - new_person.profile = Profile.new(:first_name => hcard[:given_name], :last_name => hcard[:family_name]) + new_person.profile = Profile.new(:first_name => hcard[:given_name], :last_name => hcard[:family_name], :image_url => hcard[:photo]) if new_person.save new_person else diff --git a/app/models/photo.rb b/app/models/photo.rb index 8792911f3..15d105739 100644 --- a/app/models/photo.rb +++ b/app/models/photo.rb @@ -2,7 +2,13 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - +class PhotoAlbumValidator < ActiveModel::Validator + def validate(document) + unless document.album.person_id == document.person_id + document.errors[:base] << "You post photos to that album" + end + end +end class Photo < Post require 'carrierwave/orm/mongomapper' include MongoMapper::Document @@ -22,7 +28,7 @@ class Photo < Post timestamps! validates_presence_of :album - validates_true_for :album_id, :logic => lambda {self.validate_album_person} + validates_with PhotoAlbumValidator before_destroy :ensure_user_picture @@ -36,10 +42,6 @@ class Photo < Post photo end - def validate_album_person - album.person_id == person_id - end - def remote_photo image.url.nil? ? (remote_photo_path + '/' + remote_photo_name) : image.url end @@ -70,3 +72,4 @@ class Photo < Post {:thumb_url => url(:thumb_medium), :id => id, :album_id => album_id} end end + diff --git a/app/models/post.rb b/app/models/post.rb index e9e135abb..aba822160 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -2,10 +2,9 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Post - require 'lib/diaspora/websocket' - require 'lib/encryptable' + require File.expand_path('../../../lib/encryptable', __FILE__) + require File.expand_path('../../../lib/diaspora/websocket', __FILE__) include MongoMapper::Document include ApplicationHelper include ROXML @@ -14,6 +13,9 @@ class Post xml_accessor :_id xml_accessor :person, :as => Person + xml_reader :public + + key :public , Boolean, :default => false key :person_id, ObjectId key :user_refs, Integer, :default => 0 @@ -33,7 +35,6 @@ class Post self.create params.to_hash end - def as_json(opts={}) { :post => { diff --git a/app/models/profile.rb b/app/models/profile.rb index f03843226..2b8303bd1 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -2,10 +2,9 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Profile include MongoMapper::EmbeddedDocument - require 'lib/diaspora/webhooks' + require File.expand_path('../../../lib/diaspora/webhooks', __FILE__) include Diaspora::Webhooks include ROXML diff --git a/app/models/request.rb b/app/models/request.rb index da62edd93..5ba4769a2 100644 --- a/app/models/request.rb +++ b/app/models/request.rb @@ -2,9 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Request - require 'lib/diaspora/webhooks' + require File.expand_path('../../../lib/diaspora/webhooks', __FILE__) include MongoMapper::Document include Diaspora::Webhooks include ROXML @@ -26,8 +25,8 @@ class Request validates_presence_of :destination_url, :callback_url before_validation :clean_link - scope :for_user, lambda{ |user| where(:destination_url => user.receive_url) } - scope :from_user, lambda{ |user| where(:destination_url.ne => user.receive_url) } + scope :for_user, lambda{ |user| where(:destination_url => user.person.receive_url) } + scope :from_user, lambda{ |user| where(:destination_url.ne => user.person.receive_url) } def self.instantiate(options = {}) person = options[:from] diff --git a/app/models/retraction.rb b/app/models/retraction.rb index 9c1f13f45..20f74bf29 100644 --- a/app/models/retraction.rb +++ b/app/models/retraction.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class Retraction include ROXML include Diaspora::Webhooks diff --git a/app/models/status_message.rb b/app/models/status_message.rb index f75536205..b509bfe5a 100644 --- a/app/models/status_message.rb +++ b/app/models/status_message.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class StatusMessage < Post xml_name :status_message @@ -11,16 +10,16 @@ class StatusMessage < Post key :message, String validates_presence_of :message - def to_activity <<-XML - http://activitystrea.ms/schema/1.0/post - #{self.message} - - #{person.url}status_messages/#{self.id} - #{self.created_at.xmlschema} - #{self.updated_at.xmlschema} + #{self.message} + + #{person.url}status_messages/#{self.id} + #{self.created_at.xmlschema} + #{self.updated_at.xmlschema} + http://activitystrea.ms/schema/1.0/post + http://activitystrea.ms/schema/1.0/note XML end diff --git a/app/models/user.rb b/app/models/user.rb index 4ec528e70..238397bdc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,29 +2,29 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - -require 'lib/diaspora/user/friending.rb' -require 'lib/diaspora/user/querying.rb' -require 'lib/salmon/salmon' +require File.expand_path('../../../lib/diaspora/user/friending', __FILE__) +require File.expand_path('../../../lib/diaspora/user/querying', __FILE__) +require File.expand_path('../../../lib/diaspora/user/receiving', __FILE__) +require File.expand_path('../../../lib/salmon/salmon', __FILE__) class User include MongoMapper::Document include Diaspora::UserModules::Friending include Diaspora::UserModules::Querying + include Diaspora::UserModules::Receiving include Encryptor::Private QUEUE = MessageHandler.new devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable key :username, :unique => true + key :serialized_private_key, String key :friend_ids, Array key :pending_request_ids, Array key :visible_post_ids, Array key :visible_person_ids, Array - key :url, String - one :person, :class_name => 'Person', :foreign_key => :owner_id many :friends, :in => :friend_ids, :class_name => 'Person' @@ -36,7 +36,7 @@ class User after_create :seed_aspects - before_validation_on_create :downcase_username + before_validation :downcase_username, :on => :create def self.find_for_authentication(conditions={}) if conditions[:username] =~ /^([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})$/i # email regex @@ -67,12 +67,11 @@ class User def drop_aspect( aspect ) if aspect.people.size == 0 aspect.destroy - else + else raise "Aspect not empty" end end - def move_friend( opts = {}) return true if opts[:to] == opts[:from] friend = Person.first(:_id => opts[:friend_id]) @@ -95,7 +94,6 @@ class User ######## Posting ######## def post(class_name, options = {}) - if class_name == :photo raise ArgumentError.new("No album_id given") unless options[:album_id] aspect_ids = aspects_with_post( options[:album_id] ) @@ -104,17 +102,44 @@ class User aspect_ids = options.delete(:to) end - aspect_ids = [aspect_ids.to_s] if aspect_ids.is_a? BSON::ObjectId - raise ArgumentError.new("You must post to someone.") if aspect_ids.nil? || aspect_ids.empty? + aspect_ids = validate_aspect_permissions(aspect_ids) + intitial_post(class_name, aspect_ids, options) + end + + def intitial_post(class_name, aspect_ids, options = {}) post = build_post(class_name, options) - post.socket_to_uid(id, :aspect_ids => aspect_ids) if post.respond_to?(:socket_to_uid) push_to_aspects(post, aspect_ids) - post end + def update_post( post, post_hash = {} ) + if self.owns? post + post.update_attributes(post_hash) + end + end + + def validate_aspect_permissions(aspect_ids) + if aspect_ids == "all" + return aspect_ids + end + + aspect_ids = [aspect_ids.to_s] unless aspect_ids.is_a? Array + + if aspect_ids.nil? || aspect_ids.empty? + raise ArgumentError.new("You must post to someone.") + end + + aspect_ids.each do |aspect_id| + unless self.aspects.find(aspect_id) + raise ArgumentError.new("Cannot post to an aspect you do not own.") + end + end + + aspect_ids + end + def build_post( class_name, options = {}) options[:person] = self.person model_class = class_name.to_s.camelize.constantize @@ -141,26 +166,34 @@ class User aspect.save target_people = target_people | aspect.people } + + push_to_hub(post) if post.respond_to?(:public) && post.public + push_to_people(post, target_people) end def push_to_people(post, people) + salmon = salmon(post) people.each{|person| - salmon(post, :to => person) + xml = salmon.xml_for person + push_to_person( person, xml) } end def push_to_person( person, xml ) - Rails.logger.debug("Adding xml for #{self} to message queue to #{url}") - QUEUE.add_post_request( person.receive_url, person.encrypt(xml) ) - QUEUE.process - + Rails.logger.debug("Adding xml for #{self} to message queue to #{self.url}") + QUEUE.add_post_request( person.receive_url, xml ) + QUEUE.process end - def salmon( post, opts = {} ) - salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml) - push_to_person( opts[:to], salmon.to_xml) - salmon + def push_to_hub(post) + Rails.logger.debug("Pushing update to pubsub server #{APP_CONFIG[:pubsub_server]} with url #{self.public_url}") + QUEUE.add_hub_notification(APP_CONFIG[:pubsub_server], self.public_url) + end + + def salmon( post ) + created_salmon = Salmon::SalmonSlap.create(self, post.to_diaspora_xml) + created_salmon end ######## Commenting ######## @@ -192,7 +225,7 @@ class User push_to_people comment, people_in_aspects(aspects_with_post(comment.post.id)) elsif owns? comment comment.save - salmon comment, :to => comment.post.person + push_to_people comment, [comment.post.person] end end @@ -217,88 +250,13 @@ class User end end - ###### Receiving ####### - def receive_salmon ciphertext - cleartext = decrypt( ciphertext) - Rails.logger.info("Received a salmon: #{cleartext}") - salmon = Salmon::SalmonSlap.parse cleartext - if salmon.verified_for_key?(salmon.author.public_key) - Rails.logger.info("data in salmon: #{salmon.data}") - self.receive(salmon.data) - end - end - - def receive xml - object = Diaspora::Parser.from_xml(xml) - Rails.logger.debug("Receiving object for #{self.real_name}:\n#{object.inspect}") - Rails.logger.debug("From: #{object.person.inspect}") if object.person - - if object.is_a? Retraction - if object.type == 'Person' - - 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 - object.perform self.id - aspects = self.aspects_with_person(object.person) - aspects.each{ |aspect| aspect.post_ids.delete(object.post_id.to_id) - aspect.save - } - end - elsif object.is_a? Request - person = Diaspora::Parser.parse_or_find_person_from_xml( xml ) - person.serialized_key ||= object.exported_key - object.person = person - object.person.save - old_request = Request.first(:id => object.id) - object.aspect_id = old_request.aspect_id if old_request - object.save - receive_friend_request(object) - elsif object.is_a? Profile - person = Diaspora::Parser.owner_id_from_xml xml - person.profile = object - person.save - - elsif object.is_a?(Comment) - object.person = Diaspora::Parser.parse_or_find_person_from_xml( xml ).save if object.person.nil? - self.visible_people = self.visible_people | [object.person] - self.save - Rails.logger.debug("The person parsed from comment xml is #{object.person.inspect}") unless object.person.nil? - object.person.save - Rails.logger.debug("From: #{object.person.inspect}") if object.person - raise "In receive for #{self.real_name}, signature was not valid on: #{object.inspect}" unless object.post.person == self.person || object.verify_post_creator_signature - object.save - unless owns?(object) - dispatch_comment object - end - object.socket_to_uid(id) if (object.respond_to?(:socket_to_uid) && !self.owns?(object)) - else - Rails.logger.debug("Saving object: #{object}") - object.user_refs += 1 - object.save - - self.raw_visible_posts << object - self.save - - aspects = self.aspects_with_person(object.person) - aspects.each{ |aspect| - aspect.posts << object - aspect.save - object.socket_to_uid(id, :aspect_ids => [aspect.id]) if (object.respond_to?(:socket_to_uid) && !self.owns?(object)) - } - - end - - end - ###Helpers############ def self.instantiate!( opts = {} ) - hostname = opts[:url].gsub(/(https?:|www\.)\/\//, '') - hostname.chop! if hostname[-1, 1] == '/' - - opts[:person][:diaspora_handle] = "#{opts[:username]}@#{hostname}" - puts opts[:person][:diaspora_handle] - opts[:person][:serialized_key] = generate_key + opts[:person][:diaspora_handle] = "#{opts[:username]}@#{APP_CONFIG[:terse_pod_url]}" + opts[:person][:url] = APP_CONFIG[:pod_url] + + opts[:serialized_private_key] = generate_key + opts[:person][:serialized_public_key] = opts[:serialized_private_key].public_key User.create(opts) end @@ -306,22 +264,15 @@ else aspect(:name => "Family") aspect(:name => "Work") end - - def terse_url - terse = self.url.gsub(/(https?:|www\.)\/\//, '') - terse = terse.chop! if terse[-1, 1] == '/' - terse - end def diaspora_handle - "#{self.username}@#{self.terse_url}" + "#{self.username}@#{APP_CONFIG[:terse_pod_url]}" end def downcase_username username.downcase! if username end - def as_json(opts={}) { :user => { @@ -332,7 +283,14 @@ else } } end - def self.generate_key - OpenSSL::PKey::RSA::generate 4096 - end + + + def self.generate_key + OpenSSL::PKey::RSA::generate 4096 + end + + def encryption_key + OpenSSL::PKey::RSA.new( serialized_private_key ) + end + end diff --git a/app/uploaders/image_uploader.rb b/app/uploaders/image_uploader.rb index 6e5312341..58399c90d 100644 --- a/app/uploaders/image_uploader.rb +++ b/app/uploaders/image_uploader.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - class ImageUploader < CarrierWave::Uploader::Base include CarrierWave::MiniMagick diff --git a/app/views/albums/_album.html.haml b/app/views/albums/_album.html.haml index f4893ed8f..4f41e5cfb 100644 --- a/app/views/albums/_album.html.haml +++ b/app/views/albums/_album.html.haml @@ -8,11 +8,11 @@ %div.time by - = link_to ((current_user.person == post.person)? 'you' : post.person.real_name), person_path(post.person) + = link_to ((current_user.person == post.person)? t('.you') : post.person.real_name), person_path(post.person) %br = link_to(how_long_ago(post), object_path(post, :aspect => @aspect)) %div.image_cycle - for photo in post.photos[0..3] = link_to (image_tag photo.url(:thumb_large)), album_path(post, :aspect => @aspect) - + diff --git a/app/views/albums/_new_album.haml b/app/views/albums/_new_album.haml index 8a37cb2c0..e0212a6b4 100644 --- a/app/views/albums/_new_album.haml +++ b/app/views/albums/_new_album.haml @@ -2,8 +2,7 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -%h1 Add a new album +%h1=t('.add_a_new_album') = form_for Album.new do |f| = f.error_messages @@ -11,4 +10,4 @@ = f.label :name = f.text_field :name = f.hidden_field :to, :value => aspect - = f.submit 'create', :class => 'button' + = f.submit t('.create'), :class => 'button' diff --git a/app/views/albums/edit.html.haml b/app/views/albums/edit.html.haml index a4bf3aef6..67cc3071d 100644 --- a/app/views/albums/edit.html.haml +++ b/app/views/albums/edit.html.haml @@ -2,14 +2,13 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - .back= link_to "⇧ #{@album.name}", @album %h1.big_text - = "Editing #{@album.name}" + = "#{t('.editing')} #{@album.name}" .sub_header - ="updated #{how_long_ago(@album)}" + ="#{t('.updated')} #{how_long_ago(@album)}" - form_for @album do |a| = a.error_messages @@ -21,12 +20,12 @@ .photo_edit_block= image_tag photo.url(:thumb_medium) #submit_block - = link_to "Cancel", root_path + = link_to t('.cancel'), root_path or = a.submit .button.delete - = link_to 'Delete Album', @album, :confirm => 'Are you sure?', :method => :delete + = link_to t('.delete_album'), @album, :confirm => t('.are_you_sure'), :method => :delete #content_bottom .back diff --git a/app/views/albums/index.html.haml b/app/views/albums/index.html.haml index fa4098c18..2e680c110 100644 --- a/app/views/albums/index.html.haml +++ b/app/views/albums/index.html.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - content_for :head do :javascript $(document).ready(function(){ @@ -10,7 +9,7 @@ }); = content_for :page_title do - = link_to "◂ Home", aspects_path, :aspect => params[:aspect] + = link_to "◂ #{t('.home')}", aspects_path, :aspect => params[:aspect] - content_for :left_pane do = render "shared/aspect_friends" @@ -19,7 +18,7 @@ %h1 Albums .right - = link_to 'New Album', '#new_album_pane', {:class => "button", :id => "add_album_button"} + = link_to t('.new_album'), '#new_album_pane', {:class => "button", :id => "add_album_button"} .yo{:style => "display:none;" } #new_album_pane @@ -34,4 +33,4 @@ #content_bottom .back - = link_to "⇧ home", root_path + = link_to "⇧ #{t('.home')}", root_path diff --git a/app/views/albums/show.html.haml b/app/views/albums/show.html.haml index 843523223..4c9ba19b8 100644 --- a/app/views/albums/show.html.haml +++ b/app/views/albums/show.html.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - :javascript $(document).ready(function(){ $(".image_thumb img").load( function() { @@ -11,33 +10,30 @@ }); = content_for :page_title do - = link_to "◂ Albums", albums_path(:aspect => @aspect) + = link_to "◂ #{t('.albums')}", albums_path(:aspect => @aspect) - content_for :left_pane do = render "shared/aspect_friends" - content_for :publish do + -if current_user.owns? @album + .right + =render 'photos/new_photo' + = link_to t('.edit_album'), edit_album_path(@album), :class => 'button' %h1 = @album.name - ="updated #{how_long_ago(@album)}" - + ="#{t('.updated')} #{how_long_ago(@album)}" .album_id{:id => @album.id, :style => "display:hidden;"} -unless current_user.owns? @album - %h4= "by #{@album.person.real_name}" + %h4= "#{t('.by')} #{@album.person.real_name}" #thumbnails - for photo in @album_photos .image_thumb = link_to (image_tag photo.url(:thumb_medium)), object_path(photo) - -if current_user.owns? @album - =render 'photos/new_photo' #content_bottom .back - = link_to "⇧ albums", albums_path - - -if current_user.owns? @album - .right - = link_to 'Edit Album', edit_album_path(@album), :class => 'button' + = link_to "⇧ #{t('.albums')}", albums_path diff --git a/app/views/aspects/_new_aspect.haml b/app/views/aspects/_new_aspect.haml index b5bc7ace3..548abd0d1 100644 --- a/app/views/aspects/_new_aspect.haml +++ b/app/views/aspects/_new_aspect.haml @@ -2,11 +2,10 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -%h1 Add a new aspect +%h1=t('.add_a_new_aspect') = form_for Aspect.new do |f| = f.error_messages %p = f.label :name = f.text_field :name - = f.submit 'create', :class => 'button' + = f.submit t('.create'), :class => 'button' diff --git a/app/views/aspects/index.html.haml b/app/views/aspects/index.html.haml index 5ea9cadb3..ae24e8e3b 100644 --- a/app/views/aspects/index.html.haml +++ b/app/views/aspects/index.html.haml @@ -2,10 +2,8 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - content_for :page_title do - = link_to "photos", albums_path(:aspect => @aspect) - + = link_to t('.photos'), albums_path(:aspect => @aspect) - content_for :left_pane do = render "shared/aspect_friends" diff --git a/app/views/aspects/manage.html.haml b/app/views/aspects/manage.html.haml index 667196b85..e08f6dabd 100644 --- a/app/views/aspects/manage.html.haml +++ b/app/views/aspects/manage.html.haml @@ -2,47 +2,48 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -- content_for :head do +- content_for :head do = javascript_include_tag 'jquery-ui-1.8.4.custom.min.js' = javascript_include_tag 'aspect-edit.js' - content_for :left_pane do - %h1 - Requests + %h1=t('.requests') .requests %ul.dropzone - - for request in @remote_requests - %li.requested_person{:id => request.person.id, :request_id => request.id} - = person_image_tag(request.person) - .name - = request.person.real_name - %h1 - Ignore/Remove + - if @remote_requests.size < 1 + %li.grey No new requests + - else + - for request in @remote_requests + %li.requested_person{:id => request.person.id, :request_id => request.id} + = person_image_tag(request.person) + .name + = request.person.real_name + %h1=t('.ignore_remove') %li.remove %ul.dropzone + %li.grey Drag to ignore/remove - content_for :publish do - = link_to("add a new aspect", "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => "Add a new aspect") - - + = link_to(t('.add_a_new_aspect'), "#add_aspect_pane", :id => "add_aspect_button", :class => "new_aspect button", :title => t('.add_a_new_aspect')) %ul#aspect_list - for aspect in @aspects %li.aspect - + .aspect_name - %h1{:contenteditable => true}= aspect.name + %span.edit_name_field + %h1{:contenteditable => true}= aspect.name + %span.tip click to edit %ul.tools - %li= link_to "add a new friend", "#add_request_pane_#{aspect.id}", :class => 'add_request_button' - %li= link_to "show", aspect_path(aspect) + %li= link_to t('.add_a_new_friend'), "#add_request_pane_#{aspect.id}", :class => 'add_request_button' + %li= link_to t('.show'), aspect_path(aspect) %li!= remove_link(aspect) - + %ul.dropzone{:id => aspect.id} - + -if aspect.people.size < 1 %li.grey Drag to add people @@ -52,13 +53,9 @@ %li.person{:id => person.id, :from_aspect_id => aspect.id} = person_image_tag(person) .name - = person.real_name + = link_to person.real_name, person .yo{:style => 'display:none'} %div{:id => "add_request_pane_#{aspect.id}"} = render "requests/new_request", :aspect => aspect -%p - %br - = link_to 'Update Aspects', '#', :class => 'button', :id => "move_friends_link" - #content_bottom diff --git a/app/views/aspects/public.html.haml b/app/views/aspects/public.html.haml new file mode 100644 index 000000000..e85cae276 --- /dev/null +++ b/app/views/aspects/public.html.haml @@ -0,0 +1,24 @@ +-# Copyright (c) 2010, Diaspora Inc. This file is +-# licensed under the Affero General Public License version 3. See +-# the COPYRIGHT file. + + +- content_for :page_title do + = link_to "photos", albums_path(:aspect => @aspect) + +- content_for :left_pane do + = render "shared/aspect_friends" + +- content_for :publish do + - if @logged_in + = render "shared/publisher", :aspect_ids => :public + - else + = render "shared/publisher", :aspect_ids => :all + +%ul#stream + - for post in @posts + = render type_partial(post), :post => post unless post.class == Album + +#pagination + = will_paginate @posts + diff --git a/app/views/aspects/show.html.haml b/app/views/aspects/show.html.haml index f10ccee74..ae24e8e3b 100644 --- a/app/views/aspects/show.html.haml +++ b/app/views/aspects/show.html.haml @@ -2,9 +2,8 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - content_for :page_title do - = link_to "photos", albums_path(:aspect => @aspect) + = link_to t('.photos'), albums_path(:aspect => @aspect) - content_for :left_pane do = render "shared/aspect_friends" diff --git a/app/views/comments/_comment.html.haml b/app/views/comments/_comment.html.haml index 56252c83d..03a2fcf61 100644 --- a/app/views/comments/_comment.html.haml +++ b/app/views/comments/_comment.html.haml @@ -2,11 +2,10 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -%li.comment{:id => post.id} +%li.comment{:id => post.id} = person_image_tag(post.person) %span.from = link_to post.person.real_name, post.person - = auto_link sanitize post.text + = post.text %div.time - = "#{time_ago_in_words(post.updated_at)} ago" + = "#{time_ago_in_words(post.updated_at)} #{t('.ago')}" diff --git a/app/views/comments/_comments.html.haml b/app/views/comments/_comments.html.haml index fc5c64da7..aecfb4bf1 100644 --- a/app/views/comments/_comments.html.haml +++ b/app/views/comments/_comments.html.haml @@ -2,11 +2,10 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %div.comments %ul.comment_set{:id => post.id} - for comment in post.comments = render 'comments/comment', :post => comment %li.comment.show = render 'comments/new_comment', :post => post - + diff --git a/app/views/comments/_new_comment.html.haml b/app/views/comments/_new_comment.html.haml index e998d98b7..99c03f898 100644 --- a/app/views/comments/_new_comment.html.haml +++ b/app/views/comments/_new_comment.html.haml @@ -2,11 +2,10 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - = form_for Comment.new, :remote => true do |f| %p %label{:for => "comment_text_on_#{post.id}"} Comment = f.text_area :text, :rows => 1, :id => "comment_text_on_#{post.id}", :class => "comment_box" = f.hidden_field :post_id, :value => post.id %p{:style => "text-align:right;"} - = f.submit "Comment", :class => "comment_submit button" + = f.submit t('.comment'), :class => "comment_submit button" diff --git a/app/views/devise/sessions/new.html.haml b/app/views/devise/sessions/new.html.haml index 1840d7acc..5803415b4 100644 --- a/app/views/devise/sessions/new.html.haml +++ b/app/views/devise/sessions/new.html.haml @@ -1,10 +1,16 @@ +%h1 + This is a technology preview, do not provide any private information. +%h3 + your account may be deleted until we move into a more stable development period. +%h3 + USE AT YOUR OWN RISK!! = form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| #user %p.username = f.label :username = f.text_field :username %p.user_network - ="@#{request.host}" + ="@#{APP_CONFIG[:terse_pod_url]}" %p = f.label :password @@ -14,6 +20,7 @@ / = f.check_box :remember_me / = f.label :remember_me = f.submit "Sign in" + = link_to "Have a problem? Find an answer here", 'http://diaspora.shapado.com/' %p = render :partial => "devise/shared/links" diff --git a/app/views/js/_websocket_js.haml b/app/views/js/_websocket_js.haml index 33af68cce..4677f6ce6 100644 --- a/app/views/js/_websocket_js.haml +++ b/app/views/js/_websocket_js.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - = javascript_include_tag 'FABridge', 'swfobject', 'web_socket' :javascript WebSocket.__swfLocation = "/javascripts/WebSocketMain.swf"; @@ -19,25 +18,23 @@ if (obj['class']=="retractions"){ processRetraction(obj['post_id']); - + }else if (obj['class']=="comments"){ - processComment(obj['post_id'], obj['html']) - + processComment(obj['post_id'], obj['html']) + }else if (obj['class']=='photos' && onPageForClass('albums')){ processPhotoInAlbum(obj['photo_hash']) }else{ processPost(obj['class'], obj['html'], obj['aspect_ids']) } - - }; + }; ws.onclose = function() { debug("socket closed"); }; ws.onopen = function() { ws.send(location.pathname); debug("connected..."); }; - }); function processRetraction(post_id){ $('#' + post_id ).fadeOut(500, function(){ @@ -66,7 +63,7 @@ $(html).fadeIn("fast", function(){ $("#stream label:first").inFieldLabels(); }) - ); + ); } } @@ -77,13 +74,13 @@ html = "
\ \ \"New \ -
" + " $("#thumbnails").append( $(html) ) $("#"+ photoHash['id'] + " img").load( function() { $(this).fadeIn("slow"); }); } - + function onPageForClass(className){ return (location.href.indexOf(className) != -1 ); } @@ -100,9 +97,9 @@ } function onPageForAspect(aspectId){ - return (location.href.indexOf(aspectId) != -1 ) + return (location.href.indexOf(aspectId) != -1 ) } - + function onPageOne() { var c = document.location.search.charAt(document.location.search.length-1); return ((c =='') || (c== '1')); diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 4a3ec2dbb..fc063e0b6 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - !!! %html %head @@ -10,24 +9,24 @@ = "#{current_user.real_name} | diaspora" if current_user %meta{"http-equiv"=>"Content-Type", :content=>"text/html; charset=utf-8"}/ - + = stylesheet_link_tag "blueprint/screen", :media => 'screen' = stylesheet_link_tag "application", "ui" - = stylesheet_link_tag "/../javascripts/fancybox/jquery.fancybox-1.3.1" - = stylesheet_link_tag "fileuploader" + = stylesheet_link_tag "/../javascripts/fancybox/jquery.fancybox-1.3.1" + = stylesheet_link_tag "fileuploader" /= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" = javascript_include_tag 'jquery-1.4.2.min', 'rails' = javascript_include_tag 'jquery.infieldlabel', 'jquery.cycle/jquery.cycle.min.js' - + = javascript_include_tag 'fancybox/jquery.fancybox-1.3.1.pack' = javascript_include_tag 'fileuploader' = javascript_include_tag 'view', 'image_picker', 'stream' = render 'js/websocket_js' - + = csrf_meta_tag = yield(:head) @@ -50,8 +49,8 @@ = text_field_tag 'q' %li= link_to current_user.real_name, current_user.person - %li= link_to "edit profile", edit_user_path(current_user) - %li= link_to "logout", destroy_user_session_path + %li= link_to t('.edit_profile'), edit_user_path(current_user) + %li= link_to t('.logout.'), destroy_user_session_path = render "shared/aspect_nav" = render "shared/sub_header" diff --git a/app/views/layouts/session_wall.html.haml b/app/views/layouts/session_wall.html.haml index 351daee0e..29b863b32 100644 --- a/app/views/layouts/session_wall.html.haml +++ b/app/views/layouts/session_wall.html.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - !!! %html %head @@ -10,7 +9,7 @@ DIASPORA | login %meta{"http-equiv"=>"Content-Type", :content=>"text/html; charset=utf-8"}/ %meta{"http-equiv"=> "X-UA-Compatible", :content =>"chrome=1" } - + = stylesheet_link_tag "sessions" /= javascript_include_tag"http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" = javascript_include_tag 'jquery142' @@ -18,10 +17,10 @@ :javascript $(document).ready(function(){ - $("#user_username").focus(); + $("#user_username").focus(); $("label").inFieldLabels(); }); - + = csrf_meta_tag = yield(:head) @@ -44,11 +43,11 @@ - + - flash.each do |name, msg| = content_tag :div, msg, :id => "flash_#{name}" %div#huge_text DIASPORA* = yield - + /= link_to "signup", "/signup" diff --git a/app/views/people/_person.html.haml b/app/views/people/_person.html.haml new file mode 100644 index 000000000..7e22a5570 --- /dev/null +++ b/app/views/people/_person.html.haml @@ -0,0 +1,27 @@ +-# Copyright (c) 2010, Diaspora Inc. This file is +-# licensed under the Affero General Public License version 3. See +-# the COPYRIGHT file. + +%li.message{:id => person.id} + + = person_image_link(person) + + .content + %span.from + = link_to person.real_name, person_path(person) + + .info + = person.diaspora_handle + + .right{ :style => "display:inline;top:0;" } + - if person.id == current_user.person.id + thats you! + - elsif current_user.friends.include?(person) + Already friends + - elsif current_user.pending_requests.find_by_person_id(person.id) + = link_to =t('.pending_request'), aspects_manage_path + - else + = form_for Request.new do |f| + = f.select(:aspect_id, @aspects_dropdown_array) + = f.hidden_field :destination_url, :value => person.diaspora_handle + = f.submit t('.add_friend') diff --git a/app/views/people/index.html.haml b/app/views/people/index.html.haml index c18ec5d0a..5981569b8 100644 --- a/app/views/people/index.html.haml +++ b/app/views/people/index.html.haml @@ -2,50 +2,23 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - content_for :publish do %h1 Search =form_tag '/people', :method => "get" do - = text_field_tag :q + = text_field_tag :q, params[:q] = submit_tag "search" - content_for :left_pane do \. -= (@people.count).to_s + search_or_index -%table - %tr - %th real name - %th diaspora handle - %th url - - for person in @people - %tr - - if current_user.friends.include? person - %td= link_to person.real_name, person - - else - %td= person.real_name +%h1 + search results for + %u= params[:q] - %td= person.diaspora_handle - %td= person.url - - -if current_user.friends.include? person +%ul#stream + - for person in @people + = render 'people/person', :person => person - - elsif person.id == current_user.person.id - %td - %td that's you! - -elsif current_user.pending_requests.find_by_person_id(person.id) - %td - %td ^-you have a friend request from this person - -elsif current_user.pending_requests.find_by_url(person.receive_url) - %td - %td friend request pending - -else - %td - %td - = form_for Request.new do |f| - = f.select(:aspect_id, @aspects_dropdown_array) - = f.hidden_field :destination_url, :value => person.diaspora_handle - = f.submit "add friend" - = will_paginate @people += will_paginate @people diff --git a/app/views/people/new.html.haml b/app/views/people/new.html.haml index b2203eb3f..0584732bc 100644 --- a/app/views/people/new.html.haml +++ b/app/views/people/new.html.haml @@ -2,8 +2,7 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -- title "New Person" +- title=t('.new_person') = form_for @person do |f| = f.error_messages @@ -15,18 +14,17 @@ = f.label :url %br = f.text_field :url - + =f.fields_for :profile do |p| %p = p.label :first_name %br = p.text_field :first_name - + %p = p.label :last_name %br = p.text_field :last_name = f.submit - -%p= link_to "Back to List", people_path +%p= link_to t('.back_to_list'), people_path diff --git a/app/views/people/show.html.haml b/app/views/people/show.html.haml index 4f76f18cf..9b5128160 100644 --- a/app/views/people/show.html.haml +++ b/app/views/people/show.html.haml @@ -2,9 +2,8 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - content_for :page_title do - = @person.real_name + profile - content_for :left_pane do #profile @@ -13,22 +12,22 @@ %ul -unless @posts.first.nil? %li - %i= "last seen: #{how_long_ago(@posts.first)}" + %i= t(".last_seen",:how_long_ago => how_long_ago(@posts.first)) - if @person != current_user.person && current_user.friends.include?(@person) %li - %i= "friends since: #{how_long_ago(@person)}" + %i= t(".friends_since",:how_long_ago => how_long_ago(@person)) %li = form_tag move_friend_path = select :to, :to, @aspects_dropdown_array, :selected => @aspects_with_person.first.id = hidden_field_tag :from, :from, :value => @aspects_with_person.first.id = hidden_field_tag :friend_id, :friend_id, :value => @person.id - = submit_tag "save" + = submit_tag t('.save') - if @person != current_user.person && current_user.friends.include?(@person) - = link_to 'remove friend', @person, :confirm => 'Are you sure?', :method => :delete, :class => "button" + = link_to t('.remove_friend'), @person, :confirm => t('.are_you_sure'), :method => :delete, :class => "button" .span-20.last - + .span-19.last - if @posts %ul#stream @@ -36,4 +35,4 @@ = render type_partial(post), :post => post unless post.class == Album = will_paginate @posts - else - %h3 no posts to display! + %h3=t('no posts to display!') diff --git a/app/views/photos/_new_photo.haml b/app/views/photos/_new_photo.haml index 0f1e423fb..d1a4fc73f 100644 --- a/app/views/photos/_new_photo.haml +++ b/app/views/photos/_new_photo.haml @@ -2,16 +2,15 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - :javascript - function createUploader(){ + function createUploader(){ var uploader = new qq.FileUploader({ element: document.getElementById('file-upload'), params: {'album_id' : "#{@album.id}"}, - allowedExtensions: ['jpg', 'jpeg', 'png'], + allowedExtensions: ['jpg', 'jpeg', 'png', 'gif'], action: "#{photos_path}" - }); + }); } - window.onload = createUploader; + window.onload = createUploader; #file-upload diff --git a/app/views/photos/_photo.haml b/app/views/photos/_photo.haml index f0a3f2c83..5e86e32a6 100644 --- a/app/views/photos/_photo.haml +++ b/app/views/photos/_photo.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %li.message{:id => post.id} = person_image_tag(post.person) @@ -11,15 +10,25 @@ %span.from = link_to post.person.real_name, post.person %b - posted a new photo to + =t('.posted_a_new_photo_to') = link_to post.album.name, object_path(post.album) %br = render "albums/album", :post => post.album, :current_user => current_user = link_to (image_tag post.url(:thumb_medium)), object_path(post) - + .info = link_to(how_long_ago(post), photo_path(post)) \-- - = link_to "show comments (#{post.comments.count})", '#', :class => "show_post_comments" - = render "comments/comments", :post => post + = link_to "#{t('.show_comments')} (#{post.comments.count})", '#', :class => "show_post_comments" + = render "comments/comments", :post => post + + - if post.public? + .public_aspect_tag + public + - else + .aspect_tag + %ul + - for aspect in current_user.aspects_with_post( post.id ) + %li= aspect.name + diff --git a/app/views/photos/edit.html.haml b/app/views/photos/edit.html.haml index 107b67944..e70030562 100644 --- a/app/views/photos/edit.html.haml +++ b/app/views/photos/edit.html.haml @@ -2,11 +2,10 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %h1.big_text .back = link_to "⇧ #{@album.name}", album_path(@album) - = "Editing #{@photo.image}" + = "#{t('.editing')} #{@photo.image}" %div{:id => @photo.id} @@ -14,6 +13,7 @@ = linked_scaled_photo @photo, @album = form_for @photo do |p| + = p.label :caption = p.text_field :caption, :value => @photo.caption = p.submit %div{:class => 'clear'} @@ -23,5 +23,5 @@ = link_to "⇧ #{@album.name}", album_path(@album) -if current_user.owns? @album .button.right - = link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete + = link_to t('.delete_photo'), @photo, :confirm => t('.are_you_sure'), :method => :delete diff --git a/app/views/photos/new.html.haml b/app/views/photos/new.html.haml index a8814d770..d8701c265 100644 --- a/app/views/photos/new.html.haml +++ b/app/views/photos/new.html.haml @@ -2,13 +2,12 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -- title "New Photo" +- title t('.new_photo') = form_for( @photo, :html => {:multipart => true}) do |f| = f.error_messages %p = f.file_field :image - = f.submit 'post it!', :class => 'button' + = f.submit t('.post_it'), :class => 'button' -%p= link_to "Back to List", photos_path +%p= link_to t('.back_to_list'), photos_path diff --git a/app/views/photos/show.html.haml b/app/views/photos/show.html.haml index 29b494441..53cda49ba 100644 --- a/app/views/photos/show.html.haml +++ b/app/views/photos/show.html.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - :javascript $(document).keydown(function(e){ switch(e.keyCode) { @@ -67,16 +66,15 @@ %h1 = @photo.image - = link_to "<< prev", url_to_prev(@photo, @album) + = link_to "<< #{t('.prev')}", url_to_prev(@photo, @album) | - = link_to "full size", @photo.url + = link_to "#{t('.full_size')}", @photo.url | - = link_to "next >>", url_to_next(@photo, @album) + = link_to "#{t('.next')} >>", url_to_next(@photo, @album) .right -if current_user.owns? @album - = link_to 'Edit Photo', edit_photo_path(@photo), :class => "button" - + = link_to t('.edit_photo'), edit_photo_path(@photo), :class => "button" %div{:id => @photo.id} #show_photo @@ -104,9 +102,9 @@ -if current_user.owns? @album .right - = link_to 'Delete Photo', @photo, :confirm => 'Are you sure?', :method => :delete, :class => 'button' + = link_to t('.delete_photo'), @photo, :confirm => t('.are_you_sure'), :method => :delete, :class => 'button' %h4{:class => "show_post_comments"} - = "comments (#{@photo.comments.count})" + = "#{t('.comments')} (#{@photo.comments.count})" = render "comments/comments", :post => @photo - + diff --git a/app/views/posts/_debug.haml b/app/views/posts/_debug.haml index 17d7baad8..ef1984d7d 100644 --- a/app/views/posts/_debug.haml +++ b/app/views/posts/_debug.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - #debug_info %h5 DEBUG INFO #debug_more{ :style => "display:none;" } diff --git a/app/views/posts/_post.html.haml b/app/views/posts/_post.html.haml index 217441465..acad2e12b 100644 --- a/app/views/posts/_post.html.haml +++ b/app/views/posts/_post.html.haml @@ -2,8 +2,7 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %ul - %h3= link_to post.class, object_path(post) + %h3= link_to post.class, object_path(post) - for field in object_fields(post) - %li= "#{field}: #{post.attributes[field]}" + %li= "#{field}: #{post.attributes[field]}" diff --git a/app/views/publics/hcard.erb b/app/views/publics/hcard.erb index f8a3fef91..6b8ab3209 100644 --- a/app/views/publics/hcard.erb +++ b/app/views/publics/hcard.erb @@ -1,42 +1,48 @@ -
-

<%=@person.real_name%>

-
-
-

User profile

-
-
Nickname
-
- <%= @person.real_name%> -
-
-
-
Full name
-
- <%= @person.profile.first_name %> -
+
+

<%=@person.real_name%>

+
+
+

User profile

+
+
Nickname
+
+ <%= @person.real_name%> +
+
+
+
Full name
+
+ <%= @person.profile.first_name %> +
-
-
Full name
-
- <%= @person.profile.last_name %> -
+
+
Full name
+
+ <%= @person.profile.last_name %> +
-
-
Full name
-
- <%= @person.real_name %> -
-
-
-
URL
-
- <%= @person.url%> -
-
-
-
Note
-
Diaspora is awesome! vi is better than emacs!
-
-
-
-
+
+
Full name
+
+ <%= @person.real_name %> +
+
+
+
URL
+
+ <%= @person.url%> +
+
+
+
Photo
+
+ +
+
+
+
Note
+
Diaspora is awesome! vi is better than emacs!
+
+
+
+
diff --git a/app/views/publics/host_meta.erb b/app/views/publics/host_meta.erb index e28fb6211..ff24552b9 100644 --- a/app/views/publics/host_meta.erb +++ b/app/views/publics/host_meta.erb @@ -1,8 +1,8 @@ - <%= terse_url(root_url) %> - Resource Descriptor diff --git a/app/views/publics/webfinger.erb b/app/views/publics/webfinger.erb index 47b76e6e6..8c6d08657 100644 --- a/app/views/publics/webfinger.erb +++ b/app/views/publics/webfinger.erb @@ -5,5 +5,8 @@ + + + diff --git a/app/views/registrations/new.html.haml b/app/views/registrations/new.html.haml index eefa94519..25902720e 100644 --- a/app/views/registrations/new.html.haml +++ b/app/views/registrations/new.html.haml @@ -1,8 +1,6 @@ = image_tag "http://needcoffee.cachefly.net/needcoffee/uploads/2009/02/predator-arnold-schwarzenegger.jpg" - = form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| - = f.hidden_field :url, :value => request.host %p = f.label :username = f.text_field :username @@ -17,8 +15,6 @@ = f.password_field :password_confirmation = f.fields_for :person do |p| - = p.hidden_field :url, :value => request.host - = p.fields_for :profile do |pr| %p = pr.label :first_name @@ -27,5 +23,5 @@ = pr.label :last_name = pr.text_field :last_name - = f.submit "Sign up" + = f.submit t('.sign_up') = render :partial => "devise/shared/links" diff --git a/app/views/requests/_new_request.haml b/app/views/requests/_new_request.haml index b7e5819f6..0dbf5b0a1 100644 --- a/app/views/requests/_new_request.haml +++ b/app/views/requests/_new_request.haml @@ -2,20 +2,19 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %h1 - Add a new friend to + =t('.add_a_new_friend_to') %i= aspect.name = form_for Request.new do |f| = f.error_messages - Enter a Diaspora username: + =t('.enter_a_diaspora_username') %br - %i= "Your Diaspora username is: #{current_user.diaspora_handle}" + %i= t '.your_diaspora_username_is', :diaspora_handle => current_user.diaspora_handle %p - = f.label :destination_url, "Friend's username" + = f.label :destination_url, t(".friends_username") = f.text_field :destination_url = f.hidden_field :aspect_id, :value => aspect.id = f.submit diff --git a/app/views/shared/_aspect_friends.haml b/app/views/shared/_aspect_friends.haml index 6ab286a81..8c22700aa 100644 --- a/app/views/shared/_aspect_friends.haml +++ b/app/views/shared/_aspect_friends.haml @@ -2,19 +2,22 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - #friend_pictures = owner_image_link - for friend in @friends = person_image_link(friend) - - -unless @aspect == :all + - if @logged_in && (@aspect == :public) + %h3 Facebook Friends + - @fb_friends = MiniFB.get(@access_token, 'me', :type => "friends") + - @fb_friends[:data].each do |friend| + = image_tag( "http://graph.facebook.com/#{friend[:id]}/picture" ) + -unless (@aspect == :all) || (@aspect == :public) = link_to (image_tag('add_friend_button.png', :height => "50px", :width => "50px")), "#add_request_pane", :id => 'add_request_button' - + .yo{:style => 'display:none'} #add_request_pane - = render "requests/new_request", :aspect => @aspect + = render "requests/new_request", :aspect => @aspect -else .clear - = link_to "add friends", aspects_manage_path + = link_to t('.add_friends'), aspects_manage_path diff --git a/app/views/shared/_aspect_nav.haml b/app/views/shared/_aspect_nav.haml index b61def9f5..dc01afd20 100644 --- a/app/views/shared/_aspect_nav.haml +++ b/app/views/shared/_aspect_nav.haml @@ -2,19 +2,20 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - #aspect_nav %ul + %li{:class => ("selected" if @aspect == :all)} + = link_to t('.all_aspects'), root_url - for aspect in @aspects - %li{:id => aspect.id, :class => ("selected" if current_aspect?(aspect))} + %li{:class => ("selected" if current_aspect?(aspect))} = link_for_aspect aspect %ul{ :style => "position:absolute;right:0;bottom:0.01em;"} - %li{:class => ("selected" if @aspect == :all)} - = link_to "All Aspects", root_url + %li{:class => ("selected" if @aspect == :public)} + = link_to "Public", aspects_public_path %li{ :style => "margin-right:0;", :class => ("selected" if @aspect == :manage)} - = link_to ( (@request_count == 0)? "manage" : "manage (#{@request_count})"), {:controller => :aspects, :action => :manage}, :class => "edit_aspect_button", :class => new_request(@request_count), :title => "Manage your Aspects" + = link_to ( (@request_count == 0)? t('.manage') : "#{t('.manage')} (#{@request_count})"), {:controller => :aspects, :action => :manage}, :class => "edit_aspect_button", :class => new_request(@request_count), :title => t('.manage_your_aspects') .yo{ :style => "display:none;"} #add_aspect_pane diff --git a/app/views/shared/_post_wrapper.haml b/app/views/shared/_post_wrapper.haml index b901fc608..956706b68 100644 --- a/app/views/shared/_post_wrapper.haml +++ b/app/views/shared/_post_wrapper.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %li.message{:id => post.id, :class => ("mine" if current_user.owns?(post))} = person_image_link(post.person) = yield post_yield_tag(post) diff --git a/app/views/shared/_publisher.haml b/app/views/shared/_publisher.haml index 4645ec65c..d1ad995df 100644 --- a/app/views/shared/_publisher.haml +++ b/app/views/shared/_publisher.haml @@ -2,7 +2,6 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - #publisher = owner_image_tag @@ -10,13 +9,14 @@ = f.error_messages %p %label{:for => "status_message_message"} Message - = f.text_area :message, :rows => 2 + = f.text_area :message, :rows => 2, :value => params[:prefill] + = connected_fb_as(@access_token) if @logged_in && @aspect == :public + = f.hidden_field( :public, :value => (params[:action] == 'public') ) %ul.aspect_selector{ :style => "display:none;"} going to... - for aspect in @aspects %li - = check_box_tag("aspect_ids[]", aspect.id, @aspect == :all || current_aspect?(aspect) ) + = check_box_tag("aspect_ids[]", aspect.id, @aspect == :public || @aspect == :all || current_aspect?(aspect) ) = aspect.name - - = f.submit "Share" + = f.submit t('.share') diff --git a/app/views/shared/_reshare.haml b/app/views/shared/_reshare.haml new file mode 100644 index 000000000..9df1c9ce1 --- /dev/null +++ b/app/views/shared/_reshare.haml @@ -0,0 +1,25 @@ +-# Copyright (c) 2010, Diaspora Inc. This file is +-# licensed under the Affero General Public License version 3. See +-# the COPYRIGHT file. + +:javascript + $(".reshare_button").toggle(function(e){ + e.preventDefault(); + $(this).parent(".reshare_pane").children(".reshare_box").fadeIn(200); + }, function(e) { + e.preventDefault(); + $(this).parent(".reshare_pane").children(".reshare_box").fadeOut(200); + }); + +.reshare_pane + %span.reshare_button + = link_to "Reshare", "#" + + %ul.reshare_box + - for aspect in current_user.aspects_with_post( post.id ) + + %li.currently_sharing= aspect.name + + - for aspect in current_user.aspects + - unless aspect.posts.include? post + %li.aspect_to_share= link_to aspect, :controller => "aspects", :action => "show", :id => aspect.id, :prefill => post.message diff --git a/app/views/shared/_sub_header.haml b/app/views/shared/_sub_header.haml index badf8783d..227b63d4e 100644 --- a/app/views/shared/_sub_header.haml +++ b/app/views/shared/_sub_header.haml @@ -7,9 +7,11 @@ - else %h1 - if @aspect == :all - = link_to "All Aspects", root_path + = link_to t('.all_aspects'), root_path + - elsif @aspect == :public + = "Public" - elsif @aspect == :manage - = link_to "Manage Aspects", root_path + = link_to t('.manage_aspects'), root_path - else = link_to @aspect.name, @aspect diff --git a/app/views/shared/log.haml b/app/views/shared/log.haml index 7472689e3..bf957bf7c 100644 --- a/app/views/shared/log.haml +++ b/app/views/shared/log.haml @@ -2,5 +2,4 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - = @log.to_s diff --git a/app/views/status_messages/_new_status_message.haml b/app/views/status_messages/_new_status_message.haml index 329e72d66..c27585f0a 100644 --- a/app/views/status_messages/_new_status_message.haml +++ b/app/views/status_messages/_new_status_message.haml @@ -2,9 +2,8 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - = form_for StatusMessage.new, :remote => true do |f| = f.error_messages %p - = f.text_field :message, :value => "tell me something good" - = f.submit 'oh yeah!', :class => 'button' + = f.text_field :message, :value => t('.tell_me_something_good') + = f.submit t('.oh_yeah'), :class => 'button' diff --git a/app/views/status_messages/_status_message.html.haml b/app/views/status_messages/_status_message.html.haml index a22098afa..d1568c7bb 100644 --- a/app/views/status_messages/_status_message.html.haml +++ b/app/views/status_messages/_status_message.html.haml @@ -2,24 +2,33 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %li.message{:id => post.id, :class => ("mine" if current_user.owns?(post))} = person_image_link(post.person) .content %span.from - = link_to post.person.real_name, post.person - = auto_link sanitize post.message - + = link_to post.person.real_name, post.person + = post.message + .info - = link_to(how_long_ago(post), object_path(post)) + %span.time= link_to(how_long_ago(post), object_path(post)) \-- - = link_to "show comments (#{post.comments.count})", '#', :class => "show_post_comments" - - = render "comments/comments", :post => post + = link_to "#{t('.show_comments')} (#{post.comments.count})", '#', :class => "show_post_comments" + = render "comments/comments", :post => post - if current_user.owns?(post) .destroy_link - = link_to 'Delete', status_message_path(post), :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "delete" + = link_to t('.delete'), status_message_path(post), :confirm => t('.are_you_sure'), :method => :delete, :remote => true, :class => "delete" + = render "shared/reshare", :post => post, :current_user => current_user + + - if post.public? + .public_aspect_tag + public + - else + .aspect_tag + %ul + - for aspect in current_user.aspects_with_post( post.id ) + %li= aspect.name + diff --git a/app/views/status_messages/index.html.haml b/app/views/status_messages/index.html.haml index c2a579d87..43c065380 100644 --- a/app/views/status_messages/index.html.haml +++ b/app/views/status_messages/index.html.haml @@ -2,11 +2,10 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - %h1.big_text status messages = render "status_messages/new_status_message", :status_message => @status_message %ul#stream - + - for status_message in @status_messages = render "status_message", :post => status_message #pagination diff --git a/app/views/status_messages/show.html.haml b/app/views/status_messages/show.html.haml index 358c2244b..3d78dd29e 100644 --- a/app/views/status_messages/show.html.haml +++ b/app/views/status_messages/show.html.haml @@ -2,21 +2,14 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - -- title "Status Message" - -%p - %strong Message: +%h1 + = link_to @status_message.person.real_name, @status_message.person = @status_message.message - -%p - %strong Owner: - = @status_message.person.real_name -%h4= "comments (#{@status_message.comments.count})" +%h4= "#{t('.comments')} (#{@status_message.comments.count})" + = render "comments/comments", :post => @status_message %p - = link_to "Destroy", @status_message, :confirm => 'Are you sure?', :method => :delete - | - = link_to "View All", status_messages_path + - if current_user.owns? @status_message + = link_to t('.destroy'), @status_message, :confirm => t('are_you_sure?'), :method => :delete diff --git a/app/views/users/_profile.haml b/app/views/users/_profile.haml new file mode 100644 index 000000000..cef161127 --- /dev/null +++ b/app/views/users/_profile.haml @@ -0,0 +1,66 @@ +-# Copyright (c) 2010, Diaspora Inc. This file is +-# licensed under the Affero General Public License version 3. See +-# the COPYRIGHT file. + + +%h2 Profile + += form_for @user do |f| + = f.error_messages + + = f.fields_for :profile do |p| + + %h3="#{t('.picture')}" + %div#image_picker + = p.hidden_field :image_url, :value => (@profile.image_url if @profile.image_url), :id => 'image_url_field' + + - unless @photos.nil? || @photos.empty? + - for photo in @photos + - if @profile.image_url && @profile.image_url.include?(photo.url(:thumb_medium)) + %div.small_photo{:id => photo.url(:thumb_medium), :class=>'selected'} + = check_box_tag 'checked_photo', true, true + = link_to image_tag(photo.url(:thumb_medium)), "#" + - else + %div.small_photo{:id => photo.url(:thumb_medium)} + = check_box_tag 'checked_photo' + = link_to image_tag(photo.url(:thumb_medium)), "#" + + - else + =t('.you_dont_have_any_photos') + = link_to t('.albums'), albums_path(:aspect => 'all') + =t('.page_to_upload_some') + + =will_paginate @photos + + %br + + %h3="#{t('.info')}" + + %p + %b + ="#{t('.diaspora_username')}:" + = @user.diaspora_handle + + %p + = p.label :first_name + = p.text_field :first_name, :value => @profile.first_name + %p + = p.label :last_name + = p.text_field :last_name, :value => @profile.last_name + %p + = f.label :password + = f.password_field :password + %p + = f.label :password_confirmation + = f.password_field :password_confirmation + + + #submit_block + = link_to t('.cancel'), root_path + = t('.or') + = f.submit t('.update_profile') + +#content_bottom + .back + = link_to "⇧ #{t('.home')}", root_path + diff --git a/app/views/users/_services.haml b/app/views/users/_services.haml new file mode 100644 index 000000000..648fbe161 --- /dev/null +++ b/app/views/users/_services.haml @@ -0,0 +1,25 @@ +-# Copyright (c) 2010, Diaspora Inc. This file is +-# licensed under the Affero General Public License version 3. See +-# the COPYRIGHT file. + + +%h2 Services + +- if FACEBOOK + %h3 Facebook + %p + - if @logged_in + = connected_fb_as(@access_token) + + %p + - @fb_friends = MiniFB.get(@access_token, 'me', :type => "friends") + - @fb_friends[:data].each do |friend| + = image_tag( "http://graph.facebook.com/#{friend[:id]}/picture" ) + + = link_to "Disconnect from Facebook", services_destroy_path + - else + = link_to "Connect to Facebook (DO NOT USE WITH A REAL ACCOUNT)", @fb_access_url + + #content_bottom + .back + = link_to "⇧ home", root_path diff --git a/app/views/users/edit.html.haml b/app/views/users/edit.html.haml index cddec8d77..81fc639e7 100644 --- a/app/views/users/edit.html.haml +++ b/app/views/users/edit.html.haml @@ -2,66 +2,29 @@ -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. +:javascript + $("#settings_nav li > a").click( function() { + var target = "#"+$(this).attr('class'); + if( !$(target).is(":visible") ) { + $(".settings_pane").fadeOut(200, function() { + $(target).delay(200).fadeIn(200); + }); + } + }); + - content_for :publish do - %h1 - Editing profile + %h1="#{t('.editing_profile')}" - content_for :left_pane do - \. + %ul#settings_nav + %li=link_to 'Profile', '#', :class => 'profile' + %li=link_to 'Services', '#', :class => 'services' -= form_for @user do |f| - = f.error_messages +#profile.settings_pane{:style=>"display:block;"} + = render 'users/profile' - = f.fields_for :profile do |p| +#services.settings_pane + = render 'users/services' - %h3 Picture - %div#image_picker - = p.hidden_field :image_url, :value => (@profile.image_url.sub(@user.url,'/') if @profile.image_url), :id => 'image_url_field' - - unless @photos.nil? || @photos.empty? - - for photo in @photos - - if @profile.image_url && (photo.url(:thumb_medium) == @profile.image_url.sub(@user.url,'/')) - %div.small_photo{:id => photo.url(:thumb_medium), :class=>'selected'} - = check_box_tag 'checked_photo', true, true - = link_to image_tag(photo.url(:thumb_medium)), "#" - - else - %div.small_photo{:id => photo.url(:thumb_medium)} - = check_box_tag 'checked_photo' - = link_to image_tag(photo.url(:thumb_medium)), "#" - - - else - You don't have any photos! Go to the - = link_to "albums", albums_path(:aspect => 'all') - page to upload some. - - =will_paginate @photos - - %br - - %h3 Info - - %p - %b - DIASPORA USERNAME: - = @user.diaspora_handle - - %p - = p.label :first_name - = p.text_field :first_name, :value => @profile.first_name - %p - = p.label :last_name - = p.text_field :last_name, :value => @profile.last_name - - %p - = f.label :email - = f.text_field :email - - #submit_block - = link_to "Cancel", root_path - or - = f.submit "Update Profile" - -#content_bottom - .back - = link_to "⇧ home", root_path diff --git a/autotest/discover.rb b/autotest/discover.rb index 99ab1f6e4..76b9d2044 100644 --- a/autotest/discover.rb +++ b/autotest/discover.rb @@ -2,6 +2,5 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - Autotest.add_discovery { "rails" } Autotest.add_discovery { "rspec2" } diff --git a/config.ru b/config.ru index cb12bcfa2..0c65f5908 100644 --- a/config.ru +++ b/config.ru @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) diff --git a/config/app_config.yml b/config/app_config.yml.example similarity index 63% rename from config/app_config.yml rename to config/app_config.yml.example index a138424ee..069823a05 100644 --- a/config/app_config.yml +++ b/config/app_config.yml.example @@ -2,23 +2,21 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -development: +default: + pod_url: "http://example.org/" debug: false socket_debug : false + socket_host: 0.0.0.0 socket_port: 8080 socket_collection_name: 'websocket' pubsub_server: 'https://pubsubhubbub.appspot.com/' + mongo_host: 'localhost' + mongo_port: 27017 + +development: test: - debug: false - socket_debug : false + pod_url: "http://example.org/" socket_port: 8081 - pubsub_server: 'https://pubsubhubbub.appspot.com/' production: - debug: false - socket_debug : false - socket_port: 8080 - pubsub_server: 'https://pubsubhubbub.appspot.com/' diff --git a/config/application.rb b/config/application.rb index b409f91d3..59b82e216 100644 --- a/config/application.rb +++ b/config/application.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - require File.expand_path('../boot', __FILE__) require 'action_controller/railtie' @@ -13,7 +11,7 @@ require 'active_resource/railtie' # you've limited to :test, :development, or :production. Bundler.require(:default, Rails.env) if defined?(Bundler) -require 'lib/mongo_mapper/bson_id' +require File.expand_path('../../lib/mongo_mapper/bson_id', __FILE__) module Diaspora class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. @@ -51,5 +49,6 @@ module Diaspora # Configure sensitive parameters which will be filtered from the log file. config.filter_parameters += [:password] + config.filter_parameters += [:xml] end end diff --git a/config/boot.rb b/config/boot.rb index faeac6742..0d0c42268 100644 --- a/config/boot.rb +++ b/config/boot.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - require 'rubygems' # Set up gems listed in the Gemfile. diff --git a/config/cucumber.yml b/config/cucumber.yml new file mode 100644 index 000000000..621a14cea --- /dev/null +++ b/config/cucumber.yml @@ -0,0 +1,8 @@ +<% +rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : "" +rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}" +std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} --strict --tags ~@wip" +%> +default: <%= std_opts %> features +wip: --tags @wip:3 --wip features +rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip diff --git a/config/deploy.rb b/config/deploy.rb index c84d25556..a4f139b9c 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - config = YAML.load_file(File.dirname(__FILE__) + '/deploy_config.yml') all = config['cross_server'] @@ -53,6 +51,16 @@ namespace :deploy do run "ln -s -f #{shared_path}/bundle #{current_path}/vendor/bundle" end + task :symlink_config do + run "touch #{shared_path}/app_config.yml" + run "ln -s -f #{shared_path}/app_config.yml #{current_path}/config/app_config.yml" + end + + task :symlink_fb_config do + run "touch #{shared_path}/fb_config.yml" + run "ln -s -f #{shared_path}/fb_config.yml #{current_path}/config/fb_config.yml" + end + task :start do start_mongo start_thin @@ -103,7 +111,6 @@ namespace :deploy do run 'gem install bundler' end - task :migrate do end end @@ -135,7 +142,7 @@ namespace :db do end task :backer_seed, :roles => :backer do - (0..10).each { |n| + (0..2).each { |n| run "curl -silent http://localhost/set_backer_number?number=#{n}", :only => {:number => n} } run "cd #{current_path} && bundle exec rake db:seed:backer --trace RAILS_ENV=#{rails_env}" @@ -145,9 +152,9 @@ namespace :db do purge backer_seed tom_seed + deploy::restart end - end -after "deploy:symlink", "deploy:symlink_images", "deploy:symlink_bundle" +after "deploy:symlink", "deploy:symlink_images", "deploy:symlink_bundle", 'deploy:symlink_config', 'deploy:symlink_fb_config' diff --git a/config/deploy_config.yml b/config/deploy_config.yml index c653b6565..55aa00f6e 100644 --- a/config/deploy_config.yml +++ b/config/deploy_config.yml @@ -2,70 +2,28 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - cross_server: deploy_to: '/usr/local/app/diaspora' user: 'root' - repo: 'git@github.com:diaspora/diaspora.git' + repo: 'git://github.com/diaspora/diaspora.git' branch: 'master' default_env: 'development' servers: tom: - url: 'tom.joindiaspora.com' backer: - - username: 'washington' - given_name: 'George' - family_name: 'Washington' - number: 0 - pin: 5072 - - username: 'adams' - given_name: 'John' - family_name: 'Adams' - number: 1 - pin: 3742 - - username: 'jefferson' - given_name: 'Thomas' - family_name: 'Jefferson' - number: 2 - pin: 7782 - - username: 'madison' - given_name: 'James' - family_name: 'Madison' - number: 3 - pin: 2691 - - username: 'monroe' - given_name: 'James' - family_name: 'Monroe' - number: 4 - pin: 6133 - - username: 'quincyadams' - given_name: 'John Quincy' - family_name: 'Adams' - number: 5 - pin: 7558 - username: 'jackson' given_name: 'Andrew' family_name: 'Jackson' - number: 6 + number: 0 pin: 8670 - - username: 'buren' - given_name: 'Martin' - family_name: 'Van Buren' - number: 7 - pin: 1559 - - username: 'harrison' - given_name: 'William Henry' - family_name: 'Harrison' - number: 8 - pin: 5404 - username: 'tyler' given_name: 'John' family_name: 'Tyler' - number: 9 + number: 1 pin: 6431 - username: 'polk' given_name: 'James K.' family_name: 'Polk' - number: 10 + number: 2 pin: 1957 diff --git a/config/environment.rb b/config/environment.rb index 385a96651..ddfc9c247 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -2,13 +2,22 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # Load the rails application require File.expand_path('../application', __FILE__) Haml::Template.options[:format] = :html5 Haml::Template.options[:escape_html] = true + +if File.exists?(File.expand_path("./config/fb_config.yml")) + # Load facebook connection application credentials + fb_config = YAML::load(File.open(File.expand_path("./config/fb_config.yml"))) + FB_API_KEY = fb_config['fb_api_key'] + FB_SECRET = fb_config['fb_secret'] + FB_APP_ID = fb_config['fb_app_id'] + HOST = fb_config['host'] + FACEBOOK = true +else + FACEBOOK = false +end # Initialize the rails application Diaspora::Application.initialize! - diff --git a/config/environments/development.rb b/config/environments/development.rb index e73a3e9d1..15d1fc2bb 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -2,8 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - -require 'lib/mongo_mapper/clear_dev_memory' +require File.expand_path('../../../lib/mongo_mapper/clear_dev_memory', __FILE__) Diaspora::Application.configure do # Settings specified here will take precedence over those in config/environment.rb diff --git a/config/environments/production.rb b/config/environments/production.rb index 3207c627d..cb13c1d1c 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - Diaspora::Application.configure do # Settings specified here will take precedence over those in config/environment.rb @@ -16,7 +15,7 @@ Diaspora::Application.configure do # Specifies the header that your server uses for sending files #config.action_dispatch.x_sendfile_header = "X-Sendfile" - + config.active_support.deprecation = :notify # For nginx: diff --git a/config/environments/test.rb b/config/environments/test.rb index 4e17d81e8..46b44db55 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - Diaspora::Application.configure do # Settings specified here will take precedence over those in config/environment.rb @@ -32,13 +31,11 @@ Diaspora::Application.configure do config.active_support.deprecation = :stderr config.threadsafe! - # Use SQL instead of Active Record's schema dumper when creating the test database. # This is necessary if your schema can't be completely dumped by the schema dumper, # like if you have constraints or database-specific column types # config.active_record.schema_format = :sql - begin require 'database_cleaner' DatabaseCleaner.strategy = :truncation diff --git a/config/fb_config.yml b/config/fb_config.yml new file mode 100644 index 000000000..4c3309fac --- /dev/null +++ b/config/fb_config.yml @@ -0,0 +1,4 @@ +fb_api_key: {dcf4e90df086cf6d3e531b31e043ff32} +fb_secret: {7fe864834726f8a5e65bc93928b99a53} +fb_app_id: {120373411325347} +host: http://localhost:3000/ diff --git a/config/fb_config.yml.example b/config/fb_config.yml.example new file mode 100644 index 000000000..5bb145316 --- /dev/null +++ b/config/fb_config.yml.example @@ -0,0 +1,4 @@ +fb_api_key: {key} +fb_secret: {secret} +fb_app_id: {app_id} +host: http://localhost:3000/ diff --git a/config/initializers/_load_app_config.rb b/config/initializers/_load_app_config.rb new file mode 100644 index 000000000..22bf14ead --- /dev/null +++ b/config/initializers/_load_app_config.rb @@ -0,0 +1,26 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +def load_config_yaml filename + YAML.load(File.read(filename)) +end + +if File.exist? "#{Rails.root}/config/app_config.yml" + all_envs = load_config_yaml "#{Rails.root}/config/app_config.yml" + all_envs = load_config_yaml "#{Rails.root}/config/app_config.yml.example" unless all_envs +else + puts "WARNING: No config/app_config.yml found! Look at config/app_config.yml.example for help." + all_envs = load_config_yaml "#{Rails.root}/config/app_config.yml.example" +end + +if all_envs[Rails.env.to_s] + APP_CONFIG = all_envs['default'].merge(all_envs[Rails.env.to_s]).symbolize_keys +else + APP_CONFIG = all_envs['default'].symbolize_keys +end + +APP_CONFIG[:terse_pod_url] = APP_CONFIG[:pod_url].gsub(/(https?:|www\.)\/\//, '') +APP_CONFIG[:terse_pod_url].chop! if APP_CONFIG[:terse_pod_url][-1, 1] == '/' + +puts "WARNING: Please modify your app_config.yml to have a proper pod_url!" if APP_CONFIG[:terse_pod_url] == "example.org" && Rails.env != :test diff --git a/config/initializers/_mongo.rb b/config/initializers/_mongo.rb index 0409d6d71..7d14315a7 100644 --- a/config/initializers/_mongo.rb +++ b/config/initializers/_mongo.rb @@ -2,13 +2,10 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. -if ENV['MONGOHQ_URL'] - MongoMapper.config = {RAILS_ENV => {'uri' => ENV['MONGOHQ_URL']}} -else - MongoMapper.connection = Mongo::Connection.new('localhost', 27017) -end +ENV['MONGODB_URL'] = ENV['MONGOHQ_URL'] || URI::Generic.build(:scheme => 'mongodb', :host => APP_CONFIG['mongo_host'], :port => APP_CONFIG['mongo_port'], :path => "/diaspora-#{Rails.env}").to_s -MongoMapper.database = "diaspora-#{Rails.env}" +MongoMapper.config = {RAILS_ENV => {'uri' => ENV['MONGODB_URL']}} +MongoMapper.connect RAILS_ENV if defined?(PhusionPassenger) PhusionPassenger.on_event(:starting_worker_process) do |forked| @@ -16,3 +13,4 @@ if defined?(PhusionPassenger) end end +Magent.connection = MongoMapper.connection diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb index d456f8c8b..1efed86e9 100644 --- a/config/initializers/backtrace_silencers.rb +++ b/config/initializers/backtrace_silencers.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Be sure to restart your server when you modify this file. # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 6dea937e9..b28f1be66 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - CarrierWave.configure do |config| config.storage = :file end diff --git a/config/initializers/check_session_secret.rb b/config/initializers/check_session_secret.rb new file mode 100644 index 000000000..1970c5078 --- /dev/null +++ b/config/initializers/check_session_secret.rb @@ -0,0 +1,5 @@ +unless File.exists?( File.join(Rails.root, 'config', 'initializers', 'secret_token.rb')) + `rake generate:secret_token` + require File.join(Rails.root, 'config', 'initializers', 'secret_token.rb') +end + diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 9f483a8bf..a02045546 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Use this hook to configure devise mailer, warden hooks and so forth. The first # four configuration values can also be set straight in your models. Devise.setup do |config| diff --git a/config/initializers/git_info.rb b/config/initializers/git_info.rb index a6d767aa4..82fc99143 100644 --- a/config/initializers/git_info.rb +++ b/config/initializers/git_info.rb @@ -2,5 +2,4 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - -GIT_INFO = `git show` +GIT_INFO = `git show --name-only` diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb index 3171994ee..0e4097c04 100644 --- a/config/initializers/inflections.rb +++ b/config/initializers/inflections.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Be sure to restart your server when you modify this file. # Add new inflection rules using the following format diff --git a/config/initializers/load_app_config.rb b/config/initializers/load_app_config.rb deleted file mode 100644 index 1a5094d9b..000000000 --- a/config/initializers/load_app_config.rb +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - -raw_config = File.read("#{Rails.root}/config/app_config.yml") -APP_CONFIG = YAML.load(raw_config)[Rails.env].symbolize_keys diff --git a/config/initializers/locale.rb b/config/initializers/locale.rb index 42f34a3a7..823179842 100644 --- a/config/initializers/locale.rb +++ b/config/initializers/locale.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. -I18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] -I18n.default_locale = :en \ No newline at end of file +I18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] +I18n.default_locale = :en diff --git a/config/initializers/logging.rb b/config/initializers/logging.rb index 86abdbea3..48cc2fa30 100644 --- a/config/initializers/logging.rb +++ b/config/initializers/logging.rb @@ -2,6 +2,5 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - Rails.logger = Logger.new( Rails.root.join("log",Rails.env + ".log"),3,5*1024*1024) diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb index a5a89433a..77424db27 100644 --- a/config/initializers/mime_types.rb +++ b/config/initializers/mime_types.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Be sure to restart your server when you modify this file. # Add new mime types for use in respond_to blocks: diff --git a/config/initializers/rspec_generator.rb b/config/initializers/rspec_generator.rb index caf2be23a..bdec44a03 100644 --- a/config/initializers/rspec_generator.rb +++ b/config/initializers/rspec_generator.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - Diaspora::Application.configure do config.generators do |g| g.integration_tool :rspec diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index c61c96d33..66c59261a 100644 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -2,11 +2,10 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Be sure to restart your server when you modify this file. # Your secret key for verifying the integrity of signed cookies. # If you change this key, all old signed cookies will become invalid! # Make sure the secret is at least 30 characters and all random, # no regular words or you'll be exposed to dictionary attacks. -Rails.application.config.secret_token = 'ea08916110cae7f10fe9e1f7c7cb8c1fee13c3c3bee35180ac3061c370bd9ad985f28fcf2eb5f5684d0d618855efdeb862918628e994ed3e7fc806777428ef40' +Rails.application.config.secret_token = '3484b78b0f9d88f40cd44a20cf647140e5900632d0c9b85e1fd91dc539811d243f2f0756f791019c' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index de79a36eb..f4e36ea89 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Be sure to restart your server when you modify this file. Rails.application.config.session_store :cookie_store, :key => '_diaspora_session' diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml deleted file mode 100644 index 09d3ac62c..000000000 --- a/config/locales/devise.en.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - -en: - errors: - messages: - not_found: "not found" - already_confirmed: "was already confirmed" - not_locked: "was not locked" - - devise: - failure: - unauthenticated: 'You need to sign in or sign up before continuing.' - unconfirmed: 'You have to confirm your account before continuing.' - locked: 'Your account is locked.' - invalid: 'Invalid email or password.' - invalid_token: 'Invalid authentication token.' - timeout: 'Your session expired, please sign in again to continue.' - inactive: 'Your account was not activated yet.' - sessions: - signed_in: 'Signed in successfully.' - signed_out: 'Signed out successfully.' - passwords: - send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.' - updated: 'Your password was changed successfully. You are now signed in.' - confirmations: - send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.' - confirmed: 'Your account was successfully confirmed. You are now signed in.' - registrations: - signed_up: 'You have signed up successfully. If enabled, a confirmation was sent to your e-mail.' - updated: 'You updated your account successfully.' - destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.' - unlocks: - send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.' - unlocked: 'Your account was successfully unlocked. You are now signed in.' - mailer: - confirmation_instructions: 'Confirmation instructions' - reset_password_instructions: 'Reset password instructions' - unlock_instructions: 'Unlock Instructions' diff --git a/config/locales/devise/devise.ar.yml b/config/locales/devise/devise.ar.yml new file mode 100644 index 000000000..2b555cb5f --- /dev/null +++ b/config/locales/devise/devise.ar.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +ar: + errors: + messages: + not_found: "لم يتم العثور على" + already_confirmed: "وقد أكد بالفعل" + not_locked: "لم يكن مغلق" + + devise: + failure: + unauthenticated: ".تحتاج إلى تسجيل الدخول أو قم بالتسجيل قبل الشروع في الاستمرار" + unconfirmed: ".لديك لتأكيد الحساب الخاص بك قبل المتابعة" + locked: ".مؤمن حسابك" + invalid: ".بريد إلكتروني غير صالح أو كلمة المرور" + invalid_token: ".المصادقة غير صالح الرمز المميز" + timeout: ".انتهت الدورة الخاصة بك ، الرجاء تسجيل الدخول مرة أخرى للمتابعة" + inactive: ".ولم يتم تفعيل حسابك بعد" + sessions: + signed_in: ".وقعت في بنجاح" + signed_out: ".بتسجيل الخروج بنجاح" + passwords: + send_instructions: ".سوف تتلقى رسالة بريد إلكتروني مع تعليمات حول كيفية إعادة تعيين كلمة السر الخاصة بك في بضع دقائق" + updated: ".تم تغيير كلمة السر الخاصة بك بنجاح. وقعت الآن دخولك" + confirmations: + send_instructions: ".سوف تتلقى رسالة بريد إلكتروني مع تعليمات حول كيفية تأكيد الحساب الخاص بك في بضع دقائق" + confirmed: ".وأكد حسابك بنجاح. وقعت الآن دخولك" + registrations: + signed_up: ".لقد قمت بتسجيل بنجاح. إذا مكن، وجهت رسالة تأكيد إلى البريد الإلكتروني الخاص بك" + updated: ".قمت بتحديث حسابك بنجاح" + destroyed: ".وداعا! تم إلغاء حسابك بنجاح. ونأمل أن نراكم مرة أخرى قريبا" + unlocks: + send_instructions: ".سوف تتلقى رسالة بريد إلكتروني مع تعليمات حول كيفية فتح حساب في بضع دقائق" + unlocked: ".كان حسابك مقفلة بنجاح. وقعت الآن دخولك" + mailer: + confirmation_instructions: "تأكيد تعليمات" + reset_password_instructions: "تعليمات إعادة تعيين كلمة المرور" + unlock_instructions: "فتح التعليمات" diff --git a/config/locales/devise/devise.cs.yml b/config/locales/devise/devise.cs.yml new file mode 100644 index 000000000..26ff8044d --- /dev/null +++ b/config/locales/devise/devise.cs.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +cs: + errors: + messages: + not_found: "nenalezeno" + already_confirmed: "již bylo potvrzeno" + not_locked: "nebylo zamčeno" + + devise: + failure: + unauthenticated: 'Pro pokračování se musíte přihlásit nebo si vytvořit účet.' + unconfirmed: 'Před pokračováním musíte potvrdit svůj účet.' + locked: 'Váš účet je uzamčen.' + invalid: 'Neplatný email nebo heslo.' + invalid_token: 'Neplatný autentizační token.' + timeout: 'Vaše sezení vypršelo, pro pokračování se prosím přihlašte znovu.' + inactive: 'Váš účet ještě nebyl aktivován.' + sessions: + signed_in: 'Přihlášení proběhlo úspěšně.' + signed_out: 'Odhlášení proběhlo úspěšně.' + passwords: + send_instructions: 'Běhěm několika minut obdržíte email s instrukcemi k resetnutí hesla.' + updated: 'Vaše heslo bylo úspěšně změněno. Nyní jste přihlášeni' + confirmations: + send_instructions: 'Během několika minut obdržíte email s instrukcemi k potvrzení vašeho účtu.' + confirmed: 'Váš účet byl uspěšně potvrzen. Nyní jste přihlášeni.' + registrations: + signed_up: 'Úspěšně jste vytvořili účet. Pokud je tak server nastaven, byl vám zaslán potvrzovací email.' + updated: 'Úspěšně jste upravili svůj účet.' + destroyed: 'Sbohem! Váš účet byl úspěšně zrušen. Brzy naviděnou.' + unlocks: + send_instructions: 'Během několika minut obdržíte email s instrukcemi k odemknutí vašeho účtu.' + unlocked: 'Váš účet byl úspěšně odemknut. Nyní jste přihlášeni.' + mailer: + confirmation_instructions: 'Instrukce k potvrzení' + reset_password_instructions: 'Instrukce k resetnutí hesla' + unlock_instructions: 'Instrukce k odemčení' diff --git a/config/locales/devise/devise.cy.yml b/config/locales/devise/devise.cy.yml new file mode 100644 index 000000000..d8b6d94f4 --- /dev/null +++ b/config/locales/devise/devise.cy.yml @@ -0,0 +1,41 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +cy: + errors: + messages: + not_found: "ni chanfuwyd" + already_confirmed: "cadarnhawyd eisioes" + not_locked: "heb ei gloi" + + devise: + failure: + unauthenticated: "Mae angen i chi arwyddo i mewn neu ymuno cyn parhau." + unconfirmed: "Rhaid i chi gadarnhau eich cyfrif cyn parhau." + locked: "Mae eich cyfrif wedi'i gloi." + invalid: "E-bost neu gyfrinair annilys." + invalid_token: "Tocyn dilysu annilys." + timeout: "Mae eich sesiwn wedi dod i ben, arwyddwch i mewn eto i barhau." + inactive: "Nid yw eich cyfrif wedi'i actifadu." + sessions: + signed_in: "Arwyddwyd i fewn yn llwyddiannus." + signed_out: "Arwyddwyd allan yn llwyddiannus." + passwords: + send_instructions: "Byddwch yn derbyn e-bost â chyfarwyddiadau ar sut i gadarnhau eich cyfrif mewn ychydig funudau." + updated: "Newidiwyd eich cyfrinair yn llwyddiannus. Rydych chi wedi arwyddo i fewn." + confirmations: + send_instructions: "Byddwch yn derbyn e-bost â chyfarwyddiadau ar sut i gadarnhau eich cyfrif mewn ychydig funudau." + confirmed: "Cadarnhawyd eich cyfrif yn llwyddiannus. Rydych chi wedi arwyddo i fewn." + registrations: + signed_up: "Rydych chi wedi arwyddo i fyny yn llwyddiannus. Anfonwyd cadarnhad at eich e-bost os yw wedi'i alluogi." + updated: "Diweddarwyd eich cyfrif yn llwyddiannus." + destroyed: "Hwyl fawr! Canslwyd eich cyfrif yn llwyddiannus. Rydym yn gobeithio gweld chi eto yn fuan." + unlocks: + send_instructions: "Byddwch yn derbyn e-bost gyda cyfarwyddiadau ar sut i agor eich cyfrif mewn ychydig funudau." + unlocked: "Datglowyd eich cyfrif yn llwyddiannus. Rydych chi wedi arwyddo i fewn." + mailer: + confirmation_instructions: "Cyfarwyddiadau cadarnhad." + reset_password_instructions: "Ailosod cyfarwyddiadau cyfrinair" + unlock_instructions: "Cyfarwyddiadau Datgloi" + diff --git a/config/locales/devise/devise.de.yml b/config/locales/devise/devise.de.yml new file mode 100644 index 000000000..e6608c181 --- /dev/null +++ b/config/locales/devise/devise.de.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +de: + errors: + messages: + not_found: "nicht gefunden" + already_confirmed: "wurde bereits bestätigt" + not_locked: "war nicht gesperrt" + + devise: + failure: + unauthenticated: "Du musst dich anmelden oder registrieren um fortzufahren." + unconfirmed: "Du musst dein Konto bestätigen um fortzufahren." + locked: "Dein Konto ist gesperrt." + invalid: "Ungültige E-Mail-Adresse oder Passwort." + invalid_token: "Ungültiger Authentifizierungstoken." + timeout: "Deine Sitzung ist abgelaufen, bitte melde dich erneut an um fortzufahren." + inactive: "Dein Konto wurde noch nicht aktiviert." + sessions: + signed_in: "Erfolgreich angemeldet." + signed_out: "Erfolgreich abgemeldet." + passwords: + send_instructions: "Du wirst in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie du dein Passwort zurücksetzt." + updated: "Dein Passwort wurde erfolgreich geändert. Du bist nun angemeldet." + confirmations: + send_instructions: "Du wirst in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie du dein Konto bestätigst." + confirmed: "Dein Konto wurde erfolgreich bestätigt. Du bist nun angemeldet." + registrations: + signed_up: "Du hast dich erfolgreich registriert. Sofern aktiviert, wurde dir eine Bestätigung per E-Mail gesendet." + updated: "Dein Konto wurde aktualisiert." + destroyed: "Tschüss! Dein Konto wurde erfolgreich gekündigt. Wir hoffen dich bald wiederzusehen." + unlocks: + send_instructions: "Du wirst in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie du dein Konto entsperren kannst." + unlocked: "Dein Konto wurde erfolgreich entsperrt. Du bist nun angemeldet." + mailer: + confirmation_instructions: "Instruktionen zur Bestätigung" + reset_password_instructions: "Instruktionen zum Zurücksetzen des Passworts" + unlock_instructions: "Instruktionen zum Entsperren" diff --git a/config/locales/devise/devise.en.yml b/config/locales/devise/devise.en.yml new file mode 100644 index 000000000..7ab686bd4 --- /dev/null +++ b/config/locales/devise/devise.en.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +en: + errors: + messages: + not_found: "not found" + already_confirmed: "was already confirmed" + not_locked: "was not locked" + + devise: + failure: + unauthenticated: "You need to sign in or sign up before continuing." + unconfirmed: "You have to confirm your account before continuing." + locked: "Your account is locked." + invalid: "Invalid email or password." + invalid_token: "Invalid authentication token." + timeout: "Your session expired, please sign in again to continue." + inactive: "Your account was not activated yet." + sessions: + signed_in: "Signed in successfully." + signed_out: "Signed out successfully." + passwords: + send_instructions: "You will receive an email with instructions about how to reset your password in a few minutes." + updated: "Your password was changed successfully. You are now signed in." + confirmations: + send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes." + confirmed: "Your account was successfully confirmed. You are now signed in." + registrations: + signed_up: "You have signed up successfully. If enabled, a confirmation was sent to your e-mail." + updated: "You updated your account successfully." + destroyed: "Bye! Your account was successfully cancelled. We hope to see you again soon." + unlocks: + send_instructions: "You will receive an email with instructions about how to unlock your account in a few minutes." + unlocked: "Your account was successfully unlocked. You are now signed in." + mailer: + confirmation_instructions: "Confirmation instructions" + reset_password_instructions: "Reset password instructions" + unlock_instructions: "Unlock Instructions" diff --git a/config/locales/devise.es.yml b/config/locales/devise/devise.es.yml similarity index 92% rename from config/locales/devise.es.yml rename to config/locales/devise/devise.es.yml index 70209ff79..06002aa63 100644 --- a/config/locales/devise.es.yml +++ b/config/locales/devise/devise.es.yml @@ -18,10 +18,10 @@ es: signed_in: 'Has ingresado correctamente.' signed_out: 'Has salido correctamente.' passwords: - send_instructions: 'Recibirás un email con instrucciones para cambiar tu contraseña en poco minutos.' + send_instructions: 'Recibirás un email con instrucciones para cambiar tu contraseña en pocos minutos.' updated: 'Tu contraseña ha sido modificada. Ya has accedido a tu cuenta.' confirmations: - send_instructions: 'Recibirás un email con instrucciones para confirmar tu cuenta en poco minutos.' + send_instructions: 'Recibirás un email con instrucciones para confirmar tu cuenta en pocos minutos.' confirmed: 'Tu cuenta ha sido confirmada. Ya has accedido a tu cuenta.' registrations: signed_up: 'Te has registrado correctamente. Si está disponible, te habremos enviado un email de confirmación.' diff --git a/config/locales/devise/devise.fi.yml b/config/locales/devise/devise.fi.yml new file mode 100644 index 000000000..c77ead4b2 --- /dev/null +++ b/config/locales/devise/devise.fi.yml @@ -0,0 +1,41 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. +# Translator: jarkko moilanen, jm60697@gmail.com + +fi: + errors: + messages: + not_found: "ei löytynyt" + already_confirmed: "oli jo varmistettu" + not_locked: "ei ollut lukittu" + + devise: + failure: + unauthenticated: 'Kirjaudu tai rekisteröidy ennen kuin voit jatkaa.' + unconfirmed: 'Sinun täytyy vahvistaa käyttäjätilisi ennen kuin voit jatkaa' + locked: 'Käyttäjätilisi on lukittu.' + invalid: 'Väärä sähköpostiosoite tai salasana.' + invalid_token: 'Viallinen todennus.' + timeout: 'Istunto on vanhentunut, kirjaudu uudelleen.' + inactive: 'Käyttätiliäsi ei ole vielä vahvistettu.' + sessions: + signed_in: 'Sisäänkirjautuminen onnistui.' + signed_out: 'Uloskirjautuminen onnistui.' + passwords: + send_instructions: 'Saat hetken päästä sähköpostiisi ohjeet siitä miten määrität salasanasi uudelleen.' + updated: 'Salasanasi on vaihdettu. Olet nyt kirjautunut sisään.' + confirmations: + send_instructions: 'Saat hetken päästä sähköpostiisi ohjeet siitä miten vahvistat käyttäjätilisi luonnin.' + confirmed: 'Käyttäjätilisi luonti on vahvistettu. Olet nyt kirjautunut sisään.' + registrations: + signed_up: 'Käyttäjätilin luominen onnistui. Mahdollinen vahvistuspyyntö on lähetetty sähköpostiisi.' + updated: 'Käyttäjätilisi on päivitetty.' + destroyed: 'Näkemiin! Käyttäjätilisi on poistettu. Toivottavasti näemme sinut pian uudelleen.' + unlocks: + send_instructions: 'Saat muutaman minuutin kuluttua sähköpostiisi ohjeet siitä miten avaat lukituksen.' + unlocked: 'Käyttäjätilisi lukitus on avattu. Olet nyt kirjautunut sisään.' + mailer: + confirmation_instructions: 'Ohjeet vahvistamiseen/todentamiseen' + reset_password_instructions: 'Ohjeet salananan uudelleenmäärittämiseksi' + unlock_instructions: 'Ohjeet lukituksen poistamiseksi' diff --git a/config/locales/devise/devise.fr-informal.yml b/config/locales/devise/devise.fr-informal.yml new file mode 100644 index 000000000..6fe14382e --- /dev/null +++ b/config/locales/devise/devise.fr-informal.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +fr-informal: + errors: + messages: + not_found: "introuvable" + already_confirmed: "a déjà été confirmé" + not_locked: "n’a pas été verrouillé" + + devise: + failure: + unauthenticated: 'Tu dois te connecter ou t’inscrire avant de continuer.' + unconfirmed: 'Tu dois confirmer ton compte avant de continuer.' + locked: 'Ton compte est verrouillé.' + invalid: 'Adresse e-mail ou mot de passe invalide.' + invalid_token: 'Jeton d’authentification invalide.' + timeout: 'Ta session a expiré, merci de te connecter de nouveau afin de continuer.' + inactive: 'Ton compte n’a pas encore été activé.' + sessions: + signed_in: 'Connecté avec succès.' + signed_out: 'Déconnecté avec succès.' + passwords: + send_instructions: 'Tu vas recevoir dans quelques minutes un e-mail contenant des instructions t’expliquant comment réinitialiser ton mot de passe.' + updated: 'Ton mot de passe a été modifié avec succès. Tu es à présent connecté.' + confirmations: + send_instructions: 'Tu vas recevoir dans quelques minutes un e-mail contenant des instructions t’expliquant comment confirmer ton compte.' + confirmed: 'Ton compte a été confirmé avec succès. Tu es à présent connecté.' + registrations: + signed_up: 'Tu t’es inscrit avec succès. Si activée, une confirmation a été envoyée sur ton adresse e-mail.' + updated: 'Tu as mis à jour ton compte avec succès.' + destroyed: 'Au revoir ! Ton compte a été résilié avec succès. Nous espérons te revoir très bientôt.' + unlocks: + send_instructions: 'Tu vas recevoir dans quelques minutes un e-mail contenant des instructions t’expliquant comment déverrouiller ton compte.' + unlocked: 'Ton compte a été déverrouillé avec succès. Tu es à présent connecté.' + mailer: + confirmation_instructions: 'Instructions de confirmation' + reset_password_instructions: 'Réinitialiser les instructions du mot de passe' + unlock_instructions: 'Instructions de déverrouillage' diff --git a/config/locales/devise/devise.fr.yml b/config/locales/devise/devise.fr.yml new file mode 100644 index 000000000..240e9d967 --- /dev/null +++ b/config/locales/devise/devise.fr.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +fr: + errors: + messages: + not_found: "introuvable" + already_confirmed: "a déjà été confirmé" + not_locked: "n’a pas été verrouillé" + + devise: + failure: + unauthenticated: 'Vous devez vous connecter ou vous inscrire avant de continuer.' + unconfirmed: 'Vous devez confirmer votre compte avant de continuer.' + locked: 'Votre compte est verrouillé.' + invalid: 'E-mail ou mot de passe invalide.' + invalid_token: 'Jeton d’authentification invalide.' + timeout: 'Votre session a expiré, veuillez vous connecter de nouveau afin de continuer.' + inactive: 'Votre compte n’a pas encore été activé.' + sessions: + signed_in: 'Connecté avec succès.' + signed_out: 'Déconnecté avec succès.' + passwords: + send_instructions: 'Vous allez recevoir dans quelques minutes un e-mail contenant des instructions vous expliquant comment réinitialiser votre mot de passe.' + updated: 'Votre mot de passe a été modifié avec succès. Vous êtes à présent connecté.' + confirmations: + send_instructions: 'Vous allez recevoir dans quelques minutes un e-mail contenant des instructions vous expliquant comment confirmer votre compte.' + confirmed: 'Votre compte a été confirmé avec succès. Vous êtes à présent connecté.' + registrations: + signed_up: 'Vous vous êtes inscrit avec succès. Si activée, une confirmation a été envoyée sur votre adresse e-mail.' + updated: 'Vous avez mis à jour votre compte avec succès.' + destroyed: 'Au revoir ! Votre compte a été résilié avec succès. Nous espérons vous revoir très bientôt.' + unlocks: + send_instructions: 'Vous allez recevoir dans quelques minutes un e-mail contenant des instructions vous expliquant comment déverrouiller votre compte.' + unlocked: 'Votre compte a été déverrouillé avec succès. Vous êtes à présent connecté.' + mailer: + confirmation_instructions: 'Instructions de confirmation' + reset_password_instructions: 'Réinitialiser les instructions du mot de passe' + unlock_instructions: 'Instructions de déverrouillage' diff --git a/config/locales/devise/devise.he.yml b/config/locales/devise/devise.he.yml new file mode 100644 index 000000000..997ab6df0 --- /dev/null +++ b/config/locales/devise/devise.he.yml @@ -0,0 +1,41 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. +# Translated to Hebrew by Yaron Shahrabani , 2010. + +he: + errors: + messages: + not_found: "לא נמצא" + already_confirmed: "כבר אושר" + not_locked: "לא ננעל" + + devise: + failure: + unauthenticated: "עליך להיכנס או להירשם לפני המשך הפעילות." + unconfirmed: "עליך לאמת את חשבונך לפי המשך הפעילות." + locked: "חשבונך נעול." + invalid: "הססמה או הדוא״ל שגויים." + invalid_token: "אסימון האימות שגוי." + timeout: "ההפעלה שלך פגה, נא להיכנס שוב כדי להמשיך." + inactive: "חשבונך לא הופעל עדיין." + sessions: + signed_in: "נכנסת בהצלחה." + signed_out: "יצאת בהצלחה." + passwords: + send_instructions: "בעוד מספר דקות תתקבל לתיבת הדוא״ל שלך הודעה עם הנחיות כיצד לאפס את ססמתך." + updated: "ססמתך הוחלפה בהצלחה. נכנסת כעת." + confirmations: + send_instructions: "בעוד מספר דקות תתקבל לתיבת הדוא״ל שלך הודעה עם הנחיות כיצד לאמת את חשבונך." + confirmed: "חשבונך אומת בהצלחה. נכנסת כעת." + registrations: + signed_up: "נרשמת בהצלחה. הודעת אימות תישלח אליך לדוא״ל במידה שהוגדרה." + updated: "חשבונך עודכן בהצלחה." + destroyed: "להתראות! חשבונך בוטל בהצלחה. מקווים לראותך שוב בקרוב." + unlocks: + send_instructions: "בעוד מספר דקות תתקבל לתיבת הודא״ל שלך הודעה עם הנחיות כיצד לשחרר את חשבונך." + unlocked: "חשבונך שוחרר בהצלחה. נכנסת כעת." + mailer: + confirmation_instructions: "הנחיות לאימות" + reset_password_instructions: "הנחיות לאיפוס הססמה" + unlock_instructions: "הנחיות לשחרור" diff --git a/config/locales/devise/devise.it.yml b/config/locales/devise/devise.it.yml new file mode 100644 index 000000000..96044d191 --- /dev/null +++ b/config/locales/devise/devise.it.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +it: + errors: + messages: + not_found: "non trovato" + already_confirmed: "è già stato confermato" + not_locked: "non era bloccato" + + devise: + failure: + unauthenticated: "Devi effettuare l'accesso o registrarti prima di continuare." + unconfirmed: "Devi confermare il tuo account prima di continuare." + locked: "Il tuo account è bloccato." + invalid: "Email o password errati." + invalid_token: "Token di autenticazione errato." + timeout: "La tua sessione è scaduta, effettua di nuovo l'accesso per continuare." + inactive: "Il tuo account non è ancora stato attivato." + sessions: + signed_in: "Accesso effettuato con successo." + signed_out: "Disconnessione effettuata con successo." + passwords: + send_instructions: "Tra pochi minuti riceverai una email con le istruzioni su come cambiare la tua password." + updated: "La tua password è stata modificata. Hai appena effettuato l'accesso." + confirmations: + send_instructions: "Tra pochi minuti riceverai una email per confermare il tuo account." + confirmed: "Il tuo account è stato confermato con successo. Hai appena effettuato l'accesso." + registrations: + signed_up: "Ti sei iscritto. Se il servizio è disponibile, riceverai una conferma via email." + updated: "Hai aggiornato il tuo account." + destroyed: "Ciao! Il tuo account è stato rimosso. Speriamo che tu torni a trovarci presto." + unlocks: + send_instructions: "Tra pochi minuti riceverai una mail con le istruzioni su come sbloccare il tuo account." + unlocked: "Il tuo account è stato sbloccato. Hai appena effettuato l'accesso." + mailer: + confirmation_instructions: "Istruzioni sulla conferma" + reset_password_instructions: "Istruzioni su come cambiare la password" + unlock_instructions: "Istruzioni su come sbloccare l'account" diff --git a/config/locales/devise.lt.yml b/config/locales/devise/devise.lt.yml similarity index 99% rename from config/locales/devise.lt.yml rename to config/locales/devise/devise.lt.yml index d6e33c1cb..8ae8f027b 100644 --- a/config/locales/devise.lt.yml +++ b/config/locales/devise/devise.lt.yml @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - lt: errors: messages: diff --git a/config/locales/devise/devise.nb.yml b/config/locales/devise/devise.nb.yml new file mode 100644 index 000000000..d1e8ca2f7 --- /dev/null +++ b/config/locales/devise/devise.nb.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +no_NO: + errors: + messages: + not_found: "ble ikke funnet" + already_confirmed: "er allerede bekrefta" + not_locked: "er ikke låst" + + devise: + failure: + unauthenticated: "Du må logge inn eller lage en bruker før du kan fortsette." + unconfirmed: "Du må bekrefte brukeren din før du kan fortsette." + locked: "Brukeren din er låst." + invalid: "Ugyldig e-postadresse eller passord." + invalid_token: "Ugyldig authentication token." + timeout: "Økta har løpt ut, logg inn igjen for å fortsette." + inactive: "Brukeren din er ikke aktivert ennå." + sessions: + signed_in: "Innlogginga var vellykka." + signed_out: "Utlogginga var vellykka." + passwords: + send_instructions: "Du vil få en e-post med instrukser om hvordan du tilbakestiller passordet ditt om kort tid." + updated: "Passordet ditt er nå endra, og du har logga inn." + confirmations: + send_instructions: "Du vil få en e-post med instrukser om hvordan du bekrefter brukeren din om kort tid." + confirmed: "Brukeren din er nå bekrefta, og du er logga inn." + registrations: + signed_up: "Du har nå laga en bruker. Hvis du valgte å få en e-post med bekreftelse på dette, er den nå sendt." + updated: "Du har oppdatert brukeren din." + destroyed: "Ha det! Brukeren din er nå sagt opp. Vi håper å se deg igjen snart." + unlocks: + send_instructions: "Du vil få en e-post med instrukser om hvordan du låser opp brukeren din om kort tid." + unlocked: "Brukeren din er nå låst opp, og du er logga in." + mailer: + confirmation_instructions: "Instrukser for bekreftelse" + reset_password_instructions: "Instrukser for tilbakestilling av passord" + unlock_instructions: "Instrukser for å låse opp" diff --git a/config/locales/devise/devise.pl.yml b/config/locales/devise/devise.pl.yml new file mode 100644 index 000000000..503fb6d61 --- /dev/null +++ b/config/locales/devise/devise.pl.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +pl: + errors: + messages: + not_found: "nie znaleziono" + already_confirmed: "potwierdzono wcześniej" + not_locked: "nie był zablokowany" + + devise: + failure: + unauthenticated: 'By kontynuować musisz się zalogować lub zarejestrować.' + unconfirmed: 'Musisz aktywować swoje konto.' + locked: 'Twoje konto jest zablokowane.' + invalid: 'Nieprawidłowy adres email lub hasło.' + invalid_token: 'Nieprawidłowy kod identyfikacyjny.' + timeout: 'Twoja sesja wygasła, zaloguj się ponownie by kontynuować.' + inactive: 'Twoje konto nie zostało jeszcze aktywowane.' + sessions: + signed_in: 'Zalogowano pomyślnie.' + signed_out: 'Wylogowano.' + passwords: + send_instructions: 'W ciągu kilku minut otrzymasz maila zawierającego instrukcjie dotyczące zresetowania hasła.' + updated: 'Twoje hasło zostało zmienione, zostałeś zalogowany.' + confirmations: + send_instructions: 'W ciągu kilku minut otrzymasz maila zawierającego instrukcje dotyczące aktywacji konta.' + confirmed: 'Twoje konto zostało aktywowane, zostałeś zalogowany.' + registrations: + signed_up: 'Zostałeś zarejestrowany. Jeśli aktywowano odpowiednią opcję, wyślemy do Ciebie email potwierdzający rejestrację.' + updated: 'Pomyślnie zaktualizowano informacje o Twoim koncie.' + destroyed: 'Żegnaj! Twoje konto zostało usunięte.' + unlocks: + send_instructions: 'W ciągu kilku minut otrzymasz email z instrukcjami odblokowania konta.' + unlocked: 'Twoje konto zostało odblokowane, jesteś zalogowany.' + mailer: + confirmation_instructions: 'Instrukcje aktywacji' + reset_password_instructions: 'Instrukcje zmiany hasła' + unlock_instructions: 'Instrukcje odblokowania' diff --git a/config/locales/devise/devise.pt-BR.yml b/config/locales/devise/devise.pt-BR.yml new file mode 100644 index 000000000..5a39a4734 --- /dev/null +++ b/config/locales/devise/devise.pt-BR.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +pt-BR: + errors: + messages: + not_found: "não encontrado" + already_confirmed: "já foi confirmado" + not_locked: "não foi bloqueado" + + devise: + failure: + unauthenticated: 'Você precisa fazer login ou se cadastrar antes de continuar.' + unconfirmed: 'Você tem que confirmar a sua conta antes de continuar.' + locked: 'Sua conta está bloqueada.' + invalid: 'E-mail ou senha inválida.' + invalid_token: 'Token de autenticação inválida.' + timeout: 'Sua sessão expirou, por favor logue-se novamente para continuar.' + inactive: 'Sua conta ainda não foi ativada.' + sessions: + signed_in: 'Você entrou com sucesso.' + signed_out: 'Você saiu com sucesso.' + passwords: + send_instructions: 'Você receberá um email com instruções sobre como redefinir sua senha em alguns minutos.' + updated: 'Sua senha foi alterada com sucesso.' + confirmations: + send_instructions: 'Você receberá um email em alguns minutos com as instruções sobre como confirmar a sua conta.' + confirmed: 'Sua conta foi confirmada com sucesso. Você já pode continuar navegando.' + registrations: + signed_up: 'Você se inscreveu com êxito. Se habilitado, a confirmação foi enviada para seu e-mail.' + updated: 'Você atualizou a sua conta com sucesso.' + destroyed: 'Sua conta foi cancelada com sucesso. Esperamos vê-lo novamente em breve.' + unlocks: + send_instructions: 'Você receberá um email em alguns minutos com as instruções sobre como desbloquear a sua conta.' + unlocked: 'Sua conta foi desbloqueada com sucesso. Você já pode continuar navegando.' + mailer: + confirmation_instructions: 'Instruções para confirmarção' + reset_password_instructions: 'Instruções para redefinir a senha' + unlock_instructions: 'Instruções para o desbloqueio' diff --git a/config/locales/devise/devise.pt-PT.yml b/config/locales/devise/devise.pt-PT.yml new file mode 100644 index 000000000..c0c955517 --- /dev/null +++ b/config/locales/devise/devise.pt-PT.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +pt-PT: + errors: + messages: + not_found: "não foi encontrado" + already_confirmed: "já foi confirmado" + not_locked: "não foi bloqueado" + + devise: + failure: + unauthenticated: 'Faça login ou registre-se antes de continuar.' + unconfirmed: 'Confirme a sua conta antes de continuar.' + locked: 'A sua conta foi bloqueada.' + invalid: 'Endereço de correio ou senha inválida.' + invalid_token: 'Token de autenticação inválido.' + timeout: 'A sua sessão expirou, por favor faça login novamente para continuar.' + inactive: 'A sua conta ainda não foi activada.' + sessions: + signed_in: 'Login com sucesso.' + signed_out: 'Logout com sucesso.' + passwords: + send_instructions: 'Vai receber um email com instruções sobre como alterar a sua senha dentro de alguns minutos.' + updated: 'A sua senha foi alterada com sucesso. Está on-line.' + confirmations: + send_instructions: 'Vai receber um email com instruções sobre como confirmar a sua conta dentro de alguns minutos.' + confirmed: 'A sua conta foi confirmada com sucesso. Está on-line.' + registrations: + signed_up: 'Registou-se com sucesso. Se ligado, a confirmação foi enviada para o seu email.' + updated: 'Actualizou a sua conta com sucesso.' + destroyed: 'Adeus! A sua conta foi cancelada com sucesso. Esperamos vê-lo de novo brevemente.' + unlocks: + send_instructions: 'Vai receber uma mensagem sobre como desbloquear a sua conta dentro de alguns minutos.' + unlocked: 'A sua conta foi desbloqueada com sucesso. Está on-line.' + mailer: + confirmation_instructions: 'Instruções de confirmação' + reset_password_instructions: 'Instruções para alterar a sua senha' + unlock_instructions: 'Instruções para desbloquear' diff --git a/config/locales/devise/devise.ro.yml b/config/locales/devise/devise.ro.yml new file mode 100644 index 000000000..b4d12e6b6 --- /dev/null +++ b/config/locales/devise/devise.ro.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +ro: + errors: + messages: + not_found: "inexistent" + already_confirmed: "a fost deja confirmat" + not_locked: "nu a fost blocat" + + devise: + failure: + unauthenticated: 'Pentru a continuna, înregistrați-vă.' + unconfirmed: 'Pentru a continua, confirmați contul dvs.' + locked: 'Contul dvs. este blocat.' + invalid: 'Email sau parolă incorectă.' + invalid_token: 'Cheie de autentificare invalidă.' + timeout: 'Sesiunea dvs. a expirat, autentificați-vă din nou pentru a continua.' + inactive: 'Contul dvs. încă nu a fost activat.' + sessions: + signed_in: 'Autentificare cu succes.' + signed_out: 'Deconectare cu succes.' + passwords: + send_instructions: 'În scurt timp veți primi un email cu instrucțiuni pentru resetarea parolei.' + updated: 'Parolă schimbată cu success. Sunteți acum autentificat(ă).' + confirmations: + send_instructions: 'În scurt timp veți primi un email cu instrucțiuni pentru confirmarea contului.' + confirmed: 'Contul dvs. a fost confirmat cu succes. Sunteți acum autentificat(ă).' + registrations: + signed_up: 'Sunteți autentificat(ă). Dacă este cazul, un mesaj de confirmare a fost trimis pe email-ul dvs.' + updated: 'Cont actualizat cu succes.' + destroyed: 'Pa! Contul dvs. a fost dezactivat cu succes. Sperăm să vă revedem în curând.' + unlocks: + send_instructions: 'În scurt timp veți primi un email cu instrucțiuni pentru deblocarea contului.' + unlocked: 'Cont deblocat cu succes. Sunteți acum autentificat(ă).' + mailer: + confirmation_instructions: 'Instrucțiuni pentru confirmarea contului.' + reset_password_instructions: 'Instrucțiuni pentru resetarea parolei.' + unlock_instructions: 'Instrucțiuni pentru deblocare contului.' diff --git a/config/locales/devise/devise.ru.yml b/config/locales/devise/devise.ru.yml new file mode 100644 index 000000000..1ac626861 --- /dev/null +++ b/config/locales/devise/devise.ru.yml @@ -0,0 +1,40 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +ru: + errors: + messages: + not_found: "не найден(о)" + already_confirmed: "уже подтвержден(о)" + not_locked: "не заблокирован(о)" + + devise: + failure: + unauthenticated: 'Вам нужно войти либо зарегистрироваться, чтобы продолжить.' + unconfirmed: 'Вам нужно подтвердить вашу учётную запись, чтобы продолжить.' + locked: 'Ваша учётная запись заблокирована.' + invalid: 'Неверный e-mail или пароль.' + invalid_token: 'Неверный ключ аутентификации.' + timeout: 'Срок вашего сеанса истёк, пожалуйста, войдите в систему снова.' + inactive: 'Ваша учётная запись ещё не активирована.' + sessions: + signed_in: 'Вход в систему выполнен успешно.' + signed_out: 'Выход из системы выполнен успешно.' + passwords: + send_instructions: 'Вы получите e-mail с указаниями по сбросу пароля в течение нескольких минут.' + updated: 'Ваш пароль был изменён. Вы вошли в систему.' + confirmations: + send_instructions: 'Вы получите e-mail с указаниями по подтверждению учётной записи в течение нескольких минут.' + confirmed: 'Ваша учётная запись была подтверждена. Вы вошли в систему.' + registrations: + signed_up: 'Регистрация выполнена успешно. В зависимости от настроек, вам может прийти e-mail с подтверждением.' + updated: 'Обновление вашей учётной записи выполнено успешно.' + destroyed: 'До свидания! Ваша учётная запись была удалена. Надеемся, что вскоре вас увидим снова.' + unlocks: + send_instructions: 'Вы получите e-mail с указаниями по разблокированию учётной записи в течение нескольких минут.' + unlocked: 'Ваша учётная запись была разблокирована. Вы вошли в систему.' + mailer: + confirmation_instructions: 'Подтверждение учётной записи' + reset_password_instructions: 'Сброс пароля' + unlock_instructions: 'Разблокирование учётной записи' diff --git a/config/locales/devise/devise.sv.yml b/config/locales/devise/devise.sv.yml new file mode 100644 index 000000000..c83179bde --- /dev/null +++ b/config/locales/devise/devise.sv.yml @@ -0,0 +1,39 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +sv: + errors: + messages: + not_found: "kan ej hitta" + not_locked: "var ej låst" + + devise: + failure: + unauthenticated: 'Du måste logga in innan du kan fortsätta.' + unconfirmed: 'Du måste verifiera ditt konto innan du kan fortsätta.' + locked: 'Ditt konto är låst.' + invalid: 'Felaktig användare eller lösenord.' + invalid_token: 'Ogiltig identifiering.' + timeout: 'Din session är avslutad, var vänlig logga in igen.' + inactive: 'Ditt konto är inte aktiverat.' + sessions: + signed_in: 'Inloggning ok.' + signed_out: 'Utloggning ok.' + passwords: + send_instructions: 'Du kommer att få ett ebrev med instruktioner för att återställa lösenordet inom några minuter.' + updated: 'Ditt lösenord har ändrats och du är inloggad.' + confirmations: + send_instructions: 'Du kommer att få ett ebrev med instruktioner för att verifiera ditt konto inom några minuter.' + confirmed: 'Ditt konto har verifierats och du är inloggad.' + registrations: + signed_up: 'Du har skapat ett konto. Beroende på inställningar kan ett ebrev ha skickats till dig.' + updated: 'Ditt konto har uppdateras.' + destroyed: 'Ditt konto är avslutat. Välkommen åter!' + unlocks: + send_instructions: 'Du kommer att få ett ebrev med instruktioner för att låsa upp ditt konto inom några minuter.' + unlocked: 'Ditt konto har är nu upplåst och du är inloggad' + mailer: + confirmation_instructions: 'Instruktioner för att verifiera ditt konto.' + reset_password_instructions: 'Instruktioner för att terställa ditt lösenord.' + unlock_instructions: 'Instruktioner för att låsa upp ditt konto.' diff --git a/config/locales/diaspora/ar.yml b/config/locales/diaspora/ar.yml new file mode 100644 index 000000000..cddf87706 --- /dev/null +++ b/config/locales/diaspora/ar.yml @@ -0,0 +1,206 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for Arabic. + +ar: + hello: "مرحبا العالم" + application: + helper: + unknown_person: "غير معروف شخص" + new_requests: "طلبات جديدة" + dashboards: + helper: + home: "منزل" + error_messages: + helper: + invalid_fields: "الحقول غير صالحة" + correct_the_following_errors_and_try_again: ".تصحيح الأخطاء التالية وحاول مرة أخرى" + people: + helper: + results_for: "%{params} نتائج " + people_on_pod_are_aware_of: "الناس في جراب على علم " + layouts: + application: + edit_profile: "تعديل الملف الشخصي" + logout: "خروج" + shared: + aspect_nav: + all_aspects: "جميع الجوانب" + manage: "نجح" + manage_your_aspects: "إدارة جوانب الخاص" + sub_header: + all_aspects: "جميع الجوانب" + manage_aspects: "إدارة الجوانب" + publisher: + share: "تقاسم" + aspect_friends: + add_friends: "أضف أصدقاء" + albums: + album: + you: "أنت" + new_album: + create: "خلق" + add_a_new_album: "إضافة ألبوم جديد" + show: + edit_album: "تعديل الألبوم" + albums: "البومات" + updated: "تحديث" + by: "بواسطة" + edit: + editing: "التحرير" + updated: "تحديث" + are_you_sure: "هل أنت متأكد؟" + delete_album: "حذف ألبوم" + cancel: "إلغاء" + index: + home: "منزل" + new_album: "ألبوم جديد" + create: + success: ".ألبوما %{name} لقد قمت دعا" + update: + success: ".تحرير بنجاح %{name} الألبوم" + failure: ".%{name} فشلت في تحرير ألبوم" + destroy: + success: ".حذفها %{name} الألبوم" + helper: + friends_albums: "أصدقاء البومات" + your_albums: "البومات الخاص" + aspects: + index: + photos: "صور" + show: + photos: "صور" + manage: + add_a_new_aspect: "أضف جانبا جديدا" + add_a_new_friend: "إضافة صديق جديد" + show: "عرض" + update_aspects: "تحديث الجوانب" + requests: "طلبات" + ignore_remove: "تجاهل/إزالة" + new_aspect: + add_a_new_aspect: "أضف جانبا جديدا" + create: "خلق" + create: + success: ".الذي يمكن أن نرى الجانب الجديد الخاص بك Diaspora انقر على علامة الجمع على الجانب الأيسر لنقو" + failure: ".فشل إنشاء الجانب" + destroy: + success: ".%{name} وقد نجحت في إزالة" + update: + success: ".تحرير بنجاح ,%{name} ,وقد الجانب الخاص بك" + move_friends: + failure: ".%{real_name} فشل تحرير آسبكت لصدي" + success: ".جوانب الموضوع بنجاح" + move_friend: + failure: "%{inspect} لم تنجح" + success: ".أنت الآن عرض صديقك جانبا مختلفا من جوانب نفسك" + helper: + remove: "نزع" + aspect_not_empty: "الجانب يست فارغ" + users: + edit: + editing_profile: "تحرير الملف الشخصي" + profile: + cancel: "إلغاء" + update_profile: "تحديث الملف الشخصي" + home: "منزل" + diaspora_username: "اسم المستخدم DIASPORA" + info: "معلومات" + picture: "صورة" + editing_profile: "تحرير الملف الشخصي" + albums: "البومات" + you_dont_have_any_photos: "ليس لديك أي صوا! نتقل إلى" + page_to_upload_some: ".الصفحة لتحميل بعض" + comments: + comment: + ago: "منذ" + new_comment: + comment: "كيف" + photos: + show: + prev: "السابق" + full_size: "الحجم الكام" + next: "القادم" + edit_photo: "تحرير الصو" + delete_photo: "حذف الصو" + are_you_sure: "هل أنت متأكد؟" + comments: "تعليقات" + edit: + editing: "تصحيح" + are_you_sure: "هل أنت متأك؟" + delete_photo: "حذف الصو" + photo: + show_comments: "sعرض التعليقا" + posted_a_new_photo_to: "أرسلت صورة جديدة ل" + new: + new_photo: "جديد الصو" + back_to_list: "عودة إلى قائم" + post_it: "!بعد ذلك" + create: + runtime_error: "?فشل تحميل الصور. هل أنت متأكد من أن يتم ربط حزام الأمان" + integrity_error: "?فشل تحميل الصور. هل أنت متأكد من أن صورة" + type_error: "?فشل تحميل الصور. هل أنت متأكد من وأضيف صورة" + update: + notice: ".الصورة تحديثها بنجاح" + error: ".فشل لتحرير الصو" + destroy: + notice: ".الصور المحذوفة" + registrations: + new: + sign_up: "قم بالتسجي" + create: + success: "!Diaspora لقد انضممت" + status_messages: + new_status_message: + tell_me_something_good: "قل لي شيئا جيد" + oh_yeah: "!نعم" + status_message: + show_comments: "عرض التعليقا" + delete: "حذف" + are_you_sure: "هل أنت متأكد؟" + show: + status_message: "رسالة الحالة" + comments: "تعليقات" + are_you_sure: "هل أنت متأكد؟" + destroy: "هدم" + view_all: "عرض الك" + message: "رسالة" + owner: "مالك" + helper: + no_message_to_display: ".أي رسالة لعرضه" + people: + person: + add_friend: "أضف صدي" + pending_request: "في انتظار طلب" + index: + add_friend: "أضف صدي" + real_name: "اسمه الحقيقي" + diaspora_handle: "اسمك المستعار diaspora" + thats_you: "!هذا لك" + friend_request_pending: "طلب صديق معلقة" + you_have_a_friend_request_from_this_person: "لديك صديق طلب من هذا الشخص" + new: + new_person: "شخص جديد" + back_to_list: "عودة إلى قائمة" + show: + last_seen: "%{how_long_ago} :المشاهدة الأخيرة" + friends_since: "%{how_long_ago} :أصدقاء منذ" + save: "حفظ" + are_you_sure: "هل أنت متأكد؟" + remove_friend: "إزالة صديق" + requests: + new_request: + add_a_new_friend_to: "إضافة صديق جديد إلى" + enter_a_diaspora_username: ":Diaspora أدخل اسم مستخدم" + your_diaspora_username_is: "%{diaspora_handle} :هو Diaspora اسم المستخدم الخاص" + friends_username: "صديق اسم المستخدم" + destroy: + success: ".أنت الآن أصدقاء" + error: "!الرجاء اختيار جانبا" + ignore: ".صديق تجاهل الطلب" + create: + error: "!مع هذا البريد الإلكتروني diaspora لم يتم العثور على بذور" + already_friends: "!%{destination_url} كنت بالفعل مع أصدقاء" + success: ".%{destination_url} وأرسل طلب صداقة إلى" + horribly_wrong: ".ذهب شيء خاطئ" diff --git a/config/locales/diaspora/cs.yml b/config/locales/diaspora/cs.yml new file mode 100644 index 000000000..7b454f813 --- /dev/null +++ b/config/locales/diaspora/cs.yml @@ -0,0 +1,219 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for Lithuanian. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +cs: + hello: "Dobrý Den" + application: + helper: + unknown_person: "neznámá osoba" + new_requests: "nové žádosti" + dashboards: + helper: + home: "domů" + datetime: + distance_in_words: + less_than_x_seconds: "méně než %{count} sekund" + half_a_minute: "půl minuty" + less_than_x_minutes: "méně než %{count} minut" + x_minutes: "%{count} minuty" + about_x_hours: "zhruba %{count} hodin" + x_days: "%{count} dní" + about_x_months: "zhruba %{count} měsíců" + x_months: "%{count} měsíců" + about_x_years: "zhruba %{count} let" + over_x_years: "přez %{count} let" + almost_x_years: "skoro %{count} let" + error_messages: + helper: + invalid_fields: "Neplatná pole" + correct_the_following_errors_and_try_again: "Opravte následující chyby a zkuste to znovu." + people: + helper: + results_for: " vysledky vyhledávání %{params}" + people_on_pod_are_aware_of: " people on pod are aware of" + layouts: + application: + edit_profile: "upravit profil" + logout: "odhlásit se" + shared: + aspect_nav: + all_aspects: "Všechny aspekty" + manage: "Spravovat" + manage_your_aspects: "Spravovat vaše aspekty" + sub_header: + all_aspects: "Všechny aspekty" + manage_aspects: "Spravovat aspekty" + publisher: + share: "Sdělit" + aspect_friends: + add_friends: "přidat přátele" + albums: + album: + you: "vy" + new_album: + create: "vytvořit" + add_a_new_album: "Přidat nové album" + show: + edit_album: "Upravit album" + albums: "alba" + updated: "aktualizované" + by: "uživatelem" + edit: + editing: "Upravuje se" + updated: "aktualizováno" + are_you_sure: "Jste si jisti?" + delete_album: "Smazat Album" + cancel: "Zrušit" + index: + home: "doma" + new_album: "Nové Album" + create: + success: "Vytvořili jste nové album nazvané %{name}." + update: + success: "Album %{name} úspěšně upraveno." + failure: "Nepodařilo se upravit album %{name}." + destroy: + success: "Album %{name} smazáno." + helper: + friends_albums: "Alba přátel" + your_albums: "Vaše Alba" + aspects: + index: + photos: "fotografie" + show: + photos: "fotografie" + manage: + add_a_new_aspect: "Přidat aspekt" + add_a_new_friend: "Přidat nového přítele" + show: "Show" + update_aspects: "Aktualizovat aspekty" + requests: "Žádosti" + ignore_remove: "Ignorovat/Odebrat" + new_aspect: + add_a_new_aspect: "Přidat nový aspekt" + create: "Vytvořit" + create: + success: "Řekněte Diaspoře kdo může vidět váš nový aspekt kliknutím na plus na levé straně." + destroy: + success: "%{name} byl úspěšně odebrán." + update: + success: "Váš aspekt, %{name}, byl úspěšně upraven." + move_friends: + failure: "Úprava aspektu přítelem %{real_name} selhala." + success: "Aspekty úspěšně upraveny." + move_friend: + failure: "nepodařilo se %{inspect}" + success: "Nyní svému příteli ukazujete jiný ze svých aspektů." + helper: + remove: "odebrat" + aspect_not_empty: "Aspekt není prázdný" + users: + edit: + editing_profile: "Upravit profil" + profile: + cancel: "Zrušit" + update_profile: "Aktualizovat profil" + home: "Domů" + diaspora_username: "UŽIVATELSKÉ JMÉNO V DIASPOŘE" + info: "Info" + picture: "Obrázek" + editing_profile: "Upravit profil" + albums: "Alba" + you_dont_have_any_photos: "Nemáte žádné fotky. Jděte na stránku" + page_to_upload_some: "a nějaké nahrajte." + comments: + comment: + ago: "nazpět" + new_comment: + comment: "Komentář" + photos: + show: + prev: "předchozí" + full_size: "plná velkost" + next: "další" + edit_photo: "Upravit fotku" + delete_photo: "Smazat fotku" + are_you_sure: "Jste si jisti?" + comments: "komentáře" + edit: + editing: "Uprait" + are_you_sure: "Jste si jisti?" + delete_photo: "Smazat fotku" + photo: + show_comments: "zobrazit komentáře" + posted_a_new_photo_to: "poslal novou fotku do" + new: + new_photo: "Nová fotka" + back_to_list: "Zpět na seznam" + post_it: "poslat!" + create: + runtime_error: "Poslání fotky selhalo. Jste si jisti, že máte zapnuté pásy?" + integrity_error: "Poslání fotky selhalo. Jste si jisti že to byl obrázek?" + type_error: "Poslání fotky selhalo. Jste si jisti zě byl přidán obrázek?" + update: + notice: "Fotka úspěšně aktualizována." + error: "Nepodařilo se upravit fotku." + destroy: + notice: "Fotka smazána." + registrations: + new: + sign_up: "Zapsat se" + create: + success: "Připojili jste se k Diaspoře!" + status_messages: + new_status_message: + tell_me_something_good: "pověz mi něco dobrého" + oh_yeah: "ó ano!" + status_message: + show_comments: "zobrazit komentáře" + delete: "Smazat" + are_you_sure: "Jste si jisti?" + show: + status_message: "Zpráva o stavu" + comments: "komentáře" + are_you_sure: "Jste si jisti?" + destroy: "Zničit" + view_all: "Zobrazit Vše" + message: "Zpráva" + owner: "Vlastník" + helper: + no_message_to_display: "Není k zobrazení žádná zpráva." + people: + person: + add_friend: "přidat přítele" + pending_request: "nevyřízené žádosti" + index: + add_friend: "přidat přítele" + real_name: "pravé jméno" + diaspora_handle: "adresa v diaspoře" + thats_you: "to jste vy!" + friend_request_pending: "nevyřízená žádost o přátelství" + you_have_a_friend_request_from_this_person: "od této osoby máte žádost o přátelství" + new: + new_person: "Nová Osoba" + back_to_list: "Zpět na Seznam" + show: + last_seen: "naposledy viděni: %{how_long_ago}" + friends_since: "přáteli od: %{how_long_ago}" + save: "save" + are_you_sure: "Jste si jisti?" + remove_friend: "odebrat přítele" + requests: + new_request: + add_a_new_friend_to: "Pridat nového přítele do" + enter_a_diaspora_username: "Vložte uživatelské jméno v diaspoře:" + your_diaspora_username_is: "Vaše uživatelské jméno v diaspoře je: %{diaspora_handle}" + friends_username: "Uživatelské jméno přítele" + destroy: + success: "Nyní jste přáteli." + error: "Prosím vyberte aspekt!" + ignore: "Ignorovat žádost o přátelství." + create: + error: "Semínko diaspory s touto adresou nenalezeno!" + already_friends: "S %{destination_url} už jste přáteli!" + success: "byla poslána žádost o přátelství na %{destination_url}" + horribly_wrong: "Něco se ošklivě pokazilo." diff --git a/config/locales/diaspora/cy.yml b/config/locales/diaspora/cy.yml new file mode 100644 index 000000000..cd1c7dbd6 --- /dev/null +++ b/config/locales/diaspora/cy.yml @@ -0,0 +1,144 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +cy: + hello: "Helo byd" + layouts: + application: + edit_profile: "golygu proffil" + logout: "arwyddo allan" + shared: + aspect_nav: + all_aspects: "Pob agwedd" + manage: "Rheoli" + manage_your_aspects: "Rheoli eich agweddau" + sub_header: + all_aspects: "Pob agwedd" + manage_aspects: "Rheloi agweddau" + publisher: + share: "Rhannu" + aspect_friends: + add_friends: "ychwanegu ffrindiau" + albums: + album: + you: "chi" + new_album: + create: "creu" + add_a_new_album: "Ychwanegu albwm newydd" + show: + edit_album: "Golygu Albwm" + albums: "albymau" + updated: "diweddarwyd" + by: "gan" + edit: + editing: "Wrthi'n golygu" + updated: "diweddarwyd" + are_you_sure: "Ydych chi'n sicr?" + delete_album: "Dileu Albwm" + cancel: "Cancel" + index: + home: "adref" + new_album: "Albwm Newydd" + create: + success: "Chi wedi creu albwm a'i enwi'n %{name}." + update: + success: "Mae albwm %{name} wedi'i olygu yn llwyddiannus." + failure: "Wedi methu golygu albwm %{name}." + destroy: + success: "Wedi dileu albwm %{name}." + aspects: + index: + photos: "lluniau" + show: + photos: "lluniau" + manage: + add_a_new_aspect: "Ychwanegwch agwedd" + add_a_new_friend: "Ychwanegwch ffrind newydd" + show: "Dangos" + update_aspects: "Diweddaru Agweddau" + requests: "Ceisiadau" + ignore_remove: "Anwybyddu/Tynnu" + new_aspect: + add_a_new_aspect: "Ychwanegwch agwedd newydd" + create: "Creu" + create: + success:"Cliciwch ar y plus ar y chwith i ddweud wrth Diaspora pwy all weld eich agwedd newydd." + users: + edit: + editing_profile: "Golygu proffil" + profile: + cancel: "Cancel" + update_profile: "Diweddaru Proffil" + home: "Adref" + diaspora_username: "FFUGENW DIASPORA" + info: "Gwybodaeth" + picture: "Llun" + editing_profile: "Golygu proffil" + albums: "Albymau" + you_dont_have_any_photos: "Does gennych chi ddim lluniau! Ewch i'r" + page_to_upload_some: "dudalen i uwchlwytho rhai." + comments: + comment: + ago: "yn ol" + new_comment: + comment: "Sylw" + photos: + show: + prev: "blaenorol" + full_size: "maint llawn" + next: "neasf" + edit_photo: "Golygu Llun" + delete_photo: "Dileu Llun" + are_you_sure: "Ydych chi'n sicr?" + comments: "sylwadau" + edit: + editing: "Golygu" + are_you_sure: "Ydych chi'n sicr?" + delete_photo: "Dileu Llun" + photo: + show_comments: "dangos sylwadau" + posted_a_new_photo_to: "postiwyd llun newydd i" + new: + new_photo: "Llun Newydd" + back_to_list: "Nol i'r Rhestr" + post_it: "postiwch e!" + registrations: + new: + sign_up: "Cofrestrwch" + status_messages: + new_status_message: + tell_me_something_good: "Dwi eisiau clywed rhwbeth da" + oh_yeah: "oh yeah!" + status_message: + show_comments: "dangos sylwadau" + delete: "Dileu" + are_you_sure: "Ydych chi'n sicr?" + show: + status_message: "Neges Statws" + comments: "sylwadau" + are_you_sure: "Ydych chi'n sicr?" + destroy: "Dinistrio" + view_all: "Gweld Pob Un" + message: "Neges" + owner: "Perchennog" + people: + index: + add_friend: "ychwanegu ffrind" + real_name: "enw llawn" + diaspora_handle: "bachyn diaspora" + thats_you: "dyna chi!" + friend_request_pending: "cais ffrind dan ystyriaeth" + you_have_a_friend_request_from_this_person: "mae'r person yma eisiau bod yn ffrind i chi" + new: + new_person: "Person Newydd" + back_to_list: "Nol i'r Rhestr" + show: + last_seen: "gwelwyd diwethaf: %{how_long_ago}" + friends_since: "yn ffrindiau ers: %{how_long_ago}" + save: "arbed" + are_you_sure: "Ydych chi'n sicr?" + remove_friend: "dileu ffrind" diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml new file mode 100644 index 000000000..e277a5efd --- /dev/null +++ b/config/locales/diaspora/de.yml @@ -0,0 +1,207 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Localization file for German. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +de: + hello: "Hallo Welt" + application: + helper: + unknown_person: "unbekannte Person" + new_requests: "neue Anfrage" + dashboards: + helper: + home: "Startseite" + error_messages: + helper: + invalid_fields: "Ungültige Felder" + correct_the_following_errors_and_try_again: "Korrigiere die folgenden Fehler und probiere es erneut." + people: + helper: + results_for: " Resultate für %{params}" + people_on_pod_are_aware_of: " people on pod are aware of" + layouts: + application: + edit_profile: "Profil bearbeiten" + logout: "Abmelden" + shared: + aspect_nav: + all_aspects: "Alle Aspekte" + manage: "Verwalten" + manage_your_aspects: "Aspekte verwalten" + sub_header: + all_aspects: "Alle Aspekte" + manage_aspects: "Aspekte verwalten" + publisher: + share: "Teilen" + aspect_friends: + add_friends: "Freunde hinzufügen" + albums: + album: + you: "dir" + new_album: + create: "erstellen" + add_a_new_album: "Album hinzufügen" + show: + edit_album: "Album bearbeiten" + albums: "Alben" + updated: "aktualisiert" + by: "von" + edit: + editing: "Bearbeite" + updated: "geändert" + are_you_sure: "Bist du sicher?" + delete_album: "Album löschen" + cancel: "Abbrechen" + index: + home: "Startseite" + new_album: "Neues Album" + create: + success: "Du hast das Album %{name} erstellt." + update: + success: "Album %{name} erfolgreich geändert." + failure: "%{name} wurde nicht geändert." + destroy: + success: "Album %{name} gelöscht." + helper: + friends_albums: "Alben von Freunden" + your_albums: "Deine Alben" + aspects: + index: + photos: "Fotos" + show: + photos: "Fotos" + manage: + add_a_new_aspect: "Neuen Aspekt erstellen" + add_a_new_friend: "Freund hinzufügen" + show: "Anzeigen" + update_aspects: "Aspekte aktualisieren" + requests: "Anfragen" + ignore_remove: "Ignorieren/Entfernen" + new_aspect: + add_a_new_aspect: "Neuen Aspekt erstellen" + create: "Erstellen" + create: + success: "Klicke auf das Plus auf der linken Seite um Diaspora mitzuteilen wer deinen neuen Aspekt sehen kann." + destroy: + success: "%{name} wurde erfolgreich gelöscht." + update: + success: "Dein Aspekt, %{name}, wurde erfolgreich geändert." + move_friends: + failure: "Ändern des Aspekts für deinen Freund %{real_name} fehlgeschlagen." + success: "Aspekt erfolgreich geändert." + move_friend: + error: "didn't work %{inspect}" + notice: "Du zeigst deinem Freund jetzt einen anderen Aspekt von dir." + helper: + remove: "entfernen" + aspect_not_empty: "Aspekt ist nicht leer" + users: + edit: + editing_profile: "Profil bearbeiten" + profile: + cancel: "Abbrechen" + update_profile: "Profil aktualisieren" + home: "Startseite" + diaspora_username: "Diaspora Benutzername" + info: "Info" + picture: "Bild" + editing_profile: "Profil bearbeiten" + albums: "Alben" + you_dont_have_any_photos: "Du hast keine Fotos! Gehe auf die" + page_to_upload_some: "Seite um welche hochzuladen." + comments: + comment: + # this won't work in german at all. Needs more thorough I18n + ago: "ago" + new_comment: + comment: "Kommentar" + photos: + show: + prev: "zurück" + full_size: "volle Größe" + next: "vor" + edit_photo: "Foto bearbeiten" + delete_photo: "Foto löschen" + are_you_sure: "Bist du sicher?" + comments: "Kommentare" + edit: + editing: "Bearbeite" + are_you_sure: "Bist du sicher?" + delete_photo: "Foto löschen" + photo: + show_comments: "Kommentare anzeigen" + posted_a_new_photo_to: "neues Foto veröffentlicht bei" + new: + new_photo: "Foto erstellen" + back_to_list: "Zurück zur Liste" + post_it: "Hochladen" + create: + runtime_error: "Hochladen eines Fotos fehlgeschlagen. Bist du sicher, dass dein Sicherheitsgurt befestigt ist?" + integrity_error: "Hochladen eines Fotos fehlgeschlagen. Bist du sicher, dass das ein Bild war?" + type_error: "Hochladen eines Fotos fehlgeschlagen. Bist du sicher, dass ein Bild hinzugefügt wurde?" + update: + notice: "Foto erfolgreich aktualisiert." + error: "Ändern des Fotos fehlgeschlagen." + destroy: + notice: "Foto gelöscht." + registrations: + new: + sign_up: "Anmelden" + create: + success: "Du bist Diaspora beigetreten!" + status_messages: + new_status_message: + tell_me_something_good: "Erzähl' mir was schönes!" + oh_yeah: "Oh, super!" + status_message: + show_comments: "Kommentare anzeigen" + delete: "Löschen" + are_you_sure: "Bist du sicher?" + show: + status_message: "Statusmeldung" + comments: "Kommentare" + are_you_sure: "Bist du sicher?" + destroy: "Löschen" + view_all: "Alle anzeigen" + message: "Nachricht" + owner: "Eigentümer" + helper: + no_message_to_display: "Keine Nachricht zum anzeigen." + people: + person: + add_friend: "Freund hinzufügen" + pending_request: "Anfrage ausstehend" + index: + add_friend: "Freund hinzufügen" + real_name: "Echter Name" + diaspora_handle: "diaspora handle" + thats_you: "das bist du!" + friend_request_pending: "Ausstehende Freundschaftsanfrage" + you_have_a_friend_request_from_this_person: "Du hast eine Freundschaftsanfrage von dieser Person" + new: + new_person: "Neue Person" + back_to_list: "Zurück zur Liste" + show: + last_seen: "zuletzt gesehen: %{how_long_ago}" + friends_since: "Freunde seit: %{how_long_ago}" + save: "speichern" + are_you_sure: "Bist du sicher?" + remove_friend: "Freund entfernen" + requests: + new_request: + add_a_new_friend_to: "Add a new friend to" + enter_a_diaspora_username: "Gebe einen Diaspora Benutzernamen ein:" + your_diaspora_username_is: "Dein Diaspora Benutzername ist: %{diaspora_handle}" + friends_username: "Freundes Benutzername" + destroy: + success: "Ihr seid jetzt Freunde." + error: "Bitte wähle einen Aspekt aus!" + ignore: "Freundschaftsanfrage ignorieren." + create: + error: "Kein Diaspora-Seed in dieser E-Mail gefunden!" + already_friends: "Du bist bereits mit %{destination_url} befreundet!" + success: "Eine Freundschaftsanfrage wurde an %{destination_url} gesendet." + horribly_wrong: "Etwas ging tierisch schief." diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml new file mode 100644 index 000000000..5595c4caa --- /dev/null +++ b/config/locales/diaspora/en.yml @@ -0,0 +1,208 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + hello: "Hello world" + application: + helper: + unknown_person: "unknown person" + new_requests: "new requests" + dashboards: + helper: + home: "home" + error_messages: + helper: + invalid_fields: "Invalid Fields" + correct_the_following_errors_and_try_again: "Correct the following errors and try again." + people: + helper: + results_for: " results for %{params}" + people_on_pod_are_aware_of: " people on pod are aware of" + layouts: + application: + edit_profile: "edit profile" + logout: "logout" + shared: + aspect_nav: + all_aspects: "All Aspects" + manage: "Manage" + manage_your_aspects: "Manage your Aspects" + sub_header: + all_aspects: "All Aspects" + manage_aspects: "Manage Aspects" + publisher: + share: "Share" + aspect_friends: + add_friends: "add friends" + albums: + album: + you: "you" + new_album: + create: "create" + add_a_new_album: "Add a new album" + show: + edit_album: "Edit Album" + albums: "albums" + updated: "updated" + by: "by" + edit: + editing: "Editing" + updated: "updated" + are_you_sure: "Are you sure?" + delete_album: "Delete Album" + cancel: "Cancel" + index: + home: "home" + new_album: "New Album" + create: + success: "You've created an album called %{name}." + update: + success: "Album %{name} successfully edited." + failure: "Failed to edit album %{name}." + destroy: + success: "Album %{name} deleted." + helper: + friends_albums: "Friends Albums" + your_albums: "Your Albums" + aspects: + index: + photos: "photos" + show: + photos: "photos" + manage: + add_a_new_aspect: "Add a new aspect" + add_a_new_friend: "Add a new friend" + show: "Show" + update_aspects: "Update Aspects" + requests: "Requests" + ignore_remove: "Ignore/Remove" + new_aspect: + add_a_new_aspect: "Add a new aspect" + create: "Create" + create: + success: "Click on the plus on the left side to tell Diaspora who can see your new aspect." + failure: "Aspect creation failed." + destroy: + success: "%{name} was successfully removed." + update: + success: "Your aspect, %{name}, has been successfully edited." + move_friends: + failure: "Aspect editing failed for friend %{real_name}." + success: "Aspects edited successfully." + move_friend: + failure: "didn't work %{inspect}" + success: "You are now showing your friend a different aspect of yourself." + helper: + remove: "remove" + aspect_not_empty: "Aspect not empty" + users: + edit: + editing_profile: "Editing profile" + profile: + cancel: "Cancel" + update_profile: "Update Profile" + home: "Home" + diaspora_username: "DIASPORA USERNAME" + info: "Info" + picture: "Picture" + editing_profile: "Editing profile" + albums: "Albums" + you_dont_have_any_photos: "You don't have any photos! Go to the" + page_to_upload_some: "page to upload some." + or: "or" + comments: + comment: + ago: "ago" + new_comment: + comment: "Comment" + photos: + show: + prev: "prev" + full_size: "full size" + next: "next" + edit_photo: "Edit Photo" + delete_photo: "Delete Photo" + are_you_sure: "Are you sure?" + comments: "comments" + edit: + editing: "Editing" + are_you_sure: "Are you sure?" + delete_photo: "Delete Photo" + photo: + show_comments: "show comments" + posted_a_new_photo_to: "posted a new photo to" + new: + new_photo: "New Photo" + back_to_list: "Back to List" + post_it: "post it!" + create: + runtime_error: "Photo upload failed. Are you sure that your seatbelt is fastened?" + integrity_error: "Photo upload failed. Are you sure that was an image?" + type_error: "Photo upload failed. Are you sure an image was added?" + update: + notice: "Photo successfully updated." + error: "Failed to edit photo." + destroy: + notice: "Photo deleted." + registrations: + new: + sign_up: "Sign up" + create: + success: "You've joined Diaspora!" + status_messages: + new_status_message: + tell_me_something_good: "tell me something good" + oh_yeah: "oh yeah!" + status_message: + show_comments: "show comments" + delete: "Delete" + are_you_sure: "Are you sure?" + show: + status_message: "Status Message" + comments: "comments" + are_you_sure: "Are you sure?" + destroy: "Destroy" + view_all: "View All" + message: "Message" + owner: "Owner" + helper: + no_message_to_display: "No message to display." + people: + person: + add_friend: "add friend" + pending_request: "pending request" + index: + add_friend: "add friend" + real_name: "real name" + diaspora_handle: "diaspora handle" + thats_you: "that's you!" + friend_request_pending: "friend request pending" + you_have_a_friend_request_from_this_person: "you have a friend request from this person" + new: + new_person: "New Person" + back_to_list: "Back to List" + show: + last_seen: "last seen: %{how_long_ago}" + friends_since: "friends since: %{how_long_ago}" + save: "save" + are_you_sure: "Are you sure?" + remove_friend: "remove friend" + requests: + new_request: + add_a_new_friend_to: "Add a new friend to" + enter_a_diaspora_username: "Enter a Diaspora username:" + your_diaspora_username_is: "Your Diaspora username is: %{diaspora_handle}" + friends_username: "Friend's username" + destroy: + success: "You are now friends." + error: "Please select an aspect!" + ignore: "Ignored friend request." + create: + error: "No diaspora seed found with this email!" + already_friends: "You are already friends with %{destination_url}!" + success: "A friend request was sent to %{destination_url}." + horribly_wrong: "Something went horribly wrong." diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml new file mode 100644 index 000000000..5a73715b9 --- /dev/null +++ b/config/locales/diaspora/es.yml @@ -0,0 +1,204 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +es: + hello: "Hola mundo" + application: + helper: + unknown_person: "persona desconocida" + new_requests: "nuevas peticiones" + dashboards: + helper: + home: "home" + error_messages: + helper: + invalid_fields: "Campos Invalidos" + correct_the_following_errors_and_try_again: "Corrija los siguentes errores e intente de nuevo." + people: + helper: + results_for: " resultados para %{params}" + people_on_pod_are_aware_of: " personas en pod estan al tanto de" + layouts: + application: + edit_profile: "editar perfil" + logout: "cerrar sesión" + shared: + aspect_nav: + all_aspects: "Todos los Aspectos" + manage: "Manejar" + manage_your_aspects: "Maneja tus Aspectos" + sub_header: + all_aspects: "Todos los Aspectos" + manage_aspects: "Manejar Aspectos" + publisher: + share: "Compartir" + aspect_friends: + add_friends: "Añade amigos" + albums: + album: + you: "usted" + new_album: + create: "crear" + add_a_new_album: "Añade un nuevo álbum" + show: + edit_album: "Editar Álbum" + albums: "álbumes" + updated: "actualizado" + by: "por" + edit: + editing: "Editando" + updated: "actualizado" + are_you_sure: "¿Está seguro?" + delete_album: "Eliminar Álbum" + cancel: "Cancelar" + index: + home: "home" + new_album: "Nuevo Álbum" + create: + success: "Has creado el álbum llamado %{name}." + update: + success: "El álbum %{name} fue editado exitosamente." + failure: "Fallo al editar el álbum %{name}." + destroy: + success: "El álbum %{name} fue eliminado." + helper: + friends_albums: "Álbumes de amigos" + your_albums: "Tus Álbumes" + aspects: + index: + photos: "fotos" + show: + photos: "fotos" + manage: + add_a_new_aspect: "Añadir un nuevo aspecto" + add_a_new_friend: "Añadir un nuevo amigo" + show: "Mostrar" + update_aspects: "Actualizar Aspectos" + requests: "Peticiones" + ignore_remove: "Ignorar/Remover" + new_aspect: + add_a_new_aspect: "Añadir un nuevo aspecto" + create: "Crear" + create: + success:"Pulsa el signo de mas a la izquierda para escojer quien puede ver su nuevo aspecto." + failure: "La creación del Aspecto falló." + destroy: + success: "%{name} fue eliminado exitosamente." + update: + success: "Su aspecto, %{name}, fue editado exitosamente." + move_friends: + failure: "Fallo el editar aspecto para el amigo %{real_name}." + success: "Aspectos editados exitosamente." + move_friend: + error: "no funcionó %{inspect}" + notice: "Ahora estas mostrando a tu amigo un aspecto diferente de ti." + helper: + remove: "eliminar" + aspect_not_empty: "Aspecto no vacio" + users: + edit: + editing_profile: "Editando perfil" + profile: + cancel: "Cancelar" + update_profile: "Actualizar Perfil" + home: "Home" + diaspora_username: "NOMBRE DE USUARIO DE DIASPORA" + info: "Info" + picture: "Foto" + editing_profile: "Editando perfil" + albums: "Álbums" + you_dont_have_any_photos: "No tienes ninguna foto! ve a la pagina" + page_to_upload_some: "para subir algunas" + comments: + comment: + ago: "atras" + new_comment: + comment: "Comentario" + photos: + show: + prev: "prev" + full_size: "tamaño completo" + next: "prox" + edit_photo: "Editar Foto" + delete_photo: "Eliminar Foto" + are_you_sure: "¿Está seguro?" + comments: "comentarios" + edit: + editing: "Editando" + are_you_sure: "¿Está seguro?" + delete_photo: "Eliminar Foto" + photo: + show_comments: "mostrar comentarios" + posted_a_new_photo_to: "a puesto una nueva foto en" + new: + new_photo: "Nueva Foto" + back_to_list: "Volver a la lista" + post_it: "post it!" + create: + runtime_error: "Photo upload failed. Are you sure that your seatbelt is fastened?" + integrity_error: "Falló carga de la foto. ¿Está seguro de que era una imagen?" + type_error: "Falló carga de la foto. ¿Está seguro de que una imagen fue añadida?" + update: + notice: "Foto actualizada satisfactoriamente." + error: "Falló la edición de la foto." + destroy: + notice: "Foto eliminada." + registrations: + new: + sign_up: "Regístrate" + create: + success: "Se ha unido a Diaspora!" + status_messages: + new_status_message: + tell_me_something_good: "dime algo bueno" + oh_yeah: "oh yeah!" + status_message: + show_comments: "mostrar comentarios" + delete: "Eliminar" + are_you_sure: "Esta seguro?" + show: + status_message: "Mensaje de status" + comments: "comentarios" + are_you_sure: "¿Está seguro?" + destroy: "Borrar" + view_all: "Ver Todos" + message: "Mensaje" + owner: "Dueño" + helper: + no_message_to_display: "No hay mensajes que mostrar." + people: + person: + add_friend: "añadir amigo" + pending_request: "petición pendiente" + index: + add_friend: "añadir amigo" + real_name: "nombre real" + diaspora_handle: "usuario en diaspora" + thats_you: "ese eres tu!" + friend_request_pending: "petición de amistad pendiente" + you_have_a_friend_request_from_this_person: "tienes una petición de amistad de esta persona" + show: + last_seen: "ultima vez visto: %{how_long_ago}" + friends_since: "amigos desde: %{how_long_ago}" + save: "guardar" + are_you_sure: "¿Está seguro?" + remove_friend: "eliminar amigo" + requests: + new_request: + add_a_new_friend_to: "Añade un nuevo amigo a " + enter_a_diaspora_username: "Escribe el usuario de Diaspora:" + your_diaspora_username_is: "Tu usuario de Diaspora es: %{diaspora_handle}" + friends_username: "Nombre de usuario de amigo" + destroy: + success: "Ahora son amigos." + error: "Seleccione un aspecto!" + ignore: "Ignorar peticion de amistad" + create: + error: "No diaspora seed found with this email!" + already_friends: "Ya eres amigo de %{destination_url}!" + success: "Una peticion de amistad se envio a %{destination_url}." + horribly_wrong: "Algo horriblemente incorrecto ha sucedido" diff --git a/config/locales/diaspora/fi.yml b/config/locales/diaspora/fi.yml new file mode 100644 index 000000000..5e1a6da32 --- /dev/null +++ b/config/locales/diaspora/fi.yml @@ -0,0 +1,10 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. +# Translator jarkko moilanen, jm60697@gmail.com + +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +fi: + hello: "Terve, maailma" diff --git a/config/locales/diaspora/fr-informal.yml b/config/locales/diaspora/fr-informal.yml new file mode 100644 index 000000000..1c7950fe5 --- /dev/null +++ b/config/locales/diaspora/fr-informal.yml @@ -0,0 +1,206 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Localization file for French (Informal Honorifics). Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +fr-informal: + hello: "Bonjour tout le monde" + application: + helper: + unknown_person: "personne inconnue" + new_requests: "nouvelles requêtes" + dashboards: + helper: + home: "accueil" + error_messages: + helper: + invalid_fields: "Champs invalides" + correct_the_following_errors_and_try_again: "Corrige les erreurs suivantes, puis réessaie." + people: + helper: + results_for: " résultats concernant %{params}" + people_on_pod_are_aware_of: " personnes agissant comme des automates sont conscients de" + layouts: + application: + edit_profile: "éditer le profil" + logout: "déconnexion" + shared: + aspect_nav: + all_aspects: "Tous les aspects" + manage: "Gérer" + manage_your_aspects: "Gérer tes aspects" + sub_header: + all_aspects: "Tous les aspects" + manage_aspects: "Gérer les aspects" + publisher: + share: "Partager" + aspect_friends: + add_friends: "ajouter des amis" + albums: + album: + you: "toi" + new_album: + create: "créer" + add_a_new_album: "Ajouter un nouvel album" + show: + edit_album: "Éditer l’album" + albums: "albums" + updated: "mis à jour" + by: "par" + edit: + editing: "Édition" + updated: "mis à jour" + are_you_sure: "Es-tu sûr(e)?" + delete_album: "Supprimer l’album" + cancel: "Annuler" + index: + home: "accueil" + new_album: "Nouvel album" + create: + success: "Tu as créé un album nommé %{name}." + update: + success: "L’album %{name} a été édité avec succès." + failure: "L’édition de l’album %{name} a échoué." + destroy: + success: "L’album %{name} a été supprimé." + helper: + friends_albums: "Albums d’amis" + your_albums: "Tes albums" + aspects: + index: + photos: "photos" + show: + photos: "photos" + manage: + add_a_new_aspect: "Ajouter un nouvel aspect" + add_a_new_friend: "Ajouter un nouvel ami" + show: "Afficher" + update_aspects: "Mettre à jour les aspects" + requests: "Requêtes" + ignore_remove: "Ignorer/Supprimer" + new_aspect: + add_a_new_aspect: "Ajouter un nouvel aspect" + create: "Créer" + create: + success:"Clique sur le symbole plus situé sur le côté gauche afin que Diaspora détermine qui peut voir ton nouvel aspect." + destroy: + success: "%{name} a été supprimé avec succès." + update: + success: "Ton aspect, %{name}, a été édité avec succès." + move_friends: + failure: "L’édition de l’aspect concernant l’ami %{real_name} a échoué." + success: "Les aspects ont été édités avec succès." + move_friend: + error: "ne fonctionne pas %{inspect}" + notice: "Tu montres à présent à ton ami un aspect différent au tien." + helper: + remove: "supprimer" + aspect_not_empty: "L’aspect n’est pas vide" + users: + edit: + editing_profile: "Édition du profil" + profile: + cancel: "Annuler" + update_profile: "Mettre à jour le profil" + home: "Accueil" + diaspora_username: "NOM D’UTILISATEUR DIASPORA" + info: "Information" + picture: "Image" + editing_profile: "Édition du profil" + albums: "Albums" + you_dont_have_any_photos: "Tu n’as aucune photo ! Rends-toi sur la page" + page_to_upload_some: "afin d’en transférer quelques-unes." + comments: + comment: + ago: "il y a" + new_comment: + comment: "Commentaire" + photos: + show: + prev: "précédent" + full_size: "taille réelle" + next: "suivant" + edit_photo: "Éditer la photo" + delete_photo: "Supprimer la photo" + are_you_sure: "Es-tu sûr(e) ?" + comments: "commentaires" + edit: + editing: "Édition" + are_you_sure: "Es-tu sûr(e) ?" + delete_photo: "Supprimer la photo" + photo: + show_comments: "afficher les commentaires" + posted_a_new_photo_to: "a publié une nouvelle photo sur" + new: + new_photo: "Nouvelle photo" + back_to_list: "Retourner à la liste" + post_it: "publie-la !" + create: + runtime_error: "Le transfert de la photo a échoué. Es-tu sûr(e) que ta ceinture de sécurité est bien attachée ?" + integrity_error: "Le transfert de la photo a échoué. Es-tu sûr(e) que c’était bien une image ?" + type_error: "Le transfert de la photo a échoué. Es-tu sûr(e) que l’image était bien ajoutée ?" + update: + notice: "La photo a été mise à jour avec succès." + error: "Échec de l’édition de la photo." + destroy: + notice: "Photo supprimée." + registrations: + new: + sign_up: "Inscription" + create: + success: "Tu as rejoint Diaspora !" + status_messages: + new_status_message: + tell_me_something_good: "dis-moi quelque chose de bien" + oh_yeah: "oh ouais !" + status_message: + show_comments: "afficher les commentaires" + delete: "Supprimer" + are_you_sure: "Es-tu sûr(e) ?" + show: + status_message: "Message d’état" + comments: "commentaires" + are_you_sure: "Es-tu sûr(e) ?" + destroy: "Détruire" + view_all: "Tout voir" + message: "Message" + owner: "Propriétaire" + helper: + no_message_to_display: "Aucun message à afficher." + people: + person: + add_friend: "ajouter un ami" + pending_request: "requête en attente" + index: + add_friend: "ajouter un ami" + real_name: "nom réel" + diaspora_handle: "maniement de Diaspora" + thats_you: "c’est toi !" + friend_request_pending: "Requête d’ami en attente" + you_have_a_friend_request_from_this_person: "tu as une requête d’ami de la part de cette personne" + new: + new_person: "Nouvelle personne" + back_to_list: "Retourner à la liste" + show: + last_seen: "dernière connexion : %{how_long_ago}" + friends_since: "amis depuis : %{how_long_ago}" + save: "sauvegarder" + are_you_sure: "Es-tu sûr(e) ?" + remove_friend: "supprimer un ami" + requests: + new_request: + add_a_new_friend_to: "Ajouter un ami à" + enter_a_diaspora_username: "Saisi un nom d’utilisateur Diaspora :" + your_diaspora_username_is: "Ton nom d’utilisateur Diaspora est : %{diaspora_handle}" + friends_username: "Nom d’utilisateur de l’ami" + destroy: + success: "Vous êtes à présent amis." + error: "Merci de sélectionner un aspect !" + ignore: "Requête d’ami ignorée." + create: + error: "Aucun résultat Diaspora n’a été trouvé avec cette adresse e-mail !" + already_friends: "Tu es déjà ami avec %{destination_url}!" + success: "Une requête d’ami a été envoyée à %{destination_url}." + horribly_wrong: "Quelque chose d’horrible s’est produit." diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml new file mode 100644 index 000000000..bab6f3852 --- /dev/null +++ b/config/locales/diaspora/fr.yml @@ -0,0 +1,162 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Localization file for French. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +fr: + hello: "Bonjour tout le monde" + application: + helper: + unknown_person: "unknown person" + new_requests: "new requests" + dashboards: + helper: + home: "home" + error_messages: + helper: + invalid_fields: "Invalid Fields" + correct_the_following_errors_and_try_again: "Correct the following errors and try again." + people: + helper: + results_for: " resultados para %{params}" + people_on_pod_are_aware_of: " gente en pod estan al tanto de " + layouts: + application: + edit_profile: "Éditez votre profil" + logout: "Déconnexion" + shared: + aspect_nav: + all_aspects: "Tous les Aspects" + manage: "Gérez" + manage_your_aspects: "Gérez vos Aspects" + sub_header: + all_aspects: "Tous les Aspects" + manage_aspects: "Gérez vos Aspects" + publisher: + share: "Partager" + aspect_friends: + add_friends: "Ajouter des amis" + albums: + album: + you: "vous" + new_album: + create: "créer" + add_a_new_album: "Ajouter un nouvel album" + show: + edit_album: "Éditer l’album" + albums: "albums" + updated: "mis à jour" + by: "par" + edit: + editing: "Édition" + updated: "mis à jour" + are_you_sure: "Êtes-vous sûr?" + delete_album: "Supprimer l'album" + cancel: "Annuler" + index: + home: "accueil" + new_album: "Nouvel album" + helper: + friends_albums: "Friends Albums" + your_albums: "Your Albums" + create: + success: "Tu as créé un album nommé %{name}." + update: + success: "L’album %{name} a été édité avec succès." + failure: "L’édition de l’album %{name} a échoué." + destroy: + success: "L’album %{name} a été supprimé." + aspects: + index: + photos: "photos" + show: + photos: "photos" + manage: + add_a_new_aspect: "Ajouter un nouvel aspect" + add_a_new_friend: "Ajouter un nouvel amis" + show: "Voir" + update_aspects: "Mettre à jour les aspects" + requests: "Requêtes" + ignore_remove: "Ignorer/Supprimer" + new_aspect: + add_a_new_aspect: "Ajouter un nouvel aspect" + create: "Créer" + create: + success:"Cliquez sur plus situé sur le côté gauche afin d’en informer Diaspora qui peut voir votre nouvel aspect." + users: + edit: + editing_profile: "Édition du profil" + profile: + cancel: "Annuler" + update_profile: "Mettre à jour le profil" + home: "Accueil" + diaspora_username: "NOM D’UTILISATEUR DIASPORA" + info: "Information" + picture: "Image" + editing_profile: "Édition du profil" + albums: "Albums" + you_dont_have_any_photos: "Vous n’avez aucune photo ! Rendez-vous sur la page" + page_to_upload_some: "afin d’en transférer quelques-unes." + comments: + comment: + ago: "il y a" + new_comment: + comment: "Commentaire" + photos: + show: + prev: "précédent" + full_size: "taille réelle" + next: "suivant" + edit_photo: "Éditer la photo" + delete_photo: "Supprimer la photo" + are_you_sure: "Êtes-vous sûr ?" + comments: "commentaires" + edit: + editing: "Édition" + are_you_sure: "Êtes-vous sûr ?" + delete_photo: "Supprimer la photo" + photo: + show_comments: "afficher les commentaires" + posted_a_new_photo_to: "a publié une nouvelle photo sur" + new: + new_photo: "Nouvelle photo" + back_to_list: "Retourner à la liste" + post_it: "publiez-la !" + registrations: + new: + sign_up: "Inscription" + status_messages: + new_status_message: + tell_me_something_good: "dites-moi quelque chose de bien" + oh_yeah: "oh ouais !" + status_message: + show_comments: "afficher les commentaires" + delete: "Supprimer" + are_you_sure: "Êtes-vous sûr ?" + show: + status_message: "Message d’état" + comments: "commentaires" + are_you_sure: "Êtes-vous sûr ?" + destroy: "Détruire" + view_all: "Tout voir" + message: "Message" + owner: "Propriétaire" + people: + index: + add_friend: "ajouter un ami" + real_name: "nom réel" + diaspora_handle: "maniement de Diaspora" + thats_you: "c’est vous !" + friend_request_pending: "Requête d’ami en attente" + you_have_a_friend_request_from_this_person: "vous avez une requête d’ami de la part de cette personne" + new: + new_person: "Nouvelle personne" + back_to_list: "Retourner à la liste" + show: + last_seen: "dernière connexion : %{how_long_ago}" + friends_since: "amis depuis : %{how_long_ago}" + save: "sauvegarder" + are_you_sure: "Êtes-vous sûr ?" + remove_friend: "supprimer un ami" diff --git a/config/locales/diaspora/he.yml b/config/locales/diaspora/he.yml new file mode 100644 index 000000000..221a7c5f7 --- /dev/null +++ b/config/locales/diaspora/he.yml @@ -0,0 +1,208 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. +# Translated to Hebrew by Yaron Shahrabani , 2010. + + +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +he: + hello: "שלום עולם" + application: + helper: + unknown_person: "אדם לא ידוע" + new_requests: "בקשות חדשות" + dashboards: + helper: + home: "בית" + error_messages: + helper: + invalid_fields: "שדות שגויים" + correct_the_following_errors_and_try_again: "יש לתקן את השגיאות הבאות ולנסות שוב." + people: + helper: + results_for: " תוצאות עבור %{params}" + people_on_pod_are_aware_of: " אנשים בפוד מודעים לכך" + layouts: + application: + edit_profile: "עריכת הפרופיל" + logout: "יציאה" + shared: + aspect_nav: + all_aspects: "כל ההיבטים" + manage: "ניהול" + manage_your_aspects: "ניהול ההיבטים שלך" + sub_header: + all_aspects: "כל ההיבטים" + manage_aspects: "ניהול ההיבטים" + publisher: + share: "שיתוף" + aspect_friends: + add_friends: "הוספת חברים" + albums: + album: + you: "את/ה" + new_album: + create: "יצירה" + add_a_new_album: "הוספת אלבום חדש" + show: + edit_album: "עריכת אלבום" + albums: "אלבומים" + updated: "תאריך העדכון" + by: "על ידי" + edit: + editing: "עריכה" + updated: "תאריך העדכון" + are_you_sure: "בבטחה?" + delete_album: "מחיקת אלבום" + cancel: "ביטול" + index: + home: "בית" + new_album: "אלבום חדש" + create: + success: "יצרת אלבום בשם %{name}." + update: + success: "האלבום %{name} נערך בהצלחה." + failure: "אירע כשל בעריכת האלבום %{name}." + destroy: + success: "האלבום %{name} נמחק." + helper: + friends_albums: "אלבומים של חברים" + your_albums: "האלבומים שלך" + aspects: + index: + photos: "תמונות" + show: + photos: "תמונות" + manage: + add_a_new_aspect: "הוספת היבט חדש" + add_a_new_friend: "הוספת חבר חדש" + show: "הצגה" + update_aspects: "עדכון ההיבטים" + requests: "בקשות" + ignore_remove: "התעלמות/הסרה" + new_aspect: + add_a_new_aspect: "הוספת היבט חדש" + create: "יציאה" + create: + success: "יש ללחוץ על סמל הפלוס שמימין כדי לומר לדיאספורה מי יכול לצפות בהיבט החדש שלך." + destroy: + success: "%{name} הוסר בהצלחה." + update: + success: "ההיבט שלך, %{name}, נערך בהצלחה." + move_friends: + failure: "עריכת ההיבט נכשלה עבור החבר %{real_name}." + success: "ההיבטים נערכו בהצלחה." + move_friend: + failure: "לא עבד %{inspect}" + success: "כעת יופיע בפני החברים שלך היבט אחר שלך." + helper: + remove: "הסרה" + aspect_not_empty: "ההיבט אינו ריק" + users: + edit: + editing_profile: "עריכת הפרופיל" + profile: + cancel: "ביטול" + update_profile: "עדכון הפרופיל" + home: "בית" + diaspora_username: "שם המשתמש בדיאספורה" + info: "פרטים" + picture: "תמונה" + editing_profile: "עריכת הפרופיל" + albums: "אלבומים" + you_dont_have_any_photos: "אין לך תמונות! באפשרותך לגשת לעמוד" + page_to_upload_some: "כדי להעלות כמה." + comments: + comment: + ago: "לפני" + new_comment: + comment: "הערה" + photos: + show: + prev: "הקודמת" + full_size: "גודל מלא" + next: "הבאה" + edit_photo: "עריכת תמונה" + delete_photo: "מחיקת תמונה" + are_you_sure: "בבטחה?" + comments: "הערות" + edit: + editing: "עריכה" + are_you_sure: "בבטחה?" + delete_photo: "מחיקת תמונה" + photo: + show_comments: "הצגת הערות" + posted_a_new_photo_to: "פורסמה תמונה חדשה באלבום" + new: + new_photo: "תמונה חדשה" + back_to_list: "חזרה לרשימה" + post_it: "פרסום!" + create: + runtime_error: "העלאת התמונה נכשלה. הידקת את החגורה?" + integrity_error: "העלאת התמונה נכשלה. האם זו באמת הייתה תמונה?" + type_error: "העלאת התמונה נכשלה. האם באמת נוספה תמונה?" + update: + notice: "התמונה עודכנה בהצלחה." + error: "אירע כשל בעריכת התמונה." + destroy: + notice: "התמונה נמחקה." + registrations: + new: + sign_up: "הרשמה" + create: + success: "הצטרפת לדיאספורה!" + status_messages: + new_status_message: + tell_me_something_good: "בא לי לשמוע סיפור נחמד" + oh_yeah: "אחלה!" + status_message: + show_comments: "הצגת הערות" + delete: "מחיקה" + are_you_sure: "בבטחה?" + show: + status_message: "הודעת מצב" + comments: "הערות" + are_you_sure: "בבטחה?" + destroy: "הריסה" + view_all: "צפייה בכול" + message: "הודעה" + owner: "בעלים" + helper: + no_message_to_display: "אין הודעה להצגה." + people: + person: + add_friend: "הוספת חבר" + pending_request: "בקשה ממתינה" + index: + add_friend: "הוספת חבר" + real_name: "שם אמתי" + diaspora_handle: "כינוי בדיאספורה" + thats_you: "מדובר בך!" + friend_request_pending: "בקשת החברות ממתינה" + you_have_a_friend_request_from_this_person: "יש לך בקשת חברות מאדם זה" + new: + new_person: "אדם חדש" + back_to_list: "חזרה לרשימה" + show: + last_seen: "פעילות אחרונה: %{how_long_ago}" + friends_since: "חברים מאז: %{how_long_ago}" + save: "שמירה" + are_you_sure: "בבטחה?" + remove_friend: "הסרת חבר" + requests: + new_request: + add_a_new_friend_to: "הוספת חבר חדש אל" + enter_a_diaspora_username: "נא להזין שם משתמש בדיאספורה:" + your_diaspora_username_is: "שם המשתמש שלך בדיאספורה הוא: %{diaspora_handle}" + friends_username: "שם המשתמש של החבר" + destroy: + success: "אתם חברים כעת." + error: "נא לבחור בהיבט!" + ignore: "בקשות חברות מהן התעלמת." + create: + error: "לא נמצא זרע של דיאספורה בכתובת דוא״ל זו!" + already_friends: "את/ה ו%{destination_url} כבר חברים!" + success: "בקשת חברות נשלחה אל %{destination_url}." + horribly_wrong: "משהו השתבש לגמרי." diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml new file mode 100644 index 000000000..fe4b305cc --- /dev/null +++ b/config/locales/diaspora/it.yml @@ -0,0 +1,207 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for Italian. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +it: + hello: "Ciao mondo" + application: + helper: + unknown_person: "persona sconosciuta" + new_requests: "nuove richieste" + dashboards: + helper: + home: "home" + error_messages: + helper: + invalid_fields: "Campi non validi" + correct_the_following_errors_and_try_again: "Correggi i seguenti errori e riprova." + people: + helper: + results_for: " risultati per %{params}" + people_on_pod_are_aware_of: " persone su pod sono consapevoli di" + layouts: + application: + edit_profile: "modifica profilo" + logout: "disconnetti" + shared: + aspect_nav: + all_aspects: "Tutti gli Aspetti" + manage: "Gestisci" + manage_your_aspects: "Gestisci i tuoi Aspetti" + sub_header: + all_aspects: "Tutti gli Aspetti" + manage_aspects: "Gestisci Aspetti" + publisher: + share: "Condividi" + aspect_friends: + add_friends: "aggiungi amici" + albums: + album: + you: "tu" + new_album: + create: "crea" + add_a_new_album: "Aggiungi un nuovo album" + show: + edit_album: "Modifica album" + albums: "album" + updated: "aggiornato" + by: "da" + edit: + editing: "Modifica" + updated: "aggiornato" + are_you_sure: "Sei sicuro?" + delete_album: "Elimina album" + cancel: "Annulla" + index: + home: "home" + new_album: "Nuovo album" + create: + success: "Hai creato un album chiamato %{name}." + update: + success: "L'album %{name} è stato modificato." + failure: "Modifica dell'album %{name} fallita." + destroy: + success: "L'album %{name} è stato eliminato." + helper: + friends_albums: "Album degli amici" + your_albums: "I tuoi album" + aspects: + index: + photos: "foto" + show: + photos: "foto" + manage: + add_a_new_aspect: "Aggiungi un nuovo aspetto" + add_a_new_friend: "Aggiungi un nuovo amico" + show: "Mostra" + update_aspects: "Aggiorna Aspetti" + requests: "Richieste" + ignore_remove: "Ignora/Rimuovi" + new_aspect: + add_a_new_aspect: "Aggiungi un nuovo aspetto" + create: "Crea" + create: + success: "Clicca sul segno più nella parte sinistra per dire a Diaspora chi può vedere il tuo nuovo aspetto." + failure: "Creazione dell'aspetto fallita." + destroy: + success: "%{name} è stato rimosso con successo." + update: + success: "Il tuo aspetto, %{name}, è stato modificato con successo." + move_friends: + failure: "Modifica dell'aspetto fallita per l'amico %{real_name}." + success: "Aspetti modificati con successo." + move_friend: + failure: "non ha funzionato %{inspect}" + success: "Adesso stai mostrando al tuo amico un aspetto differente di te stesso." + helper: + remove: "rimuovi" + aspect_not_empty: "Aspetto non vuoto" + users: + edit: + editing_profile: "Modifica del profilo" + profile: + cancel: "Annulla" + update_profile: "Aggiorna profilo" + home: "Home" + diaspora_username: "NOME UTENTE DIASPORA" + info: "Info" + picture: "Immagine" + editing_profile: "Modifica del profilo" + albums: "Album" + you_dont_have_any_photos: "Non hai nessuna foto! Vai alla pagina" + page_to_upload_some: "per caricarne qualcuna." + comments: + comment: + ago: "fa" + new_comment: + comment: "Commento" + photos: + show: + prev: "indietro" + full_size: "dimensione intera" + next: "avanti" + edit_photo: "Modifica foto" + delete_photo: "Elimina foto" + are_you_sure: "Sei sicuro?" + comments: "commenti" + edit: + editing: "Modifica" + are_you_sure: "Sei sicuro?" + delete_photo: "Elimina foto" + photo: + show_comments: "mostra commenti" + posted_a_new_photo_to: "ha caricato una nuova foto in" + new: + new_photo: "Nuova foto" + back_to_list: "Torna all'elenco" + post_it: "inseriscila!" + create: + runtime_error: "Caricamento della foto fallito. Hai allacciato le cinture?" + integrity_error: "Caricamento della foto fallito. Sei sicuro che era un'immagine?" + type_error: "Caricamento della foto fallito. Sei sicuro di aver aggiunto un'immagine?" + update: + notice: "Foto aggiornata con successo." + error: "Modifica della foto fallita." + destroy: + notice: "Foto eliminata." + registrations: + new: + sign_up: "Iscriviti" + create: + success: "Ti sei unito a Diaspora!" + status_messages: + new_status_message: + tell_me_something_good: "dimmi qualcosa di buono" + oh_yeah: "oh si!" + status_message: + show_comments: "mostra commenti" + delete: "Elimina" + are_you_sure: "Sei sicuro?" + show: + status_message: "Messaggio di stato" + comments: "commenti" + are_you_sure: "Sei sicuro?" + destroy: "Distruggi" + view_all: "Vedi tutto" + message: "Messaggio" + owner: "Proprietario" + helper: + no_message_to_display: "Nessun messaggio da visualizzare." + people: + person: + add_friend: "aggiungi amico" + pending_request: "richiesta in sospeso" + index: + add_friend: "aggiungi amico" + real_name: "nome reale" + diaspora_handle: "diaspora handle" + thats_you: "sei tu!" + friend_request_pending: "richiesta d'amicizia in sospeso" + you_have_a_friend_request_from_this_person: "hai una richiesta d'amicizia da questa persona" + new: + new_person: "Nuova persona" + back_to_list: "Torna all'elenco" + show: + last_seen: "ultima visualizzazione: %{how_long_ago}" + friends_since: "amici da: %{how_long_ago}" + save: "salva" + are_you_sure: "Sei sicuro?" + remove_friend: "rimuovi amico" + requests: + new_request: + add_a_new_friend_to: "Aggiungi un amico a" + enter_a_diaspora_username: "Inserisci un nome utente Diaspora:" + your_diaspora_username_is: "Il tuo nome utente Diaspora è: %{diaspora_handle}" + friends_username: "nome utente dell'amico" + destroy: + success: "Adesso siete amici." + error: "Seleziona un aspetto!" + ignore: "Ignora richiesta di amicizia." + create: + error: "Nessun seed Diaspora trovato con questa email!" + already_friends: "Sei già amico con %{destination_url}!" + success: "Una richiesta di amicizia è stata inviata a %{destination_url}." + horribly_wrong: "Qualcosa è andato orribilmente storto." diff --git a/config/locales/lt.yml b/config/locales/diaspora/lt.yml similarity index 99% rename from config/locales/lt.yml rename to config/locales/diaspora/lt.yml index e1a529431..01295e389 100644 --- a/config/locales/lt.yml +++ b/config/locales/diaspora/lt.yml @@ -2,7 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Sample localization file for Lithuanian. Add more files in this directory for other locales. # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. diff --git a/config/locales/diaspora/nb.yml b/config/locales/diaspora/nb.yml new file mode 100644 index 000000000..6e2dc0ad3 --- /dev/null +++ b/config/locales/diaspora/nb.yml @@ -0,0 +1,207 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + hello: "Hallo, verden!" + application: + helper: + unknown_person: "ukjent person" + new_requests: "nye forespørsler" + dashboards: + helper: + home: "hjem" + error_messages: + helper: + invalid_fields: "Ugyldige felter" + correct_the_following_errors_and_try_again: "Rett opp de følgende feilene og prøv igjen." + people: + helper: + results_for: " resultater for %{params}" + people_on_pod_are_aware_of: " folk i belgen er oppmerksomme på" + layouts: + application: + edit_profile: "endre profil" + logout: "logg ut" + shared: + aspect_nav: + all_aspects: "Alle aspekter" + manage: "Organisere" + manage_your_aspects: "Organiser aspektene dine" + sub_header: + all_aspects: "Alle aspekter" + manage_aspects: "Organiser aspekter" + publisher: + share: "Del" + aspect_friends: + add_friends: "legg til venner" + albums: + album: + you: "deg" + new_album: + create: "Opprett" + add_a_new_album: "Legg til et nytt album" + show: + edit_album: "Endre album" + albums: "album" + updated: "oppdatert" + by: "av" + edit: + editing: "Redigerer" + updated: "oppdatert" + are_you_sure: "Er du sikker?" + delete_album: "Slett album" + cancel: "Avbryt" + index: + home: "hjem" + new_album: "Nytt album" + create: + success: "Du har oppretta albumet %{name}." + update: + success: "Albumet %{name} er endra." + failure: "Greide ikke å endre albumet %{name}." + destroy: + success: "Albumet %{name} er sletta." + helper: + friends_albums: "Venners album" + your_albums: "Dine album" + aspects: + index: + photos: "bilder" + show: + photos: "bilder" + manage: + add_a_new_aspect: "Legg til et nytt aspekt" + add_a_new_friend: "Legg til en ny venn" + show: "Vis" + update_aspects: "Oppdater aspekter" + requests: "Forespørsler" + ignore_remove: "Ignorer/fjern" + new_aspect: + add_a_new_aspect: "Legg til et nytt aspekt" + create: "Opprett" + create: + success: "Klikk på plusstegnet på venstre side for å fortelle Diaspora hvem som kan se det nye aspektet ditt." + failure: "Greide ikke å opprette aspektet." + destroy: + success: "%{name} har blitt fjerna." + update: + success: "Aspektet ditt, %{name}, har blitt endra." + move_friends: + failure: "Greide ikke å endre aspektet for vennen %{real_name}." + success: "Aspektene har blitt endra." + move_friend: + failure: "virka ikke %{inspect}" + success: "Vennen din ser nå et annet aspekt av deg." + helper: + remove: "fjern" + aspect_not_empty: "Aspektet er ikke tomt" + users: + edit: + editing_profile: "Redigerer profil" + profile: + cancel: "Avbryt" + update_profile: "Oppdater profil" + home: "Hjem" + diaspora_username: "DIASPORA-BRUKERNAVN" + info: "Informasjon" + picture: "Bilde" + editing_profile: "Redigerer profil" + albums: "Album" + you_dont_have_any_photos: "Du har ikke noen bilder! Gå til" + page_to_upload_some: "for å laste opp noen." + comments: + comment: + ago: "sia" + new_comment: + comment: "Kommenter" + photos: + show: + prev: "forrige" + full_size: "full størrelse" + next: "neste" + edit_photo: "Rediger bilde" + delete_photo: "Slett bilde" + are_you_sure: "Er du sikker?" + comments: "kommentarer" + edit: + editing: "Redigerer" + are_you_sure: "Er du sikker?" + delete_photo: "Slett bilde" + photo: + show_comments: "vis kommentarer" + posted_a_new_photo_to: "la til ett nytt bilde i" + new: + new_photo: "Nytt bilde" + back_to_list: "Tilbake til lista" + post_it: "legg ut!" + create: + runtime_error: "Greide ikke å laste opp bildet. Er du sikker på at setebeltet er festa?" + integrity_error: "Greide ikke å laste opp bildet. Er du sikker på at det var et bilde?" + type_error: "Greide ikke å laste opp bildet. Er du sikker på at et bilde ble lagt til?" + update: + notice: "Bildet er oppdatert." + error: "Greide ikke å endre bildet." + destroy: + notice: "Bildet er sletta." + registrations: + new: + sign_up: "Registrer deg" + create: + success: "Du er nå med i Diaspora!" + status_messages: + new_status_message: + tell_me_something_good: "Fortell noe tøft" + oh_yeah: "Ja da!" + status_message: + show_comments: "vis kommentarer" + delete: "Slett" + are_you_sure: "Er du sikker?" + show: + status_message: "Statusmelding" + comments: "kommentarer" + are_you_sure: "Er du sikker?" + destroy: "Utslett" + view_all: "Vis alle" + message: "Melding" + owner: "Eier" + helper: + no_message_to_display: "Ingen melding å vise." + people: + person: + add_friend: "legg til venn" + pending_request: "venter på svar" + index: + add_friend: "legg til venn" + real_name: "ekte navn" + diaspora_handle: "diaspora-bruker" + thats_you: "det er deg!" + friend_request_pending: "ubesvart venneforespørsel" + you_have_a_friend_request_from_this_person: "du har en venneforespørsel fra denne personen" + new: + new_person: "Ny person" + back_to_list: "Tilbake til lista" + show: + last_seen: "sist sett: %{how_long_ago}" + friends_since: "venner sia: %{how_long_ago}" + save: "lagre" + are_you_sure: "Er du sikker?" + remove_friend: "fjern venn" + requests: + new_request: + add_a_new_friend_to: "Legg til en ny venn i" + enter_a_diaspora_username: "Skriv en Diaspora-bruker:" + your_diaspora_username_is: "Din Diaspora-bruker er: %{diaspora_handle}" + friends_username: "Brukeren til vennen" + destroy: + success: "Dere er nå venner." + error: "Velg et aspekt først!" + ignore: "Ignorerte venneforespørsel" + create: + error: "Fant ingen diasporabruker med denne e-posten!" + already_friends: "Du er allerede venn med %{destination_url}!" + success: "Du sendte en venneforespørsel til %{destination_url}." + horribly_wrong: "Noe gikk forferdelig galt." diff --git a/config/locales/en.yml b/config/locales/diaspora/pl.yml similarity index 91% rename from config/locales/en.yml rename to config/locales/diaspora/pl.yml index 1de275cf9..c55b79691 100644 --- a/config/locales/en.yml +++ b/config/locales/diaspora/pl.yml @@ -2,9 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - # Sample localization file for English. Add more files in this directory for other locales. # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. -en: - hello: "Hello world" +pl: + hello: "Witaj świecie" diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml new file mode 100644 index 000000000..e8ffcc8e1 --- /dev/null +++ b/config/locales/diaspora/pt-BR.yml @@ -0,0 +1,206 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for Portuguese Brazilian. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +pt-BR: + hello: "Olá mundo" + application: + helper: + unknown_person: "pessoa desconhecida" + new_requests: "nova requisição" + dashboards: + helper: + home: "casa" + error_messages: + helper: + invalid_fields: "Campos inválidos" + correct_the_following_errors_and_try_again: "Corrija os erros a seguir e tente novamente." + people: + helper: + results_for: " resultados para %{params}" + people_on_pod_are_aware_of: " pessoas no pod estão conscientes de" + layouts: + application: + edit_profile: "editar perfil" + logout: "sair" + shared: + aspect_nav: + all_aspects: "Todos Aspectos" + manage: "Gerenciar" + manage_your_aspects: "Gerencie seus Aspectos" + sub_header: + all_aspects: "Todos Aspectos" + manage_aspects: "Gerenciar Aspectos" + publisher: + share: "Compartilhar" + aspect_friends: + add_friends: "adicionar amigos" + albums: + album: + you: "você" + new_album: + create: "criar" + add_a_new_album: "Adicionar novo álbum" + show: + edit_album: "Editar Álbum" + albums: "álbuns" + updated: "atualizado" + by: "por" + edit: + editing: "Editando" + updated: "atualizado" + are_you_sure: "Tem certeza?" + delete_album: "Excluir Álbum" + cancel: "Cancelar" + index: + home: "home" + new_album: "Novo Álbum" + create: + success: "Você criou com sucesso um álbum chamado %{name}." + update: + success: "O álbum %{name} foi editado com sucesso." + failure: "Erro ao editar o álbum %{name}." + destroy: + success: "O álbum %{name} foi excluído com sucesso." + helper: + friends_albums: "Álbum de amigos" + your_albums: "Seus álbuns" + aspects: + index: + photos: "photos" + show: + photos: "photos" + manage: + add_a_new_aspect: "Adicionar um novo aspecto" + add_a_new_friend: "Adicionar um novo amigo" + show: "Exibir" + update_aspects: "Atualizar Aspectos" + requests: "Solicitações" + ignore_remove: "Ignorar/Excluir" + new_aspect: + add_a_new_aspect: "Adicionar um novo aspecto" + create: "Criar" + create: + success:"Clique no mais(+) do lado esquerdo para dizer ao Diaspora quem pode ver seu novo aspecto." + destroy: + success: "%{name} foi removido com sucesso." + update: + success: "Seu aspecto, %{name}, foi editado com sucesso." + move_friends: + failure: "Falha ao editar aspecto para o amigo(a) %{real_name}." + success: "Aspectos editados com sucesso." + move_friend: + failure: "não funcionou %{inspect}" + success: "Você está agora mostrando um diferente aspecto seu a um amigo(a)." + helper: + remove: "remover" + aspect_not_empty: "Aspecto não está vazio" + users: + edit: + editing_profile: "Editando perfil" + profile: + cancel: "Cancelar" + update_profile: "Atualizar Perfil" + home: "Home" + diaspora_username: "NOME DE USUÁRIO DIASPORA" + info: "Informações" + picture: "Imagem" + editing_profile: "Editando perfil" + albums: "Álbuns" + you_dont_have_any_photos: "Você não possui nenhuma photo! Vá para" + page_to_upload_some: "para fazer o upload de alguma." + comments: + comment: + ago: "atrás" + new_comment: + comment: "Comentário" + photos: + show: + prev: "anterior" + full_size: "tamanho máximo" + next: "próxima" + edit_photo: "Editar Foto" + delete_photo: "Excluir Foto" + are_you_sure: "Tem certeza?" + comments: "comentários" + edit: + editing: "Editando" + are_you_sure: "Tem certeza?" + delete_photo: "Excluir Foto" + photo: + show_comments: "exibir comentários" + posted_a_new_photo_to: "enviada um nova foto para" + new: + new_photo: "Nova Foto" + back_to_list: "Voltar para a Lista" + post_it: "enviar!" + create: + runtime_error: "Envio de foto falhou. Você tem tem certeza que seu sinto de segurança está preso?" + integrity_error: "Envio de foto falhou. Você tem certeza que é uma imagem?" + type_error: "Envio de foto falhou. Você tem certeza que adicionou uma imagem?" + update: + notice: "Foto enviada com sucesso." + error: "Falha ao editar foto." + destroy: + notice: "Foto removida." + registrations: + new: + sign_up: "Cadastro" + create: + success: "Vocé entrou na Diaspora!" + status_messages: + new_status_message: + tell_me_something_good: "diga-me qualquer coisa legal" + oh_yeah: "É isso aí!" + status_message: + show_comments: "exibir comentários" + delete: "Excluir" + are_you_sure: "Tem certeza?" + show: + status_message: "Mensagem de Status" + comments: "comentários" + are_you_sure: "Tem certeza?" + destroy: "Excluir" + view_all: "Exibir Todas" + message: "Mensagem" + owner: "Pertence a" + helper: + no_message_to_display: "Nenhuma mensagem para ser mostrada." + people: + person: + add_friend: "adicionar amigo(a)" + pending_request: "requisições pendentes" + index: + add_friend: "adicionar amigo(a)" + real_name: "nome real" + diaspora_handle: "diaspora handle" + thats_you: "esse é você!" + friend_request_pending: "pedido de amizade pendente" + you_have_a_friend_request_from_this_person: "você possui um pedido de amizade dessa pessoa" + new: + new_person: "Nova Pessoa" + back_to_list: "Voltar para a Lista" + show: + last_seen: "visto pela última vez a: %{how_long_ago}" + friends_since: "amigos desde: %{how_long_ago}" + save: "salvar" + are_you_sure: "Tem certeza?" + remove_friend: "excluir amigo" + requests: + new_request: + add_a_new_friend_to: "Adicionar novo amigo(a) em" + enter_a_diaspora_username: "Digite seu nome de usuário Diaspora:" + your_diaspora_username_is: "Seu nome de usuário Diaspora é: %{diaspora_handle}" + friends_username: "Nome de usuário do Amigo(a)" + destroy: + success: "Vocês agora são amigos." + error: "Favor selecionar um aspecto!" + ignore: "Requisições de amigos ignoradas." + create: + error: "Nenhum semente Diaspora encontrado com esse email." + already_friends: "Você já é amigo(a) de %{destination_url}!" + success: "Uma requisição de amizade foi enviada para %{destination_url}." + horribly_wrong: "Algo horrível aconteceu." diff --git a/config/locales/diaspora/pt-PT.yml b/config/locales/diaspora/pt-PT.yml new file mode 100644 index 000000000..6df399150 --- /dev/null +++ b/config/locales/diaspora/pt-PT.yml @@ -0,0 +1,9 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for Portuguese Portugal. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +pt-PT: + hello: "Olá mundo" diff --git a/config/locales/diaspora/ro.yml b/config/locales/diaspora/ro.yml new file mode 100644 index 000000000..ed3234571 --- /dev/null +++ b/config/locales/diaspora/ro.yml @@ -0,0 +1,141 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +ro: + hello: "Bună, lume!" + layouts: + application: + edit_profile: "editare profil" + logout: "deconectare" + shared: + aspect_nav: + all_aspects: "Toate Aspectele" + manage: "Administrare" + manage_your_aspects: "Administrare Aspecte" + sub_header: + all_aspects: "Toate Aspectele" + manage_aspects: "Administrare Aspecte" + publisher: + share: "Distribuie" + aspect_friends: + add_friends: "adăugare prieteni" + albums: + album: + you: "tu" + new_album: + create: "crează" + add_a_new_album: "Album nou" + show: + edit_album: "Editare Album" + albums: "albume" + updated: "actualizat" + by: "de" + edit: + editing: "Editare" + updated: "actualizat" + are_you_sure: "Sunteți sigur(ă)?" + delete_album: "Șterge Album" + cancel: "Renuță" + index: + home: "acasă" + new_album: "Album Nou" + create: + success: "Ați creat un album numit %{name}." + update: + success: "Albumul %{name} a fost modificat cu succes." + failure: "Eroare la editarea albumului %{name}." + destroy: + success: "Albumul %{name} a fost șters." + aspects: + index: + photos: "poze" + show: + photos: "poze" + manage: + add_a_new_aspect: "Adaugă aspect" + add_a_new_friend: "Adadugă prieten" + show: "Arată" + update_aspects: "Actualizează Aspecte" + requests: "Cereri" + ignore_remove: "Ignoră/Șterge" + new_aspect: + add_a_new_aspect: "Adaugă aspect" + create: "Crează" + create: + success:"Click pe semnul plus în partea stângă pentru a indica cine poate accesa noul aspect." + users: + edit: + editing_profile: "Editare profil" + profile: + cancel: "Renunță" + update_profile: "Actualizează Profil" + home: "Home" + diaspora_username: "DIASPORA USERNAME" + info: "Info" + picture: "Poză" + editing_profile: "Editare profil" + albums: "Albume" + you_dont_have_any_photos: "Nu ai nici o fotografie! Mergi la" + page_to_upload_some: "pentru a încărca câteva." + comments: + comment: + ago: "în urmă" + new_comment: + comment: "Comentariu" + photos: + show: + prev: "precedent" + full_size: "mărime deplină" + next: "următor" + edit_photo: "Modifică Poză" + delete_photo: "Șterge Poză" + are_you_sure: "Sunteți sigur(ă)?" + comments: "comments" + edit: + editing: "Modificare" + are_you_sure: "Sunteți sigur(ă)?" + delete_photo: "Șterge poză" + photo: + show_comments: "arată comentarii" + posted_a_new_photo_to: "a postat o nouă poză în" + new: + new_photo: "Poză nouă" + back_to_list: "Înapoi la Listă" + post_it: "postează!" + registrations: + new: + sign_up: "Înregistrare" + status_messages: + new_status_message: + tell_me_something_good: "spune-mi ceva bun" + oh_yeah: "o, da!" + status_message: + show_comments: "arată comentarii" + delete: "Șterge" + are_you_sure: "Sunteți sigur(ă)?" + show: + status_message: "Mesaj Stare" + comments: "comentarii" + are_you_sure: "Sunteți sigur(ă)?" + destroy: "Distruge" + view_all: "Vezi Toate" + message: "Mesaj" + owner: "Proprietar" + people: + index: + add_friend: "adaugă prieten" + real_name: "nume real" + diaspora_handle: "diaspora id" + thats_you: "acesta ești tu!" + friend_request_pending: "cerere de prietenie nerezolvată" + you_have_a_friend_request_from_this_person: "aveți o cerere de prietenie din partea acestei persoane" + new: + new_person: "Persoană Nouă" + back_to_list: "Înapoi la Listă" + show: + last_seen: "văzut: %{how_long_ago}" + friends_since: "prieteni: %{how_long_ago}" + save: "salvează" + are_you_sure: "Sunteți sigur(ă)?" + remove_friend: "șterge prieten" diff --git a/config/locales/diaspora/ru.yml b/config/locales/diaspora/ru.yml new file mode 100644 index 000000000..f432c82d6 --- /dev/null +++ b/config/locales/diaspora/ru.yml @@ -0,0 +1,163 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Sample localization file for Russian. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +ru: + hello: "Привет, мир" + layouts: + application: + edit_profile: "редактировать профиль" + logout: "выйти" + shared: + aspect_nav: + all_aspects: "Все аспекты" + manage: "Управление" + manage_your_aspects: "Управление вашими аспектами" + sub_header: + all_aspects: "Все аспекты" + manage_aspects: "Управление аспектами" + publisher: + share: "Опубликовать" + aspect_friends: + add_friends: "добавить друзей" + albums: + album: + you: "Вы" + new_album: + create: "создать" + add_a_new_album: "Добавить новый альбом" + show: + edit_album: "Редактировать альбом" + albums: "альбомы" + updated: "обновленные" + by: "по" + edit: + editing: "Редактирование" + updated: "обновлено" + are_you_sure: "Вы уверены?" + delete_album: "Удалить альбом" + cancel: "Отмена" + index: + home: "домой" + new_album: "Новый альбом" + create: + success: "Вы создали новый альбом %{name}." + update: + success: "Альбом %{name} успешно редактирован." + failure: "Невозможно редактировать альбом %{name}." + destroy: + success: "Альбом %{name} удален." + aspects: + index: + photos: "фотографии" + show: + photos: "фотографии" + manage: + add_a_new_aspect: "Добавить аспект" + add_a_new_friend: "Добавить друга" + show: "Показать" + update_aspects: "Обновить аспекты" + requests: "Запросы" + ignore_remove: "Игнорировать/Удалить" + new_aspect: + add_a_new_aspect: "Добавить аспект" + create: "Создать" + create: + success:"Нажмите на плюс слева, для того, что-бы указать Diaspora тех, кто может видеть ваш новый аспект + helper: + remove: "Удалить" + aspect_not_empty: "Аспект не пуст" + users: + edit: + editing_profile: "Редактирование профиля" + profile: + cancel: "Отмена" + update_profile: "Обновить профиль" + home: "Домой" + diaspora_username: "Имя пользователя DIASPORA" + info: "Информация" + picture: "Аватар" + editing_profile: "Редактирование профиля" + albums: "Альбомы" + you_dont_have_any_photos: "У вас нет ни одной фотографии! Перейдите в" + page_to_upload_some: "для загрузки." + or: "или" + comments: + comment: + ago: "ранее" + new_comment: + comment: "Комментарий" + photos: + show: + prev: "предыдущая" + full_size: "полный размер" + next: "следующая" + edit_photo: "Редактировать" + delete_photo: "Удалить" + are_you_sure: "Вы уверены?" + comments: "комментарии" + edit: + editing: "Редактирование" + are_you_sure: "Вы уверены?" + delete_photo: "Удалить фотографию" + photo: + show_comments: "показать комментарии" + posted_a_new_photo_to: "опубликовано в" + new: + new_photo: "Новая фотография" + back_to_list: "Вернуться к списку" + post_it: "опубликовать!" + registrations: + new: + sign_up: "Выйти" + status_messages: + new_status_message: + tell_me_something_good: "скажи мне что-нибудь хорошее" + oh_yeah: "о да!" + status_message: + show_comments: "показать комментарии" + delete: "Удалить" + are_you_sure: "Вы уверены?" + show: + status_message: "Сообщение о статусе" + comments: "комментарии" + are_you_sure: "Вы уверены?" + destroy: "Уничтожить" + view_all: "Показать все" + message: "Сообщение" + owner: "Владелец" + people: + index: + add_friend: "добавить друга" + real_name: "настоящее имя" + diaspora_handle: "идентификатор diaspora" + thats_you: "это Вы!" + friend_request_pending: "запрос на дружбу в ожидании" + you_have_a_friend_request_from_this_person: "у вас есть запрос на дружбу от этого человека" + new: + new_person: "Новая персона" + back_to_list: "Обратно к списку" + show: + last_seen: "последний раз был %{how_long_ago}" + friends_since: "друзья с %{how_long_ago}" + save: "сохранить" + are_you_sure: "Вы уверены?" + remove_friend: "удалить друга" + requests: + new_request: + add_a_new_friend_to: "добавить нового друга к" + enter_a_diaspora_username: "Введите имя пользователя Diaspora:" + your_diaspora_username_is: "Ваше имя пользователя Diaspora: %{diaspora_handle}" + friends_username: "Имя пользователя друга" + destroy: + success: "Теперь вы друзья." + error: "Выберите аспект!" + ignore: "Игнорированные запросы дружбы." + create: + error: "Для этого адреса не найдено семя Diaspora!" + already_friends: "Вы уже друзья с %{destination_url}!" + success: "Запрос на дружбу выслан к %{destination_url}." + horribly_wrong: "Что-то пошло совсем не так." diff --git a/test/selenium/login_test.rb b/config/locales/diaspora/sv.yml similarity index 51% rename from test/selenium/login_test.rb rename to config/locales/diaspora/sv.yml index 321d46e1d..1aa9ac2dc 100644 --- a/test/selenium/login_test.rb +++ b/config/locales/diaspora/sv.yml @@ -2,12 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +# Swedish localization file. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. - -class SampleWebratTest < ActionController::IntegrationTest - - def test_widget - visit "/" - assert_contain "sign in" - end -end +sv: + hello: "Hej" diff --git a/config/routes.rb b/config/routes.rb index 188c4b137..12fae72e6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,41 +2,49 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - Diaspora::Application.routes.draw do - resources :people, :only => [:index, :show, :destroy] - resources :users, :except => [:create, :new, :show] - resources :status_messages, :only => [:create, :destroy, :show] - resources :comments, :except => [:index] - resources :requests, :except => [:edit, :update] - resources :photos, :except => [:index] + resources :people, :only => [:index, :show, :destroy] + resources :status_messages, :only => [:create, :destroy, :show] + resources :comments, :except => [:index] + resources :requests, :except => [:edit, :update] + resources :photos, :except => [:index] resources :albums - match 'aspects/manage', :to => 'aspects#manage' - resources :aspects, :except => [:edit] + # added public route to user + match 'public/:username', :to => 'users#public' + resources :users, :except => [:create, :new, :show] + match 'aspects/move_friends', :to => 'aspects#move_friends', :as => 'move_friends' - match 'aspects/move_friend', :to => 'aspects#move_friend', :as => 'move_friend' + match 'aspects/move_friend', :to => 'aspects#move_friend', :as => 'move_friend' + match 'aspects/manage', :to => 'aspects#manage' + match 'aspects/public', :to => 'aspects#public' + resources :aspects, :except => [:edit] - match 'warzombie', :to => "dev_utilities#warzombie" - match 'zombiefriends', :to => "dev_utilities#zombiefriends" - match 'zombiefriendaccept', :to => "dev_utilities#zombiefriendaccept" - match 'set_backer_number', :to => "dev_utilities#set_backer_number" - match 'set_profile_photo', :to => "dev_utilities#set_profile_photo" + match 'services/create', :to => "services#create" + match 'services/destroy', :to => "services#destroy" + match 'services/fb_post', :to => "services#fb_post" + match 'warzombie', :to => "dev_utilities#warzombie" + match 'zombiefriends', :to => "dev_utilities#zombiefriends" + match 'zombiefriendaccept', :to => "dev_utilities#zombiefriendaccept" + match 'set_backer_number', :to => "dev_utilities#set_backer_number" + match 'set_profile_photo', :to => "dev_utilities#set_profile_photo" #routes for devise, not really sure you will need to mess with this in the future, lets put default, #non mutable stuff in anohter file devise_for :users, :controllers => {:registrations => "registrations"} match 'login', :to => 'devise/sessions#new', :as => "new_user_session" match 'logout', :to => 'devise/sessions#destroy', :as => "destroy_user_session" - match 'signup', :to => 'registrations#new', :as => "new_user_registration" + match 'signup', :to => 'registrations#new', :as => "new_user_registration" - match 'get_to_the_choppa', :to => redirect("/signup") + match 'get_to_the_choppa', :to => redirect("/signup") #public routes # + match 'webfinger', :to => 'publics#webfinger' match 'hcard/users/:id', :to => 'publics#hcard' + match 'hub', :to => 'publics#hub' + match '.well-known/host-meta',:to => 'publics#host_meta' match 'receive/users/:id', :to => 'publics#receive' match 'log', :to => "dev_utilities#log" diff --git a/config/selenium.yml b/config/selenium.yml index 74ce21d73..0d679b602 100644 --- a/config/selenium.yml +++ b/config/selenium.yml @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - common: &common # Try to kill mongrel after suite if tmp/pids/mongrel_selenium.pid exists # kill_mongrel_after_suite: true diff --git a/config/sprinkle/conf/nginx.conf b/config/sprinkle/conf/nginx.conf index eba9fa45b..188daedcb 100644 --- a/config/sprinkle/conf/nginx.conf +++ b/config/sprinkle/conf/nginx.conf @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - worker_processes 1; pid /tmp/pids/nginx.pid; diff --git a/config/sprinkle/deploy_key/id_rsa b/config/sprinkle/deploy_key/id_rsa deleted file mode 100644 index 133715158..000000000 --- a/config/sprinkle/deploy_key/id_rsa +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAvCyAkyAMbn+flqwLIEnPL08iY8dWpkel1wtXXjUtaINjuvZ7 -2XwK7ntnVHVRm49t+QFMWh8SpxDHnJDgb3X6uYem2DzB6L8HtuFVFN5lOUi+TeiI -LJsBmiGHc1tQwGB0jqmCG0J2QBDpDiw//ktOJNlZJfnPGY+4viSXwWpYhhh1v3ij -Inmp0+lw7z0+TyklNGVEsr6emwkgo5t20ClAQDmwy1BeYBcmtAehF55V3aSPQt1d -+hCmwl11PR6BLuGYgRirr4Xyc/GmyZVKkz8dLv40X+/Bk2D7owO+N5hf74EB1e3r -7Vu7LAfUOdtOFQJV5SWr3HTPo5vvU1oqR4VViQIBIwKCAQEApqsSy3QoRJzsb4Jw -QStuXRo0ZwEDmpc7HY2zyHg+KV5uRoKK89REMlALEEqnXeVwCG7dOeEB5G3yoJ2T -lewnNpy4WR/e8rfTofrHs2XkoHOhPbCzIDGFE3zIbXzD3ZdCqj5dS1gfl9R2picx -XZMn9MCCKPMzxi7W1ExL5dM4dsOuPRvie+nYGWvvv/LXvFTLFXDVwGXOhfDkLocv -r6STaUMj7RzLJneawOg1YS1Ivsj+Db4Q+abB4mRRhOe6igYu9Zd0ve8XAjJAHbx2 -Kzl5XKj8fhOSwXyLBh+enqHv0yLR7GaZn0odjNdUeWdD0kF9DnsL3VMa12wmNXtu -48bX3wKBgQDzPRDyYmBIKp/eStzAEmkVz98JmQQoX3tF0VrVdLK0j0nLB19jbHl8 -poHaPG8qIgGfFMwdhLOJmJ6CXa4eHffLJ0c32Ow+jQ+Is70Ssn6WSq0962WuuoWA -ARUwhyO9BaWvzTnMCYDI+dSydM26cvDmTTuvCJDbifmAkArgWGqM4wKBgQDGC9za -VTqnfBHGBXebLk/PRA8YOD9CvRrIrjylUxeSrbScK9i6v+1WK3dZCl8j7H3yYJ3B -8CT38FXxrHtGIn+5XU++fAeiLrnmNlYFCsn1nLt2SUqvODYYefxm/Vq1LQaWknHV -itnZF1CIltLLMI2w2iVCA0xRqots6gX+SMarowKBgQC7pCMEIAEhuntTthgB4lEQ -047M48Fg+TM13AQ+RBTUboliG6FbU64s9XodYdIZMC0i8slYmZHQi616gsgl3JqV -Z3F0OaBNgsLXK5HbOT0U2oWky4j0gUJqD3a/CSoyuzasMJpM8WNZNcFWd1zgSgpL -QuTmHI0BIUtxzjRGqptWvQKBgGAxpckiFSzHO9U12wI7ENJi4sKe+ie678CPJMVU -PqZUXwoGqxjg4P332uIa+wLR9AgDCsvpq45eyqiVmvYuA4XrfoEXq++wS6pU5/PS -ClK512VWzID+C6V9FDIGB3ySNmZkYy000DY+hjO2+KvVwSoDjnCFQlONWanuAuk5 -So3hAoGBALfkYFRtSilhvtjOnnil0hdyUbCcRmKeUYl2Yb/cb3JmUfi9xRur7K46 -Okwba+mnOJQT0kefFEUwsP9UPVLgppVh+llyAal1aJ5OnXn1o996TGTfNmy1aThr -aaGeAU2u8GFBiBrz9tRwzZo8ixUEZZrGFFN/n53bDHpBsbhRvHGX ------END RSA PRIVATE KEY----- diff --git a/config/sprinkle/deploy_key/id_rsa.pub b/config/sprinkle/deploy_key/id_rsa.pub deleted file mode 100644 index e0b8e3715..000000000 --- a/config/sprinkle/deploy_key/id_rsa.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvCyAkyAMbn+flqwLIEnPL08iY8dWpkel1wtXXjUtaINjuvZ72XwK7ntnVHVRm49t+QFMWh8SpxDHnJDgb3X6uYem2DzB6L8HtuFVFN5lOUi+TeiILJsBmiGHc1tQwGB0jqmCG0J2QBDpDiw//ktOJNlZJfnPGY+4viSXwWpYhhh1v3ijInmp0+lw7z0+TyklNGVEsr6emwkgo5t20ClAQDmwy1BeYBcmtAehF55V3aSPQt1d+hCmwl11PR6BLuGYgRirr4Xyc/GmyZVKkz8dLv40X+/Bk2D7owO+N5hf74EB1e3r7Vu7LAfUOdtOFQJV5SWr3HTPo5vvU1oqR4VViQ== Diaspora deploy key diff --git a/config/sprinkle/deploy_key/known_hosts b/config/sprinkle/deploy_key/known_hosts deleted file mode 100644 index 6b07b19ca..000000000 --- a/config/sprinkle/deploy_key/known_hosts +++ /dev/null @@ -1,2 +0,0 @@ -|1|1DLdTjtEIabpLiLzhVOp7colQSQ=|/Nw4MuJAYIztcexQDWF3NQoEljs= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== -|1|j1rKwLcrA2MgHhcpdVf04ig02Hs=|Y4Jl+8HpsTyFlhSwoVxSVeRsf3k= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== diff --git a/config/sprinkle/packages/database.rb b/config/sprinkle/packages/database.rb index 2463007ff..ef290b424 100644 --- a/config/sprinkle/packages/database.rb +++ b/config/sprinkle/packages/database.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - #package :mongo, :provides => :database do # description 'Mongodb' # version '1.4.3' @@ -11,10 +9,9 @@ #end package :mongodb, :provides => :database do - description 'Mongodb debian package.' - version '1.4.3' - - binary "http://downloads.mongodb.org/linux/mongodb-linux-x86_64-static-legacy-#{version}.tgz" do + description 'Mongodb binary.' + version '1.6.3' + binary "http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-static-legacy-#{version}.tgz" do post :install, "ln -s -f /usr/local/bin/mongodb-linux-x86_64-static-#{version}/bin/mongod /usr/bin/mongod" end end diff --git a/config/sprinkle/packages/essential.rb b/config/sprinkle/packages/essential.rb index fba076e27..8b4349d06 100644 --- a/config/sprinkle/packages/essential.rb +++ b/config/sprinkle/packages/essential.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - ## Special package, anything that defines a 'source' package means build-essential should be installed for Ubuntu package :build_essential do diff --git a/config/sprinkle/packages/ruby.rb b/config/sprinkle/packages/ruby.rb index 708ab0eeb..c29af29cf 100644 --- a/config/sprinkle/packages/ruby.rb +++ b/config/sprinkle/packages/ruby.rb @@ -2,15 +2,13 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - ## Defines available packages package :ruby do description 'Ruby Virtual Machine' - version '1.8.7' - patchlevel '249' - source "ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-#{version}-p#{patchlevel}.tar.gz" # implicit :style => :gnu + version '1.9.2' + patchlevel '0' + source "ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-#{version}-p#{patchlevel}.tar.gz" requires :ruby_dependencies end @@ -25,25 +23,25 @@ package :rubygems do source "http://production.cf.rubygems.org/rubygems/rubygems-#{version}.tgz" do custom_install 'ruby setup.rb' end - run( "PATH=$PATH:/var/lib/gems/1.8/bin") + run( "PATH=$PATH:/var/lib/gems/1.9/bin") run( "export PATH") requires :ruby end package :bundler do description 'bundler' - version '0.9.26' + version '1.0.0' gem 'bundler' requires :rubygems end package :diaspora_dependencies do description 'random dependencies' - apt %w(libxslt1.1 libxslt1-dev libxml2 libgpgme11-dev imagemagick libmagick9-dev) + apt %w(libxslt1.1 libxslt1-dev libxml2 imagemagick libmagick9-dev) end #package :diaspora do # description 'Diaspora' - + =begin package :rails do description 'Ruby on Rails' diff --git a/config/sprinkle/packages/scm.rb b/config/sprinkle/packages/scm.rb index 22ece7d98..981214a60 100644 --- a/config/sprinkle/packages/scm.rb +++ b/config/sprinkle/packages/scm.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - package :git, :provides => :scm do description 'Git Distributed Version Control' apt %w( git-core ) diff --git a/config/sprinkle/packages/server.rb b/config/sprinkle/packages/server.rb index 68e1a12aa..004883dad 100644 --- a/config/sprinkle/packages/server.rb +++ b/config/sprinkle/packages/server.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - package :nginx, :provides=> :webserver do description 'Nginx HTTP server' version '0.7.67' diff --git a/config/sprinkle/packages/unfortunately_essential.rb b/config/sprinkle/packages/unfortunately_essential.rb index d1504bc43..23975f870 100644 --- a/config/sprinkle/packages/unfortunately_essential.rb +++ b/config/sprinkle/packages/unfortunately_essential.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - #Fix dreamhost # diff --git a/config/sprinkle/provision.rb b/config/sprinkle/provision.rb index fc81b1ca3..c3a7acae8 100644 --- a/config/sprinkle/provision.rb +++ b/config/sprinkle/provision.rb @@ -1,12 +1,8 @@ -#!/usr/bin/env sprinkle -s +# # Copyright (c) 2010, Diaspora Inc. This file is # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - - - require '#{File.dirname(__FILE__)}/packages/essential' require '#{File.dirname(__FILE__)}/packages/database' require '#{File.dirname(__FILE__)}/packages/server' @@ -26,7 +22,6 @@ policy :diaspora, :roles => [:pivots] do requires :nginx_conf end - deployment do # mechanism for deployment diff --git a/config/thin.yml b/config/thin.yml index b0a3abf8d..a49d85ce4 100644 --- a/config/thin.yml +++ b/config/thin.yml @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - rackup: /usr/local/app/diaspora/current/config.ru pid: /tmp/pids/thin.pid wait: 30 @@ -13,7 +11,7 @@ max_conns: 1024 require: [] max_persistent_conns: 512 -environment: production +environment: development servers: 1 daemonize: true #chdir: /usr/applications/localhash/current diff --git a/db/schema.rb b/db/schema.rb index a4f92eb4b..19e6df260 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # This file is auto-generated from the current state of the database. Instead of editing this file, # please use the migrations feature of Active Record to incrementally modify your database, and # then regenerate this schema definition. diff --git a/db/seeds.rb b/db/seeds.rb index 29a5191f4..687d2622e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). # @@ -12,5 +10,5 @@ # cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) # Mayor.create(:name => 'Daley', :city => citie -require 'config/environment' +require File.join(File.dirname(__FILE__), "..", "..", "config", "environment") diff --git a/db/seeds/backer.rb b/db/seeds/backer.rb index b32b62377..c4805eae8 100644 --- a/db/seeds/backer.rb +++ b/db/seeds/backer.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). # @@ -12,28 +10,40 @@ # cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }]) # Mayor.create(:name => 'Daley', :city => citie -require 'config/environment' +require File.join(File.dirname(__FILE__), "..", "..", "config", "environment") def create - config = YAML.load_file(File.dirname(__FILE__) + '/../../config/deploy_config.yml') + + config = YAML.load_file(File.join(File.dirname(__FILE__), "..", "..", "config", "deploy_config.yml")) backer_info = config['servers']['backer'] backer_number = YAML.load_file(Rails.root.join('config','backer_number.yml'))[:seed_number].to_i - # Create seed user + + #set pod url username = backer_info[backer_number]['username'].gsub(/ /,'').downcase + set_app_config username + require File.join(File.dirname(__FILE__), "..", "..", "config", "initializers", "_load_app_config.rb") + + # Create seed user user = User.instantiate!(:email => "#{username}@#{username}.joindiaspora.com", :username => username, :password => "#{username+backer_info[backer_number]['pin'].to_s}", :password_confirmation => "#{username+backer_info[backer_number]['pin'].to_s}", - :url=> "http://#{username}.joindiaspora.com/", :person => Person.new( - :diaspora_handle => "#{username}@#{username}.joindiaspora.com", :profile => Profile.new( :first_name => backer_info[backer_number]['given_name'], :last_name => backer_info[backer_number]['family_name'], - :image_url => "http://#{username}.joindiaspora.com/images/user/#{username}.jpg"), - :url=> "http://#{username}.joindiaspora.com/") - ) + :image_url => "http://#{username}.joindiaspora.com/images/user/#{username}.jpg") + )) user.person.save! user.aspect(:name => "Presidents") end +def set_app_config username + current_config = YAML.load(File.read(Rails.root.join('config', 'app_config.yml.example'))) + current_config[Rails.env.to_s] ||= {} + current_config[Rails.env.to_s]['pod_url'] = "http://#{username}.joindiaspora.com/" + current_config['default']['pod_url'] = "http://#{username}.joindiaspora.com/" + file = File.new(Rails.root.join('..','..','shared','app_config.yml'),'w') + file.write(current_config.to_yaml) + file.close +end diff --git a/db/seeds/dev.rb b/db/seeds/dev.rb index 12c728ddf..f10abec4f 100644 --- a/db/seeds/dev.rb +++ b/db/seeds/dev.rb @@ -2,35 +2,37 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require File.join(File.dirname(__FILE__), "..", "..", "config", "environment") +def set_app_config username + current_config = YAML.load(File.read(Rails.root.join('config', 'app_config.yml.example'))) + current_config[Rails.env.to_s] ||= {} + current_config[Rails.env.to_s]['pod_url'] = "#{username}.joindiaspora.com" + current_config['default']['pod_url'] = "#{username}.joindiaspora.com" + file = File.new(Rails.root.join('config','app_config.yml'),'w') + file.write(current_config.to_yaml) + file.close +end -require 'config/environment' - -host = "localhost:3000" -url = "http://#{host}/" username = "tom" +set_app_config username + # Create seed user user = User.instantiate!( :email => "tom@tom.joindiaspora.com", :username => "tom", :password => "evankorth", :password_confirmation => "evankorth", - :url=> "http://#{username}.joindiaspora.com/" :person => Person.new( - :diaspora_handle => "tom@tom.joindiaspora.com", - :url => url, :profile => Profile.new( :first_name => "Alexander", :last_name => "Hamiltom" )) ) user.person.save! user2 = User.instantiate!( :email => "korth@tom.joindiaspora.com", :username => "korth", - :url=> "http://#{username}.joindiaspora.com/" :password => "evankorth", :password_confirmation => "evankorth", - :person => Person.new( :diaspora_handle => "korth@tom.joindiaspora.com", - :url => url, - :profile => Profile.new( :first_name => "Evan", - :last_name => "Korth"))) + :person => Person.new( + :profile => Profile.new( :first_name => "Evan", :last_name => "Korth"))) user2.person.save! diff --git a/db/seeds/tom.rb b/db/seeds/tom.rb index 2e06913f2..5c418c8db 100644 --- a/db/seeds/tom.rb +++ b/db/seeds/tom.rb @@ -2,21 +2,27 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require File.join(File.dirname(__FILE__), "..", "..", "config", "environment") +def set_app_config username + current_config = YAML.load(File.read(Rails.root.join('config', 'app_config.yml.example'))) + current_config[Rails.env.to_s] ||= {} + current_config[Rails.env.to_s]['pod_url'] = "http://#{username}.joindiaspora.com/" + current_config['default']['pod_url'] = "http://#{username}.joindiaspora.com/" + file = File.new(Rails.root.join('..','..','shared','app_config.yml'),'w') + file.write(current_config.to_yaml) + file.close +end -require 'config/environment' +set_app_config "tom" +require 'config/initializers/_load_app_config.rb' -remote_url = "http://tom.joindiaspora.com/" -remote_url = "http://localhost:3000/" # Create seed user user = User.instantiate!( :email => "tom@tom.joindiaspora.com", :username => "tom", :password => "evankorth", :password_confirmation => "evankorth", - :url => remote_url, :person => { - :diaspora_handle => "tom@tom.joindiaspora.com", - :url => remote_url, :profile => { :first_name => "Alexander", :last_name => "Hamiltom", :image_url => "http://tom.joindiaspora.com/images/user/tom.jpg"}} ) @@ -26,11 +32,7 @@ user2 = User.instantiate!( :email => "korth@tom.joindiaspora.com", :password => "evankorth", :password_confirmation => "evankorth", :username => "korth", - :url => remote_url, - :person => { :diaspora_handle => "korth@tom.joindiaspora.com", - :url => remote_url, - :profile => { :first_name => "Evan", - :last_name => "Korth", + :person => {:profile => { :first_name => "Evan", :last_name => "Korth", :image_url => "http://tom.joindiaspora.com/images/user/korth.jpg"}}) user2.person.save! @@ -41,3 +43,4 @@ request = user.send_friend_request_to(user2, aspect) reversed_request = user2.accept_friend_request( request.id, user2.aspect(:name => "presidents").id ) user.receive reversed_request.to_diaspora_xml user.aspect(:name => "Presidents") + diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb new file mode 100644 index 000000000..e3f8bc373 --- /dev/null +++ b/features/step_definitions/custom_web_steps.rb @@ -0,0 +1,17 @@ +When /^(.*) in the header$/ do |action| + within('header') do + When action + end +end + +When /^(.*) in the modal window$/ do |action| + within('#fancybox-wrap') do + When action + end +end + +When /^(.*) in the aspect list$/ do |action| + within('#aspect_list') do + When action + end +end diff --git a/features/step_definitions/debug_steps.rb b/features/step_definitions/debug_steps.rb new file mode 100644 index 000000000..c56973edf --- /dev/null +++ b/features/step_definitions/debug_steps.rb @@ -0,0 +1,4 @@ +When 'I debug' do + debugger + true +end diff --git a/features/step_definitions/factory_steps.rb b/features/step_definitions/factory_steps.rb new file mode 100644 index 000000000..cf1495e99 --- /dev/null +++ b/features/step_definitions/factory_steps.rb @@ -0,0 +1,68 @@ +module FactoryMethods + def create_from_table(model_name, table, extra = {}) + factory_name = model_name.gsub(/\W+/, '_').downcase.singularize.to_sym + is_singular = model_name.to_s.singularize == model_name.to_s + hashes = if is_singular + if table.kind_of?(Hash) + [table] + else + [table.rows_hash] + end + else + table.hashes + end + klass = Factory.factories[factory_name].class_name.to_s.classify.constantize + @they = hashes.map do |hash| + hash = hash.merge(extra).inject({}) do |h,(k,v)| + k = k.gsub(/\W+/,'_') + v = v.split(/\s*,\s*/) if klass.serialized_attributes[k] == Array + h.update(k.to_sym => v) + end + object = Factory.build(factory_name, hash) + yield object if block_given? + object.save! + object + end + if is_singular + @it = @they.last + instance_variable_set("@#{factory_name}", @it) + end + end +end + +World(FactoryMethods) + +Given %r{^I have a (.+)$} do |model_name| + create_from_table(model_name, {}, 'user' => @me) +end + +Given %r{^I have the following (.+):$} do |child, table| + Given "that me has the following #{child}:", table +end + +Given %r{^the following (.+):$} do |model_name, table| + create_from_table(model_name, table) +end + +Given %r{^that (.+) has the following (.+):$} do |parent, child, table| + child= child.gsub(/\W+/,'_') + parent = parent.gsub(/\W+/,'_').downcase.sub(/^_/, '') + parent_instance = instance_variable_get("@#{parent}") + parent_class = parent_instance.class + if assoc = parent_class.reflect_on_association(child.to_sym) || parent_class.reflect_on_association(child.pluralize.to_sym) + parent = (assoc.options[:as] || parent).to_s + child = (assoc.options[:class_name] || child).to_s + end + if child.classify.constantize.method_defined?(parent.pluralize) + create_from_table(child, table, parent.pluralize => [parent_instance]) + elsif child.classify.constantize.method_defined?(parent) + create_from_table(child, table, parent => parent_instance) + else + create_from_table(child, table) + if assoc.macro == :has_many + parent_instance.send("#{assoc.name}=", @they) + else + parent_instance.send("#{assoc.name}=", @they.first) + end + end +end diff --git a/features/step_definitions/scope_steps.rb b/features/step_definitions/scope_steps.rb new file mode 100644 index 000000000..43fe2f48a --- /dev/null +++ b/features/step_definitions/scope_steps.rb @@ -0,0 +1,30 @@ +module SectionLocator + + def within_parent(content, elements = ['*'], &block) + expr = %(//*[(#{elements.join('|')})/descendant-or-self::*[contains(., "#{content}")]]) + within(expr, &block) + end + +end + +World(SectionLocator) + +sections = %w(h1 h2 h3 h4 h5 h6 legend caption dt strong header) + +When /^(.*) in the "([^\"]*)" section$/ do |action, title| + within_parent(title, sections) do + When action + end +end + +When /^(.*) in the "([^\"]*)" section:$/ do |action, title, table| + within_parent(title, sections) do + When "#{action}:", table + end +end + +When /^(.*) in the "([^\"]*)" row$/ do |action, title| + within_parent(title, %w(th td)) do + When action + end +end diff --git a/features/step_definitions/session_steps.rb b/features/step_definitions/session_steps.rb new file mode 100644 index 000000000..abc9e87df --- /dev/null +++ b/features/step_definitions/session_steps.rb @@ -0,0 +1,26 @@ +Given /^I am signed in as the following (\w+):$/ do |role, table| + Given %(the following #{role}:), table + @me = @it + Given 'I am signed in' +end + +Given /^I (?:am signed|sign) in as an? (\w+)$/ do |role| + @me = Factory(role.to_sym) + Given 'I am signed in' +end + + +Given 'I am signed in' do + @me ||= Factory(:user) + When %(I go to the new user session page) + When %(I fill in "Username" with "#{@me.username}") + When %(I fill in "Password" with "#{@me.password}") + When %(I press "Sign in") +end + + +When /^I sign in as "([^"]*)"$/ do |email| + @me = User.find_by_email(email) + @me.password ||= 'password' + Given 'I am signed in' +end diff --git a/features/step_definitions/web_steps.rb b/features/step_definitions/web_steps.rb new file mode 100644 index 000000000..5a5529704 --- /dev/null +++ b/features/step_definitions/web_steps.rb @@ -0,0 +1,219 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + + +require 'uri' +require 'cgi' +require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths")) + +module WithinHelpers + def with_scope(locator) + locator ? within(locator) { yield } : yield + end +end +World(WithinHelpers) + +Given /^(?:|I )am on (.+)$/ do |page_name| + visit path_to(page_name) +end + +When /^(?:|I )go to (.+)$/ do |page_name| + visit path_to(page_name) +end + +When /^(?:|I )press "([^"]*)"(?: within "([^"]*)")?$/ do |button, selector| + with_scope(selector) do + click_button(button) + end +end + +When /^(?:|I )follow "([^"]*)"(?: within "([^"]*)")?$/ do |link, selector| + with_scope(selector) do + click_link(link) + end +end + +When /^(?:|I )fill in "([^"]*)" with "([^"]*)"(?: within "([^"]*)")?$/ do |field, value, selector| + with_scope(selector) do + fill_in(field, :with => value) + end +end + +When /^(?:|I )fill in "([^"]*)" for "([^"]*)"(?: within "([^"]*)")?$/ do |value, field, selector| + with_scope(selector) do + fill_in(field, :with => value) + end +end + +# Use this to fill in an entire form with data from a table. Example: +# +# When I fill in the following: +# | Account Number | 5002 | +# | Expiry date | 2009-11-01 | +# | Note | Nice guy | +# | Wants Email? | | +# +# TODO: Add support for checkbox, select og option +# based on naming conventions. +# +When /^(?:|I )fill in the following(?: within "([^"]*)")?:$/ do |selector, fields| + with_scope(selector) do + fields.rows_hash.each do |name, value| + When %{I fill in "#{name}" with "#{value}"} + end + end +end + +When /^(?:|I )select "([^"]*)" from "([^"]*)"(?: within "([^"]*)")?$/ do |value, field, selector| + with_scope(selector) do + select(value, :from => field) + end +end + +When /^(?:|I )check "([^"]*)"(?: within "([^"]*)")?$/ do |field, selector| + with_scope(selector) do + check(field) + end +end + +When /^(?:|I )uncheck "([^"]*)"(?: within "([^"]*)")?$/ do |field, selector| + with_scope(selector) do + uncheck(field) + end +end + +When /^(?:|I )choose "([^"]*)"(?: within "([^"]*)")?$/ do |field, selector| + with_scope(selector) do + choose(field) + end +end + +When /^(?:|I )attach the file "([^"]*)" to "([^"]*)"(?: within "([^"]*)")?$/ do |path, field, selector| + with_scope(selector) do + attach_file(field, path) + end +end + +Then /^(?:|I )should see JSON:$/ do |expected_json| + require 'json' + expected = JSON.pretty_generate(JSON.parse(expected_json)) + actual = JSON.pretty_generate(JSON.parse(response.body)) + expected.should == actual +end + +Then /^(?:|I )should see "([^"]*)"(?: within "([^"]*)")?$/ do |text, selector| + with_scope(selector) do + if page.respond_to? :should + page.should have_content(text) + else + assert page.has_content?(text) + end + end +end + +Then /^(?:|I )should see \/([^\/]*)\/(?: within "([^"]*)")?$/ do |regexp, selector| + regexp = Regexp.new(regexp) + with_scope(selector) do + if page.respond_to? :should + page.should have_xpath('//*', :text => regexp) + else + assert page.has_xpath?('//*', :text => regexp) + end + end +end + +Then /^(?:|I )should not see "([^"]*)"(?: within "([^"]*)")?$/ do |text, selector| + with_scope(selector) do + if page.respond_to? :should + page.should have_no_content(text) + else + assert page.has_no_content?(text) + end + end +end + +Then /^(?:|I )should not see \/([^\/]*)\/(?: within "([^"]*)")?$/ do |regexp, selector| + regexp = Regexp.new(regexp) + with_scope(selector) do + if page.respond_to? :should + page.should have_no_xpath('//*', :text => regexp) + else + assert page.has_no_xpath?('//*', :text => regexp) + end + end +end + +Then /^the "([^"]*)" field(?: within "([^"]*)")? should contain "([^"]*)"$/ do |field, selector, value| + with_scope(selector) do + field = find_field(field) + field_value = (field.tag_name == 'textarea') ? field.text : field.value + if field_value.respond_to? :should + field_value.should =~ /#{value}/ + else + assert_match(/#{value}/, field_value) + end + end +end + +Then /^the "([^"]*)" field(?: within "([^"]*)")? should not contain "([^"]*)"$/ do |field, selector, value| + with_scope(selector) do + field = find_field(field) + field_value = (field.tag_name == 'textarea') ? field.text : field.value + if field_value.respond_to? :should_not + field_value.should_not =~ /#{value}/ + else + assert_no_match(/#{value}/, field_value) + end + end +end + +Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should be checked$/ do |label, selector| + with_scope(selector) do + field_checked = find_field(label)['checked'] + if field_checked.respond_to? :should + field_checked.should be_true + else + assert field_checked + end + end +end + +Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should not be checked$/ do |label, selector| + with_scope(selector) do + field_checked = find_field(label)['checked'] + if field_checked.respond_to? :should + field_checked.should be_false + else + assert !field_checked + end + end +end + +Then /^(?:|I )should be on (.+)$/ do |page_name| + current_path = URI.parse(current_url).path + if current_path.respond_to? :should + current_path.should == path_to(page_name) + else + assert_equal path_to(page_name), current_path + end +end + +Then /^(?:|I )should have the following query string:$/ do |expected_pairs| + query = URI.parse(current_url).query + actual_params = query ? CGI.parse(query) : {} + expected_params = {} + expected_pairs.rows_hash.each_pair{|k,v| expected_params[k] = v.split(',')} + + if actual_params.respond_to? :should + actual_params.should == expected_params + else + assert_equal expected_params, actual_params + end +end + +Then /^show me the page$/ do + save_and_open_page +end diff --git a/features/support/env.rb b/features/support/env.rb new file mode 100644 index 000000000..2fb86c4dc --- /dev/null +++ b/features/support/env.rb @@ -0,0 +1,45 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + +ENV["RAILS_ENV"] ||= "test" +require File.expand_path(File.dirname(__FILE__) + '/../../config/environment') + +require 'cucumber/formatter/unicode' # Remove this line if you don't want Cucumber Unicode support +require 'cucumber/rails/rspec' +require 'cucumber/rails/world' +require 'cucumber/web/tableish' + +require 'capybara/rails' +require 'capybara/cucumber' +require 'capybara/session' +require 'cucumber/rails/capybara_javascript_emulation' # Lets you click links with onclick javascript handlers without using @culerity or @javascript +# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In +# order to ease the transition to Capybara we set the default here. If you'd +# prefer to use XPath just remove this line and adjust any selectors in your +# steps to use the XPath syntax. +Capybara.default_selector = :css + +WebMock.disable_net_connect!(:allow_localhost => true) + +# If you set this to false, any error raised from within your app will bubble +# up to your step definition and out to cucumber unless you catch it somewhere +# on the way. You can make Rails rescue errors and render error pages on a +# per-scenario basis by tagging a scenario or feature with the @allow-rescue tag. +# +# If you set this to true, Rails will rescue all errors and render error +# pages, more or less in the same way your application would behave in the +# default production environment. It's not recommended to do this for all +# of your scenarios, as this makes it hard to discover errors in your application. +ActionController::Base.allow_rescue = false + +# How to clean your database when transactions are turned off. See +# http://github.com/bmabey/database_cleaner for more info. +begin + require 'database_cleaner' + require 'database_cleaner/cucumber' + DatabaseCleaner.strategy = :truncation + DatabaseCleaner.orm = "mongo_mapper" +end diff --git a/features/support/paths.rb b/features/support/paths.rb new file mode 100644 index 000000000..3d3f64724 --- /dev/null +++ b/features/support/paths.rb @@ -0,0 +1,16 @@ +module NavigationHelpers + def path_to(page_name) + case page_name + when /^its ([\w ]+) page$/ + send("#{$1.gsub(/\W+/, '_')}_path", @it) + when /^the ([\w ]+) page$/ + send("#{$1.gsub(/\W+/, '_')}_path") + when /^"(\/.*)"/ + $1 + else + raise "Can't find mapping from \"#{page_name}\" to a path." + end + end +end + +World(NavigationHelpers) diff --git a/features/user_creates_an_aspect.feature b/features/user_creates_an_aspect.feature new file mode 100644 index 000000000..fb65fde4c --- /dev/null +++ b/features/user_creates_an_aspect.feature @@ -0,0 +1,23 @@ +@aspects @javascript +Feature: User creates an aspect + In order to share with a limited group + As a User + I want to create a new aspect + + Background: + Given I am signed in + And I follow "Manage" in the header + And I follow "Add a new aspect" + + Scenario: success + Given I fill in "Name" with "Dorm Mates" in the modal window + When I press "Create" in the modal window + Then I should see "Manage Aspects" + And I should see "Dorm Mates" in the header + And I should see "Dorm Mates" in the aspect list + + Scenario: I omit the name + Given I fill in "Name" with "" in the modal window + When I press "Create" in the modal window + Then I should see "Manage Aspects" + And I should see "Aspect creation failed." diff --git a/lib/chrome_frame.rb b/lib/chrome_frame.rb index 10ef3dea3..52a4eb459 100644 --- a/lib/chrome_frame.rb +++ b/lib/chrome_frame.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Rack class ChromeFrame diff --git a/lib/diaspora.rb b/lib/diaspora.rb index 959d0bb92..e8508b38b 100644 --- a/lib/diaspora.rb +++ b/lib/diaspora.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Diaspora autoload :Parser diff --git a/lib/diaspora/ostatus_builder.rb b/lib/diaspora/ostatus_builder.rb new file mode 100644 index 000000000..48db7fd86 --- /dev/null +++ b/lib/diaspora/ostatus_builder.rb @@ -0,0 +1,80 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +module Diaspora + + class Director + def initialize + @structure = [:create_headers, :create_endpoints, :create_subject, + :create_body, :create_footer] + end + + def build(builder) + @structure.inject("") do |xml, method| + xml << builder.send(method) if builder.respond_to? method + end + end + end + + + class OstatusBuilder + def initialize(user) + @user = user + end + + def create_headers + <<-XML + + +Diaspora +#{@user.public_url}.atom +#{@user.real_name}'s Public Feed +Posts from Diaspora +#{Time.now.xmlschema} + + #{@user.real_name} + #{@user.public_url} + + XML + end + + def create_endpoints + <<-XML + + + XML + end + + def create_subject + <<-XML + + http://activitystrea.ms/schema/1.0/person + #{@user.public_url} + #{@user.real_name} + + + + XML + end + + def create_body + @user.visible_posts(:person_id => @user.person.id, :public=>true).inject("") do |xml,curr| + if curr.respond_to?(:to_activity) + unless xml + curr.to_activity + else + xml + curr.to_activity + end + end + end + end + + def create_footer + <<-XML + + XML + end + end + +end diff --git a/lib/diaspora/parser.rb b/lib/diaspora/parser.rb index 6bc5d4eab..e8e7e8a2b 100644 --- a/lib/diaspora/parser.rb +++ b/lib/diaspora/parser.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Diaspora module Parser def self.owner_id_from_xml(xml) diff --git a/lib/diaspora/user/friending.rb b/lib/diaspora/user/friending.rb index e79608381..61f86a19b 100644 --- a/lib/diaspora/user/friending.rb +++ b/lib/diaspora/user/friending.rb @@ -2,12 +2,13 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Diaspora module UserModules module Friending def send_friend_request_to(desired_friend, aspect) + # should have different exception types for these? + raise "You have already sent a friend request to that person!" if self.pending_requests.detect{ + |x| x.destination_url == desired_friend.receive_url } raise "You are already friends with that person!" if self.friends.detect{ |x| x.receive_url == desired_friend.receive_url} request = Request.instantiate( @@ -21,12 +22,11 @@ module Diaspora aspect.requests << request aspect.save - salmon request, :to => desired_friend + push_to_people request, [desired_friend] end request end - def accept_friend_request(friend_request_id, aspect_id) request = Request.find_by_id(friend_request_id) pending_requests.delete(request) @@ -38,7 +38,8 @@ module Diaspora end def dispatch_friend_acceptance(request, requester) - salmon request, :to => requester + friend_acceptance = salmon(request) + push_to_person requester, friend_acceptance.xml_for(requester) request.destroy unless request.callback_url.include? url end @@ -80,13 +81,14 @@ module Diaspora def unfriend(bad_friend) Rails.logger.info("#{self.real_name} is unfriending #{bad_friend.inspect}") retraction = Retraction.for(self) - salmon( retraction, :to => bad_friend) + push_to_people retraction, [bad_friend] remove_friend(bad_friend) end def remove_friend(bad_friend) raise "Friend not deleted" unless self.friend_ids.delete( bad_friend.id ) - aspects.each{|g| g.person_ids.delete( bad_friend.id )} + aspects.each{|aspect| + aspect.person_ids.delete( bad_friend.id )} self.save self.raw_visible_posts.find_all_by_person_id( bad_friend.id ).each{|post| diff --git a/lib/diaspora/user/querying.rb b/lib/diaspora/user/querying.rb index ad023f2fb..7d74df4ed 100644 --- a/lib/diaspora/user/querying.rb +++ b/lib/diaspora/user/querying.rb @@ -2,26 +2,22 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Diaspora module UserModules module Querying - def visible_posts_from_others(opts ={}) - if opts[:from].class == Person - Post.where(:person_id => opts[:from].id, :_id.in => self.visible_post_ids) - elsif opts[:from].class == Aspect - Post.where(:_id.in => opts[:from].post_ids) unless opts[:from].user != self - else - Post.where(:_id.in => self.visible_post_ids) - end + + def find_visible_post_by_id( id ) + self.raw_visible_posts.find id end def visible_posts( opts = {} ) + opts[:order] ||= 'created_at DESC' if opts[:by_members_of] return raw_visible_posts if opts[:by_members_of] == :all aspect = self.aspects.find_by_id( opts[:by_members_of].id ) aspect.posts + else + self.raw_visible_posts.all(opts) end end @@ -38,11 +34,6 @@ module Diaspora aspects.detect{|x| x.id == id } end - def album_by_id( id ) - id = id.to_id - albums.detect{|x| x.id == id } - end - def aspects_with_post( id ) self.aspects.find_all_by_post_ids( id.to_id ) end diff --git a/lib/diaspora/user/receiving.rb b/lib/diaspora/user/receiving.rb new file mode 100644 index 000000000..a16727c26 --- /dev/null +++ b/lib/diaspora/user/receiving.rb @@ -0,0 +1,92 @@ +module Diaspora + module UserModules + module Receiving + def receive_salmon salmon_xml + salmon = Salmon::SalmonSlap.parse salmon_xml, self + if salmon.verified_for_key?(salmon.author.public_key) + Rails.logger.info("data in salmon: #{salmon.parsed_data}") + self.receive(salmon.parsed_data) + end + end + + def receive xml + object = Diaspora::Parser.from_xml(xml) + Rails.logger.debug("Receiving object for #{self.real_name}:\n#{object.inspect}") + Rails.logger.debug("From: #{object.person.inspect}") if object.person + + if object.is_a? Retraction + receive_retraction object, xml + elsif object.is_a? Request + receive_request object, xml + elsif object.is_a? Profile + receive_profile object, xml + elsif object.is_a?(Comment) + receive_comment object, xml + else + receive_post object, xml + end + end + + def receive_retraction retraction, xml + if retraction.type == 'Person' + Rails.logger.info( "the person id is #{retraction.post_id} the friend found is #{visible_person_by_id(retraction.post_id).inspect}") + unfriended_by visible_person_by_id(retraction.post_id) + else + retraction.perform self.id + aspects = self.aspects_with_person(retraction.person) + aspects.each{ |aspect| aspect.post_ids.delete(retraction.post_id.to_id) + aspect.save + } + end + end + + def receive_request request, xml + person = Diaspora::Parser.parse_or_find_person_from_xml( xml ) + person.serialized_public_key ||= request.exported_key + request.person = person + request.person.save + old_request = Request.first(:id => request.id) + request.aspect_id = old_request.aspect_id if old_request + request.save + receive_friend_request(request) + end + + def receive_profile profile, xml + person = Diaspora::Parser.owner_id_from_xml xml + person.profile = profile + person.save + end + + def receive_comment comment, xml + comment.person = Diaspora::Parser.parse_or_find_person_from_xml( xml ).save if comment.person.nil? + self.visible_people = self.visible_people | [comment.person] + self.save + Rails.logger.debug("The person parsed from comment xml is #{comment.person.inspect}") unless comment.person.nil? + comment.person.save + Rails.logger.debug("From: #{comment.person.inspect}") if comment.person + raise "In receive for #{self.real_name}, signature was not valid on: #{comment.inspect}" unless comment.post.person == self.person || comment.verify_post_creator_signature + comment.save + unless owns?(comment) + dispatch_comment comment + end + comment.socket_to_uid(id) if (comment.respond_to?(:socket_to_uid) && !self.owns?(comment)) + end + + def receive_post post, xml + Rails.logger.debug("Saving post: #{post}") + post.user_refs += 1 + post.save + + self.raw_visible_posts << post + self.save + + aspects = self.aspects_with_person(post.person) + aspects.each{ |aspect| + aspect.posts << post + aspect.save + post.socket_to_uid(id, :aspect_ids => [aspect.id]) if (post.respond_to?(:socket_to_uid) && !self.owns?(post)) + } + end + end + end +end diff --git a/lib/diaspora/webhooks.rb b/lib/diaspora/webhooks.rb index 81f7bcfaf..fc241a6d3 100644 --- a/lib/diaspora/webhooks.rb +++ b/lib/diaspora/webhooks.rb @@ -2,20 +2,14 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Diaspora module Webhooks - def self.included(klass) - klass.class_eval do - def to_diaspora_xml - xml = "" - xml += "#{self.to_xml.to_s}" - xml += "" - end - - end + def to_diaspora_xml + xml = "" + xml += "#{to_xml.to_s}" + xml += "" end + end end diff --git a/lib/diaspora/websocket.rb b/lib/diaspora/websocket.rb index 687bd2b7c..10e8bc9c8 100644 --- a/lib/diaspora/websocket.rb +++ b/lib/diaspora/websocket.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Diaspora module WebSocket def self.queue_to_user(uid, data) diff --git a/lib/encryptable.rb b/lib/encryptable.rb index ba36d6ec3..133c05156 100644 --- a/lib/encryptable.rb +++ b/lib/encryptable.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Encryptable def signable_string raise NotImplementedException("Override this in your encryptable class") @@ -17,7 +15,7 @@ if person.nil? Rails.logger.info("Verifying sig on #{signable_string} but no person is here") return false - elsif person.encryption_key.nil? + elsif person.public_key.nil? Rails.logger.info("Verifying sig on #{signable_string} but #{person.real_name} has no key") return false elsif signature.nil? @@ -25,7 +23,7 @@ return false end Rails.logger.debug("Verifying sig on #{signable_string} from person #{person.real_name}") - validity = person.encryption_key.verify "SHA", Base64.decode64(signature), signable_string + validity = person.public_key.verify "SHA", Base64.decode64(signature), signable_string Rails.logger.debug("Validity: #{validity}") validity end diff --git a/lib/encryptor.rb b/lib/encryptor.rb index ed9fbedb1..e9c4936e1 100644 --- a/lib/encryptor.rb +++ b/lib/encryptor.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module Encryptor module Public def encrypt cleartext @@ -33,7 +31,7 @@ module Encryptor end def encrypt_aes_key key - Base64.encode64 encryption_key.public_encrypt( key.to_json ) + Base64.encode64 public_key.public_encrypt( key.to_json ) end end @@ -60,6 +58,5 @@ module Encryptor txt end - end end diff --git a/lib/hcard.rb b/lib/hcard.rb index 7658c5a1d..041f4d384 100644 --- a/lib/hcard.rb +++ b/lib/hcard.rb @@ -2,13 +2,12 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module HCard def self.find url doc = Nokogiri::HTML(Net::HTTP.get URI.parse(url)) {:given_name => doc.css(".given_name").text, :family_name => doc.css(".family_name").text, - :url => doc.css("#pod_location").text} + :url => doc.css("#pod_location").text, + :photo => doc.css(".photo[src]").text} end end diff --git a/lib/message_handler.rb b/lib/message_handler.rb index 7149ee65e..e3890d94f 100644 --- a/lib/message_handler.rb +++ b/lib/message_handler.rb @@ -2,11 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - class MessageHandler - NUM_TRIES = 3 TIMEOUT = 5 #seconds @@ -23,6 +20,10 @@ class MessageHandler [*destinations].each{|dest| @queue.push(Message.new(:post, dest, :body => b))} end + def add_hub_notification(hub_url, feed_url) + @queue.push(Message.new(:hub_publish, hub_url, :body => feed_url)) + end + def process @queue.pop{ |query| case query.type @@ -31,7 +32,10 @@ class MessageHandler http.callback { process; process} when :get http = EventMachine::HttpRequest.new(query.destination).get :timeout => TIMEOUT - http.callback {send_to_seed(query, http.response); process} + http.callback {process} + when :hub_publish + http = EventMachine::PubSubHubbub.new(query.destination).publish query.body, :timeout => TIMEOUT + http.callback {process} else raise "message is not a type I know!" end @@ -47,10 +51,6 @@ class MessageHandler } unless @queue.size == 0 end - def send_to_seed(message, http_response) - #DO SOMETHING! - end - def size @queue.size end diff --git a/lib/mongo_mapper/bson_id.rb b/lib/mongo_mapper/bson_id.rb index 4de833a66..328c69a03 100644 --- a/lib/mongo_mapper/bson_id.rb +++ b/lib/mongo_mapper/bson_id.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - class String def to_id BSON::ObjectId self diff --git a/lib/mongo_mapper/clear_dev_memory.rb b/lib/mongo_mapper/clear_dev_memory.rb index 88c7facce..d63084765 100644 --- a/lib/mongo_mapper/clear_dev_memory.rb +++ b/lib/mongo_mapper/clear_dev_memory.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - module MongoMapper class ClearDevMemory def initialize(app) diff --git a/lib/salmon/salmon.rb b/lib/salmon/salmon.rb index 931598691..e7690a578 100644 --- a/lib/salmon/salmon.rb +++ b/lib/salmon/salmon.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # Add URL safe Base64 support module Base64 module_function @@ -43,18 +41,38 @@ end module Salmon class SalmonSlap - attr_accessor :magic_sig, :author, :author_email, :data, :data_type, :sig - def self.parse(xml) + attr_accessor :magic_sig, :author, :author_email, :aes_key, :iv, :parsed_data, + :data_type, :sig + + def self.create(user, activity) + salmon = self.new + salmon.author = user.person + aes_key_hash = user.person.gen_aes_key + salmon.aes_key = aes_key_hash['key'] + salmon.iv = aes_key_hash['iv'] + salmon.magic_sig = MagicSigEnvelope.create(user , user.person.aes_encrypt(activity, aes_key_hash)) + salmon + end + + def self.parse(xml, user) slap = self.new doc = Nokogiri::XML(xml) sig_doc = doc.search('entry') + + ### Header ## + decrypted_header = user.decrypt(doc.search('encrypted_header').text) + header_doc = Nokogiri::XML(decrypted_header) + slap.author_email= header_doc.search('uri').text.split("acct:").last + slap.aes_key = header_doc.search('aes_key').text + slap.iv = header_doc.search('iv').text + slap.magic_sig = MagicSigEnvelope.parse sig_doc - - if 'base64url' == slap.magic_sig.encoding - slap.data = decode64url(slap.magic_sig.data) + + key_hash = {'key' => slap.aes_key, 'iv' => slap.iv} + slap.parsed_data = user.aes_decrypt(decode64url(slap.magic_sig.data), key_hash) slap.sig = slap.magic_sig.sig else raise ArgumentError, "Magic Signature data must be encoded with base64url, was #{slap.magic_sig.encoding}" @@ -64,32 +82,33 @@ module Salmon raise ArgumentError, "Magic Signature data must be signed with RSA-SHA256, was #{slap.magic_sig.alg}" unless 'RSA-SHA256' == slap.magic_sig.alg - uri = doc.search('uri').text - slap.author_email = uri.split("acct:").last slap end - def self.create(user, activity) - salmon = self.new - salmon.author = user.person - salmon.magic_sig = MagicSigEnvelope.create(user , activity) - salmon - end - - def to_xml + def xml_for person xml =< - - #{@author.real_name} - acct:#{@author.diaspora_handle} - + #{person.encrypt(decrypted_header)} #{@magic_sig.to_xml} ENTRY end + def decrypted_header + header =<
+ #{iv} + #{aes_key} + + #{@author.real_name} + acct:#{@author.diaspora_handle} + + +HEADER + end + def author if @author @author @@ -98,9 +117,6 @@ ENTRY end end - - - # Decode URL-safe-Base64. This implements def self.decode64url(str) # remove whitespace @@ -128,7 +144,6 @@ ENTRY signature = Base64.urlsafe_decode64(self.magic_sig.sig) signed_data = self.magic_sig.signable_string# Base64.urlsafe_decode64(self.magic_sig.signable_string) - public_key.verify(OpenSSL::Digest::SHA256.new, signature, signed_data ) end @@ -194,7 +209,6 @@ ENTRY env.encoding = env.get_encoding env.alg = env.get_alg - env.sig = Base64.urlsafe_encode64( user.encryption_key.sign OpenSSL::Digest::SHA256.new, env.signable_string ) diff --git a/lib/tasks/cucumber.rake b/lib/tasks/cucumber.rake new file mode 100644 index 000000000..055af1c6c --- /dev/null +++ b/lib/tasks/cucumber.rake @@ -0,0 +1,55 @@ +# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril. +# It is recommended to regenerate this file in the future when you upgrade to a +# newer version of cucumber-rails. Consider adding your own code to a new file +# instead of editing this one. Cucumber will automatically load all features/**/*.rb +# files. + + +unless ARGV.any? {|a| a =~ /^gems/} # Don't load anything when running the gems:* tasks + +vendored_cucumber_bin = Dir["#{Rails.root}/vendor/{gems,plugins}/cucumber*/bin/cucumber"].first +$LOAD_PATH.unshift(File.dirname(vendored_cucumber_bin) + '/../lib') unless vendored_cucumber_bin.nil? + +begin + require 'cucumber/rake/task' + + namespace :cucumber do + Cucumber::Rake::Task.new(:ok, 'Run features that should pass') do |t| + t.binary = vendored_cucumber_bin # If nil, the gem's binary is used. + t.fork = true # You may get faster startup if you set this to false + t.profile = 'default' + end + + Cucumber::Rake::Task.new(:wip, 'Run features that are being worked on') do |t| + t.binary = vendored_cucumber_bin + t.fork = true # You may get faster startup if you set this to false + t.profile = 'wip' + end + + Cucumber::Rake::Task.new(:rerun, 'Record failing features and run only them if any exist') do |t| + t.binary = vendored_cucumber_bin + t.fork = true # You may get faster startup if you set this to false + t.profile = 'rerun' + end + + desc 'Run all features' + task :all => [:ok, :wip] + end + desc 'Alias for cucumber:ok' + task :cucumber => 'cucumber:ok' + + Rake.application.instance_variable_get('@tasks').delete('default') + + task :default => [:cucumber, :spec] + + task :features => :cucumber do + STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***" + end +rescue LoadError + desc 'cucumber rake task not available (cucumber not installed)' + task :cucumber do + abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin' + end +end + +end diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 80e3bafe5..82fc6fa9f 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -2,38 +2,36 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - namespace :db do desc 'Seed the current RAILS_ENV database from db/seeds.rb' namespace :seed do task :tom do puts "Seeding the database for #{Rails.env}..." - require 'db/seeds/tom' + require File.dirname(__FILE__) + '/../../db/seeds/tom' end task :dev do puts "Seeding the database for #{Rails.env}..." - require 'db/seeds/dev' + require File.dirname(__FILE__) + '/../../db/seeds/dev' end task :backer do puts "Seeding the database for #{Rails.env}..." - require 'db/seeds/backer' + require File.dirname(__FILE__) + '/../../db/seeds/backer' create end - + end desc 'Delete the collections in the current RAILS_ENV database' task :purge do - require 'config/environment' + require File.dirname(__FILE__) + '/../../config/environment' puts "Purging the database for #{Rails.env}..." # Specifiy what models to remove # No! Drop the fucking database. - MongoMapper::connection.drop_database(MongoMapper::database.name) + MongoMapper::connection.drop_database(MongoMapper::database.name) puts 'Deleting tmp folder...' `rm -rf #{File.dirname(__FILE__)}/../../public/uploads/*` @@ -41,10 +39,10 @@ namespace :db do desc 'Purge and seed the current RAILS_ENV database using information from db/seeds.rb' task :reset do - + puts "Resetting the database for #{Rails.env}".upcase Rake::Task['db:purge'].invoke - Rake::Task['db:seed:tom'].invoke + Rake::Task['db:seed:dev'].invoke puts "Success!" end @@ -54,23 +52,30 @@ namespace :db do Rake::Task['db:seed:dev'].invoke puts "you did it!" end - + task :fix_diaspora_handle do puts "fixing the people in this seed" - require 'config/environment' - - people = Person.all( '$where' => "function(){ - return this.diaspora_handle.charAt(this.diaspora_handle.length-1) == '@' - }") - - puts "Found #{people.count} people with broken diaspora_handle fields" - people.each do |person| + require File.dirname(__FILE__) + '/../../config/environment' + Person.where(:url => 'example.org').all.each{|person| if person.owner - puts "Resetting diaspora handle for #{person.owner.username}" + person.url = APP_CONFIG[:pod_url] person.diaspora_handle = person.owner.diaspora_handle person.save end - end + } puts "everything should be peachy" end + + task :move_private_key do + User.all.each do |user| + if user.private_key.nil? + user.private_key = user.person.serialized_key + user.save + person = user.person + person.serialized_key = nil + person.serialized_public_key = user.encryption_key.public_key + person.save + end + end + end end diff --git a/lib/tasks/generate_session_secret.rake b/lib/tasks/generate_session_secret.rake new file mode 100644 index 000000000..c9fc129de --- /dev/null +++ b/lib/tasks/generate_session_secret.rake @@ -0,0 +1,25 @@ +namespace :generate do + desc 'Generates a Session Secret Token' + task :secret_token do + + path = File.join(Rails.root, 'config', 'initializers', 'secret_token.rb') + secret = ActiveSupport::SecureRandom.hex(40) + File.open(path, 'w') do |f| + f.write <<"EOF" +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +Rails.application.config.secret_token = '#{secret}' +EOF + +end + + end +end diff --git a/lib/tasks/rspec.rake b/lib/tasks/rspec.rake index 85ae513f6..54442d71e 100644 --- a/lib/tasks/rspec.rake +++ b/lib/tasks/rspec.rake @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - begin require 'rspec/core' require 'rspec/core/rake_task' @@ -32,13 +30,10 @@ MSG end end -Rake.application.instance_variable_get('@tasks').delete('default') - spec_prereq = Rails.root.join('config', 'database.yml').exist? ? "db:test:prepare" : :noop task :noop do end -task :default => :spec task :stats => "spec:statsetup" desc "Run all specs in spec directory (excluding plugin specs)" diff --git a/lib/tasks/saucelabs_adapter.rake b/lib/tasks/saucelabs_adapter.rake deleted file mode 100644 index 76f6cbbc4..000000000 --- a/lib/tasks/saucelabs_adapter.rake +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - - -require 'saucelabs_adapter/run_utils' - -class Rake::Task - def self.exists?(name) - tasks.any? { |t| t.name == name } - end -end - -namespace :selenium do - - # Rake tasks are cumulative, and some old plugins are still defining selenium:server, so clear it. - Rake::Task[:'selenium:server'].clear_actions if Rake::Task.exists?('selenium:server') - - desc "Run the selenium remote-control server" - task :server do - system('bundle exec selenium-rc') - end - - desc "Run the selenium remote-control server in the background" - task :server_bg do - system('nohup selenium-rc 2&>1 &') - end - - desc "Runs Selenium tests locally (selenium server must already be started)" - task :local => [:local_env, :suite] - - desc "Run Selenium tests at saucelabs.com (using configuration 'saucelabs' in config/selenium.yml)" - task :sauce => [:sauce_env, :suite] - - desc "Run Selenium tests using configuration SELENIUM_ENV (from config/selenium.yml)" - task :custom => [:check_selenium_env_is_set, :suite] - - task :local_env do - ENV['SELENIUM_ENV'] = 'local' - end - - task :sauce_env do - ENV['SELENIUM_ENV'] = 'saucelabs' - end - - task :check_selenium_env_is_set do - raise "SELENIUM_ENV must be set" unless ENV['SELENIUM_ENV'] - end - - task :suite do - if (File.exists?("test/selenium/selenium_suite.rb")) - RunUtils.run "ruby test/selenium/selenium_suite.rb" - else - puts "test/selenium/selenium_suite.rb not found, bailing.\nPlease create a script that will run your selenium tests." - exit 1 - end - end -end diff --git a/lib/tasks/whitespace.rake b/lib/tasks/whitespace.rake index 397674ae5..7af099dd6 100644 --- a/lib/tasks/whitespace.rake +++ b/lib/tasks/whitespace.rake @@ -1,10 +1,20 @@ namespace :whitespace do desc 'Removes trailing whitespace' task :cleanup do - sh %{find . -name '*.rb' -exec sed -i '' 's/ *$//g' {} \\;} + sh %{for f in `find . -type f | grep -v -e '.git/' -e 'public/' -e '.png'`; + do cat $f | sed 's/[ \t]*$//' > tmp; cp tmp $f; rm tmp; echo -n .; + done} end + desc 'Converts hard-tabs into two-space soft-tabs' task :retab do - sh %{find . -name '*.rb' -exec sed -i '' 's/\t/ /g' {} \\;} + sh %{for f in `find . -type f | grep -v -e '.git/' -e 'public/' -e '.png'`; + do cat $f | sed 's/\t/ /g' > tmp; cp tmp $f; rm tmp; echo -n .; + done} + end + desc 'Remove consecutive blank lines' + task :scrub_gratuitous_newlines do + sh %{for f in `find . -type f | grep -v -e '.git/' -e 'public/' -e '.png'`; + do cat $f | sed '/./,/^$/!d' > tmp; cp tmp $f; rm tmp; echo -n .; + done} end end - diff --git a/public/javascripts/aspect-edit.js b/public/javascripts/aspect-edit.js index c7061797d..cb36d394e 100644 --- a/public/javascripts/aspect-edit.js +++ b/public/javascripts/aspect-edit.js @@ -5,7 +5,7 @@ function decrementRequestsCounter() { var $new_requests = $(".new_requests"), - request_html = $new_requests.html(), + request_html = $new_requests.html(), old_request_count = request_html.match(/\d+/); if( old_request_count == 1 ) { @@ -20,37 +20,15 @@ function decrementRequestsCounter() { } $(function() { - - - $('#move_friends_link').live( 'click', function(){ - $.post( - '/aspects/move_friends', - { 'moves' : $('#aspect_list').data() }, - function() { - $('#aspect_title').html("Groups edited successfully!"); - } - ); - - // should the following logic be moved into the $.post() callback? - $("#aspect_list").removeData(); - - $(".person") - .css('background-color','none') - .attr('from_aspect_id', function() { - return $(this).parent().attr('id') - }); - - }); - - $("ul .person .requested_person").draggable({ + // Multiple classes here won't work + $("ul .person").draggable({ revert: true }); - - // Moved class to logic above - unnec duplicate logic - //$("ul .requested_person").draggable({ - // revert: true - //}); - + + $("ul .requested_person").draggable({ + revert: true + }); + $(".aspect ul").droppable({ hoverClass: 'active', drop: function(event, ui) { @@ -65,26 +43,24 @@ $(function() { } }); - } else { - var $aspect_list = $('#aspect_list'), - move = {}; - - // This is poor implementation - move[ 'friend_id' ] = ui.draggable[0].id; // ui.draggable.attr('id') - move[ 'to' ] = $(this)[0].id;// $(this).attr('id'); - move[ 'from' ] = ui.draggable[0].getAttribute('from_aspect_id'); // ui.draggable.attr('from_aspect_id') - - // if created custom attr's - should be using `data-foo` - - - if (move['to'] == move['from']){ - $aspect_list.data( ui.draggable[0].id, []); - ui.draggable.css('background-color','#eee'); + }; + var dropzone = $(this)[0]; + + if ($(this)[0].id == ui.draggable[0].getAttribute('from_aspect_id')){ + ui.draggable.css('background','none'); } else { - $aspect_list.data( ui.draggable[0].id, move); ui.draggable.css('background-color','orange'); + $.ajax({ + url: "/aspects/move_friend/", + data: {"friend_id" : ui.draggable[0].id, + "from" : ui.draggable[0].getAttribute('from_aspect_id'), + "to" : { "to" : dropzone.id }}, + success: function(data){ + ui.draggable.attr('from_aspect_id', dropzone.id); + ui.draggable.css('background','none'); + }}); + } - } $(this).closest("ul").append(ui.draggable); } }); @@ -96,32 +72,32 @@ $(function() { if ($(ui.draggable[0]).hasClass('requested_person')){ $.ajax({ type: "DELETE", - url: "/requests/" + ui.draggable.attr('request_id'), + url: "/requests/" + ui.draggable.attr('request_id'), success: function () { decrementRequestsCounter(); } }); - + } else { $.ajax({ type: "DELETE", - url: "/people/" + ui.draggable.attr('id'), + url: "/people/" + ui.draggable.attr('id'), success: function () { alert("Removed Friend, proably want an undo countdown.") } }); - + } - $(ui.draggable[0]).fadeOut('slow'); // ui.draggable.fadeOut('slow') + $(ui.draggable[0]).fadeOut('slow'); // ui.draggable.fadeOut('slow') } }); $(".aspect h1").live( 'focus', function() { - var $this = $(this), - id = $this.closest("li").children("ul").attr("id"), + var $this = $(this), + id = $this.closest("li").children("ul").attr("id"), link = "/aspects/"+ id; $this.keypress(function(e) { diff --git a/public/javascripts/fancybox/blank.gif b/public/javascripts/fancybox/blank.gif old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_close.png b/public/javascripts/fancybox/fancy_close.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_loading.png b/public/javascripts/fancybox/fancy_loading.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_nav_left.png b/public/javascripts/fancybox/fancy_nav_left.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_nav_right.png b/public/javascripts/fancybox/fancy_nav_right.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_e.png b/public/javascripts/fancybox/fancy_shadow_e.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_n.png b/public/javascripts/fancybox/fancy_shadow_n.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_ne.png b/public/javascripts/fancybox/fancy_shadow_ne.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_nw.png b/public/javascripts/fancybox/fancy_shadow_nw.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_s.png b/public/javascripts/fancybox/fancy_shadow_s.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_se.png b/public/javascripts/fancybox/fancy_shadow_se.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_sw.png b/public/javascripts/fancybox/fancy_shadow_sw.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_shadow_w.png b/public/javascripts/fancybox/fancy_shadow_w.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_title_left.png b/public/javascripts/fancybox/fancy_title_left.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_title_main.png b/public/javascripts/fancybox/fancy_title_main.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_title_over.png b/public/javascripts/fancybox/fancy_title_over.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancy_title_right.png b/public/javascripts/fancybox/fancy_title_right.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancybox-x.png b/public/javascripts/fancybox/fancybox-x.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancybox-y.png b/public/javascripts/fancybox/fancybox-y.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/fancybox.png b/public/javascripts/fancybox/fancybox.png old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/jquery.easing-1.3.pack.js b/public/javascripts/fancybox/jquery.easing-1.3.pack.js old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/jquery.fancybox-1.3.1.css b/public/javascripts/fancybox/jquery.fancybox-1.3.1.css old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/jquery.fancybox-1.3.1.js b/public/javascripts/fancybox/jquery.fancybox-1.3.1.js old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/jquery.fancybox-1.3.1.pack.js b/public/javascripts/fancybox/jquery.fancybox-1.3.1.pack.js old mode 100755 new mode 100644 diff --git a/public/javascripts/fancybox/jquery.mousewheel-3.0.2.pack.js b/public/javascripts/fancybox/jquery.mousewheel-3.0.2.pack.js old mode 100755 new mode 100644 diff --git a/public/javascripts/fileuploader.js b/public/javascripts/fileuploader.js old mode 100755 new mode 100644 diff --git a/public/javascripts/jquery.cycle/jquery.cycle.lite.min.js b/public/javascripts/jquery.cycle/jquery.cycle.lite.min.js old mode 100755 new mode 100644 diff --git a/public/javascripts/jquery.cycle/src/jquery.cycle.lite.js b/public/javascripts/jquery.cycle/src/jquery.cycle.lite.js old mode 100755 new mode 100644 diff --git a/public/javascripts/jquery.infieldlabel.js b/public/javascripts/jquery.infieldlabel.js old mode 100755 new mode 100644 diff --git a/public/javascripts/stream.js b/public/javascripts/stream.js index cf0856754..7811fb1a3 100644 --- a/public/javascripts/stream.js +++ b/public/javascripts/stream.js @@ -14,14 +14,6 @@ $(document).ready(function(){ }); });//end document ready -$("#stream li").live('mouseover',function() { - $(this).children(".destroy_link").fadeIn(0); -}); - -$("#stream li").live('mouseout',function() { - $(this).children(".destroy_link").fadeOut(0); -}); - $(".show_post_comments").live('click', function(event) { event.preventDefault(); @@ -29,10 +21,10 @@ $(".show_post_comments").live('click', function(event) { if( $this.hasClass( "visible")) { $this.html($(this).html().replace("hide", "show")); - $this.closest("li").children(".content").children(".comments").fadeOut(100); + $this.closest("li").children(".content").children(".comments").slideUp(150); } else { $this.html($(this).html().replace("show", "hide")); - $this.closest("li").children(".content").children(".comments").fadeIn(100); + $this.closest("li").children(".content").children(".comments").slideDown(150); } $(this).toggleClass( "visible" ); }); diff --git a/public/javascripts/view.js b/public/javascripts/view.js index 4713c7164..1509145da 100644 --- a/public/javascripts/view.js +++ b/public/javascripts/view.js @@ -5,15 +5,15 @@ $(document).ready(function(){ - + $('#debug_info').click(function() { $('#debug_more').toggle('fast'); }); - + $("label").inFieldLabels(); - + $('#flash_notice, #flash_error, #flash_alert').delay(2500).slideUp(130); - + $("div.image_cycle").cycle({ fx: 'fade', random: 1, @@ -41,6 +41,12 @@ $(document).ready(function(){ } ); + $("#publisher textarea").keydown( function(e) { + if (e.shiftKey && e.keyCode == 13) { + $("#publisher form").submit(); + } + }); + });//end document ready diff --git a/public/javascripts/web_socket.js b/public/javascripts/web_socket.js old mode 100755 new mode 100644 diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 05c09b3f1..39427a4f4 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -13,11 +13,12 @@ body { a { color: #556270; color: #107fc9; - color: #069; + color: #019dbe; text-decoration: none; } a:hover { - color: #2276CC; - } + color: white; + background-color: #556270; + background-color: #019dbe; } h1 { font-size: 21px; @@ -117,7 +118,9 @@ header { header #session_action ul li:last-child { margin-right: 0; } header #aspect_header { - z-index: 5; + -webkit-box-shadow: 0px -4px 6px -2px #777777; + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f7f7f7), to(#eeeeee)); + background: -moz-linear-gradient(19% 75% 90deg, #eeeeee, #f7f7f7); background-color: #eeeeee; border-top: 1px solid white; padding: 20px 0; } @@ -128,7 +131,7 @@ header { color: #111111; } header #aspect_header a:hover { background: none; - color: #333333; } + color: #999999; } header #aspect_header .page_title { text-transform: uppercase; text-shadow: 0 2px 0 white; @@ -142,8 +145,14 @@ ul#stream { list-style: none; padding: 12px 0; border-bottom: 1px solid #eeeeee; } - ul#stream > li:first-child { - padding-top: 0; } + ul#stream > li:hover { + background: -webkit-gradient(linear, 0% 0%, 0% 50%, from(#fafafa), to(#fcfcfc)); + background-color: #fafafa; + border-bottom: 1px solid #dddddd; } + ul#stream > li:hover .destroy_link { + display: inline; } + ul#stream .right { + top: 0; } li.message { position: relative; @@ -156,17 +165,52 @@ li.message { li.message .delete:hover { background: #eeeeee; } li.message .content { - padding-left: 65px; } + padding-left: 65px; + width: 600px; } li.message .content span.from { color: black; font-weight: normal; - font-size: 120%; } - li.message .content span.from a{ - font-weight:bold; - } + font-size: 110%; } li.message .content div.info { color: #bababa; - font-size: 90%; } + font-size: 70%; } + li.message .content div.info .time a { + color: #666666; } + +.reshare_pane { + margin-left: 5px; + margin-right: 5px; + display: inline; + position: relative; } + .reshare_pane ul.reshare_box { + width: 150px; + display: none; + z-index: 10; + position: absolute; + margin-top: 5px; + padding: 0; + background-color: #fafafa; + list-style: none; + border: 5px solid #666666; + -webkit-box-shadow: 0 0 5px #666666; + -moz-box-shadow: 0 0 5px #666666; + text-shadow: 0 2px white; + color: black; } + .reshare_pane ul.reshare_box > li { + font-weight: bold; + padding: 8px; + padding-right: 15px; + border-top: 1px solid white; + border-bottom: 1px solid #cccccc; } + .reshare_pane ul.reshare_box > li:first-child { + border-top: none; } + .reshare_pane ul.reshare_box > li:last-child { + border-bottom: none; } + .reshare_pane ul.reshare_box > li a { + display: block; + height: 100%; } + .reshare_pane ul.reshare_box > li a:hover { + background-color: #eeeeee; } form { position: relative; @@ -224,12 +268,12 @@ ul.comment_set { margin-bottom: 0.5em; background-color: rgba(10, 81, 109, 0.05); padding: 0.6em; - border-bottom: 1px solid #cccccc; } + border-bottom: 1px solid #dddddd; } ul.comment_set li.comment .from { font-size: 1em; } ul.comment_set li.comment div.time { color: #666666; - font-size: 90%; } + font-size: 70%; } ul.comment_set li.comment form { margin-top: -5px; margin-bottom: 0; @@ -262,11 +306,14 @@ ul.comment_set { .destroy_link, .request_button { position: absolute; - right: 0; + right: 2em; bottom: 15px; } .destroy_link a, .request_button a { color: #999999; font-weight: normal; } + .destroy_link a:hover, .request_button a:hover { + text-decoration: underline; + background: none; } .destroy_link { display: none; @@ -301,13 +348,19 @@ ul.comment_set { color: #cccccc; } input[type='text'], textarea { - font-family: "Arial"; - font-size: 15px; + font-family: "lucida grande", "lucida sans", "sans-serif"; + font-size: 14px; padding: 0.3em; display: block; width: 66%; - border-top: 1px solid #666666; - height: auto; } + border: 1px solid #cccccc; + height: auto; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + box-shadow: 0 1px 2px white; + -moz-box-shadow: 0 1px 2px white; + -webkit-box-shadow: 0 1px 2px white; } #submit_block { text-align: right; @@ -343,12 +396,17 @@ label { margin-top: 26px; } #publisher textarea { width: 600px; - height: 40px; + height: 42px; margin-top: 0; - margin-bottom: 0; - -webkit-box-shadow: 0 1px 0 white; } + margin-bottom: 0; } #publisher .button { margin-left: 100px; } + #publisher img { + box-shadow: 0 1px 2px white; + -moz-box-shadow: 0 1px 2px white; + -webkit-box-shadow: 0 1px 2px white; + border: 1px solid #bbbbbb; + border-top: 1px solid #666666; } #image_picker .small_photo { height: 100px; @@ -382,14 +440,10 @@ label { bottom: 20px; font-size: 18px; text-shadow: 0 2px 0 black; } - .album .name a {color:#AAA; - font-weight:normal !important;} .album .name .time { - color:#069; font-size: 12px; } .album .name .time a { - color:#AAA; - font-weight: normal !important; } + font-weight: normal; } .album div.image_cycle img { display: none; } @@ -462,8 +516,11 @@ h1.big_text { #aspect_nav ul > li { padding: 0; display: inline; - margin-right: 0.5em; } + margin-right: 2px; } #aspect_nav ul > li a { + text-shadow: 0 2px 0 #444444; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; line-height: 22px; background-color: #444444; border: 1px solid #555555; @@ -474,14 +531,18 @@ h1.big_text { background-color: #4e4e4e; color: #cccccc; } #aspect_nav ul > li.selected a { + -webkit-box-shadow: 0px -4px 6px -2px #777777; + -moz-box-shadow: 0px -4px 6px -2px #777777; text-shadow: 0 2px 0 white; padding-top: 4px; padding-bottom: 5px; line-height: 18px; font-weight: bold; background-color: #eeeeee; + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(white), to(#f7f7f7)); + background: -moz-linear-gradient(19% 75% 90deg, #f7f7f7, white); border: 1px solid white; - border-bottom: 1px solid #eeeeee; + border-bottom: 1px solid #f7f7f7; color: black; } #aspect_nav ul > li.selected a:hover { background-color: #efefef; } @@ -515,6 +576,16 @@ h1.big_text { .requests h1, .remove h1 { display: inline-block; } + .aspect .tip, + .requests .tip, + .remove .tip { + display: none; + color: #999999; + margin-left: 0.5em; } + .aspect .edit_name_field:hover .tip, + .requests .edit_name_field:hover .tip, + .remove .edit_name_field:hover .tip { + display: inline; } .aspect .aspect_name, .requests .aspect_name, .remove .aspect_name { @@ -542,7 +613,8 @@ h1.big_text { .requests .grey, .remove .grey { color: #999999; - cursor: default; } + cursor: default; + text-shadow: 0 2px white; } .aspect ul.dropzone, .requests ul.dropzone, .remove ul.dropzone { @@ -598,37 +670,70 @@ h1.big_text { -moz-box-shadow: 0 2px 4px #333333; opacity: 0.9; } -#notification_badge { - position: fixed; - bottom: 0; - margin-left: 854px; } - #notification_badge a { - background-color: #eeeeee; - border: 1px solid #cccccc; - border-bottom: none; - padding: 3px 10px; } +ul#settings_nav { + list-style: none; + padding: 0; + marign: 0; + font-size: larger; } + ul#settings_nav > li a { + display: block; + height: 100%; + border-bottom: 1px solid #eeeeee; + padding: 5px 0; } + +.settings_pane { + display: none; } #fancybox-close:hover { background-color: transparent; } -.edit_photo{ - display:none;} -#photo_caption{ - width:100%; - margin:auto;} -.caption .description{ - text-align:left; - margin-left:3em; - display:block - width:90%;} -.caption a{ - float:left; -} -#add-description{ - width:100%;} -.caption, .edit_photo{ - margin:auto; - width:70%;} -#photo_submit{ - float:right;} -.clear{ - clear:both;} + +.aspect_tag, +.public_aspect_tag { + position: absolute; + top: 15px; + right: 2em; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + font-size: smaller; + padding: 0 6px; + color: #999999; + text-shadow: 0 1px white; + border-bottom: 1px solid #eeeeee; + cursor: default; } + +.public_aspect_tag { + background: -moz-linear-gradient(19% 75% 90deg, #fffa75, #fff8ba); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff8ba), to(#fffa75)); + background-color: #fffc7f; + border-top: 1px solid #ebe66c; } + +.aspect_tag { + background: -moz-linear-gradient(19% 75% 90deg, #e0e0e0, #f0f0f0); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f0f0f0), to(#e0e0e0)); + background-color: #eeeeee; + color: #999999; + text-shadow: 0 1px white; + border-top: 1px solid #dddddd; } + .aspect_tag ul { + display: inline; + margin: 0; + padding: 0; + list-style: none; } + .aspect_tag ul li { + display: inline-block; + margin-right: 2px; + padding-right: 4px; + border-right: 1px solid #cccccc; } + .aspect_tag ul li:last-child { + margin-right: 0; + padding-right: 0; + border-right: none; } + +#friend_pictures { + line-height: 1em; } + #friend_pictures img { + margin-right: -1px; } + +#thumbnails { + line-height: 14px; } diff --git a/public/stylesheets/blueprint/plugins/buttons/icons/cross.png b/public/stylesheets/blueprint/plugins/buttons/icons/cross.png old mode 100755 new mode 100644 diff --git a/public/stylesheets/blueprint/plugins/buttons/icons/key.png b/public/stylesheets/blueprint/plugins/buttons/icons/key.png old mode 100755 new mode 100644 diff --git a/public/stylesheets/blueprint/plugins/buttons/icons/tick.png b/public/stylesheets/blueprint/plugins/buttons/icons/tick.png old mode 100755 new mode 100644 diff --git a/public/stylesheets/blueprint/src/grid.css b/public/stylesheets/blueprint/src/grid.css old mode 100755 new mode 100644 diff --git a/public/stylesheets/blueprint/src/print.css b/public/stylesheets/blueprint/src/print.css old mode 100755 new mode 100644 diff --git a/public/stylesheets/blueprint/src/reset.css b/public/stylesheets/blueprint/src/reset.css old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.eot b/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.eot old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.svg b/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.svg old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.ttf b/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.ttf old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.woff b/public/stylesheets/brandongrotesque_light/Brandon_light-webfont.woff old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/Extras/alt_base64_stylesheet.css b/public/stylesheets/brandongrotesque_light/Extras/alt_base64_stylesheet.css old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/demo.html b/public/stylesheets/brandongrotesque_light/demo.html old mode 100755 new mode 100644 diff --git a/public/stylesheets/brandongrotesque_light/stylesheet.css b/public/stylesheets/brandongrotesque_light/stylesheet.css old mode 100755 new mode 100644 diff --git a/public/stylesheets/fileuploader.css b/public/stylesheets/fileuploader.css old mode 100755 new mode 100644 index 0e3f111a9..823c1b346 --- a/public/stylesheets/fileuploader.css +++ b/public/stylesheets/fileuploader.css @@ -3,14 +3,14 @@ .qq-upload-button { display:block; /* or inline-block */ width: 105px; padding: 7px 0; text-align:center; - background:#880000; border-bottom:1px solid #ddd;color:#fff; + background:#333; border-bottom:1px solid #999;color:#fff; } -.qq-upload-button-hover {background:#cc0000;} +.qq-upload-button-hover {background:#666;} .qq-upload-button-focus {outline:1px dotted black;} .qq-upload-drop-area { position:absolute; top:0; left:0; width:100%; height:100%; min-height: 70px; z-index:2; - background:#FF9797; text-align:center; + background:#ccc; text-align:center; } .qq-upload-drop-area span { display:block; position:absolute; top: 50%; width:100%; margin-top:-8px; font-size:16px; @@ -28,4 +28,4 @@ .qq-upload-size,.qq-upload-cancel {font-size:11px;} .qq-upload-failed-text {display:none;} -.qq-upload-fail .qq-upload-failed-text {display:inline;} \ No newline at end of file +.qq-upload-fail .qq-upload-failed-text {display:inline;} diff --git a/public/stylesheets/loading.gif b/public/stylesheets/loading.gif old mode 100755 new mode 100644 diff --git a/public/stylesheets/sass/application.sass b/public/stylesheets/sass/application.sass index 206c122bd..225c5ca84 100644 --- a/public/stylesheets/sass/application.sass +++ b/public/stylesheets/sass/application.sass @@ -35,7 +35,7 @@ h1 h3 :font - :size 18px + :size 18px :weight bold .avatar @@ -54,7 +54,7 @@ h3 :left 50% :text :align center - :font + :font :size 14px :padding 3px 0 @@ -146,7 +146,11 @@ header :right 0 #aspect_header - :z-index 5 + :-webkit-box-shadow 0px -4px 6px -2px #777 + + :background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F7F7F7), to(#EEEEEE)) + :background -moz-linear-gradient(19% 75% 90deg, #eee, #f7f7f7) + :background :color #eee :border @@ -162,7 +166,7 @@ header :color #111 &:hover :background none - :color #333 + :color #999 .page_title :text @@ -182,9 +186,20 @@ ul#stream :border :bottom 1px solid #eee - > li:first-child - :padding - :top 0 + &:hover + :background -webkit-gradient(linear, 0% 0%, 0% 50%, from(#FAFAFA), to(#FCFCFC)) + + :background + :color #fafafa + + :border + :bottom 1px solid #ddd + + .destroy_link + :display inline + + .right + :top 0 li.message :position relative @@ -200,10 +215,11 @@ li.message .delete:hover :background #eee - + .content :padding :left 65px + :width 600px span.from :color #000 @@ -216,6 +232,63 @@ li.message :color #bababa :font-size 70% + .time + a + :color #666 + +.reshare_pane + :margin + :left 5px + :right 5px + :display inline + :position relative + + ul.reshare_box + :width 150px + :display none + :z-index 10 + :position absolute + :margin + :top 5px + :padding 0 + + :background + :color #fafafa + + :list + :style none + + :border 5px solid #666 + :-webkit-box-shadow 0 0 5px #666 + :-moz-box-shadow 0 0 5px #666 + + :text-shadow 0 2px #fff + :color #000 + + > li + :font + :weight bold + + :padding 8px + :right 15px + :border + :top 1px solid #fff + :bottom 1px solid #ccc + + &:first-child + :border + :top none + &:last-child + :border + :bottom none + a + :display block + :height 100% + + &:hover + :background + :color #eee + form :position relative @@ -223,11 +296,11 @@ form :size 120% :margin 1em :left 0em - + #user_name :margin :bottom 20px - + img :margin :right 10px @@ -243,7 +316,7 @@ form :color #000 span - :size small + :size small :font :weight normal :color #999 @@ -259,7 +332,7 @@ form :display inline :margin :right 1em - + #stream div.comments :display none @@ -274,7 +347,7 @@ input.comment_submit :display none :margin :right -10px - + ul.comment_set :margin 0 @@ -293,12 +366,12 @@ ul.comment_set :color rgba(10,81,109,0.05) :padding 0.6em :border - :bottom 1px solid #ccc + :bottom 1px solid #ddd .from :font :size 1em - + div.time :color #666 :font-size 70% @@ -323,7 +396,7 @@ ul.comment_set :list-style-type none :margin 0 :padding 0 - + #stream, #profile, .comments @@ -337,20 +410,24 @@ ul.comment_set :float left :margin :right 10px - + .pagination a :padding 3px - + .destroy_link, .request_button :position absolute - :right 0 + :right 2em :bottom 15px a :color #999 :font :weight normal + &:hover + :text + :decoration underline + :background none .destroy_link :display none @@ -392,14 +469,22 @@ ul.comment_set input[type='text'], textarea :font - :family 'lucida grande', 'sans-serif' + :family 'lucida grande', 'lucida sans', 'sans-serif' :size 14px :padding 0.3em :display block :width 66% - :border-top 1px solid #666 + :border 1px solid #ccc :height auto + :border-radius 5px + :-webkit-border-radius 5px + :-moz-border-radius 5px + + :box-shadow 0 1px 2px #fff + :-moz-box-shadow 0 1px 2px #fff + :-webkit-box-shadow 0 1px 2px #fff + #submit_block :text :align right @@ -430,9 +515,9 @@ label p :position absolute - :left 0 + :left 0 :top 0 - + form :display inline @@ -444,16 +529,22 @@ label textarea :width 600px - :height 40px + :height 42px :margin :top 0 :bottom 0 - :-webkit-box-shadow 0 1px 0 #fff - .button :margin-left 100px + img + :box-shadow 0 1px 2px #fff + :-moz-box-shadow 0 1px 2px #fff + :-webkit-box-shadow 0 1px 2px #fff + :border 1px solid #bbb + :top 1px solid #666 + + #image_picker .small_photo @@ -489,13 +580,13 @@ label .name :position absolute - :z-index 6 + :z-index 6 :padding 1em :background rgba(0,0,0,0.8) :bottom 20px :font :size 18px - + :text-shadow 0 2px 0 #000 .time @@ -512,7 +603,7 @@ label .field_with_submit input[type='text'] :width 82% - :display inline + :display inline h1.big_text :position relative @@ -541,7 +632,7 @@ h1.big_text :margin 0 :top 25px - :bottom 25px + :bottom 25px :min-height 36px @@ -601,13 +692,17 @@ h1.big_text :padding 0 :display inline :margin - :right 0.5em + :right 2px a + :text-shadow 0 2px 0 #444 + :-webkit-border-radius 3px 3px 0 0 + :-moz-border-radius 3px 3px 0 0 :line :height 22px :background :color #444 + :border 1px solid #555 :padding 3px 8px @@ -620,6 +715,9 @@ h1.big_text :color #ccc &.selected a + :-webkit-box-shadow 0px -4px 6px -2px #777 + :-moz-box-shadow 0px -4px 6px -2px #777 + :text-shadow 0 2px 0 #fff :padding :top 4px @@ -630,8 +728,12 @@ h1.big_text :weight bold :background :color #eee + + :background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#F7F7F7)) + :background -moz-linear-gradient(19% 75% 90deg, #f7f7f7, #fff) + :border 1px solid #fff - :bottom 1px solid #eee + :bottom 1px solid #F7F7F7 :color #000 &:hover :background @@ -675,6 +777,17 @@ h1.big_text h1 :display inline-block + .tip + :display none + :color #999 + :margin + :left 0.5em + + .edit_name_field:hover + .tip + :display inline + + .aspect_name :position relative @@ -699,6 +812,7 @@ h1.big_text .grey :color #999 :cursor default + :text-shadow 0 2px #fff ul.dropzone :min-height 20px @@ -718,7 +832,7 @@ h1.big_text .person, .requested_person :display inline-block - :padding 5px + :padding 5px :cursor move :margin 5px :z-index 10 @@ -742,21 +856,102 @@ h1.big_text :-moz-box-shadow 0 2px 4px #333 :opacity 0.9 -#notification_badge - :position fixed - :bottom 0 - :margin - :left 854px +ul#settings_nav + :list + :style none + :padding 0 + :marign 0 - a - :background - :color #eee + :font + :size larger - :border 1px solid #ccc - :bottom none + > li + + a + :display block + :height 100% + :border + :bottom 1px solid #eee + :padding 5px 0 + + +.settings_pane + :display none - :padding 3px 10px #fancybox-close:hover :background :color transparent + +.aspect_tag, +.public_aspect_tag + :position absolute + :top 15px + :right 2em + + :border-radius 5px + :-webkit-border-radius 5px + :-moz-border-radius 5px + + :font + :size smaller + :padding 0 6px + + :color #999 + :text + :shadow 0 1px #fff + + :border + :bottom 1px solid #eee + + :cursor default + +.public_aspect_tag + :background -moz-linear-gradient(19% 75% 90deg,#FFFA75, #FFF8BA) + :background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#FFF8BA), to(#FFFA75)) + :color #FFFC7F + :border + :top 1px solid #EBE66C + +.aspect_tag + :background -moz-linear-gradient(19% 75% 90deg,#E0E0E0, #F0F0F0) + :background -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F0F0F0), to(#E0E0E0)) + :color #eee + :color #999 + :text + :shadow 0 1px #fff + :border + :top 1px solid #ddd + + ul + :display inline + :margin 0 + :padding 0 + :list + :style none + + li + :display inline-block + :margin + :right 2px + :padding + :right 4px + :border + :right 1px solid #ccc + + &:last-child + :margin + :right 0 + :padding + :right 0 + :border + :right none + + +#friend_pictures + :line-height 1em + img + :margin-right -1px + +#thumbnails + :line-height 14px diff --git a/public/stylesheets/sass/sessions.sass b/public/stylesheets/sass/sessions.sass index 326d46b0f..d7cf4644e 100644 --- a/public/stylesheets/sass/sessions.sass +++ b/public/stylesheets/sass/sessions.sass @@ -24,7 +24,7 @@ :left 50% :text :align center - :font + :font :size 14px :padding 3px 0 @@ -135,7 +135,7 @@ input[type='password'] .username :width 200px :display inline - + input :display inline :width 200px diff --git a/script/cucumber b/script/cucumber new file mode 100755 index 000000000..7fa5c9208 --- /dev/null +++ b/script/cucumber @@ -0,0 +1,10 @@ +#!/usr/bin/env ruby + +vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first +if vendored_cucumber_bin + load File.expand_path(vendored_cucumber_bin) +else + require 'rubygems' unless ENV['NO_RUBYGEMS'] + require 'cucumber' + load Cucumber::BINARY +end diff --git a/script/rails b/script/rails index f138a34a4..f8da2cffd 100755 --- a/script/rails +++ b/script/rails @@ -1,4 +1,4 @@ -#!/usr/bin/env ruby1.8 +#!/usr/bin/env ruby # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. APP_PATH = File.expand_path('../../config/application', __FILE__) diff --git a/script/server b/script/server index 3804ccad9..c5357a32e 100755 --- a/script/server +++ b/script/server @@ -7,6 +7,13 @@ then echo "Mongod not started" else mkdir -p -v log/thin/ + #force AGPL + test -w public -a ! -e public/source.tar && + tar cf public/source.tar --exclude='source.tar' -X .gitignore * + test -e public/source.tar || { + echo "Can't find, or even create, public/source.tar. Giving up" + exit 2 + } bundle exec ruby ./script/websocket_server.rb& bundle exec thin start $@ fi diff --git a/script/ubuntu-setup.bash b/script/ubuntu-setup.bash new file mode 100755 index 000000000..666eac818 --- /dev/null +++ b/script/ubuntu-setup.bash @@ -0,0 +1,171 @@ +#!/bin/bash +# Author : hemanth.hm@gmail.com +# Site : www.h3manth.com +# Contributions from: Mackenzie Morgan (maco) and Daniel Thomas (drt24) +# This script helps to setup diaspora. +# +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +# USAGE: ./script/ubuntu-setup.bash +# Do NOT run this script as root. + +# Set extented globbing +shopt -s extglob + +# fail on error +set -e + +[ "$(whoami)" == "root" ] && echo "Please do not run this script as root/sudo +We need to do some actions as an ordinary user. We use sudo where necessary." && exit 1 + +# Check if the user has sudo privileges. +sudo -v >/dev/null 2>&1 || { echo $(whoami) has no sudo privileges ; exit 1; } + +# Check if universal repository is enabled +grep -i universe /etc/apt/sources.list > /dev/null || \ + { echo "Please enable universe repository" ; exit 1 ; } + +# Make sure that we only install the latest version of packages +sudo apt-get update + +# Check if wget is installed +test wget || { echo "Installing wget.." && sudo apt-get install wget \ + && echo "Installed wget.." ; } + +# Install build tools +echo "Installing build tools.." +sudo apt-get -y --no-install-recommends install \ + build-essential libxslt1.1 libxslt1-dev libxml2 +echo "..Done installing build tools" + +# Install Ruby 1.8.7 +echo "Installing ruby-full Ruby 1.8.7.." +sudo apt-get -y --no-install-recommends install ruby-full +echo "..Done installing Ruby" + +# Install Rake +echo "Installing rake.." +sudo apt-get -y --no-install-recommends install rake +echo "..Done installing rake" + +#Store the release name so we can use it here and later +RELEASE=$(lsb_release -c | cut -f2) + +# Get the current release and install mongodb +if [ $RELEASE == "maverick" ] +then + #mongodb does not supply a repository for maverick yet so install + # an older version from the ubuntu repositories + if [ ! -f /usr/lib/libmozjs.so ] + then + echo "Lanchpad bug https://bugs.launchpad.net/ubuntu/+source/mongodb/+bug/557024 +has not been fixed using workaround:" + echo "sudo ln -s /usr/lib/xulrunner-1.9.2.10/libmozjs.so /usr/lib/libmozjs.so" + sudo ln -s /usr/lib/xulrunner-1.9.2.10/libmozjs.so /usr/lib/libmozjs.so + fi + + sudo apt-get -y --no-install-recommends install mongodb +else + lsb=$(lsb_release -rs) + ver=${lsb//.+(0)/.} + repo="deb http://downloads.mongodb.org/distros/ubuntu ${ver} 10gen" + echo "Setting up MongoDB.." + echo "." + echo ${repo} | sudo tee -a /etc/apt/sources.list + echo "." + echo "Fetching keys.." + sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 + echo "." + sudo apt-get update + echo "." + sudo apt-get -y --no-install-recommends install mongodb-stable + echo "Done installing monngodb-stable.." +fi + +# Install imagemagick +echo "Installing imagemagick.." +sudo apt-get -y --no-install-recommends install imagemagick libmagick9-dev +echo "Installed imagemagick.." + +# Install git-core +echo "Installing git-core.." +sudo apt-get -y --no-install-recommends install git-core +echo "Installed git-core.." + +# Setting up ruby gems +echo "Fetching and installing ruby gems.." +( + if [ $RELEASE == "maverick" ] + then + sudo apt-get install --no-install-recommends -y rubygems + sudo ln -s /var/lib/gems/1.8/bin/bundle /usr/local/bin/bundle #for PATH + elif [ $RELEASE == "lucid" ] + then + sudo add-apt-repository ppa:maco.m/ruby + sudo apt-get update + sudo apt-get install --no-install-recommends -y rubygems + sudo ln -s /var/lib/gems/1.8/bin/bundle /usr/local/bin/bundle #for PATH + else + # Old version + echo "." + cd /tmp + wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz + echo "." + tar -xf rubygems-1.3.7.tgz + echo "." + cd rubygems-1.3.7 + echo "." + sudo ruby setup.rb + echo "." + sudo ln -s /usr/bin/gem1.8 /usr/bin/gem + echo "." + fi +) +echo "Done installing the gems.." + +# Install bundler +echo "Installing bundler.." +sudo gem install bundler +echo "Installed bundler.." + +# Take a clone of Diaspora +( + # Check if the user is already in a cloned source if not clone the source + [[ $( basename $PWD ) == "diaspora" ]] && \ + echo "Already in diaspora directory" || \ + { git clone http://github.com/diaspora/diaspora.git && cd diaspora + echo "Cloned the source.." + } + + # Install extra gems + echo "Installing more gems.." + bundle install + echo "Installed." + + #Configure diaspora + cp config/app_config.yml.example config/app_config.yml + echo "You need to configure diaspora to tell it which URL it has. +Opening editor in 5 seconds and then continuing with install." + sleep 5 + #ensure EDITOR is set + if [ -z "${EDITOR}"] + then + EDITOR=vi + fi + $EDITOR config/app_config.yml + + # Create the shared directory which is used by rake db:seed:tom + mkdir shared + + # Install DB setup + echo "Seting up DB.." + rake db:seed:tom + echo "DB ready. Login -> tom and password -> evankorth. +More details ./diaspora/db/seeds/tom.rb." + + # Run appserver + echo "Starting server" + bundle exec thin start +) diff --git a/script/websocket_server.rb b/script/websocket_server.rb index 2fbc1370a..dae054f15 100644 --- a/script/websocket_server.rb +++ b/script/websocket_server.rb @@ -24,7 +24,7 @@ begin Diaspora::WebSocket.initialize_channels EventMachine::WebSocket.start( - :host => "0.0.0.0", + :host => APP_CONFIG[:socket_host], :port => APP_CONFIG[:socket_port], :debug =>APP_CONFIG[:socket_debug]) do |ws| ws.onopen { diff --git a/spec/controllers/albums_controller_spec.rb b/spec/controllers/albums_controller_spec.rb index ce2bd305d..a8f5f8506 100644 --- a/spec/controllers/albums_controller_spec.rb +++ b/spec/controllers/albums_controller_spec.rb @@ -2,22 +2,31 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require 'spec_helper' -require File.dirname(__FILE__) + '/../spec_helper' -include ApplicationHelper describe AlbumsController do render_views before do @user = Factory.create(:user) - @user.aspect(:name => "lame-os") - @album = Factory.create(:album) + @aspect = @user.aspect(:name => "lame-os") + @album = @user.post :album, :to => @aspect.id, :name => 'things on fire' sign_in :user, @user end it "should update the name of an album" do sign_in :user, @user - put :update, :id => @album._id, :album => { :name => "new_name"} + put :update, :id => @album.id, :album => { :name => "new_name"} @album.reload.name.should eql("new_name") end + describe '#create' do + it 'all aspects' do + params = {"album" => {"name" => "Sunsets","to" => "all"}} + post :create, params + end + it 'one aspect' do + params = {"album" => {"name" => "Sunsets","to" => @aspect.id.to_s}} + post :create, params + end + end end diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb index a186e8b7c..2e05b850c 100644 --- a/spec/controllers/aspects_controller_spec.rb +++ b/spec/controllers/aspects_controller_spec.rb @@ -2,10 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require 'spec_helper' - -require File.dirname(__FILE__) + '/../spec_helper' -include ApplicationHelper describe AspectsController do render_views before do diff --git a/spec/controllers/dev_utilities_controller_spec.rb b/spec/controllers/dev_utilities_controller_spec.rb new file mode 100644 index 000000000..66c07350f --- /dev/null +++ b/spec/controllers/dev_utilities_controller_spec.rb @@ -0,0 +1,42 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +require File.join(File.dirname(__FILE__), "..", "spec_helper") + +describe DevUtilitiesController do + render_views + + before do + @tom = Factory.create(:user, :email => "tom@tom.joindiaspora.org") + sign_in :user, @tom + end + + describe "#zombiefriends" do + it "succeeds" do + get :zombiefriends + response.should be_success + end + end + + describe "#set_profile_photo" do + # In case anyone wants their config/backer_number.yml to still exist after running specs + before do + @backer_number_file = File.join(File.dirname(__FILE__), "..", "..", "config", "backer_number.yml") + @temp_file = File.join(File.dirname(__FILE__), "..", "..", "config", "backer_number.yml-tmp") + FileUtils.mv(@backer_number_file, @temp_file, :force => true) + end + after do + if File.exists?(@temp_file) + FileUtils.mv(@temp_file, @backer_number_file, :force => true) + else + FileUtils.rm_rf(@backer_number_file) + end + end + it "succeeds" do + get :set_backer_number, 'number' => '3' + get :set_profile_photo + response.should be_success + end + end +end diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb index badfdf496..4ce6e3e69 100644 --- a/spec/controllers/people_controller_spec.rb +++ b/spec/controllers/people_controller_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe PeopleController do render_views diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb index bea772e20..22e71befb 100644 --- a/spec/controllers/publics_controller_spec.rb +++ b/spec/controllers/publics_controller_spec.rb @@ -2,36 +2,35 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe PublicsController do - render_views + render_views + let(:user) {Factory.create :user} + let(:user2){Factory.create :user} before do - @user = Factory.create(:user) - sign_in :user, @user + sign_in :user, user end describe 'receive endpoint' do it 'should have a and endpoint and return a 200 on successful receipt of a request' do - post :receive, :id =>@user.person.id + post :receive, :id =>user.person.id response.code.should == '200' end it 'should accept a post from another node and save the information' do - user2 = Factory.create(:user) message = user2.build_post(:status_message, :message => "hi") - @user.reload - @user.visible_post_ids.include?(message.id).should be false - xml = @user.person.encrypt(user2.salmon(message, :to => @user.person).to_xml) + user.reload + user.visible_post_ids.include?(message.id).should be false - post :receive, :id => @user.person.id, :xml => xml + xml = user2.salmon(message).xml_for(user.person) - @user.reload - @user.visible_post_ids.include?(message.id).should be true + post :receive, :id => user.person.id, :xml => xml + + user.reload + user.visible_post_ids.include?(message.id).should be true end end @@ -43,35 +42,29 @@ describe PublicsController do end describe 'friend requests' do + let(:aspect2) {user2.aspect(:name => 'disciples')} + let!(:req) {user2.send_friend_request_to(user.person, aspect2)} + let!(:xml) {user2.salmon(req).xml_for(user.person)} before do - @user2 = Factory.create(:user) - aspect = @user2.aspect(:name => 'disciples') - - @user3 = Factory.create(:user) - - req = @user2.send_friend_request_to(@user.person, aspect) - - @xml = @user.person.encrypt(@user2.salmon(req, :to => @user.person).to_xml) - req.delete - @user2.reload - @user2.pending_requests.count.should be 1 + user2.reload + user2.pending_requests.count.should be 1 end it 'should add the pending request to the right user if the target person exists locally' do - @user2.delete - post :receive, :id => @user.person.id, :xml => @xml + user2.delete + post :receive, :id => user.person.id, :xml => xml - assigns(:user).should eq(@user) + assigns(:user).should eq(user) end it 'should add the pending request to the right user if the target person does not exist locally' do - Person.should_receive(:by_webfinger).with(@user2.person.diaspora_handle).and_return(@user2.person) - @user2.person.delete - @user2.delete - post :receive, :id => @user.person.id, :xml => @xml + Person.should_receive(:by_webfinger).with(user2.person.diaspora_handle).and_return(user2.person) + user2.person.delete + user2.delete + post :receive, :id => user.person.id, :xml => xml - assigns(:user).should eq(@user) + assigns(:user).should eq(user) end end end diff --git a/spec/controllers/requests_controller_spec.rb b/spec/controllers/requests_controller_spec.rb deleted file mode 100644 index f0864abe1..000000000 --- a/spec/controllers/requests_controller_spec.rb +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - - -require File.dirname(__FILE__) + '/../spec_helper' -include ApplicationHelper -include RequestsHelper -describe RequestsController do - render_views - before do - @user = Factory.create :user - stub_success("tom@tom.joindiaspora.com") - - @tom = Redfinger.finger('tom@tom.joindiaspora.com') - sign_in :user, @user - stub!(:current_user).and_return @user - end - it 'should return the correct tag and url for a given address' do - relationship_flow('tom@tom.joindiaspora.com')[:friend].receive_url.include?("receive/user").should == true - end -end diff --git a/spec/controllers/sockets_controller_spec.rb b/spec/controllers/sockets_controller_spec.rb index 4104d0d51..905b1611e 100644 --- a/spec/controllers/sockets_controller_spec.rb +++ b/spec/controllers/sockets_controller_spec.rb @@ -2,15 +2,13 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require 'spec_helper' - -require File.dirname(__FILE__) + '/../spec_helper' - -class SocketsController +SocketsController.class_eval <<-EOT def url_options {:host => ""} end -end +EOT describe SocketsController do render_views diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb new file mode 100644 index 000000000..0352d2bf2 --- /dev/null +++ b/spec/controllers/users_controller_spec.rb @@ -0,0 +1,68 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +require 'spec_helper' + +describe UsersController do + before do + @user = Factory.create(:user) + sign_in :user, @user + @user.aspect(:name => "lame-os") + end + + describe '#update' do + context 'with a profile photo set' do + before do + @user.person.profile.image_url = "http://tom.joindiaspora.com/images/user/tom.jpg" + @user.person.profile.save + end + + it "doesn't overwrite the profile photo when an empty string is passed in" do + image_url = @user.person.profile.image_url + put("update", :id => @user.id, "user"=> {"profile"=> + {"image_url" => "", + "last_name" => @user.person.profile.last_name, + "first_name" => @user.person.profile.first_name}}) + + @user.person.profile.image_url.should == image_url + end + end + + context 'should allow the user to update their password' do + it 'should change a users password ' do + old_password = @user.encrypted_password + + put("update", :id => @user.id, "user"=> {"password" => "foobaz", 'password_confirmation' => "foobaz","profile"=> + {"image_url" => "", + "last_name" => @user.person.profile.last_name, + "first_name" => @user.person.profile.first_name}}) + + @user.reload + @user.encrypted_password.should_not == old_password + end + + it 'should not change a password if they do not match' do + old_password = @user.encrypted_password + put("update", :id => @user.id, "user"=> {"password" => "foobarz", 'password_confirmation' => "not_the_same","profile"=> + {"image_url" => "", + "last_name" => @user.person.profile.last_name, + "first_name" => @user.person.profile.first_name}}) + @user.reload + @user.encrypted_password.should == old_password + end + + + it 'should not update if the password fields are left blank' do + + old_password = @user.encrypted_password + put("update", :id => @user.id, "user"=> {"password" => "", 'password_confirmation' => "","profile"=> + {"image_url" => "", + "last_name" => @user.person.profile.last_name, + "first_name" => @user.person.profile.first_name}}) + @user.reload + @user.encrypted_password.should == old_password + end + end + end +end diff --git a/spec/factories.rb b/spec/factories.rb index c1dfcd50a..3444cf9e1 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - #For Guidance #http://github.com/thoughtbot/factory_girl # http://railscasts.com/episodes/158-factories-not-fixtures @@ -19,7 +17,7 @@ Factory.define :person do |p| p.sequence(:url) {|n| "http://google-#{n}.com/"} p.profile Factory.create(:profile) - p.serialized_key OpenSSL::PKey::RSA.generate(1024).public_key.export + p.serialized_public_key OpenSSL::PKey::RSA.generate(1024).public_key.export end Factory.define :album do |p| @@ -27,19 +25,25 @@ Factory.define :album do |p| p.person { |a| Factory.create(:person) } end -Factory.define :person_with_private_key, :parent => :person do |p| - p.serialized_key OpenSSL::PKey::RSA.generate(1024).export -end - -Factory.define :person_with_user, :parent => :person_with_private_key do |p| -end - Factory.define :user do |u| u.sequence(:username) {|n| "bob#{n}"} 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)} + u.serialized_private_key OpenSSL::PKey::RSA.generate(1024).export + u.after_build do |user| + user.person = Factory(:person, :owner_id => user._id, + :serialized_public_key => user.encryption_key.public_key.export, + :diaspora_handle => "#{user.username}@#{APP_CONFIG[:pod_url].gsub(/(https?:|www\.)\/\//, '').chop!}") + end +end + +Factory.define :user_with_aspect, :parent => :user do |u| + u.after_build { |user| user.aspects << Factory(:aspect) } +end + +Factory.define :aspect do |aspect| + aspect.name "generic" end Factory.define :status_message do |m| @@ -52,7 +56,6 @@ Factory.define :blog do |b| b.sequence(:body) {|n| "jimmy's huge #{n} whales"} end - Factory.define :bookmark do |b| b.link "http://www.yahooligans.com/" end @@ -66,3 +69,11 @@ Factory.define :photo do |p| end Factory.define(:comment) {} + +Factory.define :fb_status do |s| + s.graph_id "367501354973" + s.author_name "Bret Taylor" + s.author_id "220439" + s.message "Pigs run from our house in fear. Tonight, I am wrapping the pork tenderloin in bacon and putting pancetta in the corn." + s.updated_time Time.parse "2010-03-06T02:57:48+0000" +end diff --git a/spec/fixtures/evan_hcard b/spec/fixtures/evan_hcard index d34408759..8944ef1e3 100644 --- a/spec/fixtures/evan_hcard +++ b/spec/fixtures/evan_hcard @@ -62,7 +62,7 @@

Creative Commons Attribution 3.0:w - + All Evan Prodromou content and data are available under the Creative Commons Attribution 3.0 license.

diff --git a/spec/fixtures/fb_status b/spec/fixtures/fb_status new file mode 100644 index 000000000..5602e8343 --- /dev/null +++ b/spec/fixtures/fb_status @@ -0,0 +1,79 @@ +{ + "id": "367501354973", + "from": { + "name": "Bret Taylor", + "id": "220439" + }, + "message": "Pigs run from our house in fear. Tonight, I am wrapping the pork tenderloin in bacon and putting pancetta in the corn.", + "updated_time": "2010-03-06T02:57:48+0000", + "likes": { + "data": [ + { + "id": "29906278", + "name": "Ross Miller" + } + ] + }, + "comments": { + "data": [ + { + "id": "367501354973_12216733", + "from": { + "name": "Doug Edwards", + "id": "628675309" + }, + "message": "Make sure you don't, as they say, go whole hog...\nhttp://www.youtube.com/watch?v=U4wTFuaV8VQ", + "created_time": "2010-03-06T03:24:46+0000" + }, + { + "id": "367501354973_12249673", + "from": { + "name": "Tom Taylor", + "id": "1249191863" + }, + "message": "Are you and Karen gonna, as they say, pig out?", + "created_time": "2010-03-06T21:05:21+0000" + }, + { + "id": "367501354973_12249857", + "from": { + "name": "Sheila Taylor", + "id": "1315606682" + }, + "message": "how did it turn out? Sounds nummy!\n", + "created_time": "2010-03-06T21:10:30+0000" + }, + { + "id": "367501354973_12250973", + "from": { + "name": "Bret Taylor", + "id": "220439" + }, + "message": "Mom: turned out well. Sauce was good as well: pan sauce with mustard, balsamic, onion, and maple syrup. Surprisingly good in the end, and not too sweet, which was my concern. ", + "created_time": "2010-03-06T21:44:53+0000" + }, + { + "id": "367501354973_12251276", + "from": { + "name": "Sheila Taylor", + "id": "1315606682" + }, + "message": "Sounds delicious! I probably would have skipped the maple syrup, but I am not married to a Canadian :)\n\nSheila Taylor\n(925) 818-7795\nP.O. Box 938\nGlen Ellen, CA 95442\nwww.winecountrytrekking.com", + "created_time": "2010-03-06T21:55:12+0000" + }, + { + "id": "367501354973_12264435", + "from": { + "name": "Amelia Ann Arapoff", + "id": "1580390378" + }, + "message": "Bacon is always in our refrigerator, in case of need, somehow there is always need.", + "created_time": "2010-03-07T05:11:52+0000" + } + ], + "paging": { + "previous": "https://graph.facebook.com/367501354973/comments?access_token=2227470867%7C2.wNlupL2HPsOtrlYFBF56NA__.3600.1285354800-100001548997697%7C8lZ_pdgNDvSHYS4o1OkqhdQu6mA&limit=25&since=2010-03-07T05%3A11%3A52%2B0000", + "next": "https://graph.facebook.com/367501354973/comments?access_token=2227470867%7C2.wNlupL2HPsOtrlYFBF56NA__.3600.1285354800-100001548997697%7C8lZ_pdgNDvSHYS4o1OkqhdQu6mA&limit=25&until=2010-03-06T03%3A24%3A45%2B0000" + } + } +} \ No newline at end of file diff --git a/spec/fixtures/hcard_response b/spec/fixtures/hcard_response index d87957a93..bbd06c4bf 100644 --- a/spec/fixtures/hcard_response +++ b/spec/fixtures/hcard_response @@ -1,44 +1,44 @@ -
-

Alexander Hamiltom

-
-
-

User profile

-
-
Nickname
-
- Alexander Hamiltom -
-
-
-
Full name
-
- Alexander -
+
+

Alexander Hamiltom

+
+
+

User profile

+
+
Nickname
+
+ Alexander Hamiltom +
+
+
+
Full name
+
+ Alexander +
-
-
Full name
-
- Hamiltom -
+
+
Full name
+
+ Hamiltom +
-
-
Full name
-
- Alexander Hamiltom -
-
-
-
URL
-
- http://tom.joindiaspora.com/ -
-
-
-
Note
-
Diaspora is awesome! vi is better than emacs!
-
-
-
+
+
Full name
+
+ Alexander Hamiltom +
+
+
+
URL
+
+ http://tom.joindiaspora.com/ +
+
+
+
Note
+
Diaspora is awesome! vi is better than emacs!
+
+
+
-
+
diff --git a/spec/fixtures/host_xrd b/spec/fixtures/host_xrd index dcb67d767..8118fa94a 100644 --- a/spec/fixtures/host_xrd +++ b/spec/fixtures/host_xrd @@ -1,6 +1,6 @@ - Resource Descriptor diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 4b89c7b31..459563cff 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -2,18 +2,14 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require 'spec_helper' - -require File.dirname(__FILE__) + '/../spec_helper' - -include ApplicationHelper describe ApplicationHelper do before do @user = Factory.create(:user) @person = Factory.create(:person) end - it "should provide a correct show path for a given person" do person_url(@person).should == "/people/#{@person.id}" end diff --git a/spec/helpers/publics_helper_spec.rb b/spec/helpers/publics_helper_spec.rb index 70e9d4606..bc6a5021b 100644 --- a/spec/helpers/publics_helper_spec.rb +++ b/spec/helpers/publics_helper_spec.rb @@ -2,11 +2,8 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require 'spec_helper' - -require File.dirname(__FILE__) + '/../spec_helper' - -include PublicsHelper describe PublicsHelper do before do @user = Factory.create(:user) diff --git a/spec/helpers/requests_helper_spec.rb b/spec/helpers/requests_helper_spec.rb index 2d2be1acb..bf99f89d1 100644 --- a/spec/helpers/requests_helper_spec.rb +++ b/spec/helpers/requests_helper_spec.rb @@ -2,16 +2,11 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' - -include RequestsHelper +require 'spec_helper' describe RequestsHelper do before do - stub_success("tom@tom.joindiaspora.com") stub_success("evan@status.net") @tom = Redfinger.finger('tom@tom.joindiaspora.com') @@ -24,4 +19,16 @@ describe RequestsHelper do subscription_mode(@evan).should == :none end end + + describe "#relationship_flow" do + let(:tom){ Factory(:user, :email => 'tom@tom.joindiaspora.com') } + + before do + stub!(:current_user).and_return(tom) + end + + it 'should return the correct tag and url for a given address' do + relationship_flow('tom@tom.joindiaspora.com')[:friend].receive_url.should include("receive/user") + end + end end diff --git a/spec/lib/diaspora_parser_spec.rb b/spec/lib/diaspora_parser_spec.rb index cdd1063ab..d5722fd65 100644 --- a/spec/lib/diaspora_parser_spec.rb +++ b/spec/lib/diaspora_parser_spec.rb @@ -2,20 +2,15 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' - -include ApplicationHelper -include Diaspora::Parser - - +require 'spec_helper' describe Diaspora::Parser do before do @user = Factory.create(:user, :email => "bob@aol.com") @aspect = @user.aspect(:name => 'spies') - @person = Factory.create(:person_with_private_key, :diaspora_handle => "bill@gates.com") + + @user3 = Factory.create :user + @person = @user3.person @user2 = Factory.create(:user) end @@ -71,12 +66,13 @@ describe Diaspora::Parser do original_person_id = @person.id xml = request.to_diaspora_xml + @user3.destroy @person.destroy Person.all.count.should == person_count -1 @user.receive xml Person.all.count.should == person_count - Person.first(:_id => original_person_id).serialized_key.include?("PUBLIC").should be true + Person.first(:_id => original_person_id).serialized_public_key.include?("PUBLIC").should be true url = "http://" + request.callback_url.split("/")[2] + "/" Person.where(:url => url).first.id.should == original_person_id end @@ -88,14 +84,13 @@ describe Diaspora::Parser do original_person_id = @user2.person.id xml = request.to_diaspora_xml - Person.all.count.should be person_count @user.receive xml Person.all.count.should be person_count @user2.reload @user2.person.reload - @user2.person.serialized_key.include?("PRIVATE").should be true + @user2.serialized_private_key.include?("PRIVATE").should be true url = "http://" + request.callback_url.split("/")[2] + "/" Person.where(:url => url).first.id.should == original_person_id @@ -103,7 +98,7 @@ describe Diaspora::Parser do it "should activate the Person if I initiated a request to that url" do request = @user.send_friend_request_to( @user2.person, @aspect) - + @user.reload request.reverse_for @user2 xml = request.to_diaspora_xml @@ -121,10 +116,10 @@ describe Diaspora::Parser do @user.friends.include?(new_person).should be true end - it 'should process retraction for a person' do person_count = Person.all.count request = @user.send_friend_request_to( @user2.person, @aspect) + @user.reload request.reverse_for @user2 xml = request.to_diaspora_xml @@ -139,7 +134,6 @@ describe Diaspora::Parser do aspect_people_count = @aspect.people.size #They are now friends - Person.count.should == person_count @user.receive retraction_xml diff --git a/spec/lib/hcard_spec.rb b/spec/lib/hcard_spec.rb index 89ad49924..45d7157b9 100644 --- a/spec/lib/hcard_spec.rb +++ b/spec/lib/hcard_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' require File.dirname(__FILE__) + '/../../lib/hcard' describe HCard do diff --git a/spec/lib/message_handler_spec.rb b/spec/lib/message_handler_spec.rb index 00db2a1b8..ddc822334 100644 --- a/spec/lib/message_handler_spec.rb +++ b/spec/lib/message_handler_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe MessageHandler do before do @@ -41,8 +39,7 @@ describe MessageHandler do } end - - it 'should only retry a bad request three times ' do + it 'should only retry a bad request the correct number of times' do request = FakeHttpRequest.new(:failure) request.should_receive(:get).exactly(MessageHandler::NUM_TRIES).times.and_return(request) EventMachine::HttpRequest.stub!(:new).and_return(request) @@ -61,7 +58,6 @@ describe MessageHandler do describe 'POST messages' do - it 'should be able to add a post message to the queue' do EventMachine.run { @handler.size.should ==0 @@ -98,6 +94,26 @@ describe MessageHandler do end end + describe "Hub publish" do + it 'should correctly queue up a pubsubhubbub publish request' do + destination = "http://identi.ca/hub/" + feed_location = "http://google.com/" + + EventMachine.run { + @handler.add_hub_notification(destination, feed_location) + q = @handler.instance_variable_get(:@queue) + + message = "" + q.pop{|m| message = m} + + message.destination.should == destination + message.body.should == feed_location + + EventMachine.stop + } + end + end + describe "Mixed Queries" do it 'should process both POST and GET requests in the same queue' do @@ -123,7 +139,6 @@ describe MessageHandler do request = FakeHttpRequest.new(:success) request.should_receive(:get).exactly(1).times.and_return(request) request.should_receive(:post).exactly(1).times.and_return(request) - @handler.should_receive(:send_to_seed).once EventMachine::HttpRequest.stub!(:new).and_return(request) diff --git a/spec/lib/ostatus_builder_spec.rb b/spec/lib/ostatus_builder_spec.rb new file mode 100644 index 000000000..042bf202b --- /dev/null +++ b/spec/lib/ostatus_builder_spec.rb @@ -0,0 +1,25 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + +require 'spec_helper' +require File.dirname(__FILE__) + '/../../lib/diaspora/ostatus_builder' + +describe Diaspora::OstatusBuilder do + + let!(:user) { Factory(:user) } + let(:aspect) { user.aspect(:name => "Public People") } + let!(:status_message1) { user.post(:status_message, :message => "One", :public => true, :to => aspect.id) } + let!(:status_message2) { user.post(:status_message, :message => "Two", :public => true, :to => aspect.id) } + let!(:status_message3) { user.post(:status_message, :message => "Three", :public => false, :to => aspect.id) } + + let!(:atom) { director = Diaspora::Director.new; director.build(Diaspora::OstatusBuilder.new(user)) } + + it 'should include a users posts' do + atom.should include status_message1.message + atom.should include status_message2.message + atom.should_not include status_message3.message + end + +end + diff --git a/spec/lib/salmon_salmon_spec.rb b/spec/lib/salmon_salmon_spec.rb index a14ef8f77..40f928c18 100644 --- a/spec/lib/salmon_salmon_spec.rb +++ b/spec/lib/salmon_salmon_spec.rb @@ -2,58 +2,100 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Salmon do - before do + let(:user){Factory.create :user} + let(:user2) {Factory.create :user} + let(:user3) {Factory.create :user} + let(:post){ user.post :status_message, :message => "hi", :to => user.aspect(:name => "sdg").id } - @user = Factory.create :user - @post = @user.post :status_message, :message => "hi", :to => @user.aspect(:name => "sdg").id - @sent_salmon = Salmon::SalmonSlap.create(@user, @post.to_diaspora_xml) - @parsed_salmon = Salmon::SalmonSlap.parse @sent_salmon.to_xml - stub_success("tom@tom.joindiaspora.com") + let!(:created_salmon) {Salmon::SalmonSlap.create(user, post.to_diaspora_xml)} + + describe '#create' do + + it 'has data in the magic envelope' do + created_salmon.magic_sig.data.should_not be nil + end + + it 'has no parsed_data' do + created_salmon.parsed_data.should be nil + end + + it 'sets aes and iv key' do + created_salmon.aes_key.should_not be nil + created_salmon.iv.should_not be nil + end + + it 'makes the data in the signature encrypted with that key' do + key_hash = {'key' => created_salmon.aes_key, 'iv' => created_salmon.iv} + decoded_string = Salmon::SalmonSlap.decode64url(created_salmon.magic_sig.data) + user.aes_decrypt(decoded_string, key_hash).should == post.to_diaspora_xml + end end - it 'should verify the signature on a roundtrip' do + describe '#xml_for' do + let(:xml) {created_salmon.xml_for user2.person} - @sent_salmon.magic_sig.data.should == @parsed_salmon.magic_sig.data + it 'has a encrypted header field' do + xml.include?("encrypted_header").should be true + end - @sent_salmon.magic_sig.sig.should == @parsed_salmon.magic_sig.sig - @sent_salmon.magic_sig.signable_string.should == @parsed_salmon.magic_sig.signable_string - - - @parsed_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(@user.exported_key)).should be true - @sent_salmon.verified_for_key?(OpenSSL::PKey::RSA.new(@user.exported_key)).should be true + it 'the encrypted_header field should contain the aes key' do + doc = Nokogiri::XML(xml) + decrypted_header = user2.decrypt(doc.search('encrypted_header').text) + decrypted_header.include?(created_salmon.aes_key).should be true + end end - it 'should return the data so it can be "received"' do + context 'marshaling' do + let(:xml) {created_salmon.xml_for user2.person} + let(:parsed_salmon) { Salmon::SalmonSlap.parse(xml, user2)} - xml = @post.to_diaspora_xml + it 'should parse out the aes key' do + parsed_salmon.aes_key.should == created_salmon.aes_key + end - @parsed_salmon.data.should == xml - end + it 'should parse out the iv' do + parsed_salmon.iv.should == created_salmon.iv + end + it 'should parse out the authors diaspora_handle' do + parsed_salmon.author_email.should == user.person.diaspora_handle - it 'should parse out the authors diaspora_handle' do - @parsed_salmon.author_email.should == @user.person.diaspora_handle + end + + describe '#author' do + before do + stub_success("tom@tom.joindiaspora.com") + end + + it 'should reference a local author' do + parsed_salmon.author.should == user.person + end + + it 'should reference a remote author' do + parsed_salmon.author_email = 'tom@tom.joindiaspora.com' + parsed_salmon.author.public_key.should_not be_nil + end + + it 'should fail to reference a nonexistent remote author' do + parsed_salmon.author_email = 'idsfug@difgubhpsduh.rgd' + proc { + Redfinger.stub(:finger).and_return(nil) #Redfinger returns nil when there is no profile + parsed_salmon.author.real_name}.should raise_error /No webfinger profile found/ + end + end + + it 'verifies the signature for the sender' do + parsed_salmon.verified_for_key?(user.public_key).should be true + end + + it 'contains the original data' do + parsed_salmon.parsed_data.should == post.to_diaspora_xml + end end - it 'should reference a local author' do - @parsed_salmon.author.should == @user.person - end - it 'should reference a remote author' do - @parsed_salmon.author_email = 'tom@tom.joindiaspora.com' - @parsed_salmon.author.public_key.should_not be_nil - end - - it 'should fail to reference a nonexistent remote author' do - @parsed_salmon.author_email = 'idsfug@difgubhpsduh.rgd' - proc { - Redfinger.stub(:finger).and_return(nil) #Redfinger returns nil when there is no profile - @parsed_salmon.author.real_name}.should raise_error /No webfinger profile found/ - end end diff --git a/spec/lib/web_hooks_spec.rb b/spec/lib/web_hooks_spec.rb index d3486f1b5..e316817d4 100644 --- a/spec/lib/web_hooks_spec.rb +++ b/spec/lib/web_hooks_spec.rb @@ -2,32 +2,25 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. +require 'spec_helper' +describe Diaspora::Webhooks do + before do + @user = Factory.create(:user) + @aspect = @user.aspect(:name => "losers") + @user2 = Factory.create(:user) + @aspect2 = @user2.aspect(:name => "losers") + friend_users(@user, @aspect, @user2, @aspect2) + end -require File.dirname(__FILE__) + '/../spec_helper' - -include Diaspora - -describe Diaspora do - - describe Webhooks do + describe "body" do before do - @user = Factory.create(:user) - @aspect = @user.aspect(:name => "losers") - @user2 = Factory.create(:user) - @aspect2 = @user2.aspect(:name => "losers") - friend_users(@user, @aspect, @user2, @aspect2) + @post = Factory.build(:status_message, :person => @user.person) end - describe "body" do - before do - @post = Factory.build(:status_message, :person => @user.person) - end - - it "should add the following methods to Post on inclusion" do - @post.respond_to?(:to_diaspora_xml).should be true - end - + it "should add the following methods to Post on inclusion" do + @post.respond_to?(:to_diaspora_xml).should be true end + end end diff --git a/spec/lib/websocket_spec.rb b/spec/lib/websocket_spec.rb index 018f5020d..0b76e0f52 100644 --- a/spec/lib/websocket_spec.rb +++ b/spec/lib/websocket_spec.rb @@ -2,7 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Diaspora::WebSocket do before do @@ -19,18 +19,18 @@ describe Diaspora::WebSocket do describe 'queuing and dequeuing ' do before do - @post.socket_to_uid(@user.id, :aspect_ids => @aspect.id) @channel = Magent::GenericChannel.new('websocket') + @messages = @channel.message_count + @post.socket_to_uid(@user.id, :aspect_ids => @aspect.id) end it 'should send the queued job to Magent' do - @channel.message_count.should == 1 + @channel.message_count.should == @messages + 1 end it 'should dequeue the job successfully' do - messages = @channel.message_count @channel.dequeue - @channel.message_count.should == messages -1 + @channel.message_count.should == @messages end end diff --git a/spec/misc_spec.rb b/spec/misc_spec.rb index 14f1d4c3e..c4b2cc67c 100644 --- a/spec/misc_spec.rb +++ b/spec/misc_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/spec_helper' +require 'spec_helper' describe 'making sure the spec runner works' do @@ -34,4 +32,25 @@ describe 'making sure the spec runner works' do end end + describe '#friend_users' do + before do + @user1 = Factory.create(:user) + @aspect1 = @user1.aspect(:name => "losers") + @user2 = Factory.create(:user) + @aspect2 = @user2.aspect(:name => "bruisers") + friend_users(@user1, @aspect1, @user2, @aspect2) + @user1.reload + @aspect1.reload + @user2.reload + @aspect2.reload + end + + it 'makes the first user friends with the second' do + @aspect1.people.include?(@user2.person).should be_true + end + + it 'makes the second user friends with the first' do + @aspect2.people.include?(@user1.person).should be_true + end + end end diff --git a/spec/models/aspect_spec.rb b/spec/models/aspect_spec.rb index 5931970cf..23453eee9 100644 --- a/spec/models/aspect_spec.rb +++ b/spec/models/aspect_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Aspect do before do @@ -20,7 +18,7 @@ describe Aspect do aspect.name.should == "losers" end - it 'should be able to have people' do + it 'should be creatable with people' do aspect = @user.aspect(:name => 'losers', :people => [@friend, @friend_2]) aspect.people.size.should == 2 end @@ -156,16 +154,16 @@ describe Aspect do @user.receive message.to_diaspora_xml @aspect.reload - @aspect.posts.count.should be 1 - @aspect3.posts.count.should be 0 + @aspect.posts.count.should == 1 + @aspect3.posts.count.should == 0 @user.reload @user.move_friend(:friend_id => @user2.person.id, :from => @aspect.id, :to => @aspect3.id) @aspect.reload @aspect3.reload - @aspect3.posts.count.should be 1 - @aspect.posts.count.should be 0 + @aspect3.posts.count.should == 1 + @aspect.posts.count.should == 0 end diff --git a/spec/models/comments_spec.rb b/spec/models/comments_spec.rb index 1c20354cf..732c4349b 100644 --- a/spec/models/comments_spec.rb +++ b/spec/models/comments_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Comment do describe "user" do diff --git a/spec/models/fb_status_spec.rb b/spec/models/fb_status_spec.rb new file mode 100644 index 000000000..2ab232fce --- /dev/null +++ b/spec/models/fb_status_spec.rb @@ -0,0 +1,43 @@ +# Copyright (c) 2010, Diaspora Inc. This file is +# licensed under the Affero General Public License version 3. See +# the COPYRIGHT file. + + + +require File.dirname(__FILE__) + '/../spec_helper' + +describe FbStatus do + + let(:fb_status) { Factory.create :fb_status } + + it 'is valid' do + fb_status.should be_valid + end + + describe '#from_api' do + let!(:json_string) {File.open(File.dirname(__FILE__) + '/../fixtures/fb_status').read} + let!(:json_object) { JSON.parse(json_string) } + let!(:status_from_json) {FbStatus.from_api(json_object)} + + it 'has graph_id' do + status_from_json.graph_id.should == json_object['id'] + end + + it 'has author_id' do + status_from_json.author_id.should == json_object['from']['id'] + end + + it 'has author_name' do + status_from_json.author_name.should == json_object['from']['name'] + end + + it 'has message' do + status_from_json.message.should == json_object['message'] + end + + it 'has author_name' do + status_from_json.updated_time.should == Time.parse(json_object['updated_time']) + end + end + +end diff --git a/spec/models/person_spec.rb b/spec/models/person_spec.rb index bffe37f85..6df3ddc1c 100644 --- a/spec/models/person_spec.rb +++ b/spec/models/person_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Person do before do @@ -15,6 +13,20 @@ describe Person do @aspect2 = @user2.aspect(:name => "Abscence of Babes") end + describe '#diaspora_handle' do + context 'local people' do + it 'uses the pod config url to set the diaspora_handle' do + @user.person.diaspora_handle.should == @user.username + "@" + APP_CONFIG[:terse_pod_url] + end + end + + context 'remote people' do + it 'stores the diaspora_handle in the database' do + @person.diaspora_handle.include?(APP_CONFIG[:terse_pod_url]).should be false + end + end + end + it 'should not allow two people with the same diaspora_handle' do person_two = Factory.build(:person, :url => @person.diaspora_handle) person_two.valid?.should == false @@ -134,13 +146,13 @@ describe Person do people.include?(@friend_three).should == false people.include?(@friend_four).should == false - people = Person.search("Wei") + people = Person.search("wEi") people.include?(@friend_two).should == true people.include?(@friend_one).should == false people.include?(@friend_three).should == false people.include?(@friend_four).should == false - people = Person.search("Gri") + people = Person.search("gri") people.include?(@friend_one).should == true people.include?(@friend_four).should == true people.include?(@friend_two).should == false @@ -148,13 +160,11 @@ describe Person do end it 'should search by diaspora_handle exactly' do - stub_success("tom@tom.joindiaspora.com") Person.by_webfinger(@friend_one.diaspora_handle).should == @friend_one end it 'should create a stub for a remote user' do - stub_success("tom@tom.joindiaspora.com") tom = Person.by_webfinger('tom@tom.joindiaspora.com') tom.real_name.include?("Hamiltom").should be true diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb index 516c16df8..f3f77f3db 100644 --- a/spec/models/photo_spec.rb +++ b/spec/models/photo_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Photo do before do @@ -16,7 +14,6 @@ describe Photo do @fixture_name = File.dirname(__FILE__) + '/../fixtures/button.png' @fail_fixture_name = File.dirname(__FILE__) + '/../fixtures/msg.xml' - @photo = Photo.new(:person => @user.person, :album => @album) end @@ -31,8 +28,13 @@ describe Photo do it 'should save a photo' do @photo.image.store! File.open(@fixture_name) @photo.save.should == true - binary = @photo.image.read - fixture_binary = File.open(@fixture_name).read + begin + binary = @photo.image.read.force_encoding('BINARY') + fixture_binary = File.open(@fixture_name).read.force_encoding('BINARY') + rescue NoMethodError # Ruby 1.8 doesn't have force_encoding + binary = @photo.image.read + fixture_binary = File.open(@fixture_name).read + end binary.should == fixture_binary end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index dc9d4a9b8..b0ed59b7d 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Post do before do diff --git a/spec/models/profile_spec.rb b/spec/models/profile_spec.rb index b5bd8f9a5..2e38c20ae 100644 --- a/spec/models/profile_spec.rb +++ b/spec/models/profile_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Profile do before do @@ -29,4 +27,3 @@ describe Profile do end end - diff --git a/spec/models/request_spec.rb b/spec/models/request_spec.rb index 5899cb7fb..c8fb8af05 100644 --- a/spec/models/request_spec.rb +++ b/spec/models/request_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Request do before do @@ -19,7 +17,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 diff --git a/spec/models/retraction_spec.rb b/spec/models/retraction_spec.rb index 9aa2b8a76..777855234 100644 --- a/spec/models/retraction_spec.rb +++ b/spec/models/retraction_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe Retraction do before do diff --git a/spec/models/status_message_spec.rb b/spec/models/status_message_spec.rb index 005038bf1..d7dbf19e4 100644 --- a/spec/models/status_message_spec.rb +++ b/spec/models/status_message_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe StatusMessage do before do @@ -37,6 +35,5 @@ describe StatusMessage do end end - end diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb index b1f6f71a8..518c03d2d 100644 --- a/spec/models/user/posting_spec.rb +++ b/spec/models/user/posting_spec.rb @@ -2,66 +2,90 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' describe User do - before do - @user = Factory.create :user - @aspect = @user.aspect(:name => 'heroes') - @aspect1 = @user.aspect(:name => 'heroes') - @user2 = Factory.create(:user) - @aspect2 = @user2.aspect(:name => 'losers') + let!(:user) { Factory(:user) } + let!(:aspect) { user.aspect(:name => 'heroes') } + let!(:aspect1) { user.aspect(:name => 'other') } - @user3 = Factory.create(:user) - @aspect3 = @user3.aspect(:name => 'heroes') + let!(:user2) { Factory(:user) } + let!(:aspect2) { user2.aspect(:name => 'losers') } - @user4 = Factory.create(:user) - @aspect4 = @user4.aspect(:name => 'heroes') + describe '#validate_aspect_permissions' do + it 'requires an aspect' do + proc { + user.validate_aspect_permissions([]) + }.should raise_error /You must post to someone/ + end - friend_users(@user, @aspect, @user2, @aspect2) - friend_users(@user, @aspect, @user3, @aspect3) - friend_users(@user, @aspect1, @user4, @aspect4) - end + it "won't let you post to someone else's aspect" do + proc { + user.validate_aspect_permissions(aspect2.id) + }.should raise_error /Cannot post to an aspect you do not own./ + end - it 'should not be able to post without a aspect' do - proc {@user.post(:status_message, :message => "heyheyhey")}.should raise_error /You must post to someone/ + it "lets you post to your own aspects" do + user.validate_aspect_permissions(aspect.id).should be_true + user.validate_aspect_permissions(aspect1.id).should be_true + end end - it 'should put the post in the aspect post array' do - post = @user.post(:status_message, :message => "hey", :to => @aspect.id) - @aspect.reload - @aspect.post_ids.include?(post.id).should be true + describe '#post' do + it 'should put the post in the aspect post array' do + post = user.post(:status_message, :message => "hey", :to => aspect.id) + aspect.reload + aspect.posts.should include post + end + + it 'should put an album in the aspect post array' do + album = user.post :album, :name => "Georges", :to => aspect.id + aspect.reload + aspect.posts.should include album + end end - it 'should put an album in the aspect post array' do - album = @user.post :album, :name => "Georges", :to => @aspect.id - @aspect.reload - @aspect.post_ids.include?(album.id).should be true - @aspect.posts.include?(album).should be true + describe '#update_post' do + it 'should update fields' do + album = user.post(:album, :name => "Profile Photos", :to => aspect.id) + update_hash = {:name => "Other Photos"} + user.update_post(album, update_hash) + album.name.should == "Other Photos" + end end - describe 'dispatching' do + context 'dispatching' do + let!(:user3) { Factory(:user) } + let!(:aspect3) { user3.aspect(:name => 'heroes') } + let!(:user4) { Factory(:user) } + let!(:aspect4) { user4.aspect(:name => 'heroes') } + + let!(:post) { user.build_post :status_message, :message => "hey" } + before do - @post = @user.build_post :status_message, :message => "hey" - end - it 'should push a post to a aspect' do - @user.should_receive(:salmon).twice - @user.push_to_aspects(@post, @aspect.id) + friend_users(user, aspect, user2, aspect2) + friend_users(user, aspect, user3, aspect3) + friend_users(user, aspect1, user4, aspect4) end - it 'should push a post to all aspects' do - @user.should_receive(:salmon).exactly(3).times - @user.push_to_aspects(@post, :all) + describe '#push_to_aspects' do + it 'should push a post to a aspect' do + user.should_receive(:push_to_person).twice + user.push_to_aspects(post, aspect.id) + end + + it 'should push a post to all aspects' do + user.should_receive(:push_to_person).exactly(3).times + user.push_to_aspects(post, :all) + end end - it 'should push to people' do - @user.should_receive(:salmon).twice - @user.push_to_people(@post, [@user2.person, @user3.person]) + describe '#push_to_people' do + it 'should push to people' do + user.should_receive(:push_to_person).twice + user.push_to_people(post, [user2.person, user3.person]) + end end - - end end diff --git a/spec/models/user/receive_spec.rb b/spec/models/user/receive_spec.rb index 37648a98c..fce699cf6 100644 --- a/spec/models/user/receive_spec.rb +++ b/spec/models/user/receive_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' describe User do @@ -175,11 +173,11 @@ describe User do describe 'salmon' do before do @post = @user.post :status_message, :message => "hello", :to => @aspect.id - @salmon = @user.salmon( @post, :to => @user2.person ) + @salmon = @user.salmon( @post ) end it 'should receive a salmon for a post' do - @user2.receive_salmon( @user2.person.encrypt(@salmon.to_xml) ) + @user2.receive_salmon( @salmon.xml_for @user2.person ) @user2.visible_post_ids.include?(@post.id).should be true end end diff --git a/spec/models/user/user_friending_spec.rb b/spec/models/user/user_friending_spec.rb index bef8fa416..4ea51ad19 100644 --- a/spec/models/user/user_friending_spec.rb +++ b/spec/models/user/user_friending_spec.rb @@ -2,9 +2,7 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' describe User do before do @@ -24,7 +22,6 @@ describe User do aspect.requests.size.should == 1 end - it "should be able to accept a pending friend request" do friend = Factory.create(:person) r = Request.instantiate(:to => @user.receive_url, :from => friend) @@ -53,12 +50,9 @@ describe User do @user.friends << friend @user.save - proc {@user.send_friend_request_to( friend, @aspect)}.should raise_error end - - describe 'multiple users accepting/rejecting the same person' do before do @person_one = Factory.create :person @@ -144,7 +138,6 @@ describe User do Person.all.count.should be 3 end - end describe 'a user accepting rejecting multiple people' do @@ -189,16 +182,14 @@ describe User do @user2 = Factory.create :user @aspect2 = @user2.aspect(:name => "Gross people") - request = @user.send_friend_request_to( @user2, @aspect) - request.reverse_for @user2 - @user2.activate_friend(@user.person, @aspect2) - @user.receive request.to_diaspora_xml + friend_users(@user, @aspect, @user2, @aspect2) + @user.reload + @user2.reload + @aspect.reload + @aspect2.reload end it 'should unfriend the other user on the same seed' do - @user.reload - @user2.reload - @user.friends.count.should == 1 @user2.friends.count.should == 1 @@ -212,8 +203,26 @@ describe User do @aspect.people.count.should == 0 @aspect2.people.count.should == 0 end + context 'with a post' do + before do + @message = @user.post(:status_message, :message => "hi", :to => @aspect.id) + @user2.receive @message.to_diaspora_xml.to_s + @user2.unfriend @user.person + @user.unfriended_by @user2.person + @aspect.reload + @aspect2.reload + @user.reload + @user2.reload + end + it "deletes the unfriended user's posts from visible_posts" do + @user.raw_visible_posts.include?(@message.id).should be_false + end + it "deletes the unfriended user's posts from the aspect's posts" do + pending "We need to implement this" + @aspect2.posts.include?(@message).should be_false + end + end end - end end diff --git a/spec/models/user/visible_posts_spec.rb b/spec/models/user/visible_posts_spec.rb index ffb220531..040fcd1bc 100644 --- a/spec/models/user/visible_posts_spec.rb +++ b/spec/models/user/visible_posts_spec.rb @@ -2,75 +2,91 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../../spec_helper' +require 'spec_helper' describe User do - before do - @user = Factory.create(:user) - @aspect = @user.aspect(:name => 'heroes') - @aspect2 = @user.aspect(:name => 'losers') + let!(:user) { Factory(:user_with_aspect) } + let!(:first_aspect) { user.aspects.first } + let!(:second_aspect) { user.aspect(:name => 'losers') } - @user2 = Factory.create :user - @user2_aspect = @user2.aspect(:name => 'dudes') + let!(:user2) { Factory(:user_with_aspect) } - friend_users(@user, @aspect, @user2, @user2_aspect) + let!(:status_message1) { user2.post :status_message, :message => "hi", :to => user2.aspects.first.id } + let!(:status_message2) { user2.post :status_message, :message => "hey", :public => true , :to => user2.aspects.first.id } + let!(:status_message3) { user2.post :status_message, :message => "va", :to => user2.aspects.first.id } + let!(:status_message4) { user2.post :status_message, :message => "da", :public => true , :to => user2.aspects.first.id } - @user3 = Factory.create :user - @user3_aspect = @user3.aspect(:name => 'dudes') - friend_users(@user, @aspect2, @user3, @user3_aspect) - @user4 = Factory.create :user - @user4_aspect = @user4.aspect(:name => 'dudes') - friend_users(@user, @aspect2, @user4, @user4_aspect) - end + before do + friend_users(user, first_aspect, user2, user2.aspects.first) + end - it 'should generate a valid stream for a aspect of people' do - status_message1 = @user2.post :status_message, :message => "hi", :to => @user2_aspect.id - status_message2 = @user3.post :status_message, :message => "heyyyy", :to => @user3_aspect.id - status_message3 = @user4.post :status_message, :message => "yooo", :to => @user4_aspect.id - - @user.receive status_message1.to_diaspora_xml - @user.receive status_message2.to_diaspora_xml - @user.receive status_message3.to_diaspora_xml - @user.reload - - @user.visible_posts(:by_members_of => @aspect).include?(status_message1).should be true - @user.visible_posts(:by_members_of => @aspect).include?(status_message2).should be false - @user.visible_posts(:by_members_of => @aspect).include?(status_message3).should be false - - @user.visible_posts(:by_members_of => @aspect2).include?(status_message1).should be false - @user.visible_posts(:by_members_of => @aspect2).include?(status_message2).should be true - @user.visible_posts(:by_members_of => @aspect2).include?(status_message3).should be true + describe "#visible_posts" do + it "queries by person id" do + user2.visible_posts(:person_id => user2.person.id).include?(status_message1).should == true + user2.visible_posts(:person_id => user2.person.id).include?(status_message2).should == true + user2.visible_posts(:person_id => user2.person.id).include?(status_message3).should == true + user2.visible_posts(:person_id => user2.person.id).include?(status_message4).should == true end - describe 'albums' do - before do - @album = @user.post :album, :name => "Georges", :to => @aspect.id - @aspect.reload - @aspect2.reload - @user.reload + it "selects public posts" do + user2.visible_posts(:public => true).include?(status_message2).should == true + user2.visible_posts(:public => true).include?(status_message4).should == true + end - @album2 = @user.post :album, :name => "Borges", :to => @aspect.id - @aspect.reload - @aspect2.reload - @user.reload + it "selects non public posts" do + user2.visible_posts(:public => false).include?(status_message1).should == true + user2.visible_posts(:public => false).include?(status_message3).should == true + end - @user.post :album, :name => "Luises", :to => @aspect2.id - @aspect.reload - @aspect2.reload - @user.reload - end + it "selects by message contents" do + user2.visible_posts(:message => "hi").include?(status_message1).should == true + end - it 'should find all albums if passed :all' do - @user.albums_by_aspect(:all).size.should == 3 - end + it "queries by aspect" do + user3 = Factory(:user_with_aspect) + status_message2 = user3.post :status_message, :message => "heyyyy", :to => user3.aspects.first.id + user4 = Factory(:user_with_aspect) + status_message3 = user4.post :status_message, :message => "yooo", :to => user4.aspects.first.id - it 'should return the right number of albums' do - @user.albums_by_aspect(@aspect).size.should == 2 - @user.albums_by_aspect(@aspect2).size.should == 1 + friend_users(user, second_aspect, user3, user3.aspects.first) + friend_users(user, second_aspect, user4, user4.aspects.first) + + user.receive status_message1.to_diaspora_xml + user.receive status_message2.to_diaspora_xml + user.receive status_message3.to_diaspora_xml + + user.visible_posts(:by_members_of => first_aspect).should =~ [status_message1] + user.visible_posts(:by_members_of => second_aspect).should =~ [status_message2, status_message3] + end + end + + context 'querying' do + describe '#find_visible_post_by_id' do + it 'should query' do + user2.find_visible_post_by_id(status_message1.id).should == status_message1 + user.find_visible_post_by_id(status_message1.id).should == nil end end + end + + context 'albums' do + + before do + user.post :album, :name => "Georges", :to => first_aspect.id + user.post :album, :name => "Borges", :to => first_aspect.id + user.post :album, :name => "Luises", :to => second_aspect.id + user.reload + end + + it 'should find all albums if passed :all' do + user.albums_by_aspect(:all).should have(3).albums + end + + it 'should return the right number of albums' do + user.albums_by_aspect(first_aspect.reload).should have(2).albums + user.albums_by_aspect(second_aspect.reload).should have(1).album + end + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 223881671..d21b1d57c 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2,60 +2,57 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/../spec_helper' +require 'spec_helper' describe User do - before 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 + let(:user) { Factory(:user) } - describe 'profiles' do - it 'should be able to update their profile and send it to their friends' do - Factory.create(:person) + describe "validations" do + it "downcases the username" do + user = Factory.build(:user, :username => "ALLUPPERCASE") + user.valid? + user.username.should == "alluppercase" - updated_profile = {:profile => {:first_name => 'bob', :last_name => 'billytown', :image_url => "http://clown.com"}} - - @user.update_profile(updated_profile).should == true - @user.profile.image_url.should == "http://clown.com" + user = Factory.build(:user, :username => "someUPPERCASE") + user.valid? + user.username.should == "someuppercase" end end - describe 'aspects' do - it 'should delete an empty aspect' do - @user.aspects.include?(@aspect).should == true - @user.drop_aspect(@aspect) - @user.reload + describe '#diaspora_handle' do + it 'uses the pod config url to set the diaspora_handle' do + user.diaspora_handle.should == user.username + "@" + APP_CONFIG[:terse_pod_url] + end + end - @user.aspects.include?(@aspect).should == false + context 'profiles' do + it 'should be able to update their profile and send it to their friends' do + updated_profile = { :profile => { + :first_name => 'bob', + :last_name => 'billytown', + :image_url => "http://clown.com"} } + + user.update_profile(updated_profile).should be true + user.profile.image_url.should == "http://clown.com" + end + end + + context 'aspects' do + let(:aspect) { user.aspect(:name => 'heroes') } + let(:user2) { Factory(:user) } + let(:aspect2) { user2.aspect(:name => 'stuff') } + + it 'should delete an empty aspect' do + user.drop_aspect(aspect) + user.aspects.include?(aspect).should == false end it 'should not delete an aspect with friends' do - user2 = Factory.create(:user) - aspect2 = user2.aspect(:name => 'stuff') - user2.reload - aspect2.reload - - friend_users(@user, Aspect.find_by_id(@aspect.id), user2, Aspect.find_by_id(aspect2.id)) - @aspect.reload - - @user.aspects.include?(@aspect).should == true - - proc{@user.drop_aspect(@aspect)}.should raise_error /Aspect not empty/ - - @user.reload - @user.aspects.include?(@aspect).should == true + friend_users(user, Aspect.find_by_id(aspect.id), user2, Aspect.find_by_id(aspect2.id)) + aspect.reload + proc{user.drop_aspect(aspect)}.should raise_error /Aspect not empty/ + user.aspects.include?(aspect).should == true end end + end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 3fdac9810..4149200d8 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -2,8 +2,6 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - # This file is copied to ~/spec when you run 'ruby script/generate rspec' # from the project root directory. @@ -16,8 +14,6 @@ require 'webmock/rspec' include Devise::TestHelpers include WebMock - - # Requires supporting files with custom matchers and macros, etc, # in ./support/ and its subdirectories. Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f} @@ -45,6 +41,9 @@ RSpec.configure do |config| DatabaseCleaner.clean end end + +ImageUploader.enable_processing = false + def stub_sockets Diaspora::WebSocket.stub!(:queue_to_user).and_return(true) Diaspora::WebSocket.stub!(:subscribe).and_return(true) @@ -82,7 +81,12 @@ end def friend_users(user1, aspect1, user2, aspect2) request = user1.send_friend_request_to(user2.person, aspect1) reversed_request = user2.accept_friend_request( request.id, aspect2.id) + user1.reload user1.receive reversed_request.to_diaspora_xml + user1.reload + aspect1.reload + user2.reload + aspect2.reload end def stub_success(address = 'abc@example.com') diff --git a/spec/user_encryption_spec.rb b/spec/user_encryption_spec.rb index 33b86d52c..a7fd8c548 100644 --- a/spec/user_encryption_spec.rb +++ b/spec/user_encryption_spec.rb @@ -2,27 +2,16 @@ # licensed under the Affero General Public License version 3. See # the COPYRIGHT file. - - -require File.dirname(__FILE__) + '/spec_helper' -include ApplicationHelper -include Diaspora::Parser +require 'spec_helper' describe 'user encryption' do before do unstub_mocha_stubs @user = Factory.create(:user) @aspect = @user.aspect(:name => 'dudes') - @person = Factory.create(:person_with_private_key, - :profile => Profile.new(:first_name => 'Remote', - :last_name => 'Friend'), - :diaspora_handle => 'somewhere@else.com', - :url => 'http://distant-example.com/') - @person2 = Factory.create(:person_with_private_key, - :profile => Profile.new(:first_name => 'Second', - :last_name => 'Friend'), - :diaspora_handle => 'elsewhere@else.com', - :url => 'http://distanter-example.com/') + + @user2 = Factory.create(:user) + @aspect2 = @user2.aspect(:name => 'dudes') end after do @@ -78,7 +67,10 @@ describe 'user encryption' do describe 'comments' do before do - @remote_message = Factory.create(:status_message, :person => @person) + friend_users(@user, @aspect, @user2, @aspect2) + @remote_message = @user2.post :status_message, :message => "hello", :to => @aspect2.id + + @message = @user.post :status_message, :message => "hi", :to => @aspect.id end it 'should attach the creator signature if the user is commenting' do @@ -94,24 +86,24 @@ describe 'user encryption' do end it 'should verify a comment made on a remote post by a different friend' do - comment = Comment.new(:person => @person2, :text => "balls", :post => @remote_message) - comment.creator_signature = comment.send(:sign_with_key,@person2.encryption_key) + comment = Comment.new(:person => @user2.person, :text => "cats", :post => @remote_message) + comment.creator_signature = comment.send(:sign_with_key,@user2.encryption_key) comment.signature_valid?.should be true comment.verify_post_creator_signature.should be false - comment.post_creator_signature = comment.send(:sign_with_key,@person.encryption_key) + comment.post_creator_signature = comment.send(:sign_with_key,@user.encryption_key) comment.verify_post_creator_signature.should be true end it 'should reject comments on a remote post with only a creator sig' do - comment = Comment.new(:person => @person2, :text => "balls", :post => @remote_message) - comment.creator_signature = comment.send(:sign_with_key,@person2.encryption_key) + comment = Comment.new(:person => @user2.person, :text => "cats", :post => @remote_message) + comment.creator_signature = comment.send(:sign_with_key,@user2.encryption_key) comment.signature_valid?.should be true comment.verify_post_creator_signature.should be false end it 'should receive remote comments on a user post with a creator sig' do - comment = Comment.new(:person => @person2, :text => "balls", :post => @message) - comment.creator_signature = comment.send(:sign_with_key,@person2.encryption_key) + comment = Comment.new(:person => @user2.person, :text => "cats", :post => @message) + comment.creator_signature = comment.send(:sign_with_key,@user2.encryption_key) comment.signature_valid?.should be true comment.verify_post_creator_signature.should be false end diff --git a/test/performance/browsing_test.rb b/test/performance/browsing_test.rb deleted file mode 100644 index 74e8c9421..000000000 --- a/test/performance/browsing_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - - -require 'test_helper' -require 'rails/performance_test_help' - -# Profiling results for each test method are written to tmp/performance. -class BrowsingTest < ActionDispatch::PerformanceTest - def test_homepage - get '/' - end -end diff --git a/test/selenium/selenium_suite.rb b/test/selenium/selenium_suite.rb deleted file mode 100644 index d5362b1d7..000000000 --- a/test/selenium/selenium_suite.rb +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - - -require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper')) -require 'test/unit/ui/console/testrunner' -require 'webrat' -require 'saucelabs_adapter' - -Webrat.configure do |config| - config.mode = :selenium - config.application_framework = :rack -end - -require File.join(File.dirname(__FILE__), 'sample_webrat_test') diff --git a/test/test_helper.rb b/test/test_helper.rb deleted file mode 100644 index d9742c116..000000000 --- a/test/test_helper.rb +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2010, Diaspora Inc. This file is -# licensed under the Affero General Public License version 3. See -# the COPYRIGHT file. - - - -ENV["RAILS_ENV"] = "test" -require File.expand_path('../../config/environment', __FILE__) -require 'rails/test_help' - -class ActiveSupport::TestCase - # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. - # - # Note: You'll currently still have to declare fixtures explicitly in integration tests - # -- they do not yet inherit this setting - #fixtures :all - - # Add more helper methods to be used by all tests here... -end diff --git a/ubuntu-setup.bash b/ubuntu-setup.bash deleted file mode 100644 index 67b602abe..000000000 --- a/ubuntu-setup.bash +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# Author : hemanth.hm@gmail.com -# Site : www.h3manth.com -# This script helps to setup diaspora. -# - -# Set extented globbing -shopt -s extglob - -# Check if the user has sudo privileges. -[[ $( id -u) ]] && echo "$(whoami) has no sudo permissions on this machine" && exit 1 - -# Install build tools -echo "Installing build tools.." -sudo apt-get -y --no-install-recommends install build-essential libxslt1.1 libxslt1-dev libxml2 -echo "..Done installing build tools" - -# Install Ruby 1.8.7 -echo "Installing ruby-full Ruby 1.8.7.." -sudo apt-get -y --no-install-recommends install ruby-full -echo "..Done installing Ruby" - -# Install Rake -echo "Installing rake.." -sudo apt-get -y --no-install-recommends install rake -echo "..Done installing rake" - -# Get the current release and install mongodb -lsb=$(lsb_release -rs) -ver=${lsb//.+(0)/.} -repo="deb http://downloads.mongodb.org/distros/ubuntu ${ver} 10gen" -echo "Setting up MongoDB.." -echo "." -echo ${repo} | sudo tee -a /etc/apt/sources.list -echo "." -echo "Fetching keys.." -sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 -echo "." -sudo apt-get update -echo "." -sudo apt-get -y --no-install-recommends install mongodb-stable -echo "Done installing monngodb-stable.." - -# Install imagemagick -echo "Installing imagemagick.." -sudo apt-get -y --no-install-recommends install imagemagick libmagick9-dev -echo "Installed imagemagick.." - -# Install git-core -echo "Installing git-core.." -sudo apt-get -y --no-install-recommends install git-core -echo "Installed git-core.." - -# Setting up ruby gems -echo "Fetching and installing ruby gems.." -( - echo "." - cd /tmp - wget http://production.cf.rubygems.org/rubygems/rubygems-1.3.7.tgz - echo "." - tar -xf rubygems-1.3.7.tgz - echo "." - cd rubygems-1.3.7 - echo "." - sudo ruby setup.rb - echo "." - sudo ln -s /usr/bin/gem1.8 /usr/bin/gem - echo "." -) -echo "Done installing the gems.." - -# Install blunder -echo "Installing blunder.." -sudo gem install bundler -echo "Installed blunder.." - -# Take a clone of Diaspora -( -echo "Clone diaspora source.." -git clone http://github.com/diaspora/diaspora.git -echo "Cloned the source.." -# Install extra gems -cd diaspora -echo "Installing more gems.." -sudo bundle install -echo "Installed." - -# Install DB setup -echo "Seting up DB.." -rake db:seed:tom -echo "DB ready. Login -> tom and password -> evankorth. More details ./diaspora/db/seeds/tom.rb." - -# Run appserver -echo "Starting server" -bundle exec thin start -)