mill 0.11 → 0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +11 -1
- data/Gemfile +6 -0
- data/Rakefile +9 -2
- data/TODO.txt +5 -5
- data/bin/mill +2 -2
- data/lib/mill.rb +2 -0
- data/lib/mill/html_helpers.rb +9 -3
- data/lib/mill/resource.rb +35 -22
- data/lib/mill/resources/text.rb +23 -12
- data/lib/mill/site.rb +108 -77
- data/lib/mill/version.rb +1 -1
- data/mill.gemspec +15 -10
- data/test/content/a.md +3 -0
- data/test/content/b/ba.md +3 -0
- data/test/content/b/bb.md +3 -0
- data/test/content/b/index.md +3 -0
- data/test/content/index.md +3 -0
- data/test/test.rb +56 -0
- metadata +110 -28
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 5accfe1e5067386b3de4898faceb6ea201c6bc30097da779c38ef343e0aad18c
         | 
| 4 | 
            +
              data.tar.gz: 5861a090880607573153929c75f0475fb258467676b2a4084514e8b368028bb6
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1c1e0a63042509e67a028e2e50b2f61fa92560ee16bb77370ca1ca82d1f75ebbd7054b9ba8b2408aff32e83a44c3e5f9cc2600316e5dd22c8a47ef7d26cee932
         | 
| 7 | 
            +
              data.tar.gz: 7dc21c2b4181768be5150d1e51ef6ea9b16aba0a33c8536dd9609e72b458913e2fa79ee460d9c50c204dc6a0da733587bd4807005a16ca2acc4e5806b33d168d
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/Rakefile
    CHANGED
    
    
    
        data/TODO.txt
    CHANGED
    
    | @@ -1,6 +1,10 @@ | |
| 1 | 
            +
            - remove textile/pre processors from Resource::Text
         | 
| 2 | 
            +
                - streamline to allow domain-specific subclassing if needed
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            - initialize site by setting ivars directly, not by passing params to super's initialize()
         | 
| 2 5 |  | 
| 3 6 | 
             
            - create alternate sites (beta, final, etc.) by subclassing site, and changing @output or @location
         | 
| 7 | 
            +
                - allow CLI option to specify site
         | 
| 4 8 |  | 
| 5 9 | 
             
            - rework resource URI usage
         | 
| 6 10 | 
             
                - 'uri' attribute should be canonical
         | 
| @@ -41,8 +45,6 @@ | |
| 41 45 | 
             
                    - sidebars
         | 
| 42 46 | 
             
                    - strings (existing String extensions)
         | 
| 43 47 |  | 
| 44 | 
            -
            - create bin/mill tool to replace Rake
         | 
| 45 | 
            -
             | 
| 46 48 | 
             
            - split Resource#date into Resource#published & Resource#updated
         | 
| 47 49 | 
             
                + add <published> element to feed
         | 
| 48 50 | 
             
                + #published should be stated date (e.g., from header)
         | 
| @@ -56,6 +58,4 @@ | |
| 56 58 |  | 
| 57 59 | 
             
            - save compressed versions of files
         | 
| 58 60 | 
             
                - write compressed versions along with non-compressed
         | 
| 59 | 
            -
                - serve compressed versions if asked by client
         | 
| 60 | 
            -
             | 
| 61 | 
            -
            - add MailChimp signup form generator to HTMLHelpers
         | 
| 61 | 
            +
                - serve compressed versions if asked by client
         | 
    
        data/bin/mill
    CHANGED
    
    
    
        data/lib/mill.rb
    CHANGED
    
    | @@ -5,10 +5,12 @@ require 'mime/types' | |
| 5 5 | 
             
            require 'nokogiri'
         | 
| 6 6 | 
             
            require 'path'
         | 
| 7 7 | 
             
            require 'pp'
         | 
| 8 | 
            +
            # require 'pry' rescue nil
         | 
| 8 9 | 
             
            require 'RedCloth'
         | 
| 9 10 | 
             
            require 'rubypants'
         | 
| 10 11 | 
             
            require 'sassc'
         | 
| 11 12 | 
             
            require 'time'
         | 
| 13 | 
            +
            require 'tree'
         | 
| 12 14 | 
             
            require 'web-checker'
         | 
| 13 15 |  | 
| 14 16 | 
             
            require 'mill/error'
         | 
    
        data/lib/mill/html_helpers.rb
    CHANGED
    
    | @@ -104,13 +104,19 @@ module HTMLHelpers | |
| 104 104 | 
             
                  nil => RubyPants,
         | 
| 105 105 | 
             
                  smart_quotes: RubyPants,
         | 
| 106 106 | 
             
                  markdown: Kramdown::Document,
         | 
| 107 | 
            -
                  textile: RedCloth,
         | 
| 107 | 
            +
                  textile: [RedCloth, :no_span_caps],
         | 
| 108 108 | 
             
                  pre: PreText,
         | 
| 109 109 | 
             
                }
         | 
| 110 110 |  | 
| 111 111 | 
             
                def to_html(options={})
         | 
| 112 | 
            -
                   | 
| 113 | 
            -
                   | 
| 112 | 
            +
                  converter_class = Converters[options[:mode]] or raise "Unknown to_html mode: #{options[:mode].inspect}"
         | 
| 113 | 
            +
                  if converter_class.kind_of?(Array)
         | 
| 114 | 
            +
                    converter_class, *converter_options = *converter_class
         | 
| 115 | 
            +
                    converter = converter_class.new(self, converter_options)
         | 
| 116 | 
            +
                  else
         | 
| 117 | 
            +
                    converter = converter_class.new(self)
         | 
| 118 | 
            +
                  end
         | 
| 119 | 
            +
                  html = Nokogiri::HTML::DocumentFragment.parse(converter.to_html)
         | 
| 114 120 | 
             
                  if !options[:multiline] && (p_elem = html.at_xpath('p'))
         | 
| 115 121 | 
             
                    html = p_elem.children.to_html
         | 
| 116 122 | 
             
                  end
         | 
    
        data/lib/mill/resource.rb
    CHANGED
    
    | @@ -6,10 +6,12 @@ module Mill | |
| 6 6 |  | 
| 7 7 | 
             
                attr_accessor :input_file
         | 
| 8 8 | 
             
                attr_accessor :output_file
         | 
| 9 | 
            +
                attr_accessor :path
         | 
| 9 10 | 
             
                attr_accessor :date
         | 
| 10 11 | 
             
                attr_accessor :public
         | 
| 11 12 | 
             
                attr_accessor :content
         | 
| 12 13 | 
             
                attr_accessor :site
         | 
| 14 | 
            +
                attr_accessor :node
         | 
| 13 15 |  | 
| 14 16 | 
             
                def initialize(input_file: nil,
         | 
| 15 17 | 
             
                               output_file: nil,
         | 
| @@ -23,7 +25,10 @@ module Mill | |
| 23 25 | 
             
                  else
         | 
| 24 26 | 
             
                    @date = DateTime.now
         | 
| 25 27 | 
             
                  end
         | 
| 26 | 
            -
                   | 
| 28 | 
            +
                  if output_file
         | 
| 29 | 
            +
                    @output_file = Path.new(output_file)
         | 
| 30 | 
            +
                    @path = '/' + @output_file.relative_to(site.output_dir).to_s
         | 
| 31 | 
            +
                  end
         | 
| 27 32 | 
             
                  self.date = date if date
         | 
| 28 33 | 
             
                  self.public = public
         | 
| 29 34 | 
             
                  @content = content
         | 
| @@ -57,39 +62,47 @@ module Mill | |
| 57 62 | 
             
                end
         | 
| 58 63 |  | 
| 59 64 | 
             
                def public?
         | 
| 60 | 
            -
                  @public
         | 
| 65 | 
            +
                  @public == true
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                def text?
         | 
| 69 | 
            +
                  kind_of?(Resource::Text) && public?
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def redirect?
         | 
| 73 | 
            +
                  kind_of?(Resource::Redirect)
         | 
| 61 74 | 
             
                end
         | 
| 62 75 |  | 
| 63 76 | 
             
                def inspect
         | 
| 64 | 
            -
                  "<%p> input_file: %p, output_file: %p, date: %s, public: %p, content: <%p | 
| 77 | 
            +
                  "<%p> input_file: %p, output_file: %p, path: %s, date: %s, public: %p, content: <%p>, parent: %p, siblings: %p, children: %p" % [
         | 
| 65 78 | 
             
                    self.class,
         | 
| 66 79 | 
             
                    @input_file ? @input_file.relative_to(@site.input_dir).to_s : nil,
         | 
| 67 80 | 
             
                    @output_file ? @output_file.relative_to(@site.output_dir).to_s : nil,
         | 
| 81 | 
            +
                    @path,
         | 
| 68 82 | 
             
                    @date.to_s,
         | 
| 69 83 | 
             
                    @public,
         | 
| 70 | 
            -
                    @content | 
| 84 | 
            +
                    @content&.class,
         | 
| 85 | 
            +
                    parent&.path,
         | 
| 86 | 
            +
                    siblings.map(&:path),
         | 
| 87 | 
            +
                    children.map(&:path),
         | 
| 71 88 | 
             
                  ]
         | 
| 72 89 | 
             
                end
         | 
| 73 90 |  | 
| 74 | 
            -
                def  | 
| 75 | 
            -
                   | 
| 76 | 
            -
                  @site.resources.select do |resource|
         | 
| 77 | 
            -
                    resource != self &&
         | 
| 78 | 
            -
                      (klass.nil? || resource.kind_of?(klass)) &&
         | 
| 79 | 
            -
                      resource.parent_uri == parent_uri
         | 
| 80 | 
            -
                  end
         | 
| 91 | 
            +
                def parent
         | 
| 92 | 
            +
                  @node.parent&.content
         | 
| 81 93 | 
             
                end
         | 
| 82 94 |  | 
| 83 | 
            -
                def  | 
| 84 | 
            -
                   | 
| 85 | 
            -
                  path = '/' + @output_file.relative_to(@site.output_dir).to_s
         | 
| 86 | 
            -
                  path.sub!(%r{/index\.html$}, '/')
         | 
| 87 | 
            -
                  path.sub!(%r{\.html$}, '') if @site.shorten_uris
         | 
| 88 | 
            -
                  Addressable::URI.encode(path, Addressable::URI)
         | 
| 95 | 
            +
                def siblings
         | 
| 96 | 
            +
                  @node.siblings.map(&:content).compact
         | 
| 89 97 | 
             
                end
         | 
| 90 98 |  | 
| 91 | 
            -
                def  | 
| 92 | 
            -
                   | 
| 99 | 
            +
                def children
         | 
| 100 | 
            +
                  @node.children.map(&:content).compact
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                def uri
         | 
| 104 | 
            +
                  raise Error, "#{@input_file}: No path defined for #{self.class}" unless @path
         | 
| 105 | 
            +
                  Addressable::URI.encode(@path, Addressable::URI)
         | 
| 93 106 | 
             
                end
         | 
| 94 107 |  | 
| 95 108 | 
             
                def absolute_uri
         | 
| @@ -119,14 +132,14 @@ module Mill | |
| 119 132 | 
             
                def save
         | 
| 120 133 | 
             
                  @output_file.dirname.mkpath
         | 
| 121 134 | 
             
                  if (content = final_content)
         | 
| 122 | 
            -
                    # ;;warn "#{ | 
| 135 | 
            +
                    # ;;warn "#{path}: writing #{@input_file} to #{@output_file}"
         | 
| 123 136 | 
             
                    @output_file.write(content.to_s)
         | 
| 124 137 | 
             
                    @output_file.utime(@date.to_time, @date.to_time)
         | 
| 125 138 | 
             
                  elsif @input_file
         | 
| 126 | 
            -
                    # ;;warn "#{ | 
| 139 | 
            +
                    # ;;warn "#{path}: copying #{@input_file} to #{@output_file}"
         | 
| 127 140 | 
             
                    @input_file.copy(@output_file)
         | 
| 128 141 | 
             
                  else
         | 
| 129 | 
            -
                    raise Error, "Can't build resource without content or input file: #{ | 
| 142 | 
            +
                    raise Error, "Can't build resource without content or input file: #{path}"
         | 
| 130 143 | 
             
                  end
         | 
| 131 144 | 
             
                end
         | 
| 132 145 |  | 
    
        data/lib/mill/resources/text.rb
    CHANGED
    
    | @@ -1,3 +1,4 @@ | |
| 1 | 
            +
             | 
| 1 2 | 
             
            module Mill
         | 
| 2 3 |  | 
| 3 4 | 
             
              class Resource
         | 
| @@ -15,19 +16,29 @@ module Mill | |
| 15 16 | 
             
                  attr_accessor :title
         | 
| 16 17 | 
             
                  attr_accessor :summary
         | 
| 17 18 | 
             
                  attr_accessor :author
         | 
| 19 | 
            +
                  attr_accessor :type
         | 
| 18 20 |  | 
| 19 | 
            -
                  def initialize(title: nil, summary: nil, author: nil, public: true, **args)
         | 
| 21 | 
            +
                  def initialize(title: nil, summary: nil, author: nil, public: true, output_file: nil, **args)
         | 
| 20 22 | 
             
                    @title = title
         | 
| 21 23 | 
             
                    @summary = summary
         | 
| 22 24 | 
             
                    @author = author
         | 
| 23 | 
            -
                     | 
| 25 | 
            +
                    @type = nil
         | 
| 26 | 
            +
                    super(
         | 
| 27 | 
            +
                      public: public,
         | 
| 28 | 
            +
                      output_file: output_file&.replace_extension('.html'),
         | 
| 29 | 
            +
                      **args)
         | 
| 30 | 
            +
                    if @path
         | 
| 31 | 
            +
                      @path.sub!(%r{\.html$}, '') if @site&.shorten_uris
         | 
| 32 | 
            +
                      @path.sub!(%r{(.*)index$}, '\1')
         | 
| 33 | 
            +
                    end
         | 
| 24 34 | 
             
                  end
         | 
| 25 35 |  | 
| 26 36 | 
             
                  def inspect
         | 
| 27 | 
            -
                    super + ", title: %p, summary: %p, author: %p" % [
         | 
| 37 | 
            +
                    super + ", title: %p, summary: %p, author: %p, type: %p" % [
         | 
| 28 38 | 
             
                      @title,
         | 
| 29 39 | 
             
                      @summary,
         | 
| 30 40 | 
             
                      @author,
         | 
| 41 | 
            +
                      @type,
         | 
| 31 42 | 
             
                    ]
         | 
| 32 43 | 
             
                  end
         | 
| 33 44 |  | 
| @@ -35,7 +46,7 @@ module Mill | |
| 35 46 | 
             
                    super
         | 
| 36 47 | 
             
                    if @input_file
         | 
| 37 48 | 
             
                      @content = @input_file.read
         | 
| 38 | 
            -
                       | 
| 49 | 
            +
                      @type = case @input_file.extname.downcase
         | 
| 39 50 | 
             
                      when '.md', '.mdown', '.markdown'
         | 
| 40 51 | 
             
                        :markdown
         | 
| 41 52 | 
             
                      when '.textile'
         | 
| @@ -47,10 +58,10 @@ module Mill | |
| 47 58 | 
             
                      else
         | 
| 48 59 | 
             
                        raise "Unknown text type: #{@input_file}"
         | 
| 49 60 | 
             
                      end
         | 
| 50 | 
            -
                      if  | 
| 61 | 
            +
                      if @type != :html
         | 
| 51 62 | 
             
                        parse_text_header
         | 
| 52 | 
            -
                        @content = (@content || '').to_html(mode:  | 
| 53 | 
            -
                        @ | 
| 63 | 
            +
                        @content = (@content || '').to_html(mode: @type, multiline: true)
         | 
| 64 | 
            +
                        @type = :html
         | 
| 54 65 | 
             
                      end
         | 
| 55 66 | 
             
                      begin
         | 
| 56 67 | 
             
                        @content = parse_html(@content)
         | 
| @@ -66,7 +77,7 @@ module Mill | |
| 66 77 | 
             
                      if (title_elem = @content.at_xpath('/html/head/title'))
         | 
| 67 78 | 
             
                        @title = title_elem.text
         | 
| 68 79 | 
             
                      else
         | 
| 69 | 
            -
                        @title =  | 
| 80 | 
            +
                        @title = @path
         | 
| 70 81 | 
             
                      end
         | 
| 71 82 | 
             
                    end
         | 
| 72 83 | 
             
                    @content.xpath('/html/head/meta[@name]').each do |meta|
         | 
| @@ -78,7 +89,7 @@ module Mill | |
| 78 89 | 
             
                    if @content.split(/\n/, 2).first =~ /^\w+:\s+/
         | 
| 79 90 | 
             
                      header, @content = @content.split(/\n\n/, 2)
         | 
| 80 91 | 
             
                      header.split(/\n/).map do |line|
         | 
| 81 | 
            -
                        key, value = line.strip.split(/:\s | 
| 92 | 
            +
                        key, value = line.strip.split(/:\s*/, 2)
         | 
| 82 93 | 
             
                        key = key.gsub('-', '_').downcase.to_sym
         | 
| 83 94 | 
             
                        send("#{key}=", value)
         | 
| 84 95 | 
             
                      end
         | 
| @@ -86,7 +97,7 @@ module Mill | |
| 86 97 | 
             
                  end
         | 
| 87 98 |  | 
| 88 99 | 
             
                  def final_content
         | 
| 89 | 
            -
                    html_document(@site | 
| 100 | 
            +
                    html_document(@site&.html_version || :html5) do |doc|
         | 
| 90 101 | 
             
                      doc.html(lang: 'en') do |html|
         | 
| 91 102 | 
             
                        html.parent << head
         | 
| 92 103 | 
             
                        html.parent << body
         | 
| @@ -168,7 +179,7 @@ module Mill | |
| 168 179 | 
             
                        self_uri.scheme = 'http'
         | 
| 169 180 | 
             
                        link_uri.scheme = 'http'
         | 
| 170 181 | 
             
                        attribute.value = self_uri.route_to(link_uri)
         | 
| 171 | 
            -
                        # ;;warn "[#{ | 
| 182 | 
            +
                        # ;;warn "[#{path}] shortened link #{elem.name}/@#{attribute.name}: #{link_uri} => #{attribute.value}"
         | 
| 172 183 | 
             
                      end
         | 
| 173 184 | 
             
                    end
         | 
| 174 185 | 
             
                  end
         | 
| @@ -195,7 +206,7 @@ module Mill | |
| 195 206 | 
             
                        body_elem.children
         | 
| 196 207 | 
             
                      end
         | 
| 197 208 | 
             
                    else
         | 
| 198 | 
            -
                      warn "Warning: Resource #{ | 
| 209 | 
            +
                      warn "Warning: Resource #{path} (#{self.class}) has no content"
         | 
| 199 210 | 
             
                      nil
         | 
| 200 211 | 
             
                    end
         | 
| 201 212 | 
             
                  end
         | 
    
        data/lib/mill/site.rb
    CHANGED
    
    | @@ -64,8 +64,8 @@ module Mill | |
| 64 64 | 
             
                  @google_site_verification = google_site_verification
         | 
| 65 65 | 
             
                  @redirects = redirects
         | 
| 66 66 |  | 
| 67 | 
            -
                  @resources =  | 
| 68 | 
            -
                  @ | 
| 67 | 
            +
                  @resources = {}
         | 
| 68 | 
            +
                  @resources_tree = Tree::TreeNode.new('')
         | 
| 69 69 | 
             
                  build_file_types
         | 
| 70 70 | 
             
                end
         | 
| 71 71 |  | 
| @@ -79,35 +79,20 @@ module Mill | |
| 79 79 | 
             
                end
         | 
| 80 80 |  | 
| 81 81 | 
             
                def add_resource(resource)
         | 
| 82 | 
            -
                  resource | 
| 83 | 
            -
                  @resources  | 
| 84 | 
            -
                   | 
| 85 | 
            -
                   | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
                def delete_resource(resource)
         | 
| 89 | 
            -
                  @resources.delete(resource)
         | 
| 90 | 
            -
                  @resources_by_uri.delete(resource.uri)
         | 
| 91 | 
            -
                end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                def find_resource(uri)
         | 
| 94 | 
            -
                  uri = Addressable::URI.parse(uri.to_s) unless uri.kind_of?(Addressable::URI)
         | 
| 95 | 
            -
                  resource = @resources_by_uri[uri]
         | 
| 96 | 
            -
                  if resource.nil? && @shorten_uris
         | 
| 97 | 
            -
                    uri.path = uri.path.sub(%r{\.html$}, '')
         | 
| 98 | 
            -
                    resource = @resources_by_uri[uri]
         | 
| 82 | 
            +
                  raise "Must assign resource to site" unless resource.site
         | 
| 83 | 
            +
                  @resources[resource.path] = resource
         | 
| 84 | 
            +
                  node = @resources_tree
         | 
| 85 | 
            +
                  resource.path.split('/').reject(&:empty?).each do |component|
         | 
| 86 | 
            +
                    node = node[component] || (node << Tree::TreeNode.new(component))
         | 
| 99 87 | 
             
                  end
         | 
| 100 | 
            -
                  resource
         | 
| 88 | 
            +
                  resource.node = node
         | 
| 89 | 
            +
                  node.content = resource
         | 
| 90 | 
            +
                  # ;;warn "added #{resource} as #{resource.path}"
         | 
| 101 91 | 
             
                end
         | 
| 102 92 |  | 
| 103 | 
            -
                def  | 
| 104 | 
            -
                   | 
| 105 | 
            -
             | 
| 106 | 
            -
                      '/' + URI.encode(
         | 
| 107 | 
            -
                        path.relative_to(@output_dir).to_s
         | 
| 108 | 
            -
                      )
         | 
| 109 | 
            -
                    )
         | 
| 110 | 
            -
                  )
         | 
| 93 | 
            +
                def find_resource(path)
         | 
| 94 | 
            +
                  path = path.path if path.kind_of?(Addressable::URI)
         | 
| 95 | 
            +
                  @resources[path] || @resources[path + '/']
         | 
| 111 96 | 
             
                end
         | 
| 112 97 |  | 
| 113 98 | 
             
                def home_resource
         | 
| @@ -135,20 +120,30 @@ module Mill | |
| 135 120 | 
             
                  @site_email
         | 
| 136 121 | 
             
                end
         | 
| 137 122 |  | 
| 123 | 
            +
                def select_resources(selector=nil, &block)
         | 
| 124 | 
            +
                  if block_given?
         | 
| 125 | 
            +
                    @resources.values.select(&block)
         | 
| 126 | 
            +
                  elsif selector.kind_of?(Class)
         | 
| 127 | 
            +
                    @resources.values.select { |r| r.kind_of?(selector) }
         | 
| 128 | 
            +
                  else
         | 
| 129 | 
            +
                    @resources.values.select(selector)
         | 
| 130 | 
            +
                  end
         | 
| 131 | 
            +
                end
         | 
| 132 | 
            +
             | 
| 138 133 | 
             
                def feed_resources
         | 
| 139 134 | 
             
                  public_resources.sort_by(&:date)
         | 
| 140 135 | 
             
                end
         | 
| 141 136 |  | 
| 142 137 | 
             
                def public_resources
         | 
| 143 | 
            -
                   | 
| 138 | 
            +
                  select_resources(&:public?)
         | 
| 144 139 | 
             
                end
         | 
| 145 140 |  | 
| 146 | 
            -
                def  | 
| 147 | 
            -
                   | 
| 141 | 
            +
                def redirect_resources
         | 
| 142 | 
            +
                  select_resources(&:redirect?)
         | 
| 148 143 | 
             
                end
         | 
| 149 144 |  | 
| 150 | 
            -
                def  | 
| 151 | 
            -
                   | 
| 145 | 
            +
                def text_resources
         | 
| 146 | 
            +
                  select_resources(&:text?)
         | 
| 152 147 | 
             
                end
         | 
| 153 148 |  | 
| 154 149 | 
             
                def make
         | 
| @@ -156,35 +151,67 @@ module Mill | |
| 156 151 | 
             
                  save
         | 
| 157 152 | 
             
                end
         | 
| 158 153 |  | 
| 159 | 
            -
                def  | 
| 160 | 
            -
             | 
| 161 | 
            -
                   | 
| 162 | 
            -
                     | 
| 163 | 
            -
             | 
| 164 | 
            -
                     | 
| 165 | 
            -
             | 
| 166 | 
            -
             | 
| 167 | 
            -
                  }
         | 
| 154 | 
            +
                def print_tree(node=nil, level=0)
         | 
| 155 | 
            +
                  node ||= @resources_tree
         | 
| 156 | 
            +
                  if node.is_root?
         | 
| 157 | 
            +
                    print '*'
         | 
| 158 | 
            +
                  else
         | 
| 159 | 
            +
                    print "\t" * level
         | 
| 160 | 
            +
                  end
         | 
| 161 | 
            +
                  print " #{node.name.inspect}"
         | 
| 162 | 
            +
                  print " <#{node.content&.path}>"
         | 
| 163 | 
            +
                  print " (#{node.children.length} children)" if node.has_children?
         | 
| 164 | 
            +
                  puts
         | 
| 165 | 
            +
                  node.children { |child| print_tree(child, level + 1) }
         | 
| 166 | 
            +
                end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                ListKeys = {
         | 
| 169 | 
            +
                  path:         :to_s,
         | 
| 170 | 
            +
                  input_file:   :to_s,
         | 
| 171 | 
            +
                  output_file:  :to_s,
         | 
| 172 | 
            +
                  date:         :to_s,
         | 
| 173 | 
            +
                  public:       :to_s,
         | 
| 174 | 
            +
                  class:        :to_s,
         | 
| 175 | 
            +
                  content:      proc { |r| r.content ? ('%s (%dKB)' % [r.content.class, (r.content.to_s.length / 1024.0).ceil]) : nil },
         | 
| 176 | 
            +
                  parent:       proc { |r| r.parent&.path },
         | 
| 177 | 
            +
                  siblings:     proc { |r| r.siblings.map(&:path) },
         | 
| 178 | 
            +
                  children:     proc { |r| r.children.map(&:path) },
         | 
| 179 | 
            +
                }
         | 
| 168 180 |  | 
| 181 | 
            +
                def list
         | 
| 169 182 | 
             
                  build
         | 
| 170 | 
            -
                   | 
| 171 | 
            -
             | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 183 | 
            +
                  width = ListKeys.keys.map(&:length).max
         | 
| 184 | 
            +
                  select_resources.each do |resource|
         | 
| 185 | 
            +
                    ListKeys.each do |key, converter|
         | 
| 186 | 
            +
                      value = resource.send(key)
         | 
| 187 | 
            +
                      value = case converter
         | 
| 188 | 
            +
                      when nil
         | 
| 189 | 
            +
                        value
         | 
| 190 | 
            +
                      when Symbol
         | 
| 191 | 
            +
                        value.send(converter)
         | 
| 192 | 
            +
                      when Proc
         | 
| 193 | 
            +
                        converter.call(resource)
         | 
| 194 | 
            +
                      else
         | 
| 195 | 
            +
                        raise
         | 
| 178 196 | 
             
                      end
         | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
             | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 197 | 
            +
                      print '%*s: ' % [width, key]
         | 
| 198 | 
            +
                      case value
         | 
| 199 | 
            +
                      when Array
         | 
| 200 | 
            +
                        if value.empty?
         | 
| 201 | 
            +
                          puts '-'
         | 
| 202 | 
            +
                        else
         | 
| 203 | 
            +
                          value.each_with_index do |v, i|
         | 
| 204 | 
            +
                            print '%*s  ' % [width, ''] if i > 0
         | 
| 205 | 
            +
                            puts (v.nil? ? '-' : v)
         | 
| 206 | 
            +
                          end
         | 
| 207 | 
            +
                        end
         | 
| 208 | 
            +
                      else
         | 
| 209 | 
            +
                        puts (value.nil? ? '-' : value)
         | 
| 210 | 
            +
                      end
         | 
| 211 | 
            +
                    end
         | 
| 212 | 
            +
                    puts
         | 
| 187 213 | 
             
                  end
         | 
| 214 | 
            +
                  puts
         | 
| 188 215 | 
             
                end
         | 
| 189 216 |  | 
| 190 217 | 
             
                def build
         | 
| @@ -205,14 +232,14 @@ module Mill | |
| 205 232 |  | 
| 206 233 | 
             
                def load_resources
         | 
| 207 234 | 
             
                  on_each_resource do |resource|
         | 
| 208 | 
            -
                    # ;;warn "#{resource. | 
| 235 | 
            +
                    # ;;warn "#{resource.path}: loading"
         | 
| 209 236 | 
             
                    resource.load
         | 
| 210 237 | 
             
                  end
         | 
| 211 238 | 
             
                end
         | 
| 212 239 |  | 
| 213 240 | 
             
                def build_resources
         | 
| 214 241 | 
             
                  on_each_resource do |resource|
         | 
| 215 | 
            -
                    # ;;warn "#{resource. | 
| 242 | 
            +
                    # ;;warn "#{resource.path}: building"
         | 
| 216 243 | 
             
                    resource.build
         | 
| 217 244 | 
             
                  end
         | 
| 218 245 | 
             
                end
         | 
| @@ -221,7 +248,7 @@ module Mill | |
| 221 248 | 
             
                  clean
         | 
| 222 249 | 
             
                  @output_dir.mkpath
         | 
| 223 250 | 
             
                  on_each_resource do |resource|
         | 
| 224 | 
            -
                    # ;;warn "#{resource. | 
| 251 | 
            +
                    # ;;warn "#{resource.path}: saving"
         | 
| 225 252 | 
             
                    resource.save
         | 
| 226 253 | 
             
                  end
         | 
| 227 254 | 
             
                end
         | 
| @@ -241,6 +268,8 @@ module Mill | |
| 241 268 |  | 
| 242 269 | 
             
                def snapshot
         | 
| 243 270 | 
             
                  @output_dir.chdir do
         | 
| 271 | 
            +
                    system('git',
         | 
| 272 | 
            +
                      'init') unless Path.new('.git').exist?
         | 
| 244 273 | 
             
                    system('git',
         | 
| 245 274 | 
             
                      'add',
         | 
| 246 275 | 
             
                      '.')
         | 
| @@ -265,6 +294,7 @@ module Mill | |
| 265 294 | 
             
                    '--progress',
         | 
| 266 295 | 
             
                    '--verbose',
         | 
| 267 296 | 
             
                    '--archive',
         | 
| 297 | 
            +
                    # '--append-verify',
         | 
| 268 298 | 
             
                    '--exclude=.git',
         | 
| 269 299 | 
             
                    '--delete-after',
         | 
| 270 300 | 
             
                    @output_dir.to_s,
         | 
| @@ -272,17 +302,11 @@ module Mill | |
| 272 302 | 
             
                end
         | 
| 273 303 |  | 
| 274 304 | 
             
                def on_each_resource(&block)
         | 
| 275 | 
            -
                  @resources.each do |resource|
         | 
| 276 | 
            -
                    old_uri = resource.uri.dup
         | 
| 305 | 
            +
                  @resources.values.each do |resource|
         | 
| 277 306 | 
             
                    begin
         | 
| 278 307 | 
             
                      yield(resource)
         | 
| 279 308 | 
             
                    rescue Error => e
         | 
| 280 | 
            -
                      raise e, "#{resource.input_file || '-'} (#{ | 
| 281 | 
            -
                    end
         | 
| 282 | 
            -
                    if resource.uri != old_uri
         | 
| 283 | 
            -
                      # ;;warn "URI changed: #{old_uri} => #{resource.uri}"
         | 
| 284 | 
            -
                      @resources_by_uri.delete(old_uri)
         | 
| 285 | 
            -
                      @resources_by_uri[resource.uri] = resource
         | 
| 309 | 
            +
                      raise e, "#{resource.input_file || '-'} (#{resource.path}): #{e}"
         | 
| 286 310 | 
             
                    end
         | 
| 287 311 | 
             
                  end
         | 
| 288 312 | 
             
                end
         | 
| @@ -299,7 +323,7 @@ module Mill | |
| 299 323 | 
             
                end
         | 
| 300 324 |  | 
| 301 325 | 
             
                def add_files
         | 
| 302 | 
            -
                  raise Error, "Input  | 
| 326 | 
            +
                  raise Error, "Input directory not found: #{@input_dir}" unless @input_dir.exist?
         | 
| 303 327 | 
             
                  @input_dir.find do |input_file|
         | 
| 304 328 | 
             
                    if input_file.basename.to_s[0] == '.'
         | 
| 305 329 | 
             
                      Find.prune
         | 
| @@ -308,7 +332,8 @@ module Mill | |
| 308 332 | 
             
                    else (klass = resource_class_for_file(input_file))
         | 
| 309 333 | 
             
                      resource = klass.new(
         | 
| 310 334 | 
             
                        input_file: input_file,
         | 
| 311 | 
            -
                        output_file: @output_dir / input_file.relative_to(@input_dir) | 
| 335 | 
            +
                        output_file: @output_dir / input_file.relative_to(@input_dir),
         | 
| 336 | 
            +
                        site: self)
         | 
| 312 337 | 
             
                      add_resource(resource)
         | 
| 313 338 | 
             
                    end
         | 
| 314 339 | 
             
                  end
         | 
| @@ -316,19 +341,22 @@ module Mill | |
| 316 341 |  | 
| 317 342 | 
             
                def add_feed
         | 
| 318 343 | 
             
                  @feed_resource = Resource::Feed.new(
         | 
| 319 | 
            -
                    output_file: @output_dir / 'feed.xml' | 
| 344 | 
            +
                    output_file: @output_dir / 'feed.xml',
         | 
| 345 | 
            +
                    site: self)
         | 
| 320 346 | 
             
                  add_resource(@feed_resource)
         | 
| 321 347 | 
             
                end
         | 
| 322 348 |  | 
| 323 349 | 
             
                def add_sitemap
         | 
| 324 350 | 
             
                  @sitemap_resource = Resource::Sitemap.new(
         | 
| 325 | 
            -
                    output_file: @output_dir / 'sitemap.xml' | 
| 351 | 
            +
                    output_file: @output_dir / 'sitemap.xml',
         | 
| 352 | 
            +
                    site: self)
         | 
| 326 353 | 
             
                  add_resource(@sitemap_resource)
         | 
| 327 354 | 
             
                end
         | 
| 328 355 |  | 
| 329 356 | 
             
                def add_robots
         | 
| 330 357 | 
             
                  @robots_resource = Resource::Robots.new(
         | 
| 331 | 
            -
                    output_file: @output_dir / 'robots.txt' | 
| 358 | 
            +
                    output_file: @output_dir / 'robots.txt',
         | 
| 359 | 
            +
                    site: self)
         | 
| 332 360 | 
             
                  add_resource(@robots_resource)
         | 
| 333 361 | 
             
                end
         | 
| 334 362 |  | 
| @@ -338,7 +366,8 @@ module Mill | |
| 338 366 | 
             
                      output_file = @output_dir / Path.new(from).relative_to('/')
         | 
| 339 367 | 
             
                      resource = Resource::Redirect.new(
         | 
| 340 368 | 
             
                        output_file: output_file,
         | 
| 341 | 
            -
                        redirect_uri: to | 
| 369 | 
            +
                        redirect_uri: to,
         | 
| 370 | 
            +
                        site: self)
         | 
| 342 371 | 
             
                      add_resource(resource)
         | 
| 343 372 | 
             
                    end
         | 
| 344 373 | 
             
                  end
         | 
| @@ -347,14 +376,16 @@ module Mill | |
| 347 376 | 
             
                def add_google_site_verification
         | 
| 348 377 | 
             
                  resource = Resource::GoogleSiteVerification.new(
         | 
| 349 378 | 
             
                    output_file: (@output_dir / @google_site_verification).add_extension('.html'),
         | 
| 350 | 
            -
                    key: @google_site_verification | 
| 379 | 
            +
                    key: @google_site_verification,
         | 
| 380 | 
            +
                    site: self)
         | 
| 351 381 | 
             
                  add_resource(resource)
         | 
| 352 382 | 
             
                end
         | 
| 353 383 |  | 
| 354 384 | 
             
                def add_htpasswd
         | 
| 355 385 | 
             
                  resource = Resource.new(
         | 
| 356 386 | 
             
                    input_file: @htpasswd_file,
         | 
| 357 | 
            -
                    output_file: @output_dir / '.htpasswd' | 
| 387 | 
            +
                    output_file: @output_dir / '.htpasswd',
         | 
| 388 | 
            +
                    site: self)
         | 
| 358 389 | 
             
                  add_resource(resource)
         | 
| 359 390 | 
             
                end
         | 
| 360 391 |  | 
    
        data/lib/mill/version.rb
    CHANGED
    
    
    
        data/mill.gemspec
    CHANGED
    
    | @@ -18,17 +18,22 @@ Gem::Specification.new do |s| | |
| 18 18 | 
             
              s.executables   = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
         | 
| 19 19 | 
             
              s.require_path  = 'lib'
         | 
| 20 20 |  | 
| 21 | 
            -
              s.add_dependency 'addressable', '~> 2. | 
| 22 | 
            -
              s.add_dependency 'image_size', '~> 1 | 
| 23 | 
            -
              s.add_dependency 'kramdown', '~>  | 
| 24 | 
            -
              s.add_dependency 'mime-types', '~> 3. | 
| 25 | 
            -
              s.add_dependency 'nokogiri', '~> 1. | 
| 21 | 
            +
              s.add_dependency 'addressable', '~> 2.7'
         | 
| 22 | 
            +
              s.add_dependency 'image_size', '~> 2.1'
         | 
| 23 | 
            +
              s.add_dependency 'kramdown', '~> 2.3'
         | 
| 24 | 
            +
              s.add_dependency 'mime-types', '~> 3.3'
         | 
| 25 | 
            +
              s.add_dependency 'nokogiri', '~> 1.10'
         | 
| 26 26 | 
             
              s.add_dependency 'path', '~> 2.0'
         | 
| 27 27 | 
             
              s.add_dependency 'RedCloth', '~> 4.3'
         | 
| 28 | 
            -
              s.add_dependency 'rubypants', '~> 0. | 
| 29 | 
            -
              s.add_dependency ' | 
| 30 | 
            -
              s.add_dependency ' | 
| 28 | 
            +
              s.add_dependency 'rubypants', '~> 0.7'
         | 
| 29 | 
            +
              s.add_dependency 'rubytree', '~> 1.0'
         | 
| 30 | 
            +
              s.add_dependency 'sassc', '~> 2.4'
         | 
| 31 | 
            +
              s.add_dependency 'web-checker', '~> 0.4'
         | 
| 31 32 |  | 
| 32 | 
            -
              s.add_development_dependency ' | 
| 33 | 
            -
              s.add_development_dependency ' | 
| 33 | 
            +
              s.add_development_dependency 'bundler', '~> 2.2'
         | 
| 34 | 
            +
              s.add_development_dependency 'minitest', '~> 5.14'
         | 
| 35 | 
            +
              s.add_development_dependency 'minitest-power_assert', '~> 0.3'
         | 
| 36 | 
            +
              s.add_development_dependency 'pry', '~> 0.13'
         | 
| 37 | 
            +
              s.add_development_dependency 'rake', '~> 13.0'
         | 
| 38 | 
            +
              s.add_development_dependency 'rubygems-tasks', '~> 0.2'
         | 
| 34 39 | 
             
            end
         | 
    
        data/test/content/a.md
    ADDED
    
    
    
        data/test/test.rb
    ADDED
    
    | @@ -0,0 +1,56 @@ | |
| 1 | 
            +
            $VERBOSE = false
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'minitest/autorun'
         | 
| 4 | 
            +
            require 'minitest/power_assert'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
         | 
| 7 | 
            +
            require 'mill'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module Mill
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              class Test < Minitest::Test
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def setup
         | 
| 14 | 
            +
                  @site = Site.new(
         | 
| 15 | 
            +
                    input_dir: 'test/content',
         | 
| 16 | 
            +
                    output_dir: 'test/output',
         | 
| 17 | 
            +
                    site_title: 'Test',
         | 
| 18 | 
            +
                    site_uri: 'http://test.test',
         | 
| 19 | 
            +
                    html_version: :html5,
         | 
| 20 | 
            +
                  )
         | 
| 21 | 
            +
                  @site.make
         | 
| 22 | 
            +
            # ;;@site.print_tree
         | 
| 23 | 
            +
            # ;;@site.list
         | 
| 24 | 
            +
            # ;;binding.pry
         | 
| 25 | 
            +
                  @root = @site.find_resource('/') or raise
         | 
| 26 | 
            +
                  @a = @site.find_resource('/a') or raise
         | 
| 27 | 
            +
                  @b = @site.find_resource('/b') or raise
         | 
| 28 | 
            +
                  @ba = @site.find_resource('/b/ba') or raise
         | 
| 29 | 
            +
                  @bb = @site.find_resource('/b/bb') or raise
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def test_has_index
         | 
| 33 | 
            +
                  assert { @root }
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def test_children
         | 
| 37 | 
            +
                  assert { @root.children == [@a, @b] }
         | 
| 38 | 
            +
                  assert { @a.children.empty? }
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def test_parent
         | 
| 42 | 
            +
                  assert { @a.parent == @root }
         | 
| 43 | 
            +
                  assert { @b.parent == @root }
         | 
| 44 | 
            +
                  assert { @ba.parent == @b }
         | 
| 45 | 
            +
                  assert { @bb.parent == @b }
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                def test_siblings
         | 
| 49 | 
            +
                  assert { @root.siblings.empty? }
         | 
| 50 | 
            +
                  assert { @a.siblings == [@b] }
         | 
| 51 | 
            +
                  assert { @ba.siblings == [@bb] }
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: mill
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: '0. | 
| 4 | 
            +
              version: '0.16'
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - John Labovitz
         | 
| 8 | 
            -
            autorequire: | 
| 8 | 
            +
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2020-12-31 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: addressable
         | 
| @@ -16,70 +16,70 @@ dependencies: | |
| 16 16 | 
             
                requirements:
         | 
| 17 17 | 
             
                - - "~>"
         | 
| 18 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: '2. | 
| 19 | 
            +
                    version: '2.7'
         | 
| 20 20 | 
             
              type: :runtime
         | 
| 21 21 | 
             
              prerelease: false
         | 
| 22 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 23 | 
             
                requirements:
         | 
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: '2. | 
| 26 | 
            +
                    version: '2.7'
         | 
| 27 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 28 | 
             
              name: image_size
         | 
| 29 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: '1 | 
| 33 | 
            +
                    version: '2.1'
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: '1 | 
| 40 | 
            +
                    version: '2.1'
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: kramdown
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 44 | 
             
                requirements:
         | 
| 45 45 | 
             
                - - "~>"
         | 
| 46 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            -
                    version: ' | 
| 47 | 
            +
                    version: '2.3'
         | 
| 48 48 | 
             
              type: :runtime
         | 
| 49 49 | 
             
              prerelease: false
         | 
| 50 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 51 | 
             
                requirements:
         | 
| 52 52 | 
             
                - - "~>"
         | 
| 53 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            -
                    version: ' | 
| 54 | 
            +
                    version: '2.3'
         | 
| 55 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 56 56 | 
             
              name: mime-types
         | 
| 57 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 58 58 | 
             
                requirements:
         | 
| 59 59 | 
             
                - - "~>"
         | 
| 60 60 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: '3. | 
| 61 | 
            +
                    version: '3.3'
         | 
| 62 62 | 
             
              type: :runtime
         | 
| 63 63 | 
             
              prerelease: false
         | 
| 64 64 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 65 65 | 
             
                requirements:
         | 
| 66 66 | 
             
                - - "~>"
         | 
| 67 67 | 
             
                  - !ruby/object:Gem::Version
         | 
| 68 | 
            -
                    version: '3. | 
| 68 | 
            +
                    version: '3.3'
         | 
| 69 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 70 | 
             
              name: nokogiri
         | 
| 71 71 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 72 72 | 
             
                requirements:
         | 
| 73 73 | 
             
                - - "~>"
         | 
| 74 74 | 
             
                  - !ruby/object:Gem::Version
         | 
| 75 | 
            -
                    version: '1. | 
| 75 | 
            +
                    version: '1.10'
         | 
| 76 76 | 
             
              type: :runtime
         | 
| 77 77 | 
             
              prerelease: false
         | 
| 78 78 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 79 79 | 
             
                requirements:
         | 
| 80 80 | 
             
                - - "~>"
         | 
| 81 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 82 | 
            -
                    version: '1. | 
| 82 | 
            +
                    version: '1.10'
         | 
| 83 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 84 84 | 
             
              name: path
         | 
| 85 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -114,70 +114,140 @@ dependencies: | |
| 114 114 | 
             
                requirements:
         | 
| 115 115 | 
             
                - - "~>"
         | 
| 116 116 | 
             
                  - !ruby/object:Gem::Version
         | 
| 117 | 
            -
                    version: '0. | 
| 117 | 
            +
                    version: '0.7'
         | 
| 118 118 | 
             
              type: :runtime
         | 
| 119 119 | 
             
              prerelease: false
         | 
| 120 120 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 121 121 | 
             
                requirements:
         | 
| 122 122 | 
             
                - - "~>"
         | 
| 123 123 | 
             
                  - !ruby/object:Gem::Version
         | 
| 124 | 
            -
                    version: '0. | 
| 124 | 
            +
                    version: '0.7'
         | 
| 125 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 126 | 
            +
              name: rubytree
         | 
| 127 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 | 
            +
                requirements:
         | 
| 129 | 
            +
                - - "~>"
         | 
| 130 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            +
                    version: '1.0'
         | 
| 132 | 
            +
              type: :runtime
         | 
| 133 | 
            +
              prerelease: false
         | 
| 134 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 | 
            +
                requirements:
         | 
| 136 | 
            +
                - - "~>"
         | 
| 137 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            +
                    version: '1.0'
         | 
| 125 139 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 126 140 | 
             
              name: sassc
         | 
| 127 141 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 128 142 | 
             
                requirements:
         | 
| 129 143 | 
             
                - - "~>"
         | 
| 130 144 | 
             
                  - !ruby/object:Gem::Version
         | 
| 131 | 
            -
                    version: '2. | 
| 145 | 
            +
                    version: '2.4'
         | 
| 132 146 | 
             
              type: :runtime
         | 
| 133 147 | 
             
              prerelease: false
         | 
| 134 148 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 135 149 | 
             
                requirements:
         | 
| 136 150 | 
             
                - - "~>"
         | 
| 137 151 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 | 
            -
                    version: '2. | 
| 152 | 
            +
                    version: '2.4'
         | 
| 139 153 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 140 154 | 
             
              name: web-checker
         | 
| 141 155 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 156 | 
             
                requirements:
         | 
| 143 157 | 
             
                - - "~>"
         | 
| 144 158 | 
             
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            -
                    version: '0'
         | 
| 159 | 
            +
                    version: '0.4'
         | 
| 146 160 | 
             
              type: :runtime
         | 
| 147 161 | 
             
              prerelease: false
         | 
| 148 162 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 163 | 
             
                requirements:
         | 
| 150 164 | 
             
                - - "~>"
         | 
| 151 165 | 
             
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                    version: '0'
         | 
| 166 | 
            +
                    version: '0.4'
         | 
| 167 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 168 | 
            +
              name: bundler
         | 
| 169 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 170 | 
            +
                requirements:
         | 
| 171 | 
            +
                - - "~>"
         | 
| 172 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            +
                    version: '2.2'
         | 
| 174 | 
            +
              type: :development
         | 
| 175 | 
            +
              prerelease: false
         | 
| 176 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 177 | 
            +
                requirements:
         | 
| 178 | 
            +
                - - "~>"
         | 
| 179 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 180 | 
            +
                    version: '2.2'
         | 
| 181 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 182 | 
            +
              name: minitest
         | 
| 183 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 184 | 
            +
                requirements:
         | 
| 185 | 
            +
                - - "~>"
         | 
| 186 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 187 | 
            +
                    version: '5.14'
         | 
| 188 | 
            +
              type: :development
         | 
| 189 | 
            +
              prerelease: false
         | 
| 190 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 191 | 
            +
                requirements:
         | 
| 192 | 
            +
                - - "~>"
         | 
| 193 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 194 | 
            +
                    version: '5.14'
         | 
| 195 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 196 | 
            +
              name: minitest-power_assert
         | 
| 197 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 198 | 
            +
                requirements:
         | 
| 199 | 
            +
                - - "~>"
         | 
| 200 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 201 | 
            +
                    version: '0.3'
         | 
| 202 | 
            +
              type: :development
         | 
| 203 | 
            +
              prerelease: false
         | 
| 204 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 205 | 
            +
                requirements:
         | 
| 206 | 
            +
                - - "~>"
         | 
| 207 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 208 | 
            +
                    version: '0.3'
         | 
| 209 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 210 | 
            +
              name: pry
         | 
| 211 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 212 | 
            +
                requirements:
         | 
| 213 | 
            +
                - - "~>"
         | 
| 214 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 215 | 
            +
                    version: '0.13'
         | 
| 216 | 
            +
              type: :development
         | 
| 217 | 
            +
              prerelease: false
         | 
| 218 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 219 | 
            +
                requirements:
         | 
| 220 | 
            +
                - - "~>"
         | 
| 221 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 222 | 
            +
                    version: '0.13'
         | 
| 153 223 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 154 224 | 
             
              name: rake
         | 
| 155 225 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 156 226 | 
             
                requirements:
         | 
| 157 227 | 
             
                - - "~>"
         | 
| 158 228 | 
             
                  - !ruby/object:Gem::Version
         | 
| 159 | 
            -
                    version: '0'
         | 
| 229 | 
            +
                    version: '13.0'
         | 
| 160 230 | 
             
              type: :development
         | 
| 161 231 | 
             
              prerelease: false
         | 
| 162 232 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 163 233 | 
             
                requirements:
         | 
| 164 234 | 
             
                - - "~>"
         | 
| 165 235 | 
             
                  - !ruby/object:Gem::Version
         | 
| 166 | 
            -
                    version: '0'
         | 
| 236 | 
            +
                    version: '13.0'
         | 
| 167 237 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 168 238 | 
             
              name: rubygems-tasks
         | 
| 169 239 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 170 240 | 
             
                requirements:
         | 
| 171 241 | 
             
                - - "~>"
         | 
| 172 242 | 
             
                  - !ruby/object:Gem::Version
         | 
| 173 | 
            -
                    version: '0. | 
| 243 | 
            +
                    version: '0.2'
         | 
| 174 244 | 
             
              type: :development
         | 
| 175 245 | 
             
              prerelease: false
         | 
| 176 246 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 177 247 | 
             
                requirements:
         | 
| 178 248 | 
             
                - - "~>"
         | 
| 179 249 | 
             
                  - !ruby/object:Gem::Version
         | 
| 180 | 
            -
                    version: '0. | 
| 250 | 
            +
                    version: '0.2'
         | 
| 181 251 | 
             
            description: "\n    Mill provides a simple but useful static site generator.\n  "
         | 
| 182 252 | 
             
            email: johnl@johnlabovitz.com
         | 
| 183 253 | 
             
            executables:
         | 
| @@ -186,6 +256,7 @@ extensions: [] | |
| 186 256 | 
             
            extra_rdoc_files: []
         | 
| 187 257 | 
             
            files:
         | 
| 188 258 | 
             
            - ".gitignore"
         | 
| 259 | 
            +
            - Gemfile
         | 
| 189 260 | 
             
            - LICENSE
         | 
| 190 261 | 
             
            - README.md
         | 
| 191 262 | 
             
            - Rakefile
         | 
| @@ -209,11 +280,17 @@ files: | |
| 209 280 | 
             
            - lib/mill/site.rb
         | 
| 210 281 | 
             
            - lib/mill/version.rb
         | 
| 211 282 | 
             
            - mill.gemspec
         | 
| 283 | 
            +
            - test/content/a.md
         | 
| 284 | 
            +
            - test/content/b/ba.md
         | 
| 285 | 
            +
            - test/content/b/bb.md
         | 
| 286 | 
            +
            - test/content/b/index.md
         | 
| 287 | 
            +
            - test/content/index.md
         | 
| 288 | 
            +
            - test/test.rb
         | 
| 212 289 | 
             
            homepage: http://github.com/jslabovitz/mill
         | 
| 213 290 | 
             
            licenses:
         | 
| 214 291 | 
             
            - MIT
         | 
| 215 292 | 
             
            metadata: {}
         | 
| 216 | 
            -
            post_install_message: | 
| 293 | 
            +
            post_install_message:
         | 
| 217 294 | 
             
            rdoc_options: []
         | 
| 218 295 | 
             
            require_paths:
         | 
| 219 296 | 
             
            - lib
         | 
| @@ -228,9 +305,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 228 305 | 
             
                - !ruby/object:Gem::Version
         | 
| 229 306 | 
             
                  version: '0'
         | 
| 230 307 | 
             
            requirements: []
         | 
| 231 | 
            -
             | 
| 232 | 
            -
             | 
| 233 | 
            -
            signing_key: 
         | 
| 308 | 
            +
            rubygems_version: 3.2.3
         | 
| 309 | 
            +
            signing_key:
         | 
| 234 310 | 
             
            specification_version: 4
         | 
| 235 311 | 
             
            summary: A simple but useful static site generator.
         | 
| 236 | 
            -
            test_files: | 
| 312 | 
            +
            test_files:
         | 
| 313 | 
            +
            - test/content/a.md
         | 
| 314 | 
            +
            - test/content/b/ba.md
         | 
| 315 | 
            +
            - test/content/b/bb.md
         | 
| 316 | 
            +
            - test/content/b/index.md
         | 
| 317 | 
            +
            - test/content/index.md
         | 
| 318 | 
            +
            - test/test.rb
         |