Strech/abak-flow

View on GitHub
lib/abak-flow/branch.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# coding: utf-8

module Abak::Flow
  class Branch
    FOLDER_HOTFIX  = "hotfix".freeze
    FOLDER_FEATURE = "feature".freeze
    TASK_FORMAT    = '\w+\-\d{1,}'.freeze
    MAGICK_WORDS   = %w{close closes closed fix fixes fixed
                        resolve resolves resolved}.freeze

    DEVELOPMENT = "develop".freeze
    MASTER      = "master".freeze

    MAPPING = {
      FOLDER_HOTFIX  => MASTER,
      FOLDER_FEATURE => DEVELOPMENT
    }.freeze

    attr_reader :folder
    attr_reader :task

    def initialize(branch)
      @branch = branch.is_a?(Git::Branch) ? branch
                                          : Manager.git.branch(branch)

      parse_branch_name
    end

    def name
      @branch.full
    end

    def message
      content = @branch.gcommit.message.split("\n", 2).first
      return content if content.length < 72

      content[0...72] << "..."
    end

    def to_s
      @branch.to_s
    end

    def compare_link(branch)
      diff = "#{Manager.repository.upstream.owner}:#{branch}...#{@branch}"

      File.join [
        Manager.github.web_endpoint,
        Manager.repository.origin.to_s,
        "compare", diff
      ]
    end

    def extract_base_name(options = Hash.new)
      mappable? ? MAPPING[folder]
                : options.fetch(:if_undef, name)
    end

    def extract_title
      tracker_task? ? task
                    : message
    end

    # TODO : Сделать настраевыемым трекер и формат задачи
    def extract_body
      return I18n.t("abak.flow.commands.publish.words.nothing") if
        tasks_from_commit_message.empty? && !tracker_task?

      [tasks_from_commit_message, task].flatten.compact.uniq
        .map { |x| "http://jira.railsc.ru/browse/#{x}" } * "\n"
    end

    def update
      origin = Manager.repository.origin.repo
      Manager.git.push(origin, @branch)
    end

    def delete_on_remote
      origin = Manager.repository.origin.repo
      Manager.git.push(origin, ":#{@branch}")
    end

    def delete_on_local
      @branch.delete
    end

    def develop?
      name == DEVELOPMENT
    end

    def master?
      name == MASTER
    end

    def hotfix?
      folder == FOLDER_HOTFIX
    end

    def feature?
      folder == FOLDER_FEATURE
    end

    def tracker_task?
      !(task =~ /^#{TASK_FORMAT}$/).nil?
    end

    def mappable?
      hotfix? || feature?
    end

    def current?
      @branch.current
    end

    def valid?
      !@branch.name.strip.empty?
    end

    private
    def tasks_from_commit_message
      @parsed_tasks ||=
        @branch.gcommit.contents
               .scan(/(?:#{MAGICK_WORDS * "|"})\s+(#{TASK_FORMAT})/i)
    end

    def parse_branch_name
      matches = name.match(/^(?<prefix>.+)\/(?<task>.+)$/)

      @folder, @task = matches.nil? ? [nil, nil]
                                    : [matches[:prefix], matches[:task]]
    end
  end
end