summaryrefslogtreecommitdiff
path: root/lib/github/representation
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2017-04-11 22:34:59 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2017-04-24 16:17:52 -0300
commitb43ecca9060b3d7ffd84d700caecf5f35fd403a9 (patch)
tree8b23af77d44d2dc854aff7d68179b63867bf5436 /lib/github/representation
parentfc42f3dffa364a360c76ff2785813d74f42016c7 (diff)
downloadgitlab-ce-b43ecca9060b3d7ffd84d700caecf5f35fd403a9.tar.gz
Add basic representations for the Github API results
Diffstat (limited to 'lib/github/representation')
-rw-r--r--lib/github/representation/base.rb13
-rw-r--r--lib/github/representation/branch.rb52
-rw-r--r--lib/github/representation/label.rb17
-rw-r--r--lib/github/representation/milestone.rb37
-rw-r--r--lib/github/representation/pull_request.rb123
-rw-r--r--lib/github/representation/repo.rb9
-rw-r--r--lib/github/representation/user.rb19
7 files changed, 270 insertions, 0 deletions
diff --git a/lib/github/representation/base.rb b/lib/github/representation/base.rb
new file mode 100644
index 00000000000..6765bfb803b
--- /dev/null
+++ b/lib/github/representation/base.rb
@@ -0,0 +1,13 @@
+module Github
+ module Representation
+ class Base
+ def initialize(raw)
+ @raw = raw
+ end
+
+ private
+
+ attr_reader :raw
+ end
+ end
+end
diff --git a/lib/github/representation/branch.rb b/lib/github/representation/branch.rb
new file mode 100644
index 00000000000..7c65a948ede
--- /dev/null
+++ b/lib/github/representation/branch.rb
@@ -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
diff --git a/lib/github/representation/label.rb b/lib/github/representation/label.rb
new file mode 100644
index 00000000000..b3140ab76fc
--- /dev/null
+++ b/lib/github/representation/label.rb
@@ -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
diff --git a/lib/github/representation/milestone.rb b/lib/github/representation/milestone.rb
new file mode 100644
index 00000000000..5ea54eb178f
--- /dev/null
+++ b/lib/github/representation/milestone.rb
@@ -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
diff --git a/lib/github/representation/pull_request.rb b/lib/github/representation/pull_request.rb
new file mode 100644
index 00000000000..85f4e1bdac3
--- /dev/null
+++ b/lib/github/representation/pull_request.rb
@@ -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
diff --git a/lib/github/representation/repo.rb b/lib/github/representation/repo.rb
new file mode 100644
index 00000000000..b9cae43450e
--- /dev/null
+++ b/lib/github/representation/repo.rb
@@ -0,0 +1,9 @@
+module Github
+ module Representation
+ class Repo < Representation::Base
+ def id
+ raw['id']
+ end
+ end
+ end
+end
diff --git a/lib/github/representation/user.rb b/lib/github/representation/user.rb
new file mode 100644
index 00000000000..70a0ce000ae
--- /dev/null
+++ b/lib/github/representation/user.rb
@@ -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