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,43 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+ require_relative '../args/card_range'
3
+ require_relative '../args/showcase_special'
4
+ require_relative '../args/sheet'
5
+
6
+ module Squib
7
+ class Deck
8
+ def showcase(opts = {})
9
+ DSL::Showcase.new(self, __callee__).run(opts)
10
+ end
11
+ end
12
+
13
+ module DSL
14
+ class Showcase
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
+ end
22
+
23
+ def self.accepted_params
24
+ %i(
25
+ file dir
26
+ trim trim_radius
27
+ scale offset fill_color
28
+ reflect_offset reflect_strength reflect_percent
29
+ face margin
30
+ range
31
+ )
32
+ end
33
+
34
+ def run(opts)
35
+ warn_if_unexpected opts
36
+ range = Args.extract_range opts, deck
37
+ showcase = Args.extract_showcase_special opts, deck
38
+ sheet = Args.extract_sheet opts, deck, { file: 'showcase.png' }
39
+ deck.render_showcase(range, sheet, showcase)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def star(opts = {})
6
+ DSL::Star.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Star
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
22
+ inner_radius outer_radius angle
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
+ coords = Args.extract_coords opts, deck
32
+ trans = Args.extract_transform opts, deck
33
+ range.each { |i| deck.cards[i].star(coords[i], trans[i], draw[i]) }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,62 @@
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
+ require_relative '../args/svg_special'
8
+
9
+ module Squib
10
+ class Deck
11
+ def svg(opts = {})
12
+ DSL::SVG.new(self, __callee__).run(opts)
13
+ end
14
+ end
15
+
16
+ module DSL
17
+ class SVG
18
+ include WarnUnexpectedParams
19
+ attr_reader :dsl_method, :deck
20
+
21
+ def initialize(deck, dsl_method)
22
+ @deck = deck
23
+ @dsl_method = dsl_method
24
+ end
25
+
26
+ def self.accepted_params
27
+ %i(
28
+ file
29
+ x y width height
30
+ blend mask
31
+ crop_x crop_y crop_width crop_height
32
+ crop_corner_radius crop_corner_x_radius crop_corner_y_radius
33
+ flip_horizontal flip_vertical angle
34
+ id force_id data
35
+ range layout
36
+ )
37
+ end
38
+
39
+ def run(opts)
40
+ warn_if_unexpected opts
41
+ Dir.chdir(deck.img_dir) do
42
+ range = Args.extract_range opts, deck
43
+ paint = Args.extract_paint opts, deck
44
+ box = Args.extract_scale_box opts, deck
45
+ trans = Args.extract_transform opts, deck
46
+ ifile = Args.extract_input_file opts, deck
47
+ svg_args = Args.extract_svg_special opts, deck
48
+ deck.progress_bar.start('Loading PNG(s)', range.size) do |bar|
49
+ range.each do |i|
50
+ if svg_args.render?(i)
51
+ deck.cards[i].svg(ifile[i].file, svg_args[i], box[i], paint[i],
52
+ trans[i])
53
+ end
54
+ bar.increment
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,54 @@
1
+ require_relative '../args/box'
2
+ require_relative '../args/card_range'
3
+ require_relative '../args/draw'
4
+ require_relative '../args/paragraph'
5
+ require_relative '../args/transform'
6
+ require_relative '../dsl/text_embed'
7
+ require_relative '../errors_warnings/warn_unexpected_params'
8
+
9
+ module Squib
10
+ class Deck
11
+ def text(opts = {})
12
+ embed = TextEmbed.new self, __callee__
13
+ yield(embed) if block_given? # store the opts for later use
14
+ DSL::Text.new(self, __callee__, embed).run(opts)
15
+ end
16
+ end
17
+
18
+ module DSL
19
+ class Text
20
+ include WarnUnexpectedParams
21
+ attr_reader :dsl_method, :deck, :embed
22
+
23
+ def initialize(deck, dsl_method, embed)
24
+ @deck = deck
25
+ @dsl_method = dsl_method
26
+ @embed = embed
27
+ end
28
+
29
+ def self.accepted_params
30
+ %i(
31
+ str font font_size x y markup width height
32
+ wrap spacing align justify valign ellipsize angle dash cap join
33
+ hint color fill_color
34
+ stroke_color stroke_width stroke_width stroke_color stroke_strategy
35
+ range layout
36
+ )
37
+ end
38
+
39
+ def run(opts)
40
+ warn_if_unexpected opts
41
+ range = Args.extract_range opts, deck
42
+ para = Args.extract_para opts, deck
43
+ box = Args.extract_box opts, deck, { width: :auto, height: :auto }
44
+ trans = Args.extract_transform opts, deck
45
+ draw = Args.extract_draw opts, deck, { stroke_width: 0.0 }
46
+ extents = Array.new(deck.size)
47
+ range.each do |i|
48
+ extents[i] = deck.cards[i].text(embed, para[i], box[i], trans[i], draw[i], deck.dpi)
49
+ end
50
+ return extents
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,78 @@
1
+ require_relative '../args/box'
2
+ require_relative '../args/card_range'
3
+ require_relative '../args/embed_adjust'
4
+ require_relative '../args/embed_key'
5
+ require_relative '../args/input_file'
6
+ require_relative '../args/paint'
7
+ require_relative '../args/transform'
8
+ require_relative '../errors_warnings/warn_unexpected_params'
9
+
10
+ module Squib
11
+ class TextEmbed
12
+ include WarnUnexpectedParams
13
+ attr_reader :rules, :deck, :dsl_method
14
+
15
+ def initialize(deck, dsl_method)
16
+ @deck = deck
17
+ @rules = {} # store an array of options for later usage
18
+ end
19
+
20
+ def self.accepted_params
21
+ %i(
22
+ key file id force_id layout width height dx dy
23
+ id force_id data
24
+ flip_horizontal flip_vertical
25
+ alpha angle blend mask
26
+ )
27
+ end
28
+
29
+ def svg(opts = {})
30
+ warn_if_unexpected opts
31
+ key = Args::EmbedKey.new.validate_key(opts[:key])
32
+ range = Args.extract_range opts, deck
33
+ paint = Args.extract_paint opts, deck
34
+ box = Args.extract_box opts, deck, { width: :native, height: :native }
35
+ adjust = Args::EmbedAdjust.new.load!(opts, expand_by: deck.size, layout: deck.layout, dpi: deck.dpi)
36
+ trans = Args.extract_transform opts, deck
37
+ ifile = Args.extract_input_file opts, deck
38
+ svg_args = Args.extract_svg_special opts, deck
39
+ rule = { type: :svg, file: ifile, box: box, paint: paint, trans: trans,
40
+ adjust: adjust, svg_args: svg_args }
41
+ rule[:draw] = Proc.new do |card, x, y, scale|
42
+ i = card.index
43
+ b = box[i]
44
+ b.x, b.y = x, y
45
+ b.width = b.width * scale if b.width.is_a? Numeric
46
+ b.height = b.height * scale if b.height.is_a? Numeric
47
+ Dir.chdir(deck.img_dir) do
48
+ card.svg(ifile[i].file, svg_args[i], b, paint[i], trans[i])
49
+ end
50
+ end
51
+ @rules[key] = rule
52
+ end
53
+
54
+ def png(opts = {})
55
+ warn_if_unexpected opts
56
+ key = Args::EmbedKey.new.validate_key(opts[:key])
57
+ range = Args.extract_range opts, deck
58
+ paint = Args.extract_paint opts, deck
59
+ box = Args.extract_box opts, deck, { width: :native, height: :native }
60
+ adjust = Args::EmbedAdjust.new.load!(opts, expand_by: deck.size, layout: deck.layout, dpi: deck.dpi)
61
+ trans = Args.extract_transform opts, deck
62
+ ifile = Args.extract_input_file opts, deck
63
+ rule = { type: :png, file: ifile, box: box, paint: paint, trans: trans, adjust: adjust }
64
+ rule[:draw] = Proc.new do |card, x, y, scale|
65
+ i = card.index
66
+ b = box[i]
67
+ b.x, b.y = x, y
68
+ b.width = b.width * scale if b.width.is_a? Numeric
69
+ b.height = b.height * scale if b.height.is_a? Numeric
70
+ Dir.chdir(deck.img_dir) do
71
+ card.png(ifile[i].file, b, paint[i], trans[i])
72
+ end
73
+ end
74
+ @rules[key] = rule
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,35 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def triangle(opts = {})
6
+ DSL::Triangle.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Triangle
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 x3 y3
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].triangle(coords[i], draw[i]) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -23,5 +23,15 @@ module Squib
23
23
  @dpi * Squib::INCHES_IN_CM * n.to_f / 10.0
24
24
  end
25
25
 
26
+ # DSL method. See http://squib.readthedocs.io
27
+ def deg(n)
28
+ n.to_f * (Math::PI / 180.0)
29
+ end
30
+
31
+ # DSL method. See http://squib.readthedocs.io
32
+ def cells(n)
33
+ n.to_f * @cell_px
34
+ end
35
+
26
36
  end
27
37
  end
@@ -0,0 +1,40 @@
1
+ require_relative '../args/import'
2
+ require_relative '../import/xlsx_importer'
3
+ require_relative '../errors_warnings/warn_unexpected_params'
4
+
5
+ module Squib
6
+ # DSL method. See http://squib.readthedocs.io
7
+ def xlsx(opts = {}, &block)
8
+ DSL::Xlsx.new(__callee__).run(opts, &block)
9
+ end
10
+ module_function :xlsx
11
+
12
+ class Deck
13
+ # DSL method. See http://squib.readthedocs.io
14
+ def xlsx(opts = {}, &block)
15
+ DSL::Xlsx.new(__callee__).run(opts, &block)
16
+ end
17
+ end
18
+
19
+ module DSL
20
+ class Xlsx
21
+ include WarnUnexpectedParams
22
+ attr_reader :dsl_method, :block
23
+
24
+ def initialize(dsl_method)
25
+ @dsl_method = dsl_method
26
+ end
27
+
28
+ def self.accepted_params
29
+ %i( file sheet strip explode )
30
+ end
31
+
32
+ def run(opts,&block)
33
+ warn_if_unexpected opts
34
+ import_args = Args.extract_import opts
35
+ importer = Squib::Import::XlsxImporter.new
36
+ importer.import_to_dataframe(import_args, &block)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require_relative '../args/import'
2
+ require_relative '../import/yaml_importer'
3
+ require_relative '../errors_warnings/warn_unexpected_params'
4
+
5
+ module Squib
6
+ # DSL method. See http://squib.readthedocs.io
7
+ def yaml(opts = {}, &block)
8
+ DSL::Yaml.new(__callee__).run(opts, &block)
9
+ end
10
+ module_function :yaml
11
+
12
+ class Deck
13
+ # DSL method. See http://squib.readthedocs.io
14
+ def yaml(opts = {}, &block)
15
+ DSL::Yaml.new(__callee__).run(opts, &block)
16
+ end
17
+ end
18
+
19
+ module DSL
20
+ class Yaml
21
+ include WarnUnexpectedParams
22
+ attr_reader :dsl_method, :block
23
+
24
+ def initialize(dsl_method)
25
+ @dsl_method = dsl_method
26
+ end
27
+
28
+ def self.accepted_params
29
+ %i( file data explode )
30
+ end
31
+
32
+ def run(opts,&block)
33
+ warn_if_unexpected opts
34
+ import_args = Args.extract_import opts
35
+ importer = Squib::Import::YamlImporter.new
36
+ importer.import_to_dataframe(import_args, &block)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ require 'rainbow/refinement'
2
+
3
+ module Squib::WarnUnexpectedParams
4
+ using Rainbow # we can colorize strings now!
5
+
6
+ def warn_if_unexpected(opts, uplevel: 5)
7
+ accepted_params = self.class.accepted_params
8
+ unexpected = opts.keys - accepted_params
9
+ unexpected.each do |key|
10
+ warn "Unexpected parameter '#{key.to_s.yellow}:' to #{dsl_method.to_s.cyan}(). Accepted parameters: #{accepted_params}",
11
+ uplevel: uplevel
12
+ end
13
+ end
14
+ end
@@ -10,7 +10,7 @@ module Squib
10
10
  else
11
11
  @cairo_surface
12
12
  end
13
- write_png(surface, index, batch.dir, batch.prefix, batch.count_format)
13
+ write_png(surface, index, batch)
14
14
  end
15
15
 
16
16
  # :nodoc:
@@ -44,8 +44,8 @@ module Squib
44
44
  return new_cc.target
45
45
  end
46
46
 
47
- def write_png(surface, i, dir, prefix, count_format)
48
- surface.write_to_png("#{dir}/#{prefix}#{count_format % i}.png")
47
+ def write_png(surface, i, b)
48
+ surface.write_to_png("#{b.dir}/#{b.prefix}#{b.count_format % i}#{b.suffix}.png")
49
49
  end
50
50
 
51
51
  end