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,55 +1,55 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class Box
8
- include ArgLoader
9
-
10
- def initialize(deck = nil, dsl_method_defaults = {})
11
- @deck = deck
12
- @dsl_method_defaults = dsl_method_defaults
13
- end
14
-
15
- def self.parameters
16
- { x: 0, y: 0,
17
- width: :deck, height: :deck,
18
- radius: nil, x_radius: 0, y_radius: 0
19
- }
20
- end
21
-
22
- def self.expanding_parameters
23
- parameters.keys # all of them
24
- end
25
-
26
- def self.params_with_units
27
- parameters.keys # all of them
28
- end
29
-
30
- def validate_width(arg, _i)
31
- return arg if @deck.nil?
32
- return @deck.width if arg == :deck
33
- arg
34
- end
35
-
36
- def validate_height(arg, _i)
37
- return arg if @deck.nil?
38
- return @deck.height if arg == :deck
39
- arg
40
- end
41
-
42
- def validate_x_radius(arg, i)
43
- return radius[i] unless radius[i].nil?
44
- arg
45
- end
46
-
47
- def validate_y_radius(arg, i)
48
- return radius[i] unless radius[i].nil?
49
- arg
50
- end
51
-
52
- end
53
-
54
- end
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class Box
8
+ include ArgLoader
9
+
10
+ def initialize(deck = nil, dsl_method_defaults = {})
11
+ @deck = deck
12
+ @dsl_method_defaults = dsl_method_defaults
13
+ end
14
+
15
+ def self.parameters
16
+ { x: 0, y: 0,
17
+ width: :deck, height: :deck,
18
+ radius: nil, x_radius: 0, y_radius: 0
19
+ }
20
+ end
21
+
22
+ def self.expanding_parameters
23
+ parameters.keys # all of them
24
+ end
25
+
26
+ def self.params_with_units
27
+ parameters.keys # all of them
28
+ end
29
+
30
+ def validate_width(arg, _i)
31
+ return arg if @deck.nil?
32
+ return @deck.width if arg == :deck
33
+ arg
34
+ end
35
+
36
+ def validate_height(arg, _i)
37
+ return arg if @deck.nil?
38
+ return @deck.height if arg == :deck
39
+ arg
40
+ end
41
+
42
+ def validate_x_radius(arg, i)
43
+ return radius[i] unless radius[i].nil?
44
+ arg
45
+ end
46
+
47
+ def validate_y_radius(arg, i)
48
+ return radius[i] unless radius[i].nil?
49
+ arg
50
+ end
51
+
52
+ end
53
+
54
+ end
55
55
  end
@@ -1,32 +1,32 @@
1
- module Squib
2
- # @api private
3
- module Args
4
- class CardRange
5
- include Enumerable
6
-
7
- def initialize(input, deck_size: 1)
8
- @range = validate(input, deck_size)
9
- end
10
-
11
- # Hook into enumerable by delegating to @range
12
- def each(&block)
13
- @range.each { |i| block.call(i) }
14
- end
15
-
16
- def size
17
- @range.size
18
- end
19
-
20
- private
21
- def validate(input, deck_size)
22
- input ||= :all # default
23
- input = 0..(deck_size - 1) if input == :all
24
- input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
25
- raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
26
- raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size-1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
27
- input
28
- end
29
-
30
- end
31
- end
32
- end
1
+ module Squib
2
+ # @api private
3
+ module Args
4
+ class CardRange
5
+ include Enumerable
6
+
7
+ def initialize(input, deck_size: 1)
8
+ @range = validate(input, deck_size)
9
+ end
10
+
11
+ # Hook into enumerable by delegating to @range
12
+ def each(&block)
13
+ @range.each { |i| block.call(i) }
14
+ end
15
+
16
+ def size
17
+ @range.size
18
+ end
19
+
20
+ private
21
+ def validate(input, deck_size)
22
+ input ||= :all # default
23
+ input = 0..(deck_size - 1) if input == :all
24
+ input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
25
+ raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
26
+ raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size-1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
27
+ input
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -1,12 +1,12 @@
1
- module Squib
2
- #@api private
3
- module Args
4
- module ColorValidator
5
-
6
- def colorify(color, custom_colors = {})
7
- custom_colors[color.to_s] || color.to_s
8
- end
9
-
10
- end
11
- end
1
+ module Squib
2
+ #@api private
3
+ module Args
4
+ module ColorValidator
5
+
6
+ def colorify(color, custom_colors = {})
7
+ custom_colors[color.to_s] || color.to_s
8
+ end
9
+
10
+ end
11
+ end
12
12
  end
@@ -1,33 +1,33 @@
1
- require 'squib/args/arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class Coords
8
- include ArgLoader
9
-
10
- def self.parameters
11
- { x: 0, y: 0,
12
- x1: 100, y1: 100,
13
- x2: 150, y2: 150,
14
- x3: 100, y3: 150,
15
- cx1: 0 , cy1: 0,
16
- cx2: 0 , cy2: 0,
17
- inner_radius: 50, outer_radius: 100,
18
- radius: 100,
19
- n: 5, }
20
- end
21
-
22
- def self.expanding_parameters
23
- parameters.keys # all of them
24
- end
25
-
26
- def self.params_with_units
27
- parameters.keys # all of them
28
- end
29
-
30
- end
31
-
32
- end
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class Coords
8
+ include ArgLoader
9
+
10
+ def self.parameters
11
+ { x: 0, y: 0,
12
+ x1: 100, y1: 100,
13
+ x2: 150, y2: 150,
14
+ x3: 100, y3: 150,
15
+ cx1: 0 , cy1: 0,
16
+ cx2: 0 , cy2: 0,
17
+ inner_radius: 50, outer_radius: 100,
18
+ radius: 100,
19
+ n: 5, }
20
+ end
21
+
22
+ def self.expanding_parameters
23
+ parameters.keys # all of them
24
+ end
25
+
26
+ def self.params_with_units
27
+ parameters.keys # all of them
28
+ end
29
+
30
+ end
31
+
32
+ end
33
33
  end
@@ -1,16 +1,16 @@
1
- module Squib
2
- #@api private
3
- module Args
4
- module DirValidator
5
-
6
- def ensure_dir_created(dir)
7
- unless Dir.exists?(dir)
8
- Squib.logger.warn "Dir '#{dir}' does not exist, creating it."
9
- Dir.mkdir dir
10
- end
11
- return dir
12
- end
13
-
14
- end
15
- end
16
- end
1
+ module Squib
2
+ #@api private
3
+ module Args
4
+ module DirValidator
5
+
6
+ def ensure_dir_created(dir)
7
+ unless Dir.exists?(dir)
8
+ Squib.logger.warn "Dir '#{dir}' does not exist, creating it."
9
+ Dir.mkdir dir
10
+ end
11
+ return dir
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -1,92 +1,92 @@
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
-
9
- class Draw
10
- include ArgLoader
11
- include ColorValidator
12
-
13
- def initialize(custom_colors, dsl_method_defaults = {})
14
- @custom_colors = custom_colors
15
- @dsl_method_defaults = dsl_method_defaults
16
- end
17
-
18
- def self.parameters
19
- { color: :black,
20
- fill_color: '#0000',
21
- stroke_color: :black,
22
- stroke_width: 2.0,
23
- stroke_strategy: :fill_first,
24
- join: :miter,
25
- cap: 'butt',
26
- dash: ''
27
- }
28
- end
29
-
30
- def self.expanding_parameters
31
- parameters.keys # all of them are expandable
32
- end
33
-
34
- def self.params_with_units
35
- [:stroke_width]
36
- end
37
-
38
- def validate_join(arg, _i)
39
- case arg.to_s.strip.downcase
40
- when 'miter'
41
- Cairo::LINE_JOIN_MITER
42
- when 'round'
43
- Cairo::LINE_JOIN_ROUND
44
- when 'bevel'
45
- Cairo::LINE_JOIN_BEVEL
46
- end
47
- end
48
-
49
- def validate_cap(arg, _i)
50
- case arg.to_s.strip.downcase
51
- when 'butt'
52
- Cairo::LINE_CAP_BUTT
53
- when 'round'
54
- Cairo::LINE_CAP_ROUND
55
- when 'square'
56
- Cairo::LINE_CAP_SQUARE
57
- end
58
- end
59
-
60
- def validate_dash(arg, _i)
61
- arg.to_s.split.collect do |x|
62
- convert_unit(x, @dpi).to_f
63
- end
64
- end
65
-
66
- def validate_fill_color(arg, _i)
67
- colorify(arg, @custom_colors)
68
- end
69
-
70
- def validate_stroke_color(arg, _i)
71
- colorify(arg, @custom_colors)
72
- end
73
-
74
- def validate_color(arg, _i)
75
- colorify(arg, @custom_colors)
76
- end
77
-
78
- def validate_stroke_strategy(arg, _i)
79
- case arg.to_s.downcase.strip
80
- when 'fill_first'
81
- :fill_first
82
- when 'stroke_first'
83
- :stroke_first
84
- else
85
- raise "Only 'stroke_first' or 'fill_first' allowed"
86
- end
87
- end
88
-
89
- end
90
-
91
- end
92
- 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
+
9
+ class Draw
10
+ include ArgLoader
11
+ include ColorValidator
12
+
13
+ def initialize(custom_colors, dsl_method_defaults = {})
14
+ @custom_colors = custom_colors
15
+ @dsl_method_defaults = dsl_method_defaults
16
+ end
17
+
18
+ def self.parameters
19
+ { color: :black,
20
+ fill_color: '#0000',
21
+ stroke_color: :black,
22
+ stroke_width: 2.0,
23
+ stroke_strategy: :fill_first,
24
+ join: :miter,
25
+ cap: 'butt',
26
+ dash: ''
27
+ }
28
+ end
29
+
30
+ def self.expanding_parameters
31
+ parameters.keys # all of them are expandable
32
+ end
33
+
34
+ def self.params_with_units
35
+ [:stroke_width]
36
+ end
37
+
38
+ def validate_join(arg, _i)
39
+ case arg.to_s.strip.downcase
40
+ when 'miter'
41
+ Cairo::LINE_JOIN_MITER
42
+ when 'round'
43
+ Cairo::LINE_JOIN_ROUND
44
+ when 'bevel'
45
+ Cairo::LINE_JOIN_BEVEL
46
+ end
47
+ end
48
+
49
+ def validate_cap(arg, _i)
50
+ case arg.to_s.strip.downcase
51
+ when 'butt'
52
+ Cairo::LINE_CAP_BUTT
53
+ when 'round'
54
+ Cairo::LINE_CAP_ROUND
55
+ when 'square'
56
+ Cairo::LINE_CAP_SQUARE
57
+ end
58
+ end
59
+
60
+ def validate_dash(arg, _i)
61
+ arg.to_s.split.collect do |x|
62
+ convert_unit(x, @dpi).to_f
63
+ end
64
+ end
65
+
66
+ def validate_fill_color(arg, _i)
67
+ colorify(arg, @custom_colors)
68
+ end
69
+
70
+ def validate_stroke_color(arg, _i)
71
+ colorify(arg, @custom_colors)
72
+ end
73
+
74
+ def validate_color(arg, _i)
75
+ colorify(arg, @custom_colors)
76
+ end
77
+
78
+ def validate_stroke_strategy(arg, _i)
79
+ case arg.to_s.downcase.strip
80
+ when 'fill_first'
81
+ :fill_first
82
+ when 'stroke_first'
83
+ :stroke_first
84
+ else
85
+ raise "Only 'stroke_first' or 'fill_first' allowed"
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+ end