diff --git a/Gemfile b/Gemfile index 987f12ad..c1405e4e 100644 --- a/Gemfile +++ b/Gemfile @@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'sinatra' +gem 'sinatra', '2.0.0' gem 'redis' gem 'redis-namespace' gem 'sequel' diff --git a/Gemfile.lock b/Gemfile.lock index 746093eb..b43aa276 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: https://github.com/planio-gmbh/dav4rack.git - revision: e68dcf97399a116878a1a68b5c879f5cb05c40cb + revision: ec491dccab4bcfa846bb4616c7177fb09819981c branch: redmine-storage specs: dav4rack (0.3.0) @@ -12,14 +12,14 @@ GIT GEM remote: https://rubygems.org/ specs: - acme-client (0.4.0) + acme-client (0.5.5) faraday (~> 0.9, >= 0.9.1) - activesupport (5.0.2) + activesupport (5.1.0) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.7) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.5.0) + addressable (2.5.1) public_suffix (~> 2.0, >= 2.0.2) annoy (0.5.6) highline (>= 1.5.0) @@ -28,8 +28,8 @@ GEM bcrypt (3.1.11) blankslate (3.1.3) builder (3.2.3) - byebug (8.2.4) - capybara (2.13.0) + byebug (9.0.6) + capybara (2.14.0) addressable mime-types (>= 1.16) nokogiri (>= 1.3.3) @@ -40,15 +40,14 @@ GEM capybara (>= 2) minitest (>= 4) certified (1.0.0) - climate_control (0.0.3) - activesupport (>= 3.0) + climate_control (0.1.0) cliver (0.3.2) cocaine (0.5.8) climate_control (>= 0.0.3, < 1.0) coderay (1.1.1) concurrent-ruby (1.0.5) - connection_pool (2.2.0) - coveralls (0.8.20) + connection_pool (2.2.1) + coveralls (0.8.21) json (>= 1.8, < 3) simplecov (~> 0.14.1) term-ansicolor (~> 1.3) @@ -59,41 +58,41 @@ GEM crass (1.0.2) dante (0.2.0) docile (1.1.5) - domain_name (0.5.20160826) + domain_name (0.5.20170404) unf (>= 0.0.5, < 1.0.0) drydock (0.6.9) erubis (2.7.0) exifr (1.2.5) - fabrication (2.15.0) + fabrication (2.16.1) facter (2.4.6) - faker (1.6.3) + faker (1.7.3) i18n (~> 0.5) - faraday (0.9.2) + faraday (0.12.1) multipart-post (>= 1.2, < 3) - faraday_middleware (0.9.2) - faraday (>= 0.7.4, < 0.10) - feedjira (2.1.0) + faraday_middleware (0.11.0.1) + faraday (>= 0.7.4, < 1.0) + feedjira (2.1.2) faraday (>= 0.9) faraday_middleware (>= 0.9) loofah (>= 2.0) sax-machine (>= 1.0) - ffi (1.9.10) - ffi-compiler (0.1.3) + ffi (1.9.18) + ffi-compiler (1.0.1) ffi (>= 1.0.0) rake filesize (0.1.1) - fspath (3.0.3) + fspath (3.1.0) gandi (3.3.27) hashie - geoip (1.6.1) - hashdiff (0.3.2) + geoip (1.6.3) + hashdiff (0.3.4) hashie (3.5.5) highline (1.7.8) hiredis (0.6.1) hoe (3.14.2) rake (>= 0.8, < 11.0) htmlentities (4.3.4) - http (2.0.3) + http (2.2.2) addressable (~> 2.3) http-cookie (~> 1.0) http-form_data (~> 1.0.1) @@ -102,85 +101,85 @@ GEM domain_name (~> 0.5) http-form_data (1.0.1) http_parser.rb (0.6.0) - i18n (0.7.0) - image_optim (0.24.1) + i18n (0.8.1) + image_optim (0.24.3) exifr (~> 1.2, >= 1.2.2) fspath (~> 3.0) image_size (~> 1.5) in_threads (~> 1.3) progress (~> 3.0, >= 3.0.1) - image_optim_pack (0.3.0.20161206) + image_optim_pack (0.5.0) fspath (>= 2.1, < 4) image_optim (~> 0.19) image_size (1.5.0) - in_threads (1.3.1) + in_threads (1.4.0) io-extra (1.2.8) ipaddress (0.8.3) - jimson-temp (0.9.5) + jimson-temp (0.9.4) blankslate (>= 3.1.2) - multi_json (~> 1.0) - rack (~> 1.4) - rest-client (~> 1.0) + multi_json (>= 1.7.6) + rack (>= 1.4.5) + rest-client (>= 1.6.7) json (1.8.6) loofah (2.0.3) nokogiri (>= 1.5.9) - m (1.4.2) + m (1.5.0) method_source (>= 0.6.7) rake (>= 0.9.2.2) magic (0.2.9) ffi (>= 0.6.3) - mail (2.6.4) + mail (2.6.5) mime-types (>= 1.16, < 4) metaclass (0.0.4) method_source (0.8.2) mime-types (2.99.3) mini_portile2 (2.1.0) minitest (5.10.1) - minitest-reporters (1.1.8) + minitest-reporters (1.1.14) ansi builder minitest (>= 5.0) ruby-progressbar - mocha (1.1.0) + mocha (1.2.1) metaclass (~> 0.0.1) - mock_redis (0.16.1) + mock_redis (0.17.3) monetize (1.6.0) money (~> 6.8) - money (6.8.1) - i18n (>= 0.6.4, <= 0.7.0) - sixarm_ruby_unaccent (>= 1.1.1, < 2) + money (6.9.0) + i18n (>= 0.6.4, < 0.9) msgpack (1.1.0) multi_json (1.12.1) multipart-post (2.0.0) + mustermann (1.0.0) net-scp (1.2.1) net-ssh (>= 2.6.5) - net-ssh (3.1.1) + net-ssh (4.1.0) netrc (0.11.0) - nokogiri (1.7.0.1) + nokogiri (1.7.1) mini_portile2 (~> 2.1.0) - nokogumbo (1.4.7) + nokogumbo (1.4.10) nokogiri - ox (2.4.6) + ox (2.5.0) paypal-recurring (1.1.0) pg (0.20.0) - poltergeist (1.11.0) + poltergeist (1.15.0) capybara (~> 2.1) cliver (~> 0.3.1) websocket-driver (>= 0.2.0) - progress (3.2.2) - pry (0.10.3) + progress (3.3.1) + pry (0.10.4) coderay (~> 1.1.0) method_source (~> 0.8.1) slop (~> 3.4) - pry-byebug (3.3.0) - byebug (~> 8.0) + pry-byebug (3.4.2) + byebug (~> 9.0) pry (~> 0.10) public_suffix (2.0.5) - puma (3.4.0) - rack (1.6.5) - rack-cache (1.6.1) + puma (3.8.2) + rack (2.0.1) + rack-cache (1.7.0) rack (>= 0.4) - rack-protection (1.5.3) + rack-protection (2.0.0) rack rack-recaptcha (0.6.6) json @@ -191,15 +190,15 @@ GEM rack (>= 1.0.0) rake (10.5.0) redis (3.3.3) - redis-namespace (1.5.2) + redis-namespace (1.5.3) redis (~> 3.0, >= 3.0.4) rest-client (1.8.0) http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 3.0) netrc (~> 0.7) - rinku (2.0.0) - rmagick (2.15.4) - ruby-progressbar (1.7.5) + rinku (2.0.2) + rmagick (2.16.0) + ruby-progressbar (1.8.1) rye (0.9.13) annoy docile (>= 1.0.1) @@ -208,40 +207,40 @@ GEM net-ssh (>= 2.0.13) sysinfo (>= 0.8.1) safe_yaml (1.0.4) - sanitize (4.0.1) + sanitize (4.4.0) crass (~> 1.0.2) nokogiri (>= 1.4.4) nokogumbo (~> 1.4.1) - sass (3.4.22) + sass (3.4.23) sax-machine (1.3.2) - scrypt (2.1.1) - ffi-compiler (>= 0.0.2) - rake - sequel (4.44.0) - sequel_pg (1.6.17) + scrypt (3.0.5) + ffi-compiler (>= 1.0, < 2.0) + sequel (4.46.0) + sequel_pg (1.6.18) pg (>= 0.8.0) sequel (>= 4.0.0) - shotgun (0.9.1) + shotgun (0.9.2) rack (>= 1.0) - sidekiq (4.1.2) + sidekiq (4.1.4) concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.0) redis (~> 3.2, >= 3.2.1) + sinatra (>= 1.4.7) simplecov (0.14.1) docile (~> 1.1.0) json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) - simpleidn (0.0.6) - sinatra (1.4.8) - rack (~> 1.5) - rack-protection (~> 1.4) - tilt (>= 1.3, < 3) + simpleidn (0.0.7) + sinatra (2.0.0) + mustermann (~> 1.0) + rack (~> 2.0) + rack-protection (= 2.0.0) + tilt (~> 2.0) sinatra-flash (0.3.0) sinatra (>= 1.0.0) sinatra-xsendfile (0.4.2) sinatra (>= 0.9.1) - sixarm_ruby_unaccent (1.1.1) slop (3.6.0) storable (0.8.9) stripe (1.15.0) @@ -255,28 +254,28 @@ GEM sysinfo (0.8.1) drydock storable - term-ansicolor (1.5.0) + term-ansicolor (1.6.0) tins (~> 1.0) thor (0.19.4) thread (0.2.2) thread_safe (0.3.6) - tilt (2.0.6) + tilt (2.0.7) timecop (0.8.1) tins (1.13.2) tzinfo (1.2.3) thread_safe (~> 0.1) unf (0.1.4) unf_ext - unf_ext (0.0.7.2) + unf_ext (0.0.7.4) uuidtools (2.1.5) - webmock (2.3.2) + webmock (3.0.1) addressable (>= 2.3.6) crack (>= 0.3.2) hashdiff - websocket-driver (0.6.4) + websocket-driver (0.6.5) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.2) - will_paginate (3.1.0) + will_paginate (3.1.5) xmlrpc (0.3.0) xpath (2.0.0) nokogiri (~> 1.3) @@ -348,7 +347,7 @@ DEPENDENCIES sidekiq (~> 4.1.2) simplecov simpleidn - sinatra + sinatra (= 2.0.0) sinatra-flash sinatra-xsendfile stripe (= 1.15.0) diff --git a/app/browse.rb b/app/browse.rb index aefec838..08d33603 100644 --- a/app/browse.rb +++ b/app/browse.rb @@ -6,14 +6,14 @@ get '/browse/?' do params.delete 'tag' if params[:tag].nil? || params[:tag].strip.empty? if is_education? - site_dataset = education_sites_dataset + ds = education_sites_dataset else - site_dataset = browse_sites_dataset + ds = browse_sites_dataset end - site_dataset = site_dataset.paginate @page, Site::BROWSE_PAGINATION_LENGTH - @pagination_dataset = site_dataset - @sites = site_dataset.all + ds = ds.paginate @page, Site::BROWSE_PAGINATION_LENGTH + @pagination_dataset = ds + @sites = ds.all site_ids = @sites.collect {|s| s[:id]} tags = DB['select site_id,name from tags join sites_tags on tags.id=sites_tags.tag_id where site_id IN ?', site_ids].all @@ -31,25 +31,24 @@ get '/browse/?' do end def education_sites_dataset - site_dataset = Site.filter is_deleted: false - site_dataset = site_dataset.association_join(:tags).select_all(:sites) + ds = Site.filter is_deleted: false + ds = ds.association_join(:tags).select_all(:sites) params[:tag] = current_site.tags.first.name - site_dataset.where! ['tags.name = ?', params[:tag]] + ds = ds.where ['tags.name = ?', params[:tag]] end def browse_sites_dataset - - site_dataset = Site.browse_dataset + ds = Site.browse_dataset if current_site - site_dataset.or! sites__id: current_site.id + ds = ds.or sites__id: current_site.id if !current_site.blocking_site_ids.empty? - site_dataset.where!(Sequel.~(Sequel.qualify(:sites, :id) => current_site.blocking_site_ids)) + ds = ds.where(Sequel.~(Sequel.qualify(:sites, :id) => current_site.blocking_site_ids)) end if current_site.blocks_dataset.count - site_dataset.where!( + ds = ds.where( Sequel.~(Sequel.qualify(:sites, :id) => current_site.blocks_dataset.select(:actioning_site_id).all.collect {|s| s.actioning_site_id}) ) end @@ -57,56 +56,56 @@ def browse_sites_dataset case params[:sort_by] when 'special_sauce' - site_dataset.exclude! score: nil - site_dataset.order! :score.desc + ds = ds.exclude score: nil + ds = ds.order :score.desc when 'followers' - site_dataset.order! :follow_count.desc, :updated_at.desc + ds = ds.order :follow_count.desc, :updated_at.desc when 'supporters' - site_dataset.exclude! plan_type: nil - site_dataset.exclude! plan_type: 'free' - site_dataset.order! :views.desc, :site_updated_at.desc + ds = ds.exclude plan_type: nil + ds = ds.exclude plan_type: 'free' + ds = ds.order :views.desc, :site_updated_at.desc when 'featured' - site_dataset.exclude! featured_at: nil - site_dataset.order! :featured_at.desc + ds = ds.exclude featured_at: nil + ds = ds.order :featured_at.desc when 'hits' - site_dataset.where!{views > 100} - site_dataset.order!(:hits.desc, :site_updated_at.desc) + ds = ds.where{views > 100} + ds = ds.order(:hits.desc, :site_updated_at.desc) when 'views' - site_dataset.where!{views > 100} - site_dataset.order!(:views.desc, :site_updated_at.desc) + ds = ds.where{views > 100} + ds = ds.order(:views.desc, :site_updated_at.desc) when 'newest' - site_dataset.order!(:created_at.desc, :views.desc) + ds = ds.order(:created_at.desc, :views.desc) when 'oldest' - site_dataset.where!{views > 100} - site_dataset.order!(:created_at, :views.desc) + ds = ds.where{views > 100} + ds = ds.order(:created_at, :views.desc) when 'random' - site_dataset.where!{views > 100} - site_dataset.where! 'random() < 0.01' + ds = ds.where{views > 100} + ds = ds.where 'random() < 0.01' when 'last_updated' - site_dataset.where!{views > 100} + ds = ds.where{views > 100} params[:sort_by] = 'last_updated' - site_dataset.exclude!(site_updated_at: nil) - site_dataset.order!(:site_updated_at.desc, :views.desc) + ds = ds.exclude(site_updated_at: nil) + ds = ds.order(:site_updated_at.desc, :views.desc) when 'tipping_enabled' - site_dataset.where! tipping_enabled: true - site_dataset.where!("(tipping_paypal is not null and tipping_paypal != '') or (tipping_bitcoin is not null and tipping_bitcoin != '')") - site_dataset.where!{views > 10_000} - site_dataset.group! :sites__id - site_dataset.order! :follow_count.desc, :views.desc, :updated_at.desc + ds = ds.where tipping_enabled: true + ds = ds.where("(tipping_paypal is not null and tipping_paypal != '') or (tipping_bitcoin is not null and tipping_bitcoin != '')") + ds = ds.where{views > 10_000} + ds = ds.group :sites__id + ds = ds.order :follow_count.desc, :views.desc, :updated_at.desc else params[:sort_by] = 'followers' - site_dataset.order! :follow_count.desc, :views.desc, :updated_at.desc + ds = ds.order :follow_count.desc, :views.desc, :updated_at.desc end - site_dataset.where! ['sites.is_nsfw = ?', (params[:is_nsfw] == 'true' ? true : false)] + ds = ds.where ['sites.is_nsfw = ?', (params[:is_nsfw] == 'true' ? true : false)] if params[:tag] - site_dataset.select_all! :sites - site_dataset.inner_join! :sites_tags, :site_id => :id - site_dataset.inner_join! :tags, :id => :sites_tags__tag_id - site_dataset.where! ['tags.name = ?', params[:tag]] - site_dataset.where! ['tags.is_nsfw = ?', (params[:is_nsfw] == 'true' ? true : false)] + ds = ds.select_all :sites + ds = ds.inner_join :sites_tags, :site_id => :id + ds = ds.inner_join :tags, :id => :sites_tags__tag_id + ds = ds.where ['tags.name = ?', params[:tag]] + ds = ds.where ['tags.is_nsfw = ?', (params[:is_nsfw] == 'true' ? true : false)] end - site_dataset + ds end diff --git a/app/site_files.rb b/app/site_files.rb index 6601c222..70a62b75 100644 --- a/app/site_files.rb +++ b/app/site_files.rb @@ -59,11 +59,10 @@ post '/site_files/create' do site_file ||= SiteFile.new site_id: current_site.id, path: name - site_file.set_all( - size: 0, - sha1_hash: Digest::SHA1.hexdigest(''), - updated_at: Time.now - ) + site_file.size = 0 + site_file.set size: 0 + site_file.set sha1_hash: Digest::SHA1.hexdigest('') + site_file.set updated_at: Time.now site_file.save end diff --git a/environment.rb b/environment.rb index fcc5ce93..29f7dce5 100644 --- a/environment.rb +++ b/environment.rb @@ -33,6 +33,8 @@ raise 'hash_ip_salt is required' unless $config['ip_hash_salt'] DB = Sequel.connect $config['database'], sslmode: 'disable', max_connections: $config['database_pool'] DB.extension :pagination +DB.extension :auto_literal_strings +Sequel.split_symbols = true require 'will_paginate/sequel' diff --git a/models/comment.rb b/models/comment.rb index 33838c58..d7b03a6d 100644 --- a/models/comment.rb +++ b/models/comment.rb @@ -4,7 +4,13 @@ class Comment < Sequel::Model many_to_one :actioning_site, class: :Site one_to_many :comment_likes - dataset.exclude! is_deleted: true + def dataset + if @_is_deleted_filter_set.nil? + @dataset = @dataset.filter is_deleted: false + @_is_deleted_filter_set = true + end + super + end def liking_site_titles comment_likes_dataset.select(:id, :actioning_site_id).all.collect do |comment_like| diff --git a/models/site.rb b/models/site.rb index 95a7359e..87e0687b 100644 --- a/models/site.rb +++ b/models/site.rb @@ -919,7 +919,7 @@ class Site < Sequel::Model # Check for existing email if new or changing email. if new? || @original_email email_check = self.class.select(:id).filter(email: values[:email]) - email_check.exclude!(id: self.id) unless new? + email_check = email_check.exclude(id: self.id) unless new? email_check = email_check.first if parent? && email_check && email_check.id != self.id @@ -1313,19 +1313,13 @@ class Site < Sequel::Model return suggestions if suggestions.length == limit - # Old. - #suggestions += suggestions_dataset.where("views >= #{SUGGESTIONS_VIEWS_MIN}").limit(limit-suggestions.length).order(Sequel.lit('RANDOM()')).all + ds = self.class.browse_dataset + ds = ds.select_all :sites + ds = ds.order :follow_count.desc, :updated_at.desc + ds = ds.where Sequel.lit("views >= #{SUGGESTIONS_VIEWS_MIN}") + ds = ds.limit limit - suggestions.length - # New: - - site_dataset = self.class.browse_dataset - site_dataset.select_all! :sites - site_dataset.order! :follow_count.desc, :updated_at.desc - site_dataset.where! "views >= #{SUGGESTIONS_VIEWS_MIN}" - site_dataset.limit! limit-suggestions.length - #site_dataset.order! Sequel.lit('RANDOM()') - - suggestions += site_dataset.all + suggestions += ds.all end def screenshot_path(path, resolution) @@ -1548,11 +1542,9 @@ class Site < Sequel::Model site_file ||= SiteFile.new site_id: self.id, path: relative_path - site_file.set_all( - size: uploaded_size, - sha1_hash: uploaded_sha1, - updated_at: Time.now - ) + site_file.set size: uploaded_size + site_file.set sha1_hash: uploaded_sha1 + site_file.set updated_at: Time.now site_file.save purge_cache path