From ef76e1821539b9abf2ce43c8953772cebb2689e9 Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Wed, 19 Jun 2013 00:19:42 -0700 Subject: [PATCH 1/2] Optionally invalidate onebox in PostAnalyzer#cook --- app/models/post_analyzer.rb | 3 ++- spec/models/post_analyzer_spec.rb | 38 +++++++++++++++++++++++++++---- spec/models/post_spec.rb | 2 ++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/models/post_analyzer.rb b/app/models/post_analyzer.rb index 5431a16ce38..29790bcaf92 100644 --- a/app/models/post_analyzer.rb +++ b/app/models/post_analyzer.rb @@ -20,7 +20,8 @@ class PostAnalyzer # wait for the post processor. dirty = false result = Oneboxer.apply(cooked) do |url, elem| - Oneboxer.render_from_cache(url) + Oneboxer.invalidate(url) if args.last[:invalidate_oneboxes] + Oneboxer.onebox url end cooked = result.to_html if result.changed? diff --git a/spec/models/post_analyzer_spec.rb b/spec/models/post_analyzer_spec.rb index 8b161c01682..22ed5eba86a 100644 --- a/spec/models/post_analyzer_spec.rb +++ b/spec/models/post_analyzer_spec.rb @@ -2,10 +2,39 @@ require 'spec_helper' describe PostAnalyzer do - let(:topic) { Fabricate(:topic) } - let(:default_topic_id) { topic.id } - let(:post_args) do - {user: topic.user, topic: topic} + let(:default_topic_id) { 12 } + + describe '#cook' do + let(:post_analyzer) { described_class.new nil, nil } + + let(:args) { [raw, options] } + let(:raw) { "Here's a tweet:\n#{url}" } + let(:options) { {} } + + let(:url) { + 'https://twitter.com/evil_trout/status/345954894420787200' + } + + before { Oneboxer.stubs(:onebox) } + + it 'fetches the onebox for any urls in the post' do + Oneboxer.expects(:onebox).with url + post_analyzer.cook(*args) + end + + it 'does not invalidate the onebox cache' do + Oneboxer.expects(:invalidate).with(url).never + post_analyzer.cook(*args) + end + + context 'when invalidating oneboxes' do + let(:options) {{ invalidate_oneboxes: true }} + + it 'invalidates the oneboxes for urls in the post' do + Oneboxer.expects(:invalidate).with url + post_analyzer.cook(*args) + end + end end context "links" do @@ -115,6 +144,7 @@ describe PostAnalyzer do end it "finds links from markdown" do + Oneboxer.stubs :onebox post_analyzer = PostAnalyzer.new(raw_post_one_link_md, default_topic_id) post_analyzer.link_count.should == 1 end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index 2a8b5dd3fed..bd2bc0411cb 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -2,6 +2,8 @@ require 'spec_helper' require_dependency 'post_destroyer' describe Post do + before { Oneboxer.stubs :onebox } + # Help us build a post with a raw body def post_with_body(body, user=nil) args = post_args.merge(raw: body) From 9565843d449bf3f5eb4f70080c31a1640878dd59 Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Wed, 19 Jun 2013 00:20:30 -0700 Subject: [PATCH 2/2] Create post:refresh_oneboxes rake task --- lib/tasks/posts.rake | 48 +++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/lib/tasks/posts.rake b/lib/tasks/posts.rake index 4fa472c65ab..2228e11f504 100644 --- a/lib/tasks/posts.rake +++ b/lib/tasks/posts.rake @@ -1,25 +1,41 @@ -desc "walk all posts updating cooked with latest markdown" -task "posts:rebake" => :environment do +desc 'Update each post with latest markdown' +task 'posts:rebake' => :environment do + rebake_posts +end + +desc 'Update each post with latest markdown and refresh oneboxes' +task 'posts:refresh_oneboxes' => :environment do + rebake_posts invalidate_oneboxes: true +end + +def rebake_posts(opts = {}) RailsMultisite::ConnectionManagement.each_connection do |db| puts "Re baking post markdown for #{db} , changes are denoted with # , no change with ." - i = 0 - Post.select([:id, :user_id, :cooked, :raw, :topic_id, :post_number]).each do |p| - i += 1 - cooked = p.cook(p.raw, topic_id: p.topic_id) - if cooked != p.cooked - Post.exec_sql('update posts set cooked = ? where id = ?', cooked, p.id) - p.cooked = cooked + + total = Post.select([ + :id, :user_id, :cooked, :raw, :topic_id, :post_number + ]).inject(0) do |total, post| + cooked = post.cook( + post.raw, + topic_id: post.topic_id, + invalidate_oneboxes: opts.fetch(:invalidate_oneboxes, false) + ) + + if cooked != post.cooked + Post.exec_sql( + 'update posts set cooked = ? where id = ?', cooked, post.id + ) + post.cooked = cooked putc "#" else putc "." end - TopicLink.extract_from(p) - end - puts - puts - puts "#{i} posts done!" - puts "-----------------------------------------------" - puts + TopicLink.extract_from post + + total += 1 + end + + puts "\n\n#{total} posts done!\n#{'-' * 50}\n" end end