From 74dff5b2cb66fafb26f0de24aa8a910ecedef8d8 Mon Sep 17 00:00:00 2001 From: antebarac Date: Mon, 29 Jul 2013 13:30:36 +0200 Subject: [PATCH] Revert "prettify seeds" This reverts commit 55cc9cd0f092f5b33fe236f5c5f7ece278264713. --- Gemfile | 1 - Gemfile.lock | 2 - app/controllers/ads_controller.rb | 8 +- app/models/ad.rb | 41 +++++++- config/initializers/sunspot.rb | 2 +- db/seeds.rb | 168 +++++++++++------------------- lib/ad_filter.rb | 21 ++-- lib/extensions/ad/searchable.rb | 31 ------ spec/lib/ad_filter_spec.rb | 126 ---------------------- spec/models/ad_spec.rb | 43 +------- spec/spec_helper.rb | 7 -- 11 files changed, 115 insertions(+), 335 deletions(-) delete mode 100644 lib/extensions/ad/searchable.rb delete mode 100644 spec/lib/ad_filter_spec.rb diff --git a/Gemfile b/Gemfile index c4d7a9d..a89cdc9 100644 --- a/Gemfile +++ b/Gemfile @@ -58,5 +58,4 @@ group :test do gem "simplecov", require: false gem "database_cleaner" gem "email_spec" - gem 'sunspot_matchers' end diff --git a/Gemfile.lock b/Gemfile.lock index a57c100..67ba0ec 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -299,7 +299,6 @@ GEM sunspot (2.0.0) pr_geohash (~> 1.0) rsolr (~> 1.0.7) - sunspot_matchers (2.0.0.3) sunspot_rails (2.0.0) nokogiri sunspot (= 2.0.0) @@ -365,7 +364,6 @@ DEPENDENCIES simplecov spinach-rails sqlite3 - sunspot_matchers sunspot_rails sunspot_solr thin diff --git a/app/controllers/ads_controller.rb b/app/controllers/ads_controller.rb index 2d8a6e4..f313b5a 100644 --- a/app/controllers/ads_controller.rb +++ b/app/controllers/ads_controller.rb @@ -4,10 +4,10 @@ class AdsController < ApplicationController respond_to :html, :json def index - @ads_search = @ad_filter.search - @ads_without_category_id = @ad_filter.search_without(:category_id) - @ads_without_ad_type = @ad_filter.search_without(:ad_type) - @ads_without_region_id = @ad_filter.search_without(:region_id) + @ads_search = Ad.search(@ad_filter, params[:page], params[:per_page] || Ad::PER_PAGE) + @ads_without_category_id = Ad.search(@ad_filter.clone_without(:category_id), 1) + @ads_without_ad_type = Ad.search(@ad_filter.clone_without(:ad_type), 1) + @ads_without_region_id = Ad.search(@ad_filter.clone_without(:region_id), 1) respond_with @ads = @ads_search.results end diff --git a/app/models/ad.rb b/app/models/ad.rb index 9b4a072..50a80ed 100644 --- a/app/models/ad.rb +++ b/app/models/ad.rb @@ -5,7 +5,6 @@ class Ad < ActiveRecord::Base include Extensions::Ad::Type include Extensions::Ad::Status include Extensions::Ad::Delegation - include Extensions::Ad::Searchable belongs_to :category belongs_to :user @@ -31,4 +30,42 @@ class Ad < ActiveRecord::Base validates :title, :presence => true validates :ad_type, :presence => true - end + searchable do + text :title, boost: 4.0 + text :description, boost: 2.0 + text :phone + text :category do + category.name + end + text :city do + city.name + end + text :region do + city.region.name + end + + integer :region_id do + city.region_id + end + integer :category_id + integer :ad_type + integer :status + time :created_at + end + + + def self.search(ad_filter = AdFilter.new, page = nil, per_page = nil) + Sunspot.search(Ad) do + fulltext(ad_filter.query) if ad_filter.query + with(:category_id, ad_filter.category_id) if ad_filter.category_id + with(:region_id, ad_filter.region_id) if ad_filter.region_id + with(:ad_type, ad_filter.ad_type) if ad_filter.ad_type + with(:status, Ad.status[:active]) + facet(:category_id) + facet(:region_id) + facet(:ad_type) + paginate(page: page || 1, per_page: per_page) + order_by(:created_at, :desc) if ad_filter.query.blank? + end + end +end diff --git a/config/initializers/sunspot.rb b/config/initializers/sunspot.rb index 4508b35..9d64080 100644 --- a/config/initializers/sunspot.rb +++ b/config/initializers/sunspot.rb @@ -31,7 +31,7 @@ def setup_solr sleep 0.5 print '.' end - puts "\nDone!" + puts 'Done!' end Sunspot.session = $original_sunspot_session diff --git a/db/seeds.rb b/db/seeds.rb index cb9d99d..be6e1e6 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -11,123 +11,75 @@ # See http://railsapps.github.io/rails-environment-variables.html include SunspotHelper +setup_solr -def log(message) - print "\n[Seeds] #{message}" -end - -def announce_start - @start = Time.now - print "=" * 30 - log "started seeding data\n\n" -end - -def announce_finish - puts "=" * 30 - log "Success! :)" - log "Seeding took #{(Time.now - @start).round(2)} seconds.\n\n" -end - -def import_roles - log "importing roles" - YAML.load(ENV['ROLES']).each do |role| - Role.find_or_create_by_name({ :name => role }, :without_protection => true) - print "." - end -end - -def create_admin - log "creating admin [username: #{ENV['ADMIN_EMAIL']} password: #{ENV['ADMIN_PASSWORD']}]" - ActionMailer::Base.delivery_method = :test - user = User.find_or_create_by_email :first_name => ENV['ADMIN_NAME'].dup, :email => ENV['ADMIN_EMAIL'].dup, :password => ENV['ADMIN_PASSWORD'].dup, :password_confirmation => ENV['ADMIN_PASSWORD'].dup, :phone => '0989814972' - user.confirm! - user.add_role :admin +YAML.load(ENV['ROLES']).each do |role| + Role.find_or_create_by_name({ :name => role }, :without_protection => true) + puts 'role: ' << role end -def import_regions - log "importing regions" - { - 'Bjelovarsko-bilogorska' => ['Bjelovar', 'Čazma', 'Daruvar', 'Garešnica', 'Grubišno Polje'], - 'Brodsko-posavska' => ['Nova Gradiška', 'Slavonski Brod'], - 'Dubrovačko-neretvanska' => ['Dubrovnik', 'Korčula', 'Metković', 'Opuzen', 'Ploče'], - 'Istarska' => ['Pula', 'Pazin', 'Poreč', 'Buje', 'Buzet', 'Labin', 'Novigrad', 'Rovinj', 'Umag', 'Vodnjan'], - 'Karlovačka' => ['Duga Resa', 'Karlovac', 'Ogulin', 'Slunj', 'Ozalj'], - 'Koprivničko-križevačka' => ['Đurđevac', 'Koprivnica', 'Križevci'], - 'Krapinsko-zagorska' => ['Donja Stubica', 'Klanjec', 'Krapina', 'Oroslavje', 'Pregrada', 'Zabok', 'Zlatar'], - 'Ličko-senjska' => ['Gospić', 'Otočac', 'Brinje', 'Senj', 'Karlobag'], - 'Međimurska' => ['Čakovec', 'Mursko Središće', 'Prelog'], - 'Osječko-baranjska' => ['Beli Manastir', 'Belišće', 'Donji Miholjac', 'Đakovo', 'Našice', 'Osijek', 'Valpovo'], - 'Požeško-slavonska' => ['Kutjevo', 'Lipik', 'Pakrac', 'Pleternica', 'Požega'], - 'Primorsko-goranska' => ['Rijeka', 'Bakar', 'Cres', 'Crikvenica', 'Čabar', 'Delnice', 'Kastav', 'Kraljevica', 'Krk', 'Mali Lošinj', 'Novi Vinodolski', 'Opatija', 'Rab', 'Vrbovsko'], - 'Sisačko-moslavačka' => ['Glina', 'Hrvatska Kostajnica', 'Kutina', 'Novska', 'Sisak', 'Petrinja'], - 'Splitsko-dalmatinska' => ['Hvar', 'Imotski', 'Kaštela', 'Komiža', 'Makarska', 'Omiš', 'Sinj', 'Solin', 'Split', 'Stari Grad', 'Supetar', 'Trilj', 'Trogir', 'Vis', 'Vrgorac', 'Vrlika'], - 'Varaždinska' => ['Ivanec', 'Lepoglava', 'Ludbreg', 'Novi Marof', 'Varaždin', 'Varaždinske Toplice'], - 'Virovitičko-podravska' => ['Orahovica', 'Slatina', 'Virovitica'], - 'Vukovarsko-srijemska' => ['Vukovar', 'Vinkovci', 'Ilok', 'Županja'], - 'Zadarska' => ['Zadar', 'Benkovac', 'Biograd na Moru', 'Nin', 'Obrovac', 'Pag'], - 'Zagrebačka' => ['Dugo Selo', 'Ivanić Grad', 'Jastrebarsko', 'Samobor', 'Sveti Ivan Zelina', 'Velika Gorica', 'Vrbovec', 'Zaprešić'], - 'Šibensko-kninska' => ['Drniš', 'Knin', 'Skradin', 'Šibenik', 'Vodice'], - 'Grad Zagreb' => ['Zagreb'] - }.each_pair do |region, cities| - - print "." - - r = Region.find_by_name region - unless r - r = Region.create(:name => region) - cities.each do |city| - r.cities.create(:name => city) - end +user = User.find_or_create_by_email :first_name => ENV['ADMIN_NAME'].dup, :email => ENV['ADMIN_EMAIL'].dup, :password => ENV['ADMIN_PASSWORD'].dup, :password_confirmation => ENV['ADMIN_PASSWORD'].dup, :phone => '0989814972' +puts 'user: ' << user.name +user.confirm! +user.add_role :admin + +{ + 'Bjelovarsko-bilogorska' => ['Bjelovar', 'Čazma', 'Daruvar', 'Garešnica', 'Grubišno Polje'], + 'Brodsko-posavska' => ['Nova Gradiška', 'Slavonski Brod'], + 'Dubrovačko-neretvanska' => ['Dubrovnik', 'Korčula', 'Metković', 'Opuzen', 'Ploče'], + 'Istarska' => ['Pula', 'Pazin', 'Poreč', 'Buje', 'Buzet', 'Labin', 'Novigrad', 'Rovinj', 'Umag', 'Vodnjan'], + 'Karlovačka' => ['Duga Resa', 'Karlovac', 'Ogulin', 'Slunj', 'Ozalj'], + 'Koprivničko-križevačka' => ['Đurđevac', 'Koprivnica', 'Križevci'], + 'Krapinsko-zagorska' => ['Donja Stubica', 'Klanjec', 'Krapina', 'Oroslavje', 'Pregrada', 'Zabok', 'Zlatar'], + 'Ličko-senjska' => ['Gospić', 'Otočac', 'Brinje', 'Senj', 'Karlobag'], + 'Međimurska' => ['Čakovec', 'Mursko Središće', 'Prelog'], + 'Osječko-baranjska' => ['Beli Manastir', 'Belišće', 'Donji Miholjac', 'Đakovo', 'Našice', 'Osijek', 'Valpovo'], + 'Požeško-slavonska' => ['Kutjevo', 'Lipik', 'Pakrac', 'Pleternica', 'Požega'], + 'Primorsko-goranska' => ['Rijeka', 'Bakar', 'Cres', 'Crikvenica', 'Čabar', 'Delnice', 'Kastav', 'Kraljevica', 'Krk', 'Mali Lošinj', 'Novi Vinodolski', 'Opatija', 'Rab', 'Vrbovsko'], + 'Sisačko-moslavačka' => ['Glina', 'Hrvatska Kostajnica', 'Kutina', 'Novska', 'Sisak', 'Petrinja'], + 'Splitsko-dalmatinska' => ['Hvar', 'Imotski', 'Kaštela', 'Komiža', 'Makarska', 'Omiš', 'Sinj', 'Solin', 'Split', 'Stari Grad', 'Supetar', 'Trilj', 'Trogir', 'Vis', 'Vrgorac', 'Vrlika'], + 'Varaždinska' => ['Ivanec', 'Lepoglava', 'Ludbreg', 'Novi Marof', 'Varaždin', 'Varaždinske Toplice'], + 'Virovitičko-podravska' => ['Orahovica', 'Slatina', 'Virovitica'], + 'Vukovarsko-srijemska' => ['Vukovar', 'Vinkovci', 'Ilok', 'Županja'], + 'Zadarska' => ['Zadar', 'Benkovac', 'Biograd na Moru', 'Nin', 'Obrovac', 'Pag'], + 'Zagrebačka' => ['Dugo Selo', 'Ivanić Grad', 'Jastrebarsko', 'Samobor', 'Sveti Ivan Zelina', 'Velika Gorica', 'Vrbovec', 'Zaprešić'], + 'Šibensko-kninska' => ['Drniš', 'Knin', 'Skradin', 'Šibenik', 'Vodice'], + 'Grad Zagreb' => ['Zagreb'] +}.each_pair do |region, cities| + + r = Region.find_by_name region + unless r + r = Region.create(:name => region) + cities.each do |city| + r.cities.create(:name => city) end end end -def import_categories - log "importing categories" - [ - "Hrana", - "Zdravlje i higijena", - "Odjeća i obuća", - "Elektronika", - "Sve za djecu", - "Namještaj", - "Kućanski aparati", - "Kućanske potrepštine", - "Poslovi i usluge", - "Hobi i zabava", - "Ostalo" - ].each do |categoryName| - print "." + +[ + "Hrana", + "Zdravlje i higijena", + "Odjeća i obuća", + "Elektronika", + "Sve za djecu", + "Namještaj", + "Kućanski aparati", + "Kućanske potrepštine", + "Poslovi i usluge", + "Hobi i zabava", + "Ostalo" +].each do |categoryName| Category.find_or_create_by_name(:name => categoryName) - end end -def import_ads - log "importing ads" - 20.times do - print "." - FactoryGirl.create(:ad, category: Category.all.sample, city: City.all.sample, user: User.all.sample) - end -end +placeholderAdDescription = +"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt"\ +" ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco"\ +" laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in"\ +" voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat"\ +" non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -def import_blogs - log "importing blogs" - 4.times do - print "." - FactoryGirl.create(:blog) - end +20.times do + FactoryGirl.create(:ad, category: Category.all.sample, city: City.all.sample, user: User.all.sample) end - -announce_start -setup_solr -puts - -import_roles -create_admin -import_regions -import_categories -import_ads -import_blogs -puts - -announce_finish diff --git a/lib/ad_filter.rb b/lib/ad_filter.rb index 0fa9e63..4f11f00 100644 --- a/lib/ad_filter.rb +++ b/lib/ad_filter.rb @@ -1,7 +1,5 @@ class AdFilter - FILTER_ATTRIBUTES = [:region_id, :category_id, :ad_type] - - attr_accessor :region_id, :category_id, :ad_type, :query, :page, :per_page + attr_accessor :region_id, :category_id, :ad_type, :query def initialize(params = {}) params ||= {} @@ -14,18 +12,11 @@ def initialize(params = {}) end end - def search_without(skip_attribute) - search(FILTER_ATTRIBUTES.reject{ |attr| attr == skip_attribute }) - end - - def search(filter_attributes = FILTER_ATTRIBUTES) - Sunspot.search(Ad) do - fulltext(query) - filter_attributes.each { |attr| with(attr, self.send(attr)) if self.send(attr) } - FILTER_ATTRIBUTES.each { |attr| facet(attr) } - with(:status, Ad.status[:active]) - paginate(page: page || 1, per_page: per_page || Ad::PER_PAGE) - order_by(:created_at, :desc) if query.blank? + def clone_without(skip_attribute) + new_filter = AdFilter.new + [:region_id, :category_id, :ad_type, :query].each do |method| + new_filter.send(method.to_s + '=', skip_attribute == method ? nil : self.send(method)) end + new_filter end end diff --git a/lib/extensions/ad/searchable.rb b/lib/extensions/ad/searchable.rb deleted file mode 100644 index 3b77cb8..0000000 --- a/lib/extensions/ad/searchable.rb +++ /dev/null @@ -1,31 +0,0 @@ -module Extensions - module Ad - module Searchable - extend ActiveSupport::Concern - - included do - searchable do - text :title, boost: 4.0 - text :description, boost: 2.0 - text :phone - text :category do - category.name - end - text :city do - city.name - end - text :region do - city.region.name - end - integer :region_id do - city.region_id - end - integer :category_id - integer :ad_type - integer :status - time :created_at - end - end - end - end -end diff --git a/spec/lib/ad_filter_spec.rb b/spec/lib/ad_filter_spec.rb deleted file mode 100644 index 93409cc..0000000 --- a/spec/lib/ad_filter_spec.rb +++ /dev/null @@ -1,126 +0,0 @@ -describe AdFilter do - subject { AdFilter.new(params) } - - describe '#new' do - context 'with region set' do - let(:params) { { region_id: '11' } } - its(:region_id) { should == 11 } - end - - context 'with category set' do - let(:params) { { category_id: '1' } } - its(:category_id) { should == 1 } - end - - context 'with type set' do - let(:params) { { ad_type: '2' } } - its(:ad_type) { should == 2 } - end - - context 'with query set' do - let(:params) { { query: 'something' } } - its(:query) { should == 'something' } - end - end - - let(:filter_options) do - { - ad_type: '1', - region_id: '10', - category_id: '4', - query: 'some search', - page: '2', - per_page: '10' - } - end - - describe '#search_without' do - it 'should do a search without the specified attribute' do - filter = AdFilter.new(filter_options) - filter.stub(:search) - filter.should_receive(:search).with([:category_id, :ad_type]) - filter.search_without(:region_id) - end - end - - describe '#search', sunspot_matchers: true do - before do - AdFilter.new(filter_options).search - end - it 'should search for Ads' do - Sunspot.session.should be_a_search_for(Ad) - end - - it 'should do a fulltext search on query' do - Sunspot.session.should have_search_params(:fulltext, 'some search') - end - - it 'should facet by category' do - Sunspot.session.should have_search_params(:facet, :category_id) - end - - it 'should facet by type' do - Sunspot.session.should have_search_params(:facet, :ad_type) - end - - it 'should facet by region' do - Sunspot.session.should have_search_params(:facet, :region_id) - end - - it 'should filter by region' do - Sunspot.session.should have_search_params(:with, :region_id, 10) - end - - it 'should filter by type' do - Sunspot.session.should have_search_params(:with, :ad_type, 1) - end - - it 'should filter by category' do - Sunspot.session.should have_search_params(:with, :category_id, 4) - end - - it 'should paginate' do - Sunspot.session.should have_search_params(:paginate, page: 2, per_page: 10) - end - - it 'should order results by rank (default)' do - Sunspot.session.should_not have_search_params(:order_by, any_param) - end - - context 'with attributes specified' do - before { AdFilter.new(filter_options).search([:category_id]) } - - it 'should not filter by region' do - Sunspot.session.should_not have_search_params(:with, :region_id, any_param) - end - - it 'should not filter by type' do - Sunspot.session.should_not have_search_params(:with, :ad_type, any_param) - end - - it 'should filter by category' do - Sunspot.session.should have_search_params(:with, :category_id, 4) - end - end - - context 'with no pagination params specified' do - before do - AdFilter.new(filter_options.reject{ |key| key =~ /^(page|per_page)$/ }).search - end - - it 'should use the default values' do - Sunspot.session.should have_search_params(:paginate, page: 1, per_page: Ad::PER_PAGE) - end - end - - context 'with no query specified' do - before do - AdFilter.new(filter_options.reject{ |key| key == :query }).search - end - - it 'should order results by creation date' do - Sunspot.session.should have_search_params(:order_by, :created_at, :desc) - end - end - end -end diff --git a/spec/models/ad_spec.rb b/spec/models/ad_spec.rb index 5cc4d87..1890f32 100644 --- a/spec/models/ad_spec.rb +++ b/spec/models/ad_spec.rb @@ -1,11 +1,9 @@ -require 'active_support/core_ext' - -require_relative '../../lib/extensions/ad/expiration' -require_relative '../../lib/extensions/ad/type' -require_relative '../../lib/extensions/ad/status' -require_relative '../../lib/extensions/ad/delegation' -require_relative '../../lib/extensions/ad/searchable' +require "active_support/core_ext" +require_relative "../../lib/extensions/ad/expiration" +require_relative "../../lib/extensions/ad/type" +require_relative "../../lib/extensions/ad/status" +require_relative "../../lib/extensions/ad/delegation" class Ad attr_accessor :status @@ -14,13 +12,6 @@ class Ad include Extensions::Ad::Type include Extensions::Ad::Status include Extensions::Ad::Delegation - -end - -class AdSearchMock - def self.searchable - yield - end end describe Ad do @@ -105,28 +96,4 @@ def self.searchable subject.region end end - - context 'Search setup', sunspot_matchers: true do - before do - AdSearchMock.stub(:text) - AdSearchMock.stub(:integer) - AdSearchMock.stub(:time) - end - - #These can't be separated in a feasible way - it 'should add fields for fulltext search, filtering and sorting' do - AdSearchMock.should_receive(:text).with(:title, boost: 4.0) - AdSearchMock.should_receive(:text).with(:description, boost: 2.0) - AdSearchMock.should_receive(:text).with(:phone) - AdSearchMock.should_receive(:text).with(:category) - AdSearchMock.should_receive(:text).with(:city) - AdSearchMock.should_receive(:text).with(:region) - AdSearchMock.should_receive(:integer).with(:region_id) - AdSearchMock.should_receive(:integer).with(:category_id) - AdSearchMock.should_receive(:integer).with(:ad_type) - AdSearchMock.should_receive(:integer).with(:status) - AdSearchMock.should_receive(:time).with(:created_at) - AdSearchMock.send(:include, Extensions::Ad::Searchable) - end - end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 3a8e7a8..00c5443 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -21,7 +21,6 @@ RSpec.configure do |config| config.include(EmailSpec::Helpers) config.include(EmailSpec::Matchers) - config.include(SunspotMatchers) # ## Mock Framework # # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line: @@ -58,10 +57,4 @@ config.after(:each) do DatabaseCleaner.clean end - config.before(:each, sunspot_matchers: true) do - ::Sunspot.session = SunspotMatchers::SunspotSessionSpy.new(Sunspot.session) - end - config.after(:each, sunspot_matchers: true) do - ::Sunspot.session = ::Sunspot.session.original_session - end end