diff options
author | Rémy Coutable <remy@rymai.me> | 2017-01-06 14:30:19 +0300 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2017-01-18 18:38:34 +0300 |
commit | b4f67cc2294f262d35fe63cc1e60eccebc4667ac (patch) | |
tree | 34b125dee583f517f4fe4d8e6e0148d06a3f68fc /lib/gitlab/view | |
parent | 5e9196b3bcc31ce7fd698ed49af5d39eae1da630 (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.rb | 32 | ||||
-rw-r--r-- | lib/gitlab/view/presenter_factory.rb | 39 |
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 |