Add basic representations for the Github API results
This commit is contained in:
parent
fc42f3dffa
commit
b43ecca906
7 changed files with 270 additions and 0 deletions
13
lib/github/representation/base.rb
Normal file
13
lib/github/representation/base.rb
Normal file
|
@ -0,0 +1,13 @@
|
|||
module Github
|
||||
module Representation
|
||||
class Base
|
||||
def initialize(raw)
|
||||
@raw = raw
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
attr_reader :raw
|
||||
end
|
||||
end
|
||||
end
|
52
lib/github/representation/branch.rb
Normal file
52
lib/github/representation/branch.rb
Normal file
|
@ -0,0 +1,52 @@
|
|||
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
|
17
lib/github/representation/label.rb
Normal file
17
lib/github/representation/label.rb
Normal file
|
@ -0,0 +1,17 @@
|
|||
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
|
37
lib/github/representation/milestone.rb
Normal file
37
lib/github/representation/milestone.rb
Normal file
|
@ -0,0 +1,37 @@
|
|||
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
|
123
lib/github/representation/pull_request.rb
Normal file
123
lib/github/representation/pull_request.rb
Normal file
|
@ -0,0 +1,123 @@
|
|||
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
|
9
lib/github/representation/repo.rb
Normal file
9
lib/github/representation/repo.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
module Github
|
||||
module Representation
|
||||
class Repo < Representation::Base
|
||||
def id
|
||||
raw['id']
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
19
lib/github/representation/user.rb
Normal file
19
lib/github/representation/user.rb
Normal file
|
@ -0,0 +1,19 @@
|
|||
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
|
Loading…
Reference in a new issue