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 +4 -4
- data/CHANGELOG.md +14 -1
- data/README.md +17 -2
- data/lib/squib/api/data.rb +37 -6
- data/lib/squib/args/card_range.rb +1 -1
- data/lib/squib/args/import.rb +40 -0
- data/lib/squib/layouts/tuck_box.yml +46 -0
- data/lib/squib/version.rb +1 -1
- data/samples/csv_import.rb +9 -1
- data/samples/excel.rb +55 -18
- data/samples/explode_quantities.xlsx +0 -0
- data/samples/quantity_explosion.csv +3 -0
- data/samples/sample.xlsx +0 -0
- data/spec/api/api_data_spec.rb +66 -6
- data/spec/args/range_spec.rb +5 -0
- data/spec/data/csv/qty.csv +3 -0
- data/spec/data/csv/qty_named.csv +3 -0
- data/spec/data/csv/with_spaces.csv +2 -2
- data/spec/data/samples/csv_import.rb.txt +137 -0
- data/spec/data/samples/excel.rb.txt +499 -0
- data/spec/data/xlsx/explode_quantities.xlsx +0 -0
- data/spec/data/xlsx/whitespace.xlsx +0 -0
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebe09b3a47c609d39587cd6ca28697dda3f7799b
|
4
|
+
data.tar.gz: d92fedcde11597ef02277afd1d4cace28a08537a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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),
|
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'
|
data/lib/squib/api/data.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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
data/samples/csv_import.rb
CHANGED
@@ -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
|
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
|
-
#
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
data/samples/sample.xlsx
CHANGED
Binary file
|
data/spec/api/api_data_spec.rb
CHANGED
@@ -20,22 +20,45 @@ describe Squib::Deck do
|
|
20
20
|
})
|
21
21
|
end
|
22
22
|
|
23
|
-
it '
|
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
|
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
|
-
|
36
|
-
|
37
|
-
|
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
|
data/spec/args/range_spec.rb
CHANGED
@@ -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
|
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.
|
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-
|
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
|