Sha256: 08b77d12b01c8ee57dbb506d09262950ebcd17b56f92cd5618dab2288be29765

Contents?: true

Size: 1.9 KB

Versions: 11

Compression:

Stored size: 1.9 KB

Contents

require "active_support/core_ext/object/deep_dup"

module MultiRepo::Helpers
  class ReadmeBadges
    attr_reader :repo, :dry_run
    attr_accessor :badges

    def initialize(repo, dry_run: false, **)
      @repo    = repo
      @dry_run = dry_run

      if repo.dry_run != dry_run
        raise ArgumentError, "expected repo.dry_run (#{repo.dry_run}) to match dry_run (#{dry_run})"
      end

      reload
    end

    def save!
      lines = content.lines

      apply_badges!(lines)
      save_contents!(lines.join)

      if dry_run
        reload(lines)
      else
        reload
      end

      true
    end

    def content
      return "" unless @file
      File.read(repo.path.join(@file))
    end

    private

    def reload(lines = nil)
      @file = repo.detect_readme_file if lines.nil?

      reload_badges(lines)
    end

    def reload_badges(lines)
      lines ||= content.lines
      @badges = extract_badges(lines)
      @original_badges = @badges.deep_dup
      @original_badge_indexes = @badges.map { |b| b["index"] }
    end

    def extract_badges(lines)
      lines.each.with_index.select do |l, _i|
        l.to_s.start_with?("[![")
      end.map do |l, i|
        match = l.match(/\A\[!\[(?<description>[^\]]+)\]\((?<image>[^\)]+)\)\]\((?<url>[^\)]+)\)/)
        match.named_captures.merge("index" => i)
      end
    end

    def build_badge_string(badge)
      "[![#{badge["description"]}](#{badge["image"]})](#{badge["url"]})\n"
    end

    def apply_badges!(lines)
      return if badges == @original_badges

      lines.reject!.with_index { |_l, i| @original_badge_indexes.include?(i) }

      start_index = @original_badge_indexes[0] || 2
      @badges.reverse_each do |b|
        lines.insert(start_index, build_badge_string(b))
      end
    end

    def save_contents!(contents)
      repo.rm_file("README")
      repo.rm_file("README.txt")
      repo.write_file("README.md", contents)
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
multi_repo-0.5.0 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.4.0 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.3.1 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.3.0 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.2.3 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.2.2 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.2.1 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.2.0 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.1.2 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.1.1 lib/multi_repo/helpers/readme_badges.rb
multi_repo-0.1.0 lib/multi_repo/helpers/readme_badges.rb