blastr 0.0.18 → 0.1.0
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/History.txt +5 -0
- data/Manifest.txt +14 -9
- data/README.txt +8 -0
- data/Rakefile +1 -1
- data/bin/blastr +2 -1
- data/lib/blastr.rb +8 -36
- data/lib/error.rb +32 -0
- data/lib/scm/git.rb +22 -6
- data/lib/scm/hg.rb +1 -1
- data/lib/scm/scm.rb +3 -3
- data/lib/scm/svn.rb +23 -3
- data/test/people/test_people.rb +37 -0
- data/test/scm/abstract_scm_testcase.rb +19 -0
- data/test/scm/test_git.rb +67 -0
- data/test/{test_git_log_entry.rb → scm/test_git_log_entry.rb} +1 -1
- data/test/scm/test_git_revision.rb +35 -0
- data/test/scm/test_log_entry.rb +22 -0
- data/test/scm/test_mercurial.rb +23 -0
- data/test/{test_mercurial_log.rb → scm/test_mercurial_log.rb} +1 -1
- data/test/{test_mercurial_revision.rb → scm/test_mercurial_revision.rb} +1 -1
- data/test/scm/test_svn.rb +60 -0
- data/test/{test_svn_log.rb → scm/test_svn_log.rb} +1 -1
- data/test/{test_svn_revision.rb → scm/test_svn_revision.rb} +1 -1
- data/test/test_blastr.rb +1 -1
- data/test/test_helper.rb +17 -1
- data/test/{test_tts.rb → tts/test_tts.rb} +8 -1
- metadata +64 -42
- data/test/test_git_revision.rb +0 -35
- data/test/test_scm_logentry.rb +0 -13
- data/test/test_scm_url_matching.rb +0 -58
data/History.txt
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
== 0.0.18 2010-02-19
|
2
|
+
|
3
|
+
* Omit URLs in speech.
|
4
|
+
|
1
5
|
== 0.0.17 2009-02-21
|
2
6
|
|
3
7
|
* Removed replacement of non-ascii characters in commit messages.
|
8
|
+
|
4
9
|
== 0.0.16 2009-02-21
|
5
10
|
|
6
11
|
* Added support for HTTP-based, SSH-based, Rsync-based, and file system-based Git URLs.
|
data/Manifest.txt
CHANGED
@@ -6,6 +6,7 @@ Rakefile
|
|
6
6
|
bin/blastr
|
7
7
|
config/website.yml
|
8
8
|
lib/blastr.rb
|
9
|
+
lib/error.rb
|
9
10
|
lib/people/people.rb
|
10
11
|
lib/scm/git.rb
|
11
12
|
lib/scm/hg.rb
|
@@ -15,15 +16,19 @@ lib/tts/tts.rb
|
|
15
16
|
script/console
|
16
17
|
script/destroy
|
17
18
|
script/generate
|
19
|
+
test/people/test_people.rb
|
20
|
+
test/scm/abstract_scm_testcase.rb
|
21
|
+
test/scm/test_git.rb
|
22
|
+
test/scm/test_git_log_entry.rb
|
23
|
+
test/scm/test_git_revision.rb
|
24
|
+
test/scm/test_log_entry.rb
|
25
|
+
test/scm/test_mercurial.rb
|
26
|
+
test/scm/test_mercurial_log.rb
|
27
|
+
test/scm/test_mercurial_revision.rb
|
28
|
+
test/scm/test_svn.rb
|
29
|
+
test/scm/test_svn_log.rb
|
30
|
+
test/scm/test_svn_revision.rb
|
18
31
|
test/test_blastr.rb
|
19
|
-
test/test_git_log_entry.rb
|
20
|
-
test/test_git_revision.rb
|
21
32
|
test/test_helper.rb
|
22
|
-
test/
|
23
|
-
test/test_mercurial_revision.rb
|
24
|
-
test/test_scm_logentry.rb
|
25
|
-
test/test_scm_url_matching.rb
|
26
|
-
test/test_svn_log.rb
|
27
|
-
test/test_svn_revision.rb
|
28
|
-
test/test_tts.rb
|
33
|
+
test/tts/test_tts.rb
|
29
34
|
website/index.html
|
data/README.txt
CHANGED
@@ -38,12 +38,20 @@ Subversion:
|
|
38
38
|
|
39
39
|
blastr http://svn.acme.com/foo/trunk 123
|
40
40
|
|
41
|
+
blastr file:///var/svnrepo
|
42
|
+
|
43
|
+
blastr /var/svnrepo
|
44
|
+
|
41
45
|
Git:
|
42
46
|
|
43
47
|
blastr git://github.com/lkoskela/blastr.git
|
44
48
|
|
45
49
|
blastr git://github.com/lkoskela/blastr.git e528509fddd57194f1c497ce6583f6869e8ed62c
|
46
50
|
|
51
|
+
blastr file:///var/gitrepo
|
52
|
+
|
53
|
+
blastr /var/gitrepo
|
54
|
+
|
47
55
|
Mercurial:
|
48
56
|
|
49
57
|
blastr hg:http://hg.serpentine.com/tutorial/hello
|
data/Rakefile
CHANGED
data/bin/blastr
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
|
-
require
|
4
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/blastr.rb'))
|
5
|
+
puts "Blastr #{Blastr::VERSION}\n#{Blastr::COPYRIGHT}\n"
|
5
6
|
|
6
7
|
begin
|
7
8
|
Blastr::Process.new(ARGV).run
|
data/lib/blastr.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__)) unless
|
2
|
+
$LOAD_PATH.include?(File.dirname(__FILE__)) or $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
|
3
3
|
|
4
4
|
module Blastr
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require '
|
5
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'error.rb'))
|
6
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'scm/scm.rb'))
|
7
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'tts/tts.rb'))
|
8
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'people/people.rb'))
|
8
9
|
|
9
|
-
VERSION = '0.0
|
10
|
+
VERSION = '0.1.0'
|
10
11
|
COPYRIGHT = "Copyright (c) 2009-#{Time.now.year}, Lasse Koskela. All Rights Reserved."
|
11
|
-
puts "Blastr #{VERSION}\n#{COPYRIGHT}\n"
|
12
12
|
|
13
13
|
def self.trap_and_exit(signal)
|
14
14
|
trap(signal) {
|
@@ -24,35 +24,6 @@ module Blastr
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
class UsageError < ArgumentError
|
28
|
-
|
29
|
-
USAGE_TEXT = <<EOS
|
30
|
-
|
31
|
-
Usage: blastr URL [revision]
|
32
|
-
|
33
|
-
The options are as follows:
|
34
|
-
|
35
|
-
URL (required) The URL identifying the source repository
|
36
|
-
you want to observe. For Subversion repositories the
|
37
|
-
URL could be, for example, "http://svn.foo.com/bar" or
|
38
|
-
"svn://svn.foo.com/bar". For a Git repository, the URL
|
39
|
-
usually looks like "git://github.com/foo/bar.git".
|
40
|
-
|
41
|
-
revision (optional) The revision or commit you want to start
|
42
|
-
observing from. For a Subversion repository, this
|
43
|
-
would be a number (e.g. 123 or 5000). For Git, the
|
44
|
-
revision would be the commit SHA hash - something that
|
45
|
-
looks like "4d1863552c03bc1ff9c9376b9a24b04daabc67e2".
|
46
|
-
When this option is omitted, Blastr starts observing
|
47
|
-
from the latest revision onwards.
|
48
|
-
|
49
|
-
EOS
|
50
|
-
|
51
|
-
def initialize
|
52
|
-
super(USAGE_TEXT)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
27
|
class Process
|
57
28
|
def initialize(args)
|
58
29
|
Blastr::trap_and_exit("INT")
|
@@ -94,6 +65,7 @@ EOS
|
|
94
65
|
temp_file = Tempfile.new("tmp")
|
95
66
|
temp_dir = temp_file.path
|
96
67
|
temp_file.unlink
|
68
|
+
FileUtils.mkdir_p(temp_dir)
|
97
69
|
temp_dir
|
98
70
|
end
|
99
71
|
end
|
data/lib/error.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Blastr
|
2
|
+
|
3
|
+
class UsageError < ArgumentError
|
4
|
+
|
5
|
+
USAGE_TEXT = <<EOS
|
6
|
+
|
7
|
+
Usage: blastr URL [revision]
|
8
|
+
|
9
|
+
The options are as follows:
|
10
|
+
|
11
|
+
URL (required) The URL identifying the source repository
|
12
|
+
you want to observe. For Subversion repositories the
|
13
|
+
URL could be, for example, "http://svn.foo.com/bar" or
|
14
|
+
"svn://svn.foo.com/bar". For a Git repository, the URL
|
15
|
+
usually looks like "git://github.com/foo/bar.git".
|
16
|
+
|
17
|
+
revision (optional) The revision or commit you want to start
|
18
|
+
observing from. For a Subversion repository, this
|
19
|
+
would be a number (e.g. 123 or 5000). For Git, the
|
20
|
+
revision would be the commit SHA hash - something that
|
21
|
+
looks like "4d1863552c03bc1ff9c9376b9a24b04daabc67e2".
|
22
|
+
When this option is omitted, Blastr starts observing
|
23
|
+
from the latest revision onwards.
|
24
|
+
|
25
|
+
EOS
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
super(USAGE_TEXT)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/scm/git.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'git'
|
2
|
-
require File.dirname(__FILE__)
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'scm.rb'))
|
3
3
|
|
4
4
|
module Blastr::SourceControl
|
5
5
|
|
@@ -14,9 +14,10 @@ module Blastr::SourceControl
|
|
14
14
|
class GitRevision
|
15
15
|
attr_accessor :name, :date
|
16
16
|
|
17
|
-
def initialize(name, date
|
17
|
+
def initialize(name, date)
|
18
18
|
@name = name
|
19
19
|
@date = date
|
20
|
+
raise ArgumentError if date.nil? and name != "HEAD"
|
20
21
|
end
|
21
22
|
|
22
23
|
def to_s
|
@@ -26,8 +27,11 @@ module Blastr::SourceControl
|
|
26
27
|
def before?(revision)
|
27
28
|
return false if @name == "HEAD"
|
28
29
|
return true if revision.name == "HEAD"
|
29
|
-
|
30
|
-
|
30
|
+
@date < revision.date
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.head
|
34
|
+
GitRevision.new("HEAD", nil)
|
31
35
|
end
|
32
36
|
end
|
33
37
|
|
@@ -35,6 +39,7 @@ module Blastr::SourceControl
|
|
35
39
|
def name; "Git"; end
|
36
40
|
|
37
41
|
def self.understands_url?(url)
|
42
|
+
return true if local_repository?(url)
|
38
43
|
patterns = [ /^(git:)(.*)$/, /^(.*)(\.git)(\/?)$/ ]
|
39
44
|
patterns.each do |regex|
|
40
45
|
return true if url =~ regex
|
@@ -45,6 +50,10 @@ module Blastr::SourceControl
|
|
45
50
|
def initialize(git_url)
|
46
51
|
@git_url = git_url
|
47
52
|
end
|
53
|
+
|
54
|
+
def url
|
55
|
+
@git_url
|
56
|
+
end
|
48
57
|
|
49
58
|
def as_revision(arg)
|
50
59
|
raise "Invalid revision: #{arg}" unless arg =~ /^(HEAD(~\d+)?)|([\d\w:-]+)$/
|
@@ -58,9 +67,9 @@ module Blastr::SourceControl
|
|
58
67
|
end
|
59
68
|
|
60
69
|
def latest_revision
|
61
|
-
commits = commits_since(as_revision("HEAD~
|
70
|
+
commits = commits_since(as_revision("HEAD~1"))
|
62
71
|
return as_revision("HEAD") unless commits.size > 0
|
63
|
-
GitRevision.new(commits.last.revision.to_s)
|
72
|
+
GitRevision.new(commits.last.revision.to_s, commits.last.revision.date)
|
64
73
|
end
|
65
74
|
|
66
75
|
def commits_since(revision)
|
@@ -74,6 +83,13 @@ module Blastr::SourceControl
|
|
74
83
|
end
|
75
84
|
|
76
85
|
private
|
86
|
+
|
87
|
+
def self.local_repository?(path)
|
88
|
+
path = path["file://".length..-1] if path.start_with? "file://"
|
89
|
+
return false unless File.directory?(path)
|
90
|
+
File.directory?(File.join(path, '.git'))
|
91
|
+
end
|
92
|
+
|
77
93
|
def with_clone
|
78
94
|
temp_dir = Blastr::temp_dir
|
79
95
|
Blastr::delete_at_exit(temp_dir)
|
data/lib/scm/hg.rb
CHANGED
data/lib/scm/scm.rb
CHANGED
@@ -30,6 +30,6 @@ module Blastr::SourceControl
|
|
30
30
|
|
31
31
|
end
|
32
32
|
|
33
|
-
|
34
|
-
require File.dirname(__FILE__)
|
35
|
-
|
33
|
+
['svn', 'git', 'hg'].each do |scm|
|
34
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "#{scm}.rb"))
|
35
|
+
end
|
data/lib/scm/svn.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'fileutils'
|
2
|
-
require File.dirname(__FILE__)
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'scm.rb'))
|
3
3
|
|
4
4
|
module Blastr::SourceControl
|
5
5
|
|
@@ -29,11 +29,15 @@ module Blastr::SourceControl
|
|
29
29
|
def name; "Subversion"; end
|
30
30
|
|
31
31
|
def self.understands_url?(url)
|
32
|
-
|
32
|
+
local_repository?(url) or has_protocol_scheme?(url)
|
33
33
|
end
|
34
34
|
|
35
35
|
def initialize(svn_url)
|
36
|
-
@svn_url = svn_url
|
36
|
+
@svn_url = with_protocol_scheme(svn_url)
|
37
|
+
end
|
38
|
+
|
39
|
+
def url
|
40
|
+
@svn_url
|
37
41
|
end
|
38
42
|
|
39
43
|
def as_revision(arg)
|
@@ -64,6 +68,22 @@ module Blastr::SourceControl
|
|
64
68
|
end
|
65
69
|
|
66
70
|
private
|
71
|
+
|
72
|
+
def with_protocol_scheme(path)
|
73
|
+
return path if Subversion.has_protocol_scheme?(path)
|
74
|
+
"file://#{path}"
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.has_protocol_scheme?(path)
|
78
|
+
not path.match(/^(https?:|svn:|file:)(.+)$/).nil?
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.local_repository?(path)
|
82
|
+
path = path["file://".length..-1] if path.start_with? "file://"
|
83
|
+
return false unless File.directory?(path)
|
84
|
+
File.exist?(File.join(path, 'format'))
|
85
|
+
end
|
86
|
+
|
67
87
|
def svn_log(since_revision = as_revision("1"))
|
68
88
|
temp_file = Tempfile.new("svn.log").path
|
69
89
|
Blastr::delete_at_exit(temp_file)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
class TestPeopleFile < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
backup_people_file
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
restore_people_file
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_with_missing_people_file
|
14
|
+
FileUtils.rm(Blastr::People::PEOPLE_FILE)
|
15
|
+
assert_equal({}, Blastr::People.people)
|
16
|
+
assert_equal "nick", Blastr::People.full_name_of("nick")
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_with_existing_people_file
|
20
|
+
open(Blastr::People::PEOPLE_FILE, 'w') do |f|
|
21
|
+
f << "nick: Full Name\n"
|
22
|
+
f << "name: In Full"
|
23
|
+
end
|
24
|
+
assert_equal({"nick" => "Full Name", "name" => "In Full"}, Blastr::People.people)
|
25
|
+
assert_equal "Full Name", Blastr::People.full_name_of("nick")
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def backup_people_file
|
30
|
+
people_file = Blastr::People::PEOPLE_FILE
|
31
|
+
@backup_of_people_file = File.join(Blastr::temp_dir, File.basename(people_file))
|
32
|
+
FileUtils.cp(people_file, @backup_of_people_file)
|
33
|
+
end
|
34
|
+
def restore_people_file
|
35
|
+
FileUtils.cp(@backup_of_people_file, Blastr::People::PEOPLE_FILE)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class AbstractScmTestCase < Test::Unit::TestCase
|
2
|
+
abstract
|
3
|
+
|
4
|
+
def assert_urls_are_understood(list_of_urls)
|
5
|
+
list_of_urls.each do |url|
|
6
|
+
assert scm.understands_url?(url), "#{url} should be understood by #{scm}!"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def assert_urls_are_not_understood(list_of_urls)
|
11
|
+
list_of_urls.each do |url|
|
12
|
+
assert_equal false, scm.understands_url?(url), "#{url} should not be understood by #{scm}!"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def scm
|
17
|
+
raise "#{self.class} needs to implement the method scm()"
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
|
+
|
3
|
+
class TestGit < AbstractScmTestCase
|
4
|
+
|
5
|
+
GIT_URLS = [
|
6
|
+
"git://foo.com/bar.git",
|
7
|
+
"git:/path/to/repo",
|
8
|
+
"git:http://repo.com/project",
|
9
|
+
"http://github.com/user/project.git",
|
10
|
+
"http://github.com/user/project.git/",
|
11
|
+
"https://github.com/user/project.git",
|
12
|
+
"rsync://host.xz/repo.git",
|
13
|
+
"rsync://host.xz/repo.git/",
|
14
|
+
"ssh://host.xz/repo.git/",
|
15
|
+
"host.xz/repo.git",
|
16
|
+
"host.xz/repo.git/",
|
17
|
+
"user@host.xz/repo.git",
|
18
|
+
"user@host.xz/repo.git/",
|
19
|
+
"ssh://user@host.xz/repo.git/",
|
20
|
+
"ssh://user@host.xz:1234/path/to/repo.git",
|
21
|
+
"file:///path/to/local/repo.git",
|
22
|
+
"file:///path/to/local/repo.git/",
|
23
|
+
"/path/to/repo.git",
|
24
|
+
"/path/to/repo.git/" ]
|
25
|
+
|
26
|
+
def setup
|
27
|
+
@local_repo = create_local_repo
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
FileUtils.rm_rf(@local_repo)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_knows_its_url
|
35
|
+
urls = [ "/repo", "file:///repo", "git://github.com/user/repo.git" ]
|
36
|
+
urls.each do |url|
|
37
|
+
assert_equal url, Blastr::SourceControl::Git.new(url).url
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_git
|
42
|
+
assert_urls_are_understood(GIT_URLS)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_local_repository
|
46
|
+
local_repositories = [ @local_repo, "file://#{@local_repo}"]
|
47
|
+
assert_urls_are_understood(local_repositories)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_git_doesnt_claim_to_understand_a_local_non_repository_directory
|
51
|
+
parent_of_git_repo = File.dirname(@local_repo)
|
52
|
+
assert_urls_are_not_understood([ parent_of_git_repo ])
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def create_local_repo
|
58
|
+
dir = File.join(Blastr::temp_dir, 'git_repo')
|
59
|
+
%x[git init #{dir}]
|
60
|
+
assert File.directory? dir
|
61
|
+
dir
|
62
|
+
end
|
63
|
+
|
64
|
+
def scm
|
65
|
+
Blastr::SourceControl::Git
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
|
+
|
3
|
+
class TestGitRevision < Test::Unit::TestCase
|
4
|
+
|
5
|
+
SAMPLE_SHA = "db4ace1c9ba6add9a2b08c153367e2b379f8fb4c"
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@revision = Blastr::SourceControl::GitRevision.new(SAMPLE_SHA, Time.now - 100)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_to_s_prints_the_sha_hash
|
12
|
+
assert @revision.to_s == SAMPLE_SHA
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_before_comparison_between_revisions
|
16
|
+
later_revision = Blastr::SourceControl::GitRevision.new(SAMPLE_SHA, @revision.date + 1)
|
17
|
+
assert @revision.before?(later_revision) == true
|
18
|
+
assert later_revision.before?(@revision) == false
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_before_comparison_with_HEAD
|
22
|
+
head = Blastr::SourceControl::GitRevision.head
|
23
|
+
assert @revision.before?(head) == true
|
24
|
+
assert head.before?(@revision) == false
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_only_HEAD_can_be_created_with_nil_date
|
28
|
+
assert_raise ArgumentError do
|
29
|
+
Blastr::SourceControl::GitRevision.new(SAMPLE_SHA, nil)
|
30
|
+
end
|
31
|
+
assert_nothing_raised do
|
32
|
+
Blastr::SourceControl::GitRevision.new("HEAD", nil)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
|
+
|
3
|
+
class TestLogEntry < Test::Unit::TestCase
|
4
|
+
def test_equality
|
5
|
+
assert_equal create_log_entry, create_log_entry
|
6
|
+
assert_not_equal create_log_entry(:revision => "1"), create_log_entry(:revision => "2")
|
7
|
+
assert_not_equal create_log_entry(:author => "John"), create_log_entry(:author => "Jane")
|
8
|
+
assert_not_equal create_log_entry(:comment => "Oh"), create_log_entry(:comment => "Yeah")
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_prints_out_human_readably
|
12
|
+
entry = create_log_entry(:revision => "123", :author => "Lasse", :comment => "Fix")
|
13
|
+
assert_equal "revision 123 by Lasse: Fix", entry.to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def create_log_entry(args = {})
|
18
|
+
defaults = { :revision => "rev", :author => "author", :comment => "comment" }
|
19
|
+
args = defaults.update(args)
|
20
|
+
Blastr::SourceControl::LogEntry.new(args[:revision], args[:author], args[:comment])
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
|
+
|
3
|
+
class TestMercurial < AbstractScmTestCase
|
4
|
+
|
5
|
+
MERCURIAL_URLS = [
|
6
|
+
"hg:http://foo.com/hg",
|
7
|
+
"hg:http://foo.com/hg/",
|
8
|
+
"hg:/tmp/hg/repo",
|
9
|
+
"hg:/tmp/hg/repo/" ]
|
10
|
+
|
11
|
+
def test_mercurial_urls
|
12
|
+
assert_urls_are_understood(MERCURIAL_URLS)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_non_mercurial_urls
|
16
|
+
assert_urls_are_not_understood(["http://acme.com/foo"])
|
17
|
+
end
|
18
|
+
|
19
|
+
def scm
|
20
|
+
Blastr::SourceControl::Mercurial
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
|
+
|
3
|
+
class TestSubversion < AbstractScmTestCase
|
4
|
+
|
5
|
+
SVN_URLS = [
|
6
|
+
"http://foo.com/repo",
|
7
|
+
"http://foo.com/repo/",
|
8
|
+
"https://foo.com/repo",
|
9
|
+
"https://foo.com/repo/",
|
10
|
+
"svn:http://foo.com/svn",
|
11
|
+
"svn:http://foo.com/svn/",
|
12
|
+
"svn:https://foo.com/svn",
|
13
|
+
"svn://foo.com/svn" ]
|
14
|
+
|
15
|
+
def setup
|
16
|
+
@local_repo = create_local_repo
|
17
|
+
end
|
18
|
+
|
19
|
+
def teardown
|
20
|
+
FileUtils.rm_rf(@local_repo)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_knows_its_url
|
24
|
+
url = "file:///repo"
|
25
|
+
assert_equal url, scm.new(url).url
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_local_repository_urls_enforce_the_file_scheme
|
29
|
+
repo = scm.new("/repo")
|
30
|
+
assert_equal "file:///repo", repo.url
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_local_repository
|
34
|
+
local_repositories = [ @local_repo, "file://#{@local_repo}"]
|
35
|
+
assert_urls_are_understood(local_repositories)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_subversion_doesnt_claim_to_understand_a_local_non_repository_directory
|
39
|
+
parent_of_svn_repo = File.dirname(@local_repo)
|
40
|
+
assert_urls_are_not_understood([ parent_of_svn_repo ])
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_subversion
|
44
|
+
assert_urls_are_understood(SVN_URLS)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def scm
|
50
|
+
Blastr::SourceControl::Subversion
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_local_repo
|
54
|
+
dir = File.join(Blastr::temp_dir, 'svn_repo')
|
55
|
+
%x[svnadmin create #{dir}]
|
56
|
+
assert File.directory? dir
|
57
|
+
dir
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
data/test/test_blastr.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,19 @@
|
|
1
1
|
require 'stringio'
|
2
2
|
require 'test/unit'
|
3
|
-
require File.dirname(__FILE__)
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/blastr'))
|
4
|
+
|
5
|
+
class Test::Unit::TestCase
|
6
|
+
# implement a declaration 'abstract' that can be used to make
|
7
|
+
# a Test::Unit::TestCase subclass abstract without getting
|
8
|
+
# complaints about not defining any tests.
|
9
|
+
class << self
|
10
|
+
def abstract
|
11
|
+
self.class_eval do
|
12
|
+
def test_default
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'scm/abstract_scm_testcase.rb'))
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../test_helper.rb'))
|
2
2
|
require 'mocha'
|
3
3
|
|
4
4
|
class TestTTSImplementation < Test::Unit::TestCase
|
@@ -14,6 +14,13 @@ class TestCamelCaseSpelling < Test::Unit::TestCase
|
|
14
14
|
Blastr::TTS.stubs(:resolve_tts_system).returns(@tts)
|
15
15
|
end
|
16
16
|
|
17
|
+
def test_regular_statements_are_spelled_as_is
|
18
|
+
@tts.expects(:speak).with("Have you tried Blastr yet ?")
|
19
|
+
@tts.expects(:speak).with("Yes , I have .")
|
20
|
+
Blastr::TTS.speak("Have you tried Blastr yet?")
|
21
|
+
Blastr::TTS.speak("Yes, I have.")
|
22
|
+
end
|
23
|
+
|
17
24
|
def test_spelling_out_camel_case_words
|
18
25
|
@tts.expects(:speak).with("this is Camel Case")
|
19
26
|
Blastr::TTS.speak("this is CamelCase")
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blastr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Lasse Koskela
|
@@ -9,39 +15,41 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-09-23 00:00:00 +02:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: rubyforge
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
25
|
-
-
|
26
|
-
|
29
|
+
hash: 7
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 0
|
33
|
+
- 4
|
34
|
+
version: 2.0.4
|
27
35
|
type: :development
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.3.0
|
34
|
-
version:
|
36
|
+
version_requirements: *id001
|
35
37
|
- !ruby/object:Gem::Dependency
|
36
38
|
name: hoe
|
37
|
-
|
38
|
-
|
39
|
-
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
40
42
|
requirements:
|
41
43
|
- - ">="
|
42
44
|
- !ruby/object:Gem::Version
|
43
|
-
|
44
|
-
|
45
|
+
hash: 19
|
46
|
+
segments:
|
47
|
+
- 2
|
48
|
+
- 6
|
49
|
+
- 2
|
50
|
+
version: 2.6.2
|
51
|
+
type: :development
|
52
|
+
version_requirements: *id002
|
45
53
|
description: |-
|
46
54
|
Blastr observes a version control repository for commits and makes audible
|
47
55
|
announcements out of the commit messages. It currently supports Subversion,
|
@@ -70,6 +78,7 @@ files:
|
|
70
78
|
- bin/blastr
|
71
79
|
- config/website.yml
|
72
80
|
- lib/blastr.rb
|
81
|
+
- lib/error.rb
|
73
82
|
- lib/people/people.rb
|
74
83
|
- lib/scm/git.rb
|
75
84
|
- lib/scm/hg.rb
|
@@ -79,17 +88,21 @@ files:
|
|
79
88
|
- script/console
|
80
89
|
- script/destroy
|
81
90
|
- script/generate
|
91
|
+
- test/people/test_people.rb
|
92
|
+
- test/scm/abstract_scm_testcase.rb
|
93
|
+
- test/scm/test_git.rb
|
94
|
+
- test/scm/test_git_log_entry.rb
|
95
|
+
- test/scm/test_git_revision.rb
|
96
|
+
- test/scm/test_log_entry.rb
|
97
|
+
- test/scm/test_mercurial.rb
|
98
|
+
- test/scm/test_mercurial_log.rb
|
99
|
+
- test/scm/test_mercurial_revision.rb
|
100
|
+
- test/scm/test_svn.rb
|
101
|
+
- test/scm/test_svn_log.rb
|
102
|
+
- test/scm/test_svn_revision.rb
|
82
103
|
- test/test_blastr.rb
|
83
|
-
- test/test_git_log_entry.rb
|
84
|
-
- test/test_git_revision.rb
|
85
104
|
- test/test_helper.rb
|
86
|
-
- test/
|
87
|
-
- test/test_mercurial_revision.rb
|
88
|
-
- test/test_scm_logentry.rb
|
89
|
-
- test/test_scm_url_matching.rb
|
90
|
-
- test/test_svn_log.rb
|
91
|
-
- test/test_svn_revision.rb
|
92
|
-
- test/test_tts.rb
|
105
|
+
- test/tts/test_tts.rb
|
93
106
|
- website/index.html
|
94
107
|
has_rdoc: true
|
95
108
|
homepage: http://rubyforge.org/projects/blastr/
|
@@ -102,33 +115,42 @@ rdoc_options:
|
|
102
115
|
require_paths:
|
103
116
|
- lib
|
104
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
105
119
|
requirements:
|
106
120
|
- - ">="
|
107
121
|
- !ruby/object:Gem::Version
|
122
|
+
hash: 3
|
123
|
+
segments:
|
124
|
+
- 0
|
108
125
|
version: "0"
|
109
|
-
version:
|
110
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
111
128
|
requirements:
|
112
129
|
- - ">="
|
113
130
|
- !ruby/object:Gem::Version
|
131
|
+
hash: 3
|
132
|
+
segments:
|
133
|
+
- 0
|
114
134
|
version: "0"
|
115
|
-
version:
|
116
135
|
requirements: []
|
117
136
|
|
118
137
|
rubyforge_project: blastr
|
119
|
-
rubygems_version: 1.3.
|
138
|
+
rubygems_version: 1.3.7
|
120
139
|
signing_key:
|
121
140
|
specification_version: 3
|
122
141
|
summary: Blastr observes a version control repository for commits and makes audible announcements out of the commit messages
|
123
142
|
test_files:
|
143
|
+
- test/people/test_people.rb
|
144
|
+
- test/scm/test_git.rb
|
145
|
+
- test/scm/test_git_log_entry.rb
|
146
|
+
- test/scm/test_git_revision.rb
|
147
|
+
- test/scm/test_log_entry.rb
|
148
|
+
- test/scm/test_mercurial.rb
|
149
|
+
- test/scm/test_mercurial_log.rb
|
150
|
+
- test/scm/test_mercurial_revision.rb
|
151
|
+
- test/scm/test_svn.rb
|
152
|
+
- test/scm/test_svn_log.rb
|
153
|
+
- test/scm/test_svn_revision.rb
|
124
154
|
- test/test_blastr.rb
|
125
|
-
- test/test_git_log_entry.rb
|
126
|
-
- test/test_git_revision.rb
|
127
155
|
- test/test_helper.rb
|
128
|
-
- test/
|
129
|
-
- test/test_mercurial_revision.rb
|
130
|
-
- test/test_scm_logentry.rb
|
131
|
-
- test/test_scm_url_matching.rb
|
132
|
-
- test/test_svn_log.rb
|
133
|
-
- test/test_svn_revision.rb
|
134
|
-
- test/test_tts.rb
|
156
|
+
- test/tts/test_tts.rb
|
data/test/test_git_revision.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
class TestGitRevision < Test::Unit::TestCase
|
4
|
-
|
5
|
-
SAMPLE_SHA = "db4ace1c9ba6add9a2b08c153367e2b379f8fb4c"
|
6
|
-
|
7
|
-
def setup
|
8
|
-
@revision_with_date = Blastr::SourceControl::GitRevision.new(SAMPLE_SHA, Time.now - 100)
|
9
|
-
@revision_without_date = Blastr::SourceControl::GitRevision.new(SAMPLE_SHA)
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_to_s
|
13
|
-
assert @revision_without_date.to_s == SAMPLE_SHA
|
14
|
-
assert @revision_with_date.to_s == SAMPLE_SHA
|
15
|
-
end
|
16
|
-
|
17
|
-
def test_before_comparison_between_dated_revisions
|
18
|
-
later_revision = Blastr::SourceControl::GitRevision.new(SAMPLE_SHA, @revision_with_date.date + 1)
|
19
|
-
assert @revision_with_date.before?(later_revision) == true
|
20
|
-
assert later_revision.before?(@revision_with_date) == false
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_revision_defaults_its_date_to_now
|
24
|
-
assert @revision_with_date.before?(@revision_without_date) == true
|
25
|
-
assert @revision_without_date.before?(@revision_with_date) == false
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_before_comparison_with_HEAD
|
29
|
-
head = Blastr::SourceControl::GitRevision.new("HEAD")
|
30
|
-
[@revision_with_date, @revision_without_date].each do |any_revision|
|
31
|
-
assert any_revision.before?(head) == true
|
32
|
-
assert head.before?(any_revision) == false
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/test/test_scm_logentry.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
class TestLogEntry < Test::Unit::TestCase
|
4
|
-
def test_equality
|
5
|
-
assert_equal create_log_entry, create_log_entry
|
6
|
-
end
|
7
|
-
|
8
|
-
private
|
9
|
-
def create_log_entry
|
10
|
-
rev = Blastr::SourceControl::SubversionRevision.new("707")
|
11
|
-
Blastr::SourceControl::LogEntry.new(rev, "author", "comment")
|
12
|
-
end
|
13
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
-
|
3
|
-
class TestScmURLMatching < Test::Unit::TestCase
|
4
|
-
|
5
|
-
GIT_URLS = [
|
6
|
-
"git://foo.com/bar.git",
|
7
|
-
"git:/path/to/repo",
|
8
|
-
"git:http://repo.com/project",
|
9
|
-
"http://github.com/user/project.git",
|
10
|
-
"http://github.com/user/project.git/",
|
11
|
-
"https://github.com/user/project.git",
|
12
|
-
"rsync://host.xz/repo.git",
|
13
|
-
"rsync://host.xz/repo.git/",
|
14
|
-
"ssh://host.xz/repo.git/",
|
15
|
-
"host.xz/repo.git",
|
16
|
-
"host.xz/repo.git/",
|
17
|
-
"user@host.xz/repo.git",
|
18
|
-
"user@host.xz/repo.git/",
|
19
|
-
"ssh://user@host.xz/repo.git/",
|
20
|
-
"ssh://user@host.xz:1234/path/to/repo.git",
|
21
|
-
"file:///path/to/local/repo.git",
|
22
|
-
"file:///path/to/local/repo.git/",
|
23
|
-
"/path/to/repo.git",
|
24
|
-
"/path/to/repo.git/" ]
|
25
|
-
MERCURIAL_URLS = [
|
26
|
-
"hg:http://foo.com/hg",
|
27
|
-
"hg:http://foo.com/hg/",
|
28
|
-
"hg:/tmp/hg/repo",
|
29
|
-
"hg:/tmp/hg/repo/" ]
|
30
|
-
SVN_URLS = [
|
31
|
-
"http://foo.com/repo",
|
32
|
-
"http://foo.com/repo/",
|
33
|
-
"https://foo.com/repo",
|
34
|
-
"https://foo.com/repo/",
|
35
|
-
"svn:http://foo.com/svn",
|
36
|
-
"svn:http://foo.com/svn/",
|
37
|
-
"svn:https://foo.com/svn",
|
38
|
-
"svn://foo.com/svn" ]
|
39
|
-
|
40
|
-
def test_subversion
|
41
|
-
assert_urls_are_understood_by(Blastr::SourceControl::Subversion, SVN_URLS)
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_git
|
45
|
-
assert_urls_are_understood_by(Blastr::SourceControl::Git, GIT_URLS)
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_mercurial
|
49
|
-
assert_urls_are_understood_by(Blastr::SourceControl::Mercurial, MERCURIAL_URLS)
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
def assert_urls_are_understood_by(scm, list_of_urls)
|
54
|
-
list_of_urls.each do |url|
|
55
|
-
assert scm.understands_url?(url), "#{url} should be understood by #{scm}!"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|