Class: Gitlab::GithubImport::Representation::DiffNote
- Inherits:
-
Object
- Object
- Gitlab::GithubImport::Representation::DiffNote
- Includes:
- ExposeAttribute, ToHash, Utils::StrongMemoize
- Defined in:
- lib/gitlab/github_import/representation/diff_note.rb
Constant Summary collapse
- NOTEABLE_TYPE =
'MergeRequest'
- NOTEABLE_ID_REGEX =
%r{/pull/(?<iid>\d+)}i.freeze
- DISCUSSION_CACHE_KEY =
'github-importer/discussion-id-map/%{project_id}/%{noteable_id}/%{original_note_id}'
Instance Attribute Summary collapse
-
#merge_request ⇒ Object
Returns the value of attribute merge_request.
-
#project ⇒ Object
Returns the value of attribute project.
Class Method Summary collapse
-
.from_api_response(note) ⇒ Object
Builds a diff note from a GitHub API response.
-
.from_json_hash(raw_hash) ⇒ Object
Builds a new note using a Hash that was built from a JSON payload.
Instance Method Summary collapse
- #contains_suggestion? ⇒ Boolean
-
#diff_hash ⇒ Object
Returns a Hash that can be used to populate `notes.st_diff`, removing the need for requesting Git data for every diff note.
-
#diff_position ⇒ Object
Used when importing with DiffNote.
- #discussion_id ⇒ Object
- #github_identifiers ⇒ Object
-
#initialize(attributes) ⇒ DiffNote
constructor
attributes - A Hash containing the raw note details.
- #line_code ⇒ Object
- #note ⇒ Object
- #noteable_type ⇒ Object
Methods included from ToHash
#convert_value_for_to_hash, #to_hash
Methods included from Utils::StrongMemoize
#clear_memoization, #strong_memoize, #strong_memoized?
Constructor Details
#initialize(attributes) ⇒ DiffNote
attributes - A Hash containing the raw note details. The keys of this
Hash must be Symbols.
66 67 68 69 70 71 72 73 74 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 66 def initialize(attributes) @attributes = attributes @note_formatter = DiffNotes::SuggestionFormatter.new( note: attributes[:note], start_line: attributes[:start_line], end_line: attributes[:end_line] ) end |
Instance Attribute Details
#merge_request ⇒ Object
Returns the value of attribute merge_request.
62 63 64 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 62 def merge_request @merge_request end |
#project ⇒ Object
Returns the value of attribute project.
62 63 64 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 62 def project @project end |
Class Method Details
.from_api_response(note) ⇒ Object
Builds a diff note from a GitHub API response.
note - An instance of `Sawyer::Resource` containing the note details.
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 23 def self.from_api_response(note) matches = note.html_url.match(NOTEABLE_ID_REGEX) unless matches raise( ArgumentError, "The note URL #{note.html_url.inspect} is not supported" ) end user = Representation::User.from_api_response(note.user) if note.user hash = { noteable_id: matches[:iid].to_i, file_path: note.path, commit_id: note.commit_id, original_commit_id: note.original_commit_id, diff_hunk: note.diff_hunk, author: user, note: note.body, created_at: note.created_at, updated_at: note.updated_at, note_id: note.id, end_line: note.line, start_line: note.start_line, side: note.side, in_reply_to_id: note.in_reply_to_id } new(hash) end |
.from_json_hash(raw_hash) ⇒ Object
Builds a new note using a Hash that was built from a JSON payload.
55 56 57 58 59 60 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 55 def self.from_json_hash(raw_hash) hash = Representation.symbolize_hash(raw_hash) hash[:author] &&= Representation::User.from_json_hash(hash[:author]) new(hash) end |
Instance Method Details
#contains_suggestion? ⇒ Boolean
80 81 82 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 80 def contains_suggestion? @note_formatter.contains_suggestion? end |
#diff_hash ⇒ Object
Returns a Hash that can be used to populate `notes.st_diff`, removing the need for requesting Git data for every diff note. Used when importing with LegacyDiffNote
97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 97 def diff_hash { diff: diff_hunk, new_path: file_path, old_path: file_path, # These fields are not displayed for LegacyDiffNote notes, so it # doesn't really matter what we set them to. a_mode: '100644', b_mode: '100644', new_file: false } end |
#diff_position ⇒ Object
Used when importing with DiffNote
112 113 114 115 116 117 118 119 120 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 112 def diff_position position_params = { diff_refs: merge_request.diff_refs, old_path: file_path, new_path: file_path } Gitlab::Diff::Position.new(position_params.merge(diff_line_params)) end |
#discussion_id ⇒ Object
130 131 132 133 134 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 130 def discussion_id strong_memoize(:discussion_id) do (in_reply_to_id.present? && current_discussion_id) || generate_discussion_id end end |
#github_identifiers ⇒ Object
122 123 124 125 126 127 128 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 122 def github_identifiers { note_id: note_id, noteable_id: noteable_id, noteable_type: noteable_type } end |
#line_code ⇒ Object
88 89 90 91 92 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 88 def line_code diff_line = Gitlab::Diff::Parser.new.parse(diff_hunk.lines).to_a.last Gitlab::Git.diff_line_code(file_path, diff_line.new_pos, diff_line.old_pos) end |
#note ⇒ Object
84 85 86 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 84 def note @note_formatter.formatted_note end |
#noteable_type ⇒ Object
76 77 78 |
# File 'lib/gitlab/github_import/representation/diff_note.rb', line 76 def noteable_type NOTEABLE_TYPE end |