bookingit 0.0.1 → 0.1.0

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.
@@ -0,0 +1,30 @@
1
+ require 'fileutils'
2
+ require 'open3'
3
+
4
+ module Bookingit
5
+ class ShellCommand
6
+ include FileUtils
7
+
8
+ attr_reader :stdout, :stderr, :exit_code, :command, :expected_exit_status
9
+
10
+ def initialize(command: nil,path: '.',expected_exit_status: 0, &block)
11
+ @command = command
12
+ @path = path
13
+ @exit_status_checker = if block.nil?
14
+ ->(exit_code) { exit_code == expected_exit_status }
15
+ else
16
+ block
17
+ end
18
+ end
19
+
20
+ def run!
21
+ chdir @path do
22
+ @stdout, @stderr, status = Open3.capture3(@command)
23
+ @exit_code = status.exitstatus
24
+ end
25
+ unless @exit_status_checker.(@exit_code)
26
+ raise UnexpectedShellCommandExit.new(@command,@stdout,@stderr)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,3 @@
1
1
  module Bookingit
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,8 @@
1
+ require 'mustache'
2
+ require 'ostruct'
3
+
4
+ require 'bookingit/views/base_view'
5
+ require 'bookingit/views/index_view'
6
+ require 'bookingit/views/header_view'
7
+ require 'bookingit/views/footer_view'
8
+ require 'bookingit/views/code_view'
@@ -0,0 +1,12 @@
1
+ module Bookingit
2
+ module Views
3
+ class BaseView < Mustache
4
+ attr_reader :config
5
+ self.template_path = File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','templates'))
6
+
7
+ def initialize(config)
8
+ @config = config.options
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,16 @@
1
+ module Bookingit
2
+ module Views
3
+ class CodeView < BaseView
4
+ self.template_name = 'block_code.html'
5
+
6
+ attr_reader :code, :filename, :css_class
7
+
8
+ def initialize(code, filename, language, config)
9
+ @code = CGI.escapeHTML(code)
10
+ @filename = String(filename).strip == '' ? nil : filename.strip
11
+ @css_class = language ? "language-#{language}" : ""
12
+ super(config)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ module Bookingit
2
+ module Views
3
+ class FooterView < BaseView
4
+ self.template_name = 'footer.html'
5
+
6
+ attr_reader :chapter
7
+
8
+ def initialize(chapter,config)
9
+ @chapter = chapter
10
+ super(config)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module Bookingit
2
+ module Views
3
+ class HeaderView < BaseView
4
+ self.template_name = 'header.html'
5
+
6
+ attr_reader :stylesheets, :theme
7
+
8
+ def initialize(stylesheets, theme, config)
9
+ @stylesheets = stylesheets.map { |stylesheet|
10
+ OpenStruct.new(path: stylesheet, media: "all")
11
+ }
12
+ @theme = theme
13
+ super(config)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require 'forwardable'
2
+ module Bookingit
3
+ module Views
4
+ class IndexView < BaseView
5
+ extend Forwardable
6
+ self.template_name = 'index.html'
7
+
8
+ attr_reader :front_matter, :main_matter, :back_matter, :config
9
+ def_delegators :@header_view, :stylesheets, :theme
10
+
11
+ def initialize(stylesheets,theme,front_matter,main_matter,back_matter,config)
12
+ @header_view = HeaderView.new(stylesheets,theme,config)
13
+ @front_matter = front_matter
14
+ @main_matter = main_matter
15
+ @back_matter = back_matter
16
+ super(config)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1 @@
1
+ <article class='code-listing'><pre><code class="{{css_class}}">{{{code}}}</code></pre>{{#filename}}<footer><h1>{{filename}}</h1></footer>{{/filename}}</article>
@@ -0,0 +1,37 @@
1
+ <footer>
2
+ {{#chapter}}
3
+ <ol>
4
+ {{#previous_chapter}}
5
+ <li class="previous"><a href="{{relative_url}}">&larr;
6
+ {{#title}}
7
+ {{{title}}}
8
+ {{/title}}
9
+ {{^title}}
10
+ Previous
11
+ {{/title}}
12
+ </a></li>
13
+ {{/previous_chapter}}
14
+ {{#next_chapter}}
15
+ <li class="next"><a href="{{relative_url}}">
16
+ {{#title}}
17
+ {{{title}}}
18
+ {{/title}}
19
+ {{^title}}
20
+ Next
21
+ {{/title}}
22
+ &rarr;</a></li>
23
+ {{/next_chapter}}
24
+ </ol>
25
+ <div class="clearfix"></div>
26
+ {{/chapter}}
27
+ {{#config}}
28
+ {{#license}}
29
+ <p class="copyright">
30
+ <a rel="license" href="http://creativecommons.org/licenses/{{type}}/4.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/{{type}}/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">{{title}}</span> by <a xmlns:cc="http://creativecommons.org/ns#" href="{{url}}" property="cc:attributionName" rel="cc:attributionURL">{{author}}</a> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/{{type}}/4.0/">{{typeDescription}}
31
+ </a>.
32
+ </p>
33
+ {{/license}}
34
+ {{/config}}
35
+ </footer>
36
+ </body>
37
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ {{> stylesheets.html }}
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
6
+ <meta charset="utf-8">
7
+ <title>{{config.title}}: {{config.subtitle}}</title>
8
+ {{> syntax_highlighting.html }}
9
+ </head>
10
+ <body>
11
+ <h1><a href="index.html">{{config.title}}</a></h1>
12
+ {{#config}}
13
+ {{#author}}
14
+ <p class="byline">by {{config.author}}</p>
15
+ {{/author}}
16
+ {{/config}}
@@ -0,0 +1,27 @@
1
+ {{> header.html}}
2
+ {{#config}}
3
+ <h2 class="subtitle">{{subtitle}}</h2>
4
+ {{/config}}
5
+ <ol class="front-matter">
6
+ {{#front_matter}}
7
+ <li class='chapter'><a href="{{relative_url}}">{{{title}}}</a></li>
8
+ {{/front_matter}}
9
+ </ol>
10
+ <ol class="main-matter">
11
+ {{#main_matter}}
12
+ <li class='chapter'>
13
+ <a href="{{relative_url}}">{{{title}}}</a>
14
+ <ol>
15
+ {{#sections}}
16
+ <li class='section'><a href="{{relative_url}}">{{{title}}}</a></li>
17
+ {{/sections}}
18
+ </ol>
19
+ </li class='chapter'>
20
+ {{/main_matter}}
21
+ </ol>
22
+ <ol class="back-matter">
23
+ {{#back_matter}}
24
+ <li class='chapter'><a href="{{relative_url}}">{{{title}}}</a></li>
25
+ {{/back_matter}}
26
+ </ol>
27
+ {{> footer.html}}
@@ -0,0 +1,3 @@
1
+ {{#stylesheets}}
2
+ <link href='{{path}}' rel='stylesheet' type='text/css' media='{{media}}'>
3
+ {{/stylesheets}}
@@ -0,0 +1,3 @@
1
+ <link rel="stylesheet" href="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/styles/{{theme}}.min.css">
2
+ <script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/highlight.min.js"></script>
3
+ <script>hljs.initHighlightingOnLoad();</script>
data/test/book_test.rb ADDED
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+ require 'fileutils'
3
+
4
+ include FileUtils
5
+
6
+ class Bookingit::BookTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @tempdir = Dir.mktmpdir
10
+ end
11
+
12
+ def teardown
13
+ remove_entry @tempdir
14
+ end
15
+
16
+ test_that "we blow up if our markdown doesn't have any H1's" do
17
+ end
18
+
19
+
20
+ end
data/test/config_test.rb CHANGED
@@ -17,6 +17,13 @@ class Bookingit::ConfigTest < Test::Unit::TestCase
17
17
  Given :some_markdown_files
18
18
  And {
19
19
  @config = {
20
+ title: "blah town",
21
+ subtitle: "the town of blah",
22
+ whatever: "foobar",
23
+ authors: [
24
+ "Shane Vendrel",
25
+ "Ronnie Gardocki",
26
+ ],
20
27
  front_matter: "foo.md",
21
28
  main_matter: "bar.md",
22
29
  back_matter: "baz.md",
@@ -26,13 +33,16 @@ class Bookingit::ConfigTest < Test::Unit::TestCase
26
33
  @normalized_config = Bookingit::Config.new(@config.to_json,@tempdir)
27
34
  }
28
35
  Then {
36
+ assert_equal @config[:title], @normalized_config.options['title']
37
+ assert_equal @config[:subtitle], @normalized_config.options['subtitle']
38
+ assert_equal @config[:whatever], @normalized_config.options['whatever']
39
+ assert_equal @config[:authors], @normalized_config.options['authors']
29
40
  assert_equal 1,@normalized_config.front_matter.chapters.size
30
- assert_equal File.join(@tempdir,'foo.md'),@normalized_config.front_matter.chapters[0].path
41
+ assert_equal File.join(@tempdir,'foo.md'),@normalized_config.front_matter.chapters[0].markdown_path
31
42
  assert_equal 1,@normalized_config.main_matter.chapters.size
32
- assert_equal File.join(@tempdir,'bar.md'),@normalized_config.main_matter.chapters[0].path
33
- assert_equal 0,@normalized_config.main_matter.chapters[0].sections.size
43
+ assert_equal File.join(@tempdir,'bar.md'),@normalized_config.main_matter.chapters[0].markdown_path
34
44
  assert_equal 1,@normalized_config.back_matter.chapters.size
35
- assert_equal File.join(@tempdir,'baz.md'),@normalized_config.back_matter.chapters[0].path
45
+ assert_equal File.join(@tempdir,'baz.md'),@normalized_config.back_matter.chapters[0].markdown_path
36
46
  }
37
47
  end
38
48
 
@@ -50,57 +60,55 @@ class Bookingit::ConfigTest < Test::Unit::TestCase
50
60
  }
51
61
  Then {
52
62
  assert_equal 1,@normalized_config.front_matter.chapters.size
53
- assert_equal File.join(@tempdir,'foo.md'),@normalized_config.front_matter.chapters[0].path
63
+ assert_equal File.join(@tempdir,'foo.md'),@normalized_config.front_matter.chapters[0].markdown_path
54
64
  assert_equal 1,@normalized_config.main_matter.chapters.size
55
- assert_equal File.join(@tempdir,'bar.md'),@normalized_config.main_matter.chapters[0].path
56
- assert_equal 0,@normalized_config.main_matter.chapters[0].sections.size
65
+ assert_equal File.join(@tempdir,'bar.md'),@normalized_config.main_matter.chapters[0].markdown_path
57
66
  assert_equal 1,@normalized_config.back_matter.chapters.size
58
- assert_equal File.join(@tempdir,'baz.md'),@normalized_config.back_matter.chapters[0].path
67
+ assert_equal File.join(@tempdir,'baz.md'),@normalized_config.back_matter.chapters[0].markdown_path
59
68
  }
60
69
  end
61
70
 
62
- test_that "parses sections" do
63
- Given :some_markdown_files
64
- And {
71
+ test_that "converts rendering config" do
72
+ Given {
65
73
  @config = {
66
- front_matter: ["foo.md"],
67
- main_matter: [
68
- "bar.md",
69
- ["blah1.md","blah2.md"],
70
- ],
71
- back_matter: ["baz.md"],
74
+ rendering: {
75
+ stylesheets: 'blah.css',
76
+ languages: {
77
+ ".coffee" => "coffeescript",
78
+ "/^Bowerfile$/" => "ruby",
79
+ },
80
+ git_repos_basedir: "/tmp",
81
+ syntax_theme: "solarized",
82
+ }
72
83
  }
73
84
  }
74
85
  When {
75
86
  @normalized_config = Bookingit::Config.new(@config.to_json,@tempdir)
76
87
  }
77
- Then {
78
- assert_equal 2,@normalized_config.main_matter.chapters.size,"chapters"
79
- assert_equal 2,@normalized_config.main_matter.chapters[1].sections.size,"sections"
88
+ Then {
89
+ assert_equal "/tmp",@normalized_config.rendering_config[:basedir]
90
+ assert_equal({ ".coffee" => "coffeescript", /^Bowerfile$/ => "ruby" },@normalized_config.rendering_config[:languages])
91
+ assert_equal ['blah.css'],@normalized_config.rendering_config[:stylesheets]
92
+ assert_equal 'solarized',@normalized_config.rendering_config[:theme]
93
+ refute @normalized_config.cache
80
94
  }
81
95
  end
82
96
 
83
- test_that "globs" do
84
- Given :some_markdown_files
85
- And {
97
+ test_that "we can mutate the config" do
98
+ Given {
86
99
  @config = {
87
- front_matter: ["foo.md"],
88
- main_matter: [
89
- "bar.md",
90
- "blah*.md",
91
- ],
92
- back_matter: ["baz.md"],
100
+ rendering: {
101
+ stylesheets: 'blah.css',
102
+ syntax_theme: "solarized",
103
+ }
93
104
  }
94
105
  }
95
106
  When {
96
107
  @normalized_config = Bookingit::Config.new(@config.to_json,@tempdir)
108
+ @normalized_config.cache = true
97
109
  }
98
- Then {
99
- assert_equal 2,@normalized_config.main_matter.chapters.size
100
- assert_equal 3,@normalized_config.main_matter.chapters[1].sections.size
101
- assert_equal File.join(@tempdir,'blah1.md'),@normalized_config.main_matter.chapters[1].sections[0].path
102
- assert_equal File.join(@tempdir,'blah2.md'),@normalized_config.main_matter.chapters[1].sections[1].path
103
- assert_equal File.join(@tempdir,'blah3.md'),@normalized_config.main_matter.chapters[1].sections[2].path
110
+ Then {
111
+ assert @normalized_config.cache
104
112
  }
105
113
  end
106
114
 
@@ -14,11 +14,40 @@ class RendererTest < Test::Unit::TestCase
14
14
  remove_entry @tempdir
15
15
  end
16
16
 
17
+ def renderer(options={})
18
+ options = OpenStruct.new(:rendering_config => { basedir: @tempdir }.merge(options))
19
+ Bookingit::Renderer.new(options)
20
+ end
21
+
17
22
  test_that "block_code can read a file URL and guess ruby" do
18
23
  Given a_file_with_extension(".rb")
19
24
  When render_file_url_code_block
20
25
  Then {
21
- assert_equal %{<pre><code class="language-ruby">#{@code}</code></pre>},@html
26
+ assert_equal %{<article class='code-listing'><pre><code class="language-ruby">#{@code}</code></pre><footer><h1>#{@relative_path}</h1></footer></article>},@html
27
+ }
28
+ end
29
+
30
+ test_that "block_code can read a file URL and guess ruby from Gemfile" do
31
+ Given a_file_named("Gemfile")
32
+ When render_file_url_code_block
33
+ Then {
34
+ assert_equal %{<article class='code-listing'><pre><code class="language-ruby">#{@code}</code></pre><footer><h1>Gemfile</h1></footer></article>},@html
35
+ }
36
+ end
37
+
38
+ test_that "block_code can read a file URL and be OK if it cannot guess" do
39
+ Given a_file_with_extension(".blah")
40
+ When render_file_url_code_block
41
+ Then {
42
+ assert_equal %{<article class='code-listing'><pre><code class="">#{@code}</code></pre><footer><h1>#{@relative_path}</h1></footer></article>},@html
43
+ }
44
+ end
45
+
46
+ test_that "we can tell the renderer about other languages and extensions" do
47
+ Given a_file_with_extension(".blah")
48
+ When render_file_url_code_block(languages: { '.blah' => 'blahscript' })
49
+ Then {
50
+ assert_equal %{<article class='code-listing'><pre><code class="language-blahscript">#{@code}</code></pre><footer><h1>#{@relative_path}</h1></footer></article>},@html
22
51
  }
23
52
  end
24
53
 
@@ -26,7 +55,7 @@ class RendererTest < Test::Unit::TestCase
26
55
  Given a_file_with_extension(".scala")
27
56
  When render_file_url_code_block
28
57
  Then {
29
- assert_equal %{<pre><code class="language-scala">#{@code}</code></pre>},@html
58
+ assert_equal %{<article class='code-listing'><pre><code class="language-scala">#{@code}</code></pre><footer><h1>#{@relative_path}</h1></footer></article>},@html
30
59
  }
31
60
  end
32
61
 
@@ -41,14 +70,14 @@ class RendererTest < Test::Unit::TestCase
41
70
  })
42
71
  When render_file_url_code_block
43
72
  Then {
44
- assert_equal %{<pre><code class="language-html">&lt;!DOCTYPE html&gt;
73
+ assert_equal %{<article class='code-listing'><pre><code class="language-html">&lt;!DOCTYPE html&gt;
45
74
  &lt;html&gt;
46
75
  &lt;body&gt;
47
76
  &lt;h1&gt;HELLO!&lt;/h1&gt;
48
77
  &lt;h2&gt;&amp;amp; Goodbye&lt;/h2&gt;
49
78
  &lt;/body&gt;
50
79
  &lt;/html&gt;
51
- </code></pre>},@html
80
+ </code></pre><footer><h1>#{@relative_path}</h1></footer></article>},@html
52
81
  }
53
82
  end
54
83
 
@@ -56,7 +85,7 @@ class RendererTest < Test::Unit::TestCase
56
85
  Given a_git_repo_with_file("foo.rb")
57
86
  When {
58
87
  @code = -> {
59
- Bookingit::Renderer.new.block_code(@file_git_url,nil)
88
+ renderer.block_code(@file_git_url,nil)
60
89
  }
61
90
  }
62
91
  Then {
@@ -68,12 +97,12 @@ class RendererTest < Test::Unit::TestCase
68
97
  Given a_git_repo_with_two_verions_of_file("foo.rb")
69
98
  When {
70
99
  @parsed_versions = Hash[@versions.map { |sha1,_|
71
- [sha1, Bookingit::Renderer.new.block_code(@file_git_url + "##{sha1}",nil)]
100
+ [sha1, renderer.block_code(@file_git_url + "##{sha1}",nil)]
72
101
  }]
73
102
  }
74
103
  Then {
75
104
  @parsed_versions.each do |sha1,code|
76
- assert_equal %{<pre><code class="language-ruby">#{@versions[sha1]}\n</code></pre>},code,"For SHA: #{sha1}"
105
+ assert_equal %{<article class='code-listing'><pre><code class="language-ruby">#{@versions[sha1]}\n</code></pre><footer><h1>foo.rb</h1></footer></article>},code,"For SHA: #{sha1}"
77
106
  end
78
107
  }
79
108
  end
@@ -82,12 +111,12 @@ class RendererTest < Test::Unit::TestCase
82
111
  Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
83
112
  When {
84
113
  @parsed_versions = Hash[@versions.map { |tagname,_|
85
- [tagname, Bookingit::Renderer.new.block_code(@file_git_url + "##{tagname}",nil)]
114
+ [tagname, renderer.block_code(@file_git_url + "##{tagname}",nil)]
86
115
  }]
87
116
  }
88
117
  Then {
89
118
  @parsed_versions.each do |tagname,code|
90
- assert_equal %{<pre><code class="language-ruby">#{@versions[tagname]}\n</code></pre>},code,"For Tag: #{tagname}"
119
+ assert_equal %{<article class='code-listing'><pre><code class="language-ruby">#{@versions[tagname]}\n</code></pre><footer><h1>foo.rb</h1></footer></article>},code,"For Tag: #{tagname}"
91
120
  end
92
121
  }
93
122
  end
@@ -96,10 +125,25 @@ class RendererTest < Test::Unit::TestCase
96
125
  Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
97
126
  When {
98
127
  url = @file_git_url + "#" + @versions.keys[0] + ".." + @versions.keys[1]
99
- @html = Bookingit::Renderer.new.block_code(url,nil)
128
+ @html = renderer.block_code(url,nil)
129
+ }
130
+ Then {
131
+ assert_match /<article class=\'code-listing\'><pre><code class=\"language-diff\">diff --git/,@html
132
+ assert_match /a\/foo.rb b\/foo.rb/,@html
133
+ assert_match /index [a-z0-9]+..[a-z0-9]+ 100644/,@html
134
+ assert_match /\-\-\- a\/foo.rb/,@html
135
+ assert_match /\+\+\+ b\/foo.rb/,@html
136
+ }
137
+ end
138
+
139
+ test_that "a git url with a compact diff spec shows the diff, too" do
140
+ Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
141
+ When {
142
+ url = @file_git_url + "#.." + @versions.keys[1]
143
+ @html = renderer.block_code(url,nil)
100
144
  }
101
145
  Then {
102
- assert_match /<pre><code class=\"language-diff\">diff --git/,@html
146
+ assert_match /<article class=\'code-listing\'><pre><code class=\"language-diff\">diff --git/,@html
103
147
  assert_match /a\/foo.rb b\/foo.rb/,@html
104
148
  assert_match /index [a-z0-9]+..[a-z0-9]+ 100644/,@html
105
149
  assert_match /\-\-\- a\/foo.rb/,@html
@@ -107,6 +151,44 @@ class RendererTest < Test::Unit::TestCase
107
151
  }
108
152
  end
109
153
 
154
+ test_that "a git url with a shell command runs that command on that version of the repo" do
155
+ Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
156
+ When {
157
+ @version = @versions.keys[0]
158
+ git_url = @file_git_url.gsub(/\/foo.rb/,'/')
159
+ @html = renderer.block_code("#{git_url}##{@version}!cat foo.rb",nil)
160
+ }
161
+ Then {
162
+ assert_equal %{<article class='code-listing'><pre><code class="language-shell">&gt; cat foo.rb\n#{@versions[@version]}\n</code></pre></article>},@html
163
+ }
164
+ end
165
+
166
+ test_that "a git url with a shell command that exits nonzero raises an error" do
167
+ Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
168
+ When {
169
+ @version = @versions.keys[0]
170
+ git_url = @file_git_url.gsub(/\/foo.rb/,'/')
171
+ @executable = -> {
172
+ renderer.block_code("#{git_url}##{@version}!cat blah.rb",nil)
173
+ }
174
+ }
175
+ Then {
176
+ assert_raise Bookingit::UnexpectedShellCommandExit,&@executable
177
+ }
178
+ end
179
+
180
+ test_that "a git url with a shell command that exits nonzero doesn't raise an error if we indicate as such" do
181
+ Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
182
+ When {
183
+ @version = @versions.keys[0]
184
+ git_url = @file_git_url.gsub(/\/foo.rb/,'/')
185
+ @html = renderer.block_code("#{git_url}##{@version}!cat blah.rb!nonzero",nil)
186
+ }
187
+ Then {
188
+ refute_nil @html
189
+ }
190
+ end
191
+
110
192
  test_that "an sh url will run the given command and put the contents into the output" do
111
193
  Given {
112
194
  chdir @tempdir do
@@ -119,32 +201,88 @@ class RendererTest < Test::Unit::TestCase
119
201
  end
120
202
  }
121
203
  When {
122
- @html = Bookingit::Renderer.new.block_code("sh://#{@tempdir}/play#ls -1",nil)
204
+ @html = renderer.block_code("sh://play#ls -1",nil)
123
205
  }
124
206
  Then {
125
- assert_equal %{<pre><code class="language-shell">&gt; ls -1
207
+ assert_equal %{<article class='code-listing'><pre><code class="language-shell">&gt; ls -1
126
208
  bar
127
209
  blah
128
210
  quux
129
- </code></pre>},@html
211
+ </code></pre></article>},@html
212
+ }
213
+ end
214
+
215
+ test_that "an sh url that exits nonzero will raise" do
216
+ Given {
217
+ chdir @tempdir do
218
+ mkdir "play"
219
+ chdir "play" do
220
+ system "touch blah"
221
+ system "touch bar"
222
+ system "touch quux"
223
+ end
224
+ end
225
+ }
226
+ When {
227
+ @executable = -> { renderer.block_code("sh://play#cat bleorgh",nil) }
228
+ }
229
+ Then {
230
+ assert_raise Bookingit::UnexpectedShellCommandExit, &@executable
231
+ }
232
+ end
233
+
234
+ test_that "an sh url that exits nonzero but we expect it to will not raise" do
235
+ Given {
236
+ chdir @tempdir do
237
+ mkdir "play"
238
+ chdir "play" do
239
+ system "touch blah"
240
+ system "touch bar"
241
+ system "touch quux"
242
+ end
243
+ end
244
+ }
245
+ When {
246
+ @html = renderer.block_code("sh://play#cat bleorgh!nonzero",nil)
247
+ }
248
+ Then {
249
+ refute_nil @html
130
250
  }
131
251
  end
132
252
 
133
253
  test_that "we pass through inline code blocks" do
134
254
  When {
135
- @html = Bookingit::Renderer.new.block_code("class Foo", 'coffeescript')
255
+ @html = renderer.block_code("class Foo", 'coffeescript')
136
256
  }
137
257
  Then {
138
- assert_equal %{<pre><code class="language-coffeescript">class Foo</code></pre>},@html
258
+ assert_equal %{<article class='code-listing'><pre><code class="language-coffeescript">class Foo</code></pre></article>},@html
139
259
  }
140
260
  end
141
261
 
142
262
  test_that "we omit the language class if it's not provided in inline code" do
143
263
  When {
144
- @html = Bookingit::Renderer.new.block_code("class Foo", nil)
264
+ @html = renderer.block_code("class Foo", nil)
265
+ }
266
+ Then {
267
+ assert_equal %{<article class='code-listing'><pre><code class="">class Foo</code></pre></article>},@html
268
+ }
269
+ end
270
+
271
+ test_that "we can cache results between calls" do
272
+ Given a_git_repo_with_two_tagged_verions_of_file("foo.rb")
273
+ And {
274
+ @cachedir = File.join(@tempdir,'cache')
275
+ @renderer = renderer(cache: @cachedir)
276
+ @version = @versions.keys[0]
277
+ @url = "#{@file_git_url.gsub(/\/foo.rb/,'/')}##{@version}!cat foo.rb"
278
+ @html = @renderer.block_code(@url,nil)
279
+ }
280
+ When {
281
+ @html2 = @renderer.block_code(@url,nil)
145
282
  }
146
283
  Then {
147
- assert_equal %{<pre><code>class Foo</code></pre>},@html
284
+ assert_equal %{<article class='code-listing'><pre><code class="language-shell">&gt; cat foo.rb\n#{@versions[@version]}\n</code></pre></article>},@html
285
+ assert_equal @html,@html2
148
286
  }
149
287
  end
150
288
 
@@ -179,7 +317,7 @@ end}
179
317
  create_and_commit_file(file,code)
180
318
  # make sure test doesn't get the HEAD version
181
319
  end
182
- @file_git_url = "git://#{File.join(@tempdir,'git_repo.git')}/#{file}"
320
+ @file_git_url = "git://git_repo.git/#{file}"
183
321
  }
184
322
  end
185
323
 
@@ -207,7 +345,7 @@ end}
207
345
  create_and_commit_file(file,code)
208
346
  # make sure test doesn't get the HEAD version
209
347
  end
210
- @file_git_url = "git://#{File.join(@tempdir,'git_repo.git')}/#{file}"
348
+ @file_git_url = "git://git_repo.git/#{file}"
211
349
  }
212
350
  end
213
351
 
@@ -232,13 +370,24 @@ end}
232
370
  end}
233
371
  create_and_commit_file(file,@code)
234
372
  end
235
- @file_git_url = "git://#{File.join(@tempdir,'git_repo.git')}/#{file}"
373
+ @file_git_url = "git://git_repo.git/#{file}"
374
+ }
375
+ end
376
+
377
+ def render_file_url_code_block(options={})
378
+ -> {
379
+ @html = renderer(options).block_code("file://#{@path.gsub(/#{Regexp.escape(@tempdir)}\/?/,'')}",nil)
236
380
  }
237
381
  end
238
382
 
239
- def render_file_url_code_block
383
+ def a_file_named(filename)
240
384
  -> {
241
- @html = Bookingit::Renderer.new.block_code("file://#{@path}",nil)
385
+ @code = %{#{any_string}
386
+ }
387
+ @path = File.join(@tempdir,filename)
388
+ File.open(@path,'w') do |file|
389
+ file.puts @code
390
+ end
242
391
  }
243
392
  end
244
393
 
@@ -246,6 +395,7 @@ end}
246
395
  -> {
247
396
  file = Tempfile.new(['foo',extension])
248
397
  @path = file.path
398
+ @relative_path = @path.gsub(Regexp.escape(@tempdir),'')
249
399
  @code = contents
250
400
  File.open(@path,'w') do |file|
251
401
  file.puts @code