Add basic representations for the Github API results

parent fc42f3df
module Github
module Representation
class Base
def initialize(raw)
@raw = raw
end
private
attr_reader :raw
end
end
end
module Github
module Representation
class Branch < Representation::Base
attr_reader :repository
def initialize(repository, raw)
@repository = repository
@raw = raw
end
def user
raw.dig('user', 'login') || 'unknown'
end
def repo
return @repo if defined?(@repo)
@repo = Github::Representation::Repo.new(raw['repo']) if raw['repo'].present?
end
def ref
raw['ref']
end
def sha
raw['sha']
end
def short_sha
Commit.truncate_sha(sha)
end
def exists?
branch_exists? && commit_exists?
end
def valid?
sha.present? && ref.present?
end
private
def branch_exists?
repository.branch_exists?(ref)
end
def commit_exists?
repository.branch_names_contains(sha).include?(ref)
end
end
end
end
module Github
module Representation
class Label < Representation::Base
def color
"##{raw['color']}"
end
def title
raw['name']
end
def url
raw['url']
end
end
end
end
module Github
module Representation
class Milestone < Representation::Base
def iid
raw['number']
end
def title
raw['title']
end
def description
raw['description']
end
def due_date
raw['due_on']
end
def state
raw['state'] == 'closed' ? 'closed' : 'active'
end
def url
raw['url']
end
def created_at
raw['created_at']
end
def updated_at
raw['updated_at']
end
end
end
end
module Github
module Representation
class PullRequest < Representation::Base
attr_reader :project
delegate :user, :repo, :ref, :sha, to: :source_branch, prefix: true
delegate :user, :exists?, :repo, :ref, :sha, :short_sha, to: :target_branch, prefix: true
def initialize(project, raw)
@project = project
@raw = raw
end
def iid
raw['number']
end
def title
raw['title']
end
def description
raw['body'] || ''
end
def source_project
project
end
def source_branch_exists?
!cross_project? && source_branch.exists?
end
def source_branch_name
@source_branch_name ||=
if cross_project? || !source_branch_exists?
source_branch_name_prefixed
else
source_branch_ref
end
end
def target_project
project
end
def target_branch_name
@target_branch_name ||= target_branch_exists? ? target_branch_ref : target_branch_name_prefixed
end
def milestone
return unless raw['milestone'].present?
@milestone ||= Github::Representation::Milestone.new(raw['milestone'])
end
def author
@author ||= Github::Representation::User.new(raw['user'])
end
def assignee
return unless assigned?
@assignee ||= Github::Representation::User.new(raw['assignee'])
end
def state
return 'merged' if raw['state'] == 'closed' && raw['merged_at'].present?
return 'closed' if raw['state'] == 'closed'
'opened'
end
def url
raw['url']
end
def created_at
raw['created_at']
end
def updated_at
raw['updated_at']
end
def assigned?
raw['assignee'].present?
end
def opened?
state == 'opened'
end
def valid?
source_branch.valid? && target_branch.valid?
end
private
def source_branch
@source_branch ||= Representation::Branch.new(project.repository, raw['head'])
end
def source_branch_name_prefixed
"gh-#{target_branch_short_sha}/#{iid}/#{source_branch_user}/#{source_branch_ref}"
end
def target_branch
@target_branch ||= Representation::Branch.new(project.repository, raw['base'])
end
def target_branch_name_prefixed
"gl-#{target_branch_short_sha}/#{iid}/#{target_branch_user}/#{target_branch_ref}"
end
def cross_project?
return true if source_branch_repo.nil?
source_branch_repo.id != target_branch_repo.id
end
end
end
end
module Github
module Representation
class Repo < Representation::Base
def id
raw['id']
end
end
end
end
module Github
module Representation
class User < Representation::Base
def id
raw['id']
end
def email
return @email if defined?(@email)
@email = Github::User.new(username).get.fetch('email', nil)
end
def username
raw['login']
end
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment