montage 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +31 -0
- data/History.md +40 -0
- data/LICENSE +19 -0
- data/README.md +89 -0
- data/Rakefile +41 -0
- data/VERSION +1 -0
- data/bin/montage +22 -0
- data/lib/montage.rb +33 -0
- data/lib/montage/commands.rb +32 -0
- data/lib/montage/commands/generate.rb +234 -0
- data/lib/montage/commands/init.rb +119 -0
- data/lib/montage/core_ext.rb +80 -0
- data/lib/montage/project.rb +185 -0
- data/lib/montage/sass_builder.rb +37 -0
- data/lib/montage/source.rb +75 -0
- data/lib/montage/sprite.rb +132 -0
- data/lib/montage/templates/montage.yml +26 -0
- data/lib/montage/templates/sass_mixins.erb +20 -0
- data/lib/montage/templates/sources/book.png +0 -0
- data/lib/montage/templates/sources/box-label.png +0 -0
- data/lib/montage/templates/sources/calculator.png +0 -0
- data/lib/montage/templates/sources/calendar-month.png +0 -0
- data/lib/montage/templates/sources/camera.png +0 -0
- data/lib/montage/templates/sources/eraser.png +0 -0
- data/lib/montage/version.rb +3 -0
- data/montage.gemspec +145 -0
- data/spec/fixtures/custom_dirs/montage.yml +8 -0
- data/spec/fixtures/default/montage.yml +7 -0
- data/spec/fixtures/default/public/images/sprites/src/one.png +0 -0
- data/spec/fixtures/default/public/images/sprites/src/three.png +0 -0
- data/spec/fixtures/default/public/images/sprites/src/two.png +0 -0
- data/spec/fixtures/directory_config/config/montage.yml +5 -0
- data/spec/fixtures/missing_source/montage.yml +3 -0
- data/spec/fixtures/missing_source_dir/montage.yml +5 -0
- data/spec/fixtures/root_config/montage.yml +5 -0
- data/spec/fixtures/root_config/public/images/sprites/src/source_one.png +0 -0
- data/spec/fixtures/root_config/public/images/sprites/src/source_three.jpg +0 -0
- data/spec/fixtures/root_config/public/images/sprites/src/source_two +0 -0
- data/spec/fixtures/sources/hundred.png +0 -0
- data/spec/fixtures/sources/mammoth.png +0 -0
- data/spec/fixtures/sources/other.png +0 -0
- data/spec/fixtures/sources/twenty.png +0 -0
- data/spec/fixtures/subdirs/montage.yml +5 -0
- data/spec/fixtures/subdirs/sub/sub/keep +0 -0
- data/spec/lib/command_runner.rb +140 -0
- data/spec/lib/fixtures.rb +7 -0
- data/spec/lib/have_public_method_defined.rb +19 -0
- data/spec/lib/project_helper.rb +135 -0
- data/spec/lib/shared_project_specs.rb +32 -0
- data/spec/lib/shared_sprite_specs.rb +30 -0
- data/spec/montage/commands/generate_spec.rb +308 -0
- data/spec/montage/commands/init_spec.rb +120 -0
- data/spec/montage/core_ext_spec.rb +33 -0
- data/spec/montage/project_spec.rb +181 -0
- data/spec/montage/sass_builder_spec.rb +269 -0
- data/spec/montage/source_spec.rb +53 -0
- data/spec/montage/spec/have_public_method_defined_spec.rb +31 -0
- data/spec/montage/sprite_spec.rb +170 -0
- data/spec/rcov.opts +8 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +19 -0
- data/tasks/spec.rake +17 -0
- data/tasks/yard.rake +11 -0
- metadata +249 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
module Montage
|
2
|
+
# Represents a collection of images which will be used to make a sprite.
|
3
|
+
#
|
4
|
+
class Sprite
|
5
|
+
attr_reader :name
|
6
|
+
|
7
|
+
# Creates a new Sprite instance.
|
8
|
+
#
|
9
|
+
# @param [String] name
|
10
|
+
# The name of the sprite. Will be used as the sprite filename (with an
|
11
|
+
# extension added).
|
12
|
+
# @param [Array<String>] sources
|
13
|
+
# The name of each source image.
|
14
|
+
# @param [Project] Project
|
15
|
+
# The project to which the sprite belongs.
|
16
|
+
#
|
17
|
+
def initialize(name, sources, project)
|
18
|
+
@name, @project = name, project
|
19
|
+
|
20
|
+
@sources =
|
21
|
+
sources.inject(ActiveSupport::OrderedHash.new) do |hash, source|
|
22
|
+
hash[source] = Source.new(@project.paths.sources, source, @name)
|
23
|
+
hash
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns an array of Source instances held by this Sprite.
|
28
|
+
#
|
29
|
+
# @return [Array<Source>]
|
30
|
+
#
|
31
|
+
def sources
|
32
|
+
@sources.map { |_, source| source }
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns an array of RMagick image instances; one for each source.
|
36
|
+
#
|
37
|
+
# @return [Array<Magick::Image>]
|
38
|
+
# The Image instances for the sources.
|
39
|
+
#
|
40
|
+
def images
|
41
|
+
sources.map { |source| source.image }
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the path to the sprite on disk.
|
45
|
+
#
|
46
|
+
# @return [Pathname]
|
47
|
+
#
|
48
|
+
def path
|
49
|
+
@project.paths.sprites + "#{@name}.png"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns the y-position of a given source.
|
53
|
+
#
|
54
|
+
# @return [Integer, Source]
|
55
|
+
# The vertical position of the source image.
|
56
|
+
#
|
57
|
+
def position_of(source)
|
58
|
+
source = source.name if source.is_a?(Source)
|
59
|
+
|
60
|
+
unless @sources.keys.include?(source)
|
61
|
+
raise MissingSource,
|
62
|
+
"Source image '#{source}' is not present in the '#{@name}' sprite"
|
63
|
+
end
|
64
|
+
|
65
|
+
unless @positions
|
66
|
+
# Rather than calculate each time we call position_of, cache the
|
67
|
+
# position of each image the first time it is called. Since we almost
|
68
|
+
# always want the position of each image at some point (when
|
69
|
+
# generating CSS), it works out faster to fetch each source height
|
70
|
+
# just once.
|
71
|
+
@positions = {}
|
72
|
+
@sources.inject(0) do |offset, (name, src)|
|
73
|
+
@positions[name] = offset
|
74
|
+
offset + src.image.rows + 20
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
@positions[source]
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns a digest which represents the sprite and it's contents. If any
|
82
|
+
# of the file _contents_ or source names change, so will the hash.
|
83
|
+
#
|
84
|
+
# @return [Digest::SHA256]
|
85
|
+
#
|
86
|
+
def digest
|
87
|
+
Digest::SHA256.hexdigest(sources.map { |source| source.digest }.join)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Uses RMagick to creates a 8-bit (with alpha) PNG containing all of the
|
91
|
+
# source files.
|
92
|
+
#
|
93
|
+
# If a file exists at the output path, it will be overwritten.
|
94
|
+
#
|
95
|
+
# @raise [Montage::TargetNotWritable]
|
96
|
+
# Raised when the output directory can not be written to.
|
97
|
+
#
|
98
|
+
def write
|
99
|
+
unless @project.paths.sprites.writable?
|
100
|
+
raise TargetNotWritable, <<-MESSAGE
|
101
|
+
Montage can't save the sprite in `#{@project.paths.sprites.to_s}'
|
102
|
+
as it isn't writable.
|
103
|
+
MESSAGE
|
104
|
+
end
|
105
|
+
|
106
|
+
list = sources.inject(Magick::ImageList.new) do |list, source|
|
107
|
+
list << source.image
|
108
|
+
list << Magick::Image.new(1, @project.padding) do
|
109
|
+
self.background_color = '#FFF0'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# RMagick uses instance_eval, @set isn't available in the block below.
|
114
|
+
sources_length = sources.length
|
115
|
+
|
116
|
+
montage = list.montage do
|
117
|
+
self.gravity = Magick::NorthWestGravity
|
118
|
+
# Transparent background.
|
119
|
+
self.background_color = '#FFF0'
|
120
|
+
# Allow each image to take up as much space as it needs.
|
121
|
+
self.geometry = '+0+0'
|
122
|
+
# columns=1, rows=Sources plus padding.
|
123
|
+
self.tile = Magick::Geometry.new(1, sources_length * 2)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Remove the blank space from the bottom of the image.
|
127
|
+
montage.crop!(0, 0, 0, (montage.first.rows) - @project.padding)
|
128
|
+
montage.write("PNG32:#{path}")
|
129
|
+
end
|
130
|
+
|
131
|
+
end # Set
|
132
|
+
end # Montage
|
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
|
3
|
+
# If you need to specify non-standard locations for the source
|
4
|
+
# files, or the output locations for the sprites or SASS, change
|
5
|
+
# the relevant option below. Directories are relative to the
|
6
|
+
# project root unless they have a leading slash.
|
7
|
+
|
8
|
+
config.sources: <sources>
|
9
|
+
config.sprites: <sprites>
|
10
|
+
config.sass: "public/stylesheets/sass"
|
11
|
+
config.sprite_url: "/images/sprites"
|
12
|
+
|
13
|
+
# --------------------------------------------------------------------------
|
14
|
+
|
15
|
+
# The sample below will produce two sprites (one.png and two.png) with the
|
16
|
+
# specified source images. You can omit file extensions.
|
17
|
+
|
18
|
+
one:
|
19
|
+
- book
|
20
|
+
- box-label
|
21
|
+
- calculator
|
22
|
+
|
23
|
+
two:
|
24
|
+
- calendar-month
|
25
|
+
- camera
|
26
|
+
- eraser
|
@@ -0,0 +1,20 @@
|
|
1
|
+
// The mixins in this file are automatically generated by the 'montage'
|
2
|
+
// command provided by the montage' gem. Don't edit this file directly; change
|
3
|
+
// the montage.yml configuration file, then re-run 'montage'
|
4
|
+
|
5
|
+
<% @project.sprites.each do |sprite| %>
|
6
|
+
=<%= sprite.name %>-sprite($icon, $x_offset: 0px, $y_offset: 0px)
|
7
|
+
<% sprite.sources.each_with_index do |source, index| %>
|
8
|
+
@<%= index == 0 ? '' : 'else ' %>if $icon == "<%= source.name %>"
|
9
|
+
$y_offset: $y_offset - <%= sprite.position_of(source) %>px
|
10
|
+
<% end %>
|
11
|
+
background: url(<%= @project.paths.url + "/#{sprite.name}.png" %>) $x_offset $y_offset no-repeat
|
12
|
+
|
13
|
+
=<%= sprite.name %>-sprite-pos($icon, $x_offset: 0px, $y_offset: 0px)
|
14
|
+
<% sprite.sources.each_with_index do |source, index| %>
|
15
|
+
@<%= index == 0 ? '' : 'else ' %>if $icon == "<%= source.name %>"
|
16
|
+
$y_offset: $y_offset - <%= sprite.position_of(source) %>px
|
17
|
+
<% end %>
|
18
|
+
background-position: $x_offset $y_offset
|
19
|
+
|
20
|
+
<% end %>
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/montage.gemspec
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{montage}
|
8
|
+
s.version = "0.2.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Anthony Williams"]
|
12
|
+
s.date = %q{2010-04-08}
|
13
|
+
s.default_executable = %q{montage}
|
14
|
+
s.description = %q{Even Rocky had a montage.}
|
15
|
+
s.email = %q{hi@antw.me}
|
16
|
+
s.executables = ["montage"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"History.md",
|
25
|
+
"LICENSE",
|
26
|
+
"README.md",
|
27
|
+
"Rakefile",
|
28
|
+
"VERSION",
|
29
|
+
"bin/montage",
|
30
|
+
"lib/montage.rb",
|
31
|
+
"lib/montage/commands.rb",
|
32
|
+
"lib/montage/commands/generate.rb",
|
33
|
+
"lib/montage/commands/init.rb",
|
34
|
+
"lib/montage/core_ext.rb",
|
35
|
+
"lib/montage/project.rb",
|
36
|
+
"lib/montage/sass_builder.rb",
|
37
|
+
"lib/montage/source.rb",
|
38
|
+
"lib/montage/sprite.rb",
|
39
|
+
"lib/montage/templates/montage.yml",
|
40
|
+
"lib/montage/templates/sass_mixins.erb",
|
41
|
+
"lib/montage/templates/sources/book.png",
|
42
|
+
"lib/montage/templates/sources/box-label.png",
|
43
|
+
"lib/montage/templates/sources/calculator.png",
|
44
|
+
"lib/montage/templates/sources/calendar-month.png",
|
45
|
+
"lib/montage/templates/sources/camera.png",
|
46
|
+
"lib/montage/templates/sources/eraser.png",
|
47
|
+
"lib/montage/version.rb",
|
48
|
+
"montage.gemspec",
|
49
|
+
"spec/fixtures/custom_dirs/montage.yml",
|
50
|
+
"spec/fixtures/default/montage.yml",
|
51
|
+
"spec/fixtures/default/public/images/sprites/src/one.png",
|
52
|
+
"spec/fixtures/default/public/images/sprites/src/three.png",
|
53
|
+
"spec/fixtures/default/public/images/sprites/src/two.png",
|
54
|
+
"spec/fixtures/directory_config/config/montage.yml",
|
55
|
+
"spec/fixtures/missing_source/montage.yml",
|
56
|
+
"spec/fixtures/missing_source_dir/montage.yml",
|
57
|
+
"spec/fixtures/root_config/montage.yml",
|
58
|
+
"spec/fixtures/root_config/public/images/sprites/src/source_one.png",
|
59
|
+
"spec/fixtures/root_config/public/images/sprites/src/source_three.jpg",
|
60
|
+
"spec/fixtures/root_config/public/images/sprites/src/source_two",
|
61
|
+
"spec/fixtures/sources/hundred.png",
|
62
|
+
"spec/fixtures/sources/mammoth.png",
|
63
|
+
"spec/fixtures/sources/other.png",
|
64
|
+
"spec/fixtures/sources/twenty.png",
|
65
|
+
"spec/fixtures/subdirs/montage.yml",
|
66
|
+
"spec/fixtures/subdirs/sub/sub/keep",
|
67
|
+
"spec/lib/command_runner.rb",
|
68
|
+
"spec/lib/fixtures.rb",
|
69
|
+
"spec/lib/have_public_method_defined.rb",
|
70
|
+
"spec/lib/project_helper.rb",
|
71
|
+
"spec/lib/shared_project_specs.rb",
|
72
|
+
"spec/lib/shared_sprite_specs.rb",
|
73
|
+
"spec/montage/commands/generate_spec.rb",
|
74
|
+
"spec/montage/commands/init_spec.rb",
|
75
|
+
"spec/montage/core_ext_spec.rb",
|
76
|
+
"spec/montage/project_spec.rb",
|
77
|
+
"spec/montage/sass_builder_spec.rb",
|
78
|
+
"spec/montage/source_spec.rb",
|
79
|
+
"spec/montage/spec/have_public_method_defined_spec.rb",
|
80
|
+
"spec/montage/sprite_spec.rb",
|
81
|
+
"spec/rcov.opts",
|
82
|
+
"spec/spec.opts",
|
83
|
+
"spec/spec_helper.rb",
|
84
|
+
"tasks/spec.rake",
|
85
|
+
"tasks/yard.rake"
|
86
|
+
]
|
87
|
+
s.has_rdoc = false
|
88
|
+
s.homepage = %q{http://github.com/antw/montage}
|
89
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
90
|
+
s.require_paths = ["lib"]
|
91
|
+
s.rubygems_version = %q{1.3.6}
|
92
|
+
s.summary = %q{Montage}
|
93
|
+
s.test_files = [
|
94
|
+
"spec/lib/command_runner.rb",
|
95
|
+
"spec/lib/fixtures.rb",
|
96
|
+
"spec/lib/have_public_method_defined.rb",
|
97
|
+
"spec/lib/project_helper.rb",
|
98
|
+
"spec/lib/shared_project_specs.rb",
|
99
|
+
"spec/lib/shared_sprite_specs.rb",
|
100
|
+
"spec/montage/commands/generate_spec.rb",
|
101
|
+
"spec/montage/commands/init_spec.rb",
|
102
|
+
"spec/montage/core_ext_spec.rb",
|
103
|
+
"spec/montage/project_spec.rb",
|
104
|
+
"spec/montage/sass_builder_spec.rb",
|
105
|
+
"spec/montage/source_spec.rb",
|
106
|
+
"spec/montage/spec/have_public_method_defined_spec.rb",
|
107
|
+
"spec/montage/sprite_spec.rb",
|
108
|
+
"spec/spec_helper.rb"
|
109
|
+
]
|
110
|
+
|
111
|
+
if s.respond_to? :specification_version then
|
112
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
113
|
+
s.specification_version = 3
|
114
|
+
|
115
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
116
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
117
|
+
s.add_runtime_dependency(%q<rmagick>, [">= 2.12"])
|
118
|
+
s.add_runtime_dependency(%q<highline>, [">= 1.5"])
|
119
|
+
s.add_development_dependency(%q<rspec>, [">= 1.3.0"])
|
120
|
+
s.add_development_dependency(%q<cucumber>, [">= 0.6"])
|
121
|
+
s.add_development_dependency(%q<open4>, [">= 1.0"])
|
122
|
+
s.add_development_dependency(%q<haml>, [">= 3.0.0.beta.1"])
|
123
|
+
s.add_development_dependency(%q<yard>, [">= 0.5"])
|
124
|
+
else
|
125
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
126
|
+
s.add_dependency(%q<rmagick>, [">= 2.12"])
|
127
|
+
s.add_dependency(%q<highline>, [">= 1.5"])
|
128
|
+
s.add_dependency(%q<rspec>, [">= 1.3.0"])
|
129
|
+
s.add_dependency(%q<cucumber>, [">= 0.6"])
|
130
|
+
s.add_dependency(%q<open4>, [">= 1.0"])
|
131
|
+
s.add_dependency(%q<haml>, [">= 3.0.0.beta.1"])
|
132
|
+
s.add_dependency(%q<yard>, [">= 0.5"])
|
133
|
+
end
|
134
|
+
else
|
135
|
+
s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
136
|
+
s.add_dependency(%q<rmagick>, [">= 2.12"])
|
137
|
+
s.add_dependency(%q<highline>, [">= 1.5"])
|
138
|
+
s.add_dependency(%q<rspec>, [">= 1.3.0"])
|
139
|
+
s.add_dependency(%q<cucumber>, [">= 0.6"])
|
140
|
+
s.add_dependency(%q<open4>, [">= 1.0"])
|
141
|
+
s.add_dependency(%q<haml>, [">= 3.0.0.beta.1"])
|
142
|
+
s.add_dependency(%q<yard>, [">= 0.5"])
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'open4'
|
4
|
+
|
5
|
+
require Pathname(__FILE__).dirname + 'project_helper'
|
6
|
+
|
7
|
+
module Montage
|
8
|
+
module Spec
|
9
|
+
# Runs montage commands in a subprocess and reports back on their exit
|
10
|
+
# status and output.
|
11
|
+
#
|
12
|
+
# See spec/montage/commands/*_spec.rb.
|
13
|
+
#
|
14
|
+
class CommandRunner < ProjectHelper
|
15
|
+
|
16
|
+
# Path to the Ruby binary.
|
17
|
+
RUBY = Pathname.new(Config::CONFIG['bindir']) +
|
18
|
+
Config::CONFIG['ruby_install_name']
|
19
|
+
|
20
|
+
# Path to the montage executable.
|
21
|
+
EXECUTABLE = Pathname.new(__FILE__).dirname.
|
22
|
+
expand_path + '../../bin/montage'
|
23
|
+
|
24
|
+
attr_reader :status, :stderr, :stdout
|
25
|
+
|
26
|
+
# ----------------------------------------------------------------------
|
27
|
+
|
28
|
+
# Creates a new CommandRunner instance.
|
29
|
+
#
|
30
|
+
# @param [String] command
|
31
|
+
# The command to be run (exactly as it would be on the command-line).
|
32
|
+
#
|
33
|
+
def initialize(command)
|
34
|
+
super()
|
35
|
+
@command = command
|
36
|
+
end
|
37
|
+
|
38
|
+
# Runs the command in the test directory.
|
39
|
+
#
|
40
|
+
# @return [CommandRunner]
|
41
|
+
# Returns self.
|
42
|
+
#
|
43
|
+
def run!(&block)
|
44
|
+
run(@command, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Runs the given command in the test directory.
|
48
|
+
#
|
49
|
+
# @param [String] command
|
50
|
+
# The command to be run.
|
51
|
+
#
|
52
|
+
# @return [CommandRunner]
|
53
|
+
# Returns self.
|
54
|
+
#
|
55
|
+
def run(command, &block)
|
56
|
+
if command =~ /^montage(.*)$/
|
57
|
+
command = "#{RUBY} -rubygems #{EXECUTABLE}#{$1} --no-color"
|
58
|
+
end
|
59
|
+
|
60
|
+
@status, @stderr, @stdout = nil, nil, nil
|
61
|
+
|
62
|
+
in_project_dir do
|
63
|
+
@status = Open4.popen4(command.to_s) do |_, stdin, stdout, stderr|
|
64
|
+
yield stdin if block_given?
|
65
|
+
|
66
|
+
@stdout = stdout.read
|
67
|
+
@stderr = stderr.read
|
68
|
+
end.exitstatus
|
69
|
+
end
|
70
|
+
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns if the latest command completed successfully.
|
75
|
+
#
|
76
|
+
# @return [Boolean]
|
77
|
+
#
|
78
|
+
def success?
|
79
|
+
@status == 0
|
80
|
+
end
|
81
|
+
|
82
|
+
# Returns if the latest command failed to complete successfully.
|
83
|
+
#
|
84
|
+
# @return [Boolean]
|
85
|
+
#
|
86
|
+
def failure?
|
87
|
+
not success?
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns the dimensions of a generated sprite image.
|
91
|
+
#
|
92
|
+
# @param [String] name
|
93
|
+
# The name of the sprite file.
|
94
|
+
#
|
95
|
+
# @return [Array<Integer, Integer>]
|
96
|
+
#
|
97
|
+
def dimensions_of(name)
|
98
|
+
info = Magick::Image.ping path_to_sprite(name)
|
99
|
+
[info.first.columns, info.first.rows]
|
100
|
+
end
|
101
|
+
|
102
|
+
private # --------------------------------------------------------------
|
103
|
+
|
104
|
+
# Temporarily switches to the test directory for running commands.
|
105
|
+
def in_project_dir(&blk)
|
106
|
+
Dir.chdir(project_dir, &blk)
|
107
|
+
end
|
108
|
+
|
109
|
+
end # CommandRunner
|
110
|
+
|
111
|
+
# Runs the montage init command, providing the command with the various
|
112
|
+
# inputs it wants.
|
113
|
+
#
|
114
|
+
class InitCommandRunner < CommandRunner
|
115
|
+
# Creates a new InitCommandRunner instance.
|
116
|
+
#
|
117
|
+
# @param [Hash] responses
|
118
|
+
# Takes inputs to be given to the highline GUI. Accepts :sources and
|
119
|
+
# :sprites
|
120
|
+
#
|
121
|
+
def initialize(responses = {})
|
122
|
+
super 'montage init'
|
123
|
+
@responses = responses
|
124
|
+
end
|
125
|
+
|
126
|
+
# Runs the command in the test directory.
|
127
|
+
#
|
128
|
+
# @return [InitCommandRunner]
|
129
|
+
# Returns self.
|
130
|
+
#
|
131
|
+
def run!
|
132
|
+
super do |stdin|
|
133
|
+
stdin.puts @responses.fetch(:sprites, "\n")
|
134
|
+
stdin.puts @responses.fetch(:sources, "\n")
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end # Spec
|
140
|
+
end # Montage
|