squib 0.15.2 → 0.15.3

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 (165) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +41 -41
  3. data/.travis.yml +17 -17
  4. data/CHANGELOG.md +400 -395
  5. data/CONTRIBUTING.md +40 -40
  6. data/Dockerfile +25 -25
  7. data/Gemfile +2 -2
  8. data/LICENSE.txt +22 -22
  9. data/README.md +145 -145
  10. data/RELEASE TODO.md +21 -21
  11. data/Rakefile +48 -48
  12. data/appveyor.yml +25 -25
  13. data/bin/squib +4 -4
  14. data/lib/squib.rb +32 -32
  15. data/lib/squib/api/background.rb +15 -15
  16. data/lib/squib/api/data.rb +137 -137
  17. data/lib/squib/api/groups.rb +54 -54
  18. data/lib/squib/api/image.rb +49 -49
  19. data/lib/squib/api/save.rb +83 -83
  20. data/lib/squib/api/settings.rb +21 -21
  21. data/lib/squib/api/shapes.rb +124 -124
  22. data/lib/squib/api/text.rb +25 -25
  23. data/lib/squib/api/text_embed.rb +71 -71
  24. data/lib/squib/api/units.rb +27 -27
  25. data/lib/squib/args/arg_loader.rb +126 -126
  26. data/lib/squib/args/box.rb +55 -55
  27. data/lib/squib/args/card_range.rb +32 -32
  28. data/lib/squib/args/color_validator.rb +12 -12
  29. data/lib/squib/args/coords.rb +35 -35
  30. data/lib/squib/args/csv_opts.rb +25 -25
  31. data/lib/squib/args/dir_validator.rb +16 -16
  32. data/lib/squib/args/draw.rb +92 -92
  33. data/lib/squib/args/embed_adjust.rb +25 -25
  34. data/lib/squib/args/embed_key.rb +17 -17
  35. data/lib/squib/args/hand_special.rb +37 -37
  36. data/lib/squib/args/import.rb +40 -40
  37. data/lib/squib/args/input_file.rb +37 -37
  38. data/lib/squib/args/paint.rb +44 -44
  39. data/lib/squib/args/paragraph.rb +116 -116
  40. data/lib/squib/args/save_batch.rb +63 -63
  41. data/lib/squib/args/scale_box.rb +53 -53
  42. data/lib/squib/args/sheet.rb +172 -172
  43. data/lib/squib/args/showcase_special.rb +41 -41
  44. data/lib/squib/args/sprue_file.rb +44 -44
  45. data/lib/squib/args/svg_special.rb +37 -37
  46. data/lib/squib/args/transform.rb +61 -61
  47. data/lib/squib/args/typographer.rb +119 -119
  48. data/lib/squib/args/unit_conversion.rb +29 -29
  49. data/lib/squib/builtin/layouts/economy.yml +85 -85
  50. data/lib/squib/builtin/layouts/fantasy.yml +101 -101
  51. data/lib/squib/builtin/layouts/hand.yml +62 -62
  52. data/lib/squib/builtin/layouts/party.yml +94 -94
  53. data/lib/squib/builtin/layouts/playing-card.yml +35 -35
  54. data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
  55. data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
  56. data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
  57. data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
  58. data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
  59. data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
  60. data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
  61. data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
  62. data/lib/squib/builtin/projects/advanced/config.yml +49 -49
  63. data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
  64. data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
  65. data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
  66. data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
  67. data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
  68. data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
  69. data/lib/squib/builtin/projects/basic/.gitignore +4 -4
  70. data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
  71. data/lib/squib/builtin/projects/basic/Gemfile +3 -3
  72. data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
  73. data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
  74. data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
  75. data/lib/squib/builtin/projects/basic/RULES.md +21 -21
  76. data/lib/squib/builtin/projects/basic/Rakefile +7 -7
  77. data/lib/squib/builtin/projects/basic/config.yml +49 -49
  78. data/lib/squib/builtin/projects/basic/deck.rb +6 -6
  79. data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
  80. data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
  81. data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
  82. data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
  83. data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -10
  84. data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
  85. data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
  86. data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -68
  87. data/lib/squib/card.rb +75 -75
  88. data/lib/squib/commands/cli.rb +39 -39
  89. data/lib/squib/commands/data/template_option.rb +109 -109
  90. data/lib/squib/commands/make_sprue.rb +277 -277
  91. data/lib/squib/commands/new.rb +77 -77
  92. data/lib/squib/conf.rb +139 -139
  93. data/lib/squib/constants.rb +17 -17
  94. data/lib/squib/deck.rb +116 -116
  95. data/lib/squib/graphics/background.rb +14 -14
  96. data/lib/squib/graphics/cairo_context_wrapper.rb +113 -113
  97. data/lib/squib/graphics/embedding_utils.rb +28 -28
  98. data/lib/squib/graphics/gradient_regex.rb +47 -47
  99. data/lib/squib/graphics/hand.rb +42 -42
  100. data/lib/squib/graphics/image.rb +123 -123
  101. data/lib/squib/graphics/save_doc.rb +61 -61
  102. data/lib/squib/graphics/save_images.rb +52 -52
  103. data/lib/squib/graphics/save_pdf.rb +90 -90
  104. data/lib/squib/graphics/save_sprue.rb +219 -219
  105. data/lib/squib/graphics/shapes.rb +143 -143
  106. data/lib/squib/graphics/showcase.rb +85 -85
  107. data/lib/squib/graphics/text.rb +174 -174
  108. data/lib/squib/import/data_frame.rb +108 -108
  109. data/lib/squib/layout_parser.rb +138 -138
  110. data/lib/squib/progress.rb +38 -38
  111. data/lib/squib/sample_helpers.rb +34 -34
  112. data/lib/squib/sprues/crop_line.rb +28 -28
  113. data/lib/squib/sprues/crop_line_dash.rb +35 -35
  114. data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
  115. data/lib/squib/sprues/sprue.rb +206 -206
  116. data/lib/squib/sprues/sprue_schema.rb +50 -50
  117. data/lib/squib/version.rb +10 -10
  118. data/samples/autoscale_font/_autoscale_font.rb +29 -29
  119. data/samples/backend/_backend.rb +26 -26
  120. data/samples/basic.rb +19 -19
  121. data/samples/build_groups/build_groups.rb +36 -36
  122. data/samples/colors/_colors.rb +44 -44
  123. data/samples/colors/_gradients.rb +34 -34
  124. data/samples/colors/_switch_color.rb +33 -33
  125. data/samples/config/config_text_markup.rb +20 -20
  126. data/samples/config/custom_config.rb +18 -18
  127. data/samples/data/_csv.rb +33 -33
  128. data/samples/data/_excel.rb +55 -55
  129. data/samples/data/_yaml.rb +12 -12
  130. data/samples/hello_world.rb +6 -6
  131. data/samples/images/_cairo_access.rb +39 -39
  132. data/samples/images/_images.rb +104 -104
  133. data/samples/images/_more_load_images.rb +102 -102
  134. data/samples/intro/01_hello.rb +8 -8
  135. data/samples/intro/02_options.rb +14 -14
  136. data/samples/intro/03_layout.rb +11 -11
  137. data/samples/intro/04_arrays.rb +15 -15
  138. data/samples/intro/05_excel.rb +14 -14
  139. data/samples/layouts/builtin_layouts.rb +97 -97
  140. data/samples/layouts/layouts.rb +71 -71
  141. data/samples/project/src/characters.rb +8 -8
  142. data/samples/project/src/skills.rb +7 -7
  143. data/samples/proofs/_tgc_proofs.rb +16 -16
  144. data/samples/ranges/_ranges.rb +64 -64
  145. data/samples/saves/_hand.rb +23 -23
  146. data/samples/saves/_portrait_landscape.rb +23 -23
  147. data/samples/saves/_save_filenames.rb +24 -24
  148. data/samples/saves/_save_pdf.rb +29 -29
  149. data/samples/saves/_saves.rb +51 -51
  150. data/samples/saves/_showcase.rb +25 -25
  151. data/samples/shapes/_draw_shapes.rb +60 -60
  152. data/samples/shapes/_proofs.rb +22 -22
  153. data/samples/sprues/_advanced_sprues.rb +25 -25
  154. data/samples/sprues/_builtin_sprues.rb +21 -21
  155. data/samples/sprues/_fold_sheet.rb +27 -27
  156. data/samples/sprues/_hex_tiles.rb +15 -15
  157. data/samples/sprues/_mints.rb +11 -11
  158. data/samples/sprues/_sprue_example.rb +11 -11
  159. data/samples/text/_embed_text.rb +128 -128
  160. data/samples/text/_text.rb +47 -47
  161. data/samples/text/_text_options.rb +102 -102
  162. data/samples/text/bug134.rb +14 -14
  163. data/samples/units/_units.rb +32 -32
  164. data/squib.gemspec +52 -52
  165. metadata +62 -63
@@ -1,21 +1,21 @@
1
- Be sure to remember to do the following for releases. (Copy into a GitHub issue)
2
-
3
- - [ ] CHANGELOG is written for all new changes
4
- - [ ] README is updated
5
- - [ ] Samples are updated
6
- - [ ] Are all the dependencies up to date?
7
- - [ ] Check `sample_regression_spec.rb` regression tests are all enabled (i.e. `overwrite_sample` is commented out)
8
- - [ ] Bump version.rb
9
- - [ ] Bump docs/conf.py versions
10
- - [ ] Do a full rake locally
11
- - [ ] `rake sanity`, and check visually
12
- - [ ] Travis is passing on dev branch
13
- - [ ] Merge master branch
14
- - [ ] Merge release branch
15
- - [ ] Push master and release branches
16
- - [ ] Create GitHub release tag
17
- - [ ] `gem push pkg/squib-x.y.z.gem`
18
- - [ ] Github milestone closed
19
- - [ ] Activate version on squib.readthedocs.org
20
- - [ ] Bump version.rb to the next alpha
21
- - [ ] Publish on BoardGameGeek thread
1
+ Be sure to remember to do the following for releases. (Copy into a GitHub issue)
2
+
3
+ - [ ] CHANGELOG is written for all new changes
4
+ - [ ] README is updated
5
+ - [ ] Samples are updated
6
+ - [ ] Are all the dependencies up to date?
7
+ - [ ] Check `sample_regression_spec.rb` regression tests are all enabled (i.e. `overwrite_sample` is commented out)
8
+ - [ ] Bump version.rb
9
+ - [ ] Bump docs/conf.py versions
10
+ - [ ] Do a full rake locally
11
+ - [ ] `rake sanity`, and check visually
12
+ - [ ] Travis is passing on dev branch
13
+ - [ ] Merge master branch
14
+ - [ ] Merge release branch
15
+ - [ ] Push master and release branches
16
+ - [ ] Create GitHub release tag
17
+ - [ ] `gem push pkg/squib-x.y.z.gem`
18
+ - [ ] Github milestone closed
19
+ - [ ] Activate version on squib.readthedocs.org
20
+ - [ ] Bump version.rb to the next alpha
21
+ - [ ] Publish on BoardGameGeek thread
data/Rakefile CHANGED
@@ -1,48 +1,48 @@
1
- require 'bundler/gem_tasks'
2
- require 'rspec/core/rake_task'
3
- require 'benchmark'
4
- # require 'byebug'
5
-
6
- desc 'install + spec'
7
- task default: ['install:local', :spec]
8
-
9
- # Useful for hooking up with SublimeText.
10
- # e.g. rake sample[basic.rb]
11
- desc 'Run a specific sample'
12
- task :run, [:file] => :install do |t, args|
13
- args.with_defaults(file: 'basic.rb')
14
- Dir.chdir('samples') do
15
- args[:file] << '.rb' unless args[:file].end_with? '.rb'
16
- puts "Running samples/#{args[:file]}"
17
- load args[:file]
18
- end
19
- end
20
-
21
- RSpec::Core::RakeTask.new(:spec)
22
-
23
- RSpec::Core::RakeTask.new(:spec_fastonly) do |t|
24
- t.rspec_opts = '--tag ~slow'
25
- end
26
-
27
- desc 'Run some performance benchmarks'
28
- task benchmark: [:install] do
29
- require 'squib'
30
- Squib::logger.level = Logger::ERROR # silence warnings
31
- Dir.chdir('benchmarks') do
32
- Benchmark.bm(15) do |bm|
33
- Dir['*.rb'].each do | script |
34
- GC.start
35
- bm.report(script) { load script }
36
- end
37
- end
38
- end
39
- end
40
-
41
- desc 'Run sanity tests without a full rebuild'
42
- task :sanity_only do
43
- require_relative 'spec/sanity/sanity_test.rb'
44
- SanityTest.new.run
45
- end
46
-
47
- desc 'Run full rebuild with sanity tests'
48
- task sanity: [:install, :spec, :sanity_only]
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'benchmark'
4
+ # require 'byebug'
5
+
6
+ desc 'install + spec'
7
+ task default: ['install:local', :spec]
8
+
9
+ # Useful for hooking up with SublimeText.
10
+ # e.g. rake sample[basic.rb]
11
+ desc 'Run a specific sample'
12
+ task :run, [:file] => :install do |t, args|
13
+ args.with_defaults(file: 'basic.rb')
14
+ Dir.chdir('samples') do
15
+ args[:file] << '.rb' unless args[:file].end_with? '.rb'
16
+ puts "Running samples/#{args[:file]}"
17
+ load args[:file]
18
+ end
19
+ end
20
+
21
+ RSpec::Core::RakeTask.new(:spec)
22
+
23
+ RSpec::Core::RakeTask.new(:spec_fastonly) do |t|
24
+ t.rspec_opts = '--tag ~slow'
25
+ end
26
+
27
+ desc 'Run some performance benchmarks'
28
+ task benchmark: [:install] do
29
+ require 'squib'
30
+ Squib::logger.level = Logger::ERROR # silence warnings
31
+ Dir.chdir('benchmarks') do
32
+ Benchmark.bm(15) do |bm|
33
+ Dir['*.rb'].each do | script |
34
+ GC.start
35
+ bm.report(script) { load script }
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ desc 'Run sanity tests without a full rebuild'
42
+ task :sanity_only do
43
+ require_relative 'spec/sanity/sanity_test.rb'
44
+ SanityTest.new.run
45
+ end
46
+
47
+ desc 'Run full rebuild with sanity tests'
48
+ task sanity: [:install, :spec, :sanity_only]
@@ -1,25 +1,25 @@
1
- version: '{build}'
2
-
3
- skip_tags: true
4
-
5
- environment:
6
- matrix:
7
- - ruby_version: "24"
8
- - ruby_version: "24-x64"
9
- - ruby_version: "25"
10
- - ruby_version: "25-x64"
11
- - ruby_version: "26"
12
- - ruby_version: "26-x64"
13
-
14
- install:
15
- - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
16
- - ruby --version
17
- - gem --version
18
- - gem install bundler
19
- - bundler --version
20
- - bundle install
21
-
22
- test_script:
23
- - rake
24
-
25
- build: off
1
+ version: '{build}'
2
+
3
+ skip_tags: true
4
+
5
+ environment:
6
+ matrix:
7
+ - ruby_version: "24"
8
+ - ruby_version: "24-x64"
9
+ - ruby_version: "25"
10
+ - ruby_version: "25-x64"
11
+ - ruby_version: "26"
12
+ - ruby_version: "26-x64"
13
+
14
+ install:
15
+ - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
16
+ - ruby --version
17
+ - gem --version
18
+ - gem install bundler
19
+ - bundler --version
20
+ - bundle install
21
+
22
+ test_script:
23
+ - rake
24
+
25
+ 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
@@ -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
@@ -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
@@ -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