squib 0.14.2 → 0.14.3.pre1
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/.gitignore +41 -41
- data/.travis.yml +19 -19
- data/CHANGELOG.md +366 -357
- data/CONTRIBUTING.md +40 -40
- data/Gemfile +2 -2
- data/LICENSE.txt +22 -22
- data/README.md +121 -121
- data/RELEASE TODO.md +21 -21
- data/Rakefile +48 -48
- data/appveyor.yml +24 -24
- data/bin/squib +4 -4
- data/lib/squib.rb +32 -32
- data/lib/squib/api/background.rb +15 -15
- data/lib/squib/api/data.rb +137 -137
- data/lib/squib/api/groups.rb +54 -54
- data/lib/squib/api/image.rb +49 -49
- data/lib/squib/api/save.rb +83 -83
- data/lib/squib/api/settings.rb +21 -21
- data/lib/squib/api/shapes.rb +124 -124
- data/lib/squib/api/text.rb +25 -25
- data/lib/squib/api/text_embed.rb +71 -71
- data/lib/squib/api/units.rb +27 -27
- data/lib/squib/args/arg_loader.rb +126 -126
- data/lib/squib/args/box.rb +55 -55
- data/lib/squib/args/card_range.rb +32 -32
- data/lib/squib/args/color_validator.rb +12 -12
- data/lib/squib/args/coords.rb +35 -35
- data/lib/squib/args/csv_opts.rb +25 -25
- data/lib/squib/args/dir_validator.rb +16 -16
- data/lib/squib/args/draw.rb +92 -92
- data/lib/squib/args/embed_adjust.rb +25 -25
- data/lib/squib/args/embed_key.rb +17 -17
- data/lib/squib/args/hand_special.rb +37 -37
- data/lib/squib/args/import.rb +40 -40
- data/lib/squib/args/input_file.rb +37 -37
- data/lib/squib/args/paint.rb +44 -44
- data/lib/squib/args/paragraph.rb +116 -116
- data/lib/squib/args/save_batch.rb +63 -63
- data/lib/squib/args/scale_box.rb +53 -53
- data/lib/squib/args/sheet.rb +172 -172
- data/lib/squib/args/showcase_special.rb +38 -38
- data/lib/squib/args/sprue_file.rb +44 -44
- data/lib/squib/args/svg_special.rb +37 -37
- data/lib/squib/args/transform.rb +61 -61
- data/lib/squib/args/typographer.rb +119 -119
- data/lib/squib/args/unit_conversion.rb +29 -29
- 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 +53 -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 +53 -49
- 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 +275 -275
- data/lib/squib/commands/new.rb +77 -77
- data/lib/squib/conf.rb +144 -139
- data/lib/squib/constants.rb +17 -17
- data/lib/squib/deck.rb +116 -116
- data/lib/squib/graphics/background.rb +14 -14
- data/lib/squib/graphics/cairo_context_wrapper.rb +113 -113
- 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 +129 -108
- data/lib/squib/graphics/save_doc.rb +61 -61
- data/lib/squib/graphics/save_images.rb +52 -52
- data/lib/squib/graphics/save_pdf.rb +90 -90
- data/lib/squib/graphics/save_sprue.rb +204 -204
- data/lib/squib/graphics/shapes.rb +143 -143
- data/lib/squib/graphics/showcase.rb +85 -85
- data/lib/squib/graphics/text.rb +174 -174
- data/lib/squib/import/data_frame.rb +108 -108
- data/lib/squib/layout_parser.rb +138 -138
- 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 +203 -203
- data/lib/squib/sprues/sprue_schema.rb +48 -48
- data/lib/squib/version.rb +10 -10
- data/samples/autoscale_font/_autoscale_font.rb +29 -29
- data/samples/backend/_backend.rb +26 -26
- data/samples/basic.rb +19 -19
- data/samples/bug256/_bug256.rb +13 -0
- data/samples/build_groups/build_groups.rb +36 -36
- data/samples/colors/_colors.rb +38 -38
- data/samples/colors/_gradients.rb +34 -34
- 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/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_pdf.rb +29 -29
- data/samples/saves/_saves.rb +51 -51
- data/samples/saves/_showcase.rb +25 -25
- data/samples/shapes/_draw_shapes.rb +60 -60
- data/samples/shapes/_proofs.rb +22 -22
- data/samples/sprues/_advanced_sprues.rb +24 -24
- data/samples/sprues/_builtin_sprues.rb +21 -21
- data/samples/sprues/_fold_sheet.rb +27 -27
- data/samples/sprues/_hex_tiles.rb +15 -15
- data/samples/sprues/_mints.rb +11 -11
- data/samples/sprues/_sprue_example.rb +11 -11
- data/samples/text/_embed_text.rb +128 -128
- data/samples/text/_text.rb +47 -47
- data/samples/text/_text_options.rb +102 -102
- data/samples/text/bug134.rb +14 -14
- data/samples/units/_units.rb +32 -32
- data/squib.gemspec +52 -52
- metadata +51 -48
data/appveyor.yml
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
version: '{build}'
|
|
2
|
-
|
|
3
|
-
skip_tags: true
|
|
4
|
-
|
|
5
|
-
environment:
|
|
6
|
-
matrix:
|
|
7
|
-
- ruby_version: "23"
|
|
8
|
-
- ruby_version: "23-x64"
|
|
9
|
-
|
|
10
|
-
install:
|
|
11
|
-
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
|
12
|
-
- ruby --version
|
|
13
|
-
- gem --version
|
|
14
|
-
- gem install bundler --quiet --no-ri --no-rdoc
|
|
15
|
-
- bundler --version
|
|
16
|
-
- bundle install
|
|
17
|
-
|
|
18
|
-
test_script:
|
|
19
|
-
- rake
|
|
20
|
-
|
|
21
|
-
artifacts:
|
|
22
|
-
- path: pkg\*.gem
|
|
23
|
-
|
|
24
|
-
build: off
|
|
1
|
+
version: '{build}'
|
|
2
|
+
|
|
3
|
+
skip_tags: true
|
|
4
|
+
|
|
5
|
+
environment:
|
|
6
|
+
matrix:
|
|
7
|
+
- ruby_version: "23"
|
|
8
|
+
- ruby_version: "23-x64"
|
|
9
|
+
|
|
10
|
+
install:
|
|
11
|
+
- SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
|
|
12
|
+
- ruby --version
|
|
13
|
+
- gem --version
|
|
14
|
+
- gem install bundler --quiet --no-ri --no-rdoc
|
|
15
|
+
- bundler --version
|
|
16
|
+
- bundle install
|
|
17
|
+
|
|
18
|
+
test_script:
|
|
19
|
+
- rake
|
|
20
|
+
|
|
21
|
+
artifacts:
|
|
22
|
+
- path: pkg\*.gem
|
|
23
|
+
|
|
24
|
+
build: off
|
data/bin/squib
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
require 'squib'
|
|
3
|
-
|
|
4
|
-
Squib::CLI.new.run
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
require 'squib'
|
|
3
|
+
|
|
4
|
+
Squib::CLI.new.run
|
data/lib/squib.rb
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
require 'logger'
|
|
2
|
-
require 'cairo'
|
|
3
|
-
require 'pango'
|
|
4
|
-
require 'rsvg2'
|
|
5
|
-
require_relative 'squib/version'
|
|
6
|
-
require_relative 'squib/commands/cli'
|
|
7
|
-
require_relative 'squib/deck'
|
|
8
|
-
require_relative 'squib/card'
|
|
9
|
-
|
|
10
|
-
module Squib
|
|
11
|
-
|
|
12
|
-
# Access the internal logger that Squib uses. By default, Squib configure the logger to the WARN level
|
|
13
|
-
# Use this to suppress or increase output levels.
|
|
14
|
-
# @example
|
|
15
|
-
# Squib.logger.level = Logger::DEBUG #show waaaay more information than you probably need, unless you're a dev
|
|
16
|
-
# Squib.logger.level = Logger::ERROR #basically turns it off
|
|
17
|
-
#
|
|
18
|
-
# @return [Logger] the ruby logger
|
|
19
|
-
# @api public
|
|
20
|
-
def logger
|
|
21
|
-
if @logger.nil?
|
|
22
|
-
@logger = Logger.new($stdout)
|
|
23
|
-
@logger.level = Logger::WARN
|
|
24
|
-
@logger.formatter = proc do |severity, datetime, m_progname, msg|
|
|
25
|
-
"#{datetime} #{severity}: #{msg}\n"
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
@logger
|
|
29
|
-
end
|
|
30
|
-
module_function :logger
|
|
31
|
-
|
|
32
|
-
end
|
|
1
|
+
require 'logger'
|
|
2
|
+
require 'cairo'
|
|
3
|
+
require 'pango'
|
|
4
|
+
require 'rsvg2'
|
|
5
|
+
require_relative 'squib/version'
|
|
6
|
+
require_relative 'squib/commands/cli'
|
|
7
|
+
require_relative 'squib/deck'
|
|
8
|
+
require_relative 'squib/card'
|
|
9
|
+
|
|
10
|
+
module Squib
|
|
11
|
+
|
|
12
|
+
# Access the internal logger that Squib uses. By default, Squib configure the logger to the WARN level
|
|
13
|
+
# Use this to suppress or increase output levels.
|
|
14
|
+
# @example
|
|
15
|
+
# Squib.logger.level = Logger::DEBUG #show waaaay more information than you probably need, unless you're a dev
|
|
16
|
+
# Squib.logger.level = Logger::ERROR #basically turns it off
|
|
17
|
+
#
|
|
18
|
+
# @return [Logger] the ruby logger
|
|
19
|
+
# @api public
|
|
20
|
+
def logger
|
|
21
|
+
if @logger.nil?
|
|
22
|
+
@logger = Logger.new($stdout)
|
|
23
|
+
@logger.level = Logger::WARN
|
|
24
|
+
@logger.formatter = proc do |severity, datetime, m_progname, msg|
|
|
25
|
+
"#{datetime} #{severity}: #{msg}\n"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
@logger
|
|
29
|
+
end
|
|
30
|
+
module_function :logger
|
|
31
|
+
|
|
32
|
+
end
|
data/lib/squib/api/background.rb
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
require_relative '../args/card_range'
|
|
2
|
-
require_relative '../args/draw'
|
|
3
|
-
|
|
4
|
-
module Squib
|
|
5
|
-
class Deck
|
|
6
|
-
|
|
7
|
-
# DSL method. See http://squib.readthedocs.io
|
|
8
|
-
def background(opts = {})
|
|
9
|
-
range = Args::CardRange.new(opts[:range], deck_size: size)
|
|
10
|
-
draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
|
|
11
|
-
range.each { |i| @cards[i].background(draw.color[i]) }
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
end
|
|
15
|
-
end
|
|
1
|
+
require_relative '../args/card_range'
|
|
2
|
+
require_relative '../args/draw'
|
|
3
|
+
|
|
4
|
+
module Squib
|
|
5
|
+
class Deck
|
|
6
|
+
|
|
7
|
+
# DSL method. See http://squib.readthedocs.io
|
|
8
|
+
def background(opts = {})
|
|
9
|
+
range = Args::CardRange.new(opts[:range], deck_size: size)
|
|
10
|
+
draw = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
|
|
11
|
+
range.each { |i| @cards[i].background(draw.color[i]) }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
data/lib/squib/api/data.rb
CHANGED
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
require 'roo'
|
|
2
|
-
require 'csv'
|
|
3
|
-
require 'yaml'
|
|
4
|
-
require_relative '../args/input_file'
|
|
5
|
-
require_relative '../args/import'
|
|
6
|
-
require_relative '../args/csv_opts'
|
|
7
|
-
require_relative '../import/data_frame'
|
|
8
|
-
|
|
9
|
-
module Squib
|
|
10
|
-
|
|
11
|
-
# DSL method. See http://squib.readthedocs.io
|
|
12
|
-
def xlsx(opts = {})
|
|
13
|
-
input = Args::InputFile.new(file: 'deck.xlsx').load!(opts)
|
|
14
|
-
import = Args::Import.new.load!(opts)
|
|
15
|
-
s = Roo::Excelx.new(input.file[0])
|
|
16
|
-
s.default_sheet = s.sheets[input.sheet[0]]
|
|
17
|
-
data = Squib::DataFrame.new
|
|
18
|
-
s.first_column.upto(s.last_column) do |col|
|
|
19
|
-
header = s.cell(s.first_row, col).to_s
|
|
20
|
-
header.strip! if import.strip?
|
|
21
|
-
data[header] = []
|
|
22
|
-
(s.first_row + 1).upto(s.last_row) do |row|
|
|
23
|
-
cell = s.cell(row, col)
|
|
24
|
-
# Roo hack for avoiding unnecessary .0's on whole integers (https://github.com/roo-rb/roo/issues/139)
|
|
25
|
-
cell = s.excelx_value(row, col) if s.excelx_type(row, col) == [:numeric_or_formula, 'General']
|
|
26
|
-
cell.strip! if cell.respond_to?(:strip) && import.strip?
|
|
27
|
-
cell = yield(header, cell) if block_given?
|
|
28
|
-
data[header] << cell
|
|
29
|
-
end# row
|
|
30
|
-
end# col
|
|
31
|
-
explode_quantities(data, import.explode)
|
|
32
|
-
end# xlsx
|
|
33
|
-
module_function :xlsx
|
|
34
|
-
|
|
35
|
-
# DSL method. See http://squib.readthedocs.io
|
|
36
|
-
def csv(opts = {})
|
|
37
|
-
# TODO refactor all this out to separate methods, and its own class
|
|
38
|
-
import = Args::Import.new.load!(opts)
|
|
39
|
-
file = Args::InputFile.new(file: 'deck.csv').load!(opts).file[0]
|
|
40
|
-
data = opts.key?(:data) ? opts[:data] : File.read(file)
|
|
41
|
-
csv_opts = Args::CSV_Opts.new(opts)
|
|
42
|
-
table = CSV.parse(data, csv_opts.to_hash)
|
|
43
|
-
check_duplicate_csv_headers(table)
|
|
44
|
-
hash = Squib::DataFrame.new
|
|
45
|
-
table.headers.each do |header|
|
|
46
|
-
new_header = header.to_s
|
|
47
|
-
new_header = new_header.strip if import.strip?
|
|
48
|
-
hash[new_header] ||= table[header]
|
|
49
|
-
end
|
|
50
|
-
if import.strip?
|
|
51
|
-
new_hash = Squib::DataFrame.new
|
|
52
|
-
hash.each do |header, col|
|
|
53
|
-
new_hash[header] = col.map do |str|
|
|
54
|
-
str = str.strip if str.respond_to?(:strip)
|
|
55
|
-
str
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
hash = new_hash
|
|
59
|
-
end
|
|
60
|
-
if block_given?
|
|
61
|
-
hash.each do |header, col|
|
|
62
|
-
col.map! do |val|
|
|
63
|
-
yield(header, val)
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
return explode_quantities(hash, import.explode)
|
|
68
|
-
end
|
|
69
|
-
module_function :csv
|
|
70
|
-
|
|
71
|
-
# DSL method. See http://squib.readthedocs.io
|
|
72
|
-
def yaml(opts = {})
|
|
73
|
-
input = Args::InputFile.new(file: 'deck.yml').load!(opts)
|
|
74
|
-
import = Args::Import.new.load!(opts)
|
|
75
|
-
yml = YAML.load_file(input.file[0])
|
|
76
|
-
data = Squib::DataFrame.new
|
|
77
|
-
# Get a universal list of keys to ensure everything is covered.
|
|
78
|
-
keys = yml.map { |c| c.keys}.flatten.uniq
|
|
79
|
-
keys.each { |k| data[k] = [] } #init arrays
|
|
80
|
-
yml.each do |card|
|
|
81
|
-
# nil value if key isn't set.
|
|
82
|
-
keys.each { |k| data[k] << card[k] }
|
|
83
|
-
end
|
|
84
|
-
if block_given?
|
|
85
|
-
data.each do |header, col|
|
|
86
|
-
col.map! do |val|
|
|
87
|
-
yield(header, val)
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
explode_quantities(data, import.explode)
|
|
92
|
-
end
|
|
93
|
-
module_function :yaml
|
|
94
|
-
|
|
95
|
-
# Check if the given CSV table has duplicate columns, and throw a warning
|
|
96
|
-
# @api private
|
|
97
|
-
def check_duplicate_csv_headers(table)
|
|
98
|
-
if table.headers.size != table.headers.uniq.size
|
|
99
|
-
dups = table.headers.select{|e| table.headers.count(e) > 1 }
|
|
100
|
-
Squib.logger.warn "CSV duplicated the following column keys: #{dups.join(',')}"
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
module_function :check_duplicate_csv_headers
|
|
104
|
-
|
|
105
|
-
# @api private
|
|
106
|
-
def explode_quantities(data, qty)
|
|
107
|
-
return data unless data.col? qty.to_s.strip
|
|
108
|
-
qtys = data[qty]
|
|
109
|
-
new_data = Squib::DataFrame.new
|
|
110
|
-
data.each do |col, arr|
|
|
111
|
-
new_data[col] = []
|
|
112
|
-
qtys.each_with_index do |qty, index|
|
|
113
|
-
qty.to_i.times { new_data[col] << arr[index] }
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
return new_data
|
|
117
|
-
end
|
|
118
|
-
module_function :explode_quantities
|
|
119
|
-
|
|
120
|
-
class Deck
|
|
121
|
-
|
|
122
|
-
# DSL method. See http://squib.readthedocs.io
|
|
123
|
-
def xlsx(opts = {})
|
|
124
|
-
Squib.xlsx(opts)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
# DSL method. See http://squib.readthedocs.io
|
|
128
|
-
def csv(opts = {})
|
|
129
|
-
Squib.csv(opts)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
# DSL method. See http://squib.readthedocs.io
|
|
133
|
-
def yaml(opts = {})
|
|
134
|
-
Squib.yaml(opts)
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
end
|
|
1
|
+
require 'roo'
|
|
2
|
+
require 'csv'
|
|
3
|
+
require 'yaml'
|
|
4
|
+
require_relative '../args/input_file'
|
|
5
|
+
require_relative '../args/import'
|
|
6
|
+
require_relative '../args/csv_opts'
|
|
7
|
+
require_relative '../import/data_frame'
|
|
8
|
+
|
|
9
|
+
module Squib
|
|
10
|
+
|
|
11
|
+
# DSL method. See http://squib.readthedocs.io
|
|
12
|
+
def xlsx(opts = {})
|
|
13
|
+
input = Args::InputFile.new(file: 'deck.xlsx').load!(opts)
|
|
14
|
+
import = Args::Import.new.load!(opts)
|
|
15
|
+
s = Roo::Excelx.new(input.file[0])
|
|
16
|
+
s.default_sheet = s.sheets[input.sheet[0]]
|
|
17
|
+
data = Squib::DataFrame.new
|
|
18
|
+
s.first_column.upto(s.last_column) do |col|
|
|
19
|
+
header = s.cell(s.first_row, col).to_s
|
|
20
|
+
header.strip! if import.strip?
|
|
21
|
+
data[header] = []
|
|
22
|
+
(s.first_row + 1).upto(s.last_row) do |row|
|
|
23
|
+
cell = s.cell(row, col)
|
|
24
|
+
# Roo hack for avoiding unnecessary .0's on whole integers (https://github.com/roo-rb/roo/issues/139)
|
|
25
|
+
cell = s.excelx_value(row, col) if s.excelx_type(row, col) == [:numeric_or_formula, 'General']
|
|
26
|
+
cell.strip! if cell.respond_to?(:strip) && import.strip?
|
|
27
|
+
cell = yield(header, cell) if block_given?
|
|
28
|
+
data[header] << cell
|
|
29
|
+
end# row
|
|
30
|
+
end# col
|
|
31
|
+
explode_quantities(data, import.explode)
|
|
32
|
+
end# xlsx
|
|
33
|
+
module_function :xlsx
|
|
34
|
+
|
|
35
|
+
# DSL method. See http://squib.readthedocs.io
|
|
36
|
+
def csv(opts = {})
|
|
37
|
+
# TODO refactor all this out to separate methods, and its own class
|
|
38
|
+
import = Args::Import.new.load!(opts)
|
|
39
|
+
file = Args::InputFile.new(file: 'deck.csv').load!(opts).file[0]
|
|
40
|
+
data = opts.key?(:data) ? opts[:data] : File.read(file)
|
|
41
|
+
csv_opts = Args::CSV_Opts.new(opts)
|
|
42
|
+
table = CSV.parse(data, csv_opts.to_hash)
|
|
43
|
+
check_duplicate_csv_headers(table)
|
|
44
|
+
hash = Squib::DataFrame.new
|
|
45
|
+
table.headers.each do |header|
|
|
46
|
+
new_header = header.to_s
|
|
47
|
+
new_header = new_header.strip if import.strip?
|
|
48
|
+
hash[new_header] ||= table[header]
|
|
49
|
+
end
|
|
50
|
+
if import.strip?
|
|
51
|
+
new_hash = Squib::DataFrame.new
|
|
52
|
+
hash.each do |header, col|
|
|
53
|
+
new_hash[header] = col.map do |str|
|
|
54
|
+
str = str.strip if str.respond_to?(:strip)
|
|
55
|
+
str
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
hash = new_hash
|
|
59
|
+
end
|
|
60
|
+
if block_given?
|
|
61
|
+
hash.each do |header, col|
|
|
62
|
+
col.map! do |val|
|
|
63
|
+
yield(header, val)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
return explode_quantities(hash, import.explode)
|
|
68
|
+
end
|
|
69
|
+
module_function :csv
|
|
70
|
+
|
|
71
|
+
# DSL method. See http://squib.readthedocs.io
|
|
72
|
+
def yaml(opts = {})
|
|
73
|
+
input = Args::InputFile.new(file: 'deck.yml').load!(opts)
|
|
74
|
+
import = Args::Import.new.load!(opts)
|
|
75
|
+
yml = YAML.load_file(input.file[0])
|
|
76
|
+
data = Squib::DataFrame.new
|
|
77
|
+
# Get a universal list of keys to ensure everything is covered.
|
|
78
|
+
keys = yml.map { |c| c.keys}.flatten.uniq
|
|
79
|
+
keys.each { |k| data[k] = [] } #init arrays
|
|
80
|
+
yml.each do |card|
|
|
81
|
+
# nil value if key isn't set.
|
|
82
|
+
keys.each { |k| data[k] << card[k] }
|
|
83
|
+
end
|
|
84
|
+
if block_given?
|
|
85
|
+
data.each do |header, col|
|
|
86
|
+
col.map! do |val|
|
|
87
|
+
yield(header, val)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
explode_quantities(data, import.explode)
|
|
92
|
+
end
|
|
93
|
+
module_function :yaml
|
|
94
|
+
|
|
95
|
+
# Check if the given CSV table has duplicate columns, and throw a warning
|
|
96
|
+
# @api private
|
|
97
|
+
def check_duplicate_csv_headers(table)
|
|
98
|
+
if table.headers.size != table.headers.uniq.size
|
|
99
|
+
dups = table.headers.select{|e| table.headers.count(e) > 1 }
|
|
100
|
+
Squib.logger.warn "CSV duplicated the following column keys: #{dups.join(',')}"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
module_function :check_duplicate_csv_headers
|
|
104
|
+
|
|
105
|
+
# @api private
|
|
106
|
+
def explode_quantities(data, qty)
|
|
107
|
+
return data unless data.col? qty.to_s.strip
|
|
108
|
+
qtys = data[qty]
|
|
109
|
+
new_data = Squib::DataFrame.new
|
|
110
|
+
data.each do |col, arr|
|
|
111
|
+
new_data[col] = []
|
|
112
|
+
qtys.each_with_index do |qty, index|
|
|
113
|
+
qty.to_i.times { new_data[col] << arr[index] }
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
return new_data
|
|
117
|
+
end
|
|
118
|
+
module_function :explode_quantities
|
|
119
|
+
|
|
120
|
+
class Deck
|
|
121
|
+
|
|
122
|
+
# DSL method. See http://squib.readthedocs.io
|
|
123
|
+
def xlsx(opts = {})
|
|
124
|
+
Squib.xlsx(opts)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# DSL method. See http://squib.readthedocs.io
|
|
128
|
+
def csv(opts = {})
|
|
129
|
+
Squib.csv(opts)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# DSL method. See http://squib.readthedocs.io
|
|
133
|
+
def yaml(opts = {})
|
|
134
|
+
Squib.yaml(opts)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
data/lib/squib/api/groups.rb
CHANGED
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
require 'set'
|
|
2
|
-
|
|
3
|
-
module Squib
|
|
4
|
-
|
|
5
|
-
# DSL method. See http://squib.readthedocs.io
|
|
6
|
-
def enable_build_globally group
|
|
7
|
-
groups = (ENV['SQUIB_BUILD'] ||= '').split(',')
|
|
8
|
-
ENV['SQUIB_BUILD'] = (groups << group).uniq.join(',')
|
|
9
|
-
end
|
|
10
|
-
module_function :enable_build_globally
|
|
11
|
-
|
|
12
|
-
# DSL method. See http://squib.readthedocs.io
|
|
13
|
-
def disable_build_globally group
|
|
14
|
-
groups = (ENV['SQUIB_BUILD'] ||= '').split(',')
|
|
15
|
-
groups.delete(group.to_s)
|
|
16
|
-
ENV['SQUIB_BUILD'] = groups.uniq.join(',')
|
|
17
|
-
end
|
|
18
|
-
module_function :disable_build_globally
|
|
19
|
-
|
|
20
|
-
class Deck
|
|
21
|
-
|
|
22
|
-
# DSL method. See http://squib.readthedocs.io
|
|
23
|
-
def build grp = :all, &block
|
|
24
|
-
raise 'Please provide a block' unless block_given?
|
|
25
|
-
block.yield if build_groups.include? grp
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# DSL method. See http://squib.readthedocs.io
|
|
29
|
-
def enable_build grp
|
|
30
|
-
build_groups # make sure it's initialized
|
|
31
|
-
@build_groups << grp
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# DSL method. See http://squib.readthedocs.io
|
|
35
|
-
def disable_build grp
|
|
36
|
-
build_groups # make sure it's initialized
|
|
37
|
-
@build_groups.delete grp
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# DSL method. See http://squib.readthedocs.io
|
|
41
|
-
def build_groups
|
|
42
|
-
@build_groups ||= Set.new.add(:all)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
# Not a DSL method, but initialized from Deck.new
|
|
46
|
-
def enable_groups_from_env!
|
|
47
|
-
return if ENV['SQUIB_BUILD'].nil?
|
|
48
|
-
ENV['SQUIB_BUILD'].split(',').each do |grp|
|
|
49
|
-
enable_build grp.strip.to_sym
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
end
|
|
54
|
-
end
|
|
1
|
+
require 'set'
|
|
2
|
+
|
|
3
|
+
module Squib
|
|
4
|
+
|
|
5
|
+
# DSL method. See http://squib.readthedocs.io
|
|
6
|
+
def enable_build_globally group
|
|
7
|
+
groups = (ENV['SQUIB_BUILD'] ||= '').split(',')
|
|
8
|
+
ENV['SQUIB_BUILD'] = (groups << group).uniq.join(',')
|
|
9
|
+
end
|
|
10
|
+
module_function :enable_build_globally
|
|
11
|
+
|
|
12
|
+
# DSL method. See http://squib.readthedocs.io
|
|
13
|
+
def disable_build_globally group
|
|
14
|
+
groups = (ENV['SQUIB_BUILD'] ||= '').split(',')
|
|
15
|
+
groups.delete(group.to_s)
|
|
16
|
+
ENV['SQUIB_BUILD'] = groups.uniq.join(',')
|
|
17
|
+
end
|
|
18
|
+
module_function :disable_build_globally
|
|
19
|
+
|
|
20
|
+
class Deck
|
|
21
|
+
|
|
22
|
+
# DSL method. See http://squib.readthedocs.io
|
|
23
|
+
def build grp = :all, &block
|
|
24
|
+
raise 'Please provide a block' unless block_given?
|
|
25
|
+
block.yield if build_groups.include? grp
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# DSL method. See http://squib.readthedocs.io
|
|
29
|
+
def enable_build grp
|
|
30
|
+
build_groups # make sure it's initialized
|
|
31
|
+
@build_groups << grp
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# DSL method. See http://squib.readthedocs.io
|
|
35
|
+
def disable_build grp
|
|
36
|
+
build_groups # make sure it's initialized
|
|
37
|
+
@build_groups.delete grp
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# DSL method. See http://squib.readthedocs.io
|
|
41
|
+
def build_groups
|
|
42
|
+
@build_groups ||= Set.new.add(:all)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Not a DSL method, but initialized from Deck.new
|
|
46
|
+
def enable_groups_from_env!
|
|
47
|
+
return if ENV['SQUIB_BUILD'].nil?
|
|
48
|
+
ENV['SQUIB_BUILD'].split(',').each do |grp|
|
|
49
|
+
enable_build grp.strip.to_sym
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
end
|