blastr 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -3,6 +3,8 @@ require 'hoe'
3
3
  $:.unshift(File.dirname(__FILE__) + "/lib")
4
4
  require File.expand_path(File.join(File.dirname(__FILE__), 'lib/blastr'))
5
5
 
6
+ Hoe.plugin :git
7
+
6
8
  Hoe.spec 'blastr' do
7
9
  name = "blastr"
8
10
  developer('Lasse Koskela', 'lasse.koskela@gmail.com')
@@ -14,6 +16,6 @@ Hoe.spec 'blastr' do
14
16
  remote_rdoc_dir = '' # Release to root
15
17
  rsync_args = '-av --delete --ignore-errors'
16
18
  extra_deps = [
17
- ['git','>= 1.0.5'],
19
+ ['git','>= 1.2.5'],
18
20
  ]
19
21
  end
@@ -3,26 +3,20 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) unless
3
3
 
4
4
  module Blastr
5
5
  require File.expand_path(File.join(File.dirname(__FILE__), 'error.rb'))
6
+ require File.expand_path(File.join(File.dirname(__FILE__), 'filesystem.rb'))
6
7
  require File.expand_path(File.join(File.dirname(__FILE__), 'scm/scm.rb'))
7
8
  require File.expand_path(File.join(File.dirname(__FILE__), 'tts/tts.rb'))
8
9
  require File.expand_path(File.join(File.dirname(__FILE__), 'people/people.rb'))
9
10
 
10
- VERSION = '0.1.0'
11
+ VERSION = '0.1.1'
11
12
  COPYRIGHT = "Copyright (c) 2009-#{Time.now.year}, Lasse Koskela. All Rights Reserved."
12
13
 
13
14
  def self.trap_and_exit(signal)
14
15
  trap(signal) {
15
- puts ""
16
+ puts "\nBye!"
16
17
  exit 0
17
18
  }
18
19
  end
19
-
20
- def self.delete_at_exit(file_or_directory)
21
- at_exit do
22
- puts "Cleaning up leftovers: #{temp_dir}" if File.directory?(temp_dir) if $DEBUG
23
- FileUtils.remove_dir(temp_dir, :force => true)
24
- end
25
- end
26
20
 
27
21
  class Process
28
22
  def initialize(args)
@@ -36,7 +30,7 @@ module Blastr
36
30
 
37
31
  def run
38
32
  puts "Polling #{@scm.name} commits since revision #{@since_revision}..."
39
- while true
33
+ while should_run?
40
34
  announce_new_commits
41
35
  sleep 30
42
36
  end
@@ -48,6 +42,9 @@ module Blastr
48
42
  end
49
43
 
50
44
  private
45
+
46
+ def should_run? ; true ; end
47
+
51
48
  def announce_new_commits
52
49
  @scm.commits_since(@since_revision.to_s).each do |commit|
53
50
  if @since_revision.before?(commit.revision)
@@ -56,16 +53,9 @@ module Blastr
56
53
  end
57
54
  end
58
55
  end
56
+
59
57
  def validate(args=[])
60
58
  raise UsageError.new if args.size == 0 or args.size > 2
61
59
  end
62
60
  end
63
-
64
- def Blastr::temp_dir
65
- temp_file = Tempfile.new("tmp")
66
- temp_dir = temp_file.path
67
- temp_file.unlink
68
- FileUtils.mkdir_p(temp_dir)
69
- temp_dir
70
- end
71
61
  end
@@ -57,7 +57,6 @@ module Blastr::SourceControl
57
57
 
58
58
  def as_revision(arg)
59
59
  raise "Invalid revision: #{arg}" unless arg =~ /^(HEAD(~\d+)?)|([\d\w:-]+)$/
60
- obj = nil
61
60
  revision = nil
62
61
  with_clone do |clone|
63
62
  obj = clone.object(arg.to_s)
@@ -91,8 +90,8 @@ module Blastr::SourceControl
91
90
  end
92
91
 
93
92
  def with_clone
94
- temp_dir = Blastr::temp_dir
95
- Blastr::delete_at_exit(temp_dir)
93
+ temp_dir = Blastr::FileSystem.temp_dir
94
+ Blastr::FileSystem.delete_at_exit(temp_dir)
96
95
  begin
97
96
  clone = ::Git.clone(@git_url, temp_dir)
98
97
  clone.chdir do
@@ -74,8 +74,8 @@ module Blastr::SourceControl
74
74
 
75
75
  private
76
76
  def with_clone
77
- clone_dir = Blastr::temp_dir
78
- Blastr::delete_at_exit(clone_dir)
77
+ clone_dir = Blastr::FileSystem.temp_dir
78
+ Blastr::FileSystem::delete_at_exit(clone_dir)
79
79
  %x[hg clone #{@repo_url} #{clone_dir}]
80
80
  current_dir = Dir.pwd
81
81
  Dir.chdir(clone_dir)
@@ -86,7 +86,7 @@ module Blastr::SourceControl
86
86
 
87
87
  def svn_log(since_revision = as_revision("1"))
88
88
  temp_file = Tempfile.new("svn.log").path
89
- Blastr::delete_at_exit(temp_file)
89
+ Blastr::FileSystem::delete_at_exit(temp_file)
90
90
  begin
91
91
  revision = "#{since_revision}:#{as_revision('HEAD')}"
92
92
  revision = as_revision("HEAD") if since_revision.to_s == as_revision("HEAD").to_s
@@ -28,7 +28,7 @@ class TestPeopleFile < Test::Unit::TestCase
28
28
  private
29
29
  def backup_people_file
30
30
  people_file = Blastr::People::PEOPLE_FILE
31
- @backup_of_people_file = File.join(Blastr::temp_dir, File.basename(people_file))
31
+ @backup_of_people_file = File.join(Blastr::FileSystem.temp_dir, File.basename(people_file))
32
32
  FileUtils.cp(people_file, @backup_of_people_file)
33
33
  end
34
34
  def restore_people_file
@@ -55,7 +55,7 @@ class TestGit < AbstractScmTestCase
55
55
  private
56
56
 
57
57
  def create_local_repo
58
- dir = File.join(Blastr::temp_dir, 'git_repo')
58
+ dir = File.join(Blastr::FileSystem.temp_dir, 'git_repo')
59
59
  %x[git init #{dir}]
60
60
  assert File.directory? dir
61
61
  dir
@@ -51,7 +51,7 @@ class TestSubversion < AbstractScmTestCase
51
51
  end
52
52
 
53
53
  def create_local_repo
54
- dir = File.join(Blastr::temp_dir, 'svn_repo')
54
+ dir = File.join(Blastr::FileSystem.temp_dir, 'svn_repo')
55
55
  %x[svnadmin create #{dir}]
56
56
  assert File.directory? dir
57
57
  dir
@@ -1,6 +1,28 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper.rb'))
2
+ require 'mocha'
2
3
 
3
- class TestBlastrProcess < Test::Unit::TestCase
4
+ module Blastr
5
+ class Process
6
+ attr_accessor :scm
7
+ attr_reader :seconds_slept
8
+
9
+ # override sleep() to speed up test runs
10
+ def sleep(seconds)
11
+ @seconds_slept ||= 0
12
+ @seconds_slept += seconds
13
+ end
14
+
15
+ # override should_run? to make the process
16
+ # stop after three polling iterations
17
+ def should_run?
18
+ @iterations ||= 0
19
+ @iterations += 1
20
+ @iterations <= 3
21
+ end
22
+ end
23
+ end
24
+
25
+ class TestBlastrProcessArguments < Test::Unit::TestCase
4
26
  def test_command_line_arguments_are_validated
5
27
  assert_raise Blastr::UsageError do
6
28
  Blastr::Process.new([])
@@ -12,4 +34,48 @@ class TestBlastrProcess < Test::Unit::TestCase
12
34
  Blastr::Process.new(["http://svn.com", "123"])
13
35
  end
14
36
  end
37
+ end
38
+
39
+ class TestBlastrProcess < Test::Unit::TestCase
40
+ def setup
41
+ @since_revision = '1'
42
+ @process = create_blastr_process_polling("http://svn.com", @since_revision)
43
+ end
44
+
45
+ def test_polls_for_new_commits_every_30_seconds
46
+ @process.expects(:announce_new_commits).times(3)
47
+ @process.run
48
+ assert_equal 3*30, @process.seconds_slept
49
+ end
50
+
51
+ def test_announcing_all_new_commits
52
+ commits = [ fake_commit('2'), fake_commit('3') ]
53
+ commit_sequence = sequence('commit sequence')
54
+ @process.scm.expects(:commits_since).with(@since_revision).returns(commits)
55
+ @process.expects(:announce).with(commits.first).in_sequence(commit_sequence)
56
+ @process.expects(:announce).with(commits.last).in_sequence(commit_sequence)
57
+ @process.send(:announce_new_commits)
58
+ end
59
+
60
+ def test_announcing_a_given_commit
61
+ commit = fake_commit('42')
62
+ Blastr::People.stubs(:full_name_of).returns('Full Name')
63
+ Blastr::TTS.expects(:speak).with("Commit by Full Name: #{commit.comment}")
64
+ @process.expects(:puts).with("[#{commit.revision}] Commit by #{commit.author}: #{commit.comment}")
65
+ @process.announce(commit)
66
+ end
67
+
68
+ private
69
+
70
+ def fake_commit(rev)
71
+ revision = Blastr::SourceControl::SubversionRevision.new(rev)
72
+ Blastr::SourceControl::LogEntry.new(revision, 'author', 'comment')
73
+ end
74
+
75
+ def create_blastr_process_polling(url, since_revision)
76
+ process = Blastr::Process.new([url, since_revision])
77
+ process.scm = mock()
78
+ process.scm.class.any_instance.stubs(:name).returns('Fake')
79
+ process
80
+ end
15
81
  end
@@ -0,0 +1,34 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper.rb'))
2
+
3
+ module Blastr::FileSystem
4
+ # intercept calls to Kernel.at_exit to allow invoking
5
+ # registered at_exit blocks before the process exits
6
+ def self.at_exit(&block)
7
+ @at_exit_blocks ||= []
8
+ @at_exit_blocks << block
9
+ end
10
+
11
+ def self.execute_all_at_exit_blocks
12
+ @at_exit_blocks.each { |block| block.call }
13
+ end
14
+ end
15
+
16
+ class FileSystemTest < Test::Unit::TestCase
17
+
18
+ def setup
19
+ @file_to_delete = File.expand_path(File.join(Blastr::FileSystem.temp_dir, 'file_to_be_deleted'))
20
+ FileUtils.touch(@file_to_delete)
21
+ end
22
+
23
+ def teardown
24
+ FileUtils.rm(@file_to_delete) if File.exist?(@file_to_delete)
25
+ end
26
+
27
+ def test_delete_at_exit
28
+ Blastr::FileSystem.delete_at_exit(@file_to_delete)
29
+ assert File.exist?(@file_to_delete)
30
+ Blastr::FileSystem.execute_all_at_exit_blocks
31
+ assert ! File.exist?(@file_to_delete)
32
+ end
33
+
34
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blastr
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Lasse Koskela
@@ -104,6 +104,7 @@ files:
104
104
  - test/test_helper.rb
105
105
  - test/tts/test_tts.rb
106
106
  - website/index.html
107
+ - test/test_filesystem.rb
107
108
  has_rdoc: true
108
109
  homepage: http://rubyforge.org/projects/blastr/
109
110
  licenses: []
@@ -152,5 +153,6 @@ test_files:
152
153
  - test/scm/test_svn_log.rb
153
154
  - test/scm/test_svn_revision.rb
154
155
  - test/test_blastr.rb
156
+ - test/test_filesystem.rb
155
157
  - test/test_helper.rb
156
158
  - test/tts/test_tts.rb