squib 0.15.3 → 0.16.0.pre.preview1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,15 +1,10 @@
1
1
  require_relative '../constants'
2
2
 
3
+
3
4
  module Squib
4
5
  module Args
5
- # :nodoc:
6
- # @api private
7
6
  module UnitConversion
8
-
9
- # :nodoc:
10
- # @api private
11
- module_function
12
- def parse(arg, dpi=300)
7
+ module_function def parse(arg, dpi=300, cell_px=37.5)
13
8
  case arg.to_s.rstrip
14
9
  when /in$/ # ends with "in"
15
10
  arg.rstrip[0..-2].to_f * dpi
@@ -19,11 +14,14 @@ module Squib
19
14
  arg.rstrip[0..-2].to_f * dpi * INCHES_IN_CM
20
15
  when /mm$/ # ends with "mm"
21
16
  arg.rstrip[0..-2].to_f * dpi * INCHES_IN_CM / 10.0
17
+ when /deg$/ # ends with "deg"
18
+ arg.rstrip[0..-3].to_f * (Math::PI / 180.0)
19
+ when /c(ell)?[s]?$/ # ends with 'c', 'cell', or 'cells'
20
+ arg.sub(/c(ell)?[s]?$/, '').to_f * cell_px
22
21
  else
23
22
  arg
24
23
  end
25
24
  end
26
-
27
25
  end
28
26
  end
29
27
  end
@@ -0,0 +1,56 @@
1
+ require_relative 'unit_conversion'
2
+
3
+ module Squib
4
+ module Args
5
+ module XYWHShorthands
6
+ WIDTH_MINUS_REGEX = /^width\s*\-\s*/
7
+ HEIGHT_MINUS_REGEX = /^height\s*\-\s*/
8
+ WIDTH_DIV_REGEX = /^width\s*\/\s*/
9
+ HEIGHT_DIV_REGEX = /^height\s*\/\s*/
10
+ MIDDLE_PLUS_REGEX = /^middle\s*\+\s*/
11
+ MIDDLE_MINUS_REGEX = /^middle\s*\-\s*/
12
+
13
+
14
+ # dimension is usually either deck_width or deck_height
15
+ def apply_shorthands(arg, deck, axis: :x)
16
+ dimension = (axis == :x) ? deck.width : deck.height
17
+ arg_s = arg.to_s
18
+ case arg_s
19
+ when 'middle'
20
+ dimension / 2.0
21
+ when 'center'
22
+ dimension / 2.0
23
+ when 'deck'
24
+ dimension
25
+ when WIDTH_MINUS_REGEX # e.g. width - 1.5in
26
+ n = arg_s.sub WIDTH_MINUS_REGEX, ''
27
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
28
+ deck.width - n
29
+ when HEIGHT_MINUS_REGEX # e.g. height - 1.5in
30
+ n = arg_s.sub HEIGHT_MINUS_REGEX, ''
31
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
32
+ deck.height - n
33
+ when WIDTH_DIV_REGEX # e.g. width / 3
34
+ n = arg_s.sub WIDTH_DIV_REGEX, ''
35
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
36
+ deck.width / n
37
+ when HEIGHT_DIV_REGEX # e.g. height / 3
38
+ n = arg_s.sub HEIGHT_DIV_REGEX, ''
39
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px).to_f
40
+ deck.height / n
41
+ when MIDDLE_PLUS_REGEX # e.g. middle + 1.5in
42
+ n = arg_s.sub MIDDLE_PLUS_REGEX, ''
43
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
44
+ dimension / 2.0 + n
45
+ when MIDDLE_MINUS_REGEX # e.g. middle - 1.5in
46
+ n = arg_s.sub MIDDLE_MINUS_REGEX, ''
47
+ n = UnitConversion.parse(n, deck.dpi, deck.cell_px)
48
+ dimension / 2.0 - n
49
+ else
50
+ arg
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
@@ -1,8 +1,6 @@
1
1
  # Settings in the config.yml are overriding Squib's defaults. Anything in the main script will override this.
2
2
 
3
- # DPI is used in making PDFs and in unit conversions
4
- # Default: 300
5
- #dpi: 72
3
+ # Looking for DPI? It needs to be a parameter to Squib::Deck.new. See https://squib.readthedocs.io/en/latest/dsl/deck.html
6
4
 
7
5
  #antialias: best #recommended. Only about 10% slower than fast
8
6
  #antialias: default # set the anti-aliasing algorithm. default defers to the underlying graphics device. See http://www.cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t
@@ -47,3 +45,6 @@ warn_ellipsize: true # default
47
45
  # By default, Squib will warn if a PNG is being up-scaled.
48
46
  warn_png_scale: true # default
49
47
  # warn_png_scale: false # turn off entirely
48
+
49
+ # How many pixels are in a "cell"?
50
+ # cell_px: 37.5 # default
@@ -1,8 +1,6 @@
1
1
  # Settings in the config.yml are overriding Squib's defaults. Anything in the main script will override this.
2
2
 
3
- # DPI is used in making PDFs and in unit conversions
4
- # Default: 300
5
- #dpi: 72
3
+ # Looking for DPI? It needs to be a parameter to Squib::Deck.new
6
4
 
7
5
  #antialias: best #recommended. Only about 10% slower than fast
8
6
  #antialias: default # set the anti-aliasing algorithm. default defers to the underlying graphics device. See http://www.cairographics.org/manual/cairo-cairo-t.html#cairo-antialias-t
@@ -47,3 +45,6 @@
47
45
  # By default, Squib will warn if a PNG is being up-scaled.
48
46
  # warn_png_scale: true # default
49
47
  # warn_png_scale: false # turn off entirely
48
+
49
+ # How many pixels are in a "cell"?
50
+ # cell_px: 37.5 # default
@@ -17,6 +17,7 @@ module Squib
17
17
  DEFAULTS = {
18
18
  'antialias' => 'best',
19
19
  'backend' => 'memory',
20
+ 'cell_px' => 37.5,
20
21
  'count_format' => '%02d',
21
22
  'custom_colors' => {},
22
23
  'dir' => '_output',
@@ -89,6 +90,10 @@ module Squib
89
90
  @typographer
90
91
  end
91
92
 
93
+ def cell_px
94
+ @config_hash['cell_px'].to_f
95
+ end
96
+
92
97
  def dir
93
98
  @config_hash['dir']
94
99
  end
@@ -33,7 +33,7 @@ module Squib
33
33
  :img_dir, :prefix, :text_hint, :typographer
34
34
  # :nodoc:
35
35
  # @api private
36
- attr_reader :layout, :conf, :dpi, :font
36
+ attr_reader :layout, :conf, :dpi, :font, :cell_px
37
37
 
38
38
  #
39
39
  # deck.size is really just @cards.size
@@ -63,12 +63,13 @@ module Squib
63
63
  @font = DEFAULT_FONT
64
64
  @cards = []
65
65
  @conf = Conf.load(config)
66
+ @cell_px = @conf.cell_px
66
67
  @progress_bar = Progress.new(@conf.progress_bars) # FIXME this is evil. Using something different with @ and non-@
67
68
  show_info(config, layout)
68
- @width = Args::UnitConversion.parse width, dpi
69
- @height = Args::UnitConversion.parse height, dpi
69
+ @width = Args::UnitConversion.parse width, dpi, @cell_px
70
+ @height = Args::UnitConversion.parse height, dpi, @cell_px
70
71
  cards.times{ |i| @cards << Squib::Card.new(self, @width, @height, i) }
71
- @layout = LayoutParser.new(dpi).load_layout(layout)
72
+ @layout = LayoutParser.new(dpi, @cell_px).load_layout(layout)
72
73
  enable_groups_from_env!
73
74
  if block_given?
74
75
  instance_eval(&block) # here we go. wheeeee!
@@ -102,15 +103,36 @@ module Squib
102
103
  ##################
103
104
  ### PUBLIC API ###
104
105
  ##################
105
- require_relative 'api/background'
106
- require_relative 'api/data'
107
- require_relative 'api/groups'
108
- require_relative 'api/image'
109
- require_relative 'api/save'
110
106
  require_relative 'api/settings'
111
- require_relative 'api/shapes'
112
- require_relative 'api/text'
113
- require_relative 'api/units'
114
107
 
108
+ ###################
109
+ ### DSL METHODS ###
110
+ ###################
111
+ require_relative 'dsl/background'
112
+ require_relative 'dsl/circle'
113
+ require_relative 'dsl/csv'
114
+ require_relative 'dsl/curve'
115
+ require_relative 'dsl/cut_zone'
116
+ require_relative 'dsl/ellipse'
117
+ require_relative 'dsl/grid'
118
+ require_relative 'dsl/groups'
119
+ require_relative 'dsl/hand'
120
+ require_relative 'dsl/line'
121
+ require_relative 'dsl/png'
122
+ require_relative 'dsl/polygon'
123
+ require_relative 'dsl/rect'
124
+ require_relative 'dsl/safe_zone'
125
+ require_relative 'dsl/save_pdf'
126
+ require_relative 'dsl/save_png'
127
+ require_relative 'dsl/save_sheet'
128
+ require_relative 'dsl/save'
129
+ require_relative 'dsl/showcase'
130
+ require_relative 'dsl/star'
131
+ require_relative 'dsl/svg'
132
+ require_relative 'dsl/text'
133
+ require_relative 'dsl/triangle'
134
+ require_relative 'dsl/units'
135
+ require_relative 'dsl/xlsx'
136
+ require_relative 'dsl/yaml'
115
137
  end
116
138
  end
@@ -0,0 +1,35 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def background(opts = {})
6
+ DSL::Background.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Background
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{
22
+ range
23
+ color
24
+ }
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
+ range.each { |i| @deck.cards[i].background(draw.color[i]) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+ require_relative '../args/card_range'
3
+ require_relative '../args/coords'
4
+ require_relative '../args/draw'
5
+
6
+ module Squib
7
+ class Deck
8
+ def circle(opts = {})
9
+ DSL::Circle.new(self, __callee__).run(opts)
10
+ end
11
+ end
12
+
13
+ module DSL
14
+ class Circle
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(x y
25
+ radius arc_start arc_end arc_direction arc_close
26
+ fill_color stroke_color stroke_width stroke_strategy join dash cap
27
+ range layout)
28
+ end
29
+
30
+ def run(opts)
31
+ warn_if_unexpected opts
32
+ range = Args.extract_range opts, deck
33
+ coords = Args.extract_coords opts, deck
34
+ draw = Args.extract_draw opts, deck
35
+ range.each { |i| deck.cards[i].circle(coords[i], draw[i]) }
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,42 @@
1
+ require_relative '../args/import'
2
+ require_relative '../args/csv_opts'
3
+ require_relative '../import/csv_importer'
4
+ require_relative '../errors_warnings/warn_unexpected_params'
5
+
6
+ module Squib
7
+ # DSL method. See http://squib.readthedocs.io
8
+ def csv(opts = {}, &block)
9
+ DSL::Csv.new(__callee__).run(opts, &block)
10
+ end
11
+ module_function :csv
12
+
13
+ class Deck
14
+ # DSL method. See http://squib.readthedocs.io
15
+ def csv(opts = {}, &block)
16
+ DSL::Csv.new(__callee__).run(opts, &block)
17
+ end
18
+ end
19
+
20
+ module DSL
21
+ class Csv
22
+ include WarnUnexpectedParams
23
+ attr_reader :dsl_method, :block
24
+
25
+ def initialize(dsl_method)
26
+ @dsl_method = dsl_method
27
+ end
28
+
29
+ def self.accepted_params
30
+ %i( file data strip explode col_sep quote_char)
31
+ end
32
+
33
+ def run(opts,&block)
34
+ warn_if_unexpected opts
35
+ import_args = Args.extract_import opts
36
+ importer = Squib::Import::CsvImporter.new
37
+ csv_opts = Args::CSV_Opts.new(opts)
38
+ importer.import_to_dataframe(import_args, csv_opts, &block)
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 curve(opts = {})
6
+ DSL::Curve.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Curve
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 cx1 cy1 cx2 cy2
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].curve(coords[i], draw[i]) }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,47 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def cut_zone(opts = {})
6
+ DSL::CutZone.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class CutZone
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
+ cut_defaults = {
30
+ margin: '0.125in',
31
+ radius: '0.125in',
32
+ stroke_color: :red,
33
+ fill_color: '#0000',
34
+ stroke_width: 2.0,
35
+ }
36
+ new_opts = cut_defaults.merge(opts)
37
+ margin = Args::UnitConversion.parse new_opts[:margin], @deck.dpi, @deck.cell_px
38
+ new_opts[:x] = margin
39
+ new_opts[:y] = margin
40
+ new_opts[:width] = deck.width - (2 * margin)
41
+ new_opts[:height] = deck.height - (2 * margin)
42
+ new_opts.delete :margin
43
+ deck.rect new_opts
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,37 @@
1
+ require_relative '../errors_warnings/warn_unexpected_params'
2
+
3
+ module Squib
4
+ class Deck
5
+ def ellipse(opts = {})
6
+ DSL::Ellipse.new(self, __callee__).run(opts)
7
+ end
8
+ end
9
+
10
+ module DSL
11
+ class Ellipse
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
+ angle
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].ellipse(box[i], draw[i], trans[i]) }
34
+ end
35
+ end
36
+ end
37
+ end