diff options
author | Felipe Artur <felipefac@gmail.com> | 2018-08-16 15:53:33 -0300 |
---|---|---|
committer | Felipe Artur <felipefac@gmail.com> | 2018-08-17 13:07:32 -0300 |
commit | c4032b4fe87d75c2a01b87ad77b3d06341a62470 (patch) | |
tree | 98798257f16160ba8a52bc5c5abeacf1e7003521 | |
parent | bba7504438d5cc4ea98500754c8d0a8b9ff1fc42 (diff) | |
download | gitlab-ce-issue_48084.tar.gz |
Use a serializer to render diff linesissue_48084
-rw-r--r-- | app/controllers/projects/blob_controller.rb | 2 | ||||
-rw-r--r-- | app/serializers/diff_file_entity.rb | 4 | ||||
-rw-r--r-- | app/serializers/diff_line_entity.rb | 14 | ||||
-rw-r--r-- | app/serializers/diff_line_parallel_entity.rb | 6 | ||||
-rw-r--r-- | app/serializers/diff_line_serializer.rb | 5 | ||||
-rw-r--r-- | app/serializers/discussion_entity.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/diff/line.rb | 12 | ||||
-rw-r--r-- | spec/fixtures/api/schemas/entities/diff_line.json | 13 | ||||
-rw-r--r-- | spec/serializers/diff_line_serializer_spec.rb | 14 |
9 files changed, 59 insertions, 13 deletions
diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index ebc61264b39..56dafa31332 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -127,7 +127,7 @@ class Projects::BlobController < Projects::ApplicationController add_match_line - render json: @lines + render json: DiffLineSerializer.new.represent(@lines) end def add_match_line diff --git a/app/serializers/diff_file_entity.rb b/app/serializers/diff_file_entity.rb index 79844c9210a..2c967bdaff7 100644 --- a/app/serializers/diff_file_entity.rb +++ b/app/serializers/diff_file_entity.rb @@ -136,12 +136,12 @@ class DiffFileEntity < Grape::Entity end # Used for inline diffs - expose :highlighted_diff_lines, if: -> (diff_file, _) { diff_file.text? } do |diff_file| + expose :highlighted_diff_lines, using: DiffLineEntity, if: -> (diff_file, _) { diff_file.text? } do |diff_file| diff_file.diff_lines_for_serializer end # Used for parallel diffs - expose :parallel_diff_lines, if: -> (diff_file, _) { diff_file.text? } + expose :parallel_diff_lines, using: DiffLineParallelEntity, if: -> (diff_file, _) { diff_file.text? } def current_user request.current_user diff --git a/app/serializers/diff_line_entity.rb b/app/serializers/diff_line_entity.rb new file mode 100644 index 00000000000..9c55a80f421 --- /dev/null +++ b/app/serializers/diff_line_entity.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class DiffLineEntity < Grape::Entity + expose :line_code + expose :type + expose :old_line + expose :new_line + expose :text + expose :meta_positions, as: :meta_data + + expose :rich_text do |line| + line.rich_text || line.text + end +end diff --git a/app/serializers/diff_line_parallel_entity.rb b/app/serializers/diff_line_parallel_entity.rb new file mode 100644 index 00000000000..0438a67d51b --- /dev/null +++ b/app/serializers/diff_line_parallel_entity.rb @@ -0,0 +1,6 @@ +# frozen_string_literal: true + +class DiffLineParallelEntity < Grape::Entity + expose :left, using: DiffLineEntity + expose :right, using: DiffLineEntity +end diff --git a/app/serializers/diff_line_serializer.rb b/app/serializers/diff_line_serializer.rb new file mode 100644 index 00000000000..7f1f2d9aa7c --- /dev/null +++ b/app/serializers/diff_line_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class DiffLineSerializer < BaseSerializer + entity DiffLineEntity +end diff --git a/app/serializers/discussion_entity.rb b/app/serializers/discussion_entity.rb index b8321037fa5..ed09db0f3f4 100644 --- a/app/serializers/discussion_entity.rb +++ b/app/serializers/discussion_entity.rb @@ -43,7 +43,7 @@ class DiscussionEntity < Grape::Entity project_merge_request_discussion_path(discussion.project, discussion.noteable, discussion) end - expose :truncated_diff_lines, if: -> (d, _) { d.diff_discussion? && d.on_text? && (d.expanded? || render_truncated_diff_lines?) } + expose :truncated_diff_lines, using: DiffLineEntity, if: -> (d, _) { d.diff_discussion? && d.on_text? && (d.expanded? || render_truncated_diff_lines?) } expose :image_diff_html, if: -> (d, _) { d.diff_discussion? && d.on_image? } do |discussion| diff_file = discussion.diff_file diff --git a/lib/gitlab/diff/line.rb b/lib/gitlab/diff/line.rb index 1faf7770634..d6548a610bd 100644 --- a/lib/gitlab/diff/line.rb +++ b/lib/gitlab/diff/line.rb @@ -78,16 +78,10 @@ module Gitlab } end + # We have to keep this here since it is still used for conflict resolution + # in Conflict::File#as_json that renders json diff lines in sections def as_json(opts = nil) - { - line_code: line_code, - type: type, - old_line: old_line, - new_line: new_line, - text: text, - rich_text: rich_text || text, - meta_data: meta_positions - } + DiffLineSerializer.new.represent(self) end private diff --git a/spec/fixtures/api/schemas/entities/diff_line.json b/spec/fixtures/api/schemas/entities/diff_line.json new file mode 100644 index 00000000000..f7dce4f87fd --- /dev/null +++ b/spec/fixtures/api/schemas/entities/diff_line.json @@ -0,0 +1,13 @@ +{ + "type": "object", + "required": ["type"], + "properties": { + "line_code": { "type": ["string", "null"] }, + "type": { "type": ["string", "null"] }, + "old_line": { "type": ["integer", "null"] }, + "new_line": { "type": ["integer", "null"] }, + "text": { "type": ["string", "null"] }, + "rich_text": { "type": ["string", "null"] }, + "meta_positions": { "type": ["object", null] } + } +} diff --git a/spec/serializers/diff_line_serializer_spec.rb b/spec/serializers/diff_line_serializer_spec.rb new file mode 100644 index 00000000000..3d374d69d86 --- /dev/null +++ b/spec/serializers/diff_line_serializer_spec.rb @@ -0,0 +1,14 @@ +require 'spec_helper' + +describe DiffLineSerializer do + let(:line) { Gitlab::Diff::Line.new('hello world', 'new', 1, nil, 1) } + let(:serializer) { described_class.new.represent(line) } + + describe '#to_json' do + subject { serializer.to_json } + + it 'matches the schema' do + expect(subject).to match_schema('entities/diff_line') + end + end +end |