squib 0.8.0 → 0.9.0

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.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +14 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.md +201 -175
  5. data/Gemfile +2 -4
  6. data/README.md +650 -645
  7. data/RELEASE TODO.md +18 -18
  8. data/Rakefile +106 -99
  9. data/appveyor.yml +29 -0
  10. data/lib/squib.rb +32 -32
  11. data/lib/squib/api/background.rb +20 -20
  12. data/lib/squib/api/data.rb +131 -131
  13. data/lib/squib/api/image.rb +108 -90
  14. data/lib/squib/api/save.rb +151 -149
  15. data/lib/squib/api/settings.rb +35 -35
  16. data/lib/squib/api/shapes.rb +255 -230
  17. data/lib/squib/api/text.rb +65 -65
  18. data/lib/squib/api/text_embed.rb +96 -96
  19. data/lib/squib/args/arg_loader.rb +138 -138
  20. data/lib/squib/args/box.rb +54 -54
  21. data/lib/squib/args/card_range.rb +32 -32
  22. data/lib/squib/args/color_validator.rb +11 -11
  23. data/lib/squib/args/coords.rb +32 -32
  24. data/lib/squib/args/dir_validator.rb +16 -16
  25. data/lib/squib/args/draw.rb +92 -92
  26. data/lib/squib/args/embed_adjust.rb +25 -25
  27. data/lib/squib/args/embed_key.rb +17 -17
  28. data/lib/squib/args/hand_special.rb +37 -37
  29. data/lib/squib/args/import.rb +39 -39
  30. data/lib/squib/args/input_file.rb +37 -37
  31. data/lib/squib/args/paint.rb +43 -43
  32. data/lib/squib/args/paragraph.rb +116 -115
  33. data/lib/squib/args/save_batch.rb +63 -60
  34. data/lib/squib/args/scale_box.rb +53 -53
  35. data/lib/squib/args/sheet.rb +72 -72
  36. data/lib/squib/args/showcase_special.rb +38 -38
  37. data/lib/squib/args/svg_special.rb +37 -37
  38. data/lib/squib/args/transform.rb +60 -24
  39. data/lib/squib/args/typographer.rb +117 -117
  40. data/lib/squib/card.rb +66 -67
  41. data/lib/squib/conf.rb +131 -117
  42. data/lib/squib/constants.rb +12 -178
  43. data/lib/squib/deck.rb +113 -113
  44. data/lib/squib/graphics/cairo_context_wrapper.rb +113 -99
  45. data/lib/squib/graphics/gradient_regex.rb +46 -46
  46. data/lib/squib/graphics/hand.rb +42 -42
  47. data/lib/squib/graphics/image.rb +103 -76
  48. data/lib/squib/graphics/save_doc.rb +103 -103
  49. data/lib/squib/graphics/save_images.rb +39 -33
  50. data/lib/squib/graphics/shapes.rb +135 -119
  51. data/lib/squib/graphics/showcase.rb +85 -85
  52. data/lib/squib/graphics/text.rb +176 -176
  53. data/lib/squib/layout_parser.rb +91 -91
  54. data/lib/squib/layouts/economy.yml +85 -85
  55. data/lib/squib/layouts/fantasy.yml +101 -101
  56. data/lib/squib/layouts/hand.yml +62 -62
  57. data/lib/squib/layouts/playing-card.yml +35 -35
  58. data/lib/squib/layouts/tuck_box.yml +45 -45
  59. data/lib/squib/project_template/IDEAS.md +22 -0
  60. data/lib/squib/project_template/PLAYTESTING.md +26 -0
  61. data/lib/squib/project_template/RULES.md +21 -0
  62. data/lib/squib/project_template/config.yml +49 -45
  63. data/lib/squib/sample_helpers.rb +34 -0
  64. data/lib/squib/version.rb +10 -10
  65. data/samples/autoscale_font/_autoscale_font.rb +29 -0
  66. data/samples/color_shortcuts.rb +6 -6
  67. data/samples/csv_import.rb +26 -26
  68. data/samples/custom-config.yml +5 -5
  69. data/samples/custom_config.rb +18 -18
  70. data/samples/draw_shapes.rb +48 -45
  71. data/samples/embed_text.rb +88 -88
  72. data/samples/excel.rb +55 -55
  73. data/samples/hand.rb +24 -24
  74. data/samples/images/_images.rb +104 -0
  75. data/samples/intro/01_hello.rb +9 -0
  76. data/samples/intro/02_options.rb +15 -0
  77. data/samples/intro/03_layout.rb +12 -0
  78. data/samples/intro/04_arrays.rb +16 -0
  79. data/samples/intro/05_excel.rb +15 -0
  80. data/samples/layouts.rb +62 -62
  81. data/samples/layouts_builtin.rb +51 -51
  82. data/samples/load_images.rb +99 -78
  83. data/samples/load_images_config.yml +1 -0
  84. data/samples/quantity_explosion.csv +2 -2
  85. data/samples/ranges.rb +64 -64
  86. data/samples/sample.csv +2 -2
  87. data/samples/saves.rb +9 -1
  88. data/samples/sprites.png +0 -0
  89. data/samples/text/_text.rb +46 -0
  90. data/samples/text_options.rb +102 -102
  91. data/spec/api/api_data_spec.rb +117 -117
  92. data/spec/api/api_settings_spec.rb +37 -37
  93. data/spec/args/box_spec.rb +127 -127
  94. data/spec/args/draw_spec.rb +101 -95
  95. data/spec/args/embed_key_spec.rb +13 -13
  96. data/spec/args/input_file_spec.rb +21 -21
  97. data/spec/args/paint_spec.rb +21 -21
  98. data/spec/args/paragraph_spec.rb +152 -152
  99. data/spec/args/range_spec.rb +40 -40
  100. data/spec/args/save_batch_spec.rb +51 -51
  101. data/spec/args/scale_box_spec.rb +71 -71
  102. data/spec/args/sheet_spec.rb +58 -58
  103. data/spec/args/showcase_special_spec.rb +15 -15
  104. data/spec/args/transform_spec.rb +25 -0
  105. data/spec/card_spec.rb +11 -0
  106. data/spec/conf_spec.rb +13 -3
  107. data/spec/data/conf/unrecognized.yml +4 -0
  108. data/spec/data/csv/qty.csv +2 -2
  109. data/spec/data/csv/qty_named.csv +2 -2
  110. data/spec/data/csv/with_spaces.csv +2 -2
  111. data/spec/data/samples/autoscale_font.rb.txt +84 -84
  112. data/spec/data/samples/basic.rb.txt +227 -209
  113. data/spec/data/samples/config_text_markup.rb.txt +72 -72
  114. data/spec/data/samples/csv_import.rb.txt +213 -213
  115. data/spec/data/samples/custom_config.rb.txt +57 -48
  116. data/spec/data/samples/draw_shapes.rb.txt +555 -3
  117. data/spec/data/samples/embed_text.rb.txt +283 -283
  118. data/spec/data/samples/excel.rb.txt +661 -661
  119. data/spec/data/samples/gradients.rb.txt +77 -79
  120. data/spec/data/samples/hand.rb.txt +538 -538
  121. data/spec/data/samples/hello_world.rb.txt +36 -36
  122. data/spec/data/samples/load_images.rb.txt +170 -0
  123. data/spec/data/samples/portrait-landscape.rb.txt +51 -49
  124. data/spec/data/samples/ranges.rb.txt +472 -460
  125. data/spec/data/samples/saves.rb.txt +810 -801
  126. data/spec/data/samples/showcase.rb.txt +5926 -5910
  127. data/spec/data/samples/text_options.rb.txt +1125 -1125
  128. data/spec/data/samples/tgc_proofs.rb.txt +95 -81
  129. data/spec/graphics/cairo_context_wrapper_spec.rb +104 -84
  130. data/spec/graphics/graphics_save_doc_spec.rb +67 -67
  131. data/spec/samples/diff-with-css.example.html +39 -0
  132. data/spec/samples/expected/load_images_00.png +0 -0
  133. data/spec/samples/expected/shape_00.png +0 -0
  134. data/spec/samples/run_samples_spec.rb +17 -0
  135. data/spec/samples/samples_regression_spec.rb +72 -82
  136. data/spec/spec_helper.rb +9 -1
  137. data/squib.gemspec +49 -48
  138. data/squib.sublime-project +42 -42
  139. metadata +94 -48
  140. data/spec/graphics/graphics_images_spec.rb +0 -94
@@ -1,81 +1,95 @@
1
- cairo: antialias=(["subpixel"])
2
- cairo: save([])
3
- cairo: set_source_color(["white"])
4
- cairo: paint([])
5
- cairo: restore([])
6
- cairo: save([])
7
- cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
8
- cairo: set_source_color(["#0000"])
9
- cairo: fill_preserve([])
10
- cairo: set_source_color(["black"])
11
- cairo: set_line_width([2.0])
12
- cairo: set_line_join([0])
13
- cairo: set_line_cap([0])
14
- cairo: set_dash([[]])
15
- cairo: stroke([])
16
- cairo: restore([])
17
- cairo: save([])
18
- cairo: rounded_rectangle([75, 75, 128, 128, 25, 25])
19
- cairo: set_source_color(["#0000"])
20
- cairo: fill_preserve([])
21
- cairo: set_source_color(["black"])
22
- cairo: set_line_width([2.0])
23
- cairo: set_line_join([0])
24
- cairo: set_line_cap([0])
25
- cairo: set_dash([[]])
26
- cairo: stroke([])
27
- cairo: restore([])
28
- cairo: save([])
29
- cairo: set_source_color(["black"])
30
- cairo: translate([220, 78])
31
- cairo: rotate([0])
32
- cairo: move_to([0, 0])
33
- pango: font_description=([MockDouble])
34
- pango: text=(["Mastermind"])
35
- pango: wrap=([#<Pango::Layout::WrapMode word-char>])
36
- pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
37
- pango: alignment=([#<Pango::Layout::Alignment left>])
38
- pango: justify=([false])
39
- cairo: move_to([0, 0])
40
- cairo: move_to([0, 0])
41
- cairo: show_pango_layout([MockDouble])
42
- pango: ellipsized?([])
43
- cairo: restore([])
44
- cairo: save([])
45
- cairo: set_source_color(["black"])
46
- cairo: translate([75, 85])
47
- cairo: rotate([0])
48
- cairo: move_to([0, 0])
49
- pango: font_description=([MockDouble])
50
- pango: text=(["3"])
51
- pango: width=([131072])
52
- pango: wrap=([#<Pango::Layout::WrapMode word-char>])
53
- pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
54
- pango: alignment=([#<Pango::Layout::Alignment center>])
55
- pango: justify=([false])
56
- cairo: move_to([0, 0])
57
- cairo: move_to([0, 0])
58
- cairo: show_pango_layout([MockDouble])
59
- pango: ellipsized?([])
60
- cairo: restore([])
61
- cairo: save([])
62
- cairo: translate([620, 75])
63
- cairo: rotate([0])
64
- cairo: translate([-620, -75])
65
- cairo: set_source([ImageSurface, 620, 75])
66
- cairo: paint([1.0])
67
- cairo: restore([])
68
- cairo: save([])
69
- cairo: translate([620, 218])
70
- cairo: rotate([0])
71
- cairo: scale([1.0, 1.0])
72
- cairo: render_rsvg_handle([RSVG::Handle, nil])
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_00.png"])
1
+ cairo: antialias=(["subpixel"])
2
+ cairo: save([])
3
+ cairo: set_source_color(["white"])
4
+ cairo: paint([])
5
+ cairo: restore([])
6
+ cairo: save([])
7
+ cairo: rounded_rectangle([38, 38, 750, 1050, 38, 38])
8
+ cairo: set_source_color(["#0000"])
9
+ cairo: fill_preserve([])
10
+ cairo: set_source_color(["black"])
11
+ cairo: set_line_width([2.0])
12
+ cairo: set_line_join([0])
13
+ cairo: set_line_cap([0])
14
+ cairo: set_dash([[]])
15
+ cairo: stroke([])
16
+ cairo: restore([])
17
+ cairo: save([])
18
+ cairo: rounded_rectangle([75, 75, 128, 128, 25, 25])
19
+ cairo: set_source_color(["#0000"])
20
+ cairo: fill_preserve([])
21
+ cairo: set_source_color(["black"])
22
+ cairo: set_line_width([2.0])
23
+ cairo: set_line_join([0])
24
+ cairo: set_line_cap([0])
25
+ cairo: set_dash([[]])
26
+ cairo: stroke([])
27
+ cairo: restore([])
28
+ cairo: save([])
29
+ cairo: set_source_color(["black"])
30
+ cairo: translate([220, 78])
31
+ cairo: rotate([0])
32
+ cairo: move_to([0, 0])
33
+ pango: font_description=([MockDouble])
34
+ pango: text=(["Mastermind"])
35
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
36
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
37
+ pango: alignment=([#<Pango::Layout::Alignment left>])
38
+ pango: justify=([false])
39
+ cairo: move_to([0, 0])
40
+ cairo: move_to([0, 0])
41
+ cairo: show_pango_layout([MockDouble])
42
+ pango: ellipsized?([])
43
+ cairo: restore([])
44
+ cairo: save([])
45
+ cairo: set_source_color(["black"])
46
+ cairo: translate([75, 85])
47
+ cairo: rotate([0])
48
+ cairo: move_to([0, 0])
49
+ pango: font_description=([MockDouble])
50
+ pango: text=(["3"])
51
+ pango: width=([131072])
52
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
53
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
54
+ pango: alignment=([#<Pango::Layout::Alignment center>])
55
+ pango: justify=([false])
56
+ cairo: move_to([0, 0])
57
+ cairo: move_to([0, 0])
58
+ cairo: show_pango_layout([MockDouble])
59
+ pango: ellipsized?([])
60
+ cairo: restore([])
61
+ cairo: save([])
62
+ cairo: translate([620, 75])
63
+ cairo: scale([1.0, 1.0])
64
+ cairo: rotate([0])
65
+ cairo: transform([Matrix])
66
+ cairo: translate([-620, -75])
67
+ cairo: rounded_rectangle([620, 75, 128.0, 128.0, 0, 0])
68
+ cairo: clip([])
69
+ cairo: translate([0, 0])
70
+ cairo: set_source([ImageSurface, 620, 75])
71
+ cairo: paint([1.0])
72
+ cairo: restore([])
73
+ cairo: save([])
74
+ cairo: translate([620, 218])
75
+ cairo: transform([Matrix])
76
+ cairo: rotate([0])
77
+ cairo: scale([1.0, 1.0])
78
+ cairo: rounded_rectangle([0, 0, 128.0, 128.0, 0, 0])
79
+ cairo: clip([])
80
+ cairo: translate([0, 0])
81
+ cairo: render_rsvg_handle([RSVG::Handle, nil])
82
+ cairo: restore([])
83
+ cairo: save([])
84
+ cairo: translate([0, 0])
85
+ cairo: scale([1.0, 1.0])
86
+ cairo: rotate([0])
87
+ cairo: transform([Matrix])
88
+ cairo: translate([0, 0])
89
+ cairo: rounded_rectangle([0, 0, 825.0, 1125.0, 0, 0])
90
+ cairo: clip([])
91
+ cairo: translate([0, 0])
92
+ cairo: set_source([ImageSurface, 0, 0])
93
+ cairo: paint([0.5])
94
+ cairo: restore([])
95
+ surface: write_to_png(["_output/tgc_sample_00.png"])
@@ -1,84 +1,104 @@
1
- require 'spec_helper'
2
- require 'squib/graphics/cairo_context_wrapper'
3
-
4
- describe Squib::Graphics::CairoContextWrapper do
5
-
6
- let(:cairo) { double(Cairo::Context) }
7
- subject { Squib::Graphics::CairoContextWrapper.new(cairo) }
8
-
9
- context '#set_source_squibcolor' do
10
-
11
- it 'passes on colors as normal' do
12
- expect(cairo).to receive(:set_source_color).with('blue')
13
- subject.set_source_squibcolor('blue')
14
- end
15
-
16
- it 'passes on color symbols as normal' do
17
- expect(cairo).to receive(:set_source_color).with(:blue)
18
- subject.set_source_squibcolor(:blue)
19
- end
20
-
21
- it 'passes on color hashes' do
22
- expect(cairo).to receive(:set_source_color)
23
- .with('#aabbccdd')
24
- subject.set_source_squibcolor('#aabbccdd')
25
- end
26
-
27
- it 'raises on nil' do
28
- expect { subject.set_source_squibcolor(nil) }.to raise_error('nil is not a valid color')
29
- end
30
-
31
- end
32
-
33
-
34
- context 'regex variations for linear gradients' do
35
- before(:each) do
36
- dbl = double(Cairo::LinearPattern)
37
- expect(Cairo::LinearPattern).to receive(:new).with(1,2,3,4).and_return(dbl)
38
- expect(dbl).to receive(:add_color_stop).with(0.0, 'blue')
39
- expect(dbl).to receive(:add_color_stop).with(1.0, 'red')
40
- expect(cairo).to receive(:set_source).with(dbl)
41
- end
42
-
43
- it('handles no decimals' ) { subject.set_source_squibcolor('(1,2) (3,4) blue@0 red@1') }
44
- it('handles decimals' ) { subject.set_source_squibcolor('(1.0,2.0) (3.0,4.0) blue@0 red@1') }
45
- it('handles no whitespace') { subject.set_source_squibcolor('(1,2)(3,4)blue@0red@1') }
46
- it('handles whitespace' ) { subject.set_source_squibcolor(' ( 1 , 2 ) ( 3 , 4 ) blue@0 red@1 ') }
47
- end
48
-
49
- context 'regex variations for radial gradients' do
50
- before(:each) do
51
- dbl = double(Cairo::RadialPattern)
52
- expect(Cairo::RadialPattern).to receive(:new).with(1,2,5,3,4,6).and_return(dbl)
53
- expect(dbl).to receive(:add_color_stop).with(0.0, 'blue')
54
- expect(dbl).to receive(:add_color_stop).with(1.0, 'red')
55
- expect(cairo).to receive(:set_source).with(dbl)
56
- end
57
-
58
- it('handles no decimals' ) { subject.set_source_squibcolor('(1,2,5) (3,4,6) blue@0 red@1') }
59
- it('handles decimals' ) { subject.set_source_squibcolor('(1.0,2.0,5.0) (3.0,4.0,6.0) blue@0 red@1') }
60
- it('handles no whitespace') { subject.set_source_squibcolor('(1,2,5)(3,4,6)blue@0red@1') }
61
- it('handles whitespace' ) { subject.set_source_squibcolor(' ( 1 , 2 , 5 ) ( 3 , 4 , 6 ) blue@0 red@1 ') }
62
- end
63
-
64
- context 'regex handles hash notation' do
65
- it 'on radial patterns' do
66
- dbl = double(Cairo::RadialPattern)
67
- expect(Cairo::RadialPattern).to receive(:new).with(1,2,5,3,4,6).and_return(dbl)
68
- expect(dbl).to receive(:add_color_stop).with(0.0, '#def')
69
- expect(dbl).to receive(:add_color_stop).with(1.0, '#112233')
70
- expect(cairo).to receive(:set_source).with(dbl)
71
- subject.set_source_squibcolor('(1,2,5) (3,4,6) #def@0 #112233@1')
72
- end
73
-
74
- it 'on linear patterns' do
75
- dbl = double(Cairo::LinearPattern)
76
- expect(Cairo::LinearPattern).to receive(:new).with(1,2,3,4).and_return(dbl)
77
- expect(dbl).to receive(:add_color_stop).with(0.0, '#def')
78
- expect(dbl).to receive(:add_color_stop).with(1.0, '#112233')
79
- expect(cairo).to receive(:set_source).with(dbl)
80
- subject.set_source_squibcolor('(1,2) (3,4) #def@0 #112233@1')
81
- end
82
- end
83
-
84
- end
1
+ require 'spec_helper'
2
+ require 'squib/graphics/cairo_context_wrapper'
3
+
4
+ describe Squib::Graphics::CairoContextWrapper do
5
+
6
+ let(:cairo) { double(Cairo::Context) }
7
+ subject { Squib::Graphics::CairoContextWrapper.new(cairo) }
8
+
9
+ context '#set_source_squibcolor' do
10
+
11
+ it 'passes on colors as normal' do
12
+ expect(cairo).to receive(:set_source_color).with('blue')
13
+ subject.set_source_squibcolor('blue')
14
+ end
15
+
16
+ it 'passes on color symbols as normal' do
17
+ expect(cairo).to receive(:set_source_color).with(:blue)
18
+ subject.set_source_squibcolor(:blue)
19
+ end
20
+
21
+ it 'passes on color hashes' do
22
+ expect(cairo).to receive(:set_source_color)
23
+ .with('#aabbccdd')
24
+ subject.set_source_squibcolor('#aabbccdd')
25
+ end
26
+
27
+ it 'raises on nil' do
28
+ expect { subject.set_source_squibcolor(nil) }.to raise_error('nil is not a valid color')
29
+ end
30
+
31
+ context 'regex variations for linear gradients' do
32
+ before(:each) do
33
+ dbl = double(Cairo::LinearPattern)
34
+ mtx = double(Cairo::Matrix)
35
+ expect(Cairo::LinearPattern).to receive(:new).with(1,2,3,4).and_return(dbl)
36
+ expect(dbl).to receive(:add_color_stop).with(0.0, 'blue')
37
+ expect(dbl).to receive(:add_color_stop).with(1.0, 'red')
38
+ expect(cairo).to receive(:matrix).and_return(mtx)
39
+ expect(dbl).to receive(:matrix=).with(mtx)
40
+ expect(cairo).to receive(:set_source).with(dbl)
41
+ end
42
+
43
+ it('handles no decimals' ) { subject.set_source_squibcolor('(1,2) (3,4) blue@0 red@1') }
44
+ it('handles decimals' ) { subject.set_source_squibcolor('(1.0,2.0) (3.0,4.0) blue@0 red@1') }
45
+ it('handles no whitespace') { subject.set_source_squibcolor('(1,2)(3,4)blue@0red@1') }
46
+ it('handles whitespace' ) { subject.set_source_squibcolor(' ( 1 , 2 ) ( 3 , 4 ) blue@0 red@1 ') }
47
+ end
48
+
49
+ context 'regex variations for radial gradients' do
50
+ before(:each) do
51
+ dbl = double(Cairo::RadialPattern)
52
+ mtx = double(Cairo::Matrix)
53
+ expect(Cairo::RadialPattern).to receive(:new).with(1,2,5,3,4,6).and_return(dbl)
54
+ expect(dbl).to receive(:add_color_stop).with(0.0, 'blue')
55
+ expect(dbl).to receive(:add_color_stop).with(1.0, 'red')
56
+ expect(cairo).to receive(:matrix).and_return(mtx)
57
+ expect(dbl).to receive(:matrix=).with(mtx)
58
+ expect(cairo).to receive(:set_source).with(dbl)
59
+ end
60
+
61
+ it('handles no decimals' ) { subject.set_source_squibcolor('(1,2,5) (3,4,6) blue@0 red@1') }
62
+ it('handles decimals' ) { subject.set_source_squibcolor('(1.0,2.0,5.0) (3.0,4.0,6.0) blue@0 red@1') }
63
+ it('handles no whitespace') { subject.set_source_squibcolor('(1,2,5)(3,4,6)blue@0red@1') }
64
+ it('handles whitespace' ) { subject.set_source_squibcolor(' ( 1 , 2 , 5 ) ( 3 , 4 , 6 ) blue@0 red@1 ') }
65
+ end
66
+
67
+ context 'regex handles hash notation' do
68
+ it 'on radial patterns' do
69
+ dbl = double(Cairo::RadialPattern)
70
+ mtx = double(Cairo::Matrix)
71
+ expect(Cairo::RadialPattern).to receive(:new).with(1,2,5,3,4,6).and_return(dbl)
72
+ expect(dbl).to receive(:add_color_stop).with(0.0, '#def')
73
+ expect(dbl).to receive(:add_color_stop).with(1.0, '#112233')
74
+ expect(cairo).to receive(:matrix).and_return(mtx)
75
+ expect(dbl).to receive(:matrix=).with(mtx)
76
+ expect(cairo).to receive(:set_source).with(dbl)
77
+ subject.set_source_squibcolor('(1,2,5) (3,4,6) #def@0 #112233@1')
78
+ end
79
+
80
+ it 'on linear patterns' do
81
+ dbl = double(Cairo::LinearPattern)
82
+ mtx = double(Cairo::Matrix)
83
+ expect(Cairo::LinearPattern).to receive(:new).with(1,2,3,4).and_return(dbl)
84
+ expect(dbl).to receive(:add_color_stop).with(0.0, '#def')
85
+ expect(dbl).to receive(:add_color_stop).with(1.0, '#112233')
86
+ expect(cairo).to receive(:matrix).and_return(mtx)
87
+ expect(dbl).to receive(:matrix=).with(mtx)
88
+ expect(cairo).to receive(:set_source).with(dbl)
89
+ subject.set_source_squibcolor('(1,2) (3,4) #def@0 #112233@1')
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ context '#flip' do
96
+ it 'in the basic case' do
97
+ dbl = double(Cairo::Matrix)
98
+ expect(Cairo::Matrix).to receive(:new).with(-1.0, 0.0, 0.0, -1.0, 6.0, 8.0).and_return(dbl)
99
+ expect(cairo).to receive(:transform).with(dbl)
100
+ subject.flip(true, true, 3.0, 4.0)
101
+ end
102
+ end
103
+
104
+ end
@@ -1,67 +1,67 @@
1
- require 'spec_helper'
2
- require 'squib'
3
-
4
- describe Squib::Deck, '#save_pdf' do
5
-
6
- context 'typical inputs' do
7
- let(:cxt) { double(Cairo::Context) }
8
-
9
- def expect_card_place(x, y)
10
- expect(cxt).to receive(:translate).with(x, y).once
11
- expect(cxt).to receive(:rectangle).once
12
- expect(cxt).to receive(:clip).once
13
- expect(cxt).to receive(:set_source) # place the card
14
- .with(instance_of(Cairo::ImageSurface), 0, 0).once
15
- expect(cxt).to receive(:paint).once # paint placed card
16
- expect(cxt).to receive(:translate).with(-x,-y).once
17
- expect(cxt).to receive(:reset_clip).once
18
- end
19
-
20
- before(:each) do
21
- allow(Cairo::PDFSurface).to receive(:new).and_return(nil) #don't create the file
22
- allow(Cairo::Context).to receive(:new).and_return(cxt)
23
- allow(cxt).to receive(:antialias=)
24
- end
25
-
26
- it 'make all the expected calls on a smoke test' do
27
- num_cards = 9
28
- deck = Squib::Deck.new(cards: 9, width: 825, height: 1125)
29
- expect(Squib.logger).to receive(:debug).at_least(:once)
30
- expect(Squib.logger).to receive(:warn).exactly(:once) #warn about making the dir
31
- expect(Dir).to receive(:mkdir) {} # don't actually make the dir
32
- expect(cxt).to receive(:scale).with(0.24, 0.24)
33
-
34
- expect_card_place(75, 75)
35
- expect_card_place(831, 75)
36
- expect_card_place(1587, 75)
37
- expect_card_place(2343, 75)
38
- expect_card_place(75, 1131)
39
- expect_card_place(831, 1131)
40
- expect_card_place(1587, 1131)
41
- expect_card_place(2343, 1131)
42
- expect(cxt).to receive(:show_page).once
43
- expect_card_place(75, 75)
44
-
45
- args = { file: 'foo.pdf', dir: '_out', margin: 75, gap: 5, trim: 37 }
46
- deck.save_pdf(args)
47
- end
48
-
49
- it 'only does the three cards on a limited range' do
50
- num_cards = 9
51
- args = { range: 2..4, file: 'foo.pdf', dir: '_out', margin: 75, gap: 5, trim: 37 }
52
- deck = Squib::Deck.new(cards: num_cards, width: 825, height: 1125)
53
- expect(Squib.logger).to receive(:debug).at_least(:once)
54
- expect(Squib.logger).to receive(:warn).exactly(:once) #warn about making the dir
55
- expect(Dir).to receive(:mkdir) {} # don't actually make the dir
56
- expect(cxt).to receive(:scale).with(0.24, 0.24)
57
-
58
- expect_card_place(75, 75)
59
- expect_card_place(831, 75)
60
- expect_card_place(1587, 75)
61
-
62
- deck.save_pdf(args)
63
- end
64
-
65
- end
66
-
67
- end
1
+ require 'spec_helper'
2
+ require 'squib'
3
+
4
+ describe Squib::Deck, '#save_pdf' do
5
+
6
+ context 'typical inputs' do
7
+ let(:cxt) { double(Cairo::Context) }
8
+
9
+ def expect_card_place(x, y)
10
+ expect(cxt).to receive(:translate).with(x, y).once
11
+ expect(cxt).to receive(:rectangle).once
12
+ expect(cxt).to receive(:clip).once
13
+ expect(cxt).to receive(:set_source) # place the card
14
+ .with(instance_of(Cairo::ImageSurface), 0, 0).once
15
+ expect(cxt).to receive(:paint).once # paint placed card
16
+ expect(cxt).to receive(:translate).with(-x,-y).once
17
+ expect(cxt).to receive(:reset_clip).once
18
+ end
19
+
20
+ before(:each) do
21
+ allow(Cairo::PDFSurface).to receive(:new).and_return(nil) #don't create the file
22
+ allow(Cairo::Context).to receive(:new).and_return(cxt)
23
+ allow(cxt).to receive(:antialias=)
24
+ end
25
+
26
+ it 'make all the expected calls on a smoke test' do
27
+ num_cards = 9
28
+ deck = Squib::Deck.new(cards: 9, width: 825, height: 1125)
29
+ expect(Squib.logger).to receive(:debug).at_least(:once)
30
+ expect(Squib.logger).to receive(:warn).exactly(:once) #warn about making the dir
31
+ expect(Dir).to receive(:mkdir) {} # don't actually make the dir
32
+ expect(cxt).to receive(:scale).with(0.24, 0.24)
33
+
34
+ expect_card_place(75, 75)
35
+ expect_card_place(831, 75)
36
+ expect_card_place(1587, 75)
37
+ expect_card_place(2343, 75)
38
+ expect_card_place(75, 1131)
39
+ expect_card_place(831, 1131)
40
+ expect_card_place(1587, 1131)
41
+ expect_card_place(2343, 1131)
42
+ expect(cxt).to receive(:show_page).once
43
+ expect_card_place(75, 75)
44
+
45
+ args = { file: 'foo.pdf', dir: '_out', margin: 75, gap: 5, trim: 37 }
46
+ deck.save_pdf(args)
47
+ end
48
+
49
+ it 'only does the three cards on a limited range' do
50
+ num_cards = 9
51
+ args = { range: 2..4, file: 'foo.pdf', dir: '_out', margin: 75, gap: 5, trim: 37 }
52
+ deck = Squib::Deck.new(cards: num_cards, width: 825, height: 1125)
53
+ expect(Squib.logger).to receive(:debug).at_least(:once)
54
+ expect(Squib.logger).to receive(:warn).exactly(:once) #warn about making the dir
55
+ expect(Dir).to receive(:mkdir) {} # don't actually make the dir
56
+ expect(cxt).to receive(:scale).with(0.24, 0.24)
57
+
58
+ expect_card_place(75, 75)
59
+ expect_card_place(831, 75)
60
+ expect_card_place(1587, 75)
61
+
62
+ deck.save_pdf(args)
63
+ end
64
+
65
+ end
66
+
67
+ end