nanoc 3.4.3 → 3.5.0b1
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.
- data/CONTRIBUTING.md +25 -0
 - data/Gemfile +3 -1
 - data/Gemfile.lock +22 -13
 - data/NEWS.md +27 -0
 - data/README.md +3 -1
 - data/lib/nanoc.rb +2 -2
 - data/lib/nanoc/base/compilation/compiler_dsl.rb +19 -0
 - data/lib/nanoc/base/core_ext/array.rb +18 -8
 - data/lib/nanoc/base/core_ext/hash.rb +18 -8
 - data/lib/nanoc/base/core_ext/pathname.rb +2 -8
 - data/lib/nanoc/base/plugin_registry.rb +57 -19
 - data/lib/nanoc/base/result_data/item_rep.rb +3 -15
 - data/lib/nanoc/base/source_data/item.rb +1 -1
 - data/lib/nanoc/base/source_data/layout.rb +1 -1
 - data/lib/nanoc/base/source_data/site.rb +15 -19
 - data/lib/nanoc/cli.rb +28 -23
 - data/lib/nanoc/cli/command_runner.rb +4 -0
 - data/lib/nanoc/cli/commands/autocompile.rb +15 -6
 - data/lib/nanoc/cli/commands/check.rb +47 -0
 - data/lib/nanoc/cli/commands/compile.rb +271 -195
 - data/lib/nanoc/cli/commands/create-site.rb +5 -5
 - data/lib/nanoc/cli/commands/deploy.rb +16 -4
 - data/lib/nanoc/cli/commands/prune.rb +3 -3
 - data/lib/nanoc/cli/commands/show-data.rb +73 -58
 - data/lib/nanoc/cli/commands/show-rules.rb +1 -1
 - data/lib/nanoc/cli/commands/validate-css.rb +2 -3
 - data/lib/nanoc/cli/commands/validate-html.rb +2 -3
 - data/lib/nanoc/cli/commands/validate-links.rb +5 -11
 - data/lib/nanoc/cli/commands/view.rb +1 -1
 - data/lib/nanoc/cli/commands/watch.rb +38 -20
 - data/lib/nanoc/cli/error_handler.rb +122 -122
 - data/lib/nanoc/data_sources.rb +2 -0
 - data/lib/nanoc/data_sources/filesystem_unified.rb +1 -1
 - data/lib/nanoc/data_sources/filesystem_verbose.rb +1 -1
 - data/lib/nanoc/data_sources/static.rb +60 -0
 - data/lib/nanoc/extra.rb +2 -0
 - data/lib/nanoc/extra/checking.rb +16 -0
 - data/lib/nanoc/extra/checking/check.rb +33 -0
 - data/lib/nanoc/extra/checking/checks.rb +19 -0
 - data/lib/nanoc/extra/checking/checks/css.rb +23 -0
 - data/lib/nanoc/extra/checking/checks/external_links.rb +149 -0
 - data/lib/nanoc/extra/checking/checks/html.rb +24 -0
 - data/lib/nanoc/extra/checking/checks/internal_links.rb +57 -0
 - data/lib/nanoc/extra/checking/checks/stale.rb +23 -0
 - data/lib/nanoc/extra/checking/dsl.rb +31 -0
 - data/lib/nanoc/extra/checking/issue.rb +19 -0
 - data/lib/nanoc/extra/checking/runner.rb +130 -0
 - data/lib/nanoc/extra/link_collector.rb +57 -0
 - data/lib/nanoc/extra/pruner.rb +1 -1
 - data/lib/nanoc/extra/validators/links.rb +5 -262
 - data/lib/nanoc/extra/validators/w3c.rb +8 -76
 - data/lib/nanoc/filters/colorize_syntax.rb +1 -1
 - data/lib/nanoc/filters/handlebars.rb +2 -2
 - data/lib/nanoc/filters/less.rb +1 -1
 - data/lib/nanoc/filters/redcarpet.rb +1 -1
 - data/lib/nanoc/filters/rubypants.rb +1 -1
 - data/lib/nanoc/filters/slim.rb +1 -1
 - data/lib/nanoc/helpers/blogging.rb +163 -104
 - data/lib/nanoc/helpers/xml_sitemap.rb +9 -3
 - data/tasks/doc.rake +2 -1
 - data/test/base/core_ext/array_spec.rb +4 -4
 - data/test/base/core_ext/hash_spec.rb +7 -7
 - data/test/base/core_ext/pathname_spec.rb +12 -2
 - data/test/base/test_compiler_dsl.rb +24 -0
 - data/test/base/test_item_rep.rb +58 -26
 - data/test/cli/commands/test_watch.rb +0 -8
 - data/test/data_sources/test_static.rb +66 -0
 - data/test/extra/checking/checks/test_css.rb +40 -0
 - data/test/extra/checking/checks/test_external_links.rb +76 -0
 - data/test/extra/checking/checks/test_html.rb +40 -0
 - data/test/extra/checking/checks/test_internal_links.rb +46 -0
 - data/test/extra/checking/checks/test_stale.rb +49 -0
 - data/test/extra/checking/test_check.rb +16 -0
 - data/test/extra/checking/test_dsl.rb +20 -0
 - data/test/extra/checking/test_runner.rb +15 -0
 - data/test/extra/test_link_collector.rb +93 -0
 - data/test/extra/validators/test_links.rb +0 -64
 - data/test/extra/validators/test_w3c.rb +20 -26
 - data/test/filters/test_colorize_syntax.rb +15 -0
 - data/test/filters/test_less.rb +14 -0
 - data/test/filters/test_pandoc.rb +5 -1
 - data/test/helpers/test_blogging.rb +52 -8
 - data/test/helpers/test_xml_sitemap.rb +68 -0
 - data/test/test_gem.rb +1 -1
 - metadata +31 -6
 
| 
         @@ -35,12 +35,16 @@ module Nanoc::Helpers 
     | 
|
| 
       35 
35 
     | 
    
         
             
                #
         
     | 
| 
       36 
36 
     | 
    
         
             
                # @option params [Array] :items A list of items to include in the sitemap
         
     | 
| 
       37 
37 
     | 
    
         
             
                #
         
     | 
| 
      
 38 
     | 
    
         
            +
                # @option params [Proc] :rep_select A proc to filter reps through. If the
         
     | 
| 
      
 39 
     | 
    
         
            +
                #   proc returns true, the rep will be included; otherwise, it will not.
         
     | 
| 
      
 40 
     | 
    
         
            +
                #
         
     | 
| 
       38 
41 
     | 
    
         
             
                # @return [String] The XML sitemap
         
     | 
| 
       39 
42 
     | 
    
         
             
                def xml_sitemap(params={})
         
     | 
| 
       40 
43 
     | 
    
         
             
                  require 'builder'
         
     | 
| 
       41 
44 
     | 
    
         | 
| 
       42 
45 
     | 
    
         
             
                  # Extract parameters
         
     | 
| 
       43 
     | 
    
         
            -
                  items 
     | 
| 
      
 46 
     | 
    
         
            +
                  items       = params.fetch(:items) { @items.reject { |i| i[:is_hidden] } }
         
     | 
| 
      
 47 
     | 
    
         
            +
                  select_proc = params.fetch(:rep_select, nil)
         
     | 
| 
       44 
48 
     | 
    
         | 
| 
       45 
49 
     | 
    
         
             
                  # Create builder
         
     | 
| 
       46 
50 
     | 
    
         
             
                  buffer = ''
         
     | 
| 
         @@ -55,8 +59,10 @@ module Nanoc::Helpers 
     | 
|
| 
       55 
59 
     | 
    
         
             
                  xml.instruct!
         
     | 
| 
       56 
60 
     | 
    
         
             
                  xml.urlset(:xmlns => 'http://www.sitemaps.org/schemas/sitemap/0.9') do
         
     | 
| 
       57 
61 
     | 
    
         
             
                    # Add item
         
     | 
| 
       58 
     | 
    
         
            -
                    items.each do |item|
         
     | 
| 
       59 
     | 
    
         
            -
                      item.reps.reject { |r| r.raw_path.nil? } 
     | 
| 
      
 62 
     | 
    
         
            +
                    items.sort_by { |i| i.identifier }.each do |item|
         
     | 
| 
      
 63 
     | 
    
         
            +
                      reps = item.reps.reject { |r| r.raw_path.nil? }
         
     | 
| 
      
 64 
     | 
    
         
            +
                      reps.reject! { |r| !select_proc[r] } if select_proc
         
     | 
| 
      
 65 
     | 
    
         
            +
                      reps.sort_by { |r| r.name.to_s }.each do |rep|
         
     | 
| 
       60 
66 
     | 
    
         
             
                        xml.url do
         
     | 
| 
       61 
67 
     | 
    
         
             
                          xml.loc         @site.config[:base_url] + rep.path
         
     | 
| 
       62 
68 
     | 
    
         
             
                          xml.lastmod     item[:mtime].to_iso8601_date unless item[:mtime].nil?
         
     | 
    
        data/tasks/doc.rake
    CHANGED
    
    | 
         @@ -11,6 +11,7 @@ YARD::Rake::YardocTask.new(:doc) do |yard| 
     | 
|
| 
       11 
11 
     | 
    
         
             
                '--readme',          'README.md',
         
     | 
| 
       12 
12 
     | 
    
         
             
                '--files',           'NEWS.md,LICENSE',
         
     | 
| 
       13 
13 
     | 
    
         
             
                '--output-dir',      'doc/yardoc',
         
     | 
| 
       14 
     | 
    
         
            -
                '--template-path',   'doc/yardoc_templates'
         
     | 
| 
      
 14 
     | 
    
         
            +
                '--template-path',   'doc/yardoc_templates',
         
     | 
| 
      
 15 
     | 
    
         
            +
                '--load',            'doc/yardoc_handlers/identifier.rb'
         
     | 
| 
       15 
16 
     | 
    
         
             
              ]
         
     | 
| 
       16 
17 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,21 +1,21 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: utf-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            describe 'Array# 
     | 
| 
      
 3 
     | 
    
         
            +
            describe 'Array#symbolize_keys_recursively' do
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              it 'should convert keys to symbols' do
         
     | 
| 
       6 
6 
     | 
    
         
             
                array_old = [ :abc, 'xyz', { 'foo' => 'bar', :baz => :qux } ]
         
     | 
| 
       7 
7 
     | 
    
         
             
                array_new = [ :abc, 'xyz', { :foo  => 'bar', :baz => :qux } ]
         
     | 
| 
       8 
     | 
    
         
            -
                array_old. 
     | 
| 
      
 8 
     | 
    
         
            +
                array_old.symbolize_keys_recursively.must_equal array_new
         
     | 
| 
       9 
9 
     | 
    
         
             
              end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
            describe 'Array# 
     | 
| 
      
 13 
     | 
    
         
            +
            describe 'Array#stringify_keys_recursively' do
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
              it 'should convert keys to strings' do
         
     | 
| 
       16 
16 
     | 
    
         
             
                array_old = [ :abc, 'xyz', { :foo  => 'bar', 'baz' => :qux } ]
         
     | 
| 
       17 
17 
     | 
    
         
             
                array_new = [ :abc, 'xyz', { 'foo' => 'bar', 'baz' => :qux } ]
         
     | 
| 
       18 
     | 
    
         
            -
                array_old. 
     | 
| 
      
 18 
     | 
    
         
            +
                array_old.stringify_keys_recursively.must_equal array_new
         
     | 
| 
       19 
19 
     | 
    
         
             
              end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,39 +1,39 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # encoding: utf-8
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            describe 'Hash# 
     | 
| 
      
 3 
     | 
    
         
            +
            describe 'Hash#symbolize_keys_recursively' do
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              it 'should convert keys to symbols' do
         
     | 
| 
       6 
6 
     | 
    
         
             
                hash_old = { 'foo' => 'bar' }
         
     | 
| 
       7 
7 
     | 
    
         
             
                hash_new = { :foo  => 'bar' }
         
     | 
| 
       8 
     | 
    
         
            -
                hash_old. 
     | 
| 
      
 8 
     | 
    
         
            +
                hash_old.symbolize_keys_recursively.must_equal hash_new
         
     | 
| 
       9 
9 
     | 
    
         
             
              end
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
            end
         
     | 
| 
       12 
12 
     | 
    
         | 
| 
       13 
     | 
    
         
            -
            describe 'Hash# 
     | 
| 
      
 13 
     | 
    
         
            +
            describe 'Hash#stringify_keys_recursively' do
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
              it 'should leave strings as strings' do
         
     | 
| 
       16 
16 
     | 
    
         
             
                hash_old = { 'foo' => 'bar' }
         
     | 
| 
       17 
17 
     | 
    
         
             
                hash_new = { 'foo' => 'bar' }
         
     | 
| 
       18 
     | 
    
         
            -
                hash_old. 
     | 
| 
      
 18 
     | 
    
         
            +
                hash_old.stringify_keys_recursively.must_equal hash_new
         
     | 
| 
       19 
19 
     | 
    
         
             
              end
         
     | 
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
              it 'should convert symbols to strings' do
         
     | 
| 
       22 
22 
     | 
    
         
             
                hash_old = { :foo  => 'bar' }
         
     | 
| 
       23 
23 
     | 
    
         
             
                hash_new = { 'foo' => 'bar' }
         
     | 
| 
       24 
     | 
    
         
            -
                hash_old. 
     | 
| 
      
 24 
     | 
    
         
            +
                hash_old.stringify_keys_recursively.must_equal hash_new
         
     | 
| 
       25 
25 
     | 
    
         
             
              end
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
              it 'should convert integers to strings' do
         
     | 
| 
       28 
28 
     | 
    
         
             
                hash_old = { 123   => 'bar' }
         
     | 
| 
       29 
29 
     | 
    
         
             
                hash_new = { '123' => 'bar' }
         
     | 
| 
       30 
     | 
    
         
            -
                hash_old. 
     | 
| 
      
 30 
     | 
    
         
            +
                hash_old.stringify_keys_recursively.must_equal hash_new
         
     | 
| 
       31 
31 
     | 
    
         
             
              end
         
     | 
| 
       32 
32 
     | 
    
         | 
| 
       33 
33 
     | 
    
         
             
              it 'should convert nil to an empty string' do
         
     | 
| 
       34 
34 
     | 
    
         
             
                hash_old = { nil => 'bar' }
         
     | 
| 
       35 
35 
     | 
    
         
             
                hash_new = { ''  => 'bar' }
         
     | 
| 
       36 
     | 
    
         
            -
                hash_old. 
     | 
| 
      
 36 
     | 
    
         
            +
                hash_old.stringify_keys_recursively.must_equal hash_new
         
     | 
| 
       37 
37 
     | 
    
         
             
              end
         
     | 
| 
       38 
38 
     | 
    
         | 
| 
       39 
39 
     | 
    
         
             
            end
         
     | 
| 
         @@ -4,10 +4,15 @@ describe 'Pathname#checksum' do 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              it 'should work on empty files' do
         
     | 
| 
       6 
6 
     | 
    
         
             
                begin
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # Create file
         
     | 
| 
       7 
8 
     | 
    
         
             
                  FileUtils.mkdir_p('tmp')
         
     | 
| 
       8 
9 
     | 
    
         
             
                  File.open('tmp/myfile', 'w') { |io| io.write('') }
         
     | 
| 
      
 10 
     | 
    
         
            +
                  now = Time.now
         
     | 
| 
      
 11 
     | 
    
         
            +
                  File.utime(now, now, 'tmp/myfile')
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                  # Create checksum
         
     | 
| 
       9 
14 
     | 
    
         
             
                  pathname = Pathname.new('tmp/myfile')
         
     | 
| 
       10 
     | 
    
         
            -
                  pathname.checksum.must_equal ' 
     | 
| 
      
 15 
     | 
    
         
            +
                  pathname.checksum.must_equal '0-' + now.to_s
         
     | 
| 
       11 
16 
     | 
    
         
             
                ensure
         
     | 
| 
       12 
17 
     | 
    
         
             
                  FileUtils.rm_rf('tmp')
         
     | 
| 
       13 
18 
     | 
    
         
             
                end
         
     | 
| 
         @@ -15,10 +20,15 @@ describe 'Pathname#checksum' do 
     | 
|
| 
       15 
20 
     | 
    
         | 
| 
       16 
21 
     | 
    
         
             
              it 'should work on all files' do
         
     | 
| 
       17 
22 
     | 
    
         
             
                begin
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # Create file
         
     | 
| 
       18 
24 
     | 
    
         
             
                  FileUtils.mkdir_p('tmp')
         
     | 
| 
       19 
25 
     | 
    
         
             
                  File.open('tmp/myfile', 'w') { |io| io.write('abc') }
         
     | 
| 
      
 26 
     | 
    
         
            +
                  now = Time.now
         
     | 
| 
      
 27 
     | 
    
         
            +
                  File.utime(now, now, 'tmp/myfile')
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  # Create checksum
         
     | 
| 
       20 
30 
     | 
    
         
             
                  pathname = Pathname.new('tmp/myfile')
         
     | 
| 
       21 
     | 
    
         
            -
                  pathname.checksum.must_equal ' 
     | 
| 
      
 31 
     | 
    
         
            +
                  pathname.checksum.must_equal '3-' + now.to_s
         
     | 
| 
       22 
32 
     | 
    
         
             
                ensure
         
     | 
| 
       23 
33 
     | 
    
         
             
                  FileUtils.rm_rf('tmp')
         
     | 
| 
       24 
34 
     | 
    
         
             
                end
         
     | 
| 
         @@ -16,6 +16,30 @@ class Nanoc::CompilerDSLTest < MiniTest::Unit::TestCase 
     | 
|
| 
       16 
16 
     | 
    
         
             
                # TODO implement
         
     | 
| 
       17 
17 
     | 
    
         
             
              end
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
      
 19 
     | 
    
         
            +
              def test_include_rules
         
     | 
| 
      
 20 
     | 
    
         
            +
                # Create site
         
     | 
| 
      
 21 
     | 
    
         
            +
                Nanoc::CLI.run %w( create_site with_bonus_rules )
         
     | 
| 
      
 22 
     | 
    
         
            +
                FileUtils.cd('with_bonus_rules') do
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # Create rep
         
     | 
| 
      
 24 
     | 
    
         
            +
                  item = Nanoc::Item.new('foo', { :extension => 'bar' }, '/foo/')
         
     | 
| 
      
 25 
     | 
    
         
            +
                  rep  = Nanoc::ItemRep.new(item, :default)
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  # Create a bonus rules file
         
     | 
| 
      
 28 
     | 
    
         
            +
                  File.open('more_rules.rb', 'w') { |io| io.write "passthrough '/foo/'" }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  # Create other necessary stuff
         
     | 
| 
      
 31 
     | 
    
         
            +
                  site = Nanoc::Site.new('.')
         
     | 
| 
      
 32 
     | 
    
         
            +
                  site.items << item
         
     | 
| 
      
 33 
     | 
    
         
            +
                  dsl = site.compiler.rules_collection.dsl
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  # Include rules
         
     | 
| 
      
 36 
     | 
    
         
            +
                  dsl.include_rules 'more_rules'
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  # Check that the rule made it into the collection
         
     | 
| 
      
 39 
     | 
    
         
            +
                  refute_nil site.compiler.rules_collection.routing_rule_for(rep)
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
       19 
43 
     | 
    
         
             
              def test_passthrough
         
     | 
| 
       20 
44 
     | 
    
         
             
                with_site do
         
     | 
| 
       21 
45 
     | 
    
         
             
                  # Create rules
         
     | 
    
        data/test/base/test_item_rep.rb
    CHANGED
    
    | 
         @@ -221,32 +221,6 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase 
     | 
|
| 
       221 
221 
     | 
    
         
             
                assert_equal a_long_time_ago.to_s, File.mtime(item_rep.raw_path).to_s
         
     | 
| 
       222 
222 
     | 
    
         
             
              end
         
     | 
| 
       223 
223 
     | 
    
         | 
| 
       224 
     | 
    
         
            -
              def test_write_should_not_touch_identical_binary_files
         
     | 
| 
       225 
     | 
    
         
            -
                # Create temporary source file
         
     | 
| 
       226 
     | 
    
         
            -
                File.open('blahblah', 'w') { |io| io.write("Blah blah…") }
         
     | 
| 
       227 
     | 
    
         
            -
                full_file_path = File.expand_path('blahblah')
         
     | 
| 
       228 
     | 
    
         
            -
             
     | 
| 
       229 
     | 
    
         
            -
                # Mock item
         
     | 
| 
       230 
     | 
    
         
            -
                item = Nanoc::Item.new(
         
     | 
| 
       231 
     | 
    
         
            -
                  full_file_path, {}, '/',
         
     | 
| 
       232 
     | 
    
         
            -
                  :binary => true
         
     | 
| 
       233 
     | 
    
         
            -
                )
         
     | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
       235 
     | 
    
         
            -
                # Create rep
         
     | 
| 
       236 
     | 
    
         
            -
                item_rep = Nanoc::ItemRep.new(item, :foo)
         
     | 
| 
       237 
     | 
    
         
            -
                item_rep.raw_path = 'foo/bar/baz/quux'
         
     | 
| 
       238 
     | 
    
         
            -
             
     | 
| 
       239 
     | 
    
         
            -
                # Write once
         
     | 
| 
       240 
     | 
    
         
            -
                item_rep.write
         
     | 
| 
       241 
     | 
    
         
            -
                a_long_time_ago = Time.now-1_000_000
         
     | 
| 
       242 
     | 
    
         
            -
                File.utime(a_long_time_ago, a_long_time_ago, item_rep.raw_path)
         
     | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
       244 
     | 
    
         
            -
                # Write again
         
     | 
| 
       245 
     | 
    
         
            -
                assert_equal a_long_time_ago.to_s, File.mtime(item_rep.raw_path).to_s
         
     | 
| 
       246 
     | 
    
         
            -
                item_rep.write
         
     | 
| 
       247 
     | 
    
         
            -
                assert_equal a_long_time_ago.to_s, File.mtime(item_rep.raw_path).to_s
         
     | 
| 
       248 
     | 
    
         
            -
              end
         
     | 
| 
       249 
     | 
    
         
            -
             
     | 
| 
       250 
224 
     | 
    
         
             
              def test_write
         
     | 
| 
       251 
225 
     | 
    
         
             
                # Mock item
         
     | 
| 
       252 
226 
     | 
    
         
             
                item = Nanoc::Item.new(
         
     | 
| 
         @@ -536,6 +510,64 @@ class Nanoc::ItemRepTest < MiniTest::Unit::TestCase 
     | 
|
| 
       536 
510 
     | 
    
         
             
                end
         
     | 
| 
       537 
511 
     | 
    
         
             
              end
         
     | 
| 
       538 
512 
     | 
    
         | 
| 
      
 513 
     | 
    
         
            +
              def test_write_should_calculate_is_modified_correctly_for_binary_items_new
         
     | 
| 
      
 514 
     | 
    
         
            +
                # Mock item
         
     | 
| 
      
 515 
     | 
    
         
            +
                FileUtils.mkdir_p('content')
         
     | 
| 
      
 516 
     | 
    
         
            +
                File.open('content/meow.dat', 'w') { |io| io.write('asdf') }
         
     | 
| 
      
 517 
     | 
    
         
            +
                item = Nanoc::Item.new(
         
     | 
| 
      
 518 
     | 
    
         
            +
                  "content/meow.dat", {}, '/',
         
     | 
| 
      
 519 
     | 
    
         
            +
                  :binary => true
         
     | 
| 
      
 520 
     | 
    
         
            +
                )
         
     | 
| 
      
 521 
     | 
    
         
            +
             
     | 
| 
      
 522 
     | 
    
         
            +
                # Create rep
         
     | 
| 
      
 523 
     | 
    
         
            +
                item_rep = Nanoc::ItemRep.new(item, :foo)
         
     | 
| 
      
 524 
     | 
    
         
            +
                FileUtils.mkdir_p('tmp')
         
     | 
| 
      
 525 
     | 
    
         
            +
                File.open('tmp/woof.dat', 'w') { |io| io.write('fdsa') }
         
     | 
| 
      
 526 
     | 
    
         
            +
                item_rep.instance_eval { @temporary_filenames[:last] = 'tmp/woof.dat' }
         
     | 
| 
      
 527 
     | 
    
         
            +
                item_rep.raw_path = 'output/woof.dat'
         
     | 
| 
      
 528 
     | 
    
         
            +
             
     | 
| 
      
 529 
     | 
    
         
            +
                # Write
         
     | 
| 
      
 530 
     | 
    
         
            +
                notified = false
         
     | 
| 
      
 531 
     | 
    
         
            +
                Nanoc::NotificationCenter.on(:rep_written, self) do |rep, raw_path, is_created, is_modified|
         
     | 
| 
      
 532 
     | 
    
         
            +
                  notified = true
         
     | 
| 
      
 533 
     | 
    
         
            +
                  assert is_created
         
     | 
| 
      
 534 
     | 
    
         
            +
                  assert is_modified
         
     | 
| 
      
 535 
     | 
    
         
            +
                end
         
     | 
| 
      
 536 
     | 
    
         
            +
                item_rep.write
         
     | 
| 
      
 537 
     | 
    
         
            +
                assert notified
         
     | 
| 
      
 538 
     | 
    
         
            +
                Nanoc::NotificationCenter.remove(:rep_written, self)
         
     | 
| 
      
 539 
     | 
    
         
            +
              end
         
     | 
| 
      
 540 
     | 
    
         
            +
             
     | 
| 
      
 541 
     | 
    
         
            +
              def test_write_should_calculate_is_modified_correctly_for_binary_items_existing
         
     | 
| 
      
 542 
     | 
    
         
            +
                # Mock item
         
     | 
| 
      
 543 
     | 
    
         
            +
                FileUtils.mkdir_p('content')
         
     | 
| 
      
 544 
     | 
    
         
            +
                File.open('content/meow.dat', 'w') { |io| io.write('asdf') }
         
     | 
| 
      
 545 
     | 
    
         
            +
                item = Nanoc::Item.new(
         
     | 
| 
      
 546 
     | 
    
         
            +
                  "content/meow.dat", {}, '/',
         
     | 
| 
      
 547 
     | 
    
         
            +
                  :binary => true
         
     | 
| 
      
 548 
     | 
    
         
            +
                )
         
     | 
| 
      
 549 
     | 
    
         
            +
             
     | 
| 
      
 550 
     | 
    
         
            +
                # Create rep
         
     | 
| 
      
 551 
     | 
    
         
            +
                item_rep = Nanoc::ItemRep.new(item, :foo)
         
     | 
| 
      
 552 
     | 
    
         
            +
                FileUtils.mkdir_p('tmp')
         
     | 
| 
      
 553 
     | 
    
         
            +
                File.open('tmp/woof.dat', 'w') { |io| io.write('fdsa') }
         
     | 
| 
      
 554 
     | 
    
         
            +
                FileUtils.mkdir_p('output')
         
     | 
| 
      
 555 
     | 
    
         
            +
                File.open('output/woof.dat', 'w') { |io| io.write('fdsa but different') }
         
     | 
| 
      
 556 
     | 
    
         
            +
                item_rep.instance_eval { @temporary_filenames[:last] = 'tmp/woof.dat' }
         
     | 
| 
      
 557 
     | 
    
         
            +
                item_rep.raw_path = 'output/woof.dat'
         
     | 
| 
      
 558 
     | 
    
         
            +
             
     | 
| 
      
 559 
     | 
    
         
            +
                # Write
         
     | 
| 
      
 560 
     | 
    
         
            +
                notified = false
         
     | 
| 
      
 561 
     | 
    
         
            +
                Nanoc::NotificationCenter.on(:rep_written, self) do |rep, raw_path, is_created, is_modified|
         
     | 
| 
      
 562 
     | 
    
         
            +
                  notified = true
         
     | 
| 
      
 563 
     | 
    
         
            +
                  refute is_created
         
     | 
| 
      
 564 
     | 
    
         
            +
                  assert is_modified
         
     | 
| 
      
 565 
     | 
    
         
            +
                end
         
     | 
| 
      
 566 
     | 
    
         
            +
                item_rep.write
         
     | 
| 
      
 567 
     | 
    
         
            +
                assert notified
         
     | 
| 
      
 568 
     | 
    
         
            +
                Nanoc::NotificationCenter.remove(:rep_written, self)
         
     | 
| 
      
 569 
     | 
    
         
            +
              end
         
     | 
| 
      
 570 
     | 
    
         
            +
             
     | 
| 
       539 
571 
     | 
    
         
             
            private
         
     | 
| 
       540 
572 
     | 
    
         | 
| 
       541 
573 
     | 
    
         
             
              def create_binary_item
         
     | 
| 
         @@ -4,14 +4,6 @@ class Nanoc::CLI::Commands::WatchTest < MiniTest::Unit::TestCase 
     | 
|
| 
       4 
4 
     | 
    
         | 
| 
       5 
5 
     | 
    
         
             
              include Nanoc::TestHelpers
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
              def setup
         
     | 
| 
       8 
     | 
    
         
            -
                super
         
     | 
| 
       9 
     | 
    
         
            -
                @@warned ||= begin
         
     | 
| 
       10 
     | 
    
         
            -
                  STDERR.puts "\n(fssm deprecation warning can be ignored; master branch uses guard/listen)"
         
     | 
| 
       11 
     | 
    
         
            -
                  true
         
     | 
| 
       12 
     | 
    
         
            -
                end
         
     | 
| 
       13 
     | 
    
         
            -
              end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
7 
     | 
    
         
             
              def test_run
         
     | 
| 
       16 
8 
     | 
    
         
             
                with_site do |s|
         
     | 
| 
       17 
9 
     | 
    
         
             
                  watch_thread = Thread.new do
         
     | 
| 
         @@ -0,0 +1,66 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class Nanoc::DataSources::StaticTest < MiniTest::Unit::TestCase
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              include Nanoc::TestHelpers
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              def new_data_source(params=nil)
         
     | 
| 
      
 8 
     | 
    
         
            +
                # Mock site
         
     | 
| 
      
 9 
     | 
    
         
            +
                site = Nanoc::Site.new({})
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                # Create data source
         
     | 
| 
      
 12 
     | 
    
         
            +
                data_source = Nanoc::DataSources::Static.new(site, nil, nil, params)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                # Done
         
     | 
| 
      
 15 
     | 
    
         
            +
                data_source
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def test_items
         
     | 
| 
      
 19 
     | 
    
         
            +
                # Create data source
         
     | 
| 
      
 20 
     | 
    
         
            +
                data_source = new_data_source(:prefix => 'foo')
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                # Create sample files
         
     | 
| 
      
 23 
     | 
    
         
            +
                FileUtils.mkdir_p('foo')
         
     | 
| 
      
 24 
     | 
    
         
            +
                FileUtils.mkdir_p('foo/a/b')
         
     | 
| 
      
 25 
     | 
    
         
            +
                File.open('foo/bar.png',   'w') { |io| io.write("random binary data") }
         
     | 
| 
      
 26 
     | 
    
         
            +
                File.open('foo/b.c.css',   'w') { |io| io.write("more binary data") }
         
     | 
| 
      
 27 
     | 
    
         
            +
                File.open('foo/a/b/c.gif', 'w') { |io| io.write("yet more binary data") }
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                # Get expected and actual output
         
     | 
| 
      
 30 
     | 
    
         
            +
                expected_out = [
         
     | 
| 
      
 31 
     | 
    
         
            +
                  Nanoc::Item.new(
         
     | 
| 
      
 32 
     | 
    
         
            +
                    'foo/bar.png',
         
     | 
| 
      
 33 
     | 
    
         
            +
                    { :extension => 'png', :filename => 'foo/bar.png' },
         
     | 
| 
      
 34 
     | 
    
         
            +
                    '/bar.png/',
         
     | 
| 
      
 35 
     | 
    
         
            +
                    :binary => true,
         
     | 
| 
      
 36 
     | 
    
         
            +
                    :mtime => File.mtime('foo/bar.png'),
         
     | 
| 
      
 37 
     | 
    
         
            +
                    :checksum => Pathname.new('foo/bar.png').checksum
         
     | 
| 
      
 38 
     | 
    
         
            +
                  ),
         
     | 
| 
      
 39 
     | 
    
         
            +
                  Nanoc::Item.new(
         
     | 
| 
      
 40 
     | 
    
         
            +
                    'foo/b.c.css',
         
     | 
| 
      
 41 
     | 
    
         
            +
                    { :extension => 'css', :filename => 'foo/b.c.css' },
         
     | 
| 
      
 42 
     | 
    
         
            +
                    '/b.c.css/',
         
     | 
| 
      
 43 
     | 
    
         
            +
                    :binary => true,
         
     | 
| 
      
 44 
     | 
    
         
            +
                    :mtime => File.mtime('foo/b.c.css'),
         
     | 
| 
      
 45 
     | 
    
         
            +
                    :checksum => Pathname.new('foo/b.c.css').checksum
         
     | 
| 
      
 46 
     | 
    
         
            +
                  ),
         
     | 
| 
      
 47 
     | 
    
         
            +
                  Nanoc::Item.new(
         
     | 
| 
      
 48 
     | 
    
         
            +
                    'foo/a/b/c.gif',
         
     | 
| 
      
 49 
     | 
    
         
            +
                    { :extension => 'gif', :filename => 'foo/a/b/c.gif' },
         
     | 
| 
      
 50 
     | 
    
         
            +
                    '/a/b/c.gif/',
         
     | 
| 
      
 51 
     | 
    
         
            +
                    :binary => true,
         
     | 
| 
      
 52 
     | 
    
         
            +
                    :mtime => File.mtime('foo/a/b/c.gif'),
         
     | 
| 
      
 53 
     | 
    
         
            +
                    :checksum => Pathname.new('foo/a/b/c.gif').checksum
         
     | 
| 
      
 54 
     | 
    
         
            +
                  )
         
     | 
| 
      
 55 
     | 
    
         
            +
                ].sort_by { |i| i.identifier }
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                actual_out = data_source.send(:items).sort_by { |i| i.identifier }
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                (0..expected_out.size-1).each do |i|
         
     | 
| 
      
 60 
     | 
    
         
            +
                  assert_equal expected_out[i].raw_content, actual_out[i].raw_content, 'content must match'
         
     | 
| 
      
 61 
     | 
    
         
            +
                  assert_equal expected_out[i].identifier, actual_out[i].identifier, 'identifier must match'
         
     | 
| 
      
 62 
     | 
    
         
            +
                  assert_equal expected_out[i].mtime, actual_out[i].mtime, 'mtime must match'
         
     | 
| 
      
 63 
     | 
    
         
            +
                  assert_equal expected_out[i].raw_filename, actual_out[i].raw_filename, 'file paths must match'
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
              end
         
     | 
| 
      
 66 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class Nanoc::Extra::Checking::Checks::CSSTest < MiniTest::Unit::TestCase
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              include Nanoc::TestHelpers
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              def test_run_ok
         
     | 
| 
      
 8 
     | 
    
         
            +
                with_site do |site|
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # Create files
         
     | 
| 
      
 10 
     | 
    
         
            +
                  FileUtils.mkdir_p('output')
         
     | 
| 
      
 11 
     | 
    
         
            +
                  File.open('output/blah.html', 'w') { |io| io.write('<h1>Hi!</h1>') }
         
     | 
| 
      
 12 
     | 
    
         
            +
                  File.open('output/style.css', 'w') { |io| io.write('h1 { color: red; }') }
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  # Run check
         
     | 
| 
      
 15 
     | 
    
         
            +
                  check = Nanoc::Extra::Checking::Checks::CSS.new(site)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  check.run
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                  # Check
         
     | 
| 
      
 19 
     | 
    
         
            +
                  assert check.issues.empty?
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def test_run_error
         
     | 
| 
      
 24 
     | 
    
         
            +
                with_site do |site|
         
     | 
| 
      
 25 
     | 
    
         
            +
                  # Create files
         
     | 
| 
      
 26 
     | 
    
         
            +
                  FileUtils.mkdir_p('output')
         
     | 
| 
      
 27 
     | 
    
         
            +
                  File.open('output/blah.html', 'w') { |io| io.write('<h1>Hi!</h1>') }
         
     | 
| 
      
 28 
     | 
    
         
            +
                  File.open('output/style.css', 'w') { |io| io.write('h1 { coxlor: rxed; }') }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  # Run check
         
     | 
| 
      
 31 
     | 
    
         
            +
                  check = Nanoc::Extra::Checking::Checks::CSS.new(site)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  check.run
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  # Check
         
     | 
| 
      
 35 
     | 
    
         
            +
                  refute check.issues.empty?
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,76 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            class Nanoc::Extra::Checking::Checks::ExternalLinksTest < MiniTest::Unit::TestCase
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              include Nanoc::TestHelpers
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 8 
     | 
    
         
            +
                super
         
     | 
| 
      
 9 
     | 
    
         
            +
                require 'timeout'
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              def test_run
         
     | 
| 
      
 13 
     | 
    
         
            +
                with_site do |site|
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # Create files
         
     | 
| 
      
 15 
     | 
    
         
            +
                  FileUtils.mkdir_p('output')
         
     | 
| 
      
 16 
     | 
    
         
            +
                  FileUtils.mkdir_p('output/stuff')
         
     | 
| 
      
 17 
     | 
    
         
            +
                  File.open('output/foo.txt',  'w') { |io| io.write('<a href="http://example.com/404">broken</a>') }
         
     | 
| 
      
 18 
     | 
    
         
            +
                  File.open('output/bar.html', 'w') { |io| io.write('<a href="http://example.com/">not broken</a>') }
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  # Create check
         
     | 
| 
      
 21 
     | 
    
         
            +
                  check = Nanoc::Extra::Checking::Checks::InternalLinks.new(site)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  check.run
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  # Test
         
     | 
| 
      
 25 
     | 
    
         
            +
                  assert check.issues.empty?
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              def test_valid?
         
     | 
| 
      
 30 
     | 
    
         
            +
                with_site do |site|
         
     | 
| 
      
 31 
     | 
    
         
            +
                  # Create files
         
     | 
| 
      
 32 
     | 
    
         
            +
                  FileUtils.mkdir_p('output')
         
     | 
| 
      
 33 
     | 
    
         
            +
                  FileUtils.mkdir_p('output/stuff')
         
     | 
| 
      
 34 
     | 
    
         
            +
                  File.open('output/origin',     'w') { |io| io.write('hi') }
         
     | 
| 
      
 35 
     | 
    
         
            +
                  File.open('output/foo',        'w') { |io| io.write('hi') }
         
     | 
| 
      
 36 
     | 
    
         
            +
                  File.open('output/stuff/blah', 'w') { |io| io.write('hi') }
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  # Create check
         
     | 
| 
      
 39 
     | 
    
         
            +
                  check = Nanoc::Extra::Checking::Checks::ExternalLinks.new(site)
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  # Test
         
     | 
| 
      
 42 
     | 
    
         
            +
                  self.run_server_while do
         
     | 
| 
      
 43 
     | 
    
         
            +
                    assert ok?(check, 'http://127.0.0.1:9204/200')
         
     | 
| 
      
 44 
     | 
    
         
            +
                    assert ok?(check, 'foo://example.com/')
         
     | 
| 
      
 45 
     | 
    
         
            +
                    refute ok?(check, 'http://127.0.0.1:9204">')
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
                end
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              def ok?(check, url)
         
     | 
| 
      
 51 
     | 
    
         
            +
                Timeout.timeout(3) do
         
     | 
| 
      
 52 
     | 
    
         
            +
                  check.validate(url).nil?
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              def run_server_while
         
     | 
| 
      
 57 
     | 
    
         
            +
                @app = lambda { |env| [ env['REQUEST_PATH'][1..-1].to_i, {}, [ '... Useless body ...' ] ] }
         
     | 
| 
      
 58 
     | 
    
         
            +
                @server = nil
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                @thread = Thread.new do
         
     | 
| 
      
 61 
     | 
    
         
            +
                  Rack::Handler::WEBrick.run(@app, :Host => @host='127.0.0.1', :Port => @port=9204) do |server|
         
     | 
| 
      
 62 
     | 
    
         
            +
                    @server = server
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                Timeout::timeout(5) do
         
     | 
| 
      
 67 
     | 
    
         
            +
                  Thread.pass until @server
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                yield
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                @server.stop
         
     | 
| 
      
 73 
     | 
    
         
            +
                @thread.kill
         
     | 
| 
      
 74 
     | 
    
         
            +
              end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
            end
         
     |