polytexnic 1.0.beta3 → 1.0.beta4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 673231bbe5f9155e189f7260d998c86d82f97737
4
- data.tar.gz: 906c18815f66d4f82892065795d63f9808ffe19e
3
+ metadata.gz: 77cd3da83721b462b620c6264b757009d7764242
4
+ data.tar.gz: 66afdad9074a52e82885ab4c59de356b41aefc27
5
5
  SHA512:
6
- metadata.gz: 2d0e7a95a6d8740cf1052b2b32903816894063249589f92ad8e25812e88d509018bfb66f6727d8cf20b47b9587e7bcaa3df2d659cdcc9d135d34055d12e418cf
7
- data.tar.gz: ac81b31f5cf10c84cbc127e4fee1211a7782ee7acceb0c5eb2a868d85399418e21ecaab9f21a719245110771af93889f8fef1d2dc61de89c25f66b6da63e73c3
6
+ metadata.gz: 6fc1fd9be6e8abca50d1974632eb8240a4cc1d2e0d9eb97f0c82fd38796a969f44477c426d54926f654b84325936e6ddd4825ea7ffd5b9d2ab924fb341a59a2d
7
+ data.tar.gz: 333b985f56228ca304ace76eb0ee5b578fc01068c0c955e8d8cfb9f84f81b9983115ae9a0ca36022491561827ab28d6481ac9f88166df102b39f291472627c94
@@ -1,35 +1,95 @@
1
1
  module CodeInclusion
2
2
  class CodeInclusionException < Exception; end;
3
+ class RetrievalException < CodeInclusionException; end;
4
+ class SubsetException < CodeInclusionException; end;
3
5
 
4
- class Code
5
- CODE_REGEX = /^\s*%=\s+<<\s*\( # opening
6
- \s*([^\s]+?) # path to file
7
- (?:\[(.+?)\])? # optional section name
8
- (?:,\s*tag:\s*([\w\.\/\-]+?))? # optional git tag
9
- (?:,\s*lang:\s*(\w+))? # optional lang
10
- (,\s*options:\s*.*)? # optional options
11
- \s*\) # closing paren
12
- /x
13
6
 
7
+ # Converts the input line into:
8
+ # Retrieval Args:
9
+ # filename: filename # required
10
+ # git: { tag: tagname } # optional
11
+ # section: sectionname, # 'section:' and 'line_numbers:'
12
+ # line_numbers: 1,4-6,8,14 # are optional and mutually exclusive
13
+ #
14
+ # Render Args:
15
+ # custom_language: 'ruby'
16
+ # hightlight: '"hl_lines": [1, 2], "linenos": true'
17
+ class Args
18
+ CODE_REGEX =
19
+ /^\s*%=\s+<<\s*\( # opening
20
+ \s*([^\s]+?) # path to file
21
+ (?:\[(.+?)\])? # optional section or line numbers
22
+ (?:,\s*git:\s*([ \w\.\/\-\{\}:]+?))? # optional git tag
23
+ (?:,\s*lang:\s*(\w+))? # optional lang
24
+ (,\s*options:\s*.*)? # optional options
25
+ \s*\) # closing paren
26
+ /x
27
+
28
+ attr_reader :input, :retrieval, :render, :match
29
+
30
+ def initialize(input)
31
+ @input = input
32
+ @retrieval = {}
33
+ @render = {}
34
+ @match = parse
35
+
36
+ extract
37
+ end
38
+
39
+ def extract
40
+ return unless code_inclusion_line?
41
+
42
+ retrieval[:filename] = match[1]
43
+
44
+ if specifies_line_numbers?
45
+ retrieval[:line_numbers] = match[2]
46
+ else
47
+ retrieval[:section] = match[2]
48
+ end
49
+
50
+ retrieval[:git] = extract_git(match[3]) if match[3]
51
+
52
+ render[:custom_language] = match[4]
53
+ render[:highlight] = match[5]
54
+ end
55
+
56
+ def specifies_line_numbers?
57
+ whitespace_digits_dashes_and_commas.match(match[2])
58
+ end
59
+
60
+ def parse
61
+ CODE_REGEX.match(input)
62
+ end
63
+
64
+ def code_inclusion_line?
65
+ !match.nil?
66
+ end
67
+
68
+ def whitespace_digits_dashes_and_commas
69
+ /\s*\d[-,\d\s]*$/
70
+ end
71
+
72
+ def extract_git(git_args)
73
+ # only expect tag:, but could easily extract branch: or repo:
74
+ tag = /\s?{\s?tag:\s(.*)\s?}/.match(git_args)[1]
75
+ {tag: tag}
76
+ end
77
+ end
78
+
79
+
80
+ class Code
14
81
  DEFAULT_LANGUAGE = 'text'
15
82
 
16
83
  # Returns an instance of CodeInclusion::Code or nil
17
84
  def self.for(line)
18
- if (line =~ CODE_REGEX)
19
- opts = {}
20
- opts[:tag] = $3
21
- opts[:custom_language] = $4
22
- opts[:highlight] = $5
23
- new($1, $2, opts)
24
- end
85
+ args = Args.new(line)
86
+ new(args.retrieval, args.render) if args.code_inclusion_line?
25
87
  end
26
88
 
27
- attr_reader :filename, :sectionname, :opts
89
+ attr_reader :retrieval_args, :render_args
28
90
 
29
- def initialize(filename, sectionname, opts)
30
- @filename = filename
31
- @sectionname = sectionname
32
- @opts = opts
91
+ def initialize(retrieval_args, render_args)
92
+ @retrieval_args, @render_args = retrieval_args, render_args
33
93
  end
34
94
 
35
95
  # Returns the formatted code or an error message
@@ -37,7 +97,7 @@ module CodeInclusion
37
97
  return unless filename
38
98
 
39
99
  result = []
40
- result << "%= lang:#{language}#{opts[:highlight]}"
100
+ result << "%= lang:#{language}#{highlight}"
41
101
  result << '\begin{code}'
42
102
  result.concat(raw_code)
43
103
  result << '\end{code}'
@@ -46,31 +106,31 @@ module CodeInclusion
46
106
  code_error(e.message)
47
107
  end
48
108
 
109
+ private
110
+
49
111
  def raw_code
50
- reader.read
112
+ Listing.for(retrieval_args)
51
113
  end
52
114
 
53
- private
115
+ def filename
116
+ retrieval_args[:filename]
117
+ end
54
118
 
55
- # Manufacture a reader of the appriopriate type
56
- def reader
57
- @reader ||=
58
- if opts[:tag]
59
- GitTaggedFileReader.new(filename,
60
- sectionname,
61
- opts.delete(:tag),
62
- opts)
63
- elsif sectionname
64
- SectionReader.new(filename, sectionname)
65
- else
66
- FileReader.new(filename)
67
- end
119
+ def highlight
120
+ render_args[:highlight]
68
121
  end
69
122
 
70
- def language
123
+ def custom_language
124
+ render_args[:custom_language]
125
+ end
126
+
127
+ def language_from_extension
71
128
  extension_array = File.extname(filename).scan(/\.(.*)/).first
72
129
  lang_from_extension = extension_array.nil? ? nil : extension_array[0]
73
- (opts[:custom_language] || lang_from_extension || DEFAULT_LANGUAGE)
130
+ end
131
+
132
+ def language
133
+ (custom_language || language_from_extension || DEFAULT_LANGUAGE)
74
134
  end
75
135
 
76
136
  def code_error(details)
@@ -78,169 +138,253 @@ module CodeInclusion
78
138
  end
79
139
  end
80
140
 
81
-
82
- # GitTaggedFileReader retrieves code from a
83
- # tagged file in your local git repository.
84
- #
85
- # Example: <<(lib/polytexnic/literal.rb, tag: v0.9.4)
86
- class GitTaggedFileReader
87
-
88
- def self.git
89
- Git.new
141
+ # Listing.for takes a set of retrieval args and returns an array of
142
+ # source code lines to be included in the book.
143
+ #
144
+ # Listing is responsible for retrieving the file you're including
145
+ # (the 'FullListing') and for extracting individual lines from that file
146
+ # (the 'Subset').
147
+
148
+ # It contains factory methods to choose the correct FullListing and Subset
149
+ # classes and the code to wire them together. If you add new FullListing or
150
+ # Subset objects, you'll need to wire them together here.
151
+ class Listing
152
+
153
+ # Returns the lines of code to be included or
154
+ # an exception containing the error message.
155
+ def self.for(args)
156
+ new(args).final_listing
90
157
  end
91
158
 
92
- attr_reader :filename, :sectionname, :tagname, :opts, :git
159
+ attr_reader :args
93
160
 
94
- def initialize(filename, sectionname, tagname, opts={}, git=self.class.git)
95
- @filename = filename
96
- @sectionname = sectionname
97
- @tagname = tagname
98
- @opts = opts
99
- @git = git
161
+ def initialize(args)
162
+ @args = args
100
163
  end
101
164
 
102
- def read
103
- ensure_tag_exists!
165
+ def final_listing
166
+ subset_class.new(full_listing, args).lines
104
167
 
105
- Dir.mktmpdir {|tmpdir|
106
- checkout_file!(tmpdir)
107
- read_file(tmpdir)
108
- }
168
+ rescue SubsetException => e
169
+ raise RetrievalException.new(e.message +
170
+ " in file '#{args[:filename]}'")
109
171
  end
110
172
 
111
173
  private
112
174
 
113
- def ensure_tag_exists!
114
- unless git.tag_exists?(tagname)
115
- raise(CodeInclusionException, "Tag '#{tagname}' does not exist.")
116
- end
175
+ def full_listing
176
+ retrieval_class.new(args).lines
117
177
  end
118
178
 
119
- def checkout_file!(tmpdir)
120
- output = git.checkout(tmpdir, filename, tagname)
121
- unless git.checkout_succeeded?
122
- raise(CodeInclusionException, improve_error_message(output, tmpdir))
179
+ def retrieval_class
180
+ case
181
+ when args[:git]
182
+ FullListing::GitTag
183
+ else
184
+ FullListing::File
123
185
  end
124
186
  end
125
187
 
126
- def read_file(tmpdir)
127
- tmpfilename = File.join(tmpdir, filename)
128
- CodeInclusion::Code.new(tmpfilename, sectionname, opts).raw_code
188
+ def subset_class
189
+ case
190
+ when args[:line_numbers]
191
+ Subset::LineNumber
192
+ when args[:section]
193
+ Subset::Section
194
+ else
195
+ Subset::Everything
196
+ end
129
197
  end
198
+ end
199
+
200
+
201
+ # FullListing objects retrieve an entire file from some location.
202
+ module FullListing
203
+
204
+ # Return lines contained in a file read from disk.
205
+ class File
206
+ attr_reader :filename
207
+
208
+ def initialize(args)
209
+ @filename = args[:filename]
210
+ end
130
211
 
131
- def improve_error_message(msg, tmpdir)
132
- msg.gsub(/#{tmpdir}/, '').chomp(".\n") + " in tag #{tagname}."
212
+ def lines
213
+ ensure_exists!
214
+ ::File.read(filename).split("\n")
215
+ end
216
+
217
+ private
218
+
219
+ def ensure_exists!
220
+ unless ::File.exist?(filename)
221
+ raise(RetrievalException, "File '#{filename}' does not exist")
222
+ end
223
+ end
133
224
  end
134
225
 
226
+ # Return lines contained in a file that's tagged in git.
227
+ class GitTag
228
+
229
+ def self.git_cmd
230
+ GitCmd.new
231
+ end
232
+
233
+ attr_reader :filename, :tag, :git_cmd
135
234
 
136
- class Git
137
- def checkout(tmpdir, filename, tagname)
138
- `git --work-tree=#{tmpdir} checkout #{tagname} #{filename} 2>&1`
235
+ def initialize(args, git_cmd=self.class.git_cmd)
236
+ @filename = args[:filename]
237
+ @tag = args[:git][:tag]
238
+ @git_cmd = git_cmd
139
239
  end
140
240
 
141
- def checkout_succeeded?
142
- $? == 0
241
+ def lines
242
+ ensure_exists!
243
+ result = git_cmd.show(filename, tag)
244
+
245
+ if git_cmd.succeeded?
246
+ result.split("\n")
247
+ else
248
+ raise(RetrievalException, result)
249
+ end
143
250
  end
144
251
 
145
- def tags
146
- `git tag`
252
+ private
253
+
254
+ def ensure_exists!
255
+ unless git_cmd.tag_exists?(tag)
256
+ raise(RetrievalException, "Tag '#{tag}' does not exist.")
257
+ end
147
258
  end
148
259
 
149
- def tag_exists?(tagname)
150
- tags.split("\n").include?(tagname)
260
+ class GitCmd
261
+ def show(filename, tagname)
262
+ `git show #{tagname}:#{filename}`
263
+ end
264
+
265
+ def succeeded?
266
+ $? == 0
267
+ end
268
+
269
+ def tags
270
+ `git tag`
271
+ end
272
+
273
+ def tag_exists?(tagname)
274
+ tags.split("\n").include?(tagname)
275
+ end
151
276
  end
152
277
  end
153
278
  end
154
279
 
155
280
 
156
- # FileReader retrieves code from a file on disk.
157
- #
158
- # Example: <<(lib/polytexnic/literal.rb)
159
- class FileReader
160
- attr_reader :filename
281
+ # Subsets reduce an input array of strings to a subset of that array.
282
+ module Subset
161
283
 
162
- def initialize(filename)
163
- @filename = filename
164
- end
284
+ # Return the lines in the named section.
285
+ class Section
286
+ attr_reader :input, :name
165
287
 
166
- def read
167
- ensure_file_exists!
168
- File.read(filename).split("\n")
169
- end
288
+ def initialize(input, args)
289
+ @input = input
290
+ @name = args[:section]
291
+ end
170
292
 
171
- def ensure_file_exists!
172
- unless File.exist?(filename)
173
- raise(CodeInclusionException, "File '#{filename}' does not exist")
293
+ def lines
294
+ ensure_exists!
295
+ input.slice(index_of_first_line, length)
174
296
  end
175
- end
176
- end
177
297
 
298
+ private
178
299
 
179
- # SectionReader retrieves code from a marked section in a file on disk.
180
- #
181
- # Example: <<(lib/polytexnic/literal.rb[my_section])
182
- #
183
- # Sections are delineated by '#// begin section_name' and '#// end',
184
- # for example:
185
- #
186
- # #// begin my_section
187
- # some code
188
- # #// end
189
- class SectionReader < FileReader
190
- attr_reader :lines, :sectionname
300
+ def exist?
301
+ !!index_of_begin
302
+ end
191
303
 
192
- def initialize(filename, sectionname)
193
- super(filename)
194
- @sectionname = sectionname
195
- end
304
+ def index_of_begin
305
+ @section_begin_i ||=
306
+ input.index {|line| clean(line) == begin_text }
307
+ end
196
308
 
197
- def read
198
- @lines = super
199
- ensure_section_exists!
200
- lines.slice(index_of_first_line, length)
201
- end
309
+ def index_of_first_line
310
+ @first_line_i ||= index_of_begin + 1
311
+ end
202
312
 
203
- private
204
- def exist?
205
- !!index_of_section_begin
206
- end
313
+ def length
314
+ input.slice(index_of_first_line, input.size).index { |line|
315
+ clean(line) == (end_text)
316
+ }
317
+ end
207
318
 
208
- def index_of_section_begin
209
- @section_begin_i ||=
210
- lines.index {|line| clean(line) == section_begin_text }
211
- end
319
+ def marker
320
+ '#//'
321
+ end
212
322
 
213
- def index_of_first_line
214
- @first_line_i ||= index_of_section_begin + 1
215
- end
323
+ def begin_text
324
+ "#{marker} begin #{name}"
325
+ end
216
326
 
217
- def length
218
- lines.slice(index_of_first_line, lines.size).index { |line|
219
- clean(line) == (section_end_text)
220
- }
221
- end
327
+ def end_text
328
+ "#{marker} end"
329
+ end
222
330
 
223
- def marker
224
- '#//'
225
- end
331
+ def clean(str)
332
+ str.strip.squeeze(" ")
333
+ end
226
334
 
227
- def section_begin_text
228
- "#{marker} begin #{sectionname}"
335
+ def ensure_exists!
336
+ unless exist?
337
+ section_err = "Could not find section header '#{begin_text}'"
338
+ raise(SubsetException, section_err)
339
+ end
340
+ end
229
341
  end
230
342
 
231
- def section_end_text
232
- "#{marker} end"
233
- end
343
+ # Return the lines specified by :line_numbers.
344
+ # Line numbers are comma separated and may contain ranges, i.e.,
345
+ # 2, 4-6, 8, 14
346
+ #
347
+ # Rules:
348
+ # whitespace is ignored
349
+ # ranges are included in ascending order (4-6 is the same as 6-4)
350
+ # lines numbers higher than the max available are ignored
351
+ class LineNumber
352
+ attr_reader :input, :numbers
353
+ def initialize(input, args)
354
+ @input = input
355
+ @numbers = args[:line_numbers]
356
+ end
357
+
358
+ def lines
359
+ individual_numbers.collect {|i| input[i - 1]}.compact
360
+ end
361
+
362
+ private
363
+
364
+ def individual_numbers
365
+ clumps.collect {|clump| expand_clump(clump)}.flatten
366
+ end
234
367
 
235
- def clean(str)
236
- str.strip.squeeze(" ")
368
+ def clumps
369
+ numbers.gsub(/ /,'').split(",")
370
+ end
371
+
372
+ def expand_clump(clump)
373
+ edges = clump.split('-').collect(&:to_i)
374
+ (edges.min.to_i..edges.max.to_i).to_a
375
+ end
237
376
  end
238
377
 
239
- def ensure_section_exists!
240
- unless exist?
241
- section_err = "Could not find section header '#{section_begin_text}'"
242
- file_err = " in file '#{filename}'"
243
- raise(CodeInclusionException, section_err + file_err)
378
+ # Return everything (think of this as the null object subset)
379
+ class Everything
380
+ attr_reader :input
381
+
382
+ def initialize(input, _=nil)
383
+ @input = input
384
+ end
385
+
386
+ def lines
387
+ input
244
388
  end
245
389
  end
246
390
  end
@@ -1,3 +1,3 @@
1
1
  module Polytexnic
2
- VERSION = "1.0.beta3"
2
+ VERSION = "1.0.beta4"
3
3
  end
@@ -0,0 +1,136 @@
1
+ # encoding=utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "full listing" do
5
+
6
+ describe "file" do
7
+
8
+ context "exists" do
9
+ let(:args) { {filename: __FILE__} }
10
+ subject { CodeInclusion::FullListing::File.new(args).lines }
11
+
12
+ it { should eq(File.read(__FILE__).split("\n")) }
13
+ end
14
+
15
+ context "does not exist" do
16
+ let(:args) { {filename: "badfile"} }
17
+ subject { lambda { CodeInclusion::FullListing::File.new(args).lines } }
18
+
19
+ it { should raise_exception(CodeInclusion::RetrievalException) }
20
+ end
21
+
22
+ end
23
+
24
+ describe "git tag" do
25
+
26
+ context "file exists" do
27
+ before(:all) do
28
+ class FakeGitCmd < CodeInclusion::FullListing::GitTag::GitCmd
29
+ def show(_, _)
30
+ "Real data\nsecond line"
31
+ end
32
+ def tag_exists?(tagname)
33
+ true
34
+ end
35
+ def succeeded?
36
+ true
37
+ end
38
+ end
39
+ end
40
+
41
+ let(:args) { { filename: "goodfile", git: {tag: "goodtag"} } }
42
+ subject {
43
+ CodeInclusion::FullListing::GitTag.new(args, FakeGitCmd.new).lines }
44
+
45
+ it { should eq(["Real data", "second line"]) }
46
+ end
47
+
48
+ context "tag does not exist" do
49
+ before(:all) do
50
+ class FakeGitCmd < CodeInclusion::FullListing::GitTag::GitCmd
51
+ def tag_exists?(tagname)
52
+ false
53
+ end
54
+ end
55
+ end
56
+
57
+ let(:args) { { filename: "irreleventfile", git: {tag: "badtag"} } }
58
+ subject { lambda {
59
+ CodeInclusion::FullListing::GitTag.new(args, FakeGitCmd.new).lines } }
60
+
61
+ it { should raise_exception(
62
+ CodeInclusion::RetrievalException,
63
+ "Tag 'badtag' does not exist."
64
+ ) }
65
+ end
66
+
67
+ context "file does not exist" do
68
+ before(:all) do
69
+ class FakeGitCmd < CodeInclusion::FullListing::GitTag::GitCmd
70
+ def show(filename, tag)
71
+ "fatal: Path 'badfile' does not exist in 'goodtag'"
72
+ end
73
+ def tag_exists?(tagname)
74
+ true
75
+ end
76
+ def succeeded?
77
+ false
78
+ end
79
+ end
80
+ end
81
+
82
+ let(:args) { { filename: "badfile", git: {tag: "goodtag"} } }
83
+ subject { lambda {
84
+ CodeInclusion::FullListing::GitTag.new(args, FakeGitCmd.new).lines } }
85
+
86
+ it { should raise_exception(
87
+ CodeInclusion::RetrievalException,
88
+ "fatal: Path 'badfile' does not exist in 'goodtag'") }
89
+ end
90
+
91
+ end
92
+ end
93
+
94
+
95
+ describe "subset" do
96
+ let(:input) {["line1",
97
+ "line2",
98
+ "#// begin sec_AAA",
99
+ "line4",
100
+ "line5",
101
+ "#// end",
102
+ "line7",
103
+ "line8",
104
+ "line9",
105
+ "line10"]}
106
+
107
+ describe "section" do
108
+
109
+ context "exists" do
110
+ let(:args) { {section: "sec_AAA"} }
111
+ subject { CodeInclusion::Subset::Section.new(input, args).lines }
112
+
113
+ it { should eq(["line4", "line5"]) }
114
+ end
115
+
116
+ context "does not exist" do
117
+ let(:args) { {section: "missing section name"} }
118
+ subject { lambda {CodeInclusion::Subset::Section.new(input, args).lines} }
119
+
120
+ it { should raise_exception(CodeInclusion::SubsetException) }
121
+ end
122
+ end
123
+
124
+ describe "line numbers" do
125
+ let(:args) { {line_numbers: "1 , 2-1, 4- 5,10, 42"} }
126
+ subject { CodeInclusion::Subset::LineNumber.new(input, args).lines }
127
+
128
+ it { should eq(["line1", "line1", "line2", "line4", "line5", "line10"]) }
129
+ end
130
+
131
+ describe "everything" do
132
+ subject { CodeInclusion::Subset::Everything.new(input).lines }
133
+
134
+ it { should eq(input)}
135
+ end
136
+ end
@@ -244,24 +244,22 @@ describe Polytexnic::Pipeline do
244
244
  context "from a git tag" do
245
245
  shared_examples "an inclusion" do
246
246
  it "resembles the given output" do
247
- allow(CodeInclusion::GitTaggedFileReader).to receive(:git).
248
- and_return(FakeGit.new)
247
+ allow(CodeInclusion::FullListing::GitTag).to receive(:git_cmd).
248
+ and_return(FakeGitCmd.new)
249
249
  expect(processed_text).to resemble(output)
250
250
  end
251
251
  end
252
252
 
253
253
  context "the tag and file exist" do
254
254
  before(:all) do
255
- class FakeGit < CodeInclusion::GitTaggedFileReader::Git
256
- # Write fake data to location on disk where git _would_ have placed the file
257
- def checkout(tmpdir, filename, tagname)
258
- f = File.join(tmpdir, filename)
259
- File.open(f, 'w') { |file| file.write("Fake data") }
255
+ class FakeGitCmd < CodeInclusion::FullListing::GitTag::GitCmd
256
+ def show(_, _)
257
+ "Fake data\nsecond line"
260
258
  end
261
259
  def tag_exists?(tagname)
262
260
  true
263
261
  end
264
- def checkout_succeeded?
262
+ def succeeded?
265
263
  true
266
264
  end
267
265
  end
@@ -269,7 +267,7 @@ describe Polytexnic::Pipeline do
269
267
 
270
268
  context "with tag only" do
271
269
  let(:polytex) do <<-'EOS'
272
- %= <<(tagged_file.rb, tag: fake_tag.1.0)
270
+ %= <<(tagged_file.rb, git: {tag: fake_tag.1.0})
273
271
  EOS
274
272
  end
275
273
  let(:output) do <<-'EOS'
@@ -277,6 +275,7 @@ describe Polytexnic::Pipeline do
277
275
  <div class="highlight">
278
276
  <pre>
279
277
  <span class="no">Fake</span> <span class="n">data</span>
278
+ <span class="n">second</span> <span class="n">line</span>
280
279
  </pre>
281
280
  </div>
282
281
  EOS
@@ -288,7 +287,10 @@ describe Polytexnic::Pipeline do
288
287
  let(:output) do <<-'EOS'
289
288
  <div class="code">
290
289
  <div class="highlight">
291
- <pre>Fake data</pre>
290
+ <pre>
291
+ Fake data
292
+ second line
293
+ </pre>
292
294
  </div>
293
295
  </div>
294
296
  EOS
@@ -296,7 +298,7 @@ describe Polytexnic::Pipeline do
296
298
 
297
299
  context "with tag and lang" do
298
300
  let(:polytex) do <<-'EOS'
299
- %= <<(tagged_file.rb, tag: slashes/and-dashes-are/ok/too, lang: tex)
301
+ %= <<(tagged_file.rb, git: {tag: slashes/and-dashes-are/ok/too}, lang: tex)
300
302
  EOS
301
303
  end
302
304
  it_behaves_like "an inclusion"
@@ -304,7 +306,7 @@ describe Polytexnic::Pipeline do
304
306
 
305
307
  context "with tag, lang and options" do
306
308
  let(:polytex) do <<-'EOS'
307
- %= <<(tagged_file.rb, tag: v0.9.4, lang: tex, options: "hl_lines": [5])
309
+ %= <<(tagged_file.rb, git: {tag: v0.9.4}, lang: tex, options: "hl_lines": [5])
308
310
  EOS
309
311
  end
310
312
  it_behaves_like "an inclusion"
@@ -314,20 +316,21 @@ describe Polytexnic::Pipeline do
314
316
 
315
317
  context "the tag does not exist" do
316
318
  before(:all) do
317
- class FakeGit < CodeInclusion::GitTaggedFileReader::Git
318
- def checkout(tmpdir, filename, tagname)
319
+ class FakeGitCmd < CodeInclusion::FullListing::GitTag::GitCmd
320
+ def show(_, _)
321
+ ''
319
322
  end
320
323
  def tag_exists?(tagname)
321
324
  false
322
325
  end
323
- def checkout_succeeded?
326
+ def succeeded?
324
327
  false
325
328
  end
326
329
  end
327
330
  end
328
331
 
329
332
  let(:polytex) do <<-'EOS'
330
- %= <<(tagged_file.rb, tag: non_existent_tag)
333
+ %= <<(tagged_file.rb, git: {tag: non_existent_tag})
331
334
  EOS
332
335
  end
333
336
  let(:output) do <<-'EOS'
@@ -343,27 +346,27 @@ describe Polytexnic::Pipeline do
343
346
 
344
347
  context "the file does not exist" do
345
348
  before(:all) do
346
- class FakeGit < CodeInclusion::GitTaggedFileReader::Git
347
- def checkout(tmpdir, filename, tagname)
348
- "pathspec #{tmpdir}/non_existent_file did not match any file(s) known to git.\n"
349
+ class FakeGitCmd < CodeInclusion::FullListing::GitTag::GitCmd
350
+ def show(filename, _)
351
+ "fatal: Path 'path/to/non_existent_file.rb' does not exist in 'v0.9.9'"
349
352
  end
350
353
  def tag_exists?(tagname)
351
354
  true
352
355
  end
353
- def checkout_succeeded?
356
+ def succeeded?
354
357
  false
355
358
  end
356
359
  end
357
360
  end
358
361
 
359
362
  let(:polytex) do <<-'EOS'
360
- %= <<(non_existent_file, tag: v0.9.4)
363
+ %= <<(path/to/non_existent_file.rb, git: {tag: v0.9.4})
361
364
  EOS
362
365
  end
363
366
  let(:output) do <<-'EOS'
364
367
  <p>
365
368
  <span class="inline_verbatim">
366
- ERROR: pathspec /non_existent_file did not match any file(s) known to git in tag v0.9.4.
369
+ ERROR: fatal: Path 'path/to/non_existent_file.rb' does not exist in 'v0.9.9'
367
370
  </span>
368
371
  </p>
369
372
  EOS
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: polytexnic
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.beta3
4
+ version: 1.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Hartl
@@ -258,6 +258,7 @@ files:
258
258
  - spec/to_html/graphics_and_figures_spec.rb
259
259
  - spec/to_html/input_spec.rb
260
260
  - spec/to_html/lists_spec.rb
261
+ - spec/to_html/literal_environments/code_inclusion_spec.rb
261
262
  - spec/to_html/literal_environments/code_spec.rb
262
263
  - spec/to_html/literal_environments/math_spec.rb
263
264
  - spec/to_html/literal_environments/unicode_spec.rb
@@ -321,6 +322,7 @@ test_files:
321
322
  - spec/to_html/graphics_and_figures_spec.rb
322
323
  - spec/to_html/input_spec.rb
323
324
  - spec/to_html/lists_spec.rb
325
+ - spec/to_html/literal_environments/code_inclusion_spec.rb
324
326
  - spec/to_html/literal_environments/code_spec.rb
325
327
  - spec/to_html/literal_environments/math_spec.rb
326
328
  - spec/to_html/literal_environments/unicode_spec.rb