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.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/bug_report.md +39 -39
- data/.github/ISSUE_TEMPLATE/feature_request.md +22 -22
- data/.github/ISSUE_TEMPLATE/help-wanted.md +13 -13
- data/.github/ISSUE_TEMPLATE/release-todo.md +45 -33
- data/.github/PULL_REQUEST_TEMPLATE.md +13 -13
- data/.github/workflows/tests.yml +22 -22
- data/.gitignore +41 -41
- data/.vscode/settings.json +4 -3
- data/CHANGELOG.md +460 -460
- data/CONTRIBUTING.md +40 -40
- data/Dockerfile +27 -27
- data/Gemfile +2 -2
- data/Guardfile +8 -8
- data/LICENSE.txt +22 -22
- data/README.md +139 -139
- data/Rakefile +51 -51
- data/bin/squib +5 -5
- data/lib/squib/api/settings.rb +21 -21
- data/lib/squib/args/arg_loader.rb +138 -138
- data/lib/squib/args/box.rb +59 -59
- data/lib/squib/args/card_range.rb +34 -34
- data/lib/squib/args/color_validator.rb +7 -7
- data/lib/squib/args/coords.rb +49 -49
- data/lib/squib/args/csv_opts.rb +22 -22
- data/lib/squib/args/dir_validator.rb +11 -11
- data/lib/squib/args/draw.rb +93 -93
- data/lib/squib/args/drop_shadow.rb +39 -39
- data/lib/squib/args/embed_adjust.rb +22 -22
- data/lib/squib/args/embed_key.rb +12 -12
- data/lib/squib/args/hand_special.rb +37 -37
- data/lib/squib/args/import.rb +67 -67
- data/lib/squib/args/input_file.rb +55 -55
- data/lib/squib/args/paint.rb +43 -43
- data/lib/squib/args/paragraph.rb +118 -118
- data/lib/squib/args/save_batch.rb +65 -65
- data/lib/squib/args/scale_box.rb +57 -57
- data/lib/squib/args/sheet.rb +165 -165
- data/lib/squib/args/showcase_special.rb +41 -41
- data/lib/squib/args/sprue_file.rb +44 -44
- data/lib/squib/args/svg_special.rb +37 -37
- data/lib/squib/args/transform.rb +55 -55
- data/lib/squib/args/typographer.rb +115 -115
- data/lib/squib/args/unit_conversion.rb +27 -27
- data/lib/squib/args/xywh_shorthands.rb +50 -50
- data/lib/squib/builtin/layouts/economy.yml +85 -85
- data/lib/squib/builtin/layouts/fantasy.yml +101 -101
- data/lib/squib/builtin/layouts/hand.yml +62 -62
- data/lib/squib/builtin/layouts/party.yml +94 -94
- data/lib/squib/builtin/layouts/playing-card.yml +35 -35
- data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
- data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
- data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
- data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
- data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
- data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
- data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
- data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
- data/lib/squib/builtin/projects/advanced/config.yml +49 -49
- data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
- data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
- data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
- data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
- data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
- data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
- data/lib/squib/builtin/projects/basic/.gitignore +4 -4
- data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
- data/lib/squib/builtin/projects/basic/Gemfile +3 -3
- data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
- data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
- data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
- data/lib/squib/builtin/projects/basic/RULES.md +21 -21
- data/lib/squib/builtin/projects/basic/Rakefile +7 -7
- data/lib/squib/builtin/projects/basic/config.yml +50 -50
- data/lib/squib/builtin/projects/basic/deck.rb +6 -6
- data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
- data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
- data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
- data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
- data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -10
- data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
- data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
- data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -68
- data/lib/squib/card.rb +75 -75
- data/lib/squib/commands/cli.rb +39 -39
- data/lib/squib/commands/data/template_option.rb +109 -109
- data/lib/squib/commands/make_sprue.rb +277 -277
- data/lib/squib/commands/new.rb +77 -77
- data/lib/squib/conf.rb +149 -149
- data/lib/squib/constants.rb +17 -17
- data/lib/squib/deck.rb +138 -138
- data/lib/squib/dsl/background.rb +35 -35
- data/lib/squib/dsl/circle.rb +39 -39
- data/lib/squib/dsl/csv.rb +42 -42
- data/lib/squib/dsl/curve.rb +35 -35
- data/lib/squib/dsl/cut_zone.rb +47 -47
- data/lib/squib/dsl/ellipse.rb +37 -37
- data/lib/squib/dsl/grid.rb +35 -35
- data/lib/squib/dsl/groups.rb +54 -54
- data/lib/squib/dsl/hand.rb +42 -42
- data/lib/squib/dsl/line.rb +35 -35
- data/lib/squib/dsl/png.rb +57 -57
- data/lib/squib/dsl/polygon.rb +36 -36
- data/lib/squib/dsl/rect.rb +37 -37
- data/lib/squib/dsl/safe_zone.rb +48 -48
- data/lib/squib/dsl/save.rb +21 -21
- data/lib/squib/dsl/save_pdf.rb +50 -50
- data/lib/squib/dsl/save_png.rb +48 -48
- data/lib/squib/dsl/save_sheet.rb +53 -53
- data/lib/squib/dsl/showcase.rb +43 -43
- data/lib/squib/dsl/star.rb +37 -37
- data/lib/squib/dsl/svg.rb +63 -63
- data/lib/squib/dsl/text.rb +54 -54
- data/lib/squib/dsl/text_embed.rb +79 -79
- data/lib/squib/dsl/triangle.rb +35 -35
- data/lib/squib/dsl/units.rb +37 -37
- data/lib/squib/dsl/xlsx.rb +40 -40
- data/lib/squib/dsl/yaml.rb +40 -40
- data/lib/squib/errors_warnings/warn_unexpected_params.rb +14 -14
- data/lib/squib/graphics/background.rb +14 -14
- data/lib/squib/graphics/cairo_context_wrapper.rb +115 -115
- data/lib/squib/graphics/embedding_utils.rb +28 -28
- data/lib/squib/graphics/gradient_regex.rb +47 -47
- data/lib/squib/graphics/hand.rb +42 -42
- data/lib/squib/graphics/image.rb +123 -123
- data/lib/squib/graphics/save_doc.rb +77 -77
- data/lib/squib/graphics/save_images.rb +91 -91
- data/lib/squib/graphics/save_pdf.rb +90 -90
- data/lib/squib/graphics/save_sprue.rb +231 -231
- data/lib/squib/graphics/shapes.rb +143 -143
- data/lib/squib/graphics/showcase.rb +85 -85
- data/lib/squib/graphics/text.rb +202 -202
- data/lib/squib/import/csv_importer.rb +45 -45
- data/lib/squib/import/data_frame.rb +108 -108
- data/lib/squib/import/quantity_exploder.rb +17 -17
- data/lib/squib/import/xlsx_importer.rb +28 -28
- data/lib/squib/import/yaml_importer.rb +30 -30
- data/lib/squib/layout_parser.rb +155 -155
- data/lib/squib/progress.rb +38 -38
- data/lib/squib/sample_helpers.rb +34 -34
- data/lib/squib/sprues/crop_line.rb +28 -28
- data/lib/squib/sprues/crop_line_dash.rb +35 -35
- data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
- data/lib/squib/sprues/sprue.rb +208 -208
- data/lib/squib/sprues/sprue_schema.rb +51 -51
- data/lib/squib/system_fonts.rb +16 -16
- data/lib/squib/version.rb +11 -11
- data/lib/squib.rb +35 -35
- data/samples/autoscale_font/_autoscale_font.rb +98 -98
- data/samples/backend/_backend.rb +26 -26
- data/samples/basic.rb +19 -19
- data/samples/build_groups/build_groups.rb +36 -36
- data/samples/colors/_colors.rb +44 -44
- data/samples/colors/_gradients.rb +34 -34
- data/samples/colors/_switch_color.rb +33 -33
- data/samples/config/config_text_markup.rb +20 -20
- data/samples/config/custom_config.rb +18 -18
- data/samples/data/_csv.rb +33 -33
- data/samples/data/_excel.rb +55 -55
- data/samples/data/_yaml.rb +12 -12
- data/samples/hello_world.rb +6 -6
- data/samples/images/_cairo_access.rb +39 -39
- data/samples/images/_images.rb +104 -104
- data/samples/images/_more_load_images.rb +102 -102
- data/samples/images/_placeholders.rb +48 -48
- data/samples/intro/01_hello.rb +8 -8
- data/samples/intro/02_options.rb +14 -14
- data/samples/intro/03_layout.rb +11 -11
- data/samples/intro/04_arrays.rb +15 -15
- data/samples/intro/05_excel.rb +14 -14
- data/samples/layouts/builtin_layouts.rb +97 -97
- data/samples/layouts/layouts.rb +71 -71
- data/samples/project/src/characters.rb +8 -8
- data/samples/project/src/skills.rb +7 -7
- data/samples/proofs/_tgc_proofs.rb +16 -16
- data/samples/ranges/_ranges.rb +64 -64
- data/samples/saves/_hand.rb +23 -23
- data/samples/saves/_portrait_landscape.rb +23 -23
- data/samples/saves/_save_filenames.rb +28 -28
- data/samples/saves/_save_pdf.rb +29 -29
- data/samples/saves/_saves.rb +75 -75
- data/samples/saves/_showcase.rb +25 -25
- data/samples/shadows/_shadow.rb +71 -71
- data/samples/shapes/_draw_shapes.rb +60 -60
- data/samples/shapes/_proofs.rb +22 -22
- data/samples/sprues/_advanced_sprues.rb +25 -25
- data/samples/sprues/_builtin_sprues.rb +22 -22
- data/samples/sprues/_fold_sheet.rb +30 -30
- data/samples/sprues/_hex_tiles.rb +15 -15
- data/samples/sprues/_mints.rb +11 -11
- data/samples/sprues/_negative_coords.rb +6 -6
- data/samples/sprues/_sprue_example.rb +11 -11
- data/samples/system_font_debug/_list_fonts.rb +14 -14
- data/samples/text/_embed_text.rb +128 -128
- data/samples/text/_text.rb +52 -52
- data/samples/text/_text_options.rb +103 -103
- data/samples/text/bug134.rb +14 -14
- data/samples/units/_cells.rb +50 -50
- data/samples/units/_shorthands.rb +48 -48
- data/samples/units/_units.rb +39 -39
- data/squib.gemspec +58 -58
- 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
|
data/lib/squib/args/box.rb
CHANGED
|
@@ -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
|
data/lib/squib/args/coords.rb
CHANGED
|
@@ -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
|
data/lib/squib/args/csv_opts.rb
CHANGED
|
@@ -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.
|
|
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
|