git-trip 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +0 -0
- data/History.txt +21 -0
- data/Manifest.txt +89 -0
- data/README.txt +60 -0
- data/Rakefile +31 -0
- data/bin/git-trip +0 -0
- data/doc/USAGE.txt +54 -0
- data/lib/core_ext/hash.rb +15 -0
- data/lib/git-trip.rb +23 -0
- data/lib/git-trip/errors.rb +22 -0
- data/lib/git-trip/gitter.rb +10 -0
- data/lib/git-trip/gitter/base.rb +18 -0
- data/lib/git-trip/gitter/dir.rb +32 -0
- data/lib/git-trip/gitter/uri.rb +40 -0
- data/lib/git-trip/paint_mode.rb +52 -0
- data/lib/git-trip/painter.rb +167 -0
- data/spec/core_ext/hash_spec.rb +25 -0
- data/spec/git-trip/errors_spec.rb +43 -0
- data/spec/git-trip/gitter/base_spec.rb +15 -0
- data/spec/git-trip/gitter/dir_spec.rb +37 -0
- data/spec/git-trip/gitter/uri_spec.rb +25 -0
- data/spec/git-trip/gitter_spec.rb +11 -0
- data/spec/git-trip/paint_mode_spec.rb +56 -0
- data/spec/git-trip/painter_spec.rb +173 -0
- data/spec/git_trip_spec.rb +23 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +15 -0
- data/tasks/ditz.rake +42 -0
- data/tasks/docs.rake +68 -0
- data/tasks/gittrip.rake +63 -0
- data/tasks/rspec.rake +22 -0
- data/tasks/site.rake +48 -0
- data/tasks/util.rake +44 -0
- data/vendor/grit/History.txt +6 -0
- data/vendor/grit/Manifest.txt +53 -0
- data/vendor/grit/README.txt +213 -0
- data/vendor/grit/Rakefile +29 -0
- data/vendor/grit/grit.gemspec +16 -0
- data/vendor/grit/lib/grit.rb +37 -0
- data/vendor/grit/lib/grit/actor.rb +36 -0
- data/vendor/grit/lib/grit/blob.rb +117 -0
- data/vendor/grit/lib/grit/commit.rb +208 -0
- data/vendor/grit/lib/grit/config.rb +44 -0
- data/vendor/grit/lib/grit/diff.rb +70 -0
- data/vendor/grit/lib/grit/errors.rb +7 -0
- data/vendor/grit/lib/grit/git.rb +116 -0
- data/vendor/grit/lib/grit/index.rb +77 -0
- data/vendor/grit/lib/grit/lazy.rb +31 -0
- data/vendor/grit/lib/grit/ref.rb +110 -0
- data/vendor/grit/lib/grit/repo.rb +318 -0
- data/vendor/grit/lib/grit/tree.rb +99 -0
- data/vendor/grit/test/fixtures/blame +131 -0
- data/vendor/grit/test/fixtures/cat_file_blob +1 -0
- data/vendor/grit/test/fixtures/cat_file_blob_size +1 -0
- data/vendor/grit/test/fixtures/diff_2 +54 -0
- data/vendor/grit/test/fixtures/diff_2f +19 -0
- data/vendor/grit/test/fixtures/diff_f +15 -0
- data/vendor/grit/test/fixtures/diff_i +201 -0
- data/vendor/grit/test/fixtures/diff_mode_only +1152 -0
- data/vendor/grit/test/fixtures/diff_new_mode +17 -0
- data/vendor/grit/test/fixtures/diff_p +610 -0
- data/vendor/grit/test/fixtures/for_each_ref +0 -0
- data/vendor/grit/test/fixtures/for_each_ref_remotes +0 -0
- data/vendor/grit/test/fixtures/for_each_ref_tags +0 -0
- data/vendor/grit/test/fixtures/ls_tree_a +7 -0
- data/vendor/grit/test/fixtures/ls_tree_b +2 -0
- data/vendor/grit/test/fixtures/ls_tree_commit +3 -0
- data/vendor/grit/test/fixtures/rev_list +26 -0
- data/vendor/grit/test/fixtures/rev_list_count +655 -0
- data/vendor/grit/test/fixtures/rev_list_single +7 -0
- data/vendor/grit/test/fixtures/rev_parse +1 -0
- data/vendor/grit/test/fixtures/show_empty_commit +6 -0
- data/vendor/grit/test/fixtures/simple_config +2 -0
- data/vendor/grit/test/helper.rb +17 -0
- data/vendor/grit/test/profile.rb +21 -0
- data/vendor/grit/test/suite.rb +6 -0
- data/vendor/grit/test/test_actor.rb +35 -0
- data/vendor/grit/test/test_blob.rb +74 -0
- data/vendor/grit/test/test_commit.rb +182 -0
- data/vendor/grit/test/test_config.rb +58 -0
- data/vendor/grit/test/test_diff.rb +18 -0
- data/vendor/grit/test/test_git.rb +52 -0
- data/vendor/grit/test/test_head.rb +22 -0
- data/vendor/grit/test/test_real.rb +19 -0
- data/vendor/grit/test/test_reality.rb +17 -0
- data/vendor/grit/test/test_remote.rb +15 -0
- data/vendor/grit/test/test_repo.rb +278 -0
- data/vendor/grit/test/test_tag.rb +29 -0
- data/vendor/grit/test/test_tree.rb +91 -0
- metadata +179 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,167 @@
|
|
1
|
+
module GitTrip
|
2
|
+
|
3
|
+
# This does the work of creating a commit specific image.
|
4
|
+
class Painter
|
5
|
+
DEFAULTS = {
|
6
|
+
:format => 'png',
|
7
|
+
:header => false,
|
8
|
+
:label => false,
|
9
|
+
:style => 'horizontal',
|
10
|
+
:width => 50,
|
11
|
+
:height => 50
|
12
|
+
}
|
13
|
+
|
14
|
+
STYLES = %w{
|
15
|
+
montage
|
16
|
+
horizontal
|
17
|
+
vertical
|
18
|
+
}
|
19
|
+
|
20
|
+
attr_reader :canvas, :colors, :name, :picture
|
21
|
+
|
22
|
+
# Takes a single 40 character +sha+ string and an (optional)
|
23
|
+
# hash of +options+ (see DEFAULTS).
|
24
|
+
#
|
25
|
+
# +options+ can contain:
|
26
|
+
# * <tt>format</tt>: Image format; anything Magick::Image.new supports (ex. 'png', 'gif', etc).
|
27
|
+
# * <tt>header</tt>: If true, prints a header above the image, defaults to true; see +name+.
|
28
|
+
# * <tt>label</tt>: If true, the commit SHA will be included in the image; defaults to false.
|
29
|
+
# * <tt>name</tt>: The text to use above the commit image; only used if +header+ is true.
|
30
|
+
# * <tt>style</tt>: Generated image style; see STYLES.
|
31
|
+
# * <tt>width</tt>: Generated commit image width.
|
32
|
+
# * <tt>height</tt>: Generated commit image height.
|
33
|
+
def initialize(sha, options = {})
|
34
|
+
@options = DEFAULTS.merge(options)
|
35
|
+
raise Errors::RTFM unless sha.is_a?(String)
|
36
|
+
raise Errors::InvalidFormat unless Magick.formats.include?(@options[:format].upcase)
|
37
|
+
raise Errors::InvalidSHA if invalid_sha?(sha)
|
38
|
+
raise Errors::InvalidStyle if invalid_style?(@options[:style])
|
39
|
+
@sha = sha
|
40
|
+
@colors, @remainder = split_colors
|
41
|
+
@name = (@options[:name] || create_name)
|
42
|
+
@canvas = build_canvas
|
43
|
+
@picture = nil
|
44
|
+
end
|
45
|
+
|
46
|
+
# Paint a <tt>@picture</tt> based on <tt>@canvas</tt> and <tt>@options[:style]</tt>.
|
47
|
+
# Returns true or false based on the success of assigning <tt>@picture</tt>.
|
48
|
+
def paint!
|
49
|
+
# Need to set these locally, since <tt>Magick::ImageList#montage</tt>
|
50
|
+
# can't access instance variables in it's block, for some reason.
|
51
|
+
name = @name
|
52
|
+
header = @options[:header]
|
53
|
+
width = @options[:width]
|
54
|
+
height = @options[:height]
|
55
|
+
size = get_dimensions
|
56
|
+
|
57
|
+
montage = @canvas.montage do
|
58
|
+
self.geometry = Magick::Geometry.new(width, height)
|
59
|
+
self.title = name if header
|
60
|
+
self.tile = Magick::Geometry.new(size.first, size.last) if size
|
61
|
+
end
|
62
|
+
|
63
|
+
@picture = montage.flatten_images
|
64
|
+
@picture.format = @options[:format]
|
65
|
+
return (@picture ? true : false)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Saves <tt>@picture</tt> to +location+ as '<tt>name</tt>.<tt>format</tt>'.
|
69
|
+
# Returns the <tt>@picture</tt> or nil upon failure.
|
70
|
+
#
|
71
|
+
# Example:
|
72
|
+
# painter = GitTrip::Painter.new(commit, :format => 'png')
|
73
|
+
# painter.paint!
|
74
|
+
# painter.save('/tmp', 'my_repo')
|
75
|
+
#
|
76
|
+
# Which would save the image as '/tmp/my_repo.png'
|
77
|
+
def save(location, name)
|
78
|
+
raise Errors::NoPicture unless @picture
|
79
|
+
full_path = File.expand_path(location)
|
80
|
+
FileUtils.mkpath(full_path) unless File.exists?(full_path)
|
81
|
+
@picture.write("#{location}/#{name}.#{@options[:format]}")
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
# Applies a +text+ string to a given +image+.
|
87
|
+
def apply_label(text, image)
|
88
|
+
image.composite(build_label(text),
|
89
|
+
Magick::CenterGravity,
|
90
|
+
Magick::HardLightCompositeOp)
|
91
|
+
end
|
92
|
+
|
93
|
+
# Builds a Magick::ImageList canvas for the <tt>@colors</tt>.
|
94
|
+
# This is also where the label is conditionally applied.
|
95
|
+
def build_canvas
|
96
|
+
canvas = Magick::ImageList.new
|
97
|
+
@colors.each do |color|
|
98
|
+
image = Magick::Image.new(@options[:width], @options[:height]) do
|
99
|
+
self.background_color = "\##{color}"
|
100
|
+
end
|
101
|
+
canvas << (@options[:label] ? apply_label(color, image) : image)
|
102
|
+
end
|
103
|
+
return canvas
|
104
|
+
end # of build_canvas
|
105
|
+
|
106
|
+
# Builds an image with the given +text+.
|
107
|
+
# TODO: Find a sane way of setting the pointsize.
|
108
|
+
# TODO: Allow custom font options.
|
109
|
+
def build_label(text)
|
110
|
+
shading = false
|
111
|
+
|
112
|
+
label = Magick::Image.new(@options[:width], @options[:height])
|
113
|
+
image = Magick::Draw.new
|
114
|
+
image.gravity = Magick::CenterGravity
|
115
|
+
image.pointsize = @options[:width] / 4
|
116
|
+
image.font = 'Helvetica'
|
117
|
+
image.font_weight = Magick::NormalWeight
|
118
|
+
image.stroke = 'none'
|
119
|
+
image.annotate(label, 0, 0, 0, 0, text)
|
120
|
+
label = label.shade(shading, 310, 30)
|
121
|
+
|
122
|
+
return label
|
123
|
+
end
|
124
|
+
|
125
|
+
# Generate a name based on the remaining 4 characters of the SHA.
|
126
|
+
# Returns the created name.
|
127
|
+
# Only called if <tt>@options[:name]</tt> is not given.
|
128
|
+
def create_name
|
129
|
+
colors = @colors
|
130
|
+
first = colors.sort_by{rand}.first.split('')[0..2].sort_by{rand}.to_s
|
131
|
+
last = colors.sort_by{rand}.last.split('')[0..2].sort_by{rand}.to_s
|
132
|
+
return "--- #{first}.#{@remainder}.#{last} ---"
|
133
|
+
end
|
134
|
+
|
135
|
+
# Returns an array of dimensions to be used in an ImageList#montage block.
|
136
|
+
# (ex. [4, 3])
|
137
|
+
def get_dimensions
|
138
|
+
case @options[:style]
|
139
|
+
when 'horizontal'
|
140
|
+
[@colors.size, 1]
|
141
|
+
when 'vertical'
|
142
|
+
[1, @colors.size]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Returns true if +sha+ is invalid.
|
147
|
+
# TODO: Probably a better way of validating a SHA.
|
148
|
+
def invalid_sha?(sha)
|
149
|
+
sha.size != 40
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns true if +style+ is not in STYLES.
|
153
|
+
def invalid_style?(style)
|
154
|
+
return true unless STYLES.include?(style)
|
155
|
+
end
|
156
|
+
|
157
|
+
# Returns a 6 element array of RGB color codes, and the
|
158
|
+
# remaining 4 characters (as a string).
|
159
|
+
def split_colors
|
160
|
+
array = []
|
161
|
+
remainder = @sha.split('') # Yes, it's not the remainder now, but it will be at the return statement.
|
162
|
+
6.times { array << remainder.slice!(0, 6).to_s }
|
163
|
+
return array, remainder.to_s
|
164
|
+
end
|
165
|
+
end # of Painter
|
166
|
+
|
167
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Hash, 'core extensions' do
|
4
|
+
before(:each) do
|
5
|
+
@hash = {
|
6
|
+
'key1' => 'val1',
|
7
|
+
'key2' => [1, 2, 3],
|
8
|
+
'key3' => {:a => 1, :b => 2}
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should symbolize keys" do
|
13
|
+
symbol_keys = @hash.symbolize_keys
|
14
|
+
symbol_keys.each_key do |key|
|
15
|
+
key.should be_a_kind_of(Symbol)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should symbolize keys destructively" do
|
20
|
+
@hash.symbolize_keys!
|
21
|
+
@hash.each_key do |key|
|
22
|
+
key.should be_a_kind_of(Symbol)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Errors do
|
4
|
+
it "should define DirNotFound" do
|
5
|
+
Errors::DirNotFound.should be_a_kind_of(Class)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should define InvalidFormat" do
|
9
|
+
Errors::InvalidFormat.should be_a_kind_of(Class)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should define InvalidGitRepo" do
|
13
|
+
Errors::InvalidGitRepo.should be_a_kind_of(Class)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should define InvalidMode" do
|
17
|
+
Errors::InvalidMode.should be_a_kind_of(Class)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should define InvalidPicture" do
|
21
|
+
Errors::InvalidPicture.should be_a_kind_of(Class)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should define InvalidSHA" do
|
25
|
+
Errors::InvalidSHA.should be_a_kind_of(Class)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should define InvalidStyle" do
|
29
|
+
Errors::InvalidStyle.should be_a_kind_of(Class)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should define NoCommits" do
|
33
|
+
Errors::NoCommits.should be_a_kind_of(Class)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should define NoPicture" do
|
37
|
+
Errors::NoPicture.should be_a_kind_of(Class)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should define RTFM" do
|
41
|
+
Errors::RTFM.should be_a_kind_of(Class)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Gitter::Base do
|
4
|
+
before(:each) do
|
5
|
+
@commits = %w{
|
6
|
+
ruby is fucking awesome word to your mother
|
7
|
+
}.map { |text| Digest::SHA1.hexdigest(text) }
|
8
|
+
@repo = mock(Gitter::Base)
|
9
|
+
@repo.stub!(:commits).and_return(@commits)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should return an array of commit SHAs" do
|
13
|
+
@repo.commits.should be_instance_of(Array)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Gitter::Dir do
|
4
|
+
before(:each) do
|
5
|
+
# This is a test git repository.
|
6
|
+
@dir = File.expand_path(File.dirname(__FILE__) + '/../../../sandbox')
|
7
|
+
@repo = Gitter::Dir.new(@dir)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should read a repository from a directory" do
|
11
|
+
@repo.should be_a_kind_of(Gitter::Dir)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should raise Errors::DirNotFound" do
|
15
|
+
lambda { Gitter::Dir.new('/not/a/real/dir') }.should raise_error(Errors::DirNotFound)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should raise Grit::InvalidGitRepositoryError" do
|
19
|
+
lambda do
|
20
|
+
Gitter::Dir.new(File.dirname(__FILE__))
|
21
|
+
end.should raise_error(Grit::InvalidGitRepositoryError)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return an array of commit SHAs" do
|
25
|
+
@repo = Gitter::Dir.new(@dir)
|
26
|
+
@repo.commits.should_not be_empty
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should iterate the commits" do
|
30
|
+
@repo.each_commit do |c|
|
31
|
+
c.should be_instance_of(String)
|
32
|
+
c.size.should eql(40) # size of a SHA1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should return the author of a commit"
|
37
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
describe Gitter::URI do
|
4
|
+
before(:each) do
|
5
|
+
@uri = 'http://github.com/api/v1/json/Oshuma/git-trip/commits/master'
|
6
|
+
@repo = Gitter::URI.new(@uri)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should read a repository from a URI" do
|
10
|
+
@repo.should be_a_kind_of(Gitter::URI)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should raise Errors::InvalidFormat" do
|
14
|
+
lambda do
|
15
|
+
Gitter::URI.new(@uri, :format => 'invalid')
|
16
|
+
end.should raise_error(Errors::InvalidFormat)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should raise Errors::InvalidURI" do
|
20
|
+
lambda { Gitter::URI.new('bogus URI') }.should raise_error(Errors::InvalidURI)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return an array of commit SHAs"
|
24
|
+
it "should return the author of a commit"
|
25
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Gitter, '(module)' do
|
4
|
+
it "should include Gitter::Dir" do
|
5
|
+
Gitter::Dir.should be_a_kind_of(Class)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should include Gitter::URI" do
|
9
|
+
Gitter::URI.should be_a_kind_of(Class)
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe PaintMode do
|
4
|
+
before(:each) do
|
5
|
+
@image = Magick::Image.new(5, 5)
|
6
|
+
@mode = PaintMode.new(@image, :blend)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should instantiate" do
|
10
|
+
@mode.should be_instance_of(PaintMode)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should raise ArgumentError" do
|
14
|
+
lambda { PaintMode.new }.should raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise Errors::InvalidPicture" do
|
18
|
+
lambda do
|
19
|
+
PaintMode.new('not a picture', :blend)
|
20
|
+
end.should raise_error(Errors::InvalidPicture)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should raise Errors::InvalidMode" do
|
24
|
+
lambda do
|
25
|
+
PaintMode.new(@image, :invalid_mode)
|
26
|
+
end.should raise_error(Errors::InvalidMode)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should allow mode as symbol" do
|
30
|
+
PaintMode.new(@image, :blend).should be_instance_of(PaintMode)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should allow mode as string" do
|
34
|
+
PaintMode.new(@image, 'blend').should be_instance_of(PaintMode)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should define MODES" do
|
38
|
+
PaintMode::MODES.should be_instance_of(Array)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have a picture accessor" do
|
42
|
+
@mode.picture.should be_instance_of(Magick::Image)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should blend" do
|
46
|
+
PaintMode.new(@image, :blend).picture.should be_instance_of(Magick::Image)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should pixel" do
|
50
|
+
PaintMode.new(@image, :pixel).picture.should be_instance_of(Magick::Image)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should radial" do
|
54
|
+
PaintMode.new(@image, :radial).picture.should be_instance_of(Magick::Image)
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Painter do
|
4
|
+
before(:each) do
|
5
|
+
@commit = Digest::SHA1.hexdigest('ruby')
|
6
|
+
@painter = Painter.new(@commit)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should instantiate" do
|
10
|
+
@painter.should be_instance_of(Painter)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should raise Errors::InvalidSHA" do
|
14
|
+
lambda { Painter.new('not a valid sha') }.should raise_error(Errors::InvalidSHA)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise Errors::InvalidStyle" do
|
18
|
+
lambda do
|
19
|
+
Painter.new(@commit, :style => 'invalid')
|
20
|
+
end.should raise_error(Errors::InvalidStyle)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should raise Errors::RTFM" do
|
24
|
+
lambda { Painter.new(5) }.should raise_error(Errors::RTFM)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should define DEFAULTS" do
|
28
|
+
Painter::DEFAULTS.should be_instance_of(Hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should define STYLES" do
|
32
|
+
Painter::STYLES.should be_instance_of(Array)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should build a canvas" do
|
36
|
+
@painter.canvas.should be_instance_of(Magick::ImageList)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should set default width" do
|
40
|
+
options = @painter.instance_variable_get(:@options)
|
41
|
+
options[:width].should eql(50)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should allow a custom width" do
|
45
|
+
@painter = Painter.new(@commit, :width => 25)
|
46
|
+
options = @painter.instance_variable_get(:@options)
|
47
|
+
options[:width].should eql(25)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should set default height" do
|
51
|
+
options = @painter.instance_variable_get(:@options)
|
52
|
+
options[:height].should eql(50)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should allow a custom height" do
|
56
|
+
@painter = Painter.new(@commit, :height => 25)
|
57
|
+
options = @painter.instance_variable_get(:@options)
|
58
|
+
options[:height].should eql(25)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should set default style" do
|
62
|
+
options = @painter.instance_variable_get(:@options)
|
63
|
+
options[:style].should_not be_nil
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should allow a horizontal style" do
|
67
|
+
@painter = Painter.new(@commit, :style => 'horizontal')
|
68
|
+
options = @painter.instance_variable_get(:@options)
|
69
|
+
options[:style].should eql('horizontal')
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should allow a vertical style" do
|
73
|
+
@painter = Painter.new(@commit, :style => 'vertical')
|
74
|
+
options = @painter.instance_variable_get(:@options)
|
75
|
+
options[:style].should eql('vertical')
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should allow a montage style" do
|
79
|
+
@painter = Painter.new(@commit, :style => 'montage')
|
80
|
+
options = @painter.instance_variable_get(:@options)
|
81
|
+
options[:style].should eql('montage')
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should return an array of 6 RGB color codes" do
|
85
|
+
@painter.colors.size.should eql(6)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should have 6 characters per color" do
|
89
|
+
@painter.colors.each do |color|
|
90
|
+
color.size.should eql(6)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should have proper colors for it's SHA and remaining 4 characters" do
|
95
|
+
sha = @painter.colors.to_s + @commit[-4, 4]
|
96
|
+
sha.should eql(@commit)
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should accept a custom size" do
|
100
|
+
Painter.new(@commit, :size => [25, 25]).should be_instance_of(Painter)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should paint a montage image" do
|
104
|
+
@painter.paint!.should_not be_false
|
105
|
+
@painter.picture.should be_instance_of(Magick::Image)
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should paint a horizontal image" do
|
109
|
+
@painter = Painter.new(@commit, :style => 'horizontal')
|
110
|
+
@painter.paint!.should_not be_false
|
111
|
+
@painter.picture.should be_instance_of(Magick::Image)
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should paint a vertical image" do
|
115
|
+
@painter = Painter.new(@commit, :style => 'vertical')
|
116
|
+
@painter.paint!.should_not be_false
|
117
|
+
@painter.picture.should be_instance_of(Magick::Image)
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should create an image with commits color labels" do
|
121
|
+
@painter = Painter.new(@commit, :label => true)
|
122
|
+
@painter.paint!.should_not be_false
|
123
|
+
@painter.picture.should be_instance_of(Magick::Image)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should have a name" do
|
127
|
+
@painter.name.should_not be_nil
|
128
|
+
@painter.name.should be_instance_of(String)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should allow a custom name" do
|
132
|
+
@painter = Painter.new(@commit, :name => 'Awesome')
|
133
|
+
@painter.name.should eql('Awesome')
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should allow a custom header option" do
|
137
|
+
@painter = Painter.new(@commit, :header => false)
|
138
|
+
options = @painter.instance_variable_get(:@options)
|
139
|
+
options[:header].should be_false
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should allow custom format option" do
|
143
|
+
@painter = Painter.new(@commit, :format => 'jpg')
|
144
|
+
options = @painter.instance_variable_get(:@options)
|
145
|
+
options[:format].should eql('jpg')
|
146
|
+
@painter.paint!
|
147
|
+
@painter.picture.should be_instance_of(Magick::Image)
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should raise Errors::InvalidFormat" do
|
151
|
+
lambda do
|
152
|
+
@painter = Painter.new(@commit, :format => 'some shit')
|
153
|
+
end.should raise_error(Errors::InvalidFormat)
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should raise Errors::NoPicture" do
|
157
|
+
lambda do
|
158
|
+
@painter.save('/tmp', 'no picture')
|
159
|
+
end.should raise_error(Errors::NoPicture)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Yes, this spec sucks.
|
163
|
+
it "should save the picture" do
|
164
|
+
test_path = File.expand_path('./sandbox/')
|
165
|
+
test_name = 'git-trip-test'
|
166
|
+
test_file = File.join(test_path, "#{test_name}.png")
|
167
|
+
File.delete(test_file) if File.exists?(test_file)
|
168
|
+
@painter.paint!
|
169
|
+
@painter.save(test_path, test_name).should be_instance_of(Magick::Image)
|
170
|
+
File.exists?(test_file).should be_true
|
171
|
+
File.delete(test_file) if File.exists?(test_file)
|
172
|
+
end
|
173
|
+
end
|