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,25 +1,25 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class EmbedAdjust
8
- include ArgLoader
9
-
10
- def self.parameters
11
- { dx: 0, dy: 0 }
12
- end
13
-
14
- def self.expanding_parameters
15
- parameters.keys # all of them
16
- end
17
-
18
- def self.params_with_units
19
- parameters.keys # all of them
20
- end
21
-
22
- end
23
-
24
- end
25
- end
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class EmbedAdjust
8
+ include ArgLoader
9
+
10
+ def self.parameters
11
+ { dx: 0, dy: 0 }
12
+ end
13
+
14
+ def self.expanding_parameters
15
+ parameters.keys # all of them
16
+ end
17
+
18
+ def self.params_with_units
19
+ parameters.keys # all of them
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -1,17 +1,17 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class EmbedKey
8
-
9
- # Validate the embed lookup key
10
- def validate_key(str)
11
- str.to_s
12
- end
13
-
14
- end
15
-
16
- end
17
- end
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class EmbedKey
8
+
9
+ # Validate the embed lookup key
10
+ def validate_key(str)
11
+ str.to_s
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+ end
@@ -1,37 +1,37 @@
1
- require 'cairo'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class HandSpecial
8
- include ArgLoader
9
-
10
- def initialize(card_height)
11
- @card_height = card_height
12
- end
13
-
14
- def self.parameters
15
- {
16
- angle_range: (Math::PI / -4.0)..(Math::PI / 4),
17
- radius: :auto
18
- }
19
- end
20
-
21
- def self.expanding_parameters
22
- [] # none of them
23
- end
24
-
25
- def self.params_with_units
26
- [ :radius ]
27
- end
28
-
29
- def validate_radius(arg)
30
- return 0.3 * @card_height if arg.to_s.downcase.strip == 'auto'
31
- arg
32
- end
33
-
34
- end
35
-
36
- end
37
- end
1
+ require 'cairo'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class HandSpecial
8
+ include ArgLoader
9
+
10
+ def initialize(card_height)
11
+ @card_height = card_height
12
+ end
13
+
14
+ def self.parameters
15
+ {
16
+ angle_range: (Math::PI / -4.0)..(Math::PI / 4),
17
+ radius: :auto
18
+ }
19
+ end
20
+
21
+ def self.expanding_parameters
22
+ [] # none of them
23
+ end
24
+
25
+ def self.params_with_units
26
+ [ :radius ]
27
+ end
28
+
29
+ def validate_radius(arg)
30
+ return 0.3 * @card_height if arg.to_s.downcase.strip == 'auto'
31
+ arg
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
@@ -1,40 +1,40 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class Import
8
- include ArgLoader
9
-
10
- def self.parameters
11
- { strip: true,
12
- explode: 'Qty'
13
- }
14
- end
15
-
16
- def self.expanding_parameters
17
- [] # none of them
18
- end
19
-
20
- def self.params_with_units
21
- [] # none of them
22
- end
23
-
24
- def validate_strip(arg)
25
- raise 'Strip must be true or false' unless arg == true || arg == false
26
- arg
27
- end
28
-
29
- def validate_explode(arg)
30
- arg
31
- end
32
-
33
- def strip?
34
- strip
35
- end
36
-
37
- end
38
-
39
- end
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class Import
8
+ include ArgLoader
9
+
10
+ def self.parameters
11
+ { strip: true,
12
+ explode: 'Qty'
13
+ }
14
+ end
15
+
16
+ def self.expanding_parameters
17
+ [] # none of them
18
+ end
19
+
20
+ def self.params_with_units
21
+ [] # none of them
22
+ end
23
+
24
+ def validate_strip(arg)
25
+ raise 'Strip must be true or false' unless arg == true || arg == false
26
+ arg
27
+ end
28
+
29
+ def validate_explode(arg)
30
+ arg
31
+ end
32
+
33
+ def strip?
34
+ strip
35
+ end
36
+
37
+ end
38
+
39
+ end
40
40
  end
@@ -1,37 +1,37 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class InputFile
8
- include ArgLoader
9
-
10
- def initialize(dsl_method_default = {})
11
- @dsl_method_default = dsl_method_default
12
- end
13
-
14
- def self.parameters
15
- { file: nil,
16
- sheet: 0,
17
- }
18
- end
19
-
20
- def self.expanding_parameters
21
- parameters.keys # all of them
22
- end
23
-
24
- def self.params_with_units
25
- [] # none of them
26
- end
27
-
28
- def validate_file(arg, _i)
29
- return nil if arg.nil?
30
- raise "File #{File.expand_path(arg)} does not exist!" unless File.exists?(arg)
31
- File.expand_path(arg)
32
- end
33
-
34
- end
35
-
36
- end
37
- end
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class InputFile
8
+ include ArgLoader
9
+
10
+ def initialize(dsl_method_default = {})
11
+ @dsl_method_default = dsl_method_default
12
+ end
13
+
14
+ def self.parameters
15
+ { file: nil,
16
+ sheet: 0,
17
+ }
18
+ end
19
+
20
+ def self.expanding_parameters
21
+ parameters.keys # all of them
22
+ end
23
+
24
+ def self.params_with_units
25
+ [] # none of them
26
+ end
27
+
28
+ def validate_file(arg, _i)
29
+ return nil if arg.nil?
30
+ raise "File #{File.expand_path(arg)} does not exist!" unless File.exists?(arg)
31
+ File.expand_path(arg)
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
@@ -1,44 +1,44 @@
1
- require 'cairo'
2
- require 'squib/args/arg_loader'
3
- require 'squib/args/color_validator'
4
-
5
- module Squib
6
- # @api private
7
- module Args
8
- class Paint
9
- include ArgLoader
10
- include ColorValidator
11
-
12
- def self.parameters
13
- { alpha: 1.0,
14
- blend: :none,
15
- mask: nil,
16
- }
17
- end
18
-
19
-
20
- def self.expanding_parameters
21
- parameters.keys # all of them are expandable
22
- end
23
-
24
- def self.params_with_units
25
- []
26
- end
27
-
28
- def initialize(custom_colors)
29
- @custom_colors = custom_colors
30
- end
31
-
32
- def validate_alpha(arg, _i)
33
- raise 'alpha must respond to to_f' unless arg.respond_to? :to_f
34
- arg.to_f
35
- end
36
-
37
- def validate_mask(arg, _i)
38
- colorify(arg, @custom_colors)
39
- end
40
-
41
-
42
- end
43
- end
1
+ require 'cairo'
2
+ require 'squib/args/arg_loader'
3
+ require 'squib/args/color_validator'
4
+
5
+ module Squib
6
+ # @api private
7
+ module Args
8
+ class Paint
9
+ include ArgLoader
10
+ include ColorValidator
11
+
12
+ def self.parameters
13
+ { alpha: 1.0,
14
+ blend: :none,
15
+ mask: nil,
16
+ }
17
+ end
18
+
19
+
20
+ def self.expanding_parameters
21
+ parameters.keys # all of them are expandable
22
+ end
23
+
24
+ def self.params_with_units
25
+ []
26
+ end
27
+
28
+ def initialize(custom_colors)
29
+ @custom_colors = custom_colors
30
+ end
31
+
32
+ def validate_alpha(arg, _i)
33
+ raise 'alpha must respond to to_f' unless arg.respond_to? :to_f
34
+ arg.to_f
35
+ end
36
+
37
+ def validate_mask(arg, _i)
38
+ colorify(arg, @custom_colors)
39
+ end
40
+
41
+
42
+ end
43
+ end
44
44
  end
@@ -1,115 +1,116 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class Paragraph
8
- include ArgLoader
9
-
10
-
11
- def self.parameters
12
- { align: :left,
13
- str: 'Hello, World!',
14
- font: :use_set,
15
- font_size: nil,
16
- markup: false,
17
- justify: false,
18
- wrap: true,
19
- ellipsize: :end,
20
- spacing: nil,
21
- valign: :top,
22
- hint: :off
23
- }
24
- end
25
-
26
- def self.expanding_parameters
27
- parameters.keys # all of them
28
- end
29
-
30
- def self.params_with_units
31
- [] # none of them
32
- end
33
-
34
- def initialize(deck_font)
35
- @deck_font = deck_font
36
- end
37
-
38
- def validate_str(arg, _i)
39
- arg.to_s
40
- end
41
-
42
- def validate_font(arg, _i)
43
- arg = @deck_font if arg == :use_set
44
- arg = Squib::SYSTEM_DEFAULTS[:default_font] if arg == :default
45
- arg
46
- end
47
-
48
- def validate_align(arg, _i)
49
- case arg.to_s.downcase.strip
50
- when 'left'
51
- Pango::ALIGN_LEFT
52
- when 'right'
53
- Pango::ALIGN_RIGHT
54
- when 'center'
55
- Pango::ALIGN_CENTER
56
- else
57
- raise ArgumentError, 'align must be one of: center, left, right'
58
- end
59
- end
60
-
61
- def validate_wrap(arg, _i)
62
- case arg.to_s.downcase.strip
63
- when 'word'
64
- Pango::Layout::WRAP_WORD
65
- when 'char', 'false'
66
- Pango::Layout::WRAP_CHAR
67
- when 'word_char', 'true'
68
- Pango::Layout::WRAP_WORD_CHAR
69
- else
70
- raise ArgumentError, 'wrap must be one of: word, char, word_char, true, or false'
71
- end
72
- end
73
-
74
- def validate_ellipsize(arg, _i)
75
- case arg.to_s.downcase.strip
76
- when 'none', 'false'
77
- Pango::Layout::ELLIPSIZE_NONE
78
- when 'start'
79
- Pango::Layout::ELLIPSIZE_START
80
- when 'middle'
81
- Pango::Layout::ELLIPSIZE_MIDDLE
82
- when 'end', 'true'
83
- Pango::Layout::ELLIPSIZE_END
84
- else
85
- raise ArgumentError, 'ellipsize must be one of: none, start, middle, end, true, or false'
86
- end
87
- end
88
-
89
- def validate_justify(arg, _i)
90
- case arg
91
- when nil, true, false
92
- arg
93
- else
94
- raise ArgumentError, 'justify must be one of: nil, true, or false'
95
- end
96
- end
97
-
98
- def validate_spacing(arg, _i)
99
- return nil if arg.nil?
100
- raise ArgumentError, 'spacing must be a number or nil' unless arg.respond_to? :to_f
101
- arg.to_f * Pango::SCALE
102
- end
103
-
104
- def validate_valign(arg, _i)
105
- if %w(top middle bottom).include? arg.to_s.downcase
106
- arg.to_s.downcase
107
- else
108
- raise ArgumentError, 'valign must be one of: top, middle, bottom'
109
- end
110
- end
111
-
112
- end
113
-
114
- end
115
- end
1
+ require 'squib/args/arg_loader'
2
+ require 'squib/constants'
3
+
4
+ module Squib
5
+ # @api private
6
+ module Args
7
+
8
+ class Paragraph
9
+ include ArgLoader
10
+
11
+
12
+ def self.parameters
13
+ { align: :left,
14
+ str: 'Hello, World!',
15
+ font: :use_set,
16
+ font_size: nil,
17
+ markup: false,
18
+ justify: false,
19
+ wrap: true,
20
+ ellipsize: :end,
21
+ spacing: nil,
22
+ valign: :top,
23
+ hint: :off
24
+ }
25
+ end
26
+
27
+ def self.expanding_parameters
28
+ parameters.keys # all of them
29
+ end
30
+
31
+ def self.params_with_units
32
+ [] # none of them
33
+ end
34
+
35
+ def initialize(deck_font)
36
+ @deck_font = deck_font
37
+ end
38
+
39
+ def validate_str(arg, _i)
40
+ arg.to_s
41
+ end
42
+
43
+ def validate_font(arg, _i)
44
+ arg = @deck_font if arg == :use_set
45
+ arg = DEFAULT_FONT if arg == :default
46
+ arg
47
+ end
48
+
49
+ def validate_align(arg, _i)
50
+ case arg.to_s.downcase.strip
51
+ when 'left'
52
+ Pango::ALIGN_LEFT
53
+ when 'right'
54
+ Pango::ALIGN_RIGHT
55
+ when 'center'
56
+ Pango::ALIGN_CENTER
57
+ else
58
+ raise ArgumentError, 'align must be one of: center, left, right'
59
+ end
60
+ end
61
+
62
+ def validate_wrap(arg, _i)
63
+ case arg.to_s.downcase.strip
64
+ when 'word'
65
+ Pango::Layout::WRAP_WORD
66
+ when 'char', 'false'
67
+ Pango::Layout::WRAP_CHAR
68
+ when 'word_char', 'true'
69
+ Pango::Layout::WRAP_WORD_CHAR
70
+ else
71
+ raise ArgumentError, 'wrap must be one of: word, char, word_char, true, or false'
72
+ end
73
+ end
74
+
75
+ def validate_ellipsize(arg, _i)
76
+ case arg.to_s.downcase.strip
77
+ when 'none', 'false'
78
+ Pango::Layout::ELLIPSIZE_NONE
79
+ when 'start'
80
+ Pango::Layout::ELLIPSIZE_START
81
+ when 'middle'
82
+ Pango::Layout::ELLIPSIZE_MIDDLE
83
+ when 'end', 'true'
84
+ Pango::Layout::ELLIPSIZE_END
85
+ else
86
+ raise ArgumentError, 'ellipsize must be one of: none, start, middle, end, true, or false'
87
+ end
88
+ end
89
+
90
+ def validate_justify(arg, _i)
91
+ case arg
92
+ when nil, true, false
93
+ arg
94
+ else
95
+ raise ArgumentError, 'justify must be one of: nil, true, or false'
96
+ end
97
+ end
98
+
99
+ def validate_spacing(arg, _i)
100
+ return nil if arg.nil?
101
+ raise ArgumentError, 'spacing must be a number or nil' unless arg.respond_to? :to_f
102
+ arg.to_f * Pango::SCALE
103
+ end
104
+
105
+ def validate_valign(arg, _i)
106
+ if %w(top middle bottom).include? arg.to_s.downcase
107
+ arg.to_s.downcase
108
+ else
109
+ raise ArgumentError, 'valign must be one of: top, middle, bottom'
110
+ end
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+ end