squib 0.15.2 → 0.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +41 -41
- data/.travis.yml +17 -17
- data/CHANGELOG.md +400 -395
- data/CONTRIBUTING.md +40 -40
- data/Dockerfile +25 -25
- data/Gemfile +2 -2
- data/LICENSE.txt +22 -22
- data/README.md +145 -145
- data/RELEASE TODO.md +21 -21
- data/Rakefile +48 -48
- data/appveyor.yml +25 -25
- data/bin/squib +4 -4
- data/lib/squib.rb +32 -32
- data/lib/squib/api/background.rb +15 -15
- data/lib/squib/api/data.rb +137 -137
- data/lib/squib/api/groups.rb +54 -54
- data/lib/squib/api/image.rb +49 -49
- data/lib/squib/api/save.rb +83 -83
- data/lib/squib/api/settings.rb +21 -21
- data/lib/squib/api/shapes.rb +124 -124
- data/lib/squib/api/text.rb +25 -25
- data/lib/squib/api/text_embed.rb +71 -71
- data/lib/squib/api/units.rb +27 -27
- data/lib/squib/args/arg_loader.rb +126 -126
- data/lib/squib/args/box.rb +55 -55
- data/lib/squib/args/card_range.rb +32 -32
- data/lib/squib/args/color_validator.rb +12 -12
- data/lib/squib/args/coords.rb +35 -35
- data/lib/squib/args/csv_opts.rb +25 -25
- data/lib/squib/args/dir_validator.rb +16 -16
- data/lib/squib/args/draw.rb +92 -92
- data/lib/squib/args/embed_adjust.rb +25 -25
- data/lib/squib/args/embed_key.rb +17 -17
- data/lib/squib/args/hand_special.rb +37 -37
- data/lib/squib/args/import.rb +40 -40
- data/lib/squib/args/input_file.rb +37 -37
- data/lib/squib/args/paint.rb +44 -44
- data/lib/squib/args/paragraph.rb +116 -116
- data/lib/squib/args/save_batch.rb +63 -63
- data/lib/squib/args/scale_box.rb +53 -53
- data/lib/squib/args/sheet.rb +172 -172
- data/lib/squib/args/showcase_special.rb +41 -41
- data/lib/squib/args/sprue_file.rb +44 -44
- data/lib/squib/args/svg_special.rb +37 -37
- data/lib/squib/args/transform.rb +61 -61
- data/lib/squib/args/typographer.rb +119 -119
- data/lib/squib/args/unit_conversion.rb +29 -29
- data/lib/squib/builtin/layouts/economy.yml +85 -85
- data/lib/squib/builtin/layouts/fantasy.yml +101 -101
- data/lib/squib/builtin/layouts/hand.yml +62 -62
- data/lib/squib/builtin/layouts/party.yml +94 -94
- data/lib/squib/builtin/layouts/playing-card.yml +35 -35
- data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
- data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
- data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
- data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
- data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
- data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
- data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
- data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
- data/lib/squib/builtin/projects/advanced/config.yml +49 -49
- data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
- data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
- data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
- data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
- data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
- data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
- data/lib/squib/builtin/projects/basic/.gitignore +4 -4
- data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
- data/lib/squib/builtin/projects/basic/Gemfile +3 -3
- data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
- data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
- data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
- data/lib/squib/builtin/projects/basic/RULES.md +21 -21
- data/lib/squib/builtin/projects/basic/Rakefile +7 -7
- data/lib/squib/builtin/projects/basic/config.yml +49 -49
- data/lib/squib/builtin/projects/basic/deck.rb +6 -6
- data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
- data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
- data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
- data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
- data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -10
- data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
- data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
- data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -68
- data/lib/squib/card.rb +75 -75
- data/lib/squib/commands/cli.rb +39 -39
- data/lib/squib/commands/data/template_option.rb +109 -109
- data/lib/squib/commands/make_sprue.rb +277 -277
- data/lib/squib/commands/new.rb +77 -77
- data/lib/squib/conf.rb +139 -139
- data/lib/squib/constants.rb +17 -17
- data/lib/squib/deck.rb +116 -116
- data/lib/squib/graphics/background.rb +14 -14
- data/lib/squib/graphics/cairo_context_wrapper.rb +113 -113
- data/lib/squib/graphics/embedding_utils.rb +28 -28
- data/lib/squib/graphics/gradient_regex.rb +47 -47
- data/lib/squib/graphics/hand.rb +42 -42
- data/lib/squib/graphics/image.rb +123 -123
- data/lib/squib/graphics/save_doc.rb +61 -61
- data/lib/squib/graphics/save_images.rb +52 -52
- data/lib/squib/graphics/save_pdf.rb +90 -90
- data/lib/squib/graphics/save_sprue.rb +219 -219
- data/lib/squib/graphics/shapes.rb +143 -143
- data/lib/squib/graphics/showcase.rb +85 -85
- data/lib/squib/graphics/text.rb +174 -174
- data/lib/squib/import/data_frame.rb +108 -108
- data/lib/squib/layout_parser.rb +138 -138
- data/lib/squib/progress.rb +38 -38
- data/lib/squib/sample_helpers.rb +34 -34
- data/lib/squib/sprues/crop_line.rb +28 -28
- data/lib/squib/sprues/crop_line_dash.rb +35 -35
- data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
- data/lib/squib/sprues/sprue.rb +206 -206
- data/lib/squib/sprues/sprue_schema.rb +50 -50
- data/lib/squib/version.rb +10 -10
- data/samples/autoscale_font/_autoscale_font.rb +29 -29
- data/samples/backend/_backend.rb +26 -26
- data/samples/basic.rb +19 -19
- data/samples/build_groups/build_groups.rb +36 -36
- data/samples/colors/_colors.rb +44 -44
- data/samples/colors/_gradients.rb +34 -34
- data/samples/colors/_switch_color.rb +33 -33
- data/samples/config/config_text_markup.rb +20 -20
- data/samples/config/custom_config.rb +18 -18
- data/samples/data/_csv.rb +33 -33
- data/samples/data/_excel.rb +55 -55
- data/samples/data/_yaml.rb +12 -12
- data/samples/hello_world.rb +6 -6
- data/samples/images/_cairo_access.rb +39 -39
- data/samples/images/_images.rb +104 -104
- data/samples/images/_more_load_images.rb +102 -102
- data/samples/intro/01_hello.rb +8 -8
- data/samples/intro/02_options.rb +14 -14
- data/samples/intro/03_layout.rb +11 -11
- data/samples/intro/04_arrays.rb +15 -15
- data/samples/intro/05_excel.rb +14 -14
- data/samples/layouts/builtin_layouts.rb +97 -97
- data/samples/layouts/layouts.rb +71 -71
- data/samples/project/src/characters.rb +8 -8
- data/samples/project/src/skills.rb +7 -7
- data/samples/proofs/_tgc_proofs.rb +16 -16
- data/samples/ranges/_ranges.rb +64 -64
- data/samples/saves/_hand.rb +23 -23
- data/samples/saves/_portrait_landscape.rb +23 -23
- data/samples/saves/_save_filenames.rb +24 -24
- data/samples/saves/_save_pdf.rb +29 -29
- data/samples/saves/_saves.rb +51 -51
- data/samples/saves/_showcase.rb +25 -25
- data/samples/shapes/_draw_shapes.rb +60 -60
- data/samples/shapes/_proofs.rb +22 -22
- data/samples/sprues/_advanced_sprues.rb +25 -25
- data/samples/sprues/_builtin_sprues.rb +21 -21
- data/samples/sprues/_fold_sheet.rb +27 -27
- data/samples/sprues/_hex_tiles.rb +15 -15
- data/samples/sprues/_mints.rb +11 -11
- data/samples/sprues/_sprue_example.rb +11 -11
- data/samples/text/_embed_text.rb +128 -128
- data/samples/text/_text.rb +47 -47
- data/samples/text/_text_options.rb +102 -102
- data/samples/text/bug134.rb +14 -14
- data/samples/units/_units.rb +32 -32
- data/squib.gemspec +52 -52
- metadata +62 -63
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
require 'squib'
|
|
3
|
-
|
|
4
|
-
data = { 'name' => ['Thief', 'Grifter', 'Mastermind'],
|
|
5
|
-
'level' => [1, 2, 3] }
|
|
6
|
-
longtext = "This is left-justified text, with newlines.\nWhat do you know about tweetle beetles? well... When tweetle beetles fight, it's called a tweetle beetle battle. And when they battle in a puddle, it's a tweetle beetle puddle battle. AND when tweetle beetles battle with paddles in a puddle, they call it a tweetle beetle puddle paddle battle. AND... When beetles battle beetles in a puddle paddle battle and the beetle battle puddle is a puddle in a bottle... ..they call this a tweetle beetle bottle puddle paddle battle muddle."
|
|
7
|
-
|
|
8
|
-
Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
|
9
|
-
background color: :white
|
|
10
|
-
rect x: 15, y: 15, width: 795, height: 1095, x_radius: 50, y_radius: 50
|
|
11
|
-
rect x: 30, y: 30, width: 128, height: 128, x_radius: 25, y_radius: 25
|
|
12
|
-
|
|
13
|
-
# Arrays are rendered over each card
|
|
14
|
-
text str: data['name'], x: 250, y: 55, font: 'Arial weight=900 18'
|
|
15
|
-
text str: data['level'], x: 65, y: 40, font: 'Arial 24', color: :burnt_orange
|
|
16
|
-
|
|
17
|
-
text str: 'Font strings are expressive!', x:65, y: 200,
|
|
18
|
-
font: 'Impact bold italic 12'
|
|
19
|
-
|
|
20
|
-
text str: 'Font strings are expressive!', x:65, y: 300,
|
|
21
|
-
font: 'Arial,Verdana weight=900 style=oblique 12'
|
|
22
|
-
|
|
23
|
-
text str: 'Font string sizes can be overridden per card.', x: 65, y: 350,
|
|
24
|
-
font: 'Impact 12', font_size: [5, 7, 8]
|
|
25
|
-
|
|
26
|
-
text str: 'This text has fixed width, fixed height, center-aligned, middle-valigned, and has a red hint',
|
|
27
|
-
hint: :red,
|
|
28
|
-
x: 65, y: 400,
|
|
29
|
-
width: 300, height: 125,
|
|
30
|
-
align: :center, valign: 'MIDDLE', # these can be specified with case-insenstive strings too
|
|
31
|
-
font: 'Serif 5'
|
|
32
|
-
|
|
33
|
-
extents = text str: 'Ink extent return value',
|
|
34
|
-
x: 65, y: 550,
|
|
35
|
-
font: 'Sans Bold', font_size: [5, 7, 8]
|
|
36
|
-
margin = 10
|
|
37
|
-
# Extents come back as an array of hashes, which can get split out like this
|
|
38
|
-
ws = extents.inject([]) { |arr, ext| arr << ext[:width] + 10; arr }
|
|
39
|
-
hs = extents.inject([]) { |arr, ext| arr << ext[:height] + 10; arr }
|
|
40
|
-
rect x: 65 - margin / 2, y: 550 - margin / 2,
|
|
41
|
-
width: ws, height: hs,
|
|
42
|
-
radius: 10, stroke_color: :black
|
|
43
|
-
|
|
44
|
-
# If width & height are defined and the text will overflow the box, we can ellipsize.
|
|
45
|
-
text str: "Ellipsization!\nThe ultimate question of life, the universe, and everything to life and everything is 42",
|
|
46
|
-
hint: :green, font: 'Arial 7',
|
|
47
|
-
x: 450, y: 400,
|
|
48
|
-
width: 280, height: 180,
|
|
49
|
-
ellipsize: true
|
|
50
|
-
|
|
51
|
-
# Text hints are guides for showing you how your text boxes are laid out exactly
|
|
52
|
-
hint text: :cyan
|
|
53
|
-
set font: 'Serif 7' # Impacts all future text calls (unless they specify differently)
|
|
54
|
-
text str: 'Text hints & fonts are globally togglable!', x: 65, y: 625
|
|
55
|
-
set font: :default # back to Squib-wide default
|
|
56
|
-
hint text: :off
|
|
57
|
-
text str: 'See? No hint here.',
|
|
58
|
-
x: 565, y: 625,
|
|
59
|
-
font: 'Arial 7'
|
|
60
|
-
|
|
61
|
-
# Text can be rotated, in radians, about the upper-left corner of the text box.
|
|
62
|
-
text str: 'Rotated',
|
|
63
|
-
x: 565, y: 675, angle: 0.2,
|
|
64
|
-
font: 'Arial 6', hint: :red
|
|
65
|
-
|
|
66
|
-
# Text can be justified, and have newlines
|
|
67
|
-
text str: longtext, font: 'Arial 5',
|
|
68
|
-
x: 65, y: 700,
|
|
69
|
-
width: '1.5in', height: inches(1),
|
|
70
|
-
justify: true, spacing: -6
|
|
71
|
-
|
|
72
|
-
# Here's how you embed images into text.
|
|
73
|
-
# Pass a block to the method call and use the given context
|
|
74
|
-
embed_text = 'Embedded icons! Take 1 :tool: and gain 2:health:. If Level 2, take 2 :tool:'
|
|
75
|
-
text(str: embed_text, font: 'Sans 6',
|
|
76
|
-
x: '1.8in', y: '2.5in', width: '0.85in',
|
|
77
|
-
align: :left, ellipsize: false) do |embed|
|
|
78
|
-
embed.svg key: ':tool:', width: 28, height: 28, file: 'spanner.svg'
|
|
79
|
-
embed.svg key: ':health:', width: 28, height: 28, file: 'glass-heart.svg'
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
text str: 'Fill n <span fgcolor="#ff0000">stroke</span>',
|
|
83
|
-
color: :green, stroke_width: 2.0, stroke_color: :blue,
|
|
84
|
-
x: '1.8in', y: '2.9in', width: '0.85in', font: 'Sans Bold 9', markup: true
|
|
85
|
-
|
|
86
|
-
text str: 'Stroke n <span fgcolor="#ff0000">fill</span>',
|
|
87
|
-
color: :green, stroke_width: 2.0, stroke_color: :blue, stroke_strategy: :stroke_first,
|
|
88
|
-
x: '1.8in', y: '3.0in', width: '0.85in', font: 'Sans Bold 9', markup: true
|
|
89
|
-
|
|
90
|
-
text str: 'Dotted',
|
|
91
|
-
color: :white, stroke_width: 2.0, dash: '4 2', stroke_color: :black,
|
|
92
|
-
x: '1.8in', y: '3.1in', width: '0.85in', font: 'Sans Bold 9', markup: true
|
|
93
|
-
#
|
|
94
|
-
text str: "<b>Markup</b> is <i>quite</i> <s>'easy'</s> <span fgcolor=\"\#ff0000\">awesome</span>. Can't beat those \"smart\" 'quotes', now with 10--20% more en-dashes --- and em-dashes --- with explicit ellipses too...",
|
|
95
|
-
markup: true,
|
|
96
|
-
x: 50, y: 1000,
|
|
97
|
-
width: 750, height: 100,
|
|
98
|
-
valign: :bottom,
|
|
99
|
-
font: 'Serif 6', hint: :cyan
|
|
100
|
-
|
|
101
|
-
save prefix: 'text_options_', format: :png
|
|
102
|
-
end
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require 'squib'
|
|
3
|
+
|
|
4
|
+
data = { 'name' => ['Thief', 'Grifter', 'Mastermind'],
|
|
5
|
+
'level' => [1, 2, 3] }
|
|
6
|
+
longtext = "This is left-justified text, with newlines.\nWhat do you know about tweetle beetles? well... When tweetle beetles fight, it's called a tweetle beetle battle. And when they battle in a puddle, it's a tweetle beetle puddle battle. AND when tweetle beetles battle with paddles in a puddle, they call it a tweetle beetle puddle paddle battle. AND... When beetles battle beetles in a puddle paddle battle and the beetle battle puddle is a puddle in a bottle... ..they call this a tweetle beetle bottle puddle paddle battle muddle."
|
|
7
|
+
|
|
8
|
+
Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
|
9
|
+
background color: :white
|
|
10
|
+
rect x: 15, y: 15, width: 795, height: 1095, x_radius: 50, y_radius: 50
|
|
11
|
+
rect x: 30, y: 30, width: 128, height: 128, x_radius: 25, y_radius: 25
|
|
12
|
+
|
|
13
|
+
# Arrays are rendered over each card
|
|
14
|
+
text str: data['name'], x: 250, y: 55, font: 'Arial weight=900 18'
|
|
15
|
+
text str: data['level'], x: 65, y: 40, font: 'Arial 24', color: :burnt_orange
|
|
16
|
+
|
|
17
|
+
text str: 'Font strings are expressive!', x:65, y: 200,
|
|
18
|
+
font: 'Impact bold italic 12'
|
|
19
|
+
|
|
20
|
+
text str: 'Font strings are expressive!', x:65, y: 300,
|
|
21
|
+
font: 'Arial,Verdana weight=900 style=oblique 12'
|
|
22
|
+
|
|
23
|
+
text str: 'Font string sizes can be overridden per card.', x: 65, y: 350,
|
|
24
|
+
font: 'Impact 12', font_size: [5, 7, 8]
|
|
25
|
+
|
|
26
|
+
text str: 'This text has fixed width, fixed height, center-aligned, middle-valigned, and has a red hint',
|
|
27
|
+
hint: :red,
|
|
28
|
+
x: 65, y: 400,
|
|
29
|
+
width: 300, height: 125,
|
|
30
|
+
align: :center, valign: 'MIDDLE', # these can be specified with case-insenstive strings too
|
|
31
|
+
font: 'Serif 5'
|
|
32
|
+
|
|
33
|
+
extents = text str: 'Ink extent return value',
|
|
34
|
+
x: 65, y: 550,
|
|
35
|
+
font: 'Sans Bold', font_size: [5, 7, 8]
|
|
36
|
+
margin = 10
|
|
37
|
+
# Extents come back as an array of hashes, which can get split out like this
|
|
38
|
+
ws = extents.inject([]) { |arr, ext| arr << ext[:width] + 10; arr }
|
|
39
|
+
hs = extents.inject([]) { |arr, ext| arr << ext[:height] + 10; arr }
|
|
40
|
+
rect x: 65 - margin / 2, y: 550 - margin / 2,
|
|
41
|
+
width: ws, height: hs,
|
|
42
|
+
radius: 10, stroke_color: :black
|
|
43
|
+
|
|
44
|
+
# If width & height are defined and the text will overflow the box, we can ellipsize.
|
|
45
|
+
text str: "Ellipsization!\nThe ultimate question of life, the universe, and everything to life and everything is 42",
|
|
46
|
+
hint: :green, font: 'Arial 7',
|
|
47
|
+
x: 450, y: 400,
|
|
48
|
+
width: 280, height: 180,
|
|
49
|
+
ellipsize: true
|
|
50
|
+
|
|
51
|
+
# Text hints are guides for showing you how your text boxes are laid out exactly
|
|
52
|
+
hint text: :cyan
|
|
53
|
+
set font: 'Serif 7' # Impacts all future text calls (unless they specify differently)
|
|
54
|
+
text str: 'Text hints & fonts are globally togglable!', x: 65, y: 625
|
|
55
|
+
set font: :default # back to Squib-wide default
|
|
56
|
+
hint text: :off
|
|
57
|
+
text str: 'See? No hint here.',
|
|
58
|
+
x: 565, y: 625,
|
|
59
|
+
font: 'Arial 7'
|
|
60
|
+
|
|
61
|
+
# Text can be rotated, in radians, about the upper-left corner of the text box.
|
|
62
|
+
text str: 'Rotated',
|
|
63
|
+
x: 565, y: 675, angle: 0.2,
|
|
64
|
+
font: 'Arial 6', hint: :red
|
|
65
|
+
|
|
66
|
+
# Text can be justified, and have newlines
|
|
67
|
+
text str: longtext, font: 'Arial 5',
|
|
68
|
+
x: 65, y: 700,
|
|
69
|
+
width: '1.5in', height: inches(1),
|
|
70
|
+
justify: true, spacing: -6
|
|
71
|
+
|
|
72
|
+
# Here's how you embed images into text.
|
|
73
|
+
# Pass a block to the method call and use the given context
|
|
74
|
+
embed_text = 'Embedded icons! Take 1 :tool: and gain 2:health:. If Level 2, take 2 :tool:'
|
|
75
|
+
text(str: embed_text, font: 'Sans 6',
|
|
76
|
+
x: '1.8in', y: '2.5in', width: '0.85in',
|
|
77
|
+
align: :left, ellipsize: false) do |embed|
|
|
78
|
+
embed.svg key: ':tool:', width: 28, height: 28, file: 'spanner.svg'
|
|
79
|
+
embed.svg key: ':health:', width: 28, height: 28, file: 'glass-heart.svg'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
text str: 'Fill n <span fgcolor="#ff0000">stroke</span>',
|
|
83
|
+
color: :green, stroke_width: 2.0, stroke_color: :blue,
|
|
84
|
+
x: '1.8in', y: '2.9in', width: '0.85in', font: 'Sans Bold 9', markup: true
|
|
85
|
+
|
|
86
|
+
text str: 'Stroke n <span fgcolor="#ff0000">fill</span>',
|
|
87
|
+
color: :green, stroke_width: 2.0, stroke_color: :blue, stroke_strategy: :stroke_first,
|
|
88
|
+
x: '1.8in', y: '3.0in', width: '0.85in', font: 'Sans Bold 9', markup: true
|
|
89
|
+
|
|
90
|
+
text str: 'Dotted',
|
|
91
|
+
color: :white, stroke_width: 2.0, dash: '4 2', stroke_color: :black,
|
|
92
|
+
x: '1.8in', y: '3.1in', width: '0.85in', font: 'Sans Bold 9', markup: true
|
|
93
|
+
#
|
|
94
|
+
text str: "<b>Markup</b> is <i>quite</i> <s>'easy'</s> <span fgcolor=\"\#ff0000\">awesome</span>. Can't beat those \"smart\" 'quotes', now with 10--20% more en-dashes --- and em-dashes --- with explicit ellipses too...",
|
|
95
|
+
markup: true,
|
|
96
|
+
x: 50, y: 1000,
|
|
97
|
+
width: 750, height: 100,
|
|
98
|
+
valign: :bottom,
|
|
99
|
+
font: 'Serif 6', hint: :cyan
|
|
100
|
+
|
|
101
|
+
save prefix: 'text_options_', format: :png
|
|
102
|
+
end
|
data/samples/text/bug134.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
require 'squib'
|
|
2
|
-
require 'game_icons'
|
|
3
|
-
|
|
4
|
-
Squib::Deck.new(cards: 1) do
|
|
5
|
-
rect
|
|
6
|
-
text str: 'foo', x: 275, y: 75, width: 500, height: 500, valign: :middle, hint: :blue
|
|
7
|
-
text(str: '(heart)(heart2)',
|
|
8
|
-
x: 75, y: 75, width: 500, height: 500,
|
|
9
|
-
valign: :middle, hint: :red) do |embed|
|
|
10
|
-
embed.svg key: '(heart)', width: 50, height: 50, data: GameIcons.get('glass-heart').string
|
|
11
|
-
embed.svg key: '(heart2)', width: 50, height: 50, data: GameIcons.get('glass-heart').string
|
|
12
|
-
end
|
|
13
|
-
save_png prefix: 'bug_134_'
|
|
14
|
-
end
|
|
1
|
+
require 'squib'
|
|
2
|
+
require 'game_icons'
|
|
3
|
+
|
|
4
|
+
Squib::Deck.new(cards: 1) do
|
|
5
|
+
rect
|
|
6
|
+
text str: 'foo', x: 275, y: 75, width: 500, height: 500, valign: :middle, hint: :blue
|
|
7
|
+
text(str: '(heart)(heart2)',
|
|
8
|
+
x: 75, y: 75, width: 500, height: 500,
|
|
9
|
+
valign: :middle, hint: :red) do |embed|
|
|
10
|
+
embed.svg key: '(heart)', width: 50, height: 50, data: GameIcons.get('glass-heart').string
|
|
11
|
+
embed.svg key: '(heart2)', width: 50, height: 50, data: GameIcons.get('glass-heart').string
|
|
12
|
+
end
|
|
13
|
+
save_png prefix: 'bug_134_'
|
|
14
|
+
end
|
data/samples/units/_units.rb
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
require 'squib'
|
|
2
|
-
|
|
3
|
-
Squib::Deck.new(width: '1.5in', height: '1.5in') do
|
|
4
|
-
background color: :white
|
|
5
|
-
|
|
6
|
-
# We can use our DSL-method to use inches
|
|
7
|
-
# Computed using @dpi (set to 300 by default)
|
|
8
|
-
bleed = inches(0.125)
|
|
9
|
-
cut = inches(1.25)
|
|
10
|
-
rect x: bleed, y: bleed,
|
|
11
|
-
width: cut, height: cut,
|
|
12
|
-
dash: '0.5mm 0.5mm' # yes, units are in dashes too
|
|
13
|
-
|
|
14
|
-
# other units too
|
|
15
|
-
cm(2) # We can also use cm this way
|
|
16
|
-
cm(2) + inches(2) # We can mix units too
|
|
17
|
-
|
|
18
|
-
# Or we can use a string ending with cm or in
|
|
19
|
-
safe_margin = '0.25 in' #you can have a space too
|
|
20
|
-
safe_width = '1 in'
|
|
21
|
-
safe_height = '1.0 in ' # trailing space is ok too
|
|
22
|
-
rect x: safe_margin, y: safe_margin,
|
|
23
|
-
width: safe_width, height: safe_height,
|
|
24
|
-
radius: '2 mm '
|
|
25
|
-
|
|
26
|
-
# We can also do stuff in layout. Check out the yml file...
|
|
27
|
-
# (even cleaner in Yaml since we don't need quotes!)
|
|
28
|
-
use_layout file: 'using_units.yml'
|
|
29
|
-
text str: 'Hello.', layout: :example
|
|
30
|
-
|
|
31
|
-
save prefix: 'units_', format: :png
|
|
32
|
-
end
|
|
1
|
+
require 'squib'
|
|
2
|
+
|
|
3
|
+
Squib::Deck.new(width: '1.5in', height: '1.5in') do
|
|
4
|
+
background color: :white
|
|
5
|
+
|
|
6
|
+
# We can use our DSL-method to use inches
|
|
7
|
+
# Computed using @dpi (set to 300 by default)
|
|
8
|
+
bleed = inches(0.125)
|
|
9
|
+
cut = inches(1.25)
|
|
10
|
+
rect x: bleed, y: bleed,
|
|
11
|
+
width: cut, height: cut,
|
|
12
|
+
dash: '0.5mm 0.5mm' # yes, units are in dashes too
|
|
13
|
+
|
|
14
|
+
# other units too
|
|
15
|
+
cm(2) # We can also use cm this way
|
|
16
|
+
cm(2) + inches(2) # We can mix units too
|
|
17
|
+
|
|
18
|
+
# Or we can use a string ending with cm or in
|
|
19
|
+
safe_margin = '0.25 in' #you can have a space too
|
|
20
|
+
safe_width = '1 in'
|
|
21
|
+
safe_height = '1.0 in ' # trailing space is ok too
|
|
22
|
+
rect x: safe_margin, y: safe_margin,
|
|
23
|
+
width: safe_width, height: safe_height,
|
|
24
|
+
radius: '2 mm '
|
|
25
|
+
|
|
26
|
+
# We can also do stuff in layout. Check out the yml file...
|
|
27
|
+
# (even cleaner in Yaml since we don't need quotes!)
|
|
28
|
+
use_layout file: 'using_units.yml'
|
|
29
|
+
text str: 'Hello.', layout: :example
|
|
30
|
+
|
|
31
|
+
save prefix: 'units_', format: :png
|
|
32
|
+
end
|
data/squib.gemspec
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
-
require 'squib/version'
|
|
5
|
-
|
|
6
|
-
Gem::Specification.new do |spec|
|
|
7
|
-
spec.specification_version = 2 if spec.respond_to? :specification_version=
|
|
8
|
-
spec.required_rubygems_version = Gem::Requirement.new('>= 0') if spec.respond_to? :required_rubygems_version=
|
|
9
|
-
spec.rubygems_version = '2.2.2'
|
|
10
|
-
spec.required_ruby_version = '>= 2.4.0'
|
|
11
|
-
|
|
12
|
-
spec.name = 'squib'
|
|
13
|
-
spec.version = Squib::VERSION
|
|
14
|
-
spec.license = 'MIT'
|
|
15
|
-
|
|
16
|
-
spec.summary = 'A Ruby DSL for prototyping card games'
|
|
17
|
-
spec.description = 'Squib is a Ruby DSL for prototyping card games'
|
|
18
|
-
spec.authors = ['Andy Meneely']
|
|
19
|
-
spec.email = 'andy.meneely@gmail.com'
|
|
20
|
-
spec.homepage = 'https://github.com/andymeneely/squib'
|
|
21
|
-
|
|
22
|
-
spec.rdoc_options = ['--charset=UTF-8']
|
|
23
|
-
spec.extra_rdoc_files = Dir['README.md', 'samples/**/*.rb']
|
|
24
|
-
|
|
25
|
-
spec.files = `git ls-files -z`.
|
|
26
|
-
split("\x0").
|
|
27
|
-
reject { |f| f.match(%r{^(spec|samples|docs|benchmarks)/}) }
|
|
28
|
-
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
|
29
|
-
spec.test_files = spec.files.grep(/^(spec|samples|docs|benchmarks)\//)
|
|
30
|
-
spec.require_paths = ['lib']
|
|
31
|
-
|
|
32
|
-
spec.add_runtime_dependency 'cairo', '1.16
|
|
33
|
-
spec.add_runtime_dependency 'classy_hash', '0.2.1'
|
|
34
|
-
spec.add_runtime_dependency 'gio2', '3.
|
|
35
|
-
spec.add_runtime_dependency 'gobject-introspection', '3.
|
|
36
|
-
spec.add_runtime_dependency 'highline', '2.0.2'
|
|
37
|
-
spec.add_runtime_dependency 'mercenary', '0.3.6'
|
|
38
|
-
spec.add_runtime_dependency 'nokogiri', '1.10.4'
|
|
39
|
-
spec.add_runtime_dependency 'pango', '3.
|
|
40
|
-
spec.add_runtime_dependency 'roo', '2.8.2'
|
|
41
|
-
spec.add_runtime_dependency 'rsvg2', '3.
|
|
42
|
-
spec.add_runtime_dependency 'ruby-progressbar', '1.10
|
|
43
|
-
|
|
44
|
-
spec.add_development_dependency 'bundler'
|
|
45
|
-
spec.add_development_dependency 'coveralls', '>= 0.8.21'
|
|
46
|
-
spec.add_development_dependency 'game_icons'
|
|
47
|
-
spec.add_development_dependency 'launchy'
|
|
48
|
-
spec.add_development_dependency 'rake'
|
|
49
|
-
spec.add_development_dependency 'byebug'
|
|
50
|
-
spec.add_development_dependency 'rspec', '~> 3.8'
|
|
51
|
-
|
|
52
|
-
end
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'squib/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.specification_version = 2 if spec.respond_to? :specification_version=
|
|
8
|
+
spec.required_rubygems_version = Gem::Requirement.new('>= 0') if spec.respond_to? :required_rubygems_version=
|
|
9
|
+
spec.rubygems_version = '2.2.2'
|
|
10
|
+
spec.required_ruby_version = '>= 2.4.0'
|
|
11
|
+
|
|
12
|
+
spec.name = 'squib'
|
|
13
|
+
spec.version = Squib::VERSION
|
|
14
|
+
spec.license = 'MIT'
|
|
15
|
+
|
|
16
|
+
spec.summary = 'A Ruby DSL for prototyping card games'
|
|
17
|
+
spec.description = 'Squib is a Ruby DSL for prototyping card games'
|
|
18
|
+
spec.authors = ['Andy Meneely']
|
|
19
|
+
spec.email = 'andy.meneely@gmail.com'
|
|
20
|
+
spec.homepage = 'https://github.com/andymeneely/squib'
|
|
21
|
+
|
|
22
|
+
spec.rdoc_options = ['--charset=UTF-8']
|
|
23
|
+
spec.extra_rdoc_files = Dir['README.md', 'samples/**/*.rb']
|
|
24
|
+
|
|
25
|
+
spec.files = `git ls-files -z`.
|
|
26
|
+
split("\x0").
|
|
27
|
+
reject { |f| f.match(%r{^(spec|samples|docs|benchmarks)/}) }
|
|
28
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
|
29
|
+
spec.test_files = spec.files.grep(/^(spec|samples|docs|benchmarks)\//)
|
|
30
|
+
spec.require_paths = ['lib']
|
|
31
|
+
|
|
32
|
+
spec.add_runtime_dependency 'cairo', '~> 1.16'
|
|
33
|
+
spec.add_runtime_dependency 'classy_hash', '0.2.1'
|
|
34
|
+
spec.add_runtime_dependency 'gio2', '~> 3.4'
|
|
35
|
+
spec.add_runtime_dependency 'gobject-introspection', '~> 3.4'
|
|
36
|
+
spec.add_runtime_dependency 'highline', '2.0.2'
|
|
37
|
+
spec.add_runtime_dependency 'mercenary', '0.3.6'
|
|
38
|
+
spec.add_runtime_dependency 'nokogiri', '1.10.4'
|
|
39
|
+
spec.add_runtime_dependency 'pango', '~> 3.4'
|
|
40
|
+
spec.add_runtime_dependency 'roo', '2.8.2'
|
|
41
|
+
spec.add_runtime_dependency 'rsvg2', '~> 3.4'
|
|
42
|
+
spec.add_runtime_dependency 'ruby-progressbar', '~> 1.10'
|
|
43
|
+
|
|
44
|
+
spec.add_development_dependency 'bundler'
|
|
45
|
+
spec.add_development_dependency 'coveralls', '>= 0.8.21'
|
|
46
|
+
spec.add_development_dependency 'game_icons'
|
|
47
|
+
spec.add_development_dependency 'launchy'
|
|
48
|
+
spec.add_development_dependency 'rake'
|
|
49
|
+
spec.add_development_dependency 'byebug'
|
|
50
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
|
51
|
+
|
|
52
|
+
end
|
metadata
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: squib
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.15.
|
|
4
|
+
version: 0.15.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Andy Meneely
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-
|
|
11
|
+
date: 2019-10-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cairo
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.16
|
|
19
|
+
version: '1.16'
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- -
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 1.16
|
|
26
|
+
version: '1.16'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: classy_hash
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -42,30 +42,30 @@ dependencies:
|
|
|
42
42
|
name: gio2
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- -
|
|
45
|
+
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 3.
|
|
47
|
+
version: '3.4'
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- -
|
|
52
|
+
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 3.
|
|
54
|
+
version: '3.4'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: gobject-introspection
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- -
|
|
59
|
+
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 3.
|
|
61
|
+
version: '3.4'
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
|
-
- -
|
|
66
|
+
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 3.
|
|
68
|
+
version: '3.4'
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: highline
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -112,16 +112,16 @@ dependencies:
|
|
|
112
112
|
name: pango
|
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
|
114
114
|
requirements:
|
|
115
|
-
- -
|
|
115
|
+
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: 3.
|
|
117
|
+
version: '3.4'
|
|
118
118
|
type: :runtime
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
|
-
- -
|
|
122
|
+
- - "~>"
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 3.
|
|
124
|
+
version: '3.4'
|
|
125
125
|
- !ruby/object:Gem::Dependency
|
|
126
126
|
name: roo
|
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -140,30 +140,30 @@ dependencies:
|
|
|
140
140
|
name: rsvg2
|
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
|
142
142
|
requirements:
|
|
143
|
-
- -
|
|
143
|
+
- - "~>"
|
|
144
144
|
- !ruby/object:Gem::Version
|
|
145
|
-
version: 3.
|
|
145
|
+
version: '3.4'
|
|
146
146
|
type: :runtime
|
|
147
147
|
prerelease: false
|
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
149
|
requirements:
|
|
150
|
-
- -
|
|
150
|
+
- - "~>"
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
|
-
version: 3.
|
|
152
|
+
version: '3.4'
|
|
153
153
|
- !ruby/object:Gem::Dependency
|
|
154
154
|
name: ruby-progressbar
|
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
|
156
156
|
requirements:
|
|
157
|
-
- -
|
|
157
|
+
- - "~>"
|
|
158
158
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: 1.10
|
|
159
|
+
version: '1.10'
|
|
160
160
|
type: :runtime
|
|
161
161
|
prerelease: false
|
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
163
|
requirements:
|
|
164
|
-
- -
|
|
164
|
+
- - "~>"
|
|
165
165
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: 1.10
|
|
166
|
+
version: '1.10'
|
|
167
167
|
- !ruby/object:Gem::Dependency
|
|
168
168
|
name: bundler
|
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -269,52 +269,52 @@ executables:
|
|
|
269
269
|
extensions: []
|
|
270
270
|
extra_rdoc_files:
|
|
271
271
|
- README.md
|
|
272
|
-
- samples/
|
|
273
|
-
- samples/
|
|
274
|
-
- samples/
|
|
275
|
-
- samples/
|
|
276
|
-
- samples/
|
|
277
|
-
- samples/
|
|
278
|
-
- samples/
|
|
272
|
+
- samples/autoscale_font/_autoscale_font.rb
|
|
273
|
+
- samples/backend/_backend.rb
|
|
274
|
+
- samples/basic.rb
|
|
275
|
+
- samples/build_groups/build_groups.rb
|
|
276
|
+
- samples/colors/_colors.rb
|
|
277
|
+
- samples/colors/_gradients.rb
|
|
278
|
+
- samples/colors/_switch_color.rb
|
|
279
|
+
- samples/config/config_text_markup.rb
|
|
280
|
+
- samples/config/custom_config.rb
|
|
281
|
+
- samples/data/_csv.rb
|
|
282
|
+
- samples/data/_excel.rb
|
|
283
|
+
- samples/data/_yaml.rb
|
|
284
|
+
- samples/hello_world.rb
|
|
285
|
+
- samples/images/_cairo_access.rb
|
|
286
|
+
- samples/images/_images.rb
|
|
287
|
+
- samples/images/_more_load_images.rb
|
|
279
288
|
- samples/intro/01_hello.rb
|
|
289
|
+
- samples/intro/02_options.rb
|
|
280
290
|
- samples/intro/03_layout.rb
|
|
281
291
|
- samples/intro/04_arrays.rb
|
|
282
292
|
- samples/intro/05_excel.rb
|
|
283
|
-
- samples/
|
|
284
|
-
- samples/
|
|
285
|
-
- samples/config/config_text_markup.rb
|
|
286
|
-
- samples/images/_more_load_images.rb
|
|
287
|
-
- samples/images/_cairo_access.rb
|
|
288
|
-
- samples/images/_images.rb
|
|
289
|
-
- samples/proofs/_tgc_proofs.rb
|
|
290
|
-
- samples/shapes/_draw_shapes.rb
|
|
291
|
-
- samples/shapes/_proofs.rb
|
|
292
|
-
- samples/backend/_backend.rb
|
|
293
|
-
- samples/basic.rb
|
|
294
|
-
- samples/units/_units.rb
|
|
293
|
+
- samples/layouts/builtin_layouts.rb
|
|
294
|
+
- samples/layouts/layouts.rb
|
|
295
295
|
- samples/project/src/characters.rb
|
|
296
296
|
- samples/project/src/skills.rb
|
|
297
|
-
- samples/
|
|
297
|
+
- samples/proofs/_tgc_proofs.rb
|
|
298
|
+
- samples/ranges/_ranges.rb
|
|
299
|
+
- samples/saves/_hand.rb
|
|
300
|
+
- samples/saves/_portrait_landscape.rb
|
|
298
301
|
- samples/saves/_saves.rb
|
|
299
|
-
- samples/saves/
|
|
302
|
+
- samples/saves/_save_filenames.rb
|
|
300
303
|
- samples/saves/_save_pdf.rb
|
|
301
|
-
- samples/saves/
|
|
302
|
-
- samples/
|
|
303
|
-
- samples/
|
|
304
|
-
- samples/
|
|
305
|
-
- samples/
|
|
306
|
-
- samples/
|
|
307
|
-
- samples/
|
|
308
|
-
- samples/
|
|
309
|
-
- samples/
|
|
304
|
+
- samples/saves/_showcase.rb
|
|
305
|
+
- samples/shapes/_draw_shapes.rb
|
|
306
|
+
- samples/shapes/_proofs.rb
|
|
307
|
+
- samples/sprues/_advanced_sprues.rb
|
|
308
|
+
- samples/sprues/_builtin_sprues.rb
|
|
309
|
+
- samples/sprues/_fold_sheet.rb
|
|
310
|
+
- samples/sprues/_hex_tiles.rb
|
|
311
|
+
- samples/sprues/_mints.rb
|
|
312
|
+
- samples/sprues/_sprue_example.rb
|
|
310
313
|
- samples/text/bug134.rb
|
|
311
|
-
- samples/text/_text.rb
|
|
312
314
|
- samples/text/_embed_text.rb
|
|
315
|
+
- samples/text/_text.rb
|
|
313
316
|
- samples/text/_text_options.rb
|
|
314
|
-
- samples/
|
|
315
|
-
- samples/data/_yaml.rb
|
|
316
|
-
- samples/data/_csv.rb
|
|
317
|
-
- samples/data/_excel.rb
|
|
317
|
+
- samples/units/_units.rb
|
|
318
318
|
files:
|
|
319
319
|
- ".gitignore"
|
|
320
320
|
- ".travis.yml"
|
|
@@ -503,8 +503,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
503
503
|
- !ruby/object:Gem::Version
|
|
504
504
|
version: '0'
|
|
505
505
|
requirements: []
|
|
506
|
-
|
|
507
|
-
rubygems_version: 2.7.6.2
|
|
506
|
+
rubygems_version: 3.0.3
|
|
508
507
|
signing_key:
|
|
509
508
|
specification_version: 2
|
|
510
509
|
summary: A Ruby DSL for prototyping card games
|