From 3546ab2952b306ec3d12d1bac4ecf81953223494 Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sat, 18 Oct 2014 15:33:52 -0700 Subject: [PATCH] add dirty checking and version support to HarpBlog --- public/version.txt | 1 + server/harp_blog.rb | 32 ++++++++++++++++++++- server/spec/harp_blog_spec.rb | 54 ++++++++++++++++++++++++++++------- server/spec/helpers.rb | 26 +++++++++++++++++ server/web_version_finder.rb | 11 +++++++ 5 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 public/version.txt create mode 100644 server/web_version_finder.rb diff --git a/public/version.txt b/public/version.txt new file mode 100644 index 0000000..49915b3 --- /dev/null +++ b/public/version.txt @@ -0,0 +1 @@ +890b1508c132cd5ee5db1c28e9dced538b504d96 diff --git a/server/harp_blog.rb b/server/harp_blog.rb index 811d605..4af4515 100644 --- a/server/harp_blog.rb +++ b/server/harp_blog.rb @@ -1,6 +1,7 @@ require 'fileutils' require 'json' require './web_title_finder' +require './web_version_finder' class HarpBlog @@ -100,10 +101,31 @@ class HarpBlog end # Post - def initialize(path, dry_run = true, title_finder = nil) + def initialize(path, dry_run = true, title_finder = nil, version_finder = nil) @path = path @dry_run = dry_run @title_finder = title_finder || WebTitleFinder.new + @version_finder = version_finder || WebVersionFinder.new + end + + def local_version + git_sha + end + + def remote_version + @version_finder.find_version + end + + def dirty? + local_version != remote_version + end + + def status + { + 'local-version' => local_version, + 'remote-version' => remote_version, + 'dirty' => dirty?, + } end def years @@ -353,6 +375,14 @@ class HarpBlog end end + def git_sha + if output = run('git log -n1 | head -n1 | cut -d" " -f2') + output.strip + else + 'fake-sha' + end + end + def git_commit(title, *files) quoted_files = files.map { |f| "\"#{quote(f)}\"" } message = "linked '#{quote(title)}'" diff --git a/server/spec/harp_blog_spec.rb b/server/spec/harp_blog_spec.rb index 887d158..b4d309c 100644 --- a/server/spec/harp_blog_spec.rb +++ b/server/spec/harp_blog_spec.rb @@ -143,7 +143,10 @@ RSpec.describe HarpBlog do before :each do @test_blog_ref = git_sha(TEST_BLOG_PATH) dry_run = false - @blog = HarpBlog.new(TEST_BLOG_PATH, dry_run) + @mock_title = 'fancy title' + @mock_title_finder = mock_title_finder(@mock_title) + @mock_version_finder = mock_version_finder(@test_blog_ref) + @blog = HarpBlog.new(TEST_BLOG_PATH, dry_run, @mock_title_finder, @mock_version_finder) end after :each do @@ -161,6 +164,40 @@ RSpec.describe HarpBlog do end end + describe '#local_version' do + it "should expose the local version" do + expect(@blog.local_version).to eq(@test_blog_ref) + end + end + + describe '#remote_version' do + it "should expose the remote version" do + expect(@blog.remote_version).to eq(@test_blog_ref) + end + end + + describe '#dirty?' do + it "should specify whether or not there are unpublished changes" do + expect(@blog.dirty?).to be_falsy + + @blog.create_post('title', 'body', nil) + expect(@blog.dirty?).to be_truthy + + @blog.publish + @mock_version_finder.version = @blog.local_version + expect(@blog.dirty?).to be_falsy + end + end + + describe '#status' do + it "should expose the local and remote versions, and dirty state" do + status = @blog.status + expect(status['local-version']).to eq(@blog.local_version) + expect(status['remote-version']).to eq(@blog.remote_version) + expect(status['dirty']).to eq(@blog.dirty?) + end + end + describe '#years' do it "should return all of the years with posts" do # yup, if I don't blog for an entire year that's a bug! @@ -247,16 +284,11 @@ RSpec.describe HarpBlog do end it "should fetch titles if necessary" do - class TitleFinder - def find_title(url) 'fancy title' end - end - dry_run = false - blog = HarpBlog.new(TEST_BLOG_PATH, dry_run, TitleFinder.new) - post = blog.create_post(nil, nil, 'http://samhuri.net') - expect(post.title).to eq('fancy title') - blog.delete_post(post.time.year.to_s, post.padded_month, post.slug) - post = blog.create_post(" \t\n", nil, 'http://samhuri.net') - expect(post.title).to eq('fancy title') + post = @blog.create_post(nil, nil, 'http://samhuri.net') + expect(post.title).to eq(@mock_title) + @blog.delete_post(post.time.year.to_s, post.padded_month, post.slug) + post = @blog.create_post(" \t\n", nil, 'http://samhuri.net') + expect(post.title).to eq(@mock_title) end it "should push the new post to the origin repo" do diff --git a/server/spec/helpers.rb b/server/spec/helpers.rb index bf8f0f5..6f0303c 100644 --- a/server/spec/helpers.rb +++ b/server/spec/helpers.rb @@ -42,4 +42,30 @@ module Helpers end end + class TitleFinder + attr_accessor :title + def initialize(title) + @title = title + end + def find_title(url) @title end + end + + def mock_title_finder(title) + TitleFinder.new(title) + end + + class VersionFinder + attr_accessor :version + def initialize(version) + @version = version + end + def find_version(url = nil) + @version + end + end + + def mock_version_finder(version) + VersionFinder.new(version) + end + end diff --git a/server/web_version_finder.rb b/server/web_version_finder.rb new file mode 100644 index 0000000..cc8b177 --- /dev/null +++ b/server/web_version_finder.rb @@ -0,0 +1,11 @@ +require 'open-uri' + +class WebVersionFinder + + DEFAULT_URL = 'http://samhuri.net/version.txt' + + def find_version(url = nil) + open(url || DEFAULT_URL).read.strip + end + +end