squib 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 744aff036f28e351288af081a51ee69a10a02c38
4
- data.tar.gz: 79d15605f836489bf85c3635b43c421bea4902fb
3
+ metadata.gz: ebe09b3a47c609d39587cd6ca28697dda3f7799b
4
+ data.tar.gz: d92fedcde11597ef02277afd1d4cace28a08537a
5
5
  SHA512:
6
- metadata.gz: c2f48683c4abfb922e6e8501d308363635acff8dc75e5612ed50b6ce0e19eae7d5063c86b448157808bc4344ddef585c6218570b5f7bf923526906c7158a15e1
7
- data.tar.gz: 51180a1a1125f90a78a355d83426474c15b4bc2cb50c688600f44c8b312ff06fa5caffe5f7403028683e9daf9a7ebd7f883f863d8ab8b9b2e0f9b764fe9906d5
6
+ metadata.gz: eb307fcf715711fca60e5fdab698c39a324aec249a5d33c65317ff0e52799302abf26bb00d19e0794d5bbb190a1a01b21c600b99ac0bccec6b992753fda88846
7
+ data.tar.gz: 5ec28990c090b049545e58e1c97488aeab73c64537076b95e207638dcf8362ee66cbeb4c7384a368b94c5abf1263f777e64243607f037ab954586e49d3e81d76
data/CHANGELOG.md CHANGED
@@ -1,7 +1,20 @@
1
1
  # Squib CHANGELOG
2
2
  Squib follows [semantic versioning](http://semver.org).
3
3
 
4
- ## v0.7.0 / Unreleased
4
+ ## v0.8.0 / 2015-10-26
5
+ Features
6
+ * The `xlsx` and `csv` support quantity explosion! Just use the column name 'Qty' and put integers in your sheet and you'll produce copies of the entire row. See README and the csv sample for more info. (#78)
7
+ * The `xlsx` and `csv` methods will now strip leading and trailing whitespace by default where applicable. This is now turned on by default, but can be turned off with `strip: false`. (#79)
8
+ * The `xlsx` and `csv` methods will now yield to a block (if given) for each cell so you can do some extra processing if you like. See samples/excel.rb for an example. (#108)
9
+ * Layout file for TheGameCrafter tuck boxes (#113). Thanks @alexgorski!
10
+
11
+ Compatibility change:
12
+ * Stripping leading and trailing whitespace of xlsx and csv values by default might change how your data gets parsed.
13
+
14
+ Bugs fixes:
15
+ * The `range` option everywhere doesn't fail on `[]` (#107)
16
+
17
+ ## v0.7.0 / 2015-09-11
5
18
 
6
19
  Features
7
20
  * Added `cap` option to `line` and `curve` to define how ends of lines are drawn (#42)
data/README.md CHANGED
@@ -43,7 +43,7 @@ And then execute:
43
43
  $ bundle
44
44
 
45
45
  Note: Squib has some native dependencies, such as [Cairo](https://github.com/rcairo/rcairo), [Pango](http://ruby-gnome2.sourceforge.jp/hiki.cgi?Pango%3A%3ALayout), and [Nokogiri](http://nokogiri.org/), which may require compiling C code to install. This is usually not painful at all, and is automated through Bundler/RubyGems, but can cause headaches on some setups.
46
- * Windows: I recommend using the *non-64 bit* RubyInstaller at http://rubyinstaller.org. Some installations will also need DevKit. Currently, Ruby 2.2 on Windows conflicts with one of Squib's dependencies called Nokogiri (read the WTF-y issue here: https://github.com/sparklemotion/nokogiri/issues/1256), so I recommend 2.1 or 2.0 for Windows users.
46
+ * Windows: I recommend using the *non-64 bit* RubyInstaller at http://rubyinstaller.org. Some installations will also need DevKit. Currently, Ruby 2.2 on Windows conflicts with one of Squib's dependencies called Nokogiri (read the WTF-y issue here: https://github.com/sparklemotion/nokogiri/issues/1256) UPDATE: their pre-releases have fixed this exact issue - just install nokogiri-1.6.7.rc3-x64-mingw32 (or higher). Or, as a last resort, use 2.1 or 2.0 for Windows users.
47
47
  * Mac: I recommend using [rvm](https://rvm.io). Some users have reported that Ruby 2.1 will not work with Mac OSX 10.10.4 (#88) - Ruby 2.0 and 2.2 are confirmed to work however (this is an rcairo issue, not a Squib issue).
48
48
  * Cywgin is not supported, but could theoretically work with extra installation steps. See [this thread](http://boardgamegeek.com/article/18508113#18508113). Contributions in this area are welcome.
49
49
  * Linux. No known installation issues. Happy installing!
@@ -484,6 +484,10 @@ Squib supports importing data from `xlsx` files and `csv` files. These methods a
484
484
 
485
485
  Of course, you can always import your game data other ways using just Ruby. There's nothing special about Squib's methods other than their convenience.
486
486
 
487
+ ###Quantity Explosion
488
+
489
+ If you want more than one copy of a card, then have a column called `Qty` and fill it with counts. Squib's `xlsx` and `csv` methods will automatically expand those rows according to those counts. You can also customize that "Qty" to anything you like by setting the `explode` option (e.g. `explode: 'Quantity'`). See the `excel.rb` and the `csv_import.rb` samples found [here](https://github.com/andymeneely/squib/tree/master/samples/) for an example.
490
+
487
491
  ## Making Squib Verbose
488
492
 
489
493
  By default, Squib's logger is set to WARN, but more fine-grained logging is embedded in the code. To set the logger, just put this at the top of your script:
@@ -597,11 +601,22 @@ There are lots of people using Squib already. If you've gone through the [sample
597
601
  * Our [thread on BoardGameGeek](http://boardgamegeek.com/thread/1293453) is quite active and informal (if a bit unstructured).
598
602
  * [StackOverflow](http://stackoverflow.com/questions/ask?tags=ruby squib) with the tag "ruby" and "squib" will get you answers quickly and a great way to document questions for future Squibbers.
599
603
 
604
+ If you email me directly I'll probably ask you to post your question publicly so we can document answers for future Googling Squibbers.
605
+
600
606
  Please use GitHub issues for bugs and feature requests.
601
607
 
608
+ ## Give Help
609
+
610
+ Let's help each other out! Even if you're relatively new, there's probably some question out there that you can help answer. Here's how to help:
611
+
612
+ * Subscribe to our thread on BoardGameGeek (see above for link)
613
+ * Subscribe to alerts from Stackoverflow for the tags "squib" and "ruby"
614
+ * Post snippets of your code using GitHub gists
615
+ * Write a how-to tutorial and post it on [our wiki](https://github.com/andymeneely/squib/wiki)
616
+
602
617
  ## Testing Pre-Builds
603
618
 
604
- If you want to test new features as I develop them, you can always point your Gemfile to the repository. Your Gemfile specification looks like this:
619
+ Testers needed!! If you want to test new features as I develop them, or make sure I didn't break your code, you can always point your Gemfile to the repository and follow what I'm doing there. Your Gemfile specification looks like this:
605
620
 
606
621
  ```ruby
607
622
  gem 'squib', git: 'git://github.com/andymeneely/squib', branch: 'dev'
@@ -1,6 +1,7 @@
1
1
  require 'roo'
2
2
  require 'csv'
3
3
  require 'squib/args/input_file'
4
+ require 'squib/args/import'
4
5
 
5
6
  module Squib
6
7
 
@@ -16,28 +17,34 @@ module Squib
16
17
  # # | 1 | 2 |
17
18
  # # | 3 | 4 |
18
19
  # data = xlsx file: 'data.xlsx', sheet: 0
19
- # {'h1' => [1,3], 'h2' => [2,4]}
20
+ # => {'h1' => [1,3], 'h2' => [2,4]}
20
21
  #
21
22
  # @option opts file [String] the file to open. Must end in `.xlsx`. Opens relative to the current directory.
22
23
  # @option opts sheet [Integer] (0) The zero-based index of the sheet from which to read.
24
+ # @option opts strip [Boolean] (true) When true, strips leading and trailing whitespace on values and headers
25
+ # @option opts explode [String] ('qty') Quantity explosion will be applied to the column this name. See README for example.
23
26
  # @return [Hash] a hash of arrays based on columns in the spreadsheet
24
27
  # @api public
25
28
  def xlsx(opts = {})
26
29
  input = Args::InputFile.new(file: 'deck.xlsx').load!(opts)
30
+ import = Args::Import.new.load!(opts)
27
31
  s = Roo::Excelx.new(input.file[0])
28
32
  s.default_sheet = s.sheets[input.sheet[0]]
29
33
  data = {}
30
34
  s.first_column.upto(s.last_column) do |col|
31
35
  header = s.cell(s.first_row,col).to_s
36
+ header.strip! if import.strip?
32
37
  data[header] = []
33
38
  (s.first_row + 1).upto(s.last_row) do |row|
34
39
  cell = s.cell(row,col)
35
40
  # Roo hack for avoiding unnecessary .0's on whole integers (https://github.com/roo-rb/roo/issues/139)
36
41
  cell = s.excelx_value(row,col) if s.excelx_type(row,col) == [:numeric_or_formula, 'General']
42
+ cell.strip! if cell.respond_to?(:strip) && import.strip?
43
+ cell = yield(header, cell) if block_given?
37
44
  data[header] << cell
38
45
  end#row
39
46
  end#col
40
- data
47
+ explode_quantities(data, import.explode)
41
48
  end#xlsx
42
49
  module_function :xlsx
43
50
 
@@ -58,19 +65,29 @@ module Squib
58
65
  # http://www.ruby-doc.org/stdlib-2.0/libdoc/csv/rdoc/CSV.html
59
66
  #
60
67
  # @option opts file [String] the CSV-formatted file to open. Opens relative to the current directory.
68
+ # @option opts strip [Boolean] (true) When true, strips leading and trailing whitespace on values and headers
69
+ # @option opts explode [String] ('qty') Quantity explosion will be applied to the column this name. See README for example.
61
70
  # @return [Hash] a hash of arrays based on columns in the table
62
71
  # @api public
63
72
  def csv(opts = {})
64
73
  file = Args::InputFile.new(file: 'deck.csv').load!(opts).file[0]
65
- opts = Squib::SYSTEM_DEFAULTS.merge(opts)
66
- # opts = Squib::InputHelpers.fileify(opts)
74
+ import = Args::Import.new.load!(opts)
67
75
  table = CSV.read(file, headers: true, converters: :numeric)
68
76
  check_duplicate_csv_headers(table)
69
77
  hash = Hash.new
70
78
  table.headers.each do |header|
71
- hash[header.to_s] ||= table[header]
79
+ new_header = header.to_s
80
+ new_header = new_header.strip if import.strip?
81
+ hash[new_header] ||= table[header]
82
+ end
83
+ if import.strip?
84
+ new_hash = Hash.new
85
+ hash.each do |header, col|
86
+ new_hash[header] = col.map { |str| str = str.strip if str.respond_to?(:strip); str }
87
+ end
88
+ hash = new_hash
72
89
  end
73
- return hash
90
+ return explode_quantities(hash, import.explode)
74
91
  end
75
92
  module_function :csv
76
93
 
@@ -84,6 +101,20 @@ module Squib
84
101
  end
85
102
  module_function :check_duplicate_csv_headers
86
103
 
104
+ def explode_quantities(data, qty)
105
+ return data unless data.key? qty.to_s.strip
106
+ qtys = data[qty]
107
+ new_data = {}
108
+ data.each do |col, arr|
109
+ new_data[col] = []
110
+ qtys.each_with_index do |qty, index|
111
+ qty.to_i.times { new_data[col] << arr[index] }
112
+ end
113
+ end
114
+ return new_data
115
+ end
116
+ module_function :explode_quantities
117
+
87
118
  class Deck
88
119
 
89
120
  # Convenience call on deck goes to the module function
@@ -23,7 +23,7 @@ module Squib
23
23
  input = 0..(deck_size - 1) if input == :all
24
24
  input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
25
25
  raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
26
- raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size-1}") if input.max > (deck_size - 1)
26
+ raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size-1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
27
27
  input
28
28
  end
29
29
 
@@ -0,0 +1,40 @@
1
+ require 'squib/args/arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class Import
8
+ include ArgLoader
9
+
10
+ def self.parameters
11
+ { strip: true,
12
+ explode: 'Qty'
13
+ }
14
+ end
15
+
16
+ def self.expanding_parameters
17
+ [] # none of them
18
+ end
19
+
20
+ def self.params_with_units
21
+ [] # none of them
22
+ end
23
+
24
+ def validate_strip(arg)
25
+ raise 'Strip must be true or false' unless arg == true || arg == false
26
+ arg
27
+ end
28
+
29
+ def validate_explode(arg)
30
+ arg
31
+ end
32
+
33
+ def strip?
34
+ strip
35
+ end
36
+
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,46 @@
1
+ ## Rectangles correspond to the "safe zones" as defined by TheGameCrafter for tuck boxes 2325x1950 pixels
2
+ top_rect:
3
+ x: 313
4
+ y: 198
5
+ width: 688
6
+ height: 167
7
+
8
+ bottom_rect:
9
+ x: 313
10
+ y: 1526
11
+ width: 688
12
+ height: 167
13
+
14
+ right_rect:
15
+ x: 77
16
+ y: 466
17
+ width: 164
18
+ height: 988
19
+
20
+ left_rect:
21
+ x: 1080
22
+ y: 466
23
+ width: 164
24
+ height: 988
25
+
26
+ back_rect:
27
+ x: 313
28
+ y: 466
29
+ width: 688
30
+ height: 989
31
+
32
+ front_rect:
33
+ x: 1322
34
+ y: 466
35
+ width: 688
36
+ height: 989
37
+
38
+ front_curve:
39
+ x1: 1550
40
+ y1: 466
41
+ x2: 1765
42
+ y2: 466
43
+ cx1: 1575
44
+ cy1: 565
45
+ cx2: 1740
46
+ cy2: 565
data/lib/squib/version.rb CHANGED
@@ -6,5 +6,5 @@ module Squib
6
6
  # Most of the time this is in the alpha of the next release.
7
7
  # e.g. v0.0.5a is on its way to becoming v0.0.5
8
8
  #
9
- VERSION = '0.7.0'
9
+ VERSION = '0.8.0'
10
10
  end
@@ -15,4 +15,12 @@ Squib::Deck.new(cards: 2) do
15
15
  end
16
16
 
17
17
  # CSV is also a Squib-module-level function, so this also works:
18
- data = Squib.csv file: 'sample.csv'
18
+ data = Squib.csv file: 'quantity_explosion.csv' # 2 rows...
19
+ num_cards = data['Name'].size # ...but 4 cards!
20
+
21
+ Squib::Deck.new(cards: num_cards) do
22
+ background color: :white
23
+ rect # card border
24
+ text str: data['Name'], font: 'Arial 54'
25
+ save_sheet prefix: 'sample_csv_qty_', columns: 4
26
+ end
data/samples/excel.rb CHANGED
@@ -1,18 +1,55 @@
1
- require 'squib'
2
-
3
- Squib::Deck.new(cards: 3) do
4
- background color: :white
5
-
6
- # Takes the first sheet by default
7
- # Outputs a hash of arrays with the header names as keys
8
- data = xlsx file: 'sample.xlsx'
9
-
10
- text str: data['Name'], x: 250, y: 55, font: 'Arial 54'
11
- text str: data['Level'], x: 65, y: 65, font: 'Arial 72'
12
- text str: data['Description'], x: 65, y: 600, font: 'Arial 36'
13
-
14
- # You can also specify the sheet, starting at 0
15
- data = xlsx file: 'sample.xlsx', sheet: 2
16
-
17
- save format: :png, prefix: 'sample_excel_'
18
- end
1
+ require 'squib'
2
+
3
+ Squib::Deck.new(cards: 3) do
4
+ background color: :white
5
+
6
+ # Reads the first sheet by default (sheet 0)
7
+ # Outputs a hash of arrays with the header names as keys
8
+ data = xlsx file: 'sample.xlsx'
9
+
10
+ text str: data['Name'], x: 250, y: 55, font: 'Arial 54'
11
+ text str: data['Level'], x: 65, y: 65, font: 'Arial 72'
12
+ text str: data['Description'], x: 65, y: 600, font: 'Arial 36'
13
+
14
+ save format: :png, prefix: 'sample_excel_' #save to individual pngs
15
+ end
16
+
17
+ # xlsx is also a Squib-module-level function, so this also works:
18
+ data = Squib.xlsx file: 'explode_quantities.xlsx' # 2 rows...
19
+ num_cards = data['Name'].size # ...but 4 cards!
20
+
21
+ Squib::Deck.new(cards: num_cards) do
22
+ background color: :white
23
+ rect # card border
24
+ text str: data['Name'], font: 'Arial 54'
25
+ save_sheet prefix: 'sample_xlsx_qty_', columns: 4
26
+ end
27
+
28
+
29
+ # Here's another example, a bit more realistic. Here's what's going on:
30
+ # * We call xlsx from Squib directly - BEFORE Squib::Deck creation. This
31
+ # allows us to infer the number of cards based on the size of the "Name"
32
+ # field
33
+ # * We make use of quantity explosion. Fields named "Qty" or "Quantity"
34
+ # (any capitalization), or any other in the "qty_header" get expanded by the
35
+ # number given
36
+ # * We also make sure that trailing and leading whitespace is stripped
37
+ # from each value. This is the default behavior in Squib, but the options
38
+ # are here just to make sure.
39
+
40
+ resource_data = Squib.xlsx(file: 'sample.xlsx', sheet: 2, strip: true) do |header, value|
41
+ case header
42
+ when 'Cost'
43
+ "$#{value}k" # e.g. "3" becomes "$3k"
44
+ else
45
+ value # always return the original value if you didn't do anything to it
46
+ end
47
+ end
48
+
49
+ Squib::Deck.new(cards: resource_data['Name'].size) do
50
+ background color: :white
51
+ rect width: :deck, height: :deck
52
+ text str: resource_data['Name'], align: :center, width: :deck, hint: 'red'
53
+ text str: resource_data['Cost'], align: :right, width: :deck, hint: 'red'
54
+ save_sheet prefix: 'sample_excel_resources_' #save to a whole sheet
55
+ end
Binary file
@@ -0,0 +1,3 @@
1
+ Name,Qty
2
+ Basilisk,3
3
+ High Templar,1
data/samples/sample.xlsx CHANGED
Binary file
@@ -20,22 +20,45 @@ describe Squib::Deck do
20
20
  })
21
21
  end
22
22
 
23
- it 'handles spaces properly' do
23
+ it 'strips spaces by default' do
24
24
  expect(Squib.csv(file: csv_file('with_spaces.csv'))).to eq({
25
- 'With Spaces' => ['a b c ', 3],
25
+ 'With Spaces' => ['a b c', 3],
26
26
  'h2' => [2, 4],
27
27
  'h3' => [3, nil]
28
28
  })
29
29
  end
30
+
31
+ it 'skips space stripping if told to' do
32
+ expect(Squib.csv(strip: false, file: csv_file('with_spaces.csv'))).to eq({
33
+ ' With Spaces ' => ['a b c ', 3],
34
+ 'h2' => [2, 4],
35
+ 'h3' => [3, nil]
36
+ })
37
+ end
38
+
39
+ it 'explodes quantities' do
40
+ expect(Squib.csv(file: csv_file('qty.csv'))).to eq({
41
+ 'Name' => %w(Ha Ha Ha Ho),
42
+ 'Qty' => [3, 3, 3, 1],
43
+ })
44
+ end
45
+
46
+ it 'explodes quantities on specified header' do
47
+ expect(Squib.csv(explode: 'Quantity', file: csv_file('qty_named.csv'))).to eq({
48
+ 'Name' => %w(Ha Ha Ha Ho),
49
+ 'Quantity' => [3, 3, 3, 1],
50
+ })
51
+ end
52
+
30
53
  end
31
54
 
32
55
  context '#xlsx' do
33
56
  it 'loads basic xlsx data' do
34
57
  expect(Squib.xlsx(file: xlsx_file('basic.xlsx'))).to eq({
35
- 'Name' => %w(Larry Curly Mo),
36
- 'General Number' => %w(1 2 3), #general types always get loaded as strings with no conversion
37
- 'Actual Number' => [4.0, 5.0, 6.0], #numbers get auto-converted to integers
38
- })
58
+ 'Name' => %w(Larry Curly Mo),
59
+ 'General Number' => %w(1 2 3), #general types always get loaded as strings with no conversion
60
+ 'Actual Number' => [4.0, 5.0, 6.0], #numbers get auto-converted to integers
61
+ })
39
62
  end
40
63
 
41
64
  it 'loads xlsx with formulas' do
@@ -53,5 +76,42 @@ describe Squib::Deck do
53
76
  })
54
77
  end
55
78
 
79
+ it 'strips whitespace by default' do
80
+ expect(Squib.xlsx(file: xlsx_file('whitespace.xlsx'))).to eq({
81
+ 'With Whitespace' => ['foo', 'bar', 'baz'],
82
+ })
83
+ end
84
+
85
+ it 'does not strip whitespace when specified' do
86
+ expect(Squib.xlsx(file: xlsx_file('whitespace.xlsx'), strip: false)).to eq({
87
+ ' With Whitespace ' => ['foo ', ' bar', ' baz '],
88
+ })
89
+ end
90
+
91
+ it 'yields to block when given' do
92
+ data = Squib.xlsx(file: xlsx_file('basic.xlsx')) do |header, value|
93
+ case header
94
+ when 'Name'
95
+ 'he'
96
+ when 'Actual Number'
97
+ value * 2
98
+ else
99
+ 'ha'
100
+ end
101
+ end
102
+ expect(data).to eq({
103
+ 'Name' => %w(he he he),
104
+ 'General Number' => %w(ha ha ha),
105
+ 'Actual Number' => [8.0, 10.0, 12.0],
106
+ })
107
+ end
108
+
109
+ it 'explodes quantities' do
110
+ expect(Squib.xlsx(explode: 'Qty', file: xlsx_file('explode_quantities.xlsx'))).to eq({
111
+ 'Name' => ['Zergling', 'Zergling', 'Zergling', 'High Templar'],
112
+ 'Qty' => %w(3 3 3 1),
113
+ })
114
+ end
115
+
56
116
  end
57
117
  end
@@ -33,4 +33,9 @@ describe Squib::Args::CardRange do
33
33
  expect(range.to_a).to eq([0])
34
34
  end
35
35
 
36
+ it 'allows [] as an empty range' do
37
+ range = Squib::Args::CardRange.new([], deck_size: 5)
38
+ expect(range.to_a).to eq([])
39
+ end
40
+
36
41
  end
@@ -0,0 +1,3 @@
1
+ Name,Qty
2
+ Ha, 3
3
+ Ho, 1
@@ -0,0 +1,3 @@
1
+ Name,Quantity
2
+ Ha, 3
3
+ Ho, 1
@@ -1,3 +1,3 @@
1
- With Spaces,h2,h3
2
- a b c , 2,3
1
+ With Spaces ,h2,h3
2
+ a b c , 2,3
3
3
  3 ,4
@@ -74,3 +74,140 @@ pango: ellipsized?([])
74
74
  cairo: restore([])
75
75
  surface: write_to_png(["_output/sample_csv_00.png"])
76
76
  surface: write_to_png(["_output/sample_csv_01.png"])
77
+ cairo: antialias=(["subpixel"])
78
+ cairo: antialias=(["subpixel"])
79
+ cairo: antialias=(["subpixel"])
80
+ cairo: antialias=(["subpixel"])
81
+ cairo: save([])
82
+ cairo: set_source_color(["white"])
83
+ cairo: paint([])
84
+ cairo: restore([])
85
+ cairo: save([])
86
+ cairo: set_source_color(["white"])
87
+ cairo: paint([])
88
+ cairo: restore([])
89
+ cairo: save([])
90
+ cairo: set_source_color(["white"])
91
+ cairo: paint([])
92
+ cairo: restore([])
93
+ cairo: save([])
94
+ cairo: set_source_color(["white"])
95
+ cairo: paint([])
96
+ cairo: restore([])
97
+ cairo: save([])
98
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
99
+ cairo: set_source_color(["#0000"])
100
+ cairo: fill_preserve([])
101
+ cairo: set_source_color(["black"])
102
+ cairo: set_line_width([2.0])
103
+ cairo: set_line_join([0])
104
+ cairo: set_line_cap([0])
105
+ cairo: set_dash([[]])
106
+ cairo: stroke([])
107
+ cairo: restore([])
108
+ cairo: save([])
109
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
110
+ cairo: set_source_color(["#0000"])
111
+ cairo: fill_preserve([])
112
+ cairo: set_source_color(["black"])
113
+ cairo: set_line_width([2.0])
114
+ cairo: set_line_join([0])
115
+ cairo: set_line_cap([0])
116
+ cairo: set_dash([[]])
117
+ cairo: stroke([])
118
+ cairo: restore([])
119
+ cairo: save([])
120
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
121
+ cairo: set_source_color(["#0000"])
122
+ cairo: fill_preserve([])
123
+ cairo: set_source_color(["black"])
124
+ cairo: set_line_width([2.0])
125
+ cairo: set_line_join([0])
126
+ cairo: set_line_cap([0])
127
+ cairo: set_dash([[]])
128
+ cairo: stroke([])
129
+ cairo: restore([])
130
+ cairo: save([])
131
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
132
+ cairo: set_source_color(["#0000"])
133
+ cairo: fill_preserve([])
134
+ cairo: set_source_color(["black"])
135
+ cairo: set_line_width([2.0])
136
+ cairo: set_line_join([0])
137
+ cairo: set_line_cap([0])
138
+ cairo: set_dash([[]])
139
+ cairo: stroke([])
140
+ cairo: restore([])
141
+ cairo: save([])
142
+ cairo: set_source_color(["black"])
143
+ cairo: translate([0, 0])
144
+ cairo: rotate([0])
145
+ cairo: move_to([0, 0])
146
+ pango: font_description=([MockDouble])
147
+ pango: text=(["Basilisk"])
148
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
149
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
150
+ pango: alignment=([#<Pango::Layout::Alignment left>])
151
+ pango: justify=([false])
152
+ cairo: move_to([0, 0])
153
+ cairo: move_to([0, 0])
154
+ cairo: show_pango_layout([MockDouble])
155
+ pango: ellipsized?([])
156
+ cairo: restore([])
157
+ cairo: save([])
158
+ cairo: set_source_color(["black"])
159
+ cairo: translate([0, 0])
160
+ cairo: rotate([0])
161
+ cairo: move_to([0, 0])
162
+ pango: font_description=([MockDouble])
163
+ pango: text=(["Basilisk"])
164
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
165
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
166
+ pango: alignment=([#<Pango::Layout::Alignment left>])
167
+ pango: justify=([false])
168
+ cairo: move_to([0, 0])
169
+ cairo: move_to([0, 0])
170
+ cairo: show_pango_layout([MockDouble])
171
+ pango: ellipsized?([])
172
+ cairo: restore([])
173
+ cairo: save([])
174
+ cairo: set_source_color(["black"])
175
+ cairo: translate([0, 0])
176
+ cairo: rotate([0])
177
+ cairo: move_to([0, 0])
178
+ pango: font_description=([MockDouble])
179
+ pango: text=(["Basilisk"])
180
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
181
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
182
+ pango: alignment=([#<Pango::Layout::Alignment left>])
183
+ pango: justify=([false])
184
+ cairo: move_to([0, 0])
185
+ cairo: move_to([0, 0])
186
+ cairo: show_pango_layout([MockDouble])
187
+ pango: ellipsized?([])
188
+ cairo: restore([])
189
+ cairo: save([])
190
+ cairo: set_source_color(["black"])
191
+ cairo: translate([0, 0])
192
+ cairo: rotate([0])
193
+ cairo: move_to([0, 0])
194
+ pango: font_description=([MockDouble])
195
+ pango: text=(["High Templar"])
196
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
197
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
198
+ pango: alignment=([#<Pango::Layout::Alignment left>])
199
+ pango: justify=([false])
200
+ cairo: move_to([0, 0])
201
+ cairo: move_to([0, 0])
202
+ cairo: show_pango_layout([MockDouble])
203
+ pango: ellipsized?([])
204
+ cairo: restore([])
205
+ cairo: set_source([MockDouble, 0, 0])
206
+ cairo: paint([])
207
+ cairo: set_source([MockDouble, 100, 0])
208
+ cairo: paint([])
209
+ cairo: set_source([MockDouble, 200, 0])
210
+ cairo: paint([])
211
+ cairo: set_source([MockDouble, 300, 0])
212
+ cairo: paint([])
213
+ surface: write_to_png(["_output/sample_csv_qty_00.png"])
@@ -160,3 +160,502 @@ cairo: restore([])
160
160
  surface: write_to_png(["_output/sample_excel_00.png"])
161
161
  surface: write_to_png(["_output/sample_excel_01.png"])
162
162
  surface: write_to_png(["_output/sample_excel_02.png"])
163
+ cairo: antialias=(["subpixel"])
164
+ cairo: antialias=(["subpixel"])
165
+ cairo: antialias=(["subpixel"])
166
+ cairo: antialias=(["subpixel"])
167
+ cairo: save([])
168
+ cairo: set_source_color(["white"])
169
+ cairo: paint([])
170
+ cairo: restore([])
171
+ cairo: save([])
172
+ cairo: set_source_color(["white"])
173
+ cairo: paint([])
174
+ cairo: restore([])
175
+ cairo: save([])
176
+ cairo: set_source_color(["white"])
177
+ cairo: paint([])
178
+ cairo: restore([])
179
+ cairo: save([])
180
+ cairo: set_source_color(["white"])
181
+ cairo: paint([])
182
+ cairo: restore([])
183
+ cairo: save([])
184
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
185
+ cairo: set_source_color(["#0000"])
186
+ cairo: fill_preserve([])
187
+ cairo: set_source_color(["black"])
188
+ cairo: set_line_width([2.0])
189
+ cairo: set_line_join([0])
190
+ cairo: set_line_cap([0])
191
+ cairo: set_dash([[]])
192
+ cairo: stroke([])
193
+ cairo: restore([])
194
+ cairo: save([])
195
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
196
+ cairo: set_source_color(["#0000"])
197
+ cairo: fill_preserve([])
198
+ cairo: set_source_color(["black"])
199
+ cairo: set_line_width([2.0])
200
+ cairo: set_line_join([0])
201
+ cairo: set_line_cap([0])
202
+ cairo: set_dash([[]])
203
+ cairo: stroke([])
204
+ cairo: restore([])
205
+ cairo: save([])
206
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
207
+ cairo: set_source_color(["#0000"])
208
+ cairo: fill_preserve([])
209
+ cairo: set_source_color(["black"])
210
+ cairo: set_line_width([2.0])
211
+ cairo: set_line_join([0])
212
+ cairo: set_line_cap([0])
213
+ cairo: set_dash([[]])
214
+ cairo: stroke([])
215
+ cairo: restore([])
216
+ cairo: save([])
217
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
218
+ cairo: set_source_color(["#0000"])
219
+ cairo: fill_preserve([])
220
+ cairo: set_source_color(["black"])
221
+ cairo: set_line_width([2.0])
222
+ cairo: set_line_join([0])
223
+ cairo: set_line_cap([0])
224
+ cairo: set_dash([[]])
225
+ cairo: stroke([])
226
+ cairo: restore([])
227
+ cairo: save([])
228
+ cairo: set_source_color(["black"])
229
+ cairo: translate([0, 0])
230
+ cairo: rotate([0])
231
+ cairo: move_to([0, 0])
232
+ pango: font_description=([MockDouble])
233
+ pango: text=(["Zergling"])
234
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
235
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
236
+ pango: alignment=([#<Pango::Layout::Alignment left>])
237
+ pango: justify=([false])
238
+ cairo: move_to([0, 0])
239
+ cairo: move_to([0, 0])
240
+ cairo: show_pango_layout([MockDouble])
241
+ pango: ellipsized?([])
242
+ cairo: restore([])
243
+ cairo: save([])
244
+ cairo: set_source_color(["black"])
245
+ cairo: translate([0, 0])
246
+ cairo: rotate([0])
247
+ cairo: move_to([0, 0])
248
+ pango: font_description=([MockDouble])
249
+ pango: text=(["Zergling"])
250
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
251
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
252
+ pango: alignment=([#<Pango::Layout::Alignment left>])
253
+ pango: justify=([false])
254
+ cairo: move_to([0, 0])
255
+ cairo: move_to([0, 0])
256
+ cairo: show_pango_layout([MockDouble])
257
+ pango: ellipsized?([])
258
+ cairo: restore([])
259
+ cairo: save([])
260
+ cairo: set_source_color(["black"])
261
+ cairo: translate([0, 0])
262
+ cairo: rotate([0])
263
+ cairo: move_to([0, 0])
264
+ pango: font_description=([MockDouble])
265
+ pango: text=(["Zergling"])
266
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
267
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
268
+ pango: alignment=([#<Pango::Layout::Alignment left>])
269
+ pango: justify=([false])
270
+ cairo: move_to([0, 0])
271
+ cairo: move_to([0, 0])
272
+ cairo: show_pango_layout([MockDouble])
273
+ pango: ellipsized?([])
274
+ cairo: restore([])
275
+ cairo: save([])
276
+ cairo: set_source_color(["black"])
277
+ cairo: translate([0, 0])
278
+ cairo: rotate([0])
279
+ cairo: move_to([0, 0])
280
+ pango: font_description=([MockDouble])
281
+ pango: text=(["High Templar"])
282
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
283
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
284
+ pango: alignment=([#<Pango::Layout::Alignment left>])
285
+ pango: justify=([false])
286
+ cairo: move_to([0, 0])
287
+ cairo: move_to([0, 0])
288
+ cairo: show_pango_layout([MockDouble])
289
+ pango: ellipsized?([])
290
+ cairo: restore([])
291
+ cairo: set_source([MockDouble, 0, 0])
292
+ cairo: paint([])
293
+ cairo: set_source([MockDouble, 100, 0])
294
+ cairo: paint([])
295
+ cairo: set_source([MockDouble, 200, 0])
296
+ cairo: paint([])
297
+ cairo: set_source([MockDouble, 300, 0])
298
+ cairo: paint([])
299
+ surface: write_to_png(["_output/sample_xlsx_qty_00.png"])
300
+ cairo: antialias=(["subpixel"])
301
+ cairo: antialias=(["subpixel"])
302
+ cairo: antialias=(["subpixel"])
303
+ cairo: antialias=(["subpixel"])
304
+ cairo: antialias=(["subpixel"])
305
+ cairo: antialias=(["subpixel"])
306
+ cairo: save([])
307
+ cairo: set_source_color(["white"])
308
+ cairo: paint([])
309
+ cairo: restore([])
310
+ cairo: save([])
311
+ cairo: set_source_color(["white"])
312
+ cairo: paint([])
313
+ cairo: restore([])
314
+ cairo: save([])
315
+ cairo: set_source_color(["white"])
316
+ cairo: paint([])
317
+ cairo: restore([])
318
+ cairo: save([])
319
+ cairo: set_source_color(["white"])
320
+ cairo: paint([])
321
+ cairo: restore([])
322
+ cairo: save([])
323
+ cairo: set_source_color(["white"])
324
+ cairo: paint([])
325
+ cairo: restore([])
326
+ cairo: save([])
327
+ cairo: set_source_color(["white"])
328
+ cairo: paint([])
329
+ cairo: restore([])
330
+ cairo: save([])
331
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
332
+ cairo: set_source_color(["#0000"])
333
+ cairo: fill_preserve([])
334
+ cairo: set_source_color(["black"])
335
+ cairo: set_line_width([2.0])
336
+ cairo: set_line_join([0])
337
+ cairo: set_line_cap([0])
338
+ cairo: set_dash([[]])
339
+ cairo: stroke([])
340
+ cairo: restore([])
341
+ cairo: save([])
342
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
343
+ cairo: set_source_color(["#0000"])
344
+ cairo: fill_preserve([])
345
+ cairo: set_source_color(["black"])
346
+ cairo: set_line_width([2.0])
347
+ cairo: set_line_join([0])
348
+ cairo: set_line_cap([0])
349
+ cairo: set_dash([[]])
350
+ cairo: stroke([])
351
+ cairo: restore([])
352
+ cairo: save([])
353
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
354
+ cairo: set_source_color(["#0000"])
355
+ cairo: fill_preserve([])
356
+ cairo: set_source_color(["black"])
357
+ cairo: set_line_width([2.0])
358
+ cairo: set_line_join([0])
359
+ cairo: set_line_cap([0])
360
+ cairo: set_dash([[]])
361
+ cairo: stroke([])
362
+ cairo: restore([])
363
+ cairo: save([])
364
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
365
+ cairo: set_source_color(["#0000"])
366
+ cairo: fill_preserve([])
367
+ cairo: set_source_color(["black"])
368
+ cairo: set_line_width([2.0])
369
+ cairo: set_line_join([0])
370
+ cairo: set_line_cap([0])
371
+ cairo: set_dash([[]])
372
+ cairo: stroke([])
373
+ cairo: restore([])
374
+ cairo: save([])
375
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
376
+ cairo: set_source_color(["#0000"])
377
+ cairo: fill_preserve([])
378
+ cairo: set_source_color(["black"])
379
+ cairo: set_line_width([2.0])
380
+ cairo: set_line_join([0])
381
+ cairo: set_line_cap([0])
382
+ cairo: set_dash([[]])
383
+ cairo: stroke([])
384
+ cairo: restore([])
385
+ cairo: save([])
386
+ cairo: rounded_rectangle([0, 0, 825, 1125, 0, 0])
387
+ cairo: set_source_color(["#0000"])
388
+ cairo: fill_preserve([])
389
+ cairo: set_source_color(["black"])
390
+ cairo: set_line_width([2.0])
391
+ cairo: set_line_join([0])
392
+ cairo: set_line_cap([0])
393
+ cairo: set_dash([[]])
394
+ cairo: stroke([])
395
+ cairo: restore([])
396
+ cairo: save([])
397
+ cairo: set_source_color(["black"])
398
+ cairo: translate([0, 0])
399
+ cairo: rotate([0])
400
+ cairo: move_to([0, 0])
401
+ pango: font_description=([MockDouble])
402
+ pango: text=(["Wood"])
403
+ pango: width=([844800])
404
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
405
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
406
+ pango: alignment=([#<Pango::Layout::Alignment center>])
407
+ pango: justify=([false])
408
+ cairo: move_to([0, 0])
409
+ cairo: move_to([0, 0])
410
+ cairo: show_pango_layout([MockDouble])
411
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
412
+ cairo: set_source_color(["red"])
413
+ cairo: set_line_width([2.0])
414
+ cairo: stroke([])
415
+ pango: ellipsized?([])
416
+ cairo: restore([])
417
+ cairo: save([])
418
+ cairo: set_source_color(["black"])
419
+ cairo: translate([0, 0])
420
+ cairo: rotate([0])
421
+ cairo: move_to([0, 0])
422
+ pango: font_description=([MockDouble])
423
+ pango: text=(["Wood"])
424
+ pango: width=([844800])
425
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
426
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
427
+ pango: alignment=([#<Pango::Layout::Alignment center>])
428
+ pango: justify=([false])
429
+ cairo: move_to([0, 0])
430
+ cairo: move_to([0, 0])
431
+ cairo: show_pango_layout([MockDouble])
432
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
433
+ cairo: set_source_color(["red"])
434
+ cairo: set_line_width([2.0])
435
+ cairo: stroke([])
436
+ pango: ellipsized?([])
437
+ cairo: restore([])
438
+ cairo: save([])
439
+ cairo: set_source_color(["black"])
440
+ cairo: translate([0, 0])
441
+ cairo: rotate([0])
442
+ cairo: move_to([0, 0])
443
+ pango: font_description=([MockDouble])
444
+ pango: text=(["Wood"])
445
+ pango: width=([844800])
446
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
447
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
448
+ pango: alignment=([#<Pango::Layout::Alignment center>])
449
+ pango: justify=([false])
450
+ cairo: move_to([0, 0])
451
+ cairo: move_to([0, 0])
452
+ cairo: show_pango_layout([MockDouble])
453
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
454
+ cairo: set_source_color(["red"])
455
+ cairo: set_line_width([2.0])
456
+ cairo: stroke([])
457
+ pango: ellipsized?([])
458
+ cairo: restore([])
459
+ cairo: save([])
460
+ cairo: set_source_color(["black"])
461
+ cairo: translate([0, 0])
462
+ cairo: rotate([0])
463
+ cairo: move_to([0, 0])
464
+ pango: font_description=([MockDouble])
465
+ pango: text=(["Metal"])
466
+ pango: width=([844800])
467
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
468
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
469
+ pango: alignment=([#<Pango::Layout::Alignment center>])
470
+ pango: justify=([false])
471
+ cairo: move_to([0, 0])
472
+ cairo: move_to([0, 0])
473
+ cairo: show_pango_layout([MockDouble])
474
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
475
+ cairo: set_source_color(["red"])
476
+ cairo: set_line_width([2.0])
477
+ cairo: stroke([])
478
+ pango: ellipsized?([])
479
+ cairo: restore([])
480
+ cairo: save([])
481
+ cairo: set_source_color(["black"])
482
+ cairo: translate([0, 0])
483
+ cairo: rotate([0])
484
+ cairo: move_to([0, 0])
485
+ pango: font_description=([MockDouble])
486
+ pango: text=(["Metal"])
487
+ pango: width=([844800])
488
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
489
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
490
+ pango: alignment=([#<Pango::Layout::Alignment center>])
491
+ pango: justify=([false])
492
+ cairo: move_to([0, 0])
493
+ cairo: move_to([0, 0])
494
+ cairo: show_pango_layout([MockDouble])
495
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
496
+ cairo: set_source_color(["red"])
497
+ cairo: set_line_width([2.0])
498
+ cairo: stroke([])
499
+ pango: ellipsized?([])
500
+ cairo: restore([])
501
+ cairo: save([])
502
+ cairo: set_source_color(["black"])
503
+ cairo: translate([0, 0])
504
+ cairo: rotate([0])
505
+ cairo: move_to([0, 0])
506
+ pango: font_description=([MockDouble])
507
+ pango: text=(["Stone"])
508
+ pango: width=([844800])
509
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
510
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
511
+ pango: alignment=([#<Pango::Layout::Alignment center>])
512
+ pango: justify=([false])
513
+ cairo: move_to([0, 0])
514
+ cairo: move_to([0, 0])
515
+ cairo: show_pango_layout([MockDouble])
516
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
517
+ cairo: set_source_color(["red"])
518
+ cairo: set_line_width([2.0])
519
+ cairo: stroke([])
520
+ pango: ellipsized?([])
521
+ cairo: restore([])
522
+ cairo: save([])
523
+ cairo: set_source_color(["black"])
524
+ cairo: translate([0, 0])
525
+ cairo: rotate([0])
526
+ cairo: move_to([0, 0])
527
+ pango: font_description=([MockDouble])
528
+ pango: text=(["$2k"])
529
+ pango: width=([844800])
530
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
531
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
532
+ pango: alignment=([#<Pango::Layout::Alignment right>])
533
+ pango: justify=([false])
534
+ cairo: move_to([0, 0])
535
+ cairo: move_to([0, 0])
536
+ cairo: show_pango_layout([MockDouble])
537
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
538
+ cairo: set_source_color(["red"])
539
+ cairo: set_line_width([2.0])
540
+ cairo: stroke([])
541
+ pango: ellipsized?([])
542
+ cairo: restore([])
543
+ cairo: save([])
544
+ cairo: set_source_color(["black"])
545
+ cairo: translate([0, 0])
546
+ cairo: rotate([0])
547
+ cairo: move_to([0, 0])
548
+ pango: font_description=([MockDouble])
549
+ pango: text=(["$2k"])
550
+ pango: width=([844800])
551
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
552
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
553
+ pango: alignment=([#<Pango::Layout::Alignment right>])
554
+ pango: justify=([false])
555
+ cairo: move_to([0, 0])
556
+ cairo: move_to([0, 0])
557
+ cairo: show_pango_layout([MockDouble])
558
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
559
+ cairo: set_source_color(["red"])
560
+ cairo: set_line_width([2.0])
561
+ cairo: stroke([])
562
+ pango: ellipsized?([])
563
+ cairo: restore([])
564
+ cairo: save([])
565
+ cairo: set_source_color(["black"])
566
+ cairo: translate([0, 0])
567
+ cairo: rotate([0])
568
+ cairo: move_to([0, 0])
569
+ pango: font_description=([MockDouble])
570
+ pango: text=(["$2k"])
571
+ pango: width=([844800])
572
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
573
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
574
+ pango: alignment=([#<Pango::Layout::Alignment right>])
575
+ pango: justify=([false])
576
+ cairo: move_to([0, 0])
577
+ cairo: move_to([0, 0])
578
+ cairo: show_pango_layout([MockDouble])
579
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
580
+ cairo: set_source_color(["red"])
581
+ cairo: set_line_width([2.0])
582
+ cairo: stroke([])
583
+ pango: ellipsized?([])
584
+ cairo: restore([])
585
+ cairo: save([])
586
+ cairo: set_source_color(["black"])
587
+ cairo: translate([0, 0])
588
+ cairo: rotate([0])
589
+ cairo: move_to([0, 0])
590
+ pango: font_description=([MockDouble])
591
+ pango: text=(["$3k"])
592
+ pango: width=([844800])
593
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
594
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
595
+ pango: alignment=([#<Pango::Layout::Alignment right>])
596
+ pango: justify=([false])
597
+ cairo: move_to([0, 0])
598
+ cairo: move_to([0, 0])
599
+ cairo: show_pango_layout([MockDouble])
600
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
601
+ cairo: set_source_color(["red"])
602
+ cairo: set_line_width([2.0])
603
+ cairo: stroke([])
604
+ pango: ellipsized?([])
605
+ cairo: restore([])
606
+ cairo: save([])
607
+ cairo: set_source_color(["black"])
608
+ cairo: translate([0, 0])
609
+ cairo: rotate([0])
610
+ cairo: move_to([0, 0])
611
+ pango: font_description=([MockDouble])
612
+ pango: text=(["$3k"])
613
+ pango: width=([844800])
614
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
615
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
616
+ pango: alignment=([#<Pango::Layout::Alignment right>])
617
+ pango: justify=([false])
618
+ cairo: move_to([0, 0])
619
+ cairo: move_to([0, 0])
620
+ cairo: show_pango_layout([MockDouble])
621
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
622
+ cairo: set_source_color(["red"])
623
+ cairo: set_line_width([2.0])
624
+ cairo: stroke([])
625
+ pango: ellipsized?([])
626
+ cairo: restore([])
627
+ cairo: save([])
628
+ cairo: set_source_color(["black"])
629
+ cairo: translate([0, 0])
630
+ cairo: rotate([0])
631
+ cairo: move_to([0, 0])
632
+ pango: font_description=([MockDouble])
633
+ pango: text=(["$5k"])
634
+ pango: width=([844800])
635
+ pango: wrap=([#<Pango::Layout::WrapMode word-char>])
636
+ pango: ellipsize=([#<Pango::Layout::EllipsizeMode end>])
637
+ pango: alignment=([#<Pango::Layout::Alignment right>])
638
+ pango: justify=([false])
639
+ cairo: move_to([0, 0])
640
+ cairo: move_to([0, 0])
641
+ cairo: show_pango_layout([MockDouble])
642
+ cairo: rounded_rectangle([0, 0, 0, 0, 0, 0])
643
+ cairo: set_source_color(["red"])
644
+ cairo: set_line_width([2.0])
645
+ cairo: stroke([])
646
+ pango: ellipsized?([])
647
+ cairo: restore([])
648
+ cairo: set_source([MockDouble, 0, 0])
649
+ cairo: paint([])
650
+ cairo: set_source([MockDouble, 100, 0])
651
+ cairo: paint([])
652
+ cairo: set_source([MockDouble, 200, 0])
653
+ cairo: paint([])
654
+ cairo: set_source([MockDouble, 300, 0])
655
+ cairo: paint([])
656
+ cairo: set_source([MockDouble, 400, 0])
657
+ cairo: paint([])
658
+ surface: write_to_png(["_output/sample_excel_resources_00.png"])
659
+ cairo: set_source([MockDouble, 0, 0])
660
+ cairo: paint([])
661
+ surface: write_to_png(["_output/sample_excel_resources_01.png"])
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Meneely
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-11 00:00:00.000000000 Z
11
+ date: 2015-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cairo
@@ -297,6 +297,7 @@ files:
297
297
  - lib/squib/args/embed_adjust.rb
298
298
  - lib/squib/args/embed_key.rb
299
299
  - lib/squib/args/hand_special.rb
300
+ - lib/squib/args/import.rb
300
301
  - lib/squib/args/input_file.rb
301
302
  - lib/squib/args/paint.rb
302
303
  - lib/squib/args/paragraph.rb
@@ -328,6 +329,7 @@ files:
328
329
  - lib/squib/layouts/fantasy.yml
329
330
  - lib/squib/layouts/hand.yml
330
331
  - lib/squib/layouts/playing-card.yml
332
+ - lib/squib/layouts/tuck_box.yml
331
333
  - lib/squib/progress.rb
332
334
  - lib/squib/project_template/.gitignore
333
335
  - lib/squib/project_template/ABOUT.md
@@ -361,6 +363,7 @@ files:
361
363
  - samples/draw_shapes.rb
362
364
  - samples/embed_text.rb
363
365
  - samples/excel.rb
366
+ - samples/explode_quantities.xlsx
364
367
  - samples/glass-heart.svg
365
368
  - samples/gradients.rb
366
369
  - samples/grit.png
@@ -372,6 +375,7 @@ files:
372
375
  - samples/offset.svg
373
376
  - samples/pokercard.png
374
377
  - samples/portrait-landscape.rb
378
+ - samples/quantity_explosion.csv
375
379
  - samples/ranges.rb
376
380
  - samples/sample.csv
377
381
  - samples/sample.xlsx
@@ -404,6 +408,8 @@ files:
404
408
  - spec/data/conf/empty.yml
405
409
  - spec/data/csv/basic.csv
406
410
  - spec/data/csv/dup_cols.csv
411
+ - spec/data/csv/qty.csv
412
+ - spec/data/csv/qty_named.csv
407
413
  - spec/data/csv/with_spaces.csv
408
414
  - spec/data/layouts/easy-circular-extends.yml
409
415
  - spec/data/layouts/empty-rule.yml
@@ -444,7 +450,9 @@ files:
444
450
  - spec/data/samples/tgc_proofs.rb.txt
445
451
  - spec/data/samples/units.rb.txt
446
452
  - spec/data/xlsx/basic.xlsx
453
+ - spec/data/xlsx/explode_quantities.xlsx
447
454
  - spec/data/xlsx/formulas.xlsx
455
+ - spec/data/xlsx/whitespace.xlsx
448
456
  - spec/data/xlsx/with_macros.xlsm
449
457
  - spec/deck_spec.rb
450
458
  - spec/graphics/cairo_context_wrapper_spec.rb
@@ -561,6 +569,8 @@ test_files:
561
569
  - spec/data/conf/empty.yml
562
570
  - spec/data/csv/basic.csv
563
571
  - spec/data/csv/dup_cols.csv
572
+ - spec/data/csv/qty.csv
573
+ - spec/data/csv/qty_named.csv
564
574
  - spec/data/csv/with_spaces.csv
565
575
  - spec/data/layouts/easy-circular-extends.yml
566
576
  - spec/data/layouts/empty-rule.yml
@@ -601,7 +611,9 @@ test_files:
601
611
  - spec/data/samples/tgc_proofs.rb.txt
602
612
  - spec/data/samples/units.rb.txt
603
613
  - spec/data/xlsx/basic.xlsx
614
+ - spec/data/xlsx/explode_quantities.xlsx
604
615
  - spec/data/xlsx/formulas.xlsx
616
+ - spec/data/xlsx/whitespace.xlsx
605
617
  - spec/data/xlsx/with_macros.xlsm
606
618
  - spec/deck_spec.rb
607
619
  - spec/graphics/cairo_context_wrapper_spec.rb