Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémy Coutable <remy@rymai.me>2017-01-06 14:30:19 +0300
committerRémy Coutable <remy@rymai.me>2017-01-18 18:38:34 +0300
commitb4f67cc2294f262d35fe63cc1e60eccebc4667ac (patch)
tree34b125dee583f517f4fe4d8e6e0148d06a3f68fc /lib/gitlab/view
parent5e9196b3bcc31ce7fd698ed49af5d39eae1da630 (diff)
Document presenters
Signed-off-by: Rémy Coutable <remy@rymai.me>
Diffstat (limited to 'lib/gitlab/view')
-rw-r--r--lib/gitlab/view/presenter.rb32
-rw-r--r--lib/gitlab/view/presenter_factory.rb39
2 files changed, 71 insertions, 0 deletions
diff --git a/lib/gitlab/view/presenter.rb b/lib/gitlab/view/presenter.rb
new file mode 100644
index 00000000000..8b63b271b99
--- /dev/null
+++ b/lib/gitlab/view/presenter.rb
@@ -0,0 +1,32 @@
+module Gitlab
+ module View
+ module Presenter
+ extend ActiveSupport::Concern
+
+ included do
+ include Gitlab::Routing
+ include Gitlab::Allowable
+ end
+
+ def with_subject(subject)
+ tap { @subject = subject }
+ end
+
+ def with_user(user)
+ tap { @user = user }
+ end
+
+ private
+
+ attr_reader :subject, :user
+
+ class_methods do
+ def presents(name)
+ define_method(name) do
+ subject
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/view/presenter_factory.rb b/lib/gitlab/view/presenter_factory.rb
new file mode 100644
index 00000000000..c8cab1249da
--- /dev/null
+++ b/lib/gitlab/view/presenter_factory.rb
@@ -0,0 +1,39 @@
+module Gitlab
+ module View
+ class PresenterFactory
+ def initialize(subject, user: nil)
+ @subject = subject
+ @user = user
+ end
+
+ def fabricate!
+ presenter =
+ if presenter_class.ancestors.include?(SimpleDelegator)
+ delegator_presenter
+ else
+ simple_presenter
+ end
+
+ presenter
+ .with_subject(subject)
+ .with_user(user)
+ end
+
+ private
+
+ attr_reader :subject, :user
+
+ def presenter_class
+ "#{subject.class.name.demodulize}Presenter".constantize
+ end
+
+ def delegator_presenter
+ presenter_class.new(subject)
+ end
+
+ def simple_presenter
+ presenter_class.new
+ end
+ end
+ end
+end