Sha256: e71647e8d5393d382c6a02c24c2b59de711704908c9cbfb87d28a24ade18680b

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

# frozen_string_literal: true

require "time"
require "date"
require "digest"

module CompactIndex
  class VersionsFile
    def initialize(file = nil)
      @path = file || "/versions.list"
    end

    def contents(gems = nil, args = {})
      gems = calculate_info_checksums(gems) if args.delete(:calculate_info_checksums) { false }

      raise ArgumentError, "Unknown options: #{args.keys.join(", ")}" unless args.empty?

      File.read(@path).tap do |out|
        out << gem_lines(gems) if gems
      end
    end

    def updated_at
      created_at_header(@path) || Time.at(0).to_datetime
    end

    def create(gems, timestamp = Time.now.iso8601)
      gems.sort!

      File.open(@path, "w") do |io|
        io.write "created_at: #{timestamp}\n---\n"
        io.write gem_lines(gems)
      end
    end

  private

    def gem_lines(gems)
      gems.reduce(+"") do |lines, gem|
        version_numbers = gem.versions.map(&:number_and_platform).join(",")
        lines << gem.name <<
          " " << version_numbers <<
          " #{gem.versions.last.info_checksum}\n"
      end
    end

    def calculate_info_checksums(gems)
      gems.each do |gem|
        info_checksum = Digest::MD5.hexdigest(CompactIndex.info(gem[:versions]))
        gem[:versions].last[:info_checksum] = info_checksum
      end
    end

    def created_at_header(path)
      return unless File.exist? path

      File.open(path) do |file|
        file.each_line do |line|
          line.match(/created_at: (.*)\n|---\n/) do |match|
            return match[1] && DateTime.parse(match[1])
          end
        end
      end

      nil
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
compact_index-0.15.0 lib/compact_index/versions_file.rb