squib 0.15.3 → 0.16.0.pre.preview1

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 (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +22 -0
  3. data/CHANGELOG.md +22 -0
  4. data/Dockerfile +18 -16
  5. data/Guardfile +8 -0
  6. data/README.md +3 -9
  7. data/RELEASE TODO.md +1 -0
  8. data/Rakefile +3 -0
  9. data/lib/squib.rb +3 -1
  10. data/lib/squib/args/arg_loader.rb +109 -106
  11. data/lib/squib/args/box.rb +52 -48
  12. data/lib/squib/args/card_range.rb +26 -24
  13. data/lib/squib/args/color_validator.rb +4 -9
  14. data/lib/squib/args/coords.rb +39 -25
  15. data/lib/squib/args/csv_opts.rb +13 -16
  16. data/lib/squib/args/dir_validator.rb +7 -12
  17. data/lib/squib/args/draw.rb +69 -68
  18. data/lib/squib/args/embed_adjust.rb +12 -15
  19. data/lib/squib/args/embed_key.rb +6 -11
  20. data/lib/squib/args/hand_special.rb +25 -25
  21. data/lib/squib/args/import.rb +54 -27
  22. data/lib/squib/args/input_file.rb +22 -26
  23. data/lib/squib/args/paint.rb +30 -31
  24. data/lib/squib/args/paragraph.rb +95 -93
  25. data/lib/squib/args/save_batch.rb +50 -48
  26. data/lib/squib/args/scale_box.rb +43 -39
  27. data/lib/squib/args/sheet.rb +147 -149
  28. data/lib/squib/args/showcase_special.rb +32 -32
  29. data/lib/squib/args/sprue_file.rb +30 -30
  30. data/lib/squib/args/svg_special.rb +26 -26
  31. data/lib/squib/args/transform.rb +48 -54
  32. data/lib/squib/args/typographer.rb +88 -92
  33. data/lib/squib/args/unit_conversion.rb +6 -8
  34. data/lib/squib/args/xywh_shorthands.rb +56 -0
  35. data/lib/squib/builtin/projects/advanced/config.yml +4 -3
  36. data/lib/squib/builtin/projects/basic/config.yml +4 -3
  37. data/lib/squib/conf.rb +5 -0
  38. data/lib/squib/deck.rb +34 -12
  39. data/lib/squib/dsl/background.rb +35 -0
  40. data/lib/squib/dsl/circle.rb +39 -0
  41. data/lib/squib/dsl/csv.rb +42 -0
  42. data/lib/squib/dsl/curve.rb +35 -0
  43. data/lib/squib/dsl/cut_zone.rb +47 -0
  44. data/lib/squib/dsl/ellipse.rb +37 -0
  45. data/lib/squib/dsl/grid.rb +35 -0
  46. data/lib/squib/{api → dsl}/groups.rb +0 -0
  47. data/lib/squib/dsl/hand.rb +42 -0
  48. data/lib/squib/dsl/line.rb +35 -0
  49. data/lib/squib/dsl/png.rb +56 -0
  50. data/lib/squib/dsl/polygon.rb +36 -0
  51. data/lib/squib/dsl/rect.rb +37 -0
  52. data/lib/squib/dsl/safe_zone.rb +48 -0
  53. data/lib/squib/dsl/save.rb +21 -0
  54. data/lib/squib/dsl/save_pdf.rb +50 -0
  55. data/lib/squib/dsl/save_png.rb +47 -0
  56. data/lib/squib/dsl/save_sheet.rb +53 -0
  57. data/lib/squib/dsl/showcase.rb +43 -0
  58. data/lib/squib/dsl/star.rb +37 -0
  59. data/lib/squib/dsl/svg.rb +62 -0
  60. data/lib/squib/dsl/text.rb +54 -0
  61. data/lib/squib/dsl/text_embed.rb +78 -0
  62. data/lib/squib/dsl/triangle.rb +35 -0
  63. data/lib/squib/{api → dsl}/units.rb +10 -0
  64. data/lib/squib/dsl/xlsx.rb +40 -0
  65. data/lib/squib/dsl/yaml.rb +40 -0
  66. data/lib/squib/errors_warnings/warn_unexpected_params.rb +14 -0
  67. data/lib/squib/graphics/save_images.rb +3 -3
  68. data/lib/squib/graphics/save_sprue.rb +14 -2
  69. data/lib/squib/graphics/text.rb +37 -9
  70. data/lib/squib/import/csv_importer.rb +45 -0
  71. data/lib/squib/import/quantity_exploder.rb +18 -0
  72. data/lib/squib/import/xlsx_importer.rb +28 -0
  73. data/lib/squib/import/yaml_importer.rb +30 -0
  74. data/lib/squib/layout_parser.rb +24 -7
  75. data/lib/squib/sprues/crop_line.rb +6 -6
  76. data/lib/squib/sprues/crop_line_dash.rb +6 -6
  77. data/lib/squib/sprues/sprue.rb +16 -14
  78. data/lib/squib/version.rb +1 -1
  79. data/samples/autoscale_font/_autoscale_font.rb +77 -8
  80. data/samples/colors/_switch_color.rb +2 -2
  81. data/samples/data/_excel.rb +1 -1
  82. data/samples/ranges/_ranges.rb +1 -1
  83. data/samples/saves/_save_filenames.rb +4 -0
  84. data/samples/saves/_save_pdf.rb +1 -1
  85. data/samples/saves/_saves.rb +2 -1
  86. data/samples/shapes/_draw_shapes.rb +2 -2
  87. data/samples/sprues/_builtin_sprues.rb +1 -0
  88. data/samples/sprues/_fold_sheet.rb +4 -1
  89. data/samples/text/_text.rb +6 -1
  90. data/samples/text/_text_options.rb +2 -1
  91. data/samples/units/_cells.rb +51 -0
  92. data/samples/units/_shorthands.rb +49 -0
  93. data/samples/units/_units.rb +7 -0
  94. data/squib.gemspec +11 -5
  95. metadata +120 -33
  96. data/.travis.yml +0 -17
  97. data/appveyor.yml +0 -25
  98. data/lib/squib/api/background.rb +0 -15
  99. data/lib/squib/api/data.rb +0 -137
  100. data/lib/squib/api/image.rb +0 -49
  101. data/lib/squib/api/save.rb +0 -83
  102. data/lib/squib/api/shapes.rb +0 -124
  103. data/lib/squib/api/text.rb +0 -25
  104. data/lib/squib/api/text_embed.rb +0 -71
@@ -0,0 +1,35 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def grid(opts = {})
6
+ DSL::Grid.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Grid
12
+ include WarnUnexpectedParams
13
+ attr_reader :dsl_method, :deck
14
+
15
+ def initialize(deck, dsl_method)
16
+ @deck = deck
17
+ @dsl_method = dsl_method
18
+ end
19
+
20
+ def self.accepted_params
21
+ %i(x y width height
22
+ fill_color stroke_color stroke_width stroke_strategy join dash cap
23
+ range layout)
24
+ end
25
+
26
+ def run(opts)
27
+ warn_if_unexpected opts
28
+ range = Args.extract_range opts, deck
29
+ draw = Args.extract_draw opts, deck
30
+ box = Args.extract_box opts, deck
31
+ range.each { |i| deck.cards[i].grid(box[i], draw[i]) }
32
+ end
33
+ end
34
+ end
35
+ end
File without changes
@@ -0,0 +1,42 @@
1
+ require_relative '../args/card_range'
2
+ require_relative '../args/hand_special'
3
+ require_relative '../args/sheet'
4
+ require_relative '../errors_warnings/warn_unexpected_params'
5
+ require_relative '../graphics/hand'
6
+
7
+ module Squib
8
+ class Deck
9
+ def hand(opts = {})
10
+ DSL::Hand.new(self, __callee__).run(opts)
11
+ end
12
+ end
13
+
14
+ module DSL
15
+ class Hand
16
+ include WarnUnexpectedParams
17
+ attr_reader :dsl_method, :deck
18
+
19
+ def initialize(deck, dsl_method)
20
+ @deck = deck
21
+ @dsl_method = dsl_method
22
+ @bar = deck.progress_bar
23
+ end
24
+
25
+ def self.accepted_params
26
+ %i(
27
+ file dir range
28
+ radius angle_range margin fill_color
29
+ trim trim_radius
30
+ )
31
+ end
32
+
33
+ def run(opts)
34
+ warn_if_unexpected opts
35
+ range = Args.extract_range opts, deck
36
+ sheet = Args.extract_sheet opts, deck, {file: 'hand.png'}
37
+ hand = Args.extract_hand_special opts, deck
38
+ deck.render_hand(range, sheet, hand)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def line(opts = {})
6
+ DSL::Line.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Line
12
+ include WarnUnexpectedParams
13
+ attr_reader :dsl_method, :deck
14
+
15
+ def initialize(deck, dsl_method)
16
+ @deck = deck
17
+ @dsl_method = dsl_method
18
+ end
19
+
20
+ def self.accepted_params
21
+ %i(x1 y1 x2 y2
22
+ fill_color stroke_color stroke_width stroke_strategy join dash cap
23
+ range layout)
24
+ end
25
+
26
+ def run(opts)
27
+ warn_if_unexpected opts
28
+ range = Args.extract_range opts, deck
29
+ draw = Args.extract_draw opts, deck
30
+ coords = Args.extract_coords opts, deck
31
+ range.each { |i| deck.cards[i].line(coords[i], draw[i]) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,56 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+ require_relative '../args/card_range'
3
+ require_relative '../args/paint'
4
+ require_relative '../args/scale_box'
5
+ require_relative '../args/transform'
6
+ require_relative '../args/input_file'
7
+
8
+ module Squib
9
+ class Deck
10
+ def png(opts = {})
11
+ DSL::PNG.new(self, __callee__).run(opts)
12
+ end
13
+ end
14
+
15
+ module DSL
16
+ class PNG
17
+ include WarnUnexpectedParams
18
+ attr_reader :dsl_method, :deck
19
+
20
+ def initialize(deck, dsl_method)
21
+ @deck = deck
22
+ @dsl_method = dsl_method
23
+ end
24
+
25
+ def self.accepted_params
26
+ %i(
27
+ file
28
+ x y width height
29
+ alpha blend mask angle
30
+ crop_x crop_y crop_width crop_height
31
+ crop_corner_radius crop_corner_x_radius crop_corner_y_radius
32
+ flip_horizontal flip_vertical
33
+ range layout
34
+ )
35
+ end
36
+
37
+ def run(opts)
38
+ warn_if_unexpected opts
39
+ Dir.chdir(deck.img_dir) do
40
+ range = Args.extract_range opts, deck
41
+ paint = Args.extract_paint opts, deck
42
+ box = Args.extract_scale_box opts, deck
43
+ trans = Args.extract_transform opts, deck
44
+ ifile = Args.extract_input_file opts, deck
45
+ deck.progress_bar.start('Loading PNG(s)', range.size) do |bar|
46
+ range.each do |i|
47
+ deck.cards[i].png(ifile[i].file, box[i], paint[i], trans[i])
48
+ bar.increment
49
+ end
50
+ end
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,36 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def polygon(opts = {})
6
+ DSL::Polygon.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Polygon
12
+ include WarnUnexpectedParams
13
+ attr_reader :dsl_method, :deck
14
+
15
+ def initialize(deck, dsl_method)
16
+ @deck = deck
17
+ @dsl_method = dsl_method
18
+ end
19
+
20
+ def self.accepted_params
21
+ %i(n x y radius angle
22
+ fill_color stroke_color stroke_width stroke_strategy join dash cap
23
+ range layout)
24
+ end
25
+
26
+ def run(opts)
27
+ warn_if_unexpected opts
28
+ range = Args.extract_range opts, deck
29
+ draw = Args.extract_draw opts, deck
30
+ coords = Args.extract_coords opts, deck
31
+ trans = Args.extract_transform opts, deck
32
+ range.each { |i| deck.cards[i].polygon(coords[i], trans[i], draw[i]) }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def rect(opts = {})
6
+ DSL::Rect.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Rect
12
+ include WarnUnexpectedParams
13
+ attr_reader :dsl_method, :deck
14
+
15
+ def initialize(deck, dsl_method)
16
+ @deck = deck
17
+ @dsl_method = dsl_method
18
+ end
19
+
20
+ def self.accepted_params
21
+ %i(x y width height angle
22
+ x_radius y_radius radius
23
+ fill_color stroke_color stroke_width stroke_strategy join dash cap
24
+ range layout)
25
+ end
26
+
27
+ def run(opts)
28
+ warn_if_unexpected opts
29
+ range = Args.extract_range opts, deck
30
+ draw = Args.extract_draw opts, deck
31
+ box = Args.extract_box opts, deck
32
+ trans = Args.extract_transform opts, deck
33
+ range.each { |i| deck.cards[i].rect(box[i], draw[i], trans[i]) }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def safe_zone(opts = {})
6
+ DSL::SafeZone.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class SafeZone
12
+ include WarnUnexpectedParams
13
+ attr_reader :dsl_method, :deck
14
+
15
+ def initialize(deck, dsl_method)
16
+ @deck = deck
17
+ @dsl_method = dsl_method
18
+ end
19
+
20
+ def self.accepted_params
21
+ %i(x y width height margin angle
22
+ x_radius y_radius radius
23
+ fill_color stroke_color stroke_width stroke_strategy join dash cap
24
+ range layout)
25
+ end
26
+
27
+ def run(opts)
28
+ warn_if_unexpected opts
29
+ safe_defaults = {
30
+ margin: '0.25in',
31
+ radius: '0.125in',
32
+ stroke_color: :blue,
33
+ fill_color: '#0000',
34
+ stroke_width: 1.0,
35
+ dash: '3 3',
36
+ }
37
+ new_opts = safe_defaults.merge(opts)
38
+ margin = Args::UnitConversion.parse new_opts[:margin], @deck.dpi, @deck.cell_px
39
+ new_opts[:x] = margin
40
+ new_opts[:y] = margin
41
+ new_opts[:width] = deck.width - (2 * margin)
42
+ new_opts[:height] = deck.height - (2 * margin)
43
+ new_opts.delete :margin
44
+ deck.rect(new_opts)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,21 @@
1
+ require 'rainbow/refinement'
2
+ require_relative 'save_png'
3
+ require_relative 'save_pdf'
4
+
5
+ module Squib
6
+ class Deck
7
+ using Rainbow # we can colorize strings now!
8
+ def save(opts = {})
9
+ fmts = Array(opts[:format])
10
+ warn 'Must specify format :png and/or :pdf' if fmts.empty?
11
+ opts.delete :format # not needed anymore
12
+ save_png(opts) if fmts.include? :png
13
+ save_pdf(opts) if fmts.include? :pdf
14
+ uns = fmts - [:pdf, :png ]
15
+ unless uns.empty?
16
+ warn "Unsupported format(s) #{uns} to #{'save'.cyan}()", uplevel: 1
17
+ end
18
+ self
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+ require_relative '../graphics/save_pdf'
3
+ require_relative '../graphics/save_sprue'
4
+
5
+
6
+ module Squib
7
+ class Deck
8
+ def save_pdf(opts = {})
9
+ DSL::SavePDF.new(self, __callee__).run(opts)
10
+ end
11
+ end
12
+
13
+ module DSL
14
+ class SavePDF
15
+ include WarnUnexpectedParams
16
+ attr_reader :dsl_method, :deck
17
+
18
+ def initialize(deck, dsl_method)
19
+ @deck = deck
20
+ @dsl_method = dsl_method
21
+ @bar = deck.progress_bar
22
+ end
23
+
24
+ def self.accepted_params
25
+ %i(
26
+ file dir sprue
27
+ width height margin gap
28
+ crop_marks crop_stroke_color crop_stroke_dash crop_stroke_width
29
+ crop_margin_bottom crop_margin_left crop_margin_right crop_margin_top
30
+ rtl trim trim_radius
31
+ range
32
+ )
33
+ end
34
+
35
+ def run(opts)
36
+ warn_if_unexpected opts
37
+ range = Args.extract_range opts, deck
38
+ sheet = Args.extract_sheet opts, deck
39
+ sprue_file = Args.extract_sprue_file opts, deck
40
+ if sprue_file.sprue.nil?
41
+ Graphics::SavePDF.new(deck).render_pdf(range, sheet)
42
+ else
43
+ tmpl = Sprue.load sprue_file.sprue, deck.dpi, deck.cell_px
44
+ Graphics::SaveSpruePDF.new(deck, tmpl, sheet).render_sheet(range)
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+
4
+ module Squib
5
+ class Deck
6
+ def save_png(opts = {})
7
+ DSL::SavePNG.new(self, __callee__).run(opts)
8
+ end
9
+ end
10
+
11
+ module DSL
12
+ class SavePNG
13
+ include WarnUnexpectedParams
14
+ attr_reader :dsl_method, :deck
15
+
16
+ def initialize(deck, dsl_method)
17
+ @deck = deck
18
+ @dsl_method = dsl_method
19
+ @bar = deck.progress_bar
20
+ end
21
+
22
+ def self.accepted_params
23
+ %i(
24
+ range
25
+ dir prefix suffix count_format
26
+ rotate trim trim_radius
27
+ )
28
+ end
29
+
30
+ def run(opts)
31
+ warn_if_unexpected opts
32
+ Dir.chdir(deck.img_dir) do
33
+ range = Args.extract_range opts, deck
34
+ batch = Args.extract_save_batch opts, deck
35
+ @bar.start("Saving PNGs to #{batch.summary}", deck.size) do |bar|
36
+ range.map do |i|
37
+ deck.cards[i].save_png(batch[i])
38
+ bar.increment
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,53 @@
1
+ require_relative '../args/card_range'
2
+ require_relative '../args/save_batch'
3
+ require_relative '../args/sheet'
4
+ require_relative '../args/sprue_file'
5
+ require_relative '../errors_warnings/warn_unexpected_params'
6
+ require_relative '../graphics/save_doc'
7
+ require_relative '../graphics/save_sprue'
8
+ require_relative '../sprues/sprue'
9
+
10
+
11
+ module Squib
12
+ class Deck
13
+ def save_sheet(opts = {})
14
+ DSL::SaveSheet.new(self, __callee__).run(opts)
15
+ end
16
+ end
17
+
18
+ module DSL
19
+ class SaveSheet
20
+ include WarnUnexpectedParams
21
+ attr_reader :dsl_method, :deck
22
+
23
+ def initialize(deck, dsl_method)
24
+ @deck = deck
25
+ @dsl_method = dsl_method
26
+ end
27
+
28
+ def self.accepted_params
29
+ %i(
30
+ range sprue
31
+ columns rows rtl
32
+ dir prefix count_format suffix
33
+ margin gap trim trim_radius
34
+ )
35
+ end
36
+
37
+ def run(opts)
38
+ warn_if_unexpected opts
39
+ range = Args.extract_range opts, deck
40
+ batch = Args.extract_save_batch opts, deck
41
+ sheet = Args.extract_sheet opts, deck, { margin: 0 }
42
+ sprue_file = Args.extract_sprue_file opts, deck
43
+ if sprue_file.sprue.nil?
44
+ deck.render_sheet(range, batch, sheet)
45
+ else
46
+ tmpl = Sprue.load sprue_file.sprue, deck.dpi, deck.cell_px
47
+ Graphics::SaveSpruePNG.new(deck, tmpl, sheet).render_sheet(range)
48
+ end
49
+
50
+ end
51
+ end
52
+ end
53
+ end