squib 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +9 -0
  4. data/README.md +38 -33
  5. data/Rakefile +1 -1
  6. data/bin/squib +6 -6
  7. data/lib/squib.rb +8 -8
  8. data/lib/squib/api/background.rb +3 -3
  9. data/lib/squib/api/data.rb +5 -6
  10. data/lib/squib/api/image.rb +13 -10
  11. data/lib/squib/api/save.rb +4 -5
  12. data/lib/squib/api/settings.rb +4 -4
  13. data/lib/squib/api/shapes.rb +20 -20
  14. data/lib/squib/api/text.rb +11 -11
  15. data/lib/squib/api/units.rb +4 -4
  16. data/lib/squib/card.rb +5 -5
  17. data/lib/squib/commands/new.rb +5 -5
  18. data/lib/squib/constants.rb +10 -10
  19. data/lib/squib/deck.rb +24 -22
  20. data/lib/squib/graphics/background.rb +3 -3
  21. data/lib/squib/graphics/image.rb +13 -6
  22. data/lib/squib/graphics/save_doc.rb +13 -11
  23. data/lib/squib/graphics/save_images.rb +3 -3
  24. data/lib/squib/graphics/shapes.rb +9 -8
  25. data/lib/squib/graphics/text.rb +61 -59
  26. data/lib/squib/input_helpers.rb +13 -13
  27. data/lib/squib/progress.rb +4 -4
  28. data/lib/squib/project_template/Gemfile +1 -1
  29. data/lib/squib/project_template/deck.rb +3 -3
  30. data/lib/squib/version.rb +6 -2
  31. data/samples/autoscale_font.rb +4 -4
  32. data/samples/basic.rb +6 -7
  33. data/samples/cairo_access.rb +27 -0
  34. data/samples/colors.rb +2 -2
  35. data/samples/custom-layout.yml +5 -5
  36. data/samples/custom_config.rb +4 -4
  37. data/samples/draw_shapes.rb +8 -8
  38. data/samples/hello_world.rb +2 -3
  39. data/samples/load_images.rb +6 -1
  40. data/samples/portrait-landscape.rb +7 -7
  41. data/samples/ranges.rb +13 -14
  42. data/samples/save_pdf.rb +2 -2
  43. data/samples/text_options.rb +17 -17
  44. data/samples/tgc_proofs.rb +3 -3
  45. data/samples/use_layout.rb +3 -3
  46. data/spec/api/api_text_spec.rb +11 -17
  47. data/spec/commands/new_spec.rb +10 -10
  48. data/spec/data/easy-circular-extends.yml +1 -1
  49. data/spec/data/hard-circular-extends.yml +2 -2
  50. data/spec/data/multi-extends-single-entry.yml +3 -3
  51. data/spec/data/multi-level-extends.yml +1 -1
  52. data/spec/data/no-extends.yml +2 -2
  53. data/spec/data/pre-extends.yml +1 -1
  54. data/spec/data/self-circular-extends.yml +1 -1
  55. data/spec/data/single-extends.yml +1 -1
  56. data/spec/data/single-level-multi-extends.yml +1 -1
  57. data/spec/deck_spec.rb +62 -62
  58. data/spec/graphics/graphics_images_spec.rb +79 -0
  59. data/spec/graphics/graphics_save_doc_spec.rb +66 -0
  60. data/spec/graphics/graphics_shapes_spec.rb +74 -0
  61. data/spec/graphics/graphics_text_spec.rb +135 -0
  62. data/spec/input_helpers_spec.rb +61 -40
  63. data/spec/samples_run_spec.rb +6 -6
  64. data/spec/spec_helper.rb +32 -1
  65. data/squib.gemspec +21 -21
  66. metadata +22 -14
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
  require 'squib'
3
3
 
4
- describe Squib::Commands::New do
4
+ describe Squib::Commands::New do
5
5
 
6
- describe "#process" do
6
+ describe '#process' do
7
7
  before(:all) do
8
8
  @old_stderr = $stderr
9
9
  $stderr = StringIO.new
10
10
  @oldpwd = Dir.pwd
11
- Dir.chdir(File.expand_path('../../samples/_output', File.dirname(__FILE__)))
11
+ Dir.chdir(output_dir)
12
12
  end
13
13
 
14
14
  before(:each) do
@@ -16,33 +16,33 @@ describe Squib::Commands::New do
16
16
  @cmd = Squib::Commands::New.new
17
17
  end
18
18
 
19
- it "raises an error if no directory was specified" do
19
+ it 'raises an error if no directory was specified' do
20
20
  expect{@cmd.process([])}.to raise_error(ArgumentError, 'Please specify a path.')
21
21
  end
22
22
 
23
- it "creates a new template on an fresh directory" do
23
+ it 'creates a new template on an fresh directory' do
24
24
  @cmd.process(['foo'])
25
25
  expect(File.exists?('foo/deck.rb')).to be true
26
26
  end
27
27
 
28
- it "creates a new template on an empty directory" do
28
+ it 'creates a new template on an empty directory' do
29
29
  Dir.mkdir('foo')
30
30
  @cmd.process(['foo'])
31
31
  expect(File.exists?('foo/deck.rb')).to be true
32
32
  end
33
33
 
34
- it "does not create a new template on an empty " do
34
+ it 'does not create a new template on an empty ' do
35
35
  Dir.mkdir('foo')
36
36
  File.new('foo/somefile.txt', 'w+')
37
37
  @cmd.process(['foo'])
38
38
  $stderr.rewind
39
- expect($stderr.string.chomp).to end_with " exists and is not empty. Doing nothing and quitting."
39
+ expect($stderr.string.chomp).to end_with ' exists and is not empty. Doing nothing and quitting.'
40
40
  end
41
41
 
42
42
  after(:all) do
43
43
  $stderr = @old_stderr
44
44
  Dir.chdir(@oldpwd)
45
45
  end
46
+ end
47
+
46
48
  end
47
-
48
- end
@@ -1,4 +1,4 @@
1
- a:
1
+ a:
2
2
  extends: b
3
3
  x: 50
4
4
  b:
@@ -1,9 +1,9 @@
1
- a:
1
+ a:
2
2
  extends: c
3
3
  x: 50
4
4
  b:
5
5
  extends: a
6
6
  x: 150
7
- c:
7
+ c:
8
8
  extends: b
9
9
  y: 250
@@ -1,13 +1,13 @@
1
- aunt:
1
+ aunt:
2
2
  a: 101
3
3
  b: 102
4
4
  c: 103
5
- uncle:
5
+ uncle:
6
6
  x: 104
7
7
  y: 105
8
8
  b: 106
9
9
  child:
10
- extends:
10
+ extends:
11
11
  - uncle
12
12
  - aunt
13
13
  a: 107
@@ -1,4 +1,4 @@
1
- frame:
1
+ frame:
2
2
  x: 38
3
3
  y: 38
4
4
  title:
@@ -1,5 +1,5 @@
1
- frame:
1
+ frame:
2
2
  x: 38
3
- valign: !ruby/symbol middle
3
+ valign: !ruby/symbol middle
4
4
  str: "blah"
5
5
  font: Mr. Font
@@ -2,6 +2,6 @@ title:
2
2
  extends: frame
3
3
  y: 50
4
4
  width: 100
5
- frame:
5
+ frame:
6
6
  x: 38
7
7
  y: 38
@@ -1,3 +1,3 @@
1
- a:
1
+ a:
2
2
  extends: a
3
3
  x: 50
@@ -1,4 +1,4 @@
1
- frame:
1
+ frame:
2
2
  x: 38
3
3
  y: 38
4
4
  title:
@@ -1,4 +1,4 @@
1
- frame:
1
+ frame:
2
2
  x: 38
3
3
  y: 38
4
4
  title:
data/spec/deck_spec.rb CHANGED
@@ -1,134 +1,134 @@
1
1
  require 'spec_helper'
2
2
  require 'squib/deck'
3
3
 
4
- describe Squib::Deck do
4
+ describe Squib::Deck do
5
5
 
6
- it "initializes with default parameters" do
7
- d = Squib::Deck.new
6
+ it 'initializes with default parameters' do
7
+ d = Squib::Deck.new
8
8
  expect(d.width).to eq(825)
9
9
  expect(d.height).to eq(1125)
10
10
  expect(d.cards.size).to eq(1)
11
11
  end
12
12
 
13
- context "in dealing with ranges" do
14
- it "calls text on all cards by default" do
13
+ context 'in dealing with ranges' do
14
+ it 'calls text on all cards by default' do
15
15
  card1 = instance_double(Squib::Card)
16
- card2 = instance_double(Squib::Card)
16
+ card2 = instance_double(Squib::Card)
17
17
  expect(card1).to receive(:text).once
18
18
  expect(card2).to receive(:text).once
19
- Squib::Deck.new do
20
- @cards = [card1, card2]
19
+ Squib::Deck.new do
20
+ @cards = [card1, card2]
21
21
  text str: 'blah'
22
22
  end
23
23
  end
24
24
 
25
- it "calls text on some cards with an integer" do
25
+ it 'calls text on some cards with an integer' do
26
26
  card1 = instance_double(Squib::Card)
27
27
  card2 = instance_double(Squib::Card)
28
28
  expect(card2).to receive(:text).once
29
- Squib::Deck.new do
30
- @cards = [card1, card2]
29
+ Squib::Deck.new do
30
+ @cards = [card1, card2]
31
31
  text range: 1, str: 'blah'
32
32
  end
33
- end
33
+ end
34
34
 
35
- it "calls text with ranges" do
35
+ it 'calls text with ranges' do
36
36
  card1 = instance_double(Squib::Card)
37
37
  card2 = instance_double(Squib::Card)
38
38
  card3 = instance_double(Squib::Card)
39
39
  expect(card1).to receive(:text).once
40
40
  expect(card2).to receive(:text).once
41
- Squib::Deck.new do
42
- @cards = [card1, card2, card3]
41
+ Squib::Deck.new do
42
+ @cards = [card1, card2, card3]
43
43
  text range: 0..1, str: 'blah'
44
44
  end
45
45
  end
46
46
  end
47
47
 
48
- context "#load_layout" do
48
+ context '#load_layout' do
49
49
 
50
- it "loads a normal layout with no extends" do
51
- d = Squib::Deck.new(layout: test_file('no-extends.yml'))
50
+ it 'loads a normal layout with no extends' do
51
+ d = Squib::Deck.new(layout: test_file('no-extends.yml'))
52
52
  expect(d.layout).to \
53
53
  eq({'frame' => {
54
- 'x' => 38,
54
+ 'x' => 38,
55
55
  'valign' => :middle,
56
- 'str' => "blah",
57
- 'font' => "Mr. Font",
56
+ 'str' => 'blah',
57
+ 'font' => 'Mr. Font',
58
58
  }
59
59
  }
60
60
  )
61
61
  end
62
62
 
63
- it "loads with a single extends" do
64
- d = Squib::Deck.new(layout: test_file('single-extends.yml'))
63
+ it 'loads with a single extends' do
64
+ d = Squib::Deck.new(layout: test_file('single-extends.yml'))
65
65
  expect(d.layout).to \
66
66
  eq({'frame' => {
67
- 'x' => 38,
68
- 'y' => 38,
67
+ 'x' => 38,
68
+ 'y' => 38,
69
69
  },
70
70
  'title' => {
71
71
  'extends' => 'frame',
72
- 'x' => 38,
73
- 'y' => 50,
72
+ 'x' => 38,
73
+ 'y' => 50,
74
74
  'width' => 100,
75
75
  }
76
76
  }
77
77
  )
78
78
  end
79
79
 
80
- it "applies the extends regardless of order" do
81
- d = Squib::Deck.new(layout: test_file('pre-extends.yml'))
80
+ it 'applies the extends regardless of order' do
81
+ d = Squib::Deck.new(layout: test_file('pre-extends.yml'))
82
82
  expect(d.layout).to \
83
83
  eq({'frame' => {
84
- 'x' => 38,
85
- 'y' => 38,
84
+ 'x' => 38,
85
+ 'y' => 38,
86
86
  },
87
87
  'title' => {
88
88
  'extends' => 'frame',
89
- 'x' => 38,
90
- 'y' => 50,
89
+ 'x' => 38,
90
+ 'y' => 50,
91
91
  'width' => 100,
92
92
  }
93
93
  }
94
94
  )
95
95
  end
96
96
 
97
- it "applies the single-level extends multiple times" do
98
- d = Squib::Deck.new(layout: test_file('single-level-multi-extends.yml'))
97
+ it 'applies the single-level extends multiple times' do
98
+ d = Squib::Deck.new(layout: test_file('single-level-multi-extends.yml'))
99
99
  expect(d.layout).to \
100
100
  eq({'frame' => {
101
- 'x' => 38,
102
- 'y' => 38,
101
+ 'x' => 38,
102
+ 'y' => 38,
103
103
  },
104
104
  'title' => {
105
105
  'extends' => 'frame',
106
- 'x' => 38,
107
- 'y' => 50,
106
+ 'x' => 38,
107
+ 'y' => 50,
108
108
  'width' => 100,
109
109
  },
110
110
  'title2' => {
111
111
  'extends' => 'frame',
112
- 'x' => 75,
113
- 'y' => 150,
112
+ 'x' => 75,
113
+ 'y' => 150,
114
114
  'width' => 150,
115
115
  },
116
116
  }
117
117
  )
118
118
  end
119
119
 
120
- it "applies multiple extends in a single rule" do
121
- d = Squib::Deck.new(layout: test_file('multi-extends-single-entry.yml'))
120
+ it 'applies multiple extends in a single rule' do
121
+ d = Squib::Deck.new(layout: test_file('multi-extends-single-entry.yml'))
122
122
  expect(d.layout).to \
123
123
  eq({'aunt' => {
124
- 'a' => 101,
125
- 'b' => 102,
126
- 'c' => 103,
124
+ 'a' => 101,
125
+ 'b' => 102,
126
+ 'c' => 103,
127
127
  },
128
128
  'uncle' => {
129
- 'x' => 104,
130
- 'y' => 105,
131
- 'b' => 106,
129
+ 'x' => 104,
130
+ 'y' => 105,
131
+ 'b' => 106,
132
132
  },
133
133
  'child' => {
134
134
  'extends' => ['uncle','aunt'],
@@ -142,45 +142,45 @@ describe Squib::Deck do
142
142
  )
143
143
  end
144
144
 
145
- it "applies multi-level extends" do
146
- d = Squib::Deck.new(layout: test_file('multi-level-extends.yml'))
145
+ it 'applies multi-level extends' do
146
+ d = Squib::Deck.new(layout: test_file('multi-level-extends.yml'))
147
147
  expect(d.layout).to \
148
148
  eq({'frame' => {
149
- 'x' => 38,
150
- 'y' => 38,
149
+ 'x' => 38,
150
+ 'y' => 38,
151
151
  },
152
152
  'title' => {
153
153
  'extends' => 'frame',
154
- 'x' => 38,
155
- 'y' => 50,
154
+ 'x' => 38,
155
+ 'y' => 50,
156
156
  'width' => 100,
157
157
  },
158
158
  'subtitle' => {
159
159
  'extends' => 'title',
160
160
  'x' => 38,
161
- 'y' => 150,
161
+ 'y' => 150,
162
162
  'width' => 100,
163
163
  },
164
164
  }
165
165
  )
166
166
  end
167
167
 
168
- it "fails on a self-circular extends" do
168
+ it 'fails on a self-circular extends' do
169
169
  file = test_file('self-circular-extends.yml')
170
170
  expect { Squib::Deck.new(layout: file) }.to \
171
- raise_error(RuntimeError, "Invalid layout: circular extends with 'a'")
171
+ raise_error(RuntimeError, 'Invalid layout: circular extends with \'a\'')
172
172
  end
173
173
 
174
- it "fails on a easy-circular extends" do
174
+ it 'fails on a easy-circular extends' do
175
175
  file = test_file('easy-circular-extends.yml')
176
176
  expect { Squib::Deck.new(layout: file) }.to \
177
- raise_error(RuntimeError, "Invalid layout: circular extends with 'a'")
177
+ raise_error(RuntimeError, 'Invalid layout: circular extends with \'a\'')
178
178
  end
179
179
 
180
- it "hard on a easy-circular extends" do
180
+ it 'hard on a easy-circular extends' do
181
181
  file = test_file('hard-circular-extends.yml')
182
182
  expect { Squib::Deck.new(layout: file) }.to \
183
- raise_error(RuntimeError, "Invalid layout: circular extends with 'a'")
183
+ raise_error(RuntimeError, 'Invalid layout: circular extends with \'a\'')
184
184
  end
185
185
 
186
186
  end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+ require 'squib'
3
+
4
+ describe Squib::Card do
5
+
6
+ before(:each) do
7
+ @deck = double(Squib::Deck)
8
+ @context = double(Cairo::Context)
9
+ @svg = double(RSVG::Handle)
10
+ allow(Cairo::Context).to receive(:new).and_return(@context)
11
+ allow(Cairo::ImageSurface).to receive(:from_png).and_return(nil)
12
+ allow(Cairo::ImageSurface).to receive(:new).and_return(nil)
13
+ allow(RSVG::Handle).to receive(:new_from_file).and_return(@svg)
14
+ end
15
+
16
+ context '#png' do
17
+ it 'makes all the expected calls on a smoke test' do
18
+ expect(@context).to receive(:save).once
19
+ expect(@context).to receive(:translate).with(-37, -38).once
20
+ expect(@context).to receive(:rotate).with(0.0).once
21
+ expect(@context).to receive(:translate).with(37, 38).once
22
+ expect(@context).to receive(:set_source).with(nil, 37, 38).once
23
+ expect(@context).to receive(:paint).with(0.9).once
24
+ expect(@context).to receive(:restore).once
25
+
26
+ card = Squib::Card.new(@deck, 100, 150)
27
+ # png(file, x, y, alpha, blend, angle)
28
+ card.png('foo.png', 37, 38, 0.9, :none, 0.0)
29
+ end
30
+
31
+ it 'sets blend when needed' do
32
+ @context.as_null_object
33
+ expect(@context).to receive(:operator=).with(:overlay).once
34
+
35
+ card = Squib::Card.new(@deck, 100, 150)
36
+ card.png('foo.png', 37, 38, 0.9, :overlay, 0.0)
37
+ end
38
+ end
39
+
40
+ context '#svg' do
41
+ it 'makes all the expected calls on a smoke test' do
42
+ expect(@svg).to receive(:width).and_return(100).twice
43
+ expect(@svg).to receive(:height).and_return(100).twice
44
+ expect(@context).to receive(:save).once
45
+ expect(@context).to receive(:translate).with(-37, -38).once
46
+ expect(@context).to receive(:rotate).with(0.0).once
47
+ expect(@context).to receive(:translate).with(37, 38).once
48
+ expect(@context).to receive(:scale).with(1.0, 1.0).once
49
+ expect(@context).to receive(:render_rsvg_handle).with(@svg, 'id').once
50
+ expect(@context).to receive(:set_source).with(nil, 37, 38).once
51
+ expect(@context).to receive(:paint).with(0.9).once
52
+ expect(@context).to receive(:restore).once
53
+
54
+ card = Squib::Card.new(@deck, 100, 150)
55
+ # svg(file, id, x, y, width, height, alpha, blend, angle)
56
+ card.svg('foo.png', 'id', 37, 38, :native, :native, 0.9, :none, 0.0)
57
+ end
58
+
59
+ it 'sets blend when needed' do
60
+ @context.as_null_object
61
+ @svg.as_null_object
62
+ expect(@context).to receive(:operator=).with(:overlay).once
63
+
64
+ card = Squib::Card.new(@deck, 100, 150)
65
+ card.svg('foo.png', nil, 37, 38, :native, :native, 0.9, :overlay, 0.0)
66
+ end
67
+
68
+ it 'sets width & height when needed' do
69
+ @context.as_null_object
70
+ expect(@svg).to receive(:width).and_return(100).once
71
+ expect(@svg).to receive(:height).and_return(100).once
72
+ expect(@context).to receive(:scale).with(2.0, 3.0).once
73
+
74
+ card = Squib::Card.new(@deck, 100, 150)
75
+ card.svg('foo.png', nil, 37, 38, 200, 300, 0.9, :none, 0.0)
76
+ end
77
+ end
78
+
79
+ end