Sha256: 692c6ad37df28386ce37ec2d624326d77aea0ece97329ce9fad99319ac5722a9

Contents?: true

Size: 1.49 KB

Versions: 1

Compression:

Stored size: 1.49 KB

Contents

require "massive_sitemap/builder/base"
# writer only has print and puts as interface

module MassiveSitemap
  module Builder
    class Rotating < Base
      NUM_URLS = 1..50_000

      OPTS = Base::OPTS.merge(
        :max_per_sitemap => NUM_URLS.max
      )

      def initialize(writer, options = {}, &block)
        @rotations = 0
        @urls      = 0

        if options[:max_per_sitemap] && !NUM_URLS.member?(options[:max_per_sitemap])
          raise ArgumentError, %Q(":max_per_sitemap" must be greater than #{NUM_URLS.min} and smaller than #{NUM_URLS.max})
        end

        super
      end

      # On rotation, close current file, and reopen a new one
      # with same file name but -<counter> appendend
      def init!(&block)
        unless @writer.inited?
          @urls    = 0
          filename = filename_with_rotation(@writer.options[:filename], @rotations)
          @rotations += 1
          @writer.init! :filename => filename
          header!(&block)
        end
      end

      def add_url!(location, attrs = {})
        if @urls >= @options[:max_per_sitemap]
          close!
        end
        super
        @urls += 1
      end

      private
      def filename_with_rotation(filename, rotation = nil)
        filename, _, ext = split_filename(filename)
        rotation = (rotation.to_i > 0) ? "-#{rotation}" : nil
        [filename, rotation, ext].join
      end

      def split_filename(filename)
        filename.to_s.scan(/^([^.]*?)(-[0-9]+)?(\..+)?$/).flatten
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
massive_sitemap-2.0.0.rc3 lib/massive_sitemap/builder/rotating.rb