squib 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +62 -14
  5. data/Gemfile +1 -1
  6. data/README.md +16 -10
  7. data/RELEASE TODO.md +2 -1
  8. data/Rakefile +11 -0
  9. data/lib/squib/api/data.rb +3 -3
  10. data/lib/squib/api/image.rb +7 -5
  11. data/lib/squib/api/save.rb +31 -2
  12. data/lib/squib/api/settings.rb +1 -1
  13. data/lib/squib/api/shapes.rb +86 -0
  14. data/lib/squib/api/text.rb +6 -2
  15. data/lib/squib/api/text_embed.rb +7 -5
  16. data/lib/squib/args/typographer.rb +22 -16
  17. data/lib/squib/card.rb +5 -5
  18. data/lib/squib/conf.rb +111 -0
  19. data/lib/squib/constants.rb +11 -31
  20. data/lib/squib/deck.rb +15 -48
  21. data/lib/squib/graphics/cairo_context_wrapper.rb +3 -1
  22. data/lib/squib/graphics/gradient_regex.rb +1 -0
  23. data/lib/squib/graphics/hand.rb +43 -0
  24. data/lib/squib/graphics/image.rb +5 -3
  25. data/lib/squib/graphics/save_doc.rb +1 -1
  26. data/lib/squib/graphics/shapes.rb +74 -0
  27. data/lib/squib/graphics/showcase.rb +5 -2
  28. data/lib/squib/graphics/text.rb +18 -7
  29. data/lib/squib/input_helpers.rb +2 -2
  30. data/lib/squib/version.rb +1 -1
  31. data/samples/csv_import.rb +3 -5
  32. data/samples/custom-config.yml +0 -1
  33. data/samples/custom_config.rb +1 -1
  34. data/samples/draw_shapes.rb +11 -0
  35. data/samples/embed_text.rb +1 -1
  36. data/samples/hand.rb +24 -0
  37. data/samples/load_images.rb +14 -0
  38. data/samples/sample.csv +3 -3
  39. data/samples/text_options.rb +4 -0
  40. data/spec/api/api_data_spec.rb +19 -0
  41. data/spec/api/api_image_spec.rb +1 -1
  42. data/spec/api/api_settings_spec.rb +18 -0
  43. data/spec/api/api_text_spec.rb +3 -3
  44. data/spec/conf_spec.rb +29 -0
  45. data/spec/data/conf/basic.yml +0 -0
  46. data/spec/data/conf/empty.yml +1 -0
  47. data/spec/data/samples/csv_import.rb.txt +4 -38
  48. data/spec/data/samples/custom_config.rb.txt +4 -0
  49. data/spec/data/samples/draw_shapes.rb.txt +57 -0
  50. data/spec/data/samples/hand.rb.txt +514 -0
  51. data/spec/data/samples/load_images.rb.txt +6 -0
  52. data/spec/data/samples/text_options.rb.txt +81 -0
  53. data/spec/data/xlsx/basic.xlsx +0 -0
  54. data/spec/data/xlsx/formulas.xlsx +0 -0
  55. data/spec/graphics/graphics_images_spec.rb +49 -48
  56. data/spec/graphics/graphics_shapes_spec.rb +43 -41
  57. data/spec/graphics/graphics_text_spec.rb +25 -11
  58. data/spec/samples/_diffs/gitkeep.txt +0 -0
  59. data/spec/samples/expected/autoscale_00.png +0 -0
  60. data/spec/samples/expected/autoscale_01.png +0 -0
  61. data/spec/samples/expected/autoscale_02.png +0 -0
  62. data/spec/samples/expected/backend_00.png +0 -0
  63. data/spec/samples/expected/backend_00.svg +78 -0
  64. data/spec/samples/expected/backend_01.png +0 -0
  65. data/spec/samples/expected/backend_01.svg +78 -0
  66. data/spec/samples/expected/basic_00.png +0 -0
  67. data/spec/samples/expected/basic_01.png +0 -0
  68. data/spec/samples/expected/basic_02.png +0 -0
  69. data/spec/samples/expected/cairo_access_00.png +0 -0
  70. data/spec/samples/expected/cairo_access_01.png +0 -0
  71. data/spec/samples/expected/card_00.png +0 -0
  72. data/spec/samples/expected/card_01.png +0 -0
  73. data/spec/samples/expected/colors_00.png +0 -0
  74. data/spec/samples/expected/config_disable_text_00.png +0 -0
  75. data/spec/samples/expected/config_text_00.png +0 -0
  76. data/spec/samples/expected/custom-config_00.png +0 -0
  77. data/spec/samples/expected/embed_00.png +0 -0
  78. data/spec/samples/expected/embed_multi_00.png +0 -0
  79. data/spec/samples/expected/embed_multi_01.png +0 -0
  80. data/spec/samples/expected/embed_multi_02.png +0 -0
  81. data/spec/samples/expected/embed_multisheet_00.png +0 -0
  82. data/spec/samples/expected/gitkeep.txt +0 -0
  83. data/spec/samples/expected/gradient_00.png +0 -0
  84. data/spec/samples/expected/hand.png +0 -0
  85. data/spec/samples/expected/hand_pretty.png +0 -0
  86. data/spec/samples/expected/landscape_00.png +0 -0
  87. data/spec/samples/expected/layout2_00.png +0 -0
  88. data/spec/samples/expected/layout_00.png +0 -0
  89. data/spec/samples/expected/layout_builtin_hand_00.png +0 -0
  90. data/spec/samples/expected/layout_builtin_playing_card_00.png +0 -0
  91. data/spec/samples/expected/load_images_00.png +0 -0
  92. data/spec/samples/expected/portrait_00.png +0 -0
  93. data/spec/samples/expected/ranges_00.png +0 -0
  94. data/spec/samples/expected/ranges_01.png +0 -0
  95. data/spec/samples/expected/ranges_02.png +0 -0
  96. data/spec/samples/expected/sample_csv_00.png +0 -0
  97. data/spec/samples/expected/sample_csv_01.png +0 -0
  98. data/spec/samples/expected/sample_excel_00.png +0 -0
  99. data/spec/samples/expected/sample_excel_01.png +0 -0
  100. data/spec/samples/expected/sample_excel_02.png +0 -0
  101. data/spec/samples/expected/save_sheet_00.png +0 -0
  102. data/spec/samples/expected/save_sheet_01.png +0 -0
  103. data/spec/samples/expected/save_sheet_range_00.png +0 -0
  104. data/spec/samples/expected/save_sheet_range_01.png +0 -0
  105. data/spec/samples/expected/save_single_sheet_00.png +0 -0
  106. data/spec/samples/expected/saves_notrim_01.png +0 -0
  107. data/spec/samples/expected/shape_00.png +0 -0
  108. data/spec/samples/expected/showcase.png +0 -0
  109. data/spec/samples/expected/showcase2.png +0 -0
  110. data/spec/samples/expected/showcase_individual_00.png +0 -0
  111. data/spec/samples/expected/showcase_individual_01.png +0 -0
  112. data/spec/samples/expected/showcase_individual_02.png +0 -0
  113. data/spec/samples/expected/showcase_individual_03.png +0 -0
  114. data/spec/samples/expected/text_00.png +0 -0
  115. data/spec/samples/expected/text_01.png +0 -0
  116. data/spec/samples/expected/text_02.png +0 -0
  117. data/spec/samples/expected/tgc_sample_00.png +0 -0
  118. data/spec/samples/expected/units_00.png +0 -0
  119. data/spec/samples/samples_regression_spec.rb +7 -5
  120. data/spec/samples/sanity.html.erb +28 -0
  121. data/spec/samples/sanity.rb +70 -0
  122. data/spec/spec_helper.rb +15 -1
  123. data/squib.gemspec +3 -1
  124. data/squib.sublime-project +27 -40
  125. metadata +177 -4
File without changes
@@ -0,0 +1,78 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="825pt" height="1125pt" viewBox="0 0 825 1125" version="1.1">
3
+ <defs>
4
+ <g>
5
+ <symbol overflow="visible" id="glyph0-0">
6
+ <path style="stroke:none;" d="M 12 0 L 12 -72 L 84 -72 L 84 0 Z M 18 -6 L 78 -6 L 78 -66 L 18 -66 Z M 18 -6 "/>
7
+ </symbol>
8
+ <symbol overflow="visible" id="glyph0-1">
9
+ <path style="stroke:none;" d="M 66 0 L 48 0 L 48 -31 L 25 -31 L 25 0 L 7 0 L 7 -70 L 25 -70 L 25 -44 L 48 -44 L 48 -70 L 66 -70 Z M 66 0 "/>
10
+ </symbol>
11
+ <symbol overflow="visible" id="glyph0-2">
12
+ <path style="stroke:none;" d="M 33.109375 1 C 23.066406 0.996094 15.371094 -1.390625 10.023438 -6.164063 C 4.671875 -10.9375 1.996094 -17.742188 2 -26.578125 C 1.996094 -35.210938 4.496094 -42.105469 9.492188 -47.265625 C 14.484375 -52.417969 21.464844 -54.996094 30.4375 -55 C 38.589844 -54.996094 44.722656 -52.828125 48.835938 -48.5 C 52.941406 -44.164063 54.996094 -37.960938 55 -29.890625 L 55 -24 L 18 -24 C 18.15625 -21.507813 18.683594 -19.425781 19.585938 -17.757813 C 20.484375 -16.082031 21.675781 -14.75 23.15625 -13.765625 C 24.601563 -12.78125 26.289063 -12.078125 28.21875 -11.648438 C 30.144531 -11.214844 32.246094 -10.996094 34.53125 -11 C 36.484375 -10.996094 38.414063 -11.207031 40.3125 -11.625 C 42.207031 -12.039063 43.941406 -12.589844 45.515625 -13.28125 C 46.898438 -13.863281 48.175781 -14.496094 49.351563 -15.179688 C 50.519531 -15.859375 51.476563 -16.464844 52.21875 -17 L 54 -17 L 54 -3.375 C 52.644531 -2.84375 51.402344 -2.351563 50.28125 -1.898438 C 49.152344 -1.445313 47.617188 -0.984375 45.671875 -0.515625 C 43.867188 -0.0390625 42.011719 0.332031 40.101563 0.601563 C 38.1875 0.863281 35.855469 0.996094 33.109375 1 Z M 39 -34 C 38.894531 -37.582031 38.039063 -40.3125 36.4375 -42.1875 C 34.832031 -44.0625 32.367188 -45 29.046875 -45 C 25.65625 -45 23.011719 -44.015625 21.109375 -42.046875 C 19.199219 -40.078125 18.148438 -37.394531 17.953125 -34 Z M 39 -34 "/>
13
+ </symbol>
14
+ <symbol overflow="visible" id="glyph0-3">
15
+ <path style="stroke:none;" d="M 22 0 L 6 0 L 6 -73 L 22 -73 Z M 22 0 "/>
16
+ </symbol>
17
+ <symbol overflow="visible" id="glyph0-4">
18
+ <path style="stroke:none;" d="M 57 -26.46875 C 57 -17.640625 54.605469 -10.691406 49.820313 -5.617188 C 45.03125 -0.539063 38.257813 1.996094 29.5 2 C 20.808594 1.996094 14.054688 -0.539063 9.234375 -5.617188 C 4.410156 -10.691406 1.996094 -17.640625 2 -26.46875 C 1.996094 -35.390625 4.410156 -42.378906 9.234375 -47.429688 C 14.054688 -52.472656 20.808594 -54.996094 29.5 -55 C 38.226563 -54.996094 44.992188 -52.457031 49.796875 -47.382813 C 54.597656 -42.300781 57 -35.328125 57 -26.46875 Z M 40 -26.375 C 39.996094 -29.558594 39.734375 -32.214844 39.21875 -34.335938 C 38.695313 -36.453125 37.972656 -38.148438 37.046875 -39.421875 C 36.066406 -40.753906 34.960938 -41.683594 33.726563 -42.210938 C 32.492188 -42.734375 31.082031 -42.996094 29.5 -43 C 28.007813 -42.996094 26.660156 -42.765625 25.460938 -42.304688 C 24.253906 -41.839844 23.148438 -40.957031 22.140625 -39.65625 C 21.179688 -38.414063 20.417969 -36.710938 19.851563 -34.546875 C 19.28125 -32.378906 18.996094 -29.652344 19 -26.375 C 18.996094 -23.101563 19.265625 -20.453125 19.804688 -18.429688 C 20.339844 -16.398438 21.035156 -14.78125 21.890625 -13.578125 C 22.785156 -12.335938 23.894531 -11.429688 25.226563 -10.859375 C 26.550781 -10.28125 28.023438 -9.996094 29.640625 -10 C 30.972656 -9.996094 32.328125 -10.28125 33.703125 -10.859375 C 35.078125 -11.429688 36.175781 -12.289063 37 -13.4375 C 37.988281 -14.796875 38.734375 -16.445313 39.242188 -18.375 C 39.742188 -20.300781 39.996094 -22.964844 40 -26.375 Z M 40 -26.375 "/>
19
+ </symbol>
20
+ <symbol overflow="visible" id="glyph0-5">
21
+ <path style="stroke:none;" d="M 26 -18 L 9.84375 18 L 0 18 L 9.09375 -18 Z M 26 -18 "/>
22
+ </symbol>
23
+ <symbol overflow="visible" id="glyph0-6">
24
+ <path style="stroke:none;" d=""/>
25
+ </symbol>
26
+ <symbol overflow="visible" id="glyph0-7">
27
+ <path style="stroke:none;" d="M 84 -53 L 68.8125 0 L 51.578125 0 L 42.453125 -34.265625 L 33.28125 0 L 16.046875 0 L 1 -53 L 17.625 -53 L 26.015625 -17.9375 L 35.875 -53 L 50.1875 -53 L 59.5 -17.9375 L 67.359375 -53 Z M 84 -53 "/>
28
+ </symbol>
29
+ <symbol overflow="visible" id="glyph0-8">
30
+ <path style="stroke:none;" d="M 42 -38 L 40.5625 -38 C 39.902344 -38.328125 38.945313 -38.578125 37.695313 -38.75 C 36.4375 -38.914063 35.050781 -39 33.53125 -39 C 31.714844 -39 29.8125 -38.742188 27.820313 -38.226563 C 25.824219 -37.710938 23.882813 -37.097656 22 -36.390625 L 22 0 L 6 0 L 6 -53 L 22 -53 L 22 -45.234375 C 22.789063 -45.921875 23.886719 -46.789063 25.289063 -47.84375 C 26.6875 -48.890625 27.964844 -49.730469 29.125 -50.359375 C 30.382813 -51.085938 31.847656 -51.707031 33.515625 -52.226563 C 35.179688 -52.738281 36.75 -52.996094 38.234375 -53 C 38.792969 -52.996094 39.421875 -52.980469 40.117188 -52.953125 C 40.808594 -52.917969 41.4375 -52.878906 42 -52.828125 Z M 42 -38 "/>
31
+ </symbol>
32
+ <symbol overflow="visible" id="glyph0-9">
33
+ <path style="stroke:none;" d="M 54 0 L 38 0 L 38 -5.484375 C 36.914063 -4.609375 35.679688 -3.671875 34.289063 -2.671875 C 32.898438 -1.671875 31.675781 -0.921875 30.625 -0.421875 C 29.277344 0.328125 27.949219 0.917969 26.640625 1.351563 C 25.324219 1.78125 23.757813 1.996094 21.9375 2 C 15.800781 1.996094 10.941406 -0.550781 7.367188 -5.648438 C 3.785156 -10.746094 1.996094 -17.558594 2 -26.09375 C 1.996094 -30.796875 2.605469 -34.882813 3.820313 -38.351563 C 5.03125 -41.8125 6.710938 -44.832031 8.859375 -47.40625 C 10.804688 -49.738281 13.167969 -51.585938 15.953125 -52.953125 C 18.730469 -54.3125 21.667969 -54.996094 24.765625 -55 C 27.574219 -54.996094 29.882813 -54.707031 31.695313 -54.132813 C 33.5 -53.550781 35.601563 -52.652344 38 -51.4375 L 38 -73 L 54 -73 Z M 38 -14.3125 L 38 -41.515625 C 37.164063 -41.9375 36.070313 -42.292969 34.71875 -42.578125 C 33.359375 -42.855469 32.199219 -42.996094 31.234375 -43 C 27.167969 -42.996094 24.113281 -41.546875 22.070313 -38.65625 C 20.019531 -35.757813 18.996094 -31.707031 19 -26.5 C 18.996094 -21.039063 19.8125 -17.089844 21.445313 -14.65625 C 23.074219 -12.214844 25.707031 -10.996094 29.34375 -11 C 30.820313 -10.996094 32.316406 -11.292969 33.835938 -11.890625 C 35.347656 -12.480469 36.734375 -13.289063 38 -14.3125 Z M 38 -14.3125 "/>
34
+ </symbol>
35
+ <symbol overflow="visible" id="glyph0-10">
36
+ <path style="stroke:none;" d="M 25 -70 L 23.140625 -20 L 8.859375 -20 L 7 -70 Z M 25 0 L 7 0 L 7 -12 L 25 -12 Z M 25 0 "/>
37
+ </symbol>
38
+ </g>
39
+ <image id="image200" width="128" height="128" xlink:href="data:image/png;base64,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"/>
40
+ <filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
41
+ <feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
42
+ </filter>
43
+ <mask id="mask0">
44
+ <g filter="url(#alpha)">
45
+ <use xlink:href="#image200" transform="matrix(1,0,0,1,250,250)"/>
46
+ </g>
47
+ </mask>
48
+ </defs>
49
+ <g id="surface193">
50
+ <rect x="0" y="0" width="825" height="1125" style="fill:rgb(50.196078%,50.196078%,50.196078%);fill-opacity:1;stroke:none;"/>
51
+ <g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
52
+ <use xlink:href="#glyph0-1" x="106" y="596"/>
53
+ <use xlink:href="#glyph0-2" x="179" y="596"/>
54
+ <use xlink:href="#glyph0-3" x="236" y="596"/>
55
+ <use xlink:href="#glyph0-3" x="265" y="596"/>
56
+ <use xlink:href="#glyph0-4" x="294" y="596"/>
57
+ <use xlink:href="#glyph0-5" x="353" y="596"/>
58
+ <use xlink:href="#glyph0-6" x="383" y="596"/>
59
+ <use xlink:href="#glyph0-7" x="411" y="596"/>
60
+ <use xlink:href="#glyph0-4" x="496" y="596"/>
61
+ <use xlink:href="#glyph0-8" x="555" y="596"/>
62
+ <use xlink:href="#glyph0-3" x="597" y="596"/>
63
+ <use xlink:href="#glyph0-9" x="626" y="596"/>
64
+ <use xlink:href="#glyph0-10" x="686" y="596"/>
65
+ </g>
66
+ <path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 76 38 L 750 38 C 769 38 788 57 788 76 L 788 1050 C 788 1069 769 1088 750 1088 L 76 1088 C 57 1088 38 1069 38 1050 L 38 76 C 38 57 57 38 76 38 Z M 76 38 "/>
67
+ <path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 125 400 C 125 413.808594 113.808594 425 100 425 C 86.191406 425 75 413.808594 75 400 C 75 386.191406 86.191406 375 100 375 C 113.808594 375 125 386.191406 125 400 "/>
68
+ <path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 100 425 L 125 475 L 75 475 Z M 100 425 "/>
69
+ <path style="fill:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 100 620 L 720 620 "/>
70
+ <path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:10.625396;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 72.416536 -378.68698 L 439.575917 -378.68698 C 476.648655 -378.68698 506.694943 -348.640692 506.694943 -311.583603 L 506.694943 55.575778 C 506.694943 92.648516 476.648655 122.694804 439.575917 122.694804 L 72.416536 122.694804 C 35.359447 122.694804 5.313159 92.648516 5.313159 55.575778 L 5.313159 -311.583603 C 5.313159 -348.640692 35.359447 -378.68698 72.416536 -378.68698 Z M 72.416536 -378.68698 " transform="matrix(0.249615,0,0,0.249615,100.197194,171.049335)"/>
71
+ <path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 109.25 169.125 C 104.289063 172.332031 101 177.90625 101 184.25 C 101 194.191406 109.058594 202.25 119 202.25 C 124.957031 202.25 130.222656 199.335938 133.5 194.875 C 130.6875 196.691406 127.34375 197.75 123.75 197.75 C 113.808594 197.75 105.75 189.691406 105.75 179.75 C 105.75 175.765625 107.058594 172.105469 109.25 169.125 Z M 109.25 169.125 "/>
72
+ <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 151.84375 123.230469 L 105.195313 169.878906 L 105.195313 195.828125 L 130.269531 195.828125 L 177.355469 148.742188 Z M 151.84375 123.230469 "/>
73
+ <path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 181.779507 141.859042 L 197.398822 126.241402 M 200.74827 129.590013 L 184.943061 145.39271 " transform="matrix(4.664947,0,0,4.664947,-744.909784,-480.042297)"/>
74
+ <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 193.6875 78.402344 C 180.496094 74.996094 165.875 78.382813 155.546875 88.707031 C 140.015625 104.238281 140.015625 129.460938 155.546875 144.992188 C 171.078125 160.523438 196.300781 160.523438 211.832031 144.992188 C 222.167969 134.652344 225.5625 120.054688 222.140625 106.851563 L 195.851563 133.136719 L 173.378906 127.160156 L 167.402344 104.6875 Z M 193.6875 78.402344 "/>
75
+ <use xlink:href="#image200" transform="matrix(1,0,0,1,250,75)"/>
76
+ <rect x="0" y="0" width="825" height="1125" style="fill:rgb(100%,0%,0%);fill-opacity:1;stroke:none;" mask="url(#mask0)"/>
77
+ </g>
78
+ </svg>
@@ -0,0 +1,78 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="825pt" height="1125pt" viewBox="0 0 825 1125" version="1.1">
3
+ <defs>
4
+ <g>
5
+ <symbol overflow="visible" id="glyph0-0">
6
+ <path style="stroke:none;" d="M 12 0 L 12 -72 L 84 -72 L 84 0 Z M 18 -6 L 78 -6 L 78 -66 L 18 -66 Z M 18 -6 "/>
7
+ </symbol>
8
+ <symbol overflow="visible" id="glyph0-1">
9
+ <path style="stroke:none;" d="M 66 0 L 48 0 L 48 -31 L 25 -31 L 25 0 L 7 0 L 7 -70 L 25 -70 L 25 -44 L 48 -44 L 48 -70 L 66 -70 Z M 66 0 "/>
10
+ </symbol>
11
+ <symbol overflow="visible" id="glyph0-2">
12
+ <path style="stroke:none;" d="M 33.109375 1 C 23.066406 0.996094 15.371094 -1.390625 10.023438 -6.164063 C 4.671875 -10.9375 1.996094 -17.742188 2 -26.578125 C 1.996094 -35.210938 4.496094 -42.105469 9.492188 -47.265625 C 14.484375 -52.417969 21.464844 -54.996094 30.4375 -55 C 38.589844 -54.996094 44.722656 -52.828125 48.835938 -48.5 C 52.941406 -44.164063 54.996094 -37.960938 55 -29.890625 L 55 -24 L 18 -24 C 18.15625 -21.507813 18.683594 -19.425781 19.585938 -17.757813 C 20.484375 -16.082031 21.675781 -14.75 23.15625 -13.765625 C 24.601563 -12.78125 26.289063 -12.078125 28.21875 -11.648438 C 30.144531 -11.214844 32.246094 -10.996094 34.53125 -11 C 36.484375 -10.996094 38.414063 -11.207031 40.3125 -11.625 C 42.207031 -12.039063 43.941406 -12.589844 45.515625 -13.28125 C 46.898438 -13.863281 48.175781 -14.496094 49.351563 -15.179688 C 50.519531 -15.859375 51.476563 -16.464844 52.21875 -17 L 54 -17 L 54 -3.375 C 52.644531 -2.84375 51.402344 -2.351563 50.28125 -1.898438 C 49.152344 -1.445313 47.617188 -0.984375 45.671875 -0.515625 C 43.867188 -0.0390625 42.011719 0.332031 40.101563 0.601563 C 38.1875 0.863281 35.855469 0.996094 33.109375 1 Z M 39 -34 C 38.894531 -37.582031 38.039063 -40.3125 36.4375 -42.1875 C 34.832031 -44.0625 32.367188 -45 29.046875 -45 C 25.65625 -45 23.011719 -44.015625 21.109375 -42.046875 C 19.199219 -40.078125 18.148438 -37.394531 17.953125 -34 Z M 39 -34 "/>
13
+ </symbol>
14
+ <symbol overflow="visible" id="glyph0-3">
15
+ <path style="stroke:none;" d="M 22 0 L 6 0 L 6 -73 L 22 -73 Z M 22 0 "/>
16
+ </symbol>
17
+ <symbol overflow="visible" id="glyph0-4">
18
+ <path style="stroke:none;" d="M 57 -26.46875 C 57 -17.640625 54.605469 -10.691406 49.820313 -5.617188 C 45.03125 -0.539063 38.257813 1.996094 29.5 2 C 20.808594 1.996094 14.054688 -0.539063 9.234375 -5.617188 C 4.410156 -10.691406 1.996094 -17.640625 2 -26.46875 C 1.996094 -35.390625 4.410156 -42.378906 9.234375 -47.429688 C 14.054688 -52.472656 20.808594 -54.996094 29.5 -55 C 38.226563 -54.996094 44.992188 -52.457031 49.796875 -47.382813 C 54.597656 -42.300781 57 -35.328125 57 -26.46875 Z M 40 -26.375 C 39.996094 -29.558594 39.734375 -32.214844 39.21875 -34.335938 C 38.695313 -36.453125 37.972656 -38.148438 37.046875 -39.421875 C 36.066406 -40.753906 34.960938 -41.683594 33.726563 -42.210938 C 32.492188 -42.734375 31.082031 -42.996094 29.5 -43 C 28.007813 -42.996094 26.660156 -42.765625 25.460938 -42.304688 C 24.253906 -41.839844 23.148438 -40.957031 22.140625 -39.65625 C 21.179688 -38.414063 20.417969 -36.710938 19.851563 -34.546875 C 19.28125 -32.378906 18.996094 -29.652344 19 -26.375 C 18.996094 -23.101563 19.265625 -20.453125 19.804688 -18.429688 C 20.339844 -16.398438 21.035156 -14.78125 21.890625 -13.578125 C 22.785156 -12.335938 23.894531 -11.429688 25.226563 -10.859375 C 26.550781 -10.28125 28.023438 -9.996094 29.640625 -10 C 30.972656 -9.996094 32.328125 -10.28125 33.703125 -10.859375 C 35.078125 -11.429688 36.175781 -12.289063 37 -13.4375 C 37.988281 -14.796875 38.734375 -16.445313 39.242188 -18.375 C 39.742188 -20.300781 39.996094 -22.964844 40 -26.375 Z M 40 -26.375 "/>
19
+ </symbol>
20
+ <symbol overflow="visible" id="glyph0-5">
21
+ <path style="stroke:none;" d="M 26 -18 L 9.84375 18 L 0 18 L 9.09375 -18 Z M 26 -18 "/>
22
+ </symbol>
23
+ <symbol overflow="visible" id="glyph0-6">
24
+ <path style="stroke:none;" d=""/>
25
+ </symbol>
26
+ <symbol overflow="visible" id="glyph0-7">
27
+ <path style="stroke:none;" d="M 84 -53 L 68.8125 0 L 51.578125 0 L 42.453125 -34.265625 L 33.28125 0 L 16.046875 0 L 1 -53 L 17.625 -53 L 26.015625 -17.9375 L 35.875 -53 L 50.1875 -53 L 59.5 -17.9375 L 67.359375 -53 Z M 84 -53 "/>
28
+ </symbol>
29
+ <symbol overflow="visible" id="glyph0-8">
30
+ <path style="stroke:none;" d="M 42 -38 L 40.5625 -38 C 39.902344 -38.328125 38.945313 -38.578125 37.695313 -38.75 C 36.4375 -38.914063 35.050781 -39 33.53125 -39 C 31.714844 -39 29.8125 -38.742188 27.820313 -38.226563 C 25.824219 -37.710938 23.882813 -37.097656 22 -36.390625 L 22 0 L 6 0 L 6 -53 L 22 -53 L 22 -45.234375 C 22.789063 -45.921875 23.886719 -46.789063 25.289063 -47.84375 C 26.6875 -48.890625 27.964844 -49.730469 29.125 -50.359375 C 30.382813 -51.085938 31.847656 -51.707031 33.515625 -52.226563 C 35.179688 -52.738281 36.75 -52.996094 38.234375 -53 C 38.792969 -52.996094 39.421875 -52.980469 40.117188 -52.953125 C 40.808594 -52.917969 41.4375 -52.878906 42 -52.828125 Z M 42 -38 "/>
31
+ </symbol>
32
+ <symbol overflow="visible" id="glyph0-9">
33
+ <path style="stroke:none;" d="M 54 0 L 38 0 L 38 -5.484375 C 36.914063 -4.609375 35.679688 -3.671875 34.289063 -2.671875 C 32.898438 -1.671875 31.675781 -0.921875 30.625 -0.421875 C 29.277344 0.328125 27.949219 0.917969 26.640625 1.351563 C 25.324219 1.78125 23.757813 1.996094 21.9375 2 C 15.800781 1.996094 10.941406 -0.550781 7.367188 -5.648438 C 3.785156 -10.746094 1.996094 -17.558594 2 -26.09375 C 1.996094 -30.796875 2.605469 -34.882813 3.820313 -38.351563 C 5.03125 -41.8125 6.710938 -44.832031 8.859375 -47.40625 C 10.804688 -49.738281 13.167969 -51.585938 15.953125 -52.953125 C 18.730469 -54.3125 21.667969 -54.996094 24.765625 -55 C 27.574219 -54.996094 29.882813 -54.707031 31.695313 -54.132813 C 33.5 -53.550781 35.601563 -52.652344 38 -51.4375 L 38 -73 L 54 -73 Z M 38 -14.3125 L 38 -41.515625 C 37.164063 -41.9375 36.070313 -42.292969 34.71875 -42.578125 C 33.359375 -42.855469 32.199219 -42.996094 31.234375 -43 C 27.167969 -42.996094 24.113281 -41.546875 22.070313 -38.65625 C 20.019531 -35.757813 18.996094 -31.707031 19 -26.5 C 18.996094 -21.039063 19.8125 -17.089844 21.445313 -14.65625 C 23.074219 -12.214844 25.707031 -10.996094 29.34375 -11 C 30.820313 -10.996094 32.316406 -11.292969 33.835938 -11.890625 C 35.347656 -12.480469 36.734375 -13.289063 38 -14.3125 Z M 38 -14.3125 "/>
34
+ </symbol>
35
+ <symbol overflow="visible" id="glyph0-10">
36
+ <path style="stroke:none;" d="M 25 -70 L 23.140625 -20 L 8.859375 -20 L 7 -70 Z M 25 0 L 7 0 L 7 -12 L 25 -12 Z M 25 0 "/>
37
+ </symbol>
38
+ </g>
39
+ <image id="image200" width="128" height="128" xlink:href="data:image/png;base64,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"/>
40
+ <filter id="alpha" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
41
+ <feColorMatrix type="matrix" in="SourceGraphic" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
42
+ </filter>
43
+ <mask id="mask0">
44
+ <g filter="url(#alpha)">
45
+ <use xlink:href="#image200" transform="matrix(1,0,0,1,250,250)"/>
46
+ </g>
47
+ </mask>
48
+ </defs>
49
+ <g id="surface196">
50
+ <rect x="0" y="0" width="825" height="1125" style="fill:rgb(50.196078%,50.196078%,50.196078%);fill-opacity:1;stroke:none;"/>
51
+ <g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
52
+ <use xlink:href="#glyph0-1" x="106" y="596"/>
53
+ <use xlink:href="#glyph0-2" x="179" y="596"/>
54
+ <use xlink:href="#glyph0-3" x="236" y="596"/>
55
+ <use xlink:href="#glyph0-3" x="265" y="596"/>
56
+ <use xlink:href="#glyph0-4" x="294" y="596"/>
57
+ <use xlink:href="#glyph0-5" x="353" y="596"/>
58
+ <use xlink:href="#glyph0-6" x="383" y="596"/>
59
+ <use xlink:href="#glyph0-7" x="411" y="596"/>
60
+ <use xlink:href="#glyph0-4" x="496" y="596"/>
61
+ <use xlink:href="#glyph0-8" x="555" y="596"/>
62
+ <use xlink:href="#glyph0-3" x="597" y="596"/>
63
+ <use xlink:href="#glyph0-9" x="626" y="596"/>
64
+ <use xlink:href="#glyph0-10" x="686" y="596"/>
65
+ </g>
66
+ <path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 76 38 L 750 38 C 769 38 788 57 788 76 L 788 1050 C 788 1069 769 1088 750 1088 L 76 1088 C 57 1088 38 1069 38 1050 L 38 76 C 38 57 57 38 76 38 Z M 76 38 "/>
67
+ <path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 125 400 C 125 413.808594 113.808594 425 100 425 C 86.191406 425 75 413.808594 75 400 C 75 386.191406 86.191406 375 100 375 C 113.808594 375 125 386.191406 125 400 "/>
68
+ <path style="fill:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 100 425 L 125 475 L 75 475 Z M 100 425 "/>
69
+ <path style="fill:none;stroke-width:15;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 100 620 L 720 620 "/>
70
+ <path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:10.625396;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 72.416536 -378.68698 L 439.575917 -378.68698 C 476.648655 -378.68698 506.694943 -348.640692 506.694943 -311.583603 L 506.694943 55.575778 C 506.694943 92.648516 476.648655 122.694804 439.575917 122.694804 L 72.416536 122.694804 C 35.359447 122.694804 5.313159 92.648516 5.313159 55.575778 L 5.313159 -311.583603 C 5.313159 -348.640692 35.359447 -378.68698 72.416536 -378.68698 Z M 72.416536 -378.68698 " transform="matrix(0.249615,0,0,0.249615,100.197194,171.049335)"/>
71
+ <path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 109.25 169.125 C 104.289063 172.332031 101 177.90625 101 184.25 C 101 194.191406 109.058594 202.25 119 202.25 C 124.957031 202.25 130.222656 199.335938 133.5 194.875 C 130.6875 196.691406 127.34375 197.75 123.75 197.75 C 113.808594 197.75 105.75 189.691406 105.75 179.75 C 105.75 175.765625 107.058594 172.105469 109.25 169.125 Z M 109.25 169.125 "/>
72
+ <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 151.84375 123.230469 L 105.195313 169.878906 L 105.195313 195.828125 L 130.269531 195.828125 L 177.355469 148.742188 Z M 151.84375 123.230469 "/>
73
+ <path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:4;" d="M 181.779507 141.859042 L 197.398822 126.241402 M 200.74827 129.590013 L 184.943061 145.39271 " transform="matrix(4.664947,0,0,4.664947,-744.909784,-480.042297)"/>
74
+ <path style=" stroke:none;fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;" d="M 193.6875 78.402344 C 180.496094 74.996094 165.875 78.382813 155.546875 88.707031 C 140.015625 104.238281 140.015625 129.460938 155.546875 144.992188 C 171.078125 160.523438 196.300781 160.523438 211.832031 144.992188 C 222.167969 134.652344 225.5625 120.054688 222.140625 106.851563 L 195.851563 133.136719 L 173.378906 127.160156 L 167.402344 104.6875 Z M 193.6875 78.402344 "/>
75
+ <use xlink:href="#image200" transform="matrix(1,0,0,1,250,75)"/>
76
+ <rect x="0" y="0" width="825" height="1125" style="fill:rgb(100%,0%,0%);fill-opacity:1;stroke:none;" mask="url(#mask0)"/>
77
+ </g>
78
+ </svg>
File without changes
@@ -3,6 +3,7 @@ require 'squib'
3
3
  require 'pp'
4
4
 
5
5
  describe "Squib samples" do
6
+ @SAMPLES_DIR = "#{File.expand_path(File.dirname(__FILE__))}/../../samples/"
6
7
  let(:samples_dir) { "#{File.expand_path(File.dirname(__FILE__))}/../../samples/" }
7
8
 
8
9
  around(:each) do |example|
@@ -11,10 +12,10 @@ describe "Squib samples" do
11
12
  end
12
13
  end
13
14
 
14
- it 'should execute with no errors' do
15
- allow(Squib.logger).to receive(:warn) {}
16
- allow(ProgressBar).to receive(:create).and_return(Squib::DoNothing.new)
17
- Dir["#{samples_dir}/**/*.rb"].each do |sample|
15
+ Dir["#{@SAMPLES_DIR}/**/*.rb"].each do |sample|
16
+ it "should execute #{sample} with no errors", slow: true do
17
+ allow(Squib.logger).to receive(:warn) {}
18
+ allow(ProgressBar).to receive(:create).and_return(Squib::DoNothing.new)
18
19
  load sample
19
20
  end
20
21
  end
@@ -57,6 +58,7 @@ describe "Squib samples" do
57
58
  embed_text.rb
58
59
  excel.rb
59
60
  gradients.rb
61
+ hand.rb
60
62
  hello_world.rb
61
63
  load_images.rb
62
64
  portrait-landscape.rb
@@ -67,7 +69,7 @@ describe "Squib samples" do
67
69
  tgc_proofs.rb
68
70
  units.rb
69
71
  ).each do |sample|
70
- it "has not changed for #{sample}" do
72
+ it "has not changed for #{sample}", slow: true do
71
73
  log = StringIO.new
72
74
  mock_cairo(log)
73
75
  load sample
@@ -0,0 +1,28 @@
1
+ <html>
2
+ <head>
3
+ <meta name="viewport" content="width=device-width">
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6
+ <title>Squib Sanity Test for v<%=Squib::VERSION%></title>
7
+ <style>
8
+ body{
9
+ background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAHElEQVQYlWO4ePFiAzGY4eLFiw0MxIBRhVRRCADsljgKUbBKPgAAAABJRU5ErkJggg==) repeat;
10
+ }
11
+ img{
12
+ width: 30%;
13
+ }
14
+ </style>
15
+ </head>
16
+ <body>
17
+ <% count = 0 %>
18
+ <% images.each do |exp, actual, diff| %>
19
+ <img src="<%=exp %>">&nbsp;
20
+ <img src="<%=actual %>">&nbsp;
21
+ <img src="<%=diff %>">&nbsp;
22
+ <br>
23
+ <%=exp %>
24
+ <hr>
25
+ <% count += 1 %>
26
+ <% end %>
27
+ <body>
28
+ </html>
@@ -0,0 +1,70 @@
1
+ require 'launchy'
2
+ require 'erb'
3
+ require 'cairo'
4
+ require 'ruby-progressbar'
5
+
6
+ # An pixel-by-pixel comparison of sample images for visual regression testing
7
+ class Sanity
8
+
9
+ @@EXPECTED_DIR = "#{File.expand_path(File.dirname(__FILE__))}/expected/"
10
+ @@OUTPUT_DIR = "#{File.expand_path(File.dirname(__FILE__))}/../../samples/_output/"
11
+ @@DIFF_DIR = "#{File.expand_path(File.dirname(__FILE__))}/_diffs/"
12
+ @@SANITY_ERB = "#{File.expand_path(File.dirname(__FILE__))}/sanity.html.erb"
13
+ @@SANITY_HTML = "#{File.expand_path(File.dirname(__FILE__))}/sanity.html"
14
+
15
+ def images
16
+ images = []
17
+ exp_pngs = Dir[@@EXPECTED_DIR + "/**/*.png"]
18
+ bar = ProgressBar.create(title: 'Diffing images', total: exp_pngs.size)
19
+ exp_pngs.each do |exp_png|
20
+ row = []
21
+ actual_png = @@OUTPUT_DIR + File.basename(exp_png)
22
+ row << "file:///" + exp_png
23
+ row << "file:///" + actual_png #actual
24
+ row << "file:///" + diff_image(exp_png, actual_png)
25
+ images << row
26
+ bar.increment
27
+ end
28
+ bar.finish
29
+ return images
30
+ end
31
+
32
+ def run
33
+ puts "Building sanity test..."
34
+ sanity_template = File.read(@@SANITY_ERB)
35
+ process_erb(sanity_template)
36
+ Launchy.open("file:///" + @@SANITY_HTML)
37
+ puts "Done."
38
+ end
39
+
40
+ private
41
+
42
+ def diff_image(exp_file, actual_file)
43
+ exp = Cairo::ImageSurface.from_png(exp_file)
44
+ exp_data = exp.data.bytes
45
+ actual_data = Cairo::ImageSurface.from_png(actual_file).data.bytes
46
+ new_data = Array.new(exp_data.size, 255)
47
+ unless exp_data == actual_data # this seems to be the fastest initial comparison
48
+ (0..exp_data.size).each do |i|
49
+ empty = (i % 4 == 3) ? 0 : 255 # alpha channel is empty, others are just black
50
+ new_data[i] = (exp_data[i] == actual_data[i]) ? empty : 128
51
+ end
52
+ end
53
+ out = Cairo::ImageSurface.new(new_data.pack('c*'), exp.format, exp.width, exp.height, exp.stride)
54
+ out_file = @@DIFF_DIR + exp_file[exp_file.rindex("/")..-1]
55
+ out.write_to_png(out_file)
56
+ out_file
57
+ end
58
+
59
+ def diff_pixel(exp, actual)
60
+ (exp == actual) ? [0, 0, 0, 0] : [255, 0, 0, 255]
61
+ end
62
+
63
+ def process_erb(sanity_template)
64
+ renderer = ERB.new(sanity_template)
65
+ File.open(@@SANITY_HTML, 'w+') do |html|
66
+ html.write(renderer.result(binding))
67
+ end
68
+ end
69
+
70
+ end
@@ -32,6 +32,18 @@ def csv_file(file)
32
32
  "#{File.expand_path(File.dirname(__FILE__))}/data/csv/#{file}"
33
33
  end
34
34
 
35
+ def xlsx_file(file)
36
+ "#{File.expand_path(File.dirname(__FILE__))}/data/xlsx/#{file}"
37
+ end
38
+
39
+ def project_template(file)
40
+ "#{File.expand_path(File.dirname(__FILE__))}/../lib/squib/project_template/#{file}"
41
+ end
42
+
43
+ def conf(file)
44
+ "#{File.expand_path(File.dirname(__FILE__))}/data/conf/#{file}"
45
+ end
46
+
35
47
  def overwrite_sample(sample_name, log)
36
48
  # Use this to overwrite the regression with current state
37
49
  File.open(sample_regression_file(sample_name), 'w+:UTF-8') do |f|
@@ -67,6 +79,7 @@ def mock_cairo(strio)
67
79
  allow(Cairo::ImageSurface).to receive(:new).and_return(surface)
68
80
  allow(surface).to receive(:width).and_return(100)
69
81
  allow(surface).to receive(:height).and_return(101)
82
+ allow(surface).to receive(:ink_extents).and_return([0,0,100,100])
70
83
  allow(Cairo::Context).to receive(:new).and_return(cxt)
71
84
  allow(cxt).to receive(:create_pango_layout).and_return(pango)
72
85
  allow(cxt).to receive(:target).and_return(surface)
@@ -90,7 +103,8 @@ def mock_cairo(strio)
90
103
  update_pango_layout width height show_pango_layout rounded_rectangle
91
104
  set_line_width stroke fill set_source scale render_rsvg_handle circle
92
105
  triangle line_to operator= show_page clip transform mask rectangle
93
- reset_clip antialias= curve_to matrix=).each do |m|
106
+ reset_clip antialias= curve_to matrix= pango_layout_path stroke_preserve
107
+ fill_preserve close_path).each do |m|
94
108
  allow(cxt).to receive(m) { |*args| strio << scrub_hex("cairo: #{m}(#{args})\n") }
95
109
  end
96
110