squib 0.18.0 → 0.19.0a

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -39
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +22 -22
  4. data/.github/ISSUE_TEMPLATE/help-wanted.md +13 -13
  5. data/.github/ISSUE_TEMPLATE/release-todo.md +45 -33
  6. data/.github/PULL_REQUEST_TEMPLATE.md +13 -13
  7. data/.github/workflows/tests.yml +22 -22
  8. data/.gitignore +41 -41
  9. data/.vscode/settings.json +4 -3
  10. data/CHANGELOG.md +460 -460
  11. data/CONTRIBUTING.md +40 -40
  12. data/Dockerfile +27 -27
  13. data/Gemfile +2 -2
  14. data/Guardfile +8 -8
  15. data/LICENSE.txt +22 -22
  16. data/README.md +139 -139
  17. data/Rakefile +51 -51
  18. data/bin/squib +5 -5
  19. data/lib/squib/api/settings.rb +21 -21
  20. data/lib/squib/args/arg_loader.rb +138 -138
  21. data/lib/squib/args/box.rb +59 -59
  22. data/lib/squib/args/card_range.rb +34 -34
  23. data/lib/squib/args/color_validator.rb +7 -7
  24. data/lib/squib/args/coords.rb +49 -49
  25. data/lib/squib/args/csv_opts.rb +22 -22
  26. data/lib/squib/args/dir_validator.rb +11 -11
  27. data/lib/squib/args/draw.rb +93 -93
  28. data/lib/squib/args/drop_shadow.rb +39 -39
  29. data/lib/squib/args/embed_adjust.rb +22 -22
  30. data/lib/squib/args/embed_key.rb +12 -12
  31. data/lib/squib/args/hand_special.rb +37 -37
  32. data/lib/squib/args/import.rb +67 -67
  33. data/lib/squib/args/input_file.rb +55 -55
  34. data/lib/squib/args/paint.rb +43 -43
  35. data/lib/squib/args/paragraph.rb +118 -118
  36. data/lib/squib/args/save_batch.rb +65 -65
  37. data/lib/squib/args/scale_box.rb +57 -57
  38. data/lib/squib/args/sheet.rb +165 -165
  39. data/lib/squib/args/showcase_special.rb +41 -41
  40. data/lib/squib/args/sprue_file.rb +44 -44
  41. data/lib/squib/args/svg_special.rb +37 -37
  42. data/lib/squib/args/transform.rb +55 -55
  43. data/lib/squib/args/typographer.rb +115 -115
  44. data/lib/squib/args/unit_conversion.rb +27 -27
  45. data/lib/squib/args/xywh_shorthands.rb +50 -50
  46. data/lib/squib/builtin/layouts/economy.yml +85 -85
  47. data/lib/squib/builtin/layouts/fantasy.yml +101 -101
  48. data/lib/squib/builtin/layouts/hand.yml +62 -62
  49. data/lib/squib/builtin/layouts/party.yml +94 -94
  50. data/lib/squib/builtin/layouts/playing-card.yml +35 -35
  51. data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
  52. data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
  53. data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
  54. data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
  55. data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
  56. data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
  57. data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
  58. data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
  59. data/lib/squib/builtin/projects/advanced/config.yml +49 -49
  60. data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
  61. data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
  62. data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
  63. data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
  64. data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
  65. data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
  66. data/lib/squib/builtin/projects/basic/.gitignore +4 -4
  67. data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
  68. data/lib/squib/builtin/projects/basic/Gemfile +3 -3
  69. data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
  70. data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
  71. data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
  72. data/lib/squib/builtin/projects/basic/RULES.md +21 -21
  73. data/lib/squib/builtin/projects/basic/Rakefile +7 -7
  74. data/lib/squib/builtin/projects/basic/config.yml +50 -50
  75. data/lib/squib/builtin/projects/basic/deck.rb +6 -6
  76. data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
  77. data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
  78. data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
  79. data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
  80. data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -10
  81. data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
  82. data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
  83. data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -68
  84. data/lib/squib/card.rb +75 -75
  85. data/lib/squib/commands/cli.rb +39 -39
  86. data/lib/squib/commands/data/template_option.rb +109 -109
  87. data/lib/squib/commands/make_sprue.rb +277 -277
  88. data/lib/squib/commands/new.rb +77 -77
  89. data/lib/squib/conf.rb +149 -149
  90. data/lib/squib/constants.rb +17 -17
  91. data/lib/squib/deck.rb +138 -138
  92. data/lib/squib/dsl/background.rb +35 -35
  93. data/lib/squib/dsl/circle.rb +39 -39
  94. data/lib/squib/dsl/csv.rb +42 -42
  95. data/lib/squib/dsl/curve.rb +35 -35
  96. data/lib/squib/dsl/cut_zone.rb +47 -47
  97. data/lib/squib/dsl/ellipse.rb +37 -37
  98. data/lib/squib/dsl/grid.rb +35 -35
  99. data/lib/squib/dsl/groups.rb +54 -54
  100. data/lib/squib/dsl/hand.rb +42 -42
  101. data/lib/squib/dsl/line.rb +35 -35
  102. data/lib/squib/dsl/png.rb +57 -57
  103. data/lib/squib/dsl/polygon.rb +36 -36
  104. data/lib/squib/dsl/rect.rb +37 -37
  105. data/lib/squib/dsl/safe_zone.rb +48 -48
  106. data/lib/squib/dsl/save.rb +21 -21
  107. data/lib/squib/dsl/save_pdf.rb +50 -50
  108. data/lib/squib/dsl/save_png.rb +48 -48
  109. data/lib/squib/dsl/save_sheet.rb +53 -53
  110. data/lib/squib/dsl/showcase.rb +43 -43
  111. data/lib/squib/dsl/star.rb +37 -37
  112. data/lib/squib/dsl/svg.rb +63 -63
  113. data/lib/squib/dsl/text.rb +54 -54
  114. data/lib/squib/dsl/text_embed.rb +79 -79
  115. data/lib/squib/dsl/triangle.rb +35 -35
  116. data/lib/squib/dsl/units.rb +37 -37
  117. data/lib/squib/dsl/xlsx.rb +40 -40
  118. data/lib/squib/dsl/yaml.rb +40 -40
  119. data/lib/squib/errors_warnings/warn_unexpected_params.rb +14 -14
  120. data/lib/squib/graphics/background.rb +14 -14
  121. data/lib/squib/graphics/cairo_context_wrapper.rb +115 -115
  122. data/lib/squib/graphics/embedding_utils.rb +28 -28
  123. data/lib/squib/graphics/gradient_regex.rb +47 -47
  124. data/lib/squib/graphics/hand.rb +42 -42
  125. data/lib/squib/graphics/image.rb +123 -123
  126. data/lib/squib/graphics/save_doc.rb +77 -77
  127. data/lib/squib/graphics/save_images.rb +91 -91
  128. data/lib/squib/graphics/save_pdf.rb +90 -90
  129. data/lib/squib/graphics/save_sprue.rb +231 -231
  130. data/lib/squib/graphics/shapes.rb +143 -143
  131. data/lib/squib/graphics/showcase.rb +85 -85
  132. data/lib/squib/graphics/text.rb +202 -202
  133. data/lib/squib/import/csv_importer.rb +45 -45
  134. data/lib/squib/import/data_frame.rb +108 -108
  135. data/lib/squib/import/quantity_exploder.rb +17 -17
  136. data/lib/squib/import/xlsx_importer.rb +28 -28
  137. data/lib/squib/import/yaml_importer.rb +30 -30
  138. data/lib/squib/layout_parser.rb +155 -155
  139. data/lib/squib/progress.rb +38 -38
  140. data/lib/squib/sample_helpers.rb +34 -34
  141. data/lib/squib/sprues/crop_line.rb +28 -28
  142. data/lib/squib/sprues/crop_line_dash.rb +35 -35
  143. data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
  144. data/lib/squib/sprues/sprue.rb +208 -208
  145. data/lib/squib/sprues/sprue_schema.rb +51 -51
  146. data/lib/squib/system_fonts.rb +16 -16
  147. data/lib/squib/version.rb +11 -11
  148. data/lib/squib.rb +35 -35
  149. data/samples/autoscale_font/_autoscale_font.rb +98 -98
  150. data/samples/backend/_backend.rb +26 -26
  151. data/samples/basic.rb +19 -19
  152. data/samples/build_groups/build_groups.rb +36 -36
  153. data/samples/colors/_colors.rb +44 -44
  154. data/samples/colors/_gradients.rb +34 -34
  155. data/samples/colors/_switch_color.rb +33 -33
  156. data/samples/config/config_text_markup.rb +20 -20
  157. data/samples/config/custom_config.rb +18 -18
  158. data/samples/data/_csv.rb +33 -33
  159. data/samples/data/_excel.rb +55 -55
  160. data/samples/data/_yaml.rb +12 -12
  161. data/samples/hello_world.rb +6 -6
  162. data/samples/images/_cairo_access.rb +39 -39
  163. data/samples/images/_images.rb +104 -104
  164. data/samples/images/_more_load_images.rb +102 -102
  165. data/samples/images/_placeholders.rb +48 -48
  166. data/samples/intro/01_hello.rb +8 -8
  167. data/samples/intro/02_options.rb +14 -14
  168. data/samples/intro/03_layout.rb +11 -11
  169. data/samples/intro/04_arrays.rb +15 -15
  170. data/samples/intro/05_excel.rb +14 -14
  171. data/samples/layouts/builtin_layouts.rb +97 -97
  172. data/samples/layouts/layouts.rb +71 -71
  173. data/samples/project/src/characters.rb +8 -8
  174. data/samples/project/src/skills.rb +7 -7
  175. data/samples/proofs/_tgc_proofs.rb +16 -16
  176. data/samples/ranges/_ranges.rb +64 -64
  177. data/samples/saves/_hand.rb +23 -23
  178. data/samples/saves/_portrait_landscape.rb +23 -23
  179. data/samples/saves/_save_filenames.rb +28 -28
  180. data/samples/saves/_save_pdf.rb +29 -29
  181. data/samples/saves/_saves.rb +75 -75
  182. data/samples/saves/_showcase.rb +25 -25
  183. data/samples/shadows/_shadow.rb +71 -71
  184. data/samples/shapes/_draw_shapes.rb +60 -60
  185. data/samples/shapes/_proofs.rb +22 -22
  186. data/samples/sprues/_advanced_sprues.rb +25 -25
  187. data/samples/sprues/_builtin_sprues.rb +22 -22
  188. data/samples/sprues/_fold_sheet.rb +30 -30
  189. data/samples/sprues/_hex_tiles.rb +15 -15
  190. data/samples/sprues/_mints.rb +11 -11
  191. data/samples/sprues/_negative_coords.rb +6 -6
  192. data/samples/sprues/_sprue_example.rb +11 -11
  193. data/samples/system_font_debug/_list_fonts.rb +14 -14
  194. data/samples/text/_embed_text.rb +128 -128
  195. data/samples/text/_text.rb +52 -52
  196. data/samples/text/_text_options.rb +103 -103
  197. data/samples/text/bug134.rb +14 -14
  198. data/samples/units/_cells.rb +50 -50
  199. data/samples/units/_shorthands.rb +48 -48
  200. data/samples/units/_units.rb +39 -39
  201. data/squib.gemspec +58 -58
  202. metadata +21 -21
@@ -1,138 +1,138 @@
1
- require_relative '../constants'
2
- require_relative '../conf'
3
- require 'ostruct'
4
-
5
- # Intended to be used a a mix-in,
6
- # For example use see Box as an example
7
- module Squib::Args::ArgLoader
8
-
9
- # wrapper for compatibility
10
- def extract!(args, deck)
11
- @deck = deck
12
- load!(args,
13
- expand_by: deck.size,
14
- layout: deck.layout,
15
- dpi: deck.dpi,
16
- cell_px: deck.cell_px)
17
- end
18
-
19
- # Main class invoked by the client (i.e. dsl/ methods)
20
- def load!(args, expand_by: 1, layout: {}, dpi: 300, cell_px: 37.5)
21
- @dpi = dpi
22
- @cell_px = cell_px
23
- args[:layout] = prep_layout_args(args[:layout], expand_by: expand_by)
24
- expand_and_set_and_defaultify(args: args, by: expand_by, layout: layout)
25
- validate
26
- convert_units dpi: dpi, cell_px: cell_px
27
- self
28
- end
29
-
30
- def expand_and_set_and_defaultify(args: {}, by: 1, layout: {})
31
- attributes = self.class.parameters.keys
32
- attributes.each do |p|
33
- args[p] = defaultify(p, args, layout)
34
- val = if expandable_singleton?(p, args[p])
35
- [args[p]] * by
36
- else
37
- args[p] # not an expanding parameter
38
- end
39
- instance_variable_set "@#{p}", val
40
- end
41
- self.class.class_eval { attr_reader *(attributes) }
42
- end
43
-
44
- # Must be:
45
- # (a) an expanding parameter, and
46
- # (b) a singleton already (i.e. doesn't respond to :each)
47
- def expandable_singleton?(p, arg)
48
- self.class.expanding_parameters.include?(p) && !arg.respond_to?(:each)
49
- end
50
-
51
- # Incorporate defaults and layouts
52
- # (1) Use whatever is specified if it is
53
- # (2) Go over all layout specifications (if any) and look them up
54
- # - Use layout when it's specified for that card
55
- # - Use "default" if no layout was specified, or the layout itself did not specify
56
- # Defaut can be overriden for a given dsl method (@dsl_method_defaults)
57
- # (e.g stroke width is 0.0 for text, non-zero everywhere else)
58
- #
59
- def defaultify(p, args, layout)
60
- return args[p] if args.key? p # arg was specified, no defaults used
61
- defaults = self.class.parameters.merge(@dsl_method_defaults || {})
62
- args[:layout].map do |layout_arg|
63
- return defaults[p] if layout_arg.nil? # no layout specified, use default
64
- unless layout.key? layout_arg.to_s # specified a layout, but it doesn't exist in layout. Oops!
65
- Squib.logger.warn("Layout \"#{layout_arg.to_s}\" does not exist in layout file - using default instead")
66
- return defaults[p]
67
- end
68
- if layout[layout_arg.to_s].key?(p.to_s)
69
- layout[layout_arg.to_s][p.to_s] # param specified in layout
70
- else
71
- defaults[p] # layout specified, but not this param
72
- end
73
- end
74
- end
75
-
76
- # Do singleton expansion on the layout argument as well
77
- # Treated differently since layout is not always specified
78
- def prep_layout_args(layout_args, expand_by: 1)
79
- unless layout_args.respond_to?(:each)
80
- layout_args = [layout_args] * expand_by
81
- end
82
- layout_args || []
83
- end
84
-
85
- # For each parameter/attribute foo we try to invoke a validate_foo
86
- def validate
87
- self.class.parameters.each do |param, default|
88
- method = "validate_#{param}"
89
- if self.respond_to? method
90
- attribute = "@#{param}"
91
- val = instance_variable_get(attribute)
92
- if val.respond_to? :each
93
- new_val = val.map.with_index{ |v, i| send(method, v, i) }
94
- instance_variable_set(attribute, new_val)
95
- else
96
- instance_variable_set(attribute, send(method, val))
97
- end
98
- end
99
- end
100
- end
101
-
102
- # Access an individual arg for a given card
103
- # @return an OpenStruct that looks just like the mixed-in class
104
- # @api private
105
- def [](i)
106
- card_arg = OpenStruct.new
107
- self.class.expanding_parameters.each do |p|
108
- p_val = instance_variable_get("@#{p}")
109
- card_arg[p] = p_val[i]
110
- end
111
- card_arg
112
- end
113
-
114
- # Convert units
115
- def convert_units(dpi: 300, cell_px: 37.5)
116
- self.class.params_with_units.each do |p|
117
- p_str = "@#{p}"
118
- p_val = instance_variable_get(p_str)
119
- if p_val.respond_to? :each
120
- arr = p_val.map { |x| Squib::Args::UnitConversion.parse(x, dpi, cell_px) }
121
- instance_variable_set p_str, arr
122
- else
123
- instance_variable_set p_str, Squib::Args::UnitConversion.parse(p_val, dpi, cell_px)
124
- end
125
- end
126
- self
127
- end
128
-
129
- # Return the deck's configuration
130
- # This keeps the @deck local to this mixin instead of forcing args classes
131
- # to "know" that @deck works.
132
- #
133
- # It also makes unit testing easier. Sue me.
134
- def deck_conf
135
- @deck.conf
136
- end
137
-
138
- end
1
+ require_relative '../constants'
2
+ require_relative '../conf'
3
+ require 'ostruct'
4
+
5
+ # Intended to be used a a mix-in,
6
+ # For example use see Box as an example
7
+ module Squib::Args::ArgLoader
8
+
9
+ # wrapper for compatibility
10
+ def extract!(args, deck)
11
+ @deck = deck
12
+ load!(args,
13
+ expand_by: deck.size,
14
+ layout: deck.layout,
15
+ dpi: deck.dpi,
16
+ cell_px: deck.cell_px)
17
+ end
18
+
19
+ # Main class invoked by the client (i.e. dsl/ methods)
20
+ def load!(args, expand_by: 1, layout: {}, dpi: 300, cell_px: 37.5)
21
+ @dpi = dpi
22
+ @cell_px = cell_px
23
+ args[:layout] = prep_layout_args(args[:layout], expand_by: expand_by)
24
+ expand_and_set_and_defaultify(args: args, by: expand_by, layout: layout)
25
+ validate
26
+ convert_units dpi: dpi, cell_px: cell_px
27
+ self
28
+ end
29
+
30
+ def expand_and_set_and_defaultify(args: {}, by: 1, layout: {})
31
+ attributes = self.class.parameters.keys
32
+ attributes.each do |p|
33
+ args[p] = defaultify(p, args, layout)
34
+ val = if expandable_singleton?(p, args[p])
35
+ [args[p]] * by
36
+ else
37
+ args[p] # not an expanding parameter
38
+ end
39
+ instance_variable_set "@#{p}", val
40
+ end
41
+ self.class.class_eval { attr_reader *(attributes) }
42
+ end
43
+
44
+ # Must be:
45
+ # (a) an expanding parameter, and
46
+ # (b) a singleton already (i.e. doesn't respond to :each)
47
+ def expandable_singleton?(p, arg)
48
+ self.class.expanding_parameters.include?(p) && !arg.respond_to?(:each)
49
+ end
50
+
51
+ # Incorporate defaults and layouts
52
+ # (1) Use whatever is specified if it is
53
+ # (2) Go over all layout specifications (if any) and look them up
54
+ # - Use layout when it's specified for that card
55
+ # - Use "default" if no layout was specified, or the layout itself did not specify
56
+ # Defaut can be overriden for a given dsl method (@dsl_method_defaults)
57
+ # (e.g stroke width is 0.0 for text, non-zero everywhere else)
58
+ #
59
+ def defaultify(p, args, layout)
60
+ return args[p] if args.key? p # arg was specified, no defaults used
61
+ defaults = self.class.parameters.merge(@dsl_method_defaults || {})
62
+ args[:layout].map do |layout_arg|
63
+ return defaults[p] if layout_arg.nil? # no layout specified, use default
64
+ unless layout.key? layout_arg.to_s # specified a layout, but it doesn't exist in layout. Oops!
65
+ Squib.logger.warn("Layout \"#{layout_arg.to_s}\" does not exist in layout file - using default instead")
66
+ return defaults[p]
67
+ end
68
+ if layout[layout_arg.to_s].key?(p.to_s)
69
+ layout[layout_arg.to_s][p.to_s] # param specified in layout
70
+ else
71
+ defaults[p] # layout specified, but not this param
72
+ end
73
+ end
74
+ end
75
+
76
+ # Do singleton expansion on the layout argument as well
77
+ # Treated differently since layout is not always specified
78
+ def prep_layout_args(layout_args, expand_by: 1)
79
+ unless layout_args.respond_to?(:each)
80
+ layout_args = [layout_args] * expand_by
81
+ end
82
+ layout_args || []
83
+ end
84
+
85
+ # For each parameter/attribute foo we try to invoke a validate_foo
86
+ def validate
87
+ self.class.parameters.each do |param, default|
88
+ method = "validate_#{param}"
89
+ if self.respond_to? method
90
+ attribute = "@#{param}"
91
+ val = instance_variable_get(attribute)
92
+ if val.respond_to? :each
93
+ new_val = val.map.with_index{ |v, i| send(method, v, i) }
94
+ instance_variable_set(attribute, new_val)
95
+ else
96
+ instance_variable_set(attribute, send(method, val))
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ # Access an individual arg for a given card
103
+ # @return an OpenStruct that looks just like the mixed-in class
104
+ # @api private
105
+ def [](i)
106
+ card_arg = OpenStruct.new
107
+ self.class.expanding_parameters.each do |p|
108
+ p_val = instance_variable_get("@#{p}")
109
+ card_arg[p] = p_val[i]
110
+ end
111
+ card_arg
112
+ end
113
+
114
+ # Convert units
115
+ def convert_units(dpi: 300, cell_px: 37.5)
116
+ self.class.params_with_units.each do |p|
117
+ p_str = "@#{p}"
118
+ p_val = instance_variable_get(p_str)
119
+ if p_val.respond_to? :each
120
+ arr = p_val.map { |x| Squib::Args::UnitConversion.parse(x, dpi, cell_px) }
121
+ instance_variable_set p_str, arr
122
+ else
123
+ instance_variable_set p_str, Squib::Args::UnitConversion.parse(p_val, dpi, cell_px)
124
+ end
125
+ end
126
+ self
127
+ end
128
+
129
+ # Return the deck's configuration
130
+ # This keeps the @deck local to this mixin instead of forcing args classes
131
+ # to "know" that @deck works.
132
+ #
133
+ # It also makes unit testing easier. Sue me.
134
+ def deck_conf
135
+ @deck.conf
136
+ end
137
+
138
+ end
@@ -1,59 +1,59 @@
1
- require_relative 'arg_loader'
2
- require_relative 'xywh_shorthands'
3
-
4
- module Squib::Args
5
-
6
- module_function def extract_box(opts, deck, dsl_method_defaults = {})
7
- Box.new(deck, dsl_method_defaults).extract!(opts, deck)
8
- end
9
-
10
- class Box
11
- include ArgLoader
12
- include XYWHShorthands
13
-
14
- def initialize(deck = nil, dsl_method_defaults = {})
15
- @deck = deck
16
- @dsl_method_defaults = dsl_method_defaults
17
- end
18
-
19
- def self.parameters
20
- { x: 0, y: 0,
21
- width: :deck, height: :deck,
22
- radius: nil, x_radius: 0, y_radius: 0
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
- parameters.keys # all of them
32
- end
33
-
34
- def validate_x(arg, i) apply_shorthands(arg, @deck, axis: :x) end
35
- def validate_y(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
36
-
37
- def validate_width(arg, _i)
38
- return arg if @deck.nil?
39
- apply_shorthands(arg, @deck, axis: :x)
40
- end
41
-
42
- def validate_height(arg, _i)
43
- return arg if @deck.nil?
44
- apply_shorthands(arg, @deck, axis: :y)
45
- end
46
-
47
- def validate_x_radius(arg, i)
48
- return radius[i] unless radius[i].nil?
49
- arg
50
- end
51
-
52
- def validate_y_radius(arg, i)
53
- return radius[i] unless radius[i].nil?
54
- arg
55
- end
56
-
57
- end
58
-
59
- end
1
+ require_relative 'arg_loader'
2
+ require_relative 'xywh_shorthands'
3
+
4
+ module Squib::Args
5
+
6
+ module_function def extract_box(opts, deck, dsl_method_defaults = {})
7
+ Box.new(deck, dsl_method_defaults).extract!(opts, deck)
8
+ end
9
+
10
+ class Box
11
+ include ArgLoader
12
+ include XYWHShorthands
13
+
14
+ def initialize(deck = nil, dsl_method_defaults = {})
15
+ @deck = deck
16
+ @dsl_method_defaults = dsl_method_defaults
17
+ end
18
+
19
+ def self.parameters
20
+ { x: 0, y: 0,
21
+ width: :deck, height: :deck,
22
+ radius: nil, x_radius: 0, y_radius: 0
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
+ parameters.keys # all of them
32
+ end
33
+
34
+ def validate_x(arg, i) apply_shorthands(arg, @deck, axis: :x) end
35
+ def validate_y(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
36
+
37
+ def validate_width(arg, _i)
38
+ return arg if @deck.nil?
39
+ apply_shorthands(arg, @deck, axis: :x)
40
+ end
41
+
42
+ def validate_height(arg, _i)
43
+ return arg if @deck.nil?
44
+ apply_shorthands(arg, @deck, axis: :y)
45
+ end
46
+
47
+ def validate_x_radius(arg, i)
48
+ return radius[i] unless radius[i].nil?
49
+ arg
50
+ end
51
+
52
+ def validate_y_radius(arg, i)
53
+ return radius[i] unless radius[i].nil?
54
+ arg
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -1,34 +1,34 @@
1
- module Squib::Args
2
-
3
- module_function def extract_range(opts, deck)
4
- CardRange.new(opts[:range], deck_size: deck.size)
5
- end
6
-
7
- class CardRange
8
- include Enumerable
9
-
10
- def initialize(input, deck_size: 1)
11
- @range = validate(input, deck_size)
12
- end
13
-
14
- # Hook into enumerable by delegating to @range
15
- def each(&block)
16
- @range.each { |i| block.call(i) }
17
- end
18
-
19
- def size
20
- @range.size
21
- end
22
-
23
- private
24
- def validate(input, deck_size)
25
- input ||= :all # default
26
- input = 0..(deck_size - 1) if input == :all
27
- input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
28
- raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
29
- raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size - 1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
30
- input
31
- end
32
-
33
- end
34
- end
1
+ module Squib::Args
2
+
3
+ module_function def extract_range(opts, deck)
4
+ CardRange.new(opts[:range], deck_size: deck.size)
5
+ end
6
+
7
+ class CardRange
8
+ include Enumerable
9
+
10
+ def initialize(input, deck_size: 1)
11
+ @range = validate(input, deck_size)
12
+ end
13
+
14
+ # Hook into enumerable by delegating to @range
15
+ def each(&block)
16
+ @range.each { |i| block.call(i) }
17
+ end
18
+
19
+ def size
20
+ @range.size
21
+ end
22
+
23
+ private
24
+ def validate(input, deck_size)
25
+ input ||= :all # default
26
+ input = 0..(deck_size - 1) if input == :all
27
+ input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
28
+ raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
29
+ raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size - 1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
30
+ input
31
+ end
32
+
33
+ end
34
+ end
@@ -1,7 +1,7 @@
1
- module Squib::Args::ColorValidator
2
-
3
- def colorify(color, custom_colors = {})
4
- custom_colors[color.to_s] || color.to_s
5
- end
6
-
7
- end
1
+ module Squib::Args::ColorValidator
2
+
3
+ def colorify(color, custom_colors = {})
4
+ custom_colors[color.to_s] || color.to_s
5
+ end
6
+
7
+ end
@@ -1,49 +1,49 @@
1
- require_relative 'arg_loader'
2
- require_relative 'xywh_shorthands'
3
-
4
- module Squib::Args
5
- module_function def extract_coords(opts, deck)
6
- Coords.new.extract!(opts, deck)
7
- end
8
-
9
- class Coords
10
- include ArgLoader
11
- include XYWHShorthands
12
-
13
- def self.parameters
14
- { x: 0, y: 0,
15
- x1: 100, y1: 100,
16
- x2: 150, y2: 150,
17
- x3: 100, y3: 150,
18
- cx1: 0 , cy1: 0,
19
- cx2: 0 , cy2: 0,
20
- inner_radius: 50, outer_radius: 100,
21
- radius: 100,
22
- n: 5,
23
- arc_start: 0, arc_end: 2 * Math::PI, arc_direction: :clockwise, arc_close: false,
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
- parameters.keys # all of them
33
- end
34
-
35
- def validate_x(arg, i) apply_shorthands(arg, @deck, axis: :x) end
36
- def validate_y(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
37
- def validate_x1(arg, i) apply_shorthands(arg, @deck, axis: :x) end
38
- def validate_y1(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
39
- def validate_x2(arg, i) apply_shorthands(arg, @deck, axis: :x) end
40
- def validate_y2(arg,_i) apply_shorthands(arg, @deck, axis: :y)end
41
- def validate_x3(arg, i) apply_shorthands(arg, @deck, axis: :x) end
42
- def validate_y3(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
43
- def validate_cx1(arg, i) apply_shorthands(arg, @deck, axis: :x) end
44
- def validate_cy1(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
45
- def validate_cx2(arg, i) apply_shorthands(arg, @deck, axis: :x) end
46
- def validate_cy2(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
47
- end
48
-
49
- end
1
+ require_relative 'arg_loader'
2
+ require_relative 'xywh_shorthands'
3
+
4
+ module Squib::Args
5
+ module_function def extract_coords(opts, deck)
6
+ Coords.new.extract!(opts, deck)
7
+ end
8
+
9
+ class Coords
10
+ include ArgLoader
11
+ include XYWHShorthands
12
+
13
+ def self.parameters
14
+ { x: 0, y: 0,
15
+ x1: 100, y1: 100,
16
+ x2: 150, y2: 150,
17
+ x3: 100, y3: 150,
18
+ cx1: 0 , cy1: 0,
19
+ cx2: 0 , cy2: 0,
20
+ inner_radius: 50, outer_radius: 100,
21
+ radius: 100,
22
+ n: 5,
23
+ arc_start: 0, arc_end: 2 * Math::PI, arc_direction: :clockwise, arc_close: false,
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
+ parameters.keys # all of them
33
+ end
34
+
35
+ def validate_x(arg, i) apply_shorthands(arg, @deck, axis: :x) end
36
+ def validate_y(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
37
+ def validate_x1(arg, i) apply_shorthands(arg, @deck, axis: :x) end
38
+ def validate_y1(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
39
+ def validate_x2(arg, i) apply_shorthands(arg, @deck, axis: :x) end
40
+ def validate_y2(arg,_i) apply_shorthands(arg, @deck, axis: :y)end
41
+ def validate_x3(arg, i) apply_shorthands(arg, @deck, axis: :x) end
42
+ def validate_y3(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
43
+ def validate_cx1(arg, i) apply_shorthands(arg, @deck, axis: :x) end
44
+ def validate_cy1(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
45
+ def validate_cx2(arg, i) apply_shorthands(arg, @deck, axis: :x) end
46
+ def validate_cy2(arg,_i) apply_shorthands(arg, @deck, axis: :y) end
47
+ end
48
+
49
+ end
@@ -1,22 +1,22 @@
1
- require 'csv'
2
-
3
- module Squib::Args
4
- class CSV_Opts
5
-
6
- def initialize(opts)
7
- opts = opts.keep_if { |k, _v| CSV::DEFAULT_OPTIONS.key? k}
8
- @hash = CSV::DEFAULT_OPTIONS.merge(opts).merge(required)
9
- end
10
-
11
- def to_hash
12
- @hash
13
- end
14
-
15
- private
16
-
17
- def required
18
- { headers: true, converters: :numeric }
19
- end
20
-
21
- end
22
- end
1
+ require 'csv'
2
+
3
+ module Squib::Args
4
+ class CSV_Opts
5
+
6
+ def initialize(opts)
7
+ opts = opts.keep_if { |k, _v| CSV::DEFAULT_OPTIONS.key? k}
8
+ @hash = CSV::DEFAULT_OPTIONS.merge(opts).merge(required)
9
+ end
10
+
11
+ def to_hash
12
+ @hash
13
+ end
14
+
15
+ private
16
+
17
+ def required
18
+ { headers: true, converters: :numeric }
19
+ end
20
+
21
+ end
22
+ end
@@ -1,11 +1,11 @@
1
- module Squib::Args::DirValidator
2
-
3
- def ensure_dir_created(dir)
4
- unless Dir.exists?(dir)
5
- Squib.logger.warn "Dir '#{dir}' does not exist, creating it."
6
- FileUtils.mkdir_p dir
7
- end
8
- return dir
9
- end
10
-
11
- end
1
+ module Squib::Args::DirValidator
2
+
3
+ def ensure_dir_created(dir)
4
+ unless Dir.exist?(dir)
5
+ Squib.logger.warn "Dir '#{dir}' does not exist, creating it."
6
+ FileUtils.mkdir_p dir
7
+ end
8
+ return dir
9
+ end
10
+
11
+ end