Skip to content

Commit 30d38cc

Browse files
authored
Merge pull request #8 from moosetechnology/fill-merge-request
Fill merge request
2 parents 1418b93 + 22f982a commit 30d38cc

File tree

4 files changed

+279
-53
lines changed

4 files changed

+279
-53
lines changed

src/GitLabHealth-Model-Importer/GLHModelImporter.class.st

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -744,8 +744,9 @@ GLHModelImporter >> importRepository: aGLHRepository [
744744
GLHModelImporter >> importUser: aUserID [
745745

746746
| result userResult |
747-
748-
(glhModel allWithType: GLHUser) asOrderedCollection detect: [ :user | user id = aUserID ] ifFound: [ :user | ^ user ].
747+
(glhModel allWithType: GLHUser) asOrderedCollection
748+
detect: [ :user | user id = aUserID ]
749+
ifFound: [ :user | ^ user ].
749750
('Import user: ' , aUserID printString) recordInfo.
750751
result := self glhApi user: aUserID.
751752
userResult := self parseUserResult: result.
@@ -768,7 +769,10 @@ GLHModelImporter >> importUserByUsername: anUsername [
768769

769770
(searchResult class = Dictionary and: [
770771
(searchResult at: #message) includesSubstring: '403 Forbidden' ])
771-
ifTrue: [ glhModel add: (GLHUser new username: anUsername) unless: [ :nu :ou | nu username = ou username ] ]
772+
ifTrue: [
773+
glhModel
774+
add: (GLHUser new username: anUsername)
775+
unless: [ :nu :ou | nu username = ou username ] ]
772776
ifFalse: [
773777
searchResult
774778
ifEmpty: [
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Class {
2+
#name : #GLPHApiMock,
3+
#superclass : #GLPHApi,
4+
#category : #'GitLabProjectHealth-Model-Importer-Tests'
5+
}
6+
7+
{ #category : #'as yet unclassified' }
8+
GLPHApiMock >> mergeRequestOfProject: project withId: id [
9+
10+
^ '{
11+
"author":{ "id": 12 },
12+
"merge_user":{ "id": 12 }
13+
}'
14+
]
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
Class {
2+
#name : #GLPHModelImporterMergeRequestTest,
3+
#superclass : #TestCase,
4+
#instVars : [
5+
'githubDiffData',
6+
'gitlabDiffData',
7+
'glhImporter',
8+
'gitlabMergeData',
9+
'glhModel'
10+
],
11+
#category : #'GitLabProjectHealth-Model-Importer-Tests'
12+
}
13+
14+
{ #category : #running }
15+
GLPHModelImporterMergeRequestTest >> setUp [
16+
17+
super setUp.
18+
glhImporter := GLPHModelImporter new.
19+
glhImporter glhApi: GLPHApiMock new.
20+
glhModel := GLPHEModel new.
21+
glhImporter glhModel: glhModel.
22+
gitlabMergeData := '[
23+
{"id":46074,
24+
"iid":1415,
25+
"project_id":4810,
26+
"title":"Super MR",
27+
"description":"Close Issue XX",
28+
"state":"opened",
29+
"created_at":"2024-07-01T16:05:48.775+02:00",
30+
"updated_at":"2024-07-01T16:05:51.221+02:00",
31+
"merged_by":null,
32+
"merge_user":{
33+
"id":12,
34+
"username":"badetitou",
35+
"name":"Verhaeghe Benoit",
36+
"state":"active",
37+
"avatar_url":"https://gitlab.com/badetitou.png",
38+
"web_url":"https://gitlab.com/badetitou"
39+
},
40+
"merged_at":null,
41+
"closed_by":null,
42+
"closed_at":null,
43+
"target_branch":"1.0.0",
44+
"source_branch":"feature/XX",
45+
"user_notes_count":0,
46+
"upvotes":0,
47+
"downvotes":0,
48+
"author":
49+
{
50+
"id":12,
51+
"username":"badetitou",
52+
"name":"Verhaeghe Benoit",
53+
"state":"active",
54+
"avatar_url":"https://gitlab.com/badetitou.png",
55+
"web_url":"https://gitlab.com/badetitou"
56+
},
57+
"assignees":[
58+
{
59+
"id":12,
60+
"username":"badetitou",
61+
"name":"Verhaeghe Benoit",
62+
"state":"active",
63+
"avatar_url":"https://gitlab.com/badetitou.png",
64+
"web_url":"https://gitlab.com/badetitou"
65+
}
66+
],
67+
"assignee":{
68+
"id":12,
69+
"username":"badetitou",
70+
"name":"Verhaeghe Benoit",
71+
"state":"active",
72+
"avatar_url":"https://gitlab.com/badetitou.png",
73+
"web_url":"https://gitlab.com/badetitou"
74+
},
75+
"reviewers":[],
76+
"source_project_id":4810,
77+
"target_project_id":4810,
78+
"labels":[],
79+
"draft":false,
80+
"work_in_progress":false,
81+
"milestone":null,
82+
"merge_when_pipeline_succeeds":false,
83+
"merge_status":"can_be_merged",
84+
"detailed_merge_status":"mergeable",
85+
"sha":"idgyuzegfdyugfzuygdiuezg",
86+
"merge_commit_sha":null,
87+
"squash_commit_sha":null,
88+
"discussion_locked":null,
89+
"should_remove_source_branch":null,
90+
"force_remove_source_branch":true,
91+
"reference":"!1024",
92+
"references":{
93+
"short":"!1415",
94+
"relative":"!1415",
95+
"full":"group/group2!1415"
96+
},
97+
"web_url":"https://gitlab.com/group/group2/-/merge_requests/1415",
98+
"time_stats":{
99+
"time_estimate":0,
100+
"total_time_spent":0,
101+
"human_time_estimate":null,
102+
"human_total_time_spent":null
103+
},
104+
"squash":true,
105+
"squash_on_merge":true,
106+
"task_completion_status":{
107+
"count":0,
108+
"completed_count":0
109+
},
110+
"has_conflicts":false,
111+
"blocking_discussions_resolved":true
112+
}]'
113+
]
114+
115+
{ #category : #test }
116+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestMergeUserAlreadySet [
117+
118+
| mergeRequest user |
119+
mergeRequest := (glhImporter parseMergeRequestResult: gitlabMergeData) anyOne.
120+
user := GLHUser new.
121+
mergeRequest merge_user: user.
122+
glhImporter importMergeResquestMerger: mergeRequest.
123+
self assert: mergeRequest merge_user equals: user
124+
]
125+
126+
{ #category : #test }
127+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestMergeUserExistInModelAndCacheID [
128+
129+
| mergeRequest user |
130+
mergeRequest := (glhImporter parseMergeRequestResult: gitlabMergeData)
131+
anyOne.
132+
user := glhModel newUser.
133+
user id: 12.
134+
glhImporter importMergeResquestMerger: mergeRequest.
135+
self assert: mergeRequest merge_user equals: user
136+
]
137+
138+
{ #category : #test }
139+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestMergeUserIsNil [
140+
141+
| mergeRequest |
142+
mergeRequest := (glhImporter parseMergeRequestResult: '[{"id":46074}]') anyOne.
143+
self assert: mergeRequest merge_user equals: nil
144+
]
145+
146+
{ #category : #test }
147+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestMergeUserWithoutCache [
148+
149+
| mergeRequest user |
150+
mergeRequest := (glhImporter parseMergeRequestResult: gitlabMergeData) anyOne.
151+
mergeRequest flush.
152+
user := glhModel newUser.
153+
user id: 12.
154+
glhImporter importMergeResquestMerger: mergeRequest.
155+
self assert: mergeRequest merge_user equals: user
156+
]
157+
158+
{ #category : #test }
159+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestResult [
160+
161+
| parseRes |
162+
parseRes := glhImporter parseMergeRequestResult: gitlabMergeData.
163+
self assert: parseRes size equals: 1.
164+
self assert: parseRes anyOne id equals: 46074
165+
]
166+
167+
{ #category : #test }
168+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestUserAlreadySet [
169+
170+
| mergeRequest user |
171+
mergeRequest := (glhImporter parseMergeRequestResult: gitlabMergeData) anyOne.
172+
user := GLHUser new.
173+
mergeRequest author: user.
174+
glhImporter importMergeResquestAuthor: mergeRequest.
175+
self assert: mergeRequest author equals: user
176+
]
177+
178+
{ #category : #test }
179+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestUserExistInModelAndCacheID [
180+
181+
| mergeRequest user |
182+
mergeRequest := (glhImporter parseMergeRequestResult: gitlabMergeData)
183+
anyOne.
184+
user := glhModel newUser.
185+
user id: 12.
186+
glhImporter importMergeResquestAuthor: mergeRequest.
187+
self assert: mergeRequest author equals: user
188+
]
189+
190+
{ #category : #test }
191+
GLPHModelImporterMergeRequestTest >> testParseMergeRequestWithoutCache [
192+
193+
| mergeRequest user |
194+
mergeRequest := (glhImporter parseMergeRequestResult: gitlabMergeData)
195+
anyOne.
196+
mergeRequest flush.
197+
user := glhModel newUser.
198+
user id: 12.
199+
glhImporter importMergeResquestAuthor: mergeRequest.
200+
self assert: mergeRequest author equals: user
201+
]

src/GitLabProjectHealth-Model-Importer/GLPHModelImporter.class.st

Lines changed: 57 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -116,53 +116,22 @@ GLPHModelImporter >> configureReaderForMergeRequest: reader [
116116
(mapping mapInstVar: #created_at) valueSchema: DateAndTime.
117117
(mapping mapInstVar: #updated_at) valueSchema: DateAndTime.
118118
(mapping mapInstVar: #merged_at) valueSchema: DateAndTime.
119-
(mapping mapInstVar: #closed_at) valueSchema: DateAndTime
120-
"
121-
(mapping mapInstVar: #assignee) valueSchema: GLHUser.
122-
(mapping mapInstVar: #author) valueSchema: GLHUser.
123-
(mapping mapInstVar: #closed_by) valueSchema: GLHUser.
124-
(mapping mapInstVar: #mergeCommit) valueSchema: GLHCommit." ].
125-
126-
"indique ce que doit faire le reader lorsqu'il parse une DateAndTime object"
127-
reader for: DateAndTime customDo: [ :mapping |
128-
mapping decoder: [ :string |
129-
string ifNil: [ nil ] ifNotNil: [ DateAndTime fromString: string ] ] ]
130-
]
131-
132-
{ #category : #'private - configure reader' }
133-
GLPHModelImporter >> configureReaderForMergeRequestApproval: reader [
134-
"declare quil y a un array a mapper"
135-
136-
reader for: #ArrayOfMergeRequest customDo: [ :customMappting |
137-
customMappting listOfElementSchema: GLPHEMergeRequest ].
138-
139-
"declare la liste des properties"
140-
reader for: GLPHEMergeRequest do: [ :mapping |
141-
mapping mapInstVars:
142-
#( blocking_discussions_resolved changes_count description
143-
detailed_merge_status discussion_locked downvotes draft first_deployed_to_production_at
144-
force_remove_source_branch has_conflicts id iid labels latest_build_finished_at
145-
latest_build_started_at merge_commit_sha merge_status
146-
merge_when_pipeline_succeeds merged_at milestone project_id
147-
reference references_full references_relative
148-
references_short sha should_remove_source_branch
149-
source_branch source_project_id squash squash_commit_sha
150-
squash_on_merge state subscribed target_branch target_project_id
151-
task_completion_status_completed_count
152-
task_completion_status_count time_stats_human_time_estimate
153-
time_stats_human_total_time_spent
154-
time_stats_time_estimate time_stats_total_time_spent
155-
title updated_at upvotes user_notes_count web_url work_in_progress ).
156-
(mapping mapInstVar: #created_at) valueSchema: DateAndTime.
157-
(mapping mapInstVar: #updated_at) valueSchema: DateAndTime.
158-
(mapping mapInstVar: #merged_at) valueSchema: DateAndTime.
159-
(mapping mapInstVar: #closed_at) valueSchema: DateAndTime
160-
"
161-
(mapping mapInstVar: #assignee) valueSchema: GLHUser.
162-
(mapping mapInstVar: #author) valueSchema: GLHUser.
163-
(mapping mapInstVar: #closed_by) valueSchema: GLHUser.
164-
(mapping mapInstVar: #mergeCommit) valueSchema: GLHCommit." ].
165-
119+
(mapping mapInstVar: #closed_at) valueSchema: DateAndTime.
120+
"(mapping mapInstVar: #assignee) valueSchema: GLHUser."
121+
mapping
122+
mapProperty: #author
123+
getter: [ ]
124+
setter: [ :object :value |
125+
object cacheAt: #authorID put: (value at: #id) ].
126+
mapping
127+
mapProperty: #merge_user
128+
getter: [ ]
129+
setter: [ :object :value |
130+
value ifNotNil: [
131+
object cacheAt: #mergeUserID put: (value at: #id) ] ] ].
132+
133+
"(mapping mapInstVar: #closed_by) valueSchema: GLHUser.
134+
(mapping mapInstVar: #mergeCommit) valueSchema: GLHCommit."
166135
"indique ce que doit faire le reader lorsqu'il parse une DateAndTime object"
167136
reader for: DateAndTime customDo: [ :mapping |
168137
mapping decoder: [ :string |
@@ -281,7 +250,7 @@ GLPHModelImporter >> importDiffRangesForDiff: aGLHDiff [
281250
unless: self blockForDiffRangeEquality
282251
]
283252

284-
{ #category : #import }
253+
{ #category : #'import - merge request' }
285254
GLPHModelImporter >> importMergeRequests: aGLHProject [
286255

287256
| results parsedResults |
@@ -310,7 +279,7 @@ GLPHModelImporter >> importMergeRequests: aGLHProject [
310279
self importDiffOfMergeRequest: mr ] ]
311280
]
312281

313-
{ #category : #import }
282+
{ #category : #'import - merge request' }
314283
GLPHModelImporter >> importMergeRequests: aGLHProject since: fromDate until: toDate [
315284

316285
| newlyFoundMR page foundMR |
@@ -355,7 +324,7 @@ GLPHModelImporter >> importMergeRequests: aGLHProject since: fromDate until: toD
355324
^ foundMR
356325
]
357326

358-
{ #category : #import }
327+
{ #category : #'import - merge request' }
359328
GLPHModelImporter >> importMergeResquestApprovals: aGLPHEMergeRequest [
360329

361330
| results parsedResult |
@@ -369,10 +338,48 @@ GLPHModelImporter >> importMergeResquestApprovals: aGLPHEMergeRequest [
369338
parsedResult := generalReader
370339
on: results readStream;
371340
next.
341+
342+
(parsedResult at: #approved_by) do: [ :approvedUser |
343+
aGLPHEMergeRequest addApproved_by:
344+
(self importUser: ((approvedUser at: #user) at: #id)) ].
372345
aGLPHEMergeRequest approved: (parsedResult at: #approved).
373346
^ aGLPHEMergeRequest
374347
]
375348

349+
{ #category : #'import - merge request' }
350+
GLPHModelImporter >> importMergeResquestAuthor: aGLPHEMergeRequest [
351+
352+
| authorID |
353+
aGLPHEMergeRequest author ifNotNil: [ ^ aGLPHEMergeRequest author ].
354+
authorID := aGLPHEMergeRequest cacheAt: #authorID ifAbsent: [
355+
(generalReader
356+
on: (self glhApi
357+
mergeRequestOfProject:
358+
aGLPHEMergeRequest project_id
359+
withId: aGLPHEMergeRequest iid) readStream;
360+
next) at: #author at: #id ].
361+
aGLPHEMergeRequest author: (self importUser: authorID)
362+
]
363+
364+
{ #category : #'import - merge request' }
365+
GLPHModelImporter >> importMergeResquestMerger: aGLPHEMergeRequest [
366+
367+
| authorID |
368+
aGLPHEMergeRequest merge_user ifNotNil: [
369+
^ aGLPHEMergeRequest merge_user ].
370+
authorID := aGLPHEMergeRequest cacheAt: #mergeUserID ifAbsent: [
371+
(generalReader
372+
on: (self glhApi
373+
mergeRequestOfProject:
374+
aGLPHEMergeRequest project_id
375+
withId: aGLPHEMergeRequest iid) readStream;
376+
next)
377+
at: #merge_user
378+
ifPresent: [ :mergeUser |
379+
mergeUser ifNotNil: [ :mruser | mruser at: #id ] ] ].
380+
aGLPHEMergeRequest merge_user: (self importUser: authorID)
381+
]
382+
376383
{ #category : #'as yet unclassified' }
377384
GLPHModelImporter >> importProject: aProjectID [
378385

0 commit comments

Comments
 (0)