Commit 9c003f99be7deb4f56b2947c91b520ea549ed4ff

Authored by Junior Silva
2 parents 8674ccd1 f323c51d

Merge branch 'master' of https://gitlab.com/noosfero/noosfero into tolerance-time

Showing 58 changed files with 534 additions and 623 deletions   Show diff stats
1 --ignore-dir=log 1 --ignore-dir=log
2 --ignore-dir=tmp 2 --ignore-dir=tmp
3 --ignore-dir=pkg 3 --ignore-dir=pkg
  4 +--ignore-dir=public/javascripts/cache
  5 +--ignore-dir=public/stylesheets/cache
1 source "https://rubygems.org" 1 source "https://rubygems.org"
2 -gem 'rails'  
3 -gem 'fast_gettext'  
4 -gem 'acts-as-taggable-on'  
5 -gem 'prototype-rails'  
6 -gem 'prototype_legacy_helper', '0.0.0', :path => 'vendor/prototype_legacy_helper'  
7 -gem 'rails_autolink'  
8 -gem 'pg'  
9 -gem 'rmagick'  
10 -gem 'RedCloth'  
11 -gem 'will_paginate'  
12 -gem 'ruby-feedparser'  
13 -gem 'daemons'  
14 -gem 'thin'  
15 -gem 'hpricot'  
16 -gem 'nokogiri' 2 +gem 'rails', '~> 3.2.19'
  3 +gem 'fast_gettext', '~> 0.6.8'
  4 +gem 'acts-as-taggable-on', '~> 3.0.2'
  5 +gem 'prototype-rails', '~> 3.2.1'
  6 +gem 'prototype_legacy_helper', '0.0.0', :path => 'vendor/prototype_legacy_helper'
  7 +gem 'rails_autolink', '~> 1.1.5'
  8 +gem 'pg', '~> 0.13.2'
  9 +gem 'rmagick', '~> 2.13.1'
  10 +gem 'RedCloth', '~> 4.2.9'
  11 +gem 'will_paginate', '~> 3.0.3'
  12 +gem 'ruby-feedparser', '~> 0.7'
  13 +gem 'daemons', '~> 1.1.5'
  14 +gem 'thin', '~> 1.3.1'
  15 +gem 'hpricot', '~> 0.8.6'
  16 +gem 'nokogiri', '~> 1.5.5'
17 gem 'rake', :require => false 17 gem 'rake', :require => false
18 -gem 'rest-client'  
19 -gem 'exception_notification'  
20 -gem 'gettext', :require => false, :group => :development 18 +gem 'rest-client', '~> 1.6.7'
  19 +gem 'exception_notification', '~> 4.0.1'
  20 +gem 'gettext', '~> 2.2.1', :require => false, :group => :development
21 21
22 # FIXME list here all actual dependencies (i.e. the ones in debian/control), 22 # FIXME list here all actual dependencies (i.e. the ones in debian/control),
23 # with their GEM names (not the Debian package names) 23 # with their GEM names (not the Debian package names)
24 24
25 group :production do 25 group :production do
26 - gem 'dalli' 26 + gem 'dalli', '~> 2.7.0'
27 end 27 end
28 28
29 group :test do 29 group :test do
30 - gem 'rspec'  
31 - gem 'rspec-rails'  
32 - gem 'mocha', :require => false 30 + gem 'rspec', '~> 2.10.0'
  31 + gem 'rspec-rails', '~> 2.10.1'
  32 + gem 'mocha', '~> 1.1.0', :require => false
33 end 33 end
34 34
35 group :cucumber do 35 group :cucumber do
36 - gem 'cucumber-rails', :require => false  
37 - gem 'capybara'  
38 - gem 'cucumber'  
39 - gem 'database_cleaner'  
40 - gem 'selenium-webdriver' 36 + gem 'cucumber-rails', '~> 1.0.6', :require => false
  37 + gem 'capybara', '~> 2.1.0'
  38 + gem 'cucumber', '~> 1.0.6'
  39 + gem 'database_cleaner', '~> 1.2.0'
  40 + gem 'selenium-webdriver', '~> 2.39.0'
41 end 41 end
42 42
43 # include plugin gemfiles 43 # include plugin gemfiles
Gemfile.lock
@@ -1,195 +0,0 @@ @@ -1,195 +0,0 @@
1 -PATH  
2 - remote: vendor/prototype_legacy_helper  
3 - specs:  
4 - prototype_legacy_helper (0.0.0)  
5 -  
6 -GEM  
7 - remote: https://rubygems.org/  
8 - specs:  
9 - RedCloth (4.2.9)  
10 - actionmailer (3.2.6)  
11 - actionpack (= 3.2.6)  
12 - mail (~> 2.4.4)  
13 - actionpack (3.2.6)  
14 - activemodel (= 3.2.6)  
15 - activesupport (= 3.2.6)  
16 - builder (~> 3.0.0)  
17 - erubis (~> 2.7.0)  
18 - journey (~> 1.0.1)  
19 - rack (~> 1.4.0)  
20 - rack-cache (~> 1.2)  
21 - rack-test (~> 0.6.1)  
22 - sprockets (~> 2.1.3)  
23 - activemodel (3.2.6)  
24 - activesupport (= 3.2.6)  
25 - builder (~> 3.0.0)  
26 - activerecord (3.2.6)  
27 - activemodel (= 3.2.6)  
28 - activesupport (= 3.2.6)  
29 - arel (~> 3.0.2)  
30 - tzinfo (~> 0.3.29)  
31 - activeresource (3.2.6)  
32 - activemodel (= 3.2.6)  
33 - activesupport (= 3.2.6)  
34 - activesupport (3.2.6)  
35 - i18n (~> 0.6)  
36 - multi_json (~> 1.0)  
37 - acts-as-taggable-on (3.0.2)  
38 - rails (>= 3, < 5)  
39 - arel (3.0.2)  
40 - builder (3.0.0)  
41 - capybara (2.1.0)  
42 - mime-types (>= 1.16)  
43 - nokogiri (>= 1.3.3)  
44 - rack (>= 1.0.0)  
45 - rack-test (>= 0.5.4)  
46 - xpath (~> 2.0)  
47 - childprocess (0.3.3)  
48 - ffi (~> 1.0.6)  
49 - cucumber (1.0.6)  
50 - builder (>= 2.1.2)  
51 - diff-lcs (>= 1.1.2)  
52 - gherkin (~> 2.4.18)  
53 - json (>= 1.4.6)  
54 - term-ansicolor (>= 1.0.6)  
55 - cucumber-rails (1.0.6)  
56 - capybara (>= 1.1.1)  
57 - cucumber (>= 1.0.6)  
58 - nokogiri (>= 1.5.0)  
59 - daemons (1.1.5)  
60 - dalli (2.7.0)  
61 - database_cleaner (1.2.0)  
62 - diff-lcs (1.1.3)  
63 - erubis (2.7.0)  
64 - eventmachine (0.12.10)  
65 - exception_notification (4.0.1)  
66 - actionmailer (>= 3.0.4)  
67 - activesupport (>= 3.0.4)  
68 - fast_gettext (0.6.8)  
69 - ffi (1.0.11)  
70 - gettext (2.2.1)  
71 - locale  
72 - gherkin (2.4.21)  
73 - json (>= 1.4.6)  
74 - hike (1.2.1)  
75 - hpricot (0.8.6)  
76 - i18n (0.6.0)  
77 - journey (1.0.3)  
78 - json (1.7.3)  
79 - locale (2.0.5)  
80 - mail (2.4.4)  
81 - i18n (>= 0.4.0)  
82 - mime-types (~> 1.16)  
83 - treetop (~> 1.4.8)  
84 - metaclass (0.0.1)  
85 - mime-types (1.19)  
86 - mocha (0.11.3)  
87 - metaclass (~> 0.0.1)  
88 - multi_json (1.3.6)  
89 - nokogiri (1.5.5)  
90 - pg (0.13.2)  
91 - polyglot (0.3.3)  
92 - prototype-rails (3.2.1)  
93 - rails (~> 3.2)  
94 - rack (1.4.1)  
95 - rack-cache (1.2)  
96 - rack (>= 0.4)  
97 - rack-ssl (1.3.2)  
98 - rack  
99 - rack-test (0.6.1)  
100 - rack (>= 1.0)  
101 - rails (3.2.6)  
102 - actionmailer (= 3.2.6)  
103 - actionpack (= 3.2.6)  
104 - activerecord (= 3.2.6)  
105 - activeresource (= 3.2.6)  
106 - activesupport (= 3.2.6)  
107 - bundler (~> 1.0)  
108 - railties (= 3.2.6)  
109 - rails_autolink (1.1.5)  
110 - rails (> 3.1)  
111 - railties (3.2.6)  
112 - actionpack (= 3.2.6)  
113 - activesupport (= 3.2.6)  
114 - rack-ssl (~> 1.3.2)  
115 - rake (>= 0.8.7)  
116 - rdoc (~> 3.4)  
117 - thor (>= 0.14.6, < 2.0)  
118 - rake (0.9.2.2)  
119 - rdoc (3.9.4)  
120 - rest-client (1.6.7)  
121 - mime-types (>= 1.16)  
122 - rmagick (2.13.1)  
123 - rspec (2.10.0)  
124 - rspec-core (~> 2.10.0)  
125 - rspec-expectations (~> 2.10.0)  
126 - rspec-mocks (~> 2.10.0)  
127 - rspec-core (2.10.1)  
128 - rspec-expectations (2.10.0)  
129 - diff-lcs (~> 1.1.3)  
130 - rspec-mocks (2.10.1)  
131 - rspec-rails (2.10.1)  
132 - actionpack (>= 3.0)  
133 - activesupport (>= 3.0)  
134 - railties (>= 3.0)  
135 - rspec (~> 2.10.0)  
136 - ruby-feedparser (0.7)  
137 - rubyzip (1.1.2)  
138 - selenium-webdriver (2.39.0)  
139 - childprocess (>= 0.2.5)  
140 - multi_json (~> 1.0)  
141 - rubyzip (~> 1.0)  
142 - websocket (~> 1.0.4)  
143 - sprockets (2.1.3)  
144 - hike (~> 1.2)  
145 - multi_json (~> 1.0)  
146 - rack (~> 1.0)  
147 - tilt (~> 1.1, != 1.3.0)  
148 - term-ansicolor (1.0.7)  
149 - thin (1.3.1)  
150 - daemons (>= 1.0.9)  
151 - eventmachine (>= 0.12.6)  
152 - rack (>= 1.0.0)  
153 - thor (0.15.3)  
154 - tilt (1.3.3)  
155 - treetop (1.4.10)  
156 - polyglot  
157 - polyglot (>= 0.3.1)  
158 - tzinfo (0.3.33)  
159 - websocket (1.0.7)  
160 - will_paginate (3.0.3)  
161 - xpath (2.0.0)  
162 - nokogiri (~> 1.3)  
163 -  
164 -PLATFORMS  
165 - ruby  
166 -  
167 -DEPENDENCIES  
168 - RedCloth  
169 - acts-as-taggable-on  
170 - capybara  
171 - cucumber  
172 - cucumber-rails  
173 - daemons  
174 - dalli  
175 - database_cleaner  
176 - exception_notification  
177 - fast_gettext  
178 - gettext  
179 - hpricot  
180 - mocha  
181 - nokogiri  
182 - pg  
183 - prototype-rails  
184 - prototype_legacy_helper (= 0.0.0)!  
185 - rails  
186 - rails_autolink  
187 - rake  
188 - rest-client  
189 - rmagick  
190 - rspec  
191 - rspec-rails  
192 - ruby-feedparser  
193 - selenium-webdriver  
194 - thin  
195 - will_paginate  
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 3
4 VAGRANTFILE_API_VERSION = "2" 4 VAGRANTFILE_API_VERSION = "2"
5 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 5 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
6 - config.vm.box = "debian-wheezy" 6 + config.vm.box = ENV.fetch('VAGRANT_BOX', "debian-wheezy")
7 config.vm.network :forwarded_port, host: 3000, guest: 3000 7 config.vm.network :forwarded_port, host: 3000, guest: 3000
8 config.vm.provision :shell do |shell| 8 config.vm.provision :shell do |shell|
9 shell.inline = 'su vagrant -c /vagrant/script/vagrant' 9 shell.inline = 'su vagrant -c /vagrant/script/vagrant'
app/controllers/public/account_controller.rb
@@ -97,6 +97,7 @@ class AccountController &lt; ApplicationController @@ -97,6 +97,7 @@ class AccountController &lt; ApplicationController
97 @user.return_to = session[:return_to] 97 @user.return_to = session[:return_to]
98 @person = Person.new(params[:profile_data]) 98 @person = Person.new(params[:profile_data])
99 @person.environment = @user.environment 99 @person.environment = @user.environment
  100 +
100 if request.post? 101 if request.post?
101 if may_be_a_bot 102 if may_be_a_bot
102 set_signup_start_time_for_now 103 set_signup_start_time_for_now
@@ -115,6 +116,14 @@ class AccountController &lt; ApplicationController @@ -115,6 +116,14 @@ class AccountController &lt; ApplicationController
115 invitation.update_attributes!({:friend => @user.person}) 116 invitation.update_attributes!({:friend => @user.person})
116 invitation.finish 117 invitation.finish
117 end 118 end
  119 +
  120 + unless params[:file].nil?
  121 + image = Image::new :uploaded_data=> params[:file][:image]
  122 +
  123 + @user.person.image = image
  124 + @user.person.save
  125 + end
  126 +
118 if @user.activated? 127 if @user.activated?
119 self.current_user = @user 128 self.current_user = @user
120 check_join_in_community(@user) 129 check_join_in_community(@user)
app/models/environment.rb
@@ -804,7 +804,7 @@ class Environment &lt; ActiveRecord::Base @@ -804,7 +804,7 @@ class Environment &lt; ActiveRecord::Base
804 end 804 end
805 805
806 def notification_emails 806 def notification_emails
807 - [noreply_email.blank? ? nil : noreply_email].compact + admins.map(&:email) 807 + [contact_email].select(&:present?) + admins.map(&:email)
808 end 808 end
809 809
810 after_create :create_templates 810 after_create :create_templates
app/models/organization.rb
@@ -135,7 +135,11 @@ class Organization &lt; Profile @@ -135,7 +135,11 @@ class Organization &lt; Profile
135 end 135 end
136 136
137 def notification_emails 137 def notification_emails
138 - [contact_email.blank? ? nil : contact_email].compact + admins.map(&:email) 138 + emails = [contact_email].select(&:present?) + admins.map(&:email)
  139 + if emails.empty?
  140 + emails << environment.contact_email
  141 + end
  142 + emails
139 end 143 end
140 144
141 def already_request_membership?(person) 145 def already_request_membership?(person)
app/views/profile_editor/_person_form.html.erb
@@ -25,6 +25,7 @@ @@ -25,6 +25,7 @@
25 <%= optional_field(@person, 'address', labelled_form_field(_('Address (street and number)'), text_field(:profile_data, :address, :rel => _('Address')))) %> 25 <%= optional_field(@person, 'address', labelled_form_field(_('Address (street and number)'), text_field(:profile_data, :address, :rel => _('Address')))) %>
26 <%= optional_field(@person, 'address_reference', labelled_form_field(_('Address reference'), text_field(:profile_data, :address_reference, :rel => _('Address reference')))) %> 26 <%= optional_field(@person, 'address_reference', labelled_form_field(_('Address reference'), text_field(:profile_data, :address_reference, :rel => _('Address reference')))) %>
27 <%= optional_field(@person, 'district', labelled_form_field(_('District'), text_field(:profile_data, :district, :rel => _('District')))) %> 27 <%= optional_field(@person, 'district', labelled_form_field(_('District'), text_field(:profile_data, :district, :rel => _('District')))) %>
  28 +<%= optional_field(@person, 'image', labelled_form_field(_('Image'), file_field(:file, :image, :rel => _('Image')))) %>
28 29
29 <% optional_field(@person, 'schooling') do %> 30 <% optional_field(@person, 'schooling') do %>
30 <div class="formfieldline"> 31 <div class="formfieldline">
config/cucumber.yml
1 <% base_requires = '-r features/support -r features/step_definitions' %> 1 <% base_requires = '-r features/support -r features/step_definitions' %>
2 -<% default_options = "--color --format progress --strict --tags ~@selenium --tags ~@selenium-fixme --tags ~@fixme --exclude features/support/selenium.rb #{base_requires}" %> 2 +<% default_options = "--format progress --strict --tags ~@selenium --tags ~@selenium-fixme --tags ~@fixme --exclude features/support/selenium.rb #{base_requires}" %>
  3 +<%
  4 + default_options += ' --color' if $stdout.isatty
  5 +%>
3 <% selenium_options = "--strict --tags @selenium #{base_requires}" %> 6 <% selenium_options = "--strict --tags @selenium #{base_requires}" %>
4 7
5 default: <%= default_options %> 8 default: <%= default_options %>
debian/control
@@ -9,7 +9,7 @@ Build-Depends: @@ -9,7 +9,7 @@ Build-Depends:
9 ruby-gettext, 9 ruby-gettext,
10 ruby-sqlite3, 10 ruby-sqlite3,
11 rake, 11 rake,
12 - rails3 (>= 3.2.6-1~), 12 + rails3 (>= 3.2.19-1~),
13 ruby-rspec, 13 ruby-rspec,
14 ruby-rspec-rails, 14 ruby-rspec-rails,
15 ruby-will-paginate, 15 ruby-will-paginate,
debian/noosfero.install
@@ -8,7 +8,6 @@ Rakefile usr/share/noosfero @@ -8,7 +8,6 @@ Rakefile usr/share/noosfero
8 vendor usr/share/noosfero 8 vendor usr/share/noosfero
9 9
10 Gemfile usr/share/noosfero 10 Gemfile usr/share/noosfero
11 -Gemfile.lock usr/share/noosfero  
12 debian/bundle/config usr/share/noosfero/.bundle 11 debian/bundle/config usr/share/noosfero/.bundle
13 12
14 config/application.rb usr/share/noosfero/config 13 config/application.rb usr/share/noosfero/config
debian/noosfero.links
@@ -15,3 +15,4 @@ var/lib/noosfero-data/public/thumbnails usr/share/noosfero/public/th @@ -15,3 +15,4 @@ var/lib/noosfero-data/public/thumbnails usr/share/noosfero/public/th
15 usr/share/noosfero/public/designs/themes/noosfero usr/share/noosfero/public/designs/themes/default 15 usr/share/noosfero/public/designs/themes/noosfero usr/share/noosfero/public/designs/themes/default
16 usr/share/noosfero/public/designs/icons/tango usr/share/noosfero/public/designs/icons/default 16 usr/share/noosfero/public/designs/icons/tango usr/share/noosfero/public/designs/icons/default
17 usr/share/noosfero/script/noosfero-plugins usr/sbin/noosfero-plugins 17 usr/share/noosfero/script/noosfero-plugins usr/sbin/noosfero-plugins
  18 +usr/share/noosfero/Gemfile.lock /dev/null
gitignore.example
@@ -43,3 +43,4 @@ debian/noosfero-apache/ @@ -43,3 +43,4 @@ debian/noosfero-apache/
43 features/plugins/* 43 features/plugins/*
44 plugins/solr/config/solr.yml 44 plugins/solr/config/solr.yml
45 /solr 45 /solr
  46 +/Gemfile.lock
plugins/solr/config/solr.yml.dist
@@ -9,18 +9,18 @@ @@ -9,18 +9,18 @@
9 production: 9 production:
10 url: http://127.0.0.1:8983/solr 10 url: http://127.0.0.1:8983/solr
11 jvm_options: -server -Xmx192M -Xms64M 11 jvm_options: -server -Xmx192M -Xms64M
12 - timeout: 0 12 + timeout: 600
13 data_path: /var/lib/noosfero-data/solr/index 13 data_path: /var/lib/noosfero-data/solr/index
14 14
15 development: 15 development:
16 url: http://0.0.0.0:8982/solr 16 url: http://0.0.0.0:8982/solr
17 jvm_options: -server -Xmx128M -Xms16M 17 jvm_options: -server -Xmx128M -Xms16M
18 - timeout: 0 18 + timeout: 600
19 19
20 test: &TEST 20 test: &TEST
21 url: http://0.0.0.0:8981/solr 21 url: http://0.0.0.0:8981/solr
22 jvm_options: -server -Xmx128M -Xms16M 22 jvm_options: -server -Xmx128M -Xms16M
23 - timeout: 0 23 + timeout: 600
24 24
25 cucumber: 25 cucumber:
26 <<: *TEST 26 <<: *TEST
plugins/solr/install.rb
1 -raise "Not ready yet. Some tests are failing." 1 +#raise "Not ready yet. Some tests are failing."
2 require 'rubygems' 2 require 'rubygems'
3 require 'rake' 3 require 'rake'
4 4
plugins/solr/lib/ext/product.rb
@@ -27,7 +27,8 @@ class Product @@ -27,7 +27,8 @@ class Product
27 {:name => {:type => :text, :boost => 2.0}}, 27 {:name => {:type => :text, :boost => 2.0}},
28 {:description => :text}, {:category_full_name => :text}, 28 {:description => :text}, {:category_full_name => :text},
29 # filtered fields 29 # filtered fields
30 - {:solr_plugin_public => :boolean}, {:environment_id => :integer}, 30 + {:solr_plugin_public => :boolean},
  31 + {:environment_id => :integer}, {:profile_id => :integer},
31 {:enabled => :boolean}, {:solr_plugin_category_filter => :integer}, 32 {:enabled => :boolean}, {:solr_plugin_category_filter => :integer},
32 # ordered/query-boosted fields 33 # ordered/query-boosted fields
33 {:solr_plugin_price_sortable => :decimal}, {:solr_plugin_name_sortable => :string}, 34 {:solr_plugin_price_sortable => :decimal}, {:solr_plugin_name_sortable => :string},
plugins/solr/lib/ext/profile.rb
@@ -42,7 +42,7 @@ class Profile @@ -42,7 +42,7 @@ class Profile
42 handle_asynchronously :solr_save 42 handle_asynchronously :solr_save
43 handle_asynchronously :solr_destroy 43 handle_asynchronously :solr_destroy
44 44
45 - class_inheritable_accessor :solr_plugin_extra_index_methods 45 + class_attribute :solr_plugin_extra_index_methods
46 self.solr_plugin_extra_index_methods = [] 46 self.solr_plugin_extra_index_methods = []
47 47
48 def solr_plugin_extra_data_for_index 48 def solr_plugin_extra_data_for_index
plugins/solr/lib/solr_plugin.rb
@@ -33,8 +33,8 @@ class SolrPlugin &lt; Noosfero::Plugin @@ -33,8 +33,8 @@ class SolrPlugin &lt; Noosfero::Plugin
33 33
34 solr_options = solr_options(class_asset(klass), category) 34 solr_options = solr_options(class_asset(klass), category)
35 solr_options[:filter_queries] ||= [] 35 solr_options[:filter_queries] ||= []
36 - solr_options[:filter_queries] += scopes_to_solr_filters scope, klass, options  
37 - solr_options.merge! products_options(user) if klass == Product and empty_query 36 + solr_options[:filter_queries] += scopes_to_solr_options scope, klass, options
  37 + solr_options.merge! products_options(user) if asset == :products and empty_query
38 solr_options.merge! options.except(:category, :filter) 38 solr_options.merge! options.except(:category, :filter)
39 39
40 scope.find_by_contents query, paginate_options, solr_options 40 scope.find_by_contents query, paginate_options, solr_options
@@ -42,14 +42,14 @@ class SolrPlugin &lt; Noosfero::Plugin @@ -42,14 +42,14 @@ class SolrPlugin &lt; Noosfero::Plugin
42 42
43 protected 43 protected
44 44
45 - def scopes_to_solr_filters scope, klass = nil, options = {} 45 + def scopes_to_solr_options scope, klass = nil, options = {}
46 filter_queries = [] 46 filter_queries = []
47 klass ||= scope.base_class 47 klass ||= scope.base_class
48 solr_fields = klass.configuration[:solr_fields].keys 48 solr_fields = klass.configuration[:solr_fields].keys
49 scopes_applied = scope.scopes_applied.dup rescue [] #rescue association and class direct filtering 49 scopes_applied = scope.scopes_applied.dup rescue [] #rescue association and class direct filtering
50 50
51 - scope.current_scoped_methods[:create].each do |attr, value|  
52 - next unless solr_fields.include? attr.to_sym 51 + scope.scope_attributes.each do |attr, value|
  52 + raise "Non-indexed attribute '#{attr}' speficied in scope_attributes" unless solr_fields.include? attr.to_sym
53 53
54 # if the filter is present here, then prefer it 54 # if the filter is present here, then prefer it
55 scopes_applied.reject!{ |name| name == attr.to_sym } 55 scopes_applied.reject!{ |name| name == attr.to_sym }
plugins/solr/vendor/plugins/acts_as_solr_reloaded/.travis.yml
  1 +services:
  2 + - mongodb
  3 +
  4 +language: ruby
  5 +rvm:
  6 + - 1.8.7
  7 +
  8 +before_install:
  9 + - sudo apt-get update
  10 + - sudo apt-get install default-jdk
  11 +
1 before_script: 12 before_script:
2 - mongo mydb_test --eval 'db.addUser("travis", "test");' 13 - mongo mydb_test --eval 'db.addUser("travis", "test");'
3 - gem update --system 1.4.1 > /dev/null 2>&1 14 - gem update --system 1.4.1 > /dev/null 2>&1
4 - rake solr:download 15 - rake solr:download
5 - RAILS_ENV=test rake solr:start 16 - RAILS_ENV=test rake solr:start
6 17
7 -script: "bundle exec rake $TASK --trace" 18 +script:
  19 + - bundle exec rake test --trace
  20 + - bundle exec rake test:functional --trace
8 21
9 -rvm:  
10 - - 1.8.7  
11 -env:  
12 - - TASK=test  
13 - - TASK=test:functional  
plugins/solr/vendor/plugins/acts_as_solr_reloaded/Gemfile
1 -source :rubygems 1 +source 'https://rubygems.org'
2 2
3 gem 'ruby-debug' 3 gem 'ruby-debug'
  4 +gem 'rdoc'
  5 +
  6 +gem 'jeweler'
4 7
5 gem 'rails', '2.3.5' 8 gem 'rails', '2.3.5'
6 9
plugins/solr/vendor/plugins/acts_as_solr_reloaded/Rakefile
1 require 'rubygems' 1 require 'rubygems'
2 require 'rake' 2 require 'rake'
3 require 'rake/testtask' 3 require 'rake/testtask'
4 -require 'rake/rdoctask' 4 +require 'rdoc/task'
5 5
6 ENV['RAILS_ENV'] = "test" 6 ENV['RAILS_ENV'] = "test"
7 require File.expand_path("#{File.dirname(__FILE__)}/config/solr_environment") 7 require File.expand_path("#{File.dirname(__FILE__)}/config/solr_environment")
8 8
9 Dir["#{File.dirname(__FILE__)}/lib/tasks/*.rake"].sort.each { |ext| load ext } 9 Dir["#{File.dirname(__FILE__)}/lib/tasks/*.rake"].sort.each { |ext| load ext }
10 10
11 -desc "Default Task"  
12 -task :default => [:test]  
13 -  
14 -desc "Runs the unit tests"  
15 -task :test => "test:unit"  
16 -  
17 -namespace :test do  
18 - task :setup do  
19 - DB ||= 'sqlite'  
20 - puts "Using " + DB  
21 - %x(mysql -u#{MYSQL_USER} < #{File.dirname(__FILE__) + "/test/fixtures/db_definitions/mysql.sql"}) if DB == 'mysql'  
22 -  
23 - Rake::Task["test:migrate"].invoke  
24 - end  
25 -  
26 - desc 'Measures test coverage using rcov'  
27 - task :rcov => :setup do  
28 - rm_f "coverage"  
29 - rm_f "coverage.data"  
30 - rcov = "rcov --rails --aggregate coverage.data --text-summary -Ilib"  
31 -  
32 - system("#{rcov} --html #{Dir.glob('test/**/*_shoulda.rb').join(' ')}")  
33 - system("open coverage/index.html") if PLATFORM['darwin']  
34 - end  
35 -  
36 - desc 'Runs the functional tests, testing integration with Solr'  
37 - Rake::TestTask.new(:functional => :setup) do |t|  
38 - t.pattern = "test/functional/*_test.rb"  
39 - t.verbose = true  
40 - end  
41 -  
42 - desc "Unit tests"  
43 - Rake::TestTask.new(:unit => :setup) do |t|  
44 - t.libs << 'test/unit'  
45 - t.pattern = "test/unit/*_shoulda.rb"  
46 - t.verbose = true  
47 - end  
48 -end  
49 -  
50 -Rake::RDocTask.new do |rd|  
51 - rd.main = "README.rdoc"  
52 - rd.rdoc_dir = "rdoc"  
53 - rd.rdoc_files.exclude("lib/solr/**/*.rb", "lib/solr.rb")  
54 - rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")  
55 -end  
56 -  
57 -begin  
58 - require 'jeweler'  
59 - Jeweler::Tasks.new do |s|  
60 - s.name = "acts_as_solr_reloaded"  
61 - s.summary = "This gem adds full text search capabilities and many other nifty features from Apache Solr to any Rails model."  
62 - s.email = "dc.rec1@gmail.com"  
63 - s.homepage = "http://github.com/dcrec1/acts_as_solr_reloaded"  
64 - s.description = "This gem adds full text search capabilities and many other nifty features from Apache Solr to any Rails model."  
65 - s.authors = ["Diego Carrion"]  
66 - s.files = FileList["[A-Z]*", "{bin,generators,config,lib,solr}/**/*"] +  
67 - FileList["test/**/*"].reject {|f| f.include?("test/log")}.reject {|f| f.include?("test/tmp")}  
68 - end  
69 -rescue LoadError  
70 - puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"  
71 -end  
plugins/solr/vendor/plugins/acts_as_solr_reloaded/config/solr_environment.rb
@@ -6,23 +6,19 @@ require &#39;net/http&#39; @@ -6,23 +6,19 @@ require &#39;net/http&#39;
6 6
7 dir = File.dirname(__FILE__) 7 dir = File.dirname(__FILE__)
8 SOLR_PATH = File.expand_path("#{dir}/../solr") unless defined? SOLR_PATH 8 SOLR_PATH = File.expand_path("#{dir}/../solr") unless defined? SOLR_PATH
9 -config = YAML::load_file(RAILS_ROOT+'/plugins/solr/config/solr.yml') 9 +config = YAML::load_file("#{Rails.root}/plugins/solr/config/solr.yml")
10 10
11 -unless defined? RAILS_ROOT  
12 - # define RAILS_ROOT for test environment  
13 - RAILS_ROOT = defined?(Rails) ? Rails.root : File.expand_path("#{File.dirname(__FILE__)}/../test")  
14 -end  
15 unless defined? RAILS_ENV 11 unless defined? RAILS_ENV
16 RAILS_ENV = ENV['RAILS_ENV'] 12 RAILS_ENV = ENV['RAILS_ENV']
17 end 13 end
18 unless defined? SOLR_LOGS_PATH 14 unless defined? SOLR_LOGS_PATH
19 - SOLR_LOGS_PATH = ENV["SOLR_LOGS_PATH"] || "#{RAILS_ROOT}/log" 15 + SOLR_LOGS_PATH = ENV["SOLR_LOGS_PATH"] || "#{Rails.root}/log"
20 end 16 end
21 unless defined? SOLR_PIDS_PATH 17 unless defined? SOLR_PIDS_PATH
22 - SOLR_PIDS_PATH = ENV["SOLR_PIDS_PATH"] || "#{RAILS_ROOT}/tmp/pids" 18 + SOLR_PIDS_PATH = ENV["SOLR_PIDS_PATH"] || "#{Rails.root}/tmp/pids"
23 end 19 end
24 unless defined? SOLR_DATA_PATH 20 unless defined? SOLR_DATA_PATH
25 - SOLR_DATA_PATH = ENV["SOLR_DATA_PATH"] || config[ENV['RAILS_ENV']]['data_path'] || "#{RAILS_ROOT}/solr/#{ENV['RAILS_ENV']}" 21 + SOLR_DATA_PATH = ENV["SOLR_DATA_PATH"] || config[ENV['RAILS_ENV']]['data_path'] || "#{Rails.root}/solr/#{ENV['RAILS_ENV']}"
26 end 22 end
27 unless defined? SOLR_CONFIG_PATH 23 unless defined? SOLR_CONFIG_PATH
28 SOLR_CONFIG_PATH = ENV["SOLR_CONFIG_PATH"] || "#{SOLR_PATH}/solr" 24 SOLR_CONFIG_PATH = ENV["SOLR_CONFIG_PATH"] || "#{SOLR_PATH}/solr"
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr.rb
@@ -20,6 +20,7 @@ require File.dirname(__FILE__) + &#39;/acts_as_solr/search_results&#39; @@ -20,6 +20,7 @@ require File.dirname(__FILE__) + &#39;/acts_as_solr/search_results&#39;
20 require File.dirname(__FILE__) + '/acts_as_solr/lazy_document' 20 require File.dirname(__FILE__) + '/acts_as_solr/lazy_document'
21 require File.dirname(__FILE__) + '/acts_as_solr/mongo_mapper' 21 require File.dirname(__FILE__) + '/acts_as_solr/mongo_mapper'
22 require File.dirname(__FILE__) + '/acts_as_solr/post' 22 require File.dirname(__FILE__) + '/acts_as_solr/post'
  23 +require File.dirname(__FILE__) + '/acts_as_solr/scope_with_applied_names'
23 24
24 # reopen ActiveRecord and include the acts_as_solr method 25 # reopen ActiveRecord and include the acts_as_solr method
25 ActiveRecord::Base.extend ActsAsSolr::ActsMethods 26 ActiveRecord::Base.extend ActsAsSolr::ActsMethods
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/acts_methods.rb
@@ -178,6 +178,8 @@ module ActsAsSolr #:nodoc: @@ -178,6 +178,8 @@ module ActsAsSolr #:nodoc:
178 include CommonMethods 178 include CommonMethods
179 include ParserMethods 179 include ParserMethods
180 180
  181 + attr_accessor :solr_score
  182 +
181 define_solr_configuration_methods 183 define_solr_configuration_methods
182 184
183 acts_as_taggable_on :tags if options[:taggable] 185 acts_as_taggable_on :tags if options[:taggable]
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/common_methods.rb
1 module ActsAsSolr #:nodoc: 1 module ActsAsSolr #:nodoc:
2 - 2 +
3 module CommonMethods 3 module CommonMethods
4 4
5 TypeMapping = { 5 TypeMapping = {
@@ -14,6 +14,7 @@ module ActsAsSolr #:nodoc: @@ -14,6 +14,7 @@ module ActsAsSolr #:nodoc:
14 :range_integer => "ri", 14 :range_integer => "ri",
15 :facet => "facet", 15 :facet => "facet",
16 :text => "t", 16 :text => "t",
  17 + :ngram_text => "nt",
17 } 18 }
18 19
19 # Converts field types into Solr types 20 # Converts field types into Solr types
@@ -39,39 +40,39 @@ module ActsAsSolr #:nodoc: @@ -39,39 +40,39 @@ module ActsAsSolr #:nodoc:
39 result = [result] unless result.is_a?(Array) 40 result = [result] unless result.is_a?(Array)
40 solr_batch_add result 41 solr_batch_add result
41 end 42 end
42 - 43 +
43 # Sends an add command to Solr 44 # Sends an add command to Solr
44 def solr_add(add_xml) 45 def solr_add(add_xml)
45 ActsAsSolr::Post.execute(Solr::Request::AddDocument.new(add_xml)) 46 ActsAsSolr::Post.execute(Solr::Request::AddDocument.new(add_xml))
46 end 47 end
47 - 48 +
48 # Sends the delete command to Solr 49 # Sends the delete command to Solr
49 def solr_delete(solr_ids) 50 def solr_delete(solr_ids)
50 ActsAsSolr::Post.execute(Solr::Request::Delete.new(:id => solr_ids)) 51 ActsAsSolr::Post.execute(Solr::Request::Delete.new(:id => solr_ids))
51 end 52 end
52 - 53 +
53 # Sends the commit command to Solr 54 # Sends the commit command to Solr
54 def solr_commit 55 def solr_commit
55 ActsAsSolr::Post.execute(Solr::Request::Commit.new) 56 ActsAsSolr::Post.execute(Solr::Request::Commit.new)
56 end 57 end
57 - 58 +
58 # Optimizes the Solr index. Solr says: 59 # Optimizes the Solr index. Solr says:
59 - #  
60 - # Optimizations can take nearly ten minutes to run.  
61 - # We are presuming optimizations should be run once following large 60 + #
  61 + # Optimizations can take nearly ten minutes to run.
  62 + # We are presuming optimizations should be run once following large
62 # batch-like updates to the collection and/or once a day. 63 # batch-like updates to the collection and/or once a day.
63 - #  
64 - # One of the solutions for this would be to create a cron job that 64 + #
  65 + # One of the solutions for this would be to create a cron job that
65 # runs every day at midnight and optmizes the index: 66 # runs every day at midnight and optmizes the index:
66 # 0 0 * * * /your_rails_dir/script/runner -e production "Model.solr_optimize" 67 # 0 0 * * * /your_rails_dir/script/runner -e production "Model.solr_optimize"
67 - # 68 + #
68 def solr_optimize 69 def solr_optimize
69 ActsAsSolr::Post.execute(Solr::Request::Optimize.new) 70 ActsAsSolr::Post.execute(Solr::Request::Optimize.new)
70 end 71 end
71 - 72 +
72 # Returns the id for the given instance 73 # Returns the id for the given instance
73 - def record_id(object)  
74 - eval "object.#{object.class.primary_key}" 74 + def record_id object
  75 + object.send object.class.primary_key
75 end 76 end
76 end 77 end
77 end 78 end
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/parser_methods.rb
@@ -4,12 +4,16 @@ module ActsAsSolr #:nodoc: @@ -4,12 +4,16 @@ module ActsAsSolr #:nodoc:
4 4
5 # Method used by mostly all the ClassMethods when doing a search 5 # Method used by mostly all the ClassMethods when doing a search
6 def parse_query(query=nil, options={}) 6 def parse_query(query=nil, options={})
7 - valid_options = [:models, :lazy, :core, :results_format, :sql_options, 7 + valid_options = [
  8 + :models, :lazy, :core, :results_format, :sql_options,
8 :alternate_query, :boost_functions, :filter_queries, :facets, :sort, 9 :alternate_query, :boost_functions, :filter_queries, :facets, :sort,
9 :scores, :operator, :latitude, :longitude, :radius, :relevance, :highlight, 10 :scores, :operator, :latitude, :longitude, :radius, :relevance, :highlight,
10 - :offset, :per_page, :limit, :page,] 11 + :offset, :per_page, :limit, :page,
  12 + :query_fields, :default_field,
  13 + ]
11 query_options = {} 14 query_options = {}
12 options[:results_format] ||= :objects 15 options[:results_format] ||= :objects
  16 + options[:default_field] ||= 'text'
13 17
14 return if query.nil? 18 return if query.nil?
15 raise "Query should be a string" unless query.is_a?(String) 19 raise "Query should be a string" unless query.is_a?(String)
@@ -49,77 +53,95 @@ module ActsAsSolr #:nodoc: @@ -49,77 +53,95 @@ module ActsAsSolr #:nodoc:
49 query_options[:rows] = per_page 53 query_options[:rows] = per_page
50 query_options[:start] = offset 54 query_options[:start] = offset
51 55
  56 + query_options[:boost_functions] = replace_types([*options[:boost_functions]], '').join(' ') if options[:boost_functions]
  57 +
  58 + parse_facets query_options, options
  59 + parse_highlight query_options, options
  60 + parse_sort query_options, options
  61 + parse_location query_options, options
  62 + parse_query_fields query_options, options
  63 +
52 query_options[:operator] = options[:operator] 64 query_options[:operator] = options[:operator]
  65 + not_dismax = query_options[:operator] == :or
  66 + request = if not_dismax then Solr::Request::Standard.new(query_options) else Solr::Request::Dismax.new query_options end
  67 + ActsAsSolr::Post.execute request, options[:core]
  68 + rescue
  69 + raise "#{$query} There was a problem executing your search\n#{query_options.inspect}\n: #{$!} in #{$!.backtrace.first}"
  70 + end
  71 + end
53 72
54 - query_options[:boost_functions] = replace_types([*options[:boost_functions]], '').join(' ') if options[:boost_functions] 73 + def parse_query_fields query_options, options
  74 + options[:query_fields] ||= []
  75 + query_options[:query_fields] = replace_types([*options[:query_fields]], '').join ' '
  76 + end
  77 +
  78 + def parse_sort query_options, options
  79 + query_options[:sort] = replace_types([*options[:sort]], '')[0] if options[:sort]
  80 + end
55 81
56 - # first steps on the facet parameter processing  
57 - if options[:facets]  
58 - query_options[:facets] = {}  
59 - query_options[:facets][:limit] = -1 # TODO: make this configurable  
60 - query_options[:facets][:sort] = :count if options[:facets][:sort]  
61 - query_options[:facets][:mincount] = 0  
62 - query_options[:facets][:mincount] = 1 if options[:facets][:zeros] == false  
63 - # override the :zeros (it's deprecated anyway) if :mincount exists  
64 - query_options[:facets][:mincount] = options[:facets][:mincount] if options[:facets][:mincount]  
65 - query_options[:facets][:fields] = options[:facets][:fields].map{ |k| "#{k}_facet" } if options[:facets][:fields]  
66 - query_options[:filter_queries] += replace_types([*options[:facets][:browse]]) if options[:facets][:browse]  
67 - query_options[:facets][:queries] = replace_types([*options[:facets][:query]]) if options[:facets][:query]  
68 -  
69 - if options[:facets][:dates]  
70 - query_options[:date_facets] = {}  
71 - # if options[:facets][:dates][:fields] exists then :start, :end, and :gap must be there  
72 - if options[:facets][:dates][:fields]  
73 - [:start, :end, :gap].each { |k| raise "#{k} must be present in faceted date query" unless options[:facets][:dates].include?(k) }  
74 - query_options[:date_facets][:fields] = []  
75 - options[:facets][:dates][:fields].each { |f|  
76 - if f.kind_of? Hash  
77 - key = f.keys[0]  
78 - query_options[:date_facets][:fields] << {"#{key}_d" => f[key]}  
79 - validate_date_facet_other_options(f[key][:other]) if f[key][:other]  
80 - else  
81 - query_options[:date_facets][:fields] << "#{f}_d"  
82 - end  
83 - }  
84 - end  
85 -  
86 - query_options[:date_facets][:start] = options[:facets][:dates][:start] if options[:facets][:dates][:start]  
87 - query_options[:date_facets][:end] = options[:facets][:dates][:end] if options[:facets][:dates][:end]  
88 - query_options[:date_facets][:gap] = options[:facets][:dates][:gap] if options[:facets][:dates][:gap]  
89 - query_options[:date_facets][:hardend] = options[:facets][:dates][:hardend] if options[:facets][:dates][:hardend]  
90 - query_options[:date_facets][:filter] = replace_types([*options[:facets][:dates][:filter]].collect{|k| "#{k.dup.sub!(/ *:(?!\d) */,"_d:")}"}) if options[:facets][:dates][:filter]  
91 -  
92 - if options[:facets][:dates][:other]  
93 - validate_date_facet_other_options(options[:facets][:dates][:other])  
94 - query_options[:date_facets][:other] = options[:facets][:dates][:other]  
95 - end 82 + def parse_location query_options, options
  83 + if options[:radius]
  84 + query_options[:radius] = options[:radius]
  85 + query_options[:filter_queries] << '{!geofilt}'
  86 + end
  87 + query_options[:latitude] = options[:latitude]
  88 + query_options[:longitude] = options[:longitude]
  89 + end
96 90
  91 + def parse_highlight query_options, options
  92 + if options[:highlight]
  93 + query_options[:highlighting] = {}
  94 + query_options[:highlighting][:field_list] = replace_types([*options[:highlight][:fields]], '') if options[:highlight][:fields]
  95 + query_options[:highlighting][:require_field_match] = options[:highlight][:require_field_match] if options[:highlight][:require_field_match]
  96 + query_options[:highlighting][:max_snippets] = options[:highlight][:max_snippets] if options[:highlight][:max_snippets]
  97 + query_options[:highlighting][:prefix] = options[:highlight][:prefix] if options[:highlight][:prefix]
  98 + query_options[:highlighting][:suffix] = options[:highlight][:suffix] if options[:highlight][:suffix]
  99 + end
  100 + end
  101 +
  102 + def parse_facets query_options, options
  103 + # first steps on the facet parameter processing
  104 + if options[:facets]
  105 + query_options[:facets] = {}
  106 + query_options[:facets][:limit] = -1 # TODO: make this configurable
  107 + query_options[:facets][:sort] = :count if options[:facets][:sort]
  108 + query_options[:facets][:mincount] = 0
  109 + query_options[:facets][:mincount] = 1 if options[:facets][:zeros] == false
  110 + # override the :zeros (it's deprecated anyway) if :mincount exists
  111 + query_options[:facets][:mincount] = options[:facets][:mincount] if options[:facets][:mincount]
  112 + query_options[:facets][:fields] = options[:facets][:fields].map{ |k| "#{k}_facet" } if options[:facets][:fields]
  113 + query_options[:filter_queries] += replace_types([*options[:facets][:browse]]) if options[:facets][:browse]
  114 + query_options[:facets][:queries] = replace_types([*options[:facets][:query]]) if options[:facets][:query]
  115 +
  116 + if options[:facets][:dates]
  117 + query_options[:date_facets] = {}
  118 + # if options[:facets][:dates][:fields] exists then :start, :end, and :gap must be there
  119 + if options[:facets][:dates][:fields]
  120 + [:start, :end, :gap].each { |k| raise "#{k} must be present in faceted date query" unless options[:facets][:dates].include?(k) }
  121 + query_options[:date_facets][:fields] = []
  122 + options[:facets][:dates][:fields].each { |f|
  123 + if f.kind_of? Hash
  124 + key = f.keys[0]
  125 + query_options[:date_facets][:fields] << {"#{key}_d" => f[key]}
  126 + validate_date_facet_other_options(f[key][:other]) if f[key][:other]
  127 + else
  128 + query_options[:date_facets][:fields] << "#{f}_d"
  129 + end
  130 + }
97 end 131 end
98 - end  
99 132
100 - if options[:highlight]  
101 - query_options[:highlighting] = {}  
102 - query_options[:highlighting][:field_list] = replace_types([*options[:highlight][:fields]], '') if options[:highlight][:fields]  
103 - query_options[:highlighting][:require_field_match] = options[:highlight][:require_field_match] if options[:highlight][:require_field_match]  
104 - query_options[:highlighting][:max_snippets] = options[:highlight][:max_snippets] if options[:highlight][:max_snippets]  
105 - query_options[:highlighting][:prefix] = options[:highlight][:prefix] if options[:highlight][:prefix]  
106 - query_options[:highlighting][:suffix] = options[:highlight][:suffix] if options[:highlight][:suffix]  
107 - end 133 + query_options[:date_facets][:start] = options[:facets][:dates][:start] if options[:facets][:dates][:start]
  134 + query_options[:date_facets][:end] = options[:facets][:dates][:end] if options[:facets][:dates][:end]
  135 + query_options[:date_facets][:gap] = options[:facets][:dates][:gap] if options[:facets][:dates][:gap]
  136 + query_options[:date_facets][:hardend] = options[:facets][:dates][:hardend] if options[:facets][:dates][:hardend]
  137 + query_options[:date_facets][:filter] = replace_types([*options[:facets][:dates][:filter]].collect{|k| "#{k.dup.sub!(/ *:(?!\d) */,"_d:")}"}) if options[:facets][:dates][:filter]
108 138
109 - query_options[:sort] = replace_types([*options[:sort]], '')[0] if options[:sort] 139 + if options[:facets][:dates][:other]
  140 + validate_date_facet_other_options(options[:facets][:dates][:other])
  141 + query_options[:date_facets][:other] = options[:facets][:dates][:other]
  142 + end
110 143
111 - if options[:radius]  
112 - query_options[:radius] = options[:radius]  
113 - query_options[:filter_queries] << '{!geofilt}'  
114 end 144 end
115 - query_options[:latitude] = options[:latitude]  
116 - query_options[:longitude] = options[:longitude]  
117 -  
118 - not_dismax = query_options[:operator] == :or  
119 - request = not_dismax ? Solr::Request::Standard.new(query_options) : Solr::Request::Dismax.new(query_options)  
120 - ActsAsSolr::Post.execute(request, options[:core])  
121 - rescue  
122 - raise "#{$query} There was a problem executing your search\n#{query_options.inspect}\n: #{$!} in #{$!.backtrace.first}"  
123 end 145 end
124 end 146 end
125 147
@@ -148,21 +170,21 @@ module ActsAsSolr #:nodoc: @@ -148,21 +170,21 @@ module ActsAsSolr #:nodoc:
148 results.update :start => header['params']['start'] 170 results.update :start => header['params']['start']
149 end 171 end
150 172
151 - results.update(:facets => {'facet_fields' => []}) if options[:facets] 173 + results.update(:facets => {'facet_fields' => {}}) if options[:facets]
152 return SearchResults.new(results) if solr_data.total_hits == 0 174 return SearchResults.new(results) if solr_data.total_hits == 0
153 175
154 results.update(:facets => solr_data.data['facet_counts']) if options[:facets] 176 results.update(:facets => solr_data.data['facet_counts']) if options[:facets]
155 177
156 - ids = solr_data.hits.collect {|doc| doc["#{solr_configuration[:primary_key_field]}"]}.flatten  
157 - result = find_objects(ids, options)  
158 - results.update(:docs => result) 178 + ids = solr_data.hits.collect{ |doc| doc["#{solr_configuration[:primary_key_field]}"] }.flatten
  179 + result = find_objects ids, options
  180 + results.update :ids => ids, :docs => result
159 181
160 add_scores(result, solr_data) if options[:results_format] == :objects and options[:scores] 182 add_scores(result, solr_data) if options[:results_format] == :objects and options[:scores]
161 183
162 highlighted = {} 184 highlighted = {}
163 solr_data.highlighting.map do |x,y| 185 solr_data.highlighting.map do |x,y|
164 e={} 186 e={}
165 - y1=y.map{|x1,y1| e[x1.gsub(/_[^_]*/,"")]=y1} unless y.nil? 187 + y.map{ |x1,y1| e[x1.gsub(/_[^_]*/,"")]=y1 } unless y.nil?
166 highlighted[x.gsub(/[^:]*:/,"").to_i]=e 188 highlighted[x.gsub(/[^:]*:/,"").to_i]=e
167 end unless solr_data.highlighting.nil? 189 end unless solr_data.highlighting.nil?
168 results.update(:highlights => highlighted) 190 results.update(:highlights => highlighted)
@@ -179,8 +201,12 @@ module ActsAsSolr #:nodoc: @@ -179,8 +201,12 @@ module ActsAsSolr #:nodoc:
179 ids.collect{ |id| ActsAsSolr::LazyDocument.new(id, self) } 201 ids.collect{ |id| ActsAsSolr::LazyDocument.new(id, self) }
180 elsif options[:results_format] == :objects 202 elsif options[:results_format] == :objects
181 find_options = options[:sql_options] || {} 203 find_options = options[:sql_options] || {}
182 - find_options[:conditions] = self.send :merge_conditions, {self.primary_key => ids}, (find_options[:conditions] || [])  
183 - result = self.all(find_options) || [] 204 + if Rails::VERSION::STRING >= '3.0'
  205 + result = self.scoped(find_options).where(self.primary_key => ids).all
  206 + else
  207 + find_options[:conditions] = self.send :merge_conditions, {self.primary_key => ids}, (find_options[:conditions] || [])
  208 + result = self.all(find_options)
  209 + end
184 result = reorder(result, ids) unless find_options[:order] 210 result = reorder(result, ids) unless find_options[:order]
185 result 211 result
186 elsif options[:results_format] == :none 212 elsif options[:results_format] == :none
@@ -226,22 +252,15 @@ module ActsAsSolr #:nodoc: @@ -226,22 +252,15 @@ module ActsAsSolr #:nodoc:
226 def add_scores(results, solr_data) 252 def add_scores(results, solr_data)
227 with_score = [] 253 with_score = []
228 solr_data.hits.each do |doc| 254 solr_data.hits.each do |doc|
229 - with_score.push([doc["score"],  
230 - results.find {|record| scorable_record?(record, doc) }])  
231 - end  
232 - with_score.each do |score, object|  
233 - class << object; attr_accessor :solr_score; end  
234 - object.solr_score = score 255 + record = results.find do |result|
  256 + doc_id = doc["#{solr_configuration[:primary_key_field]}"].first rescue nil
  257 + record_id(result).to_s == doc_id
  258 + end
  259 + with_score.push [doc["score"], record]
235 end 260 end
236 - end  
237 -  
238 - def scorable_record?(record, doc)  
239 - doc_id = doc["#{solr_configuration[:primary_key_field]}"]  
240 - if doc_id.nil?  
241 - doc_id = doc["id"]  
242 - "#{record.class.name}:#{record_id(record)}" == doc_id.first.to_s  
243 - else  
244 - record_id(record).to_s == doc_id.to_s 261 + with_score.each do |score, record|
  262 + next unless record
  263 + record.solr_score = score
245 end 264 end
246 end 265 end
247 266
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/acts_as_solr/scope_with_applied_names.rb 0 → 100644
@@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
  1 +
  2 +if Rails::VERSION::STRING >= "3.2"
  3 + module ::ActiveRecord
  4 +
  5 + class Relation
  6 + attr_accessor :scopes_applied
  7 + end
  8 +
  9 + module Scoping
  10 + module Named
  11 + module ClassMethods
  12 + attr_accessor :scope_name, :scopes_applied
  13 +
  14 + def scope_with_applied_names name, scope_options = {}
  15 + name = name.to_sym
  16 + valid_scope_name?(name)
  17 + extension = Module.new(&Proc.new) if block_given?
  18 +
  19 + scope_proc = lambda do |*args|
  20 + options = scope_options.respond_to?(:call) ? unscoped { scope_options.call(*args) } : scope_options
  21 + options = scoped.apply_finder_options(options) if options.is_a?(Hash)
  22 +
  23 + relation = scoped.merge(options)
  24 + relation.scopes_applied ||= Set.new
  25 + relation.scopes_applied << name
  26 +
  27 + extension ? relation.extending(extension) : relation
  28 + end
  29 +
  30 + singleton_class.send(:redefine_method, name, &scope_proc)
  31 + end
  32 + alias_method_chain :scope, :applied_names
  33 +
  34 + end
  35 + end
  36 + end
  37 + end
  38 +else
  39 + require_dependency 'active_record/named_scope'
  40 +
  41 + module ::ActiveRecord
  42 + module NamedScope
  43 + module ClassMethods
  44 +
  45 + def named_scope_with_applied_names name, options = {}, &block
  46 + named_scope_without_applied_names name, options, &block
  47 +
  48 + name = name.to_sym
  49 + scopes[name] = lambda do |parent_scope, *args|
  50 + scope = Scope.new(parent_scope, case options
  51 + when Hash
  52 + options
  53 + when Proc
  54 + if self.model_name != parent_scope.model_name
  55 + options.bind(parent_scope).call(*args)
  56 + else
  57 + options.call(*args)
  58 + end
  59 + end, &block)
  60 + scope.scope_name = name
  61 + scope
  62 + end
  63 + end
  64 + alias_method_chain :named_scope, :applied_names
  65 + end
  66 +
  67 + class Scope
  68 + attr_accessor :scope_name, :scopes_applied
  69 +
  70 + def initialize_with_applied_names proxy_scope, options, &block
  71 + initialize_without_applied_names proxy_scope, options, &block
  72 + self.scopes_applied ||= []
  73 + self.scopes_applied += proxy_scope.send :scopes_applied if Scope === proxy_scope
  74 +
  75 + # unrelated bugfix: use if instead of unless
  76 + if (Scope === proxy_scope || ActiveRecord::Associations::AssociationCollection === proxy_scope)
  77 + @current_scoped_methods_when_defined = proxy_scope.send(:current_scoped_methods)
  78 + end
  79 + end
  80 + alias_method_chain :initialize, :applied_names
  81 +
  82 + def scope_name= name
  83 + @scope_name = name
  84 + self.scopes_applied << @scope_name
  85 + end
  86 +
  87 + end
  88 +
  89 + end
  90 + end
  91 +end
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/dismax.rb
@@ -12,13 +12,15 @@ @@ -12,13 +12,15 @@
12 12
13 class Solr::Request::Dismax < Solr::Request::Standard 13 class Solr::Request::Dismax < Solr::Request::Standard
14 14
15 - VALID_PARAMS.replace(VALID_PARAMS + [:tie_breaker, :query_fields, :minimum_match, :phrase_fields, :phrase_slop,  
16 - :alternate_query, :boost_query, :boost_functions]) 15 + VALID_PARAMS.replace VALID_PARAMS + [
  16 + :tie_breaker, :query_fields, :minimum_match, :phrase_fields, :phrase_slop,
  17 + :alternate_query, :boost_query, :boost_functions,
  18 + ]
17 19
18 def initialize(params) 20 def initialize(params)
19 super 21 super
20 end 22 end
21 - 23 +
22 def to_hash 24 def to_hash
23 hash = super 25 hash = super
24 hash[:defType] = 'edismax' 26 hash[:defType] = 'edismax'
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/solr/request/standard.rb
@@ -12,40 +12,42 @@ @@ -12,40 +12,42 @@
12 12
13 class Solr::Request::Standard < Solr::Request::Select 13 class Solr::Request::Standard < Solr::Request::Select
14 14
15 - VALID_PARAMS = [:query, :sort, :default_field, :operator, :start, :rows, :shards, :date_facets,  
16 - :filter_queries, :field_list, :debug_query, :explain_other, :facets, :highlighting, :mlt, :radius,  
17 - :radius, :latitude, :longitude, :spellcheck]  
18 - 15 + VALID_PARAMS = [
  16 + :query, :sort, :default_field, :operator, :start, :rows, :shards, :date_facets,
  17 + :filter_queries, :field_list, :debug_query, :explain_other, :facets, :highlighting, :mlt, :radius,
  18 + :radius, :latitude, :longitude, :spellcheck,
  19 + ]
  20 +
19 def initialize(params) 21 def initialize(params)
20 super 'search' 22 super 'search'
21 -  
22 - raise "Invalid parameters: #{(params.keys - VALID_PARAMS).join(',')}" unless 23 +
  24 + raise "Invalid parameters: #{(params.keys - VALID_PARAMS).join(',')}" unless
23 (params.keys - VALID_PARAMS).empty? 25 (params.keys - VALID_PARAMS).empty?
24 - 26 +
25 raise ":query parameter required" unless params[:query] 27 raise ":query parameter required" unless params[:query]
26 - 28 +
27 @params = params.dup 29 @params = params.dup
28 - 30 +
29 # Validate operator 31 # Validate operator
30 if params[:operator] 32 if params[:operator]
31 - raise "Only :and/:or operators allowed" unless 33 + raise "Only :and/:or operators allowed" unless
32 [:and, :or].include?(params[:operator]) 34 [:and, :or].include?(params[:operator])
33 - 35 +
34 @params[:operator] = params[:operator].to_s.upcase 36 @params[:operator] = params[:operator].to_s.upcase
35 end 37 end
36 38
37 # Validate start, rows can be transformed to ints 39 # Validate start, rows can be transformed to ints
38 @params[:start] = params[:start].to_i if params[:start] 40 @params[:start] = params[:start].to_i if params[:start]
39 @params[:rows] = params[:rows].to_i if params[:rows] 41 @params[:rows] = params[:rows].to_i if params[:rows]
40 - 42 +
41 @params[:field_list] ||= ["*","score"] 43 @params[:field_list] ||= ["*","score"]
42 - 44 +
43 @params[:shards] ||= [] 45 @params[:shards] ||= []
44 end 46 end
45 - 47 +
46 def to_hash 48 def to_hash
47 hash = {} 49 hash = {}
48 - 50 +
49 # standard request param processing 51 # standard request param processing
50 hash[:sort] = @params[:sort] 52 hash[:sort] = @params[:sort]
51 hash[:q] = @params[:query] 53 hash[:q] = @params[:query]
@@ -61,11 +63,11 @@ class Solr::Request::Standard &lt; Solr::Request::Select @@ -61,11 +63,11 @@ class Solr::Request::Standard &lt; Solr::Request::Select
61 hash[:debugQuery] = @params[:debug_query] 63 hash[:debugQuery] = @params[:debug_query]
62 hash[:explainOther] = @params[:explain_other] 64 hash[:explainOther] = @params[:explain_other]
63 hash[:shards] = @params[:shards].join(',') unless @params[:shards].empty? 65 hash[:shards] = @params[:shards].join(',') unless @params[:shards].empty?
64 - 66 +
65 hash[:sfield] = 'latlng' 67 hash[:sfield] = 'latlng'
66 hash[:d] = @params[:radius] 68 hash[:d] = @params[:radius]
67 hash[:pt] = "#{@params[:latitude]}, #{@params[:longitude]}" if @params[:latitude] and @params[:longitude] 69 hash[:pt] = "#{@params[:latitude]}, #{@params[:longitude]}" if @params[:latitude] and @params[:longitude]
68 - 70 +
69 # facet parameter processing 71 # facet parameter processing
70 if @params[:facets] 72 if @params[:facets]
71 # TODO need validation of all that is under the :facets Hash too 73 # TODO need validation of all that is under the :facets Hash too
@@ -95,7 +97,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select @@ -95,7 +97,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select
95 end 97 end
96 end 98 end
97 end 99 end
98 - 100 +
99 if @params[:date_facets] 101 if @params[:date_facets]
100 hash["facet.date"] = [] 102 hash["facet.date"] = []
101 if @params[:date_facets][:fields] 103 if @params[:date_facets][:fields]
@@ -125,7 +127,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select @@ -125,7 +127,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select
125 end 127 end
126 end 128 end
127 end 129 end
128 - 130 +
129 # highlighting parameter processing - http://wiki.apache.org/solr/HighlightingParameters 131 # highlighting parameter processing - http://wiki.apache.org/solr/HighlightingParameters
130 if @params[:highlighting] 132 if @params[:highlighting]
131 hash[:hl] = true 133 hash[:hl] = true
@@ -385,7 +387,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select @@ -385,7 +387,7 @@ class Solr::Request::Standard &lt; Solr::Request::Select
385 end 387 end
386 388
387 end 389 end
388 - 390 +
389 if @params[:mlt] 391 if @params[:mlt]
390 hash[:mlt] = true 392 hash[:mlt] = true
391 hash["mlt.count"] = @params[:mlt][:count] 393 hash["mlt.count"] = @params[:mlt][:count]
@@ -398,10 +400,10 @@ class Solr::Request::Standard &lt; Solr::Request::Select @@ -398,10 +400,10 @@ class Solr::Request::Standard &lt; Solr::Request::Select
398 hash["mlt.maxntp"] = @params[:mlt][:max_tokens_parsed] 400 hash["mlt.maxntp"] = @params[:mlt][:max_tokens_parsed]
399 hash["mlt.boost"] = @params[:mlt][:boost] 401 hash["mlt.boost"] = @params[:mlt][:boost]
400 end 402 end
401 - 403 +
402 hash[:spellcheck] = true 404 hash[:spellcheck] = true
403 hash['spellcheck.collate'] = true 405 hash['spellcheck.collate'] = true
404 - 406 +
405 hash.merge(super.to_hash) 407 hash.merge(super.to_hash)
406 end 408 end
407 409
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/solr/response/ruby.rb
@@ -14,13 +14,14 @@ class Solr::Response::Ruby &lt; Solr::Response::Base @@ -14,13 +14,14 @@ class Solr::Response::Ruby &lt; Solr::Response::Base
14 attr_reader :data, :header 14 attr_reader :data, :header
15 15
16 def initialize(ruby_code) 16 def initialize(ruby_code)
  17 + ruby_code.force_encoding('UTF-8') if RUBY_VERSION >= '1.9'
17 super 18 super
18 begin 19 begin
19 #TODO: what about pulling up data/header/response to ResponseBase, 20 #TODO: what about pulling up data/header/response to ResponseBase,
20 # or maybe a new middle class like SelectResponseBase since 21 # or maybe a new middle class like SelectResponseBase since
21 # all Select queries return this same sort of stuff?? 22 # all Select queries return this same sort of stuff??
22 # XML (&wt=xml) and Ruby (&wt=ruby) responses contain exactly the same structure. 23 # XML (&wt=xml) and Ruby (&wt=ruby) responses contain exactly the same structure.
23 - # a goal of solrb is to make it irrelevant which gets used under the hood, 24 + # a goal of solrb is to make it irrelevant which gets used under the hood,
24 # but favor Ruby responses. 25 # but favor Ruby responses.
25 @data = eval(ruby_code) 26 @data = eval(ruby_code)
26 @header = @data['responseHeader'] 27 @header = @data['responseHeader']
@@ -38,5 +39,5 @@ class Solr::Response::Ruby &lt; Solr::Response::Base @@ -38,5 +39,5 @@ class Solr::Response::Ruby &lt; Solr::Response::Base
38 def query_time 39 def query_time
39 @header['QTime'] 40 @header['QTime']
40 end 41 end
41 - 42 +
42 end 43 end
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/solr/response/xml.rb
@@ -18,7 +18,7 @@ class Solr::Response::Xml &lt; Solr::Response::Base @@ -18,7 +18,7 @@ class Solr::Response::Xml &lt; Solr::Response::Base
18 # parse the xml 18 # parse the xml
19 @doc = REXML::Document.new(xml) 19 @doc = REXML::Document.new(xml)
20 20
21 - # look for the result code and string 21 + # look for the result code and string
22 # <?xml version="1.0" encoding="UTF-8"?> 22 # <?xml version="1.0" encoding="UTF-8"?>
23 # <response> 23 # <response>
24 # <lst name="responseHeader"><int name="status">0</int><int name="QTime">2</int></lst> 24 # <lst name="responseHeader"><int name="status">0</int><int name="QTime">2</int></lst>
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/tasks/database.rake
@@ -5,12 +5,12 @@ namespace :db do @@ -5,12 +5,12 @@ namespace :db do
5 begin 5 begin
6 ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => "*:*")) 6 ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => "*:*"))
7 ActsAsSolr::Post.execute(Solr::Request::Commit.new) 7 ActsAsSolr::Post.execute(Solr::Request::Commit.new)
8 - (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'test', 'fixtures', '*.{yml,csv}'))).each do |fixture_file| 8 + (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(Rails.root, 'test', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
9 ActsAsSolr::SolrFixtures.load(File.basename(fixture_file, '.*')) 9 ActsAsSolr::SolrFixtures.load(File.basename(fixture_file, '.*'))
10 - end  
11 - puts "The fixtures loaded have been added to Solr" 10 + end
  11 + puts "The fixtures loaded have been added to Solr"
12 rescue 12 rescue
13 end 13 end
14 end 14 end
15 end 15 end
16 -end  
17 \ No newline at end of file 16 \ No newline at end of file
  17 +end
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/tasks/jeweler.rake 0 → 100644
@@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
  1 +begin
  2 + require 'jeweler'
  3 +rescue LoadError
  4 +end
  5 +
  6 +Jeweler::Tasks.new do |s|
  7 + s.name = "acts_as_solr_reloaded"
  8 + s.summary = "This gem adds full text search capabilities and many other nifty features from Apache Solr to any Rails model."
  9 + s.email = "dc.rec1@gmail.com"
  10 + s.homepage = "http://github.com/dcrec1/acts_as_solr_reloaded"
  11 + s.description = "This gem adds full text search capabilities and many other nifty features from Apache Solr to any Rails model."
  12 + s.authors = ["Diego Carrion"]
  13 + s.files = FileList["[A-Z]*", "{bin,generators,config,lib,solr}/**/*"] +
  14 + FileList["test/**/*"].reject {|f| f.include?("test/log")}.reject {|f| f.include?("test/tmp")}
  15 +end if defined? Jeweler
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/tasks/rdoc.rake 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +require 'rake/testtask'
  2 +require 'rdoc/task'
  3 +
  4 +Rake::RDocTask.new do |rd|
  5 + rd.main = "README.rdoc"
  6 + rd.rdoc_dir = "rdoc"
  7 + rd.rdoc_files.exclude("lib/solr/**/*.rb", "lib/solr.rb")
  8 + rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
  9 +end
  10 +
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/tasks/solr.rake
@@ -158,7 +158,7 @@ namespace :solr do @@ -158,7 +158,7 @@ namespace :solr do
158 158
159 logger = ActiveRecord::Base.logger = Logger.new(STDOUT) 159 logger = ActiveRecord::Base.logger = Logger.new(STDOUT)
160 logger.level = ActiveSupport::BufferedLogger::INFO unless debug_output 160 logger.level = ActiveSupport::BufferedLogger::INFO unless debug_output
161 - Dir["#{RAILS_ROOT}/app/models/*.rb"].each{ |file| require file } 161 + Dir["#{Rails.root}/app/models/*.rb"].each{ |file| require file }
162 162
163 if start_server 163 if start_server
164 puts "Starting Solr server..." 164 puts "Starting Solr server..."
plugins/solr/vendor/plugins/acts_as_solr_reloaded/lib/tasks/test.rake
@@ -1,5 +0,0 @@ @@ -1,5 +0,0 @@
1 -namespace :test do  
2 - task :migrate do  
3 - ActiveRecord::Migrator.migrate("test/db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)  
4 - end  
5 -end  
plugins/solr/vendor/plugins/acts_as_solr_reloaded/solr/solr/conf/schema.xml
@@ -57,11 +57,9 @@ @@ -57,11 +57,9 @@
57 <fieldType name="text" class="solr.TextField" autoGeneratePhraseQueries="false"> 57 <fieldType name="text" class="solr.TextField" autoGeneratePhraseQueries="false">
58 <analyzer type="index"> 58 <analyzer type="index">
59 <tokenizer class="solr.StandardTokenizerFactory"/> 59 <tokenizer class="solr.StandardTokenizerFactory"/>
60 - <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>  
61 -  
62 <filter class="solr.ASCIIFoldingFilterFactory"/> 60 <filter class="solr.ASCIIFoldingFilterFactory"/>
63 <filter class="solr.LowerCaseFilterFactory"/> 61 <filter class="solr.LowerCaseFilterFactory"/>
64 - 62 + <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
65 <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" /> 63 <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" />
66 64
67 <!-- stemming 65 <!-- stemming
@@ -73,18 +71,12 @@ @@ -73,18 +71,12 @@
73 <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" /> 71 <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" />
74 <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" /> 72 <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" />
75 --> 73 -->
76 -  
77 - <!-- improvised stemming  
78 - <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/>  
79 - -->  
80 </analyzer> 74 </analyzer>
81 <analyzer type="query"> 75 <analyzer type="query">
82 <tokenizer class="solr.StandardTokenizerFactory"/> 76 <tokenizer class="solr.StandardTokenizerFactory"/>
83 - <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>  
84 -  
85 <filter class="solr.ASCIIFoldingFilterFactory"/> 77 <filter class="solr.ASCIIFoldingFilterFactory"/>
86 <filter class="solr.LowerCaseFilterFactory"/> 78 <filter class="solr.LowerCaseFilterFactory"/>
87 - 79 + <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
88 <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" /> 80 <filter class="solr.StopFilterFactory" words="stopwords.pt.txt" />
89 81
90 <!-- stemming 82 <!-- stemming
@@ -96,10 +88,23 @@ @@ -96,10 +88,23 @@
96 <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" /> 88 <filter class="solr.HunspellStemFilterFactory" dictionary="en_US.dic" affix="en_US.aff" ignoreCase="true" />
97 <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" /> 89 <filter class="solr.HunspellStemFilterFactory" dictionary="pt_PT.dic" affix="pt_PT.aff" ignoreCase="true" />
98 --> 90 -->
  91 + </analyzer>
  92 + </fieldType>
99 93
100 - <!-- improvised stemming  
101 - <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front"/>  
102 - --> 94 + <fieldType name="ngramText" class="solr.TextField" positionIncrementGap="100">
  95 + <analyzer type="index">
  96 + <tokenizer class="solr.StandardTokenizerFactory"/>
  97 + <filter class="solr.ASCIIFoldingFilterFactory"/>
  98 + <filter class="solr.LowerCaseFilterFactory"/>
  99 + <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  100 +
  101 + <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="20" side="front"/>
  102 + </analyzer>
  103 + <analyzer type="query">
  104 + <tokenizer class="solr.StandardTokenizerFactory"/>
  105 + <filter class="solr.ASCIIFoldingFilterFactory"/>
  106 + <filter class="solr.LowerCaseFilterFactory"/>
  107 + <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
103 </analyzer> 108 </analyzer>
104 </fieldType> 109 </fieldType>
105 110
@@ -151,6 +156,7 @@ @@ -151,6 +156,7 @@
151 <dynamicField name="*sortable_do" type="sdouble" indexed="true" stored="false" multiValued="false"/> 156 <dynamicField name="*sortable_do" type="sdouble" indexed="true" stored="false" multiValued="false"/>
152 157
153 <dynamicField name="*_t" type="text" indexed="true" stored="true" multiValued="true"/> 158 <dynamicField name="*_t" type="text" indexed="true" stored="true" multiValued="true"/>
  159 + <dynamicField name="*_nt" type="ngramText" indexed="true" stored="true" multiValued="true"/>
154 <dynamicField name="*_s" type="text" indexed="true" stored="true" multiValued="false"/> 160 <dynamicField name="*_s" type="text" indexed="true" stored="true" multiValued="false"/>
155 <dynamicField name="*_i" type="integer" indexed="true" stored="false" multiValued="true"/> 161 <dynamicField name="*_i" type="integer" indexed="true" stored="false" multiValued="true"/>
156 <dynamicField name="*_f" type="float" indexed="true" stored="true" multiValued="false"/> 162 <dynamicField name="*_f" type="float" indexed="true" stored="true" multiValued="false"/>
@@ -168,6 +174,7 @@ @@ -168,6 +174,7 @@
168 <field name="geo_distance" type="sdouble"/> <!-- Optional but used for distributed searching --> 174 <field name="geo_distance" type="sdouble"/> <!-- Optional but used for distributed searching -->
169 175
170 <field name="text" type="text" indexed="true" stored="false" multiValued="true"/> 176 <field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
  177 + <field name="ngramText" type="ngramText" indexed="true" stored="false" multiValued="true"/>
171 <field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/> 178 <field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>
172 179
173 <dynamicField name="*_s_mv" type="string" indexed="true" stored="false" multiValued="true"/> 180 <dynamicField name="*_s_mv" type="string" indexed="true" stored="false" multiValued="true"/>
@@ -187,6 +194,10 @@ @@ -187,6 +194,10 @@
187 <copyField source="*_do" dest="text"/> 194 <copyField source="*_do" dest="text"/>
188 <copyField source="*_facet" dest="text"/> 195 <copyField source="*_facet" dest="text"/>
189 196
  197 + <copyField source="*_s" dest="ngramText"/>
  198 + <copyField source="*_t" dest="ngramText"/>
  199 + <copyField source="*_nt" dest="ngramText"/>
  200 +
190 <copyField source="*_s" dest="spell"/> 201 <copyField source="*_s" dest="spell"/>
191 <copyField source="*_t" dest="spell"/> 202 <copyField source="*_t" dest="spell"/>
192 <copyField source="*_facet" dest="spell"/> 203 <copyField source="*_facet" dest="spell"/>
plugins/solr/vendor/plugins/acts_as_solr_reloaded/solr_test_rakefile.rb
@@ -2,5 +2,4 @@ require &#39;rubygems&#39; @@ -2,5 +2,4 @@ require &#39;rubygems&#39;
2 require 'rake' 2 require 'rake'
3 dir = File.dirname(__FILE__) 3 dir = File.dirname(__FILE__)
4 $:.unshift("#{dir}/lib") 4 $:.unshift("#{dir}/lib")
5 -RAILS_ROOT = dir  
6 require "acts_as_solr/tasks" 5 require "acts_as_solr/tasks"
plugins/solr/vendor/plugins/acts_as_solr_reloaded/test/fixtures/locals.yml 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +home:
  2 + id: 1
  3 + longitude: -77.4027
  4 + latitude: 39.36
  5 +
  6 +work:
  7 + id: 2
  8 + longitude: -77.4027
  9 + latitude: 38.36
plugins/solr/vendor/plugins/acts_as_solr_reloaded/test/test_helper.rb
@@ -16,7 +16,7 @@ require &#39;mongo_mapper&#39; @@ -16,7 +16,7 @@ require &#39;mongo_mapper&#39;
16 16
17 class Rails 17 class Rails
18 def self.root 18 def self.root
19 - RAILS_ROOT 19 + Rails.root
20 end 20 end
21 21
22 def self.env 22 def self.env
@@ -26,13 +26,14 @@ end @@ -26,13 +26,14 @@ end
26 26
27 MongoMapper.database = "acts_as_solr_reloaded-test" 27 MongoMapper.database = "acts_as_solr_reloaded-test"
28 28
29 -RAILS_ROOT = File.dirname(__FILE__) unless defined? RAILS_ROOT  
30 -RAILS_ENV = 'test' unless defined? RAILS_ENV 29 +RAILS_ENV = 'test' unless defined? RAILS_ENV
31 ENV["RAILS_ENV"] = "test" 30 ENV["RAILS_ENV"] = "test"
32 31
33 require File.expand_path(File.dirname(__FILE__) + '/../config/solr_environment') 32 require File.expand_path(File.dirname(__FILE__) + '/../config/solr_environment')
34 require File.expand_path(File.dirname(__FILE__) + '/../lib/acts_as_solr') 33 require File.expand_path(File.dirname(__FILE__) + '/../lib/acts_as_solr')
35 34
  35 +ActiveRecord::Base.logger = Logger.new('/dev/null')
  36 +
36 # Load Models 37 # Load Models
37 models_dir = File.join(File.dirname( __FILE__ ), 'models') 38 models_dir = File.join(File.dirname( __FILE__ ), 'models')
38 require "#{models_dir}/book.rb" 39 require "#{models_dir}/book.rb"
@@ -60,10 +61,10 @@ class Test::Unit::TestCase @@ -60,10 +61,10 @@ class Test::Unit::TestCase
60 klass = instance_eval table_name.to_s.capitalize.singularize 61 klass = instance_eval table_name.to_s.capitalize.singularize
61 klass.find(:all).each{|content| content.solr_save} 62 klass.find(:all).each{|content| content.solr_save}
62 end 63 end
63 - 64 +
64 clear_from_solr(:novels) 65 clear_from_solr(:novels)
65 end 66 end
66 - 67 +
67 private 68 private
68 def self.clear_from_solr(table_name) 69 def self.clear_from_solr(table_name)
69 ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => "type_s:#{table_name.to_s.capitalize.singularize}")) 70 ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => "type_s:#{table_name.to_s.capitalize.singularize}"))
plugins/solr/vendor/plugins/named_scope_with_applied_names/init.rb
@@ -1,57 +0,0 @@ @@ -1,57 +0,0 @@
1 -require_dependency 'active_record/named_scope'  
2 -  
3 -if Rails::VERSION::STRING < "2.3.99"  
4 -  
5 - module ::ActiveRecord  
6 -  
7 - module NamedScope  
8 -  
9 - module ClassMethods  
10 -  
11 - def named_scope_with_applied_names name, options = {}, &block  
12 - named_scope_without_applied_names name, options, &block  
13 -  
14 - name = name.to_sym  
15 - scopes[name] = lambda do |parent_scope, *args|  
16 - scope = Scope.new(parent_scope, case options  
17 - when Hash  
18 - options  
19 - when Proc  
20 - if self.model_name != parent_scope.model_name  
21 - options.bind(parent_scope).call(*args)  
22 - else  
23 - options.call(*args)  
24 - end  
25 - end, &block)  
26 - scope.scope_name = name  
27 - scope  
28 - end  
29 - end  
30 - alias_method_chain :named_scope, :applied_names  
31 - end  
32 -  
33 - class Scope  
34 - attr_accessor :scope_name, :scopes_applied  
35 -  
36 - def initialize_with_applied_names proxy_scope, options, &block  
37 - initialize_without_applied_names proxy_scope, options, &block  
38 - self.scopes_applied ||= []  
39 - self.scopes_applied += proxy_scope.send :scopes_applied if Scope === proxy_scope  
40 -  
41 - # unrelated bugfix: use if instead of unless  
42 - if (Scope === proxy_scope || ActiveRecord::Associations::AssociationCollection === proxy_scope)  
43 - @current_scoped_methods_when_defined = proxy_scope.send(:current_scoped_methods)  
44 - end  
45 - end  
46 - alias_method_chain :initialize, :applied_names  
47 -  
48 - def scope_name= name  
49 - @scope_name = name  
50 - self.scopes_applied << @scope_name  
51 - end  
52 -  
53 - end  
54 -  
55 - end  
56 - end  
57 -end  
script/install-dependencies/debian-wheezy.sh
@@ -50,6 +50,13 @@ FPQAoNmiMgP6zGF9rgOEWMEiFEryayrz @@ -50,6 +50,13 @@ FPQAoNmiMgP6zGF9rgOEWMEiFEryayrz
50 EOF 50 EOF
51 fi 51 fi
52 52
  53 +if test -f tmp/debian/Release.gpg; then
  54 + echo "deb file://$(pwd)/tmp/debian/ ./" | sudo tee /etc/apt/sources.list.d/local.list
  55 + sudo apt-key add tmp/debian/signing-key.asc
  56 +else
  57 + sudo rm -f /etc/apt/sources.list.d/local.list
  58 +fi
  59 +
53 run sudo apt-get update 60 run sudo apt-get update
54 run sudo apt-get -qy dist-upgrade 61 run sudo apt-get -qy dist-upgrade
55 62
script/install-dependencies/ubuntu-precise.sh 0 → 100644
@@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
  1 +#!/bin/sh
  2 +
  3 +export DEBIAN_INTERFACE=noninteractive
  4 +
  5 +#run sudo apt-get update
  6 +#run sudo apt-get dist-upgrade -qy
  7 +
  8 +run sudo apt-get install -qy dctrl-tools
  9 +
  10 +packages=$(grep-dctrl -n -s Build-Depends,Depends,Recommends -S -X noosfero debian/control | sed -e 's/([^)]*)//g; s/,\s*/\n/g' | grep -v 'rake\|ruby\|thin\|debhelper\|cucumber\|rail\|memcached\|debconf\|dbconfig-common\|misc:Depends\|adduser\|mail-transport-agent')
  11 +
  12 +run sudo apt-get install -qy ruby1.9.1-full build-essential libxml2-dev libxslt-dev libpq-dev libmagickcore-dev libmagickwand-dev $packages
  13 +
  14 +
  15 +export GEM_HOME=$(ruby -e 'puts Gem.user_dir')
  16 +export PATH="${GEM_HOME}/bin:${PATH}"
  17 +(gem list | grep bundler) || run gem install --no-rdoc --no-ri bundler
  18 +run bundle install
  19 +
  20 +sudo tee /etc/profile.d/rubygems-path.sh <<EOF
  21 +export GEM_HOME=\$(ruby -e 'puts Gem.user_dir')
  22 +PATH="\${GEM_HOME}/bin:\${PATH}"
  23 +EOF
script/noosfero-plugins
@@ -6,7 +6,9 @@ program_name=$(basename $0) @@ -6,7 +6,9 @@ program_name=$(basename $0)
6 6
7 if [ -e /etc/default/noosfero ]; then 7 if [ -e /etc/default/noosfero ]; then
8 . /etc/default/noosfero 8 . /etc/default/noosfero
9 -else 9 +fi
  10 +
  11 +if [ -z "$NOOSFERO_DIR"]; then
10 this_script=$(readlink -f $0) 12 this_script=$(readlink -f $0)
11 NOOSFERO_DIR=$(dirname $this_script | xargs dirname) 13 NOOSFERO_DIR=$(dirname $this_script | xargs dirname)
12 fi 14 fi
script/quick-start
@@ -2,12 +2,20 @@ @@ -2,12 +2,20 @@
2 2
3 say() { 3 say() {
4 msg="$@" 4 msg="$@"
5 - printf "\033[1;34;49m%s\033[m\n" "$msg" 5 + if [ -t 1 ]; then
  6 + printf "\033[1;34;49m%s\033[m\n" "$msg"
  7 + else
  8 + echo "$msg"
  9 + fi
6 } 10 }
7 11
8 complain() { 12 complain() {
9 msg="$@" 13 msg="$@"
10 - printf "\033[1;31;49m%s\033[m\n" "$msg" 14 + if [ -t 1 ]; then
  15 + printf "\033[1;31;49m%s\033[m\n" "$msg"
  16 + else
  17 + echo "$msg"
  18 + fi
11 } 19 }
12 20
13 run() { 21 run() {
test/factories.rb
@@ -174,7 +174,11 @@ module Noosfero::Factory @@ -174,7 +174,11 @@ module Noosfero::Factory
174 ############################################### 174 ###############################################
175 175
176 def defaults_for_environment 176 def defaults_for_environment
177 - { :name => 'Environment ' + factory_num_seq.to_s } 177 + seq = factory_num_seq
  178 + {
  179 + :name => "Environment %d" % seq,
  180 + :contact_email => "environment%d@example.com" % seq
  181 + }
178 end 182 end
179 183
180 ############################################### 184 ###############################################
test/functional/account_controller_test.rb
@@ -637,6 +637,23 @@ class AccountControllerTest &lt; ActionController::TestCase @@ -637,6 +637,23 @@ class AccountControllerTest &lt; ActionController::TestCase
637 assert_equal 'example.com', Person['testuser'].organization 637 assert_equal 'example.com', Person['testuser'].organization
638 end 638 end
639 639
  640 + should "create a new user with image" do
  641 + post :signup, :user => {
  642 + :login => 'testuser', :password => '123456', :password_confirmation => '123456', :email => 'testuser@example.com'
  643 + },
  644 + :profile_data => {
  645 + :organization => 'example.com'
  646 + },
  647 + :file => {
  648 + :image => fixture_file_upload('/files/rails.png', 'image/png')
  649 + }
  650 +
  651 + assert_response :success
  652 +
  653 + person = Person["testuser"]
  654 + assert_equal "rails.png", person.image.filename
  655 + end
  656 +
640 should 'activate user after signup if environment is set to skip confirmation' do 657 should 'activate user after signup if environment is set to skip confirmation' do
641 env = Environment.default 658 env = Environment.default
642 env.enable('skip_new_user_email_confirmation') 659 env.enable('skip_new_user_email_confirmation')
@@ -965,6 +982,7 @@ class AccountControllerTest &lt; ActionController::TestCase @@ -965,6 +982,7 @@ class AccountControllerTest &lt; ActionController::TestCase
965 end 982 end
966 983
967 protected 984 protected
  985 +
968 def new_user(options = {}, extra_options ={}) 986 def new_user(options = {}, extra_options ={})
969 data = {:profile_data => person_data} 987 data = {:profile_data => person_data}
970 if extra_options[:profile_data] 988 if extra_options[:profile_data]
test/functional/profile_controller_test.rb
@@ -78,7 +78,7 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -78,7 +78,7 @@ class ProfileControllerTest &lt; ActionController::TestCase
78 78
79 should 'actually add friend' do 79 should 'actually add friend' do
80 login_as(@profile.identifier) 80 login_as(@profile.identifier)
81 - person = fast_create(Person) 81 + person = create_user.person
82 assert_difference 'AddFriend.count' do 82 assert_difference 'AddFriend.count' do
83 post :add, :profile => person.identifier 83 post :add, :profile => person.identifier
84 end 84 end
@@ -366,10 +366,10 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -366,10 +366,10 @@ class ProfileControllerTest &lt; ActionController::TestCase
366 assert profile.memberships.include?(community), 'profile should be actually added to the community' 366 assert profile.memberships.include?(community), 'profile should be actually added to the community'
367 end 367 end
368 368
369 - should 'create task when join to closed organization with members' do 369 + should 'create a task when joining a closed organization with members' do
370 community = fast_create(Community) 370 community = fast_create(Community)
371 community.update_attribute(:closed, true) 371 community.update_attribute(:closed, true)
372 - admin = fast_create(Person) 372 + admin = create_user.person
373 community.add_member(admin) 373 community.add_member(admin)
374 374
375 login_as profile.identifier 375 login_as profile.identifier
@@ -587,7 +587,7 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -587,7 +587,7 @@ class ProfileControllerTest &lt; ActionController::TestCase
587 should "leave a scrap on another profile" do 587 should "leave a scrap on another profile" do
588 login_as(profile.identifier) 588 login_as(profile.identifier)
589 count = Scrap.count 589 count = Scrap.count
590 - another_person = fast_create(Person) 590 + another_person = create_user.person
591 assert another_person.scraps_received.empty? 591 assert another_person.scraps_received.empty?
592 post :leave_scrap, :profile => another_person.identifier, :scrap => {:content => 'something'} 592 post :leave_scrap, :profile => another_person.identifier, :scrap => {:content => 'something'}
593 assert_equal count + 1, Scrap.count 593 assert_equal count + 1, Scrap.count
@@ -645,7 +645,7 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -645,7 +645,7 @@ class ProfileControllerTest &lt; ActionController::TestCase
645 should "the sender be the logged user by default" do 645 should "the sender be the logged user by default" do
646 login_as(profile.identifier) 646 login_as(profile.identifier)
647 count = Scrap.count 647 count = Scrap.count
648 - another_person = fast_create(Person) 648 + another_person = create_user.person
649 post :leave_scrap, :profile => another_person.identifier, :scrap => {:content => 'something'} 649 post :leave_scrap, :profile => another_person.identifier, :scrap => {:content => 'something'}
650 last = Scrap.last 650 last = Scrap.last
651 assert_equal profile, last.sender 651 assert_equal profile, last.sender
@@ -654,7 +654,7 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -654,7 +654,7 @@ class ProfileControllerTest &lt; ActionController::TestCase
654 should "the receiver be the current profile by default" do 654 should "the receiver be the current profile by default" do
655 login_as(profile.identifier) 655 login_as(profile.identifier)
656 count = Scrap.count 656 count = Scrap.count
657 - another_person = fast_create(Person) 657 + another_person = create_user.person
658 post :leave_scrap, :profile => another_person.identifier, :scrap => {:content => 'something'} 658 post :leave_scrap, :profile => another_person.identifier, :scrap => {:content => 'something'}
659 last = Scrap.last 659 last = Scrap.last
660 assert_equal another_person, last.receiver 660 assert_equal another_person, last.receiver
@@ -686,8 +686,8 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -686,8 +686,8 @@ class ProfileControllerTest &lt; ActionController::TestCase
686 end 686 end
687 687
688 should 'not display activities of the current profile when he is not followed by the viewer' do 688 should 'not display activities of the current profile when he is not followed by the viewer' do
689 - p1= fast_create(Person)  
690 - p2= fast_create(Person) 689 + p1= create_user.person
  690 + p2= create_user.person
691 691
692 UserStampSweeper.any_instance.stubs(:current_user).returns(p1) 692 UserStampSweeper.any_instance.stubs(:current_user).returns(p1)
693 scrap1 = create(Scrap, defaults_for_scrap(:sender => p1, :receiver => p2)) 693 scrap1 = create(Scrap, defaults_for_scrap(:sender => p1, :receiver => p2))
@@ -714,9 +714,9 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -714,9 +714,9 @@ class ProfileControllerTest &lt; ActionController::TestCase
714 end 714 end
715 715
716 should 'not see the friends activities in the current profile' do 716 should 'not see the friends activities in the current profile' do
717 - p2= fast_create(Person) 717 + p2 = create_user.person
718 assert !profile.is_a_friend?(p2) 718 assert !profile.is_a_friend?(p2)
719 - p3= fast_create(Person) 719 + p3 = create_user.person
720 p3.add_friend(profile) 720 p3.add_friend(profile)
721 assert p3.is_a_friend?(profile) 721 assert p3.is_a_friend?(profile)
722 ActionTracker::Record.destroy_all 722 ActionTracker::Record.destroy_all
@@ -737,13 +737,13 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -737,13 +737,13 @@ class ProfileControllerTest &lt; ActionController::TestCase
737 end 737 end
738 738
739 should 'see all the activities in the current profile network' do 739 should 'see all the activities in the current profile network' do
740 - p1= fast_create(Person)  
741 - p2= fast_create(Person) 740 + p1= create_user.person
  741 + p2= create_user.person
742 assert !p1.is_a_friend?(p2) 742 assert !p1.is_a_friend?(p2)
743 743
744 - p3= fast_create(Person) 744 + p3= create_user.person
745 p3.add_friend(p1) 745 p3.add_friend(p1)
746 - assert p3.is_a_friend?(p1) 746 + p1.add_friend(p3)
747 747
748 ActionTracker::Record.delete_all 748 ActionTracker::Record.delete_all
749 749
@@ -759,27 +759,21 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -759,27 +759,21 @@ class ProfileControllerTest &lt; ActionController::TestCase
759 create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1)) 759 create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1))
760 a3 = ActionTracker::Record.last 760 a3 = ActionTracker::Record.last
761 761
762 - @controller.stubs(:logged_in?).returns(true)  
763 - user = mock()  
764 - user.stubs(:person).returns(p3)  
765 - user.stubs(:login).returns('some')  
766 - @controller.stubs(:current_user).returns(user)  
767 - Person.any_instance.stubs(:follows?).returns(true)  
768 -  
769 process_delayed_job_queue 762 process_delayed_job_queue
770 - get :index, :profile => p1.identifier  
771 763
  764 + login_as p3.user.login
  765 + get :index, :profile => p1.identifier
772 assert_equivalent [a1,a3].map(&:id), assigns(:network_activities).map(&:id) 766 assert_equivalent [a1,a3].map(&:id), assigns(:network_activities).map(&:id)
773 end 767 end
774 768
775 should 'the network activity be visible only to profile followers' do 769 should 'the network activity be visible only to profile followers' do
776 - p1= fast_create(Person)  
777 - p2= fast_create(Person) 770 + p1= create_user.person
  771 + p2= create_user.person
778 assert !p1.is_a_friend?(p2) 772 assert !p1.is_a_friend?(p2)
779 773
780 - p3= fast_create(Person) 774 + p3= create_user.person
781 p3.add_friend(p1) 775 p3.add_friend(p1)
782 - assert p3.is_a_friend?(p1) 776 + p1.add_friend(p3)
783 777
784 ActionTracker::Record.delete_all 778 ActionTracker::Record.delete_all
785 779
@@ -795,24 +789,11 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -795,24 +789,11 @@ class ProfileControllerTest &lt; ActionController::TestCase
795 create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1)) 789 create(Scrap, defaults_for_scrap(:sender => p3, :receiver => p1))
796 a3 = ActionTracker::Record.last 790 a3 = ActionTracker::Record.last
797 791
798 - @controller.stubs(:logged_in?).returns(true)  
799 - user = mock()  
800 - user.stubs(:person).returns(p2)  
801 - user.stubs(:login).returns('some')  
802 - @controller.stubs(:current_user).returns(user) 792 + process_delayed_job_queue
803 793
  794 + login_as p2.user.login
804 get :index, :profile => p1.identifier 795 get :index, :profile => p1.identifier
805 assert assigns(:network_activities).blank? 796 assert assigns(:network_activities).blank?
806 -  
807 - user = mock()  
808 - user.stubs(:person).returns(p3)  
809 - user.stubs(:login).returns('some')  
810 - @controller.stubs(:current_user).returns(user)  
811 - Person.any_instance.stubs(:follows?).returns(true)  
812 - process_delayed_job_queue  
813 -  
814 - get :index, :profile => p3.identifier  
815 - assert_equivalent [a1,a3], assigns(:network_activities)  
816 end 797 end
817 798
818 should 'the network activity be paginated' do 799 should 'the network activity be paginated' do
@@ -829,10 +810,10 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -829,10 +810,10 @@ class ProfileControllerTest &lt; ActionController::TestCase
829 end 810 end
830 811
831 should 'the network activity be visible only to logged users' do 812 should 'the network activity be visible only to logged users' do
832 - p1= fast_create(Person)  
833 - p2= fast_create(Person) 813 + p1= create_user.person
  814 + p2= create_user.person
834 assert !p1.is_a_friend?(p2) 815 assert !p1.is_a_friend?(p2)
835 - p3= fast_create(Person) 816 + p3= create_user.person
836 p3.add_friend(p1) 817 p3.add_friend(p1)
837 assert p3.is_a_friend?(p1) 818 assert p3.is_a_friend?(p1)
838 ActionTracker::Record.destroy_all 819 ActionTracker::Record.destroy_all
@@ -891,10 +872,10 @@ class ProfileControllerTest &lt; ActionController::TestCase @@ -891,10 +872,10 @@ class ProfileControllerTest &lt; ActionController::TestCase
891 end 872 end
892 873
893 should 'the self activity not crashes with user not logged in' do 874 should 'the self activity not crashes with user not logged in' do
894 - p1= fast_create(Person)  
895 - p2= fast_create(Person) 875 + p1= create_user.person
  876 + p2= create_user.person
896 assert !p1.is_a_friend?(p2) 877 assert !p1.is_a_friend?(p2)
897 - p3= fast_create(Person) 878 + p3= create_user.person
898 p3.add_friend(p1) 879 p3.add_friend(p1)
899 assert p3.is_a_friend?(p1) 880 assert p3.is_a_friend?(p1)
900 ActionTracker::Record.destroy_all 881 ActionTracker::Record.destroy_all
test/functional/profile_editor_controller_test.rb
@@ -865,7 +865,7 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase @@ -865,7 +865,7 @@ class ProfileEditorControllerTest &lt; ActionController::TestCase
865 865
866 should 'not be able to destroy enterprise if is a regular member' do 866 should 'not be able to destroy enterprise if is a regular member' do
867 enterprise = fast_create(Enterprise) 867 enterprise = fast_create(Enterprise)
868 - enterprise.add_member(fast_create(Person)) # first member is admin by default 868 + enterprise.add_member(create_user.person) # first member is admin by default
869 869
870 person = create_user('foo').person 870 person = create_user('foo').person
871 enterprise.add_member(person) 871 enterprise.add_member(person)
test/unit/article_test.rb
@@ -1077,10 +1077,11 @@ class ArticleTest &lt; ActiveSupport::TestCase @@ -1077,10 +1077,11 @@ class ArticleTest &lt; ActiveSupport::TestCase
1077 end 1077 end
1078 1078
1079 should 'create the notification to organization and all organization members' do 1079 should 'create the notification to organization and all organization members' do
  1080 + Profile.delete_all
1080 ActionTracker::Record.delete_all 1081 ActionTracker::Record.delete_all
1081 1082
1082 community = fast_create(Community) 1083 community = fast_create(Community)
1083 - member_1 = Person.first 1084 + member_1 = fast_create(Person)
1084 community.add_member(member_1) 1085 community.add_member(member_1)
1085 1086
1086 article = create TinyMceArticle, :name => 'Tracked Article 1', :profile_id => community.id 1087 article = create TinyMceArticle, :name => 'Tracked Article 1', :profile_id => community.id
test/unit/comment_notifier_test.rb
@@ -57,15 +57,6 @@ class CommentNotifierTest &lt; ActiveSupport::TestCase @@ -57,15 +57,6 @@ class CommentNotifierTest &lt; ActiveSupport::TestCase
57 assert_match /comment body/, sent.body.to_s 57 assert_match /comment body/, sent.body.to_s
58 end 58 end
59 59
60 - should 'not deliver mail if has no notification emails' do  
61 - community = fast_create(Community)  
62 - assert_equal [], community.notification_emails  
63 - article = fast_create(Article, :name => 'Article test', :profile_id => community.id, :notify_comments => true)  
64 - assert_no_difference 'ActionMailer::Base.deliveries.size' do  
65 - create_comment_and_notify(:author => @author, :title => 'test comment', :body => 'there is no addresses to send notification', :source => article)  
66 - end  
67 - end  
68 -  
69 should "deliver mail to followers" do 60 should "deliver mail to followers" do
70 author = create_user('follower_author').person 61 author = create_user('follower_author').person
71 follower = create_user('follower').person 62 follower = create_user('follower').person
test/unit/environment_test.rb
@@ -195,6 +195,12 @@ class EnvironmentTest &lt; ActiveSupport::TestCase @@ -195,6 +195,12 @@ class EnvironmentTest &lt; ActiveSupport::TestCase
195 assert !env.errors[:contact_email.to_s].present? 195 assert !env.errors[:contact_email.to_s].present?
196 end 196 end
197 197
  198 + should 'notify contact email' do
  199 + env = Environment.new(:contact_email => 'foo@bar.com')
  200 + env.stubs(:admins).returns([])
  201 + assert_equal ['foo@bar.com'], env.notification_emails
  202 + end
  203 +
198 should 'provide a default hostname' do 204 should 'provide a default hostname' do
199 env = fast_create(Environment) 205 env = fast_create(Environment)
200 env.domains << create(Domain, :name => 'example.com', :is_default => true) 206 env.domains << create(Domain, :name => 'example.com', :is_default => true)
test/unit/feed_reader_block_test.rb
@@ -53,7 +53,7 @@ class FeedReaderBlockTest &lt; ActiveSupport::TestCase @@ -53,7 +53,7 @@ class FeedReaderBlockTest &lt; ActiveSupport::TestCase
53 end 53 end
54 54
55 should 'display last fetched date' do 55 should 'display last fetched date' do
56 - now = Time.now 56 + now = Time.new(2014,1,1)
57 feed.feed_items = ['one', 'two'] 57 feed.feed_items = ['one', 'two']
58 feed.fetched_at = now 58 feed.fetched_at = now
59 assert_equal "Updated: #{show_date(now)}", feed.footer 59 assert_equal "Updated: #{show_date(now)}", feed.footer
test/unit/organization_test.rb
@@ -123,9 +123,9 @@ class OrganizationTest &lt; ActiveSupport::TestCase @@ -123,9 +123,9 @@ class OrganizationTest &lt; ActiveSupport::TestCase
123 assert_equal ['admin1@email.com', 'admin2@email.com'], o.notification_emails 123 assert_equal ['admin1@email.com', 'admin2@email.com'], o.notification_emails
124 end 124 end
125 125
126 - should 'return empty array if contact_email is a blank string and it has no admin' do 126 + should 'use the environment contact email if no emails are listed here' do
127 o = build(Organization, :contact_email => '', :environment => Environment.default) 127 o = build(Organization, :contact_email => '', :environment => Environment.default)
128 - assert_equal [], o.notification_emails 128 + assert_equal [o.environment.contact_email], o.notification_emails
129 end 129 end
130 130
131 should 'list pending enterprise validations' do 131 should 'list pending enterprise validations' do
test/unit/person_test.rb
@@ -1198,8 +1198,8 @@ class PersonTest &lt; ActiveSupport::TestCase @@ -1198,8 +1198,8 @@ class PersonTest &lt; ActiveSupport::TestCase
1198 1198
1199 should 'return tracked_actions and scraps as activities' do 1199 should 'return tracked_actions and scraps as activities' do
1200 ActionTracker::Record.destroy_all 1200 ActionTracker::Record.destroy_all
1201 - person = fast_create(Person)  
1202 - another_person = fast_create(Person) 1201 + person = create_user.person
  1202 + another_person = create_user.person
1203 1203
1204 UserStampSweeper.any_instance.stubs(:current_user).returns(another_person) 1204 UserStampSweeper.any_instance.stubs(:current_user).returns(another_person)
1205 scrap = create(Scrap, defaults_for_scrap(:sender => another_person, :receiver => person, :content => 'A scrap')) 1205 scrap = create(Scrap, defaults_for_scrap(:sender => another_person, :receiver => person, :content => 'A scrap'))
test/unit/profile_info_block_test.rb
@@ -21,8 +21,4 @@ class ProfileInfoBlockTest &lt; ActiveSupport::TestCase @@ -21,8 +21,4 @@ class ProfileInfoBlockTest &lt; ActiveSupport::TestCase
21 instance_eval(& block.content) 21 instance_eval(& block.content)
22 end 22 end
23 23
24 - should 'not be editable' do  
25 - assert !ProfileInfoBlock.new.editable?  
26 - end  
27 -  
28 end 24 end
test/unit/scrap_notifier_test.rb
@@ -57,10 +57,10 @@ class ScrapNotifierTest &lt; ActiveSupport::TestCase @@ -57,10 +57,10 @@ class ScrapNotifierTest &lt; ActiveSupport::TestCase
57 57
58 should 'not deliver mail if is a reply on a community' do 58 should 'not deliver mail if is a reply on a community' do
59 community = fast_create(Community) 59 community = fast_create(Community)
60 - person = fast_create(Person) 60 + person = create_user.person
61 scrap = fast_create(Scrap, :receiver_id => community.id, :sender_id => @sender.id) 61 scrap = fast_create(Scrap, :receiver_id => community.id, :sender_id => @sender.id)
62 assert_no_difference 'ActionMailer::Base.deliveries.size' do 62 assert_no_difference 'ActionMailer::Base.deliveries.size' do
63 - Scrap.create!(:sender_id => person, :receiver_id => @sender.id, :scrap_id => scrap.id, :content => 'Hi myself!') 63 + Scrap.create!(:sender_id => person.id, :receiver_id => @sender.id, :scrap_id => scrap.id, :content => 'Hi myself!')
64 end 64 end
65 end 65 end
66 66
test/unit/scrap_test.rb
@@ -42,7 +42,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -42,7 +42,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
42 end 42 end
43 43
44 should "be associated to Person as sender" do 44 should "be associated to Person as sender" do
45 - person = fast_create(Person) 45 + person = create_user.person
46 s = Scrap.new 46 s = Scrap.new
47 assert_nothing_raised do 47 assert_nothing_raised do
48 s.sender = person 48 s.sender = person
@@ -50,7 +50,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -50,7 +50,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
50 end 50 end
51 51
52 should "be associated to Person as receiver" do 52 should "be associated to Person as receiver" do
53 - person = fast_create(Person) 53 + person = create_user.person
54 s = Scrap.new 54 s = Scrap.new
55 assert_nothing_raised do 55 assert_nothing_raised do
56 s.receiver = person 56 s.receiver = person
@@ -66,7 +66,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -66,7 +66,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
66 end 66 end
67 67
68 should "collect all scraps sent and received of a person" do 68 should "collect all scraps sent and received of a person" do
69 - person = fast_create(Person) 69 + person = create_user.person
70 s1 = fast_create(Scrap, :sender_id => person.id) 70 s1 = fast_create(Scrap, :sender_id => person.id)
71 assert_equal [s1], Scrap.all_scraps(person) 71 assert_equal [s1], Scrap.all_scraps(person)
72 s2 = fast_create(Scrap, :sender_id => person.id) 72 s2 = fast_create(Scrap, :sender_id => person.id)
@@ -77,7 +77,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -77,7 +77,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
77 77
78 should "collect all scraps sent and received of a community" do 78 should "collect all scraps sent and received of a community" do
79 community = fast_create(Community) 79 community = fast_create(Community)
80 - person = fast_create(Person) 80 + person = create_user.person
81 s1 = fast_create(Scrap, :sender_id => person.id) 81 s1 = fast_create(Scrap, :sender_id => person.id)
82 assert_equal [], Scrap.all_scraps(community) 82 assert_equal [], Scrap.all_scraps(community)
83 s2 = fast_create(Scrap, :receiver_id => community.id, :sender_id => person.id) 83 s2 = fast_create(Scrap, :receiver_id => community.id, :sender_id => person.id)
@@ -87,8 +87,8 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -87,8 +87,8 @@ class ScrapTest &lt; ActiveSupport::TestCase
87 end 87 end
88 88
89 should "create the leave_scrap action tracker verb on scrap creation of one user to another" do 89 should "create the leave_scrap action tracker verb on scrap creation of one user to another" do
90 - p1 = fast_create(Person)  
91 - p2 = fast_create(Person) 90 + p1 = create_user.person
  91 + p2 = create_user.person
92 s = Scrap.new 92 s = Scrap.new
93 s.sender= p1 93 s.sender= p1
94 s.receiver= p2 94 s.receiver= p2
@@ -104,7 +104,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -104,7 +104,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
104 end 104 end
105 105
106 should "create the leave_scrap action tracker verb on scrap creation of one user to community" do 106 should "create the leave_scrap action tracker verb on scrap creation of one user to community" do
107 - p = fast_create(Person) 107 + p = create_user.person
108 c = fast_create(Community) 108 c = fast_create(Community)
109 s = Scrap.new 109 s = Scrap.new
110 s.sender= p 110 s.sender= p
@@ -122,8 +122,8 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -122,8 +122,8 @@ class ScrapTest &lt; ActiveSupport::TestCase
122 end 122 end
123 123
124 should "notify leave_scrap action tracker verb to friends and itself" do 124 should "notify leave_scrap action tracker verb to friends and itself" do
125 - p1 = fast_create(Person)  
126 - p2 = fast_create(Person) 125 + p1 = create_user.person
  126 + p2 = create_user.person
127 p1.add_friend(p2) 127 p1.add_friend(p2)
128 ActionTrackerNotification.delete_all 128 ActionTrackerNotification.delete_all
129 Delayed::Job.delete_all 129 Delayed::Job.delete_all
@@ -140,7 +140,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -140,7 +140,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
140 end 140 end
141 141
142 should "notify leave_scrap action tracker verb to members of the communities and the community itself" do 142 should "notify leave_scrap action tracker verb to members of the communities and the community itself" do
143 - p = fast_create(Person) 143 + p = create_user.person
144 c = fast_create(Community) 144 c = fast_create(Community)
145 c.add_member(p) 145 c.add_member(p)
146 ActionTrackerNotification.delete_all 146 ActionTrackerNotification.delete_all
@@ -158,7 +158,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -158,7 +158,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
158 end 158 end
159 159
160 should "create the leave_scrap_to_self action tracker verb on scrap creation of one user to itself" do 160 should "create the leave_scrap_to_self action tracker verb on scrap creation of one user to itself" do
161 - p = fast_create(Person) 161 + p = create_user.person
162 s = Scrap.new 162 s = Scrap.new
163 s.sender= p 163 s.sender= p
164 s.receiver= p 164 s.receiver= p
@@ -172,8 +172,8 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -172,8 +172,8 @@ class ScrapTest &lt; ActiveSupport::TestCase
172 end 172 end
173 173
174 should "notify leave_scrap_to_self action tracker verb to friends and itself" do 174 should "notify leave_scrap_to_self action tracker verb to friends and itself" do
175 - p1 = fast_create(Person)  
176 - p2 = fast_create(Person) 175 + p1 = create_user.person
  176 + p2 = create_user.person
177 p1.add_friend(p2) 177 p1.add_friend(p2)
178 ActionTrackerNotification.delete_all 178 ActionTrackerNotification.delete_all
179 Delayed::Job.delete_all 179 Delayed::Job.delete_all
@@ -216,7 +216,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -216,7 +216,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
216 end 216 end
217 217
218 should "update the scrap on reply creation" do 218 should "update the scrap on reply creation" do
219 - person = fast_create(Person) 219 + person = create_user.person
220 s = fast_create(Scrap, :updated_at => DateTime.parse('2010-01-01')) 220 s = fast_create(Scrap, :updated_at => DateTime.parse('2010-01-01'))
221 assert_equal DateTime.parse('2010-01-01'), s.updated_at.strftime('%Y-%m-%d') 221 assert_equal DateTime.parse('2010-01-01'), s.updated_at.strftime('%Y-%m-%d')
222 DateTime.stubs(:now).returns(DateTime.parse('2010-09-07')) 222 DateTime.stubs(:now).returns(DateTime.parse('2010-09-07'))
@@ -242,20 +242,20 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -242,20 +242,20 @@ class ScrapTest &lt; ActiveSupport::TestCase
242 end 242 end
243 243
244 should 'strip all html tags' do 244 should 'strip all html tags' do
245 - s, r = fast_create(Person), fast_create(Person) 245 + s, r = create_user.person, create_user.person
246 s = build Scrap, :sender => s, :receiver => r, :content => "<p>Test <b>Rails</b></p>" 246 s = build Scrap, :sender => s, :receiver => r, :content => "<p>Test <b>Rails</b></p>"
247 assert_equal "Test Rails", s.strip_all_html_tags 247 assert_equal "Test Rails", s.strip_all_html_tags
248 end 248 end
249 249
250 should 'strip html before save' do 250 should 'strip html before save' do
251 - s, r = fast_create(Person), fast_create(Person) 251 + s, r = create_user.person, create_user.person
252 s = build Scrap, :sender => s, :receiver => r, :content => "<p>Test <b>Rails</b></p>" 252 s = build Scrap, :sender => s, :receiver => r, :content => "<p>Test <b>Rails</b></p>"
253 s.save! 253 s.save!
254 assert_equal "Test Rails", s.reload.content 254 assert_equal "Test Rails", s.reload.content
255 end 255 end
256 256
257 should 'strip html before validate' do 257 should 'strip html before validate' do
258 - s, r = fast_create(Person), fast_create(Person) 258 + s, r = create_user.person, create_user.person
259 s = build Scrap, :sender => s, :receiver => r, :content => "<p><b></b></p>" 259 s = build Scrap, :sender => s, :receiver => r, :content => "<p><b></b></p>"
260 assert !s.valid? 260 assert !s.valid?
261 s.content = "<p>Test</p>" 261 s.content = "<p>Test</p>"
@@ -272,7 +272,7 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -272,7 +272,7 @@ class ScrapTest &lt; ActiveSupport::TestCase
272 end 272 end
273 273
274 should 'scrap wall url be the root scrap receiver url if it is a reply' do 274 should 'scrap wall url be the root scrap receiver url if it is a reply' do
275 - p1, p2 = fast_create(Person), fast_create(Person) 275 + p1, p2 = create_user.person, create_user.person
276 r = create Scrap, :sender => p1, :receiver => p2, :content => "Hello!" 276 r = create Scrap, :sender => p1, :receiver => p2, :content => "Hello!"
277 s = build Scrap, :sender => p2, :receiver => p1, :content => "Hi!" 277 s = build Scrap, :sender => p2, :receiver => p1, :content => "Hi!"
278 r.replies << s; s.reload 278 r.replies << s; s.reload
@@ -280,13 +280,13 @@ class ScrapTest &lt; ActiveSupport::TestCase @@ -280,13 +280,13 @@ class ScrapTest &lt; ActiveSupport::TestCase
280 end 280 end
281 281
282 should 'scrap wall url be the scrap receiver url if it is not a reply' do 282 should 'scrap wall url be the scrap receiver url if it is not a reply' do
283 - p1, p2 = fast_create(Person), fast_create(Person) 283 + p1, p2 = create_user.person, create_user.person
284 s = create Scrap, :sender => p1, :receiver => p2, :content => "Hello!" 284 s = create Scrap, :sender => p1, :receiver => p2, :content => "Hello!"
285 assert_equal s.scrap_wall_url, s.receiver.wall_url 285 assert_equal s.scrap_wall_url, s.receiver.wall_url
286 end 286 end
287 287
288 should 'create activity with reply_scrap_on_self when top_root scrap receiver is the same as sender' do 288 should 'create activity with reply_scrap_on_self when top_root scrap receiver is the same as sender' do
289 - s, r = fast_create(Person), fast_create(Person) 289 + s, r = create_user.person, create_user.person
290 root = fast_create(Scrap, :sender_id => s.id, :receiver_id => r.id) 290 root = fast_create(Scrap, :sender_id => s.id, :receiver_id => r.id)
291 assert_difference 'ActionTracker::Record.count', 1 do 291 assert_difference 'ActionTracker::Record.count', 1 do
292 reply = create(Scrap, :sender => r, :receiver => s, :scrap_id => root.id, :content => 'sample') 292 reply = create(Scrap, :sender => r, :receiver => s, :scrap_id => root.id, :content => 'sample')