Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Léo-Paul Géneau
gitlab-ce
Commits
6d8e102c
Commit
6d8e102c
authored
Aug 23, 2017
by
Tiago Botelho
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adds cacheless render to Banzai object render
parent
dd7434e3
Changes
27
Hide whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
268 additions
and
94 deletions
+268
-94
app/controllers/concerns/renders_commit_description.rb
app/controllers/concerns/renders_commit_description.rb
+0
-7
app/controllers/concerns/renders_commits.rb
app/controllers/concerns/renders_commits.rb
+7
-0
app/controllers/projects/commits_controller.rb
app/controllers/projects/commits_controller.rb
+3
-0
app/controllers/projects/compare_controller.rb
app/controllers/projects/compare_controller.rb
+2
-1
app/controllers/projects/merge_requests/creations_controller.rb
...ntrollers/projects/merge_requests/creations_controller.rb
+2
-1
app/controllers/projects/merge_requests_controller.rb
app/controllers/projects/merge_requests_controller.rb
+2
-1
app/controllers/search_controller.rb
app/controllers/search_controller.rb
+7
-0
app/helpers/markup_helper.rb
app/helpers/markup_helper.rb
+18
-12
app/models/commit.rb
app/models/commit.rb
+9
-0
app/views/projects/blame/show.html.haml
app/views/projects/blame/show.html.haml
+1
-1
app/views/projects/branches/_commit.html.haml
app/views/projects/branches/_commit.html.haml
+1
-1
app/views/projects/commits/_commit.html.haml
app/views/projects/commits/_commit.html.haml
+3
-2
app/views/projects/commits/_inline_commit.html.haml
app/views/projects/commits/_inline_commit.html.haml
+1
-1
app/views/projects/deployments/_commit.html.haml
app/views/projects/deployments/_commit.html.haml
+1
-1
app/views/projects/tree/_tree_commit_column.html.haml
app/views/projects/tree/_tree_commit_column.html.haml
+1
-1
app/views/shared/notes/_note.html.haml
app/views/shared/notes/_note.html.haml
+2
-2
app/views/shared/projects/_project.html.haml
app/views/shared/projects/_project.html.haml
+1
-2
changelogs/unreleased/34509-improves-markdown-rendering-performance-for-commits-list.yml
...roves-markdown-rendering-performance-for-commits-list.yml
+5
-0
config/initializers/8_metrics.rb
config/initializers/8_metrics.rb
+0
-3
lib/banzai/commit_description_renderer.rb
lib/banzai/commit_description_renderer.rb
+0
-7
lib/banzai/commit_renderer.rb
lib/banzai/commit_renderer.rb
+11
-0
lib/banzai/object_renderer.rb
lib/banzai/object_renderer.rb
+1
-1
lib/banzai/renderer.rb
lib/banzai/renderer.rb
+4
-0
spec/helpers/markup_helper_spec.rb
spec/helpers/markup_helper_spec.rb
+85
-6
spec/lib/banzai/commit_renderer_spec.rb
spec/lib/banzai/commit_renderer_spec.rb
+19
-0
spec/lib/banzai/object_renderer_spec.rb
spec/lib/banzai/object_renderer_spec.rb
+57
-33
spec/lib/banzai/renderer_spec.rb
spec/lib/banzai/renderer_spec.rb
+25
-11
No files found.
app/controllers/concerns/renders_commit_description.rb
deleted
100644 → 0
View file @
dd7434e3
module
RendersCommitDescription
def
prepare_commit_descriptions_for_rendering
(
commit_descriptions
)
Banzai
::
CommitDescriptionRenderer
.
render
(
commit_descriptions
,
@project
,
current_user
)
commit_descriptions
end
end
app/controllers/concerns/renders_commits.rb
0 → 100644
View file @
6d8e102c
module
RendersCommits
def
prepare_commits_for_rendering
(
commits
)
Banzai
::
CommitRenderer
.
render
(
commits
,
@project
,
current_user
)
commits
end
end
app/controllers/projects/commits_controller.rb
View file @
6d8e102c
...
...
@@ -2,6 +2,7 @@ require "base64"
class
Projects::CommitsController
<
Projects
::
ApplicationController
include
ExtractsPath
include
RendersCommits
before_action
:require_non_empty_project
before_action
:assign_ref_vars
...
...
@@ -56,5 +57,7 @@ class Projects::CommitsController < Projects::ApplicationController
else
@repository
.
commits
(
@ref
,
path:
@path
,
limit:
@limit
,
offset:
@offset
)
end
@commits
=
prepare_commits_for_rendering
(
@commits
)
end
end
app/controllers/projects/compare_controller.rb
View file @
6d8e102c
...
...
@@ -3,6 +3,7 @@ require 'addressable/uri'
class
Projects::CompareController
<
Projects
::
ApplicationController
include
DiffForPath
include
DiffHelper
include
RendersCommits
# Authorize
before_action
:require_non_empty_project
...
...
@@ -50,7 +51,7 @@ class Projects::CompareController < Projects::ApplicationController
.
execute
(
@project
,
@start_ref
)
if
@compare
@commits
=
@compare
.
commits
@commits
=
prepare_commits_for_rendering
(
@compare
.
commits
)
@diffs
=
@compare
.
diffs
(
diff_options
)
environment_params
=
@repository
.
branch_exists?
(
@head_ref
)
?
{
ref:
@head_ref
}
:
{
commit:
@compare
.
commit
}
...
...
app/controllers/projects/merge_requests/creations_controller.rb
View file @
6d8e102c
class
Projects::MergeRequests::CreationsController
<
Projects
::
MergeRequests
::
ApplicationController
include
DiffForPath
include
DiffHelper
include
RendersCommits
skip_before_action
:merge_request
skip_before_action
:ensure_ref_fetched
...
...
@@ -107,7 +108,7 @@ class Projects::MergeRequests::CreationsController < Projects::MergeRequests::Ap
@target_project
=
@merge_request
.
target_project
@source_project
=
@merge_request
.
source_project
@commits
=
@merge_request
.
commits
@commits
=
prepare_commits_for_rendering
(
@merge_request
.
commits
)
@commit
=
@merge_request
.
diff_head_commit
@note_counts
=
Note
.
where
(
commit_id:
@commits
.
map
(
&
:id
))
...
...
app/controllers/projects/merge_requests_controller.rb
View file @
6d8e102c
...
...
@@ -2,6 +2,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
include
ToggleSubscriptionAction
include
IssuableActions
include
RendersNotes
include
RendersCommits
include
ToggleAwardEmoji
include
IssuableCollections
...
...
@@ -94,7 +95,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
def
commits
# Get commits from repository
# or from cache if already merged
@commits
=
@merge_request
.
commits
@commits
=
prepare_commits_for_rendering
(
@merge_request
.
commits
)
@note_counts
=
Note
.
where
(
commit_id:
@commits
.
map
(
&
:id
))
.
group
(
:commit_id
).
count
...
...
app/controllers/search_controller.rb
View file @
6d8e102c
...
...
@@ -2,6 +2,7 @@ class SearchController < ApplicationController
skip_before_action
:authenticate_user!
include
SearchHelper
include
RendersCommits
layout
'search'
...
...
@@ -20,6 +21,8 @@ class SearchController < ApplicationController
@search_results
=
search_service
.
search_results
@search_objects
=
search_service
.
search_objects
render_commits
if
@scope
==
'commits'
check_single_commit_result
end
...
...
@@ -38,6 +41,10 @@ class SearchController < ApplicationController
private
def
render_commits
@search_objects
=
prepare_commits_for_rendering
(
@search_objects
)
end
def
check_single_commit_result
if
@search_results
.
single_commit_result?
only_commit
=
@search_results
.
objects
(
'commits'
).
first
...
...
app/helpers/markup_helper.rb
View file @
6d8e102c
...
...
@@ -21,25 +21,28 @@ module MarkupHelper
end
# Use this in places where you would normally use link_to(gfm(...), ...).
#
def
link_to_markdown
(
body
,
url
,
html_options
=
{})
return
''
if
body
.
blank?
link_to_html
(
markdown
(
body
,
pipeline: :single_line
),
url
,
html_options
)
end
def
link_to_markdown_field
(
object
,
field
,
url
,
html_options
=
{})
rendered_field
=
markdown_field
(
object
,
field
)
link_to_html
(
rendered_field
,
url
,
html_options
)
end
# It solves a problem occurring with nested links (i.e.
# "<a>outer text <a>gfm ref</a> more outer text</a>"). This will not be
# interpreted as intended. Browsers will parse something like
# "<a>outer text </a><a>gfm ref</a> more outer text" (notice the last part is
# not linked any more). link_to_
gfm
corrects that. It wraps all parts to
# not linked any more). link_to_
html
corrects that. It wraps all parts to
# explicitly produce the correct linking behavior (i.e.
# "<a>outer text </a><a>gfm ref</a><a> more outer text</a>").
def
link_to_
gfm
(
body
,
url
,
html_options
=
{})
return
''
if
body
.
blank?
def
link_to_
html
(
redacted
,
url
,
html_options
=
{})
fragment
=
Nokogiri
::
HTML
::
DocumentFragment
.
parse
(
redacted
)
context
=
{
project:
@project
,
current_user:
(
current_user
if
defined?
(
current_user
)),
pipeline: :single_line
}
gfm_body
=
Banzai
.
render
(
body
,
context
)
fragment
=
Nokogiri
::
HTML
::
DocumentFragment
.
parse
(
gfm_body
)
if
fragment
.
children
.
size
==
1
&&
fragment
.
children
[
0
].
name
==
'a'
# Fragment has only one node, and it's a link generated by `gfm`.
# Replace it with our requested link.
...
...
@@ -82,7 +85,10 @@ module MarkupHelper
def
markdown_field
(
object
,
field
)
object
=
object
.
for_display
if
object
.
respond_to?
(
:for_display
)
redacted_field_html
=
object
.
try
(
:"redacted_
#{
field
}
_html"
)
return
''
unless
object
.
present?
return
redacted_field_html
if
redacted_field_html
html
=
Banzai
.
render_field
(
object
,
field
)
prepare_for_rendering
(
html
,
object
.
banzai_render_context
(
field
))
...
...
app/models/commit.rb
View file @
6d8e102c
...
...
@@ -16,6 +16,8 @@ class Commit
participant
:notes_with_associations
attr_accessor
:project
,
:author
attr_accessor
:redacted_description_html
attr_accessor
:redacted_title_html
DIFF_SAFE_LINES
=
Gitlab
::
Git
::
DiffCollection
::
DEFAULT_LIMITS
[
:max_lines
]
...
...
@@ -26,6 +28,13 @@ class Commit
# The SHA can be between 7 and 40 hex characters.
COMMIT_SHA_PATTERN
=
'\h{7,40}'
.
freeze
def
banzai_render_context
(
field
)
context
=
{
pipeline: :single_line
,
project:
self
.
project
}
context
[
:author
]
=
self
.
author
if
self
.
author
context
end
class
<<
self
def
decorate
(
commits
,
project
)
commits
.
map
do
|
commit
|
...
...
app/views/projects/blame/show.html.haml
View file @
6d8e102c
...
...
@@ -22,7 +22,7 @@
=
author_avatar
(
commit
,
size:
36
)
.commit-row-title
%span
.item-title.str-truncated-100
=
link_to_
gfm
commit
.
title
,
project_commit_path
(
@project
,
commit
.
id
),
class:
"cdark"
,
title:
commit
.
title
=
link_to_
markdown
commit
.
title
,
project_commit_path
(
@project
,
commit
.
id
),
class:
"cdark"
,
title:
commit
.
title
.pull-right
=
link_to
commit
.
short_id
,
project_commit_path
(
@project
,
commit
),
class:
"commit-sha"
...
...
app/views/projects/branches/_commit.html.haml
View file @
6d8e102c
...
...
@@ -4,6 +4,6 @@
=
link_to
commit
.
short_id
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-sha"
·
%span
.str-truncated
=
link_to_
gfm
commit
.
title
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-row-message"
=
link_to_
markdown
commit
.
title
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-row-message"
·
#{
time_ago_with_tooltip
(
commit
.
committed_date
)
}
app/views/projects/commits/_commit.html.haml
View file @
6d8e102c
...
...
@@ -16,7 +16,7 @@
.commit-detail
.commit-content
=
link_to_
gfm
commit
.
title
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-row-message item-title"
=
link_to_
markdown_field
(
commit
,
:title
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-row-message item-title"
)
%span
.commit-row-message.visible-xs-inline
·
=
commit
.
short_id
...
...
@@ -28,7 +28,8 @@
-
if
commit
.
description?
%pre
.commit-row-description.js-toggle-content
=
preserve
(
markdown
(
commit
.
description
,
pipeline: :single_line
,
author:
commit
.
author
))
=
preserve
(
markdown_field
(
commit
,
:description
))
.commiter
-
commit_author_link
=
commit_author_link
(
commit
,
avatar:
false
,
size:
24
)
-
commit_timeago
=
time_ago_with_tooltip
(
commit
.
committed_date
)
...
...
app/views/projects/commits/_inline_commit.html.haml
View file @
6d8e102c
...
...
@@ -3,6 +3,6 @@
=
link_to
commit
.
short_id
,
project_commit_path
(
project
,
commit
),
class:
"commit-sha"
%span
.str-truncated
=
link_to_
gfm
commit
.
title
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-row-message"
=
link_to_
markdown_field
(
commit
,
:title
,
project_commit_path
(
project
,
commit
.
id
),
class:
"commit-row-message"
)
.pull-right
#{
time_ago_with_tooltip
(
commit
.
committed_date
)
}
app/views/projects/deployments/_commit.html.haml
View file @
6d8e102c
...
...
@@ -12,6 +12,6 @@
%span
.flex-truncate-child
-
if
commit_title
=
deployment
.
commit_title
=
author_avatar
(
deployment
.
commit
,
size:
20
)
=
link_to_
gfm
commit_title
,
project_commit_path
(
@project
,
deployment
.
sha
),
class:
"commit-row-message"
=
link_to_
markdown
commit_title
,
project_commit_path
(
@project
,
deployment
.
sha
),
class:
"commit-row-message"
-
else
Cant find HEAD commit for this branch
app/views/projects/tree/_tree_commit_column.html.haml
View file @
6d8e102c
%span
.str-truncated
=
link_to_
gfm
commit
.
full_title
,
project_commit_path
(
@project
,
commit
.
id
),
class:
"tree-commit-link"
=
link_to_
markdown
commit
.
full_title
,
project_commit_path
(
@project
,
commit
.
id
),
class:
"tree-commit-link"
app/views/shared/notes/_note.html.haml
View file @
6d8e102c
...
...
@@ -28,7 +28,7 @@
commented
-
if
note
.
system
%span
.system-note-message
=
note
.
redacted_note_html
=
markdown_field
(
note
,
:note
)
%a
{
href:
"##{dom_id(note)}"
}
=
time_ago_with_tooltip
(
note
.
created_at
,
placement:
'bottom'
,
html_class:
'note-created-ago'
)
-
unless
note
.
system?
...
...
@@ -39,7 +39,7 @@
=
render
'projects/notes/actions'
,
note:
note
,
note_editable:
note_editable
.note-body
{
class:
note_editable
?
'js-task-list-container'
:
''
}
.note-text.md
=
note
.
redacted_note_html
=
markdown_field
(
note
,
:note
)
=
edited_time_ago_with_tooltip
(
note
,
placement:
'bottom'
,
html_class:
'note_edited_ago'
)
.original-note-content.hidden
{
data:
{
post_url:
note_url
(
note
),
target_id:
note
.
noteable
.
id
,
target_type:
note
.
noteable
.
class
.
name
.
underscore
}
}
#{
note
.
note
}
...
...
app/views/shared/projects/_project.html.haml
View file @
6d8e102c
...
...
@@ -31,8 +31,7 @@
-
if
show_last_commit_as_description
.description.prepend-top-5
=
link_to_gfm
project
.
commit
.
title
,
project_commit_path
(
project
,
project
.
commit
),
class:
"commit-row-message"
=
link_to_markdown
(
project
.
commit
.
title
,
project_commit_path
(
project
,
project
.
commit
),
class:
"commit-row-message"
)
-
elsif
project
.
description
.
present?
.description.prepend-top-5
=
markdown_field
(
project
,
:description
)
...
...
changelogs/unreleased/34509-improves-markdown-rendering-performance-for-commits-list.yml
0 → 100644
View file @
6d8e102c
---
title
:
Improves markdown rendering performance for commit lists.
merge_request
:
author
:
type
:
other
config/initializers/8_metrics.rb
View file @
6d8e102c
...
...
@@ -114,9 +114,6 @@ def instrument_classes(instrumentation)
# This is a Rails scope so we have to instrument it manually.
instrumentation
.
instrument_method
(
Project
,
:visible_to_user
)
# Needed for https://gitlab.com/gitlab-org/gitlab-ce/issues/34509
instrumentation
.
instrument_method
(
MarkupHelper
,
:link_to_gfm
)
# Needed for https://gitlab.com/gitlab-org/gitlab-ce/issues/30224#note_32306159
instrumentation
.
instrument_instance_method
(
MergeRequestDiff
,
:load_commits
)
...
...
lib/banzai/commit_description_renderer.rb
deleted
100644 → 0
View file @
dd7434e3
module
Banzai
module
CommitDescriptionRenderer
def
self
.
render
(
commit_descriptions
,
project
,
user
=
nil
)
ObjectRenderer
.
new
(
project
,
user
).
render
(
commit_descriptions
,
:commit_description
)
end
end
end
lib/banzai/commit_renderer.rb
0 → 100644
View file @
6d8e102c
module
Banzai
module
CommitRenderer
ATTRIBUTES
=
[
:description
,
:title
].
freeze
def
self
.
render
(
commits
,
project
,
user
=
nil
)
obj_renderer
=
ObjectRenderer
.
new
(
project
,
user
)
ATTRIBUTES
.
each
{
|
attr
|
obj_renderer
.
render
(
commits
,
attr
)
}
end
end
end
lib/banzai/object_renderer.rb
View file @
6d8e102c
...
...
@@ -38,7 +38,7 @@ module Banzai
objects
.
each_with_index
do
|
object
,
index
|
redacted_data
=
redacted
[
index
]
object
.
__send__
(
"redacted_
#{
attribute
}
_html="
,
redacted_data
[
:document
].
to_html
.
html_safe
)
# rubocop:disable GitlabSecurity/PublicSend
object
.
user_visible_reference_count
=
redacted_data
[
:visible_reference_count
]
object
.
user_visible_reference_count
=
redacted_data
[
:visible_reference_count
]
if
object
.
respond_to?
(
:user_visible_reference_count
)
end
end
...
...
lib/banzai/renderer.rb
View file @
6d8e102c
...
...
@@ -36,6 +36,10 @@ module Banzai
# The context to use is managed by the object and cannot be changed.
# Use #render, passing it the field text, if a custom rendering is needed.
def
self
.
render_field
(
object
,
field
)
unless
object
.
respond_to?
(
:cached_markdown_fields
)
return
cacheless_render_field
(
object
,
field
)
end
object
.
refresh_markdown_cache!
(
do_update:
update_object?
(
object
))
unless
object
.
cached_html_up_to_date?
(
field
)
object
.
cached_html_for
(
field
)
...
...
spec/helpers/markup_helper_spec.rb
View file @
6d8e102c
...
...
@@ -52,12 +52,71 @@ describe MarkupHelper do
end
end
describe
'#link_to_gfm'
do
describe
'#markdown_field'
do
let
(
:attribute
)
{
:title
}
describe
'with already redacted attribute'
do
it
'returns the redacted attribute'
do
commit
.
redacted_title_html
=
'commit title'
expect
(
Banzai
).
not_to
receive
(
:render_field
)
expect
(
helper
.
markdown_field
(
commit
,
attribute
)).
to
eq
(
'commit title'
)
end
end
describe
'without redacted attribute'
do
it
'renders the markdown value'
do
expect
(
Banzai
).
to
receive
(
:render_field
).
with
(
commit
,
attribute
).
and_call_original
helper
.
markdown_field
(
commit
,
attribute
)
end
end
end
describe
'#link_to_markdown_field'
do
let
(
:link
)
{
'/commits/0a1b2c3d'
}
let
(
:issues
)
{
create_list
(
:issue
,
2
,
project:
project
)
}
it
'handles references nested in links with all the text'
do
allow
(
commit
).
to
receive
(
:title
).
and_return
(
"This should finally fix
#{
issues
[
0
].
to_reference
}
and
#{
issues
[
1
].
to_reference
}
for real"
)
actual
=
helper
.
link_to_markdown_field
(
commit
,
:title
,
link
)
doc
=
Nokogiri
::
HTML
.
parse
(
actual
)
# Make sure we didn't create invalid markup
expect
(
doc
.
errors
).
to
be_empty
# Leading commit link
expect
(
doc
.
css
(
'a'
)[
0
].
attr
(
'href'
)).
to
eq
link
expect
(
doc
.
css
(
'a'
)[
0
].
text
).
to
eq
'This should finally fix '
# First issue link
expect
(
doc
.
css
(
'a'
)[
1
].
attr
(
'href'
))
.
to
eq
project_issue_path
(
project
,
issues
[
0
])
expect
(
doc
.
css
(
'a'
)[
1
].
text
).
to
eq
issues
[
0
].
to_reference
# Internal commit link
expect
(
doc
.
css
(
'a'
)[
2
].
attr
(
'href'
)).
to
eq
link
expect
(
doc
.
css
(
'a'
)[
2
].
text
).
to
eq
' and '
# Second issue link
expect
(
doc
.
css
(
'a'
)[
3
].
attr
(
'href'
))
.
to
eq
project_issue_path
(
project
,
issues
[
1
])
expect
(
doc
.
css
(
'a'
)[
3
].
text
).
to
eq
issues
[
1
].
to_reference
# Trailing commit link
expect
(
doc
.
css
(
'a'
)[
4
].
attr
(
'href'
)).
to
eq
link
expect
(
doc
.
css
(
'a'
)[
4
].
text
).
to
eq
' for real'
end
end
describe
'#link_to_markdown'
do
let
(
:link
)
{
'/commits/0a1b2c3d'
}
let
(
:issues
)
{
create_list
(
:issue
,
2
,
project:
project
)
}
it
'handles references nested in links with all the text'
do
actual
=
helper
.
link_to_
gfm
(
"This should finally fix
#{
issues
[
0
].
to_reference
}
and
#{
issues
[
1
].
to_reference
}
for real"
,
link
)
actual
=
helper
.
link_to_
markdown
(
"This should finally fix
#{
issues
[
0
].
to_reference
}
and
#{
issues
[
1
].
to_reference
}
for real"
,
link
)
doc
=
Nokogiri
::
HTML
.
parse
(
actual
)
# Make sure we didn't create invalid markup
...
...
@@ -87,7 +146,7 @@ describe MarkupHelper do
end
it
'forwards HTML options'
do
actual
=
helper
.
link_to_
gfm
(
"Fixed in
#{
commit
.
id
}
"
,
link
,
class:
'foo'
)
actual
=
helper
.
link_to_
markdown
(
"Fixed in
#{
commit
.
id
}
"
,
link
,
class:
'foo'
)
doc
=
Nokogiri
::
HTML
.
parse
(
actual
)
expect
(
doc
.
css
(
'a'
)).
to
satisfy
do
|
v
|
...
...
@@ -98,23 +157,43 @@ describe MarkupHelper do
it
"escapes HTML passed in as the body"
do
actual
=
"This is a <h1>test</h1> - see
#{
issues
[
0
].
to_reference
}
"
expect
(
helper
.
link_to_
gfm
(
actual
,
link
))
expect
(
helper
.
link_to_
markdown
(
actual
,
link
))
.
to
match
(
'<h1>test</h1>'
)
end
it
'ignores reference links when they are the entire body'
do
text
=
issues
[
0
].
to_reference
act
=
helper
.
link_to_
gfm
(
text
,
'/foo'
)
act
=
helper
.
link_to_
markdown
(
text
,
'/foo'
)
expect
(
act
).
to
eq
%Q(<a href="/foo">
#{
issues
[
0
].
to_reference
}
</a>)
end
it
'replaces commit message with emoji to link'
do
actual
=
link_to_
gfm
(
':book: Book'
,
'/foo'
)
actual
=
link_to_
markdown
(
':book: Book'
,
'/foo'
)
expect
(
actual
)
.
to
eq
'<gl-emoji title="open book" data-name="book" data-unicode-version="6.0">📖</gl-emoji><a href="/foo"> Book</a>'
end
end
describe
'#link_to_html'
do
it
'wraps the rendered content in a link'
do
link
=
'/commits/0a1b2c3d'
issue
=
create
(
:issue
,
project:
project
)
rendered
=
helper
.
markdown
(
"This should finally fix
#{
issue
.
to_reference
}
for real"
,
pipeline: :single_line
)
doc
=
Nokogiri
::
HTML
.
parse
(
rendered
)
expect
(
doc
.
css
(
'a'
)[
0
].
attr
(
'href'
))
.
to
eq
project_issue_path
(
project
,
issue
)
expect
(
doc
.
css
(
'a'
)[
0
].
text
).
to
eq
issue
.
to_reference
wrapped
=
helper
.
link_to_html
(
rendered
,
link
)
doc
=
Nokogiri
::
HTML
.
parse
(
wrapped
)
expect
(
doc
.
css
(
'a'
)[
0
].
attr
(
'href'
)).
to
eq
link
expect
(
doc
.
css
(
'a'
)[
0
].
text
).
to
eq
'This should finally fix '
end
end
describe
'#render_wiki_content'
do
before
do
@wiki
=
double
(
'WikiPage'
)
...
...
spec/lib/banzai/commit_renderer_spec.rb
0 → 100644
View file @
6d8e102c
require
'spec_helper'
describe
Banzai
::
CommitRenderer
do
describe
'.render'
do
it
'renders a commit description and title'
do
user
=
double
(
:user
)
project
=
create
(
:project
,
:repository
)
expect
(
Banzai
::
ObjectRenderer
).
to
receive
(
:new
).
with
(
project
,
user
).
and_call_original
described_class
::
ATTRIBUTES
.
each
do
|
attr
|
expect_any_instance_of
(
Banzai
::
ObjectRenderer
).
to
receive
(
:render
).
with
([
project
.
commit
],
attr
).
once
.
and_call_original
expect
(
Banzai
::
Renderer
).
to
receive
(
:cacheless_render_field
).
with
(
project
.
commit
,
attr
)
end
described_class
.
render
([
project
.
commit
],
project
,
user
)
end
end
end
spec/lib/banzai/object_renderer_spec.rb
View file @
6d8e102c
require
'spec_helper'
describe
Banzai
::
ObjectRenderer
do
let
(
:project
)
{
create
(
:project
)
}
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:user
)
{
project
.
owner
}
let
(
:renderer
)
{
described_class
.
new
(
project
,
user
,
custom_value:
'value'
)
}
let
(
:object
)
{
Note
.
new
(
note:
'hello'
,
note_html:
'<p dir="auto">hello</p>'
,
cached_markdown_version:
CacheMarkdownField
::
CACHE_VERSION
)
}
describe
'#render'
do
it
'renders and redacts an Array of objects'
do
renderer
.
render
([
object
],
:note
)
context
'with cache'
do
it
'renders and redacts an Array of objects'
do
renderer
.
render
([
object
],
:note
)
expect
(
object
.
redacted_note_html
).
to
eq
'<p dir="auto">hello</p>'
expect
(
object
.
user_visible_reference_count
).
to
eq
0
end
expect
(
object
.
redacted_note_html
).
to
eq
'<p dir="auto">hello</p>'
expect
(
object
.
user_visible_reference_count
).
to
eq
0
end
it
'calls Banzai::Redactor to perform redaction'
do
expect_any_instance_of
(
Banzai
::
Redactor
).
to
receive
(
:redact
).
and_call_original
it
'calls Banzai::Redactor to perform redaction'
do
expect_any_instance_of
(
Banzai
::
Redactor
).
to
receive
(
:redact
).
and_call_original
renderer
.
render
([
object
],
:note
)
end
renderer
.
render
([
object
],
:note
)
end
it
'retrieves field content using Banzai
.render_field'
do
expect
(
Banzai
).
to
receive
(
:render_field
).
with
(
object
,
:note
).
and_call_original
it
'retrieves field content using Banzai::Renderer
.render_field'
do
expect
(
Banzai
::
Renderer
).
to
receive
(
:render_field
).
with
(
object
,
:note
).
and_call_original
renderer
.
render
([
object
],
:note
)
end
renderer
.
render
([
object
],
:note
)
end
it
'passes context to PostProcessPipeline'
do
another_user
=
create
(
:user
)
another_project
=
create
(
:project
)
object
=
Note
.
new
(
note:
'hello'
,
note_html:
'hello'
,
author:
another_user
,
project:
another_project
)
expect
(
Banzai
::
Pipeline
::
PostProcessPipeline
).
to
receive
(
:to_document
).
with
(
anything
,
hash_including
(
skip_redaction:
true
,
current_user:
user
,
project:
another_project
,
it
'passes context to PostProcessPipeline'
do
another_user
=
create
(
:user
)
another_project
=
create
(
:project
)
object
=
Note
.
new
(
note:
'hello'
,
note_html:
'hello'
,
author:
another_user
,
custom_value:
'value'
project:
another_project
)
).
and_call_original
renderer
.
render
([
object
],
:note
)
expect
(
Banzai
::
Pipeline
::
PostProcessPipeline
).
to
receive
(
:to_document
).
with
(
anything
,
hash_including
(
skip_redaction:
true
,
current_user:
user
,
project:
another_project
,
author:
another_user
,
custom_value:
'value'
)
).
and_call_original
renderer
.
render
([
object
],
:note
)
end
end
context
'without cache'
do
let
(
:commit
)
{
project
.
commit
}
it
'renders and redacts an Array of objects'
do
renderer
.
render
([
commit
],
:title
)
expect
(
commit
.
redacted_title_html
).
to
eq
(
"Merge branch 'branch-merged' into 'master'"
)
end
it
'calls Banzai::Redactor to perform redaction'
do
expect_any_instance_of
(
Banzai
::
Redactor
).
to
receive
(
:redact
).
and_call_original
renderer
.
render
([
commit
],
:title
)
end
it
'retrieves field content using Banzai::Renderer.cacheless_render_field'
do
expect
(
Banzai
::
Renderer
).
to
receive
(
:cacheless_render_field
).
with
(
commit
,
:title
).
and_call_original
renderer
.
render
([
commit
],
:title
)
end
end
end
end
spec/lib/banzai/renderer_spec.rb
View file @
6d8e102c
...
...
@@ -4,6 +4,7 @@ describe Banzai::Renderer do
def
fake_object
(
fresh
:)
object
=
double
(
'object'
)
allow
(
object
).
to
receive
(
:respond_to?
).
with
(
:cached_markdown_fields
).
and_return
(
true
)
allow
(
object
).
to
receive
(
:cached_html_up_to_date?
).
with
(
:field
).
and_return
(
fresh
)
allow
(
object
).
to
receive
(
:cached_html_for
).
with
(
:field
).
and_return
(
'field_html'
)
...
...
@@ -12,25 +13,38 @@ describe Banzai::Renderer do
describe
'#render_field'
do
let
(
:renderer
)
{
described_class
}
subject
{
renderer
.
render_field
(
object
,
:field
)
}
context
'with
a stale
cache'
do
let
(
:
object
)
{
fake_object
(
fresh:
false
)
}
context
'with
out
cache'
do
let
(
:
commit
)
{
create
(
:project
,
:repository
).
commit
}
it
'
caches and returns the result
'
do
expect
(
object
).
to
receive
(
:refresh_markdown_cache!
).
with
(
do_update:
tru
e
)
it
'
returns cacheless render field
'
do
expect
(
renderer
).
to
receive
(
:cacheless_render_field
).
with
(
commit
,
:titl
e
)
is_expected
.
to
eq
(
'field_html'
)
renderer
.
render_field
(
commit
,
:title
)
end
end
context
'with
an up-to-date
cache'
do
let
(
:object
)
{
fake_object
(
fresh:
true
)
}
context
'with cache'
do
subject
{
renderer
.
render_field
(
object
,
:field
)
}
it
'uses th
e cache'
do
expect
(
object
).
to
receive
(
:refresh_markdown_cache!
).
never
context
'with a stal
e cache'
do
let
(
:object
)
{
fake_object
(
fresh:
false
)
}
is_expected
.
to
eq
(
'field_html'
)
it
'caches and returns the result'
do
expect
(
object
).
to
receive
(
:refresh_markdown_cache!
).
with
(
do_update:
true
)
is_expected
.
to
eq
(
'field_html'
)
end
end
context
'with an up-to-date cache'
do
let
(
:object
)
{
fake_object
(
fresh:
true
)
}
it
'uses the cache'
do
expect
(
object
).
to
receive
(
:refresh_markdown_cache!
).
never
is_expected
.
to
eq
(
'field_html'
)
end
end
end
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment