squib 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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:
|