squib 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/.gitignore +29 -29
- data/.travis.yml +6 -6
- data/.yardopts +7 -5
- data/Gemfile +2 -2
- data/LICENSE.txt +22 -22
- data/README.md +245 -92
- data/Rakefile +11 -11
- data/bin/squib +18 -18
- data/lib/squib.rb +31 -18
- data/lib/squib/api/background.rb +18 -16
- data/lib/squib/api/data.rb +52 -52
- data/lib/squib/api/image.rb +66 -48
- data/lib/squib/api/save.rb +43 -37
- data/lib/squib/api/settings.rb +38 -35
- data/lib/squib/api/shapes.rb +116 -106
- data/lib/squib/api/text.rb +50 -45
- data/lib/squib/api/units.rb +16 -16
- data/lib/squib/card.rb +42 -36
- data/lib/squib/commands/new.rb +43 -39
- data/lib/squib/constants.rb +104 -39
- data/lib/squib/deck.rb +116 -113
- data/lib/squib/graphics/background.rb +13 -12
- data/lib/squib/graphics/image.rb +47 -28
- data/lib/squib/graphics/save_doc.rb +54 -50
- data/lib/squib/graphics/save_images.rb +32 -10
- data/lib/squib/graphics/shapes.rb +59 -55
- data/lib/squib/graphics/text.rb +113 -107
- data/lib/squib/input_helpers.rb +193 -139
- data/lib/squib/progress.rb +38 -0
- data/lib/squib/project_template/.gitignore +4 -3
- data/lib/squib/project_template/ABOUT.md +19 -19
- data/lib/squib/project_template/Gemfile +2 -2
- data/lib/squib/project_template/PNP NOTES.md +3 -3
- data/lib/squib/project_template/config.yml +20 -2
- data/lib/squib/project_template/deck.rb +5 -5
- data/lib/squib/version.rb +6 -6
- data/samples/ball.png +0 -0
- data/samples/basic.rb +19 -19
- data/samples/colors.rb +15 -16
- data/samples/custom-config.yml +6 -1
- data/samples/custom-layout.yml +39 -34
- data/samples/custom_config.rb +18 -5
- data/samples/customconfig-imgdir/shiny-purse2.png +0 -0
- data/samples/customconfig-imgdir/spanner2.svg +91 -0
- data/samples/draw_shapes.rb +18 -18
- data/samples/excel.rb +19 -19
- data/samples/grit.png +0 -0
- data/samples/hello_world.rb +6 -6
- data/samples/load_images.rb +29 -19
- data/samples/offset.svg +71 -0
- data/samples/portrait-landscape.rb +23 -0
- data/samples/ranges.rb +55 -47
- data/samples/save_pdf.rb +14 -14
- data/samples/shiny-purse.png +0 -0
- data/samples/spanner.svg +91 -91
- data/samples/text_options.rb +60 -58
- data/samples/tgc_proofs.rb +19 -19
- data/samples/units.rb +12 -12
- data/samples/use_layout.rb +28 -28
- data/spec/api/api_text_spec.rb +42 -36
- data/spec/commands/new_spec.rb +47 -47
- data/spec/data/multi-extends-single-entry.yml +13 -0
- data/spec/data/multi-level-extends.yml +10 -0
- data/spec/data/no-extends.yml +5 -0
- data/spec/data/single-extends.yml +7 -0
- data/spec/data/single-level-multi-extends.yml +12 -0
- data/spec/deck_spec.rb +147 -49
- data/spec/input_helpers_spec.rb +117 -0
- data/spec/samples_run_spec.rb +19 -14
- data/spec/spec_helper.rb +3 -0
- data/squib.gemspec +46 -42
- metadata +78 -4
- data/API.md +0 -59
data/samples/tgc_proofs.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'squib'
|
3
|
-
|
4
|
-
# This sample uses a proof overlay from TheGameCrafter.com to check bleed
|
5
|
-
Squib::Deck.new(width: 825, height: 1125, cards: 1) do
|
6
|
-
background color: :white
|
7
|
-
rect x: 38, y: 38, width: 750, height: 1050, x_radius: 38, y_radius: 38
|
8
|
-
rect x: 75, y: 75, width: 128, height: 128, x_radius: 25, y_radius: 25
|
9
|
-
|
10
|
-
text str: 'Mastermind', x: 220, y: 78, font: 'Arial 54'
|
11
|
-
text str: 3, x: 75, y: 85, width: 128, font: 'Arial 72', align: :center
|
12
|
-
|
13
|
-
png file: 'shiny-purse.png', x: 620, y: 75
|
14
|
-
svg file: 'spanner.svg', x: 620, y: 218
|
15
|
-
|
16
|
-
# TGC proof overlay
|
17
|
-
png file: 'pokercard.png', x:0, y:0, alpha: 0.5
|
18
|
-
|
19
|
-
save_png prefix: 'tgc_sample_'
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'squib'
|
3
|
+
|
4
|
+
# This sample uses a proof overlay from TheGameCrafter.com to check bleed
|
5
|
+
Squib::Deck.new(width: 825, height: 1125, cards: 1) do
|
6
|
+
background color: :white
|
7
|
+
rect x: 38, y: 38, width: 750, height: 1050, x_radius: 38, y_radius: 38
|
8
|
+
rect x: 75, y: 75, width: 128, height: 128, x_radius: 25, y_radius: 25
|
9
|
+
|
10
|
+
text str: 'Mastermind', x: 220, y: 78, font: 'Arial 54'
|
11
|
+
text str: 3, x: 75, y: 85, width: 128, font: 'Arial 72', align: :center
|
12
|
+
|
13
|
+
png file: 'shiny-purse.png', x: 620, y: 75
|
14
|
+
svg file: 'spanner.svg', x: 620, y: 218
|
15
|
+
|
16
|
+
# TGC proof overlay
|
17
|
+
png file: 'pokercard.png', x:0, y:0, alpha: 0.5
|
18
|
+
|
19
|
+
save_png prefix: 'tgc_sample_'
|
20
20
|
end
|
data/samples/units.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require 'squib'
|
2
|
-
|
3
|
-
Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
4
|
-
background color: :white
|
5
|
-
|
6
|
-
bleed = inches(0.125)
|
7
|
-
cut_width = inches(2.5)
|
8
|
-
cut_height = inches(3.5)
|
9
|
-
rect x: bleed, y: bleed, width: cut_width, height: cut_height, radius: 25
|
10
|
-
|
11
|
-
save prefix: 'units_', format: :png
|
12
|
-
end
|
1
|
+
require 'squib'
|
2
|
+
|
3
|
+
Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
4
|
+
background color: :white
|
5
|
+
|
6
|
+
bleed = inches(0.125)
|
7
|
+
cut_width = inches(2.5)
|
8
|
+
cut_height = inches(3.5)
|
9
|
+
rect x: bleed, y: bleed, width: cut_width, height: cut_height, radius: 25
|
10
|
+
|
11
|
+
save prefix: 'units_', format: :png
|
12
|
+
end
|
data/samples/use_layout.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
|
-
require 'squib'
|
2
|
-
|
3
|
-
Squib::Deck.new(layout: 'custom-layout.yml') do
|
4
|
-
background color: :white
|
5
|
-
hint text: :cyan
|
6
|
-
|
7
|
-
# Layouts are YAML files that specify any option as a default
|
8
|
-
rect layout: :frame
|
9
|
-
|
10
|
-
# You can also override a given layout entry in the command
|
11
|
-
circle layout: :frame, x: 50, y: 50, radius: 25
|
12
|
-
|
13
|
-
# Lots of commands have the :layout option
|
14
|
-
text str: 'The Title', layout: :title
|
15
|
-
|
16
|
-
# Layouts also support an "extends" attribute to reuse settings
|
17
|
-
svg file: 'spanner.svg', layout: :icon_left
|
18
|
-
png file: 'shiny-purse.png', layout: :icon_middle
|
19
|
-
svg file: 'spanner.svg', layout: :icon_right
|
20
|
-
|
21
|
-
# Strings can also be used to specify a layout (e.g. from a data file)
|
22
|
-
text str: 'subtitle', layout: 'subtitle'
|
23
|
-
|
24
|
-
# For debugging purposes, you can always print out the loaded layout
|
25
|
-
#require 'pp'
|
26
|
-
#pp @layout
|
27
|
-
|
28
|
-
save_png prefix: 'layout_'
|
1
|
+
require 'squib'
|
2
|
+
|
3
|
+
Squib::Deck.new(layout: 'custom-layout.yml') do
|
4
|
+
background color: :white
|
5
|
+
hint text: :cyan
|
6
|
+
|
7
|
+
# Layouts are YAML files that specify any option as a default
|
8
|
+
rect layout: :frame
|
9
|
+
|
10
|
+
# You can also override a given layout entry in the command
|
11
|
+
circle layout: :frame, x: 50, y: 50, radius: 25
|
12
|
+
|
13
|
+
# Lots of commands have the :layout option
|
14
|
+
text str: 'The Title', layout: :title
|
15
|
+
|
16
|
+
# Layouts also support an "extends" attribute to reuse settings
|
17
|
+
svg file: 'spanner.svg', layout: :icon_left
|
18
|
+
png file: 'shiny-purse.png', layout: :icon_middle
|
19
|
+
svg file: 'spanner.svg', layout: :icon_right
|
20
|
+
|
21
|
+
# Strings can also be used to specify a layout (e.g. from a data file)
|
22
|
+
text str: 'subtitle', layout: 'subtitle'
|
23
|
+
|
24
|
+
# For debugging purposes, you can always print out the loaded layout
|
25
|
+
#require 'pp'
|
26
|
+
#pp @layout
|
27
|
+
|
28
|
+
save_png prefix: 'layout_'
|
29
29
|
end
|
data/spec/api/api_text_spec.rb
CHANGED
@@ -1,37 +1,43 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'squib'
|
3
|
-
|
4
|
-
describe Squib::Deck, '#text' do
|
5
|
-
|
6
|
-
context "
|
7
|
-
it"should use the default font when #text and #set_font don't specify" do
|
8
|
-
card = instance_double(Squib::Card)
|
9
|
-
expect(card).to receive(:text).with('a', 'Arial 36',
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
Squib::
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'squib'
|
3
|
+
|
4
|
+
describe Squib::Deck, '#text' do
|
5
|
+
|
6
|
+
context "fonts" do
|
7
|
+
it "should use the default font when #text and #set_font don't specify" do
|
8
|
+
card = instance_double(Squib::Card)
|
9
|
+
expect(card).to receive(:text).with('a', 'Arial 36',
|
10
|
+
anything, anything, anything, anything,anything, anything, anything, anything,anything, anything, anything, anything, anything
|
11
|
+
).once
|
12
|
+
Squib::Deck.new do
|
13
|
+
@cards = [card]
|
14
|
+
text str: 'a'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should use the #set_font when #text doesn't specify" do
|
19
|
+
card = instance_double(Squib::Card)
|
20
|
+
expect(card).to receive(:text).with('a', 'Times New Roman 16',
|
21
|
+
anything, anything, anything, anything,anything, anything, anything, anything,anything, anything, anything, anything, anything
|
22
|
+
).once
|
23
|
+
Squib::Deck.new do
|
24
|
+
@cards = [card]
|
25
|
+
set font: 'Times New Roman 16'
|
26
|
+
text str: 'a'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should use the specified font no matter what" do
|
31
|
+
card = instance_double(Squib::Card)
|
32
|
+
expect(card).to receive(:text).with('a', 'Arial 18',
|
33
|
+
anything, anything, anything, anything,anything, anything, anything, anything,anything, anything, anything, anything, anything
|
34
|
+
).once
|
35
|
+
Squib::Deck.new do
|
36
|
+
@cards = [card]
|
37
|
+
set font: 'Times New Roman 16'
|
38
|
+
text str: 'a', font: 'Arial 18'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
37
43
|
end
|
data/spec/commands/new_spec.rb
CHANGED
@@ -1,48 +1,48 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'squib'
|
3
|
-
|
4
|
-
describe Squib::Commands::New do
|
5
|
-
|
6
|
-
describe "#process" do
|
7
|
-
before(:all) do
|
8
|
-
@old_stderr = $stderr
|
9
|
-
$stderr = StringIO.new
|
10
|
-
@oldpwd = Dir.pwd
|
11
|
-
Dir.chdir(File.expand_path('../../samples/_output', File.dirname(__FILE__)))
|
12
|
-
end
|
13
|
-
|
14
|
-
before(:each) do
|
15
|
-
FileUtils.rm_rf('foo', secure: true)
|
16
|
-
@cmd = Squib::Commands::New.new
|
17
|
-
end
|
18
|
-
|
19
|
-
it "raises an error if no directory was specified" do
|
20
|
-
expect{@cmd.process([])}.to raise_error(ArgumentError, 'Please specify a path.')
|
21
|
-
end
|
22
|
-
|
23
|
-
it "creates a new template on an fresh directory" do
|
24
|
-
@cmd.process(['foo'])
|
25
|
-
expect(File.exists?('foo/deck.rb')).to be true
|
26
|
-
end
|
27
|
-
|
28
|
-
it "creates a new template on an empty directory" do
|
29
|
-
Dir.mkdir('foo')
|
30
|
-
@cmd.process(['foo'])
|
31
|
-
expect(File.exists?('foo/deck.rb')).to be true
|
32
|
-
end
|
33
|
-
|
34
|
-
it "does not create a new template on an empty " do
|
35
|
-
Dir.mkdir('foo')
|
36
|
-
File.new('foo/somefile.txt', 'w+')
|
37
|
-
@cmd.process(['foo'])
|
38
|
-
$stderr.rewind
|
39
|
-
expect($stderr.string.chomp).to end_with " exists and is not empty. Doing nothing and quitting."
|
40
|
-
end
|
41
|
-
|
42
|
-
after(:all) do
|
43
|
-
$stderr = @old_stderr
|
44
|
-
Dir.chdir(@oldpwd)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'squib'
|
3
|
+
|
4
|
+
describe Squib::Commands::New do
|
5
|
+
|
6
|
+
describe "#process" do
|
7
|
+
before(:all) do
|
8
|
+
@old_stderr = $stderr
|
9
|
+
$stderr = StringIO.new
|
10
|
+
@oldpwd = Dir.pwd
|
11
|
+
Dir.chdir(File.expand_path('../../samples/_output', File.dirname(__FILE__)))
|
12
|
+
end
|
13
|
+
|
14
|
+
before(:each) do
|
15
|
+
FileUtils.rm_rf('foo', secure: true)
|
16
|
+
@cmd = Squib::Commands::New.new
|
17
|
+
end
|
18
|
+
|
19
|
+
it "raises an error if no directory was specified" do
|
20
|
+
expect{@cmd.process([])}.to raise_error(ArgumentError, 'Please specify a path.')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "creates a new template on an fresh directory" do
|
24
|
+
@cmd.process(['foo'])
|
25
|
+
expect(File.exists?('foo/deck.rb')).to be true
|
26
|
+
end
|
27
|
+
|
28
|
+
it "creates a new template on an empty directory" do
|
29
|
+
Dir.mkdir('foo')
|
30
|
+
@cmd.process(['foo'])
|
31
|
+
expect(File.exists?('foo/deck.rb')).to be true
|
32
|
+
end
|
33
|
+
|
34
|
+
it "does not create a new template on an empty " do
|
35
|
+
Dir.mkdir('foo')
|
36
|
+
File.new('foo/somefile.txt', 'w+')
|
37
|
+
@cmd.process(['foo'])
|
38
|
+
$stderr.rewind
|
39
|
+
expect($stderr.string.chomp).to end_with " exists and is not empty. Doing nothing and quitting."
|
40
|
+
end
|
41
|
+
|
42
|
+
after(:all) do
|
43
|
+
$stderr = @old_stderr
|
44
|
+
Dir.chdir(@oldpwd)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
48
|
end
|
data/spec/deck_spec.rb
CHANGED
@@ -1,49 +1,147 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'squib/deck'
|
3
|
-
|
4
|
-
describe Squib::Deck do
|
5
|
-
|
6
|
-
it "initializes with default parameters" do
|
7
|
-
d = Squib::Deck.new
|
8
|
-
expect(d.width).to eq(825)
|
9
|
-
expect(d.height).to eq(1125)
|
10
|
-
expect(d.cards.size).to eq(1)
|
11
|
-
end
|
12
|
-
|
13
|
-
context "in dealing with ranges" do
|
14
|
-
it "calls text on all cards by default" do
|
15
|
-
card1 = instance_double(Squib::Card)
|
16
|
-
card2 = instance_double(Squib::Card)
|
17
|
-
expect(card1).to receive(:text).once
|
18
|
-
expect(card2).to receive(:text).once
|
19
|
-
Squib::Deck.new do
|
20
|
-
@cards = [card1, card2]
|
21
|
-
text str: 'blah'
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
it "calls text on some cards with an integer" do
|
26
|
-
card1 = instance_double(Squib::Card)
|
27
|
-
card2 = instance_double(Squib::Card)
|
28
|
-
expect(card2).to receive(:text).once
|
29
|
-
Squib::Deck.new do
|
30
|
-
@cards = [card1, card2]
|
31
|
-
text range: 1, str: 'blah'
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
it "calls text with ranges" do
|
36
|
-
card1 = instance_double(Squib::Card)
|
37
|
-
card2 = instance_double(Squib::Card)
|
38
|
-
card3 = instance_double(Squib::Card)
|
39
|
-
expect(card1).to receive(:text).once
|
40
|
-
expect(card2).to receive(:text).once
|
41
|
-
Squib::Deck.new do
|
42
|
-
@cards = [card1, card2, card3]
|
43
|
-
text range: 0..1, str: 'blah'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
|
49
|
-
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'squib/deck'
|
3
|
+
|
4
|
+
describe Squib::Deck do
|
5
|
+
|
6
|
+
it "initializes with default parameters" do
|
7
|
+
d = Squib::Deck.new
|
8
|
+
expect(d.width).to eq(825)
|
9
|
+
expect(d.height).to eq(1125)
|
10
|
+
expect(d.cards.size).to eq(1)
|
11
|
+
end
|
12
|
+
|
13
|
+
context "in dealing with ranges" do
|
14
|
+
it "calls text on all cards by default" do
|
15
|
+
card1 = instance_double(Squib::Card)
|
16
|
+
card2 = instance_double(Squib::Card)
|
17
|
+
expect(card1).to receive(:text).once
|
18
|
+
expect(card2).to receive(:text).once
|
19
|
+
Squib::Deck.new do
|
20
|
+
@cards = [card1, card2]
|
21
|
+
text str: 'blah'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it "calls text on some cards with an integer" do
|
26
|
+
card1 = instance_double(Squib::Card)
|
27
|
+
card2 = instance_double(Squib::Card)
|
28
|
+
expect(card2).to receive(:text).once
|
29
|
+
Squib::Deck.new do
|
30
|
+
@cards = [card1, card2]
|
31
|
+
text range: 1, str: 'blah'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "calls text with ranges" do
|
36
|
+
card1 = instance_double(Squib::Card)
|
37
|
+
card2 = instance_double(Squib::Card)
|
38
|
+
card3 = instance_double(Squib::Card)
|
39
|
+
expect(card1).to receive(:text).once
|
40
|
+
expect(card2).to receive(:text).once
|
41
|
+
Squib::Deck.new do
|
42
|
+
@cards = [card1, card2, card3]
|
43
|
+
text range: 0..1, str: 'blah'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "#load_layout" do
|
49
|
+
|
50
|
+
it "loads a normal layout with no extends" do
|
51
|
+
d = Squib::Deck.new(layout: test_file('no-extends.yml'))
|
52
|
+
expect(d.layout).to \
|
53
|
+
eq({'frame' => {
|
54
|
+
'x' => 38,
|
55
|
+
'valign' => :middle,
|
56
|
+
'str' => "blah",
|
57
|
+
'font' => "Mr. Font",
|
58
|
+
}
|
59
|
+
}
|
60
|
+
)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "loads with a single extends" do
|
64
|
+
d = Squib::Deck.new(layout: test_file('single-extends.yml'))
|
65
|
+
expect(d.layout).to \
|
66
|
+
eq({'frame' => {
|
67
|
+
'x' => 38,
|
68
|
+
'y' => 38,
|
69
|
+
},
|
70
|
+
'title' => {
|
71
|
+
'x' => 38,
|
72
|
+
'y' => 50,
|
73
|
+
'width' => 100,
|
74
|
+
}
|
75
|
+
}
|
76
|
+
)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "applies the single-level extends multiple times" do
|
80
|
+
d = Squib::Deck.new(layout: test_file('single-level-multi-extends.yml'))
|
81
|
+
expect(d.layout).to \
|
82
|
+
eq({'frame' => {
|
83
|
+
'x' => 38,
|
84
|
+
'y' => 38,
|
85
|
+
},
|
86
|
+
'title' => {
|
87
|
+
'x' => 38,
|
88
|
+
'y' => 50,
|
89
|
+
'width' => 100,
|
90
|
+
},
|
91
|
+
'title2' => {
|
92
|
+
'x' => 75,
|
93
|
+
'y' => 150,
|
94
|
+
'width' => 150,
|
95
|
+
},
|
96
|
+
}
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "applies multiple extends in a single rule" do
|
101
|
+
d = Squib::Deck.new(layout: test_file('multi-extends-single-entry.yml'))
|
102
|
+
expect(d.layout).to \
|
103
|
+
eq({'aunt' => {
|
104
|
+
'a' => 101,
|
105
|
+
'b' => 102,
|
106
|
+
'c' => 103,
|
107
|
+
},
|
108
|
+
'uncle' => {
|
109
|
+
'x' => 104,
|
110
|
+
'y' => 105,
|
111
|
+
'b' => 106,
|
112
|
+
},
|
113
|
+
'child' => {
|
114
|
+
'a' => 107, # my own
|
115
|
+
'b' => 102, # from the younger aunt
|
116
|
+
'c' => 103, # from aunt
|
117
|
+
'x' => 108, # my own
|
118
|
+
'y' => 105, # from uncle
|
119
|
+
},
|
120
|
+
}
|
121
|
+
)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "applies multi-level extends" do
|
125
|
+
d = Squib::Deck.new(layout: test_file('multi-level-extends.yml'))
|
126
|
+
expect(d.layout).to \
|
127
|
+
eq({'frame' => {
|
128
|
+
'x' => 38,
|
129
|
+
'y' => 38,
|
130
|
+
},
|
131
|
+
'title' => {
|
132
|
+
'x' => 38,
|
133
|
+
'y' => 50,
|
134
|
+
'width' => 100,
|
135
|
+
},
|
136
|
+
'subtitle' => {
|
137
|
+
'x' => 38,
|
138
|
+
'y' => 150,
|
139
|
+
'width' => 100,
|
140
|
+
},
|
141
|
+
}
|
142
|
+
)
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|