squib 0.0.5 → 0.0.6
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/.yardopts +3 -1
- data/CHANGELOG.md +10 -0
- data/README.md +65 -4
- data/lib/squib/api/data.rb +48 -1
- data/lib/squib/api/text.rb +4 -2
- data/lib/squib/deck.rb +22 -5
- data/lib/squib/graphics/text.rb +4 -0
- data/lib/squib/layouts/hand.yml +46 -0
- data/lib/squib/layouts/playing-card.yml +18 -0
- data/lib/squib/version.rb +1 -1
- data/samples/cairo_access.rb +4 -3
- data/samples/csv_import.rb +20 -0
- data/samples/custom-layout.yml +5 -4
- data/samples/custom-layout2.yml +15 -0
- data/samples/custom_config.rb +0 -1
- data/samples/excel.rb +1 -2
- data/samples/layouts.rb +61 -0
- data/samples/ranges.rb +0 -1
- data/samples/sample.csv +3 -0
- data/samples/text_options.rb +14 -3
- data/samples/tgc_proofs.rb +0 -1
- data/samples/units.rb +1 -1
- data/spec/api/api_data_spec.rb +31 -0
- data/spec/api/api_image_spec.rb +38 -0
- data/spec/data/csv/basic.csv +3 -0
- data/spec/data/csv/dup_cols.csv +3 -0
- data/spec/data/csv/with_spaces.csv +3 -0
- data/spec/data/{easy-circular-extends.yml → layouts/easy-circular-extends.yml} +0 -0
- data/spec/data/{hard-circular-extends.yml → layouts/hard-circular-extends.yml} +0 -0
- data/spec/data/{multi-extends-single-entry.yml → layouts/multi-extends-single-entry.yml} +0 -0
- data/spec/data/{multi-level-extends.yml → layouts/multi-level-extends.yml} +0 -0
- data/spec/data/layouts/multifile-a.yml +4 -0
- data/spec/data/layouts/multifile-b.yml +4 -0
- data/spec/data/layouts/multifile-extends-a.yml +8 -0
- data/spec/data/layouts/multifile-extends-b.yml +9 -0
- data/spec/data/{no-extends.yml → layouts/no-extends.yml} +0 -0
- data/spec/data/{pre-extends.yml → layouts/pre-extends.yml} +0 -0
- data/spec/data/{self-circular-extends.yml → layouts/self-circular-extends.yml} +0 -0
- data/spec/data/{single-extends.yml → layouts/single-extends.yml} +0 -0
- data/spec/data/{single-level-multi-extends.yml → layouts/single-level-multi-extends.yml} +0 -0
- data/spec/data/samples/autoscale_font.rb.txt +81 -0
- data/spec/data/samples/basic.rb.txt +206 -0
- data/spec/data/samples/cairo_access.rb.txt +25 -0
- data/spec/data/samples/colors.rb.txt +124 -0
- data/spec/data/samples/csv_import.rb.txt +112 -0
- data/spec/data/samples/custom_config.rb.txt +45 -0
- data/spec/data/samples/draw_shapes.rb.txt +35 -0
- data/spec/data/samples/excel.rb.txt +168 -0
- data/spec/data/samples/hello_world.rb.txt +36 -0
- data/spec/data/samples/layouts.rb.txt +489 -0
- data/spec/data/samples/load_images.rb.txt +104 -0
- data/spec/data/samples/portrait-landscape.rb.txt +49 -0
- data/spec/data/samples/ranges.rb.txt +426 -0
- data/spec/data/samples/save_pdf.rb.txt +545 -0
- data/spec/data/samples/text_options.rb.txt +819 -0
- data/spec/data/samples/tgc_proofs.rb.txt +81 -0
- data/spec/data/samples/units.rb.txt +14 -0
- data/spec/deck_spec.rb +33 -9
- data/spec/graphics/graphics_text_spec.rb +7 -5
- data/spec/samples/samples_regression_spec.rb +73 -0
- data/spec/spec_helper.rb +64 -2
- data/squib.gemspec +2 -2
- metadata +100 -27
- data/samples/use_layout.rb +0 -34
- data/spec/samples_run_spec.rb +0 -20
@@ -0,0 +1,81 @@
|
|
1
|
+
cairo: save([])
|
2
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=1.0, @green=1.0, @blue=1.0>])
|
3
|
+
cairo: paint([])
|
4
|
+
cairo: restore([])
|
5
|
+
cairo: save([])
|
6
|
+
cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
|
7
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
|
8
|
+
cairo: set_line_width([2.0])
|
9
|
+
cairo: stroke([])
|
10
|
+
cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
|
11
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
|
12
|
+
cairo: fill([])
|
13
|
+
cairo: restore([])
|
14
|
+
cairo: save([])
|
15
|
+
cairo: rounded_rectangle([75, 75, 128, 128, 25, 25])
|
16
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
|
17
|
+
cairo: set_line_width([2.0])
|
18
|
+
cairo: stroke([])
|
19
|
+
cairo: rounded_rectangle([75, 75, 128, 128, 25, 25])
|
20
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
|
21
|
+
cairo: fill([])
|
22
|
+
cairo: restore([])
|
23
|
+
cairo: save([])
|
24
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
|
25
|
+
cairo: translate([220, 78])
|
26
|
+
cairo: rotate([0])
|
27
|
+
cairo: translate([-220, -78])
|
28
|
+
cairo: move_to([220, 78])
|
29
|
+
pango: font_description=([])
|
30
|
+
pango: text=(["Mastermind"])
|
31
|
+
pango: wrap=([#<Pango::Layout::WrapMode word-char>])
|
32
|
+
pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
|
33
|
+
pango: alignment=([#<Pango::Layout::Alignment left>])
|
34
|
+
pango: justify=([false])
|
35
|
+
pango: spacing=([0])
|
36
|
+
cairo: update_pango_layout([MockDouble])
|
37
|
+
cairo: update_pango_layout([MockDouble])
|
38
|
+
cairo: show_pango_layout([MockDouble])
|
39
|
+
cairo: restore([])
|
40
|
+
cairo: save([])
|
41
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
|
42
|
+
cairo: translate([75, 85])
|
43
|
+
cairo: rotate([0])
|
44
|
+
cairo: translate([-75, -85])
|
45
|
+
cairo: move_to([75, 85])
|
46
|
+
pango: font_description=([])
|
47
|
+
pango: text=(["3"])
|
48
|
+
pango: width=([131072])
|
49
|
+
pango: wrap=([#<Pango::Layout::WrapMode word-char>])
|
50
|
+
pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
|
51
|
+
pango: alignment=([#<Pango::Layout::Alignment center>])
|
52
|
+
pango: justify=([false])
|
53
|
+
pango: spacing=([0])
|
54
|
+
cairo: update_pango_layout([MockDouble])
|
55
|
+
cairo: update_pango_layout([MockDouble])
|
56
|
+
cairo: show_pango_layout([MockDouble])
|
57
|
+
cairo: restore([])
|
58
|
+
cairo: save([])
|
59
|
+
cairo: translate([620, 75])
|
60
|
+
cairo: rotate([0])
|
61
|
+
cairo: translate([-620, -75])
|
62
|
+
cairo: set_source([ImageSurface, 620, 75])
|
63
|
+
cairo: paint([1.0])
|
64
|
+
cairo: restore([])
|
65
|
+
cairo: scale([1.0, 1.0])
|
66
|
+
cairo: render_rsvg_handle([RSVG::Handle, nil])
|
67
|
+
cairo: save([])
|
68
|
+
cairo: translate([620, 218])
|
69
|
+
cairo: rotate([0])
|
70
|
+
cairo: translate([-620, -218])
|
71
|
+
cairo: set_source([MockDouble, 620, 218])
|
72
|
+
cairo: paint([1.0])
|
73
|
+
cairo: restore([])
|
74
|
+
cairo: save([])
|
75
|
+
cairo: translate([0, 0])
|
76
|
+
cairo: rotate([0])
|
77
|
+
cairo: translate([0, 0])
|
78
|
+
cairo: set_source([ImageSurface, 0, 0])
|
79
|
+
cairo: paint([0.5])
|
80
|
+
cairo: restore([])
|
81
|
+
surface: write_to_png(["_output/tgc_sample_0.png"])
|
@@ -0,0 +1,14 @@
|
|
1
|
+
cairo: save([])
|
2
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=1.0, @green=1.0, @blue=1.0>])
|
3
|
+
cairo: paint([])
|
4
|
+
cairo: restore([])
|
5
|
+
cairo: save([])
|
6
|
+
cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
|
7
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=1.0, @red=0.0, @green=0.0, @blue=0.0>])
|
8
|
+
cairo: set_line_width([2.0])
|
9
|
+
cairo: stroke([])
|
10
|
+
cairo: rounded_rectangle([37.5, 37.5, 750.0, 1050.0, 25, 25])
|
11
|
+
cairo: set_source_color([#<Cairo::Color::RGB: @alpha=0.0, @red=0.0, @green=0.0, @blue=0.0>])
|
12
|
+
cairo: fill([])
|
13
|
+
cairo: restore([])
|
14
|
+
surface: write_to_png(["_output/units_0.png"])
|
data/spec/deck_spec.rb
CHANGED
@@ -48,7 +48,7 @@ describe Squib::Deck do
|
|
48
48
|
context '#load_layout' do
|
49
49
|
|
50
50
|
it 'loads a normal layout with no extends' do
|
51
|
-
d = Squib::Deck.new(layout:
|
51
|
+
d = Squib::Deck.new(layout: layout_file('no-extends.yml'))
|
52
52
|
expect(d.layout).to \
|
53
53
|
eq({'frame' => {
|
54
54
|
'x' => 38,
|
@@ -61,7 +61,7 @@ describe Squib::Deck do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it 'loads with a single extends' do
|
64
|
-
d = Squib::Deck.new(layout:
|
64
|
+
d = Squib::Deck.new(layout: layout_file('single-extends.yml'))
|
65
65
|
expect(d.layout).to \
|
66
66
|
eq({'frame' => {
|
67
67
|
'x' => 38,
|
@@ -78,7 +78,7 @@ describe Squib::Deck do
|
|
78
78
|
end
|
79
79
|
|
80
80
|
it 'applies the extends regardless of order' do
|
81
|
-
d = Squib::Deck.new(layout:
|
81
|
+
d = Squib::Deck.new(layout: layout_file('pre-extends.yml'))
|
82
82
|
expect(d.layout).to \
|
83
83
|
eq({'frame' => {
|
84
84
|
'x' => 38,
|
@@ -95,7 +95,7 @@ describe Squib::Deck do
|
|
95
95
|
end
|
96
96
|
|
97
97
|
it 'applies the single-level extends multiple times' do
|
98
|
-
d = Squib::Deck.new(layout:
|
98
|
+
d = Squib::Deck.new(layout: layout_file('single-level-multi-extends.yml'))
|
99
99
|
expect(d.layout).to \
|
100
100
|
eq({'frame' => {
|
101
101
|
'x' => 38,
|
@@ -118,7 +118,7 @@ describe Squib::Deck do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
it 'applies multiple extends in a single rule' do
|
121
|
-
d = Squib::Deck.new(layout:
|
121
|
+
d = Squib::Deck.new(layout: layout_file('multi-extends-single-entry.yml'))
|
122
122
|
expect(d.layout).to \
|
123
123
|
eq({'aunt' => {
|
124
124
|
'a' => 101,
|
@@ -143,7 +143,7 @@ describe Squib::Deck do
|
|
143
143
|
end
|
144
144
|
|
145
145
|
it 'applies multi-level extends' do
|
146
|
-
d = Squib::Deck.new(layout:
|
146
|
+
d = Squib::Deck.new(layout: layout_file('multi-level-extends.yml'))
|
147
147
|
expect(d.layout).to \
|
148
148
|
eq({'frame' => {
|
149
149
|
'x' => 38,
|
@@ -166,23 +166,47 @@ describe Squib::Deck do
|
|
166
166
|
end
|
167
167
|
|
168
168
|
it 'fails on a self-circular extends' do
|
169
|
-
file =
|
169
|
+
file = layout_file('self-circular-extends.yml')
|
170
170
|
expect { Squib::Deck.new(layout: file) }.to \
|
171
171
|
raise_error(RuntimeError, 'Invalid layout: circular extends with \'a\'')
|
172
172
|
end
|
173
173
|
|
174
174
|
it 'fails on a easy-circular extends' do
|
175
|
-
file =
|
175
|
+
file = layout_file('easy-circular-extends.yml')
|
176
176
|
expect { Squib::Deck.new(layout: file) }.to \
|
177
177
|
raise_error(RuntimeError, 'Invalid layout: circular extends with \'a\'')
|
178
178
|
end
|
179
179
|
|
180
180
|
it 'hard on a easy-circular extends' do
|
181
|
-
file =
|
181
|
+
file = layout_file('hard-circular-extends.yml')
|
182
182
|
expect { Squib::Deck.new(layout: file) }.to \
|
183
183
|
raise_error(RuntimeError, 'Invalid layout: circular extends with \'a\'')
|
184
184
|
end
|
185
185
|
|
186
|
+
it 'redefines keys on multiple layouts' do
|
187
|
+
a = layout_file('multifile-a.yml')
|
188
|
+
b = layout_file('multifile-b.yml')
|
189
|
+
d = Squib::Deck.new(layout: [a, b])
|
190
|
+
expect(d.layout).to eq({
|
191
|
+
'title' => { 'x' => 300 },
|
192
|
+
'subtitle' => { 'x' => 200 },
|
193
|
+
'desc' => { 'x' => 400 }
|
194
|
+
})
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'evaluates extends on each file first' do
|
198
|
+
a = layout_file('multifile-extends-a.yml')
|
199
|
+
b = layout_file('multifile-extends-b.yml')
|
200
|
+
d = Squib::Deck.new(layout: [a, b])
|
201
|
+
expect(d.layout).to eq({
|
202
|
+
'grandparent' => { 'x' => 100 },
|
203
|
+
'parent_a' => { 'x' => 110, 'extends' => 'grandparent' },
|
204
|
+
'parent_b' => { 'x' => 130, 'extends' => 'grandparent' },
|
205
|
+
'child_a' => { 'x' => 113, 'extends' => 'parent_a' },
|
206
|
+
'child_b' => { 'x' => 133, 'extends' => 'parent_b' }
|
207
|
+
})
|
208
|
+
end
|
209
|
+
|
186
210
|
end
|
187
211
|
|
188
212
|
end
|
@@ -13,6 +13,7 @@ describe Squib::Card, '#text' do
|
|
13
13
|
|
14
14
|
it 'make all the expected calls on a smoke test' do
|
15
15
|
mock_squib_logger(@old_logger) do
|
16
|
+
extent = Pango::Rectangle.new(50,60,100,200)
|
16
17
|
expect(Squib.logger).to receive(:debug).once
|
17
18
|
expect(@context).to receive(:save).once
|
18
19
|
expect(@context).to receive(:set_source_color).once
|
@@ -31,7 +32,7 @@ describe Squib::Card, '#text' do
|
|
31
32
|
expect(@layout).to receive(:spacing=).with(1.0 * Pango::SCALE).once
|
32
33
|
expect(@context).to receive(:update_pango_layout).once
|
33
34
|
expect(@layout).to receive(:height).once.and_return(25)
|
34
|
-
expect(@layout).to receive(:extents).
|
35
|
+
expect(@layout).to receive(:extents).thrice.and_return([nil,extent])
|
35
36
|
expect(@context).to receive(:update_pango_layout).once
|
36
37
|
expect(@context).to receive(:show_pango_layout).once
|
37
38
|
expect(@context).to receive(:restore).once
|
@@ -41,10 +42,11 @@ describe Squib::Card, '#text' do
|
|
41
42
|
# x, y, width, height,
|
42
43
|
# markup, justify, wrap, ellipsize,
|
43
44
|
# spacing, align, valign, hint, angle)
|
44
|
-
card.text('foo', 'Sans 12', nil, '#abc',
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
ret = card.text('foo', 'Sans 12', nil, '#abc',
|
46
|
+
10, 15, 20, 25,
|
47
|
+
nil, false, false, false,
|
48
|
+
1.0, :left, :top, nil, 0.0)
|
49
|
+
expect(ret).to eq({width: 0, height: 0})
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'squib'
|
3
|
+
require 'pp'
|
4
|
+
|
5
|
+
describe "Squib samples" do
|
6
|
+
let(:samples_dir) { "#{File.expand_path(File.dirname(__FILE__))}/../../samples/" }
|
7
|
+
|
8
|
+
around(:each) do |example|
|
9
|
+
Dir.chdir(samples_dir) do
|
10
|
+
example.run
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should execute with no errors' do
|
15
|
+
allow(ProgressBar).to receive(:create).and_return(Squib::DoNothing.new)
|
16
|
+
Dir["#{samples_dir}/**/*.rb"].each do |sample|
|
17
|
+
load sample
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# This test could use some explanation
|
22
|
+
# Much of the development of Squib has been sample-driven. Every time I want
|
23
|
+
# new syntax or feature, I write a sample, get it working, and then write
|
24
|
+
# tests for boundary cases in the unit tests.
|
25
|
+
#
|
26
|
+
# This makes documentation much easier and example-driven.
|
27
|
+
# ...but I want to use those samples for regression & integration tests too.
|
28
|
+
#
|
29
|
+
# The above test is a good smoke test, but it just looks for exceptions.
|
30
|
+
# What this set of tests do is run the samples again, but mocking out Cairo,
|
31
|
+
# Pango, RSVG, and any other dependencies. We log those API calls and store
|
32
|
+
# them in a super-verbose string. We compare our runs against what happened
|
33
|
+
# before.
|
34
|
+
#
|
35
|
+
# Thus, if we ever change anything that results in a ANY change to our
|
36
|
+
# regression logs, then these tests will fail. If it's SURPRISING, then we
|
37
|
+
# caught an integration bug. If it's not, just update and overwrite the logs.
|
38
|
+
#
|
39
|
+
# So it's understood that you should have to periodically enable the
|
40
|
+
# overwrite_sample method below to store the new regression log. Just make
|
41
|
+
# sure you inspect the change and make sure it makes sense with the change
|
42
|
+
# you made to the samples or Squib.
|
43
|
+
# FOR NOW!! These two I can't get working on Travis, so I'm disabling
|
44
|
+
# Has to do with UTF-8 encoding of a special characters
|
45
|
+
# layouts.rb
|
46
|
+
# text_options.rb
|
47
|
+
%w( hello_world.rb
|
48
|
+
autoscale_font.rb
|
49
|
+
save_pdf.rb
|
50
|
+
custom_config.rb
|
51
|
+
load_images.rb
|
52
|
+
basic.rb
|
53
|
+
cairo_access.rb
|
54
|
+
draw_shapes.rb
|
55
|
+
colors.rb
|
56
|
+
excel.rb
|
57
|
+
csv_import.rb
|
58
|
+
portrait-landscape.rb
|
59
|
+
tgc_proofs.rb
|
60
|
+
ranges.rb
|
61
|
+
units.rb
|
62
|
+
).each do |sample|
|
63
|
+
it "has not changed for #{sample}" do
|
64
|
+
log = StringIO.new
|
65
|
+
mock_cairo(log)
|
66
|
+
load sample
|
67
|
+
# overwrite_sample(sample, log) # Use TEMPORARILY once happy with the new sample log
|
68
|
+
test_file_str = File.open(sample_regression_file(sample), 'r:UTF-8').read
|
69
|
+
expect(log.string).to eq(test_file_str)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -15,8 +15,70 @@ RSpec.configure do |config|
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
"#{File.expand_path(File.dirname(__FILE__))}/data/#{str}"
|
18
|
+
def layout_file(str)
|
19
|
+
"#{File.expand_path(File.dirname(__FILE__))}/data/layouts/#{str}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def sample_file(file)
|
23
|
+
"#{File.expand_path(File.dirname(__FILE__))}/../samples/#{file}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def sample_regression_file(file)
|
27
|
+
"#{File.expand_path(File.dirname(__FILE__))}/data/samples/#{file}.txt"
|
28
|
+
end
|
29
|
+
|
30
|
+
def csv_file(file)
|
31
|
+
"#{File.expand_path(File.dirname(__FILE__))}/data/csv/#{file}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def overwrite_sample(sample_name, log)
|
35
|
+
# Use this to overwrite the regression with current state
|
36
|
+
File.open(sample_regression_file(sample_name), 'w+:UTF-8') do |f|
|
37
|
+
f.write(log.string)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def scrub_hex(str)
|
42
|
+
str.gsub(/0x\w{1,8}/,'')
|
43
|
+
.gsub(/ptr=\w{1,8}/,'')
|
44
|
+
.gsub(/#<Pango::FontDescription:.*>/,'')
|
45
|
+
.gsub(/#<Cairo::ImageSurface:.*>/,'ImageSurface')
|
46
|
+
.gsub(/#<RSVG::Handle.*>/,'RSVG::Handle')
|
47
|
+
.gsub(/#<RSpec::Mocks::Double:.*>/,'MockDouble')
|
48
|
+
.gsub(/RGB:\w{1,8}/,'RGB:')
|
49
|
+
end
|
50
|
+
|
51
|
+
# Build a mock cairo instance that allows basically any method
|
52
|
+
# and logs that call to the string buffer
|
53
|
+
def mock_cairo(strio)
|
54
|
+
cxt = double(Cairo::Context)
|
55
|
+
surface = double(Cairo::ImageSurface)
|
56
|
+
pango = double(Pango::Layout)
|
57
|
+
allow(ProgressBar).to receive(:create).and_return(Squib::DoNothing.new)
|
58
|
+
allow(Cairo::ImageSurface).to receive(:new).and_return(surface)
|
59
|
+
allow(surface).to receive(:width).and_return(100)
|
60
|
+
allow(Cairo::Context).to receive(:new).and_return(cxt)
|
61
|
+
allow(cxt).to receive(:create_pango_layout).and_return(pango)
|
62
|
+
allow(cxt).to receive(:target).and_return(surface)
|
63
|
+
allow(pango).to receive(:height).and_return(25)
|
64
|
+
allow(pango).to receive(:width).and_return(25)
|
65
|
+
allow(pango).to receive(:extents).and_return([Pango::Rectangle.new(0,0,0,0)]*2)
|
66
|
+
|
67
|
+
%w(save set_source_color paint restore translate rotate move_to
|
68
|
+
update_pango_layout width height show_pango_layout rounded_rectangle
|
69
|
+
set_line_width stroke fill set_source scale render_rsvg_handle circle
|
70
|
+
triangle line_to operator= show_page).each do |m|
|
71
|
+
allow(cxt).to receive(m) { |*args| strio << scrub_hex("cairo: #{m}(#{args})\n") }
|
72
|
+
end
|
73
|
+
|
74
|
+
%w(font_description= text= width= height= wrap= ellipsize= alignment=
|
75
|
+
justify= spacing= markup=).each do |m|
|
76
|
+
allow(pango).to receive(m) {|*args| strio << scrub_hex("pango: #{m}(#{args})\n") }
|
77
|
+
end
|
78
|
+
|
79
|
+
%w(write_to_png).each do |m|
|
80
|
+
allow(surface).to receive(m) { |*args| strio << scrub_hex("surface: #{m}(#{args})\n") }
|
81
|
+
end
|
20
82
|
end
|
21
83
|
|
22
84
|
# Refine Squib to allow setting the logger and progress bar
|
data/squib.gemspec
CHANGED
@@ -20,14 +20,14 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.homepage = 'https://github.com/andymeneely/squib'
|
21
21
|
|
22
22
|
spec.rdoc_options = ['--charset=UTF-8']
|
23
|
-
spec.extra_rdoc_files =
|
23
|
+
spec.extra_rdoc_files = Dir['README.md', 'samples/**/*.rb']
|
24
24
|
|
25
25
|
spec.files = `git ls-files -z`.split("\x0")
|
26
26
|
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
27
27
|
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
28
28
|
spec.require_paths = ['lib']
|
29
29
|
|
30
|
-
spec.add_runtime_dependency 'cairo', '~> 1.
|
30
|
+
spec.add_runtime_dependency 'cairo', '~> 1.14.0'
|
31
31
|
spec.add_runtime_dependency 'pango', '~> 2.2.0'
|
32
32
|
spec.add_runtime_dependency 'roo', '~> 1.13.2'
|
33
33
|
spec.add_runtime_dependency 'rsvg2', '~> 2.2.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: squib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Meneely
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cairo
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.14.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.14.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pango
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -213,7 +213,23 @@ executables:
|
|
213
213
|
extensions: []
|
214
214
|
extra_rdoc_files:
|
215
215
|
- README.md
|
216
|
-
-
|
216
|
+
- samples/autoscale_font.rb
|
217
|
+
- samples/basic.rb
|
218
|
+
- samples/cairo_access.rb
|
219
|
+
- samples/colors.rb
|
220
|
+
- samples/csv_import.rb
|
221
|
+
- samples/custom_config.rb
|
222
|
+
- samples/draw_shapes.rb
|
223
|
+
- samples/excel.rb
|
224
|
+
- samples/hello_world.rb
|
225
|
+
- samples/layouts.rb
|
226
|
+
- samples/load_images.rb
|
227
|
+
- samples/portrait-landscape.rb
|
228
|
+
- samples/ranges.rb
|
229
|
+
- samples/save_pdf.rb
|
230
|
+
- samples/text_options.rb
|
231
|
+
- samples/tgc_proofs.rb
|
232
|
+
- samples/units.rb
|
217
233
|
files:
|
218
234
|
- .gitignore
|
219
235
|
- .travis.yml
|
@@ -244,6 +260,8 @@ files:
|
|
244
260
|
- lib/squib/graphics/shapes.rb
|
245
261
|
- lib/squib/graphics/text.rb
|
246
262
|
- lib/squib/input_helpers.rb
|
263
|
+
- lib/squib/layouts/hand.yml
|
264
|
+
- lib/squib/layouts/playing-card.yml
|
247
265
|
- lib/squib/progress.rb
|
248
266
|
- lib/squib/project_template/.gitignore
|
249
267
|
- lib/squib/project_template/ABOUT.md
|
@@ -260,8 +278,10 @@ files:
|
|
260
278
|
- samples/basic.rb
|
261
279
|
- samples/cairo_access.rb
|
262
280
|
- samples/colors.rb
|
281
|
+
- samples/csv_import.rb
|
263
282
|
- samples/custom-config.yml
|
264
283
|
- samples/custom-layout.yml
|
284
|
+
- samples/custom-layout2.yml
|
265
285
|
- samples/custom_config.rb
|
266
286
|
- samples/customconfig-imgdir/shiny-purse2.png
|
267
287
|
- samples/customconfig-imgdir/spanner2.svg
|
@@ -269,11 +289,13 @@ files:
|
|
269
289
|
- samples/excel.rb
|
270
290
|
- samples/grit.png
|
271
291
|
- samples/hello_world.rb
|
292
|
+
- samples/layouts.rb
|
272
293
|
- samples/load_images.rb
|
273
294
|
- samples/offset.svg
|
274
295
|
- samples/pokercard.png
|
275
296
|
- samples/portrait-landscape.rb
|
276
297
|
- samples/ranges.rb
|
298
|
+
- samples/sample.csv
|
277
299
|
- samples/sample.xlsx
|
278
300
|
- samples/save_pdf.rb
|
279
301
|
- samples/shiny-purse.png
|
@@ -281,25 +303,50 @@ files:
|
|
281
303
|
- samples/text_options.rb
|
282
304
|
- samples/tgc_proofs.rb
|
283
305
|
- samples/units.rb
|
284
|
-
-
|
306
|
+
- spec/api/api_data_spec.rb
|
307
|
+
- spec/api/api_image_spec.rb
|
285
308
|
- spec/api/api_text_spec.rb
|
286
309
|
- spec/commands/new_spec.rb
|
287
|
-
- spec/data/
|
288
|
-
- spec/data/
|
289
|
-
- spec/data/
|
290
|
-
- spec/data/
|
291
|
-
- spec/data/
|
292
|
-
- spec/data/
|
293
|
-
- spec/data/
|
294
|
-
- spec/data/
|
295
|
-
- spec/data/
|
310
|
+
- spec/data/csv/basic.csv
|
311
|
+
- spec/data/csv/dup_cols.csv
|
312
|
+
- spec/data/csv/with_spaces.csv
|
313
|
+
- spec/data/layouts/easy-circular-extends.yml
|
314
|
+
- spec/data/layouts/hard-circular-extends.yml
|
315
|
+
- spec/data/layouts/multi-extends-single-entry.yml
|
316
|
+
- spec/data/layouts/multi-level-extends.yml
|
317
|
+
- spec/data/layouts/multifile-a.yml
|
318
|
+
- spec/data/layouts/multifile-b.yml
|
319
|
+
- spec/data/layouts/multifile-extends-a.yml
|
320
|
+
- spec/data/layouts/multifile-extends-b.yml
|
321
|
+
- spec/data/layouts/no-extends.yml
|
322
|
+
- spec/data/layouts/pre-extends.yml
|
323
|
+
- spec/data/layouts/self-circular-extends.yml
|
324
|
+
- spec/data/layouts/single-extends.yml
|
325
|
+
- spec/data/layouts/single-level-multi-extends.yml
|
326
|
+
- spec/data/samples/autoscale_font.rb.txt
|
327
|
+
- spec/data/samples/basic.rb.txt
|
328
|
+
- spec/data/samples/cairo_access.rb.txt
|
329
|
+
- spec/data/samples/colors.rb.txt
|
330
|
+
- spec/data/samples/csv_import.rb.txt
|
331
|
+
- spec/data/samples/custom_config.rb.txt
|
332
|
+
- spec/data/samples/draw_shapes.rb.txt
|
333
|
+
- spec/data/samples/excel.rb.txt
|
334
|
+
- spec/data/samples/hello_world.rb.txt
|
335
|
+
- spec/data/samples/layouts.rb.txt
|
336
|
+
- spec/data/samples/load_images.rb.txt
|
337
|
+
- spec/data/samples/portrait-landscape.rb.txt
|
338
|
+
- spec/data/samples/ranges.rb.txt
|
339
|
+
- spec/data/samples/save_pdf.rb.txt
|
340
|
+
- spec/data/samples/text_options.rb.txt
|
341
|
+
- spec/data/samples/tgc_proofs.rb.txt
|
342
|
+
- spec/data/samples/units.rb.txt
|
296
343
|
- spec/deck_spec.rb
|
297
344
|
- spec/graphics/graphics_images_spec.rb
|
298
345
|
- spec/graphics/graphics_save_doc_spec.rb
|
299
346
|
- spec/graphics/graphics_shapes_spec.rb
|
300
347
|
- spec/graphics/graphics_text_spec.rb
|
301
348
|
- spec/input_helpers_spec.rb
|
302
|
-
- spec/
|
349
|
+
- spec/samples/samples_regression_spec.rb
|
303
350
|
- spec/spec_helper.rb
|
304
351
|
- squib.gemspec
|
305
352
|
homepage: https://github.com/andymeneely/squib
|
@@ -323,28 +370,54 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
323
370
|
version: '0'
|
324
371
|
requirements: []
|
325
372
|
rubyforge_project:
|
326
|
-
rubygems_version: 2.
|
373
|
+
rubygems_version: 2.4.5
|
327
374
|
signing_key:
|
328
375
|
specification_version: 2
|
329
376
|
summary: A Ruby DSL for prototyping card games
|
330
377
|
test_files:
|
378
|
+
- spec/api/api_data_spec.rb
|
379
|
+
- spec/api/api_image_spec.rb
|
331
380
|
- spec/api/api_text_spec.rb
|
332
381
|
- spec/commands/new_spec.rb
|
333
|
-
- spec/data/
|
334
|
-
- spec/data/
|
335
|
-
- spec/data/
|
336
|
-
- spec/data/
|
337
|
-
- spec/data/
|
338
|
-
- spec/data/
|
339
|
-
- spec/data/
|
340
|
-
- spec/data/
|
341
|
-
- spec/data/
|
382
|
+
- spec/data/csv/basic.csv
|
383
|
+
- spec/data/csv/dup_cols.csv
|
384
|
+
- spec/data/csv/with_spaces.csv
|
385
|
+
- spec/data/layouts/easy-circular-extends.yml
|
386
|
+
- spec/data/layouts/hard-circular-extends.yml
|
387
|
+
- spec/data/layouts/multi-extends-single-entry.yml
|
388
|
+
- spec/data/layouts/multi-level-extends.yml
|
389
|
+
- spec/data/layouts/multifile-a.yml
|
390
|
+
- spec/data/layouts/multifile-b.yml
|
391
|
+
- spec/data/layouts/multifile-extends-a.yml
|
392
|
+
- spec/data/layouts/multifile-extends-b.yml
|
393
|
+
- spec/data/layouts/no-extends.yml
|
394
|
+
- spec/data/layouts/pre-extends.yml
|
395
|
+
- spec/data/layouts/self-circular-extends.yml
|
396
|
+
- spec/data/layouts/single-extends.yml
|
397
|
+
- spec/data/layouts/single-level-multi-extends.yml
|
398
|
+
- spec/data/samples/autoscale_font.rb.txt
|
399
|
+
- spec/data/samples/basic.rb.txt
|
400
|
+
- spec/data/samples/cairo_access.rb.txt
|
401
|
+
- spec/data/samples/colors.rb.txt
|
402
|
+
- spec/data/samples/csv_import.rb.txt
|
403
|
+
- spec/data/samples/custom_config.rb.txt
|
404
|
+
- spec/data/samples/draw_shapes.rb.txt
|
405
|
+
- spec/data/samples/excel.rb.txt
|
406
|
+
- spec/data/samples/hello_world.rb.txt
|
407
|
+
- spec/data/samples/layouts.rb.txt
|
408
|
+
- spec/data/samples/load_images.rb.txt
|
409
|
+
- spec/data/samples/portrait-landscape.rb.txt
|
410
|
+
- spec/data/samples/ranges.rb.txt
|
411
|
+
- spec/data/samples/save_pdf.rb.txt
|
412
|
+
- spec/data/samples/text_options.rb.txt
|
413
|
+
- spec/data/samples/tgc_proofs.rb.txt
|
414
|
+
- spec/data/samples/units.rb.txt
|
342
415
|
- spec/deck_spec.rb
|
343
416
|
- spec/graphics/graphics_images_spec.rb
|
344
417
|
- spec/graphics/graphics_save_doc_spec.rb
|
345
418
|
- spec/graphics/graphics_shapes_spec.rb
|
346
419
|
- spec/graphics/graphics_text_spec.rb
|
347
420
|
- spec/input_helpers_spec.rb
|
348
|
-
- spec/
|
421
|
+
- spec/samples/samples_regression_spec.rb
|
349
422
|
- spec/spec_helper.rb
|
350
423
|
has_rdoc:
|