• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

moosetechnology / GitProjectHealth / 13071365644

31 Jan 2025 10:57AM UTC coverage: 61.185% (+1.7%) from 59.515%
13071365644

Pull #120

github

web-flow
Merge d979915fc into 8f62c91ca
Pull Request #120: Merge remote-tracking branch 'origin/main' into develop and Update asDate for moose 12 + test

204 of 384 new or added lines in 16 files covered. (53.13%)

23 existing lines in 2 files now uncovered.

9614 of 15713 relevant lines covered (61.19%)

1.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

68.8
/src/GitLabProjectHealth-Model-Importer/GLPHModelImporter.class.st
1
Class {
2
        #name : #GLPHModelImporter,
3
        #superclass : #GLHModelImporter,
4
        #category : #'GitLabProjectHealth-Model-Importer'
5
}
6

7
{ #category : #'import - commits' }
8
GLPHModelImporter >> commitsOfProject: aGLHProject forRefName: refName until: toDate [
×
9

×
NEW
10
        | params results allCommits |
×
NEW
11
        
×
NEW
12
        params := { 
×
NEW
13
                #ref_name -> refName.
×
NEW
14
                #until -> (toDate ifNotNil: [ toDate asDateAndTime asString ] ifNil: [ '' ]) 
×
NEW
15
        } asDictionary.
×
NEW
16
        results := self repoApi commits getAllInProject: aGLHProject id withParams: params.
×
NEW
17
        allCommits := (results collect: [ :commitsJson | self parseCommitsResult: commitsJson ]) flattened.
×
NEW
18
        
×
NEW
19
        self glhModel addAll: allCommits unless: self blockOnIdEquality.
×
NEW
20
        aGLHProject repository commits addAll: allCommits unless: self blockOnIdEquality.
×
NEW
21

×
22
        self withCommitDiffs ifTrue: [
×
23
                aGLHProject repository commits do: [ :commit |
×
NEW
24
                        self importDiffOfCommit: commit ] ].
×
NEW
25
        
×
NEW
26
        ^allCommits
×
UNCOV
27
]
×
28

29
{ #category : #'private - api' }
30
GLPHModelImporter >> completeImportProject: aGLHProject [
2✔
31

2✔
32
        | completedProject |
2✔
33
        completedProject := super completeImportProject: aGLHProject.
2✔
34
        "for this initial import, with only look at some but not all MR"
2✔
35
        withInitialMergeRequest ifTrue: [
2✔
36
                self
2✔
37
                        importMergeRequests: completedProject
2✔
38
                        since: DateAndTime today
2✔
39
                        until: DateAndTime now ].
2✔
40

2✔
41
        ^ completedProject
2✔
42
]
2✔
43

44
{ #category : #'private - configure reader' }
45
GLPHModelImporter >> configureReaderForMergeRequest: reader [
2✔
46
        "declare quil y a un array a mapper"
2✔
47

2✔
48
        reader for: #ArrayOfMergeRequest customDo: [ :customMappting |
2✔
49
                customMappting listOfElementSchema: GLHMergeRequest ].
2✔
50

2✔
51
        "declare la liste des properties"
2✔
52
        reader for: GLHMergeRequest do: [ :mapping |
2✔
53
                mapping mapInstVars:
2✔
54
                        #( blocking_discussions_resolved changes_count description
2✔
55
                           detailed_merge_status discussion_locked downvotes draft first_deployed_to_production_at
2✔
56
                           force_remove_source_branch has_conflicts id iid labels latest_build_finished_at
2✔
57
                           latest_build_started_at merge_commit_sha merge_status
2✔
58
                           merge_when_pipeline_succeeds merged_at milestone project_id
2✔
59
                           reference references_full references_relative
2✔
60
                           references_short sha should_remove_source_branch
2✔
61
                           source_branch source_project_id squash squash_commit_sha
2✔
62
                           squash_on_merge state subscribed target_branch target_project_id
2✔
63
                           task_completion_status_completed_count
2✔
64
                           task_completion_status_count time_stats_human_time_estimate
2✔
65
                           time_stats_human_total_time_spent
2✔
66
                           time_stats_time_estimate time_stats_total_time_spent
2✔
67
                           title updated_at upvotes user_notes_count web_url work_in_progress ).
2✔
68
                (mapping mapInstVar: #created_at) valueSchema: DateAndTime.
2✔
69
                (mapping mapInstVar: #updated_at) valueSchema: DateAndTime.
2✔
70
                (mapping mapInstVar: #merged_at) valueSchema: DateAndTime.
2✔
71
                (mapping mapInstVar: #closed_at) valueSchema: DateAndTime.
2✔
72
                "(mapping mapInstVar: #assignee) valueSchema: GLHUser."
2✔
73
                mapping
2✔
74
                        mapProperty: #author
2✔
75
                        getter: [  ]
2✔
76
                        setter: [ :object :value |
2✔
77
                        object cacheAt: #authorID put: (value at: #id) ].
2✔
78
                mapping
2✔
79
                        mapProperty: #merge_user
2✔
80
                        getter: [  ]
2✔
81
                        setter: [ :object :value | 
2✔
82
                                value ifNotNil: [
2✔
83
                                        object cacheAt: #mergeUserID put: (value at: #id) ] ] ].
2✔
84

2✔
85
        "(mapping mapInstVar: #closed_by) valueSchema: GLHUser.
2✔
86
        (mapping mapInstVar: #mergeCommit) valueSchema: GLHCommit."
2✔
87
        "indique ce que doit faire le reader lorsqu'il parse une DateAndTime object"
2✔
88
        reader for: DateAndTime customDo: [ :mapping |
2✔
89
                mapping decoder: [ :string |
2✔
90
                        string ifNil: [ nil ] ifNotNil: [ DateAndTime fromString: string ] ] ]
2✔
91
]
2✔
92

93
{ #category : #'import - commits' }
94
GLPHModelImporter >> importCommitsOfBranch: aGLHBranch [
×
95

×
96
        | commits |
×
97
        "        result := self glhApi
×
98
                          commitsOfProject: aGLHBranch repository project id
×
99
                          forRefName: aGLHBranch name."
×
100
        commits := self
×
101
                           importCommitsOfBranch: aGLHBranch
×
102
                           forRefName: aGLHBranch name
×
103
                           since: withCommitsSince.
×
104

×
105
        self chainsCommitsFrom: commits.
×
106

×
107
        commits do: [ :aCommit |
×
108
                aCommit repository: aGLHBranch repository.
×
109
                self completeImportedCommit: aCommit. 
×
110
                 ]
×
111
]
×
112

113
{ #category : #'import - commits' }
114
GLPHModelImporter >> importDiffOfCommit: aCommit [
2✔
115

2✔
116
        super importDiffOfCommit: aCommit.
2✔
117
        
2✔
118
        "changes are added into the model during the import"
2✔
119
        aCommit diffs do: [ :diff | self importDiffRangesForDiff: diff ].
2✔
120

2✔
121
        ^ aCommit diffs
2✔
122
]
2✔
123

124
{ #category : #'import - merge request' }
125
GLPHModelImporter >> importDiffOfMergeRequest: aMergeRequest [
2✔
126

2✔
127
        | result diffsResult |
2✔
128
        aMergeRequest diffs ifNotEmpty: [
2✔
129
                'Diff of already importer: '
2✔
130
                , aMergeRequest iid printString recordInfo.
2✔
131
                ^ aMergeRequest diffs ].
2✔
132
        ('Import diff commits of MR ' , aMergeRequest iid printString)
2✔
133
                recordInfo.
2✔
134
        result := self repoApi mergeRequests diffsOf: aMergeRequest iid inProject: aMergeRequest project_id.
2✔
135

2✔
136
        diffsResult := self newParseDiffResult: result.
2✔
137

2✔
138

2✔
139
        aMergeRequest diffs
2✔
140
                addAll: diffsResult
2✔
141
                unless: self blockForDiffEquality.
2✔
142
        self glhModel
2✔
143
                addAll: aMergeRequest diffs
2✔
144
                unless: self blockForDiffEquality.
2✔
145

2✔
146
        aMergeRequest diffs do: [ :diff | self importDiffRangesForDiff: diff ].
2✔
147

2✔
148
        ^ aMergeRequest diffs
2✔
149
]
2✔
150

151
{ #category : #'import - merge request' }
152
GLPHModelImporter >> importMergeRequestCommits: aGLPHEMergeRequest [
×
153

×
NEW
154
        | commits result |
×
155
        aGLPHEMergeRequest commits ifNotNil: [ ^ aGLPHEMergeRequest commits ].
×
NEW
156
        
×
NEW
157
        result := self repoApi mergeRequests commitsOf: aGLPHEMergeRequest iid inProject: aGLPHEMergeRequest project id.
×
NEW
158
        
×
NEW
159
        commits := (result collect: [ :commitsJson | self parseCommitsResult: commitsJson ]) flattened.
×
160
        commits := commits collect: [ :commit | self importCommit: commit id ofProject: aGLPHEMergeRequest project ].
×
161
        aGLPHEMergeRequest commits: commits.
×
162

×
163

×
164
        ^ commits
×
165
]
×
166

167
{ #category : #'import - merge request' }
168
GLPHModelImporter >> importMergeRequestMergeCommits: aGLPHEMergeRequest [
2✔
169

2✔
170
        | foundCommits |
2✔
171
        foundCommits := OrderedCollection new.
2✔
172

2✔
173
        ('Import commit sha of MR:  ' , aGLPHEMergeRequest iid printString)
2✔
174
                recordInfo.
2✔
175
        "the founds commits are added to the model during their respective import"
2✔
176
        aGLPHEMergeRequest mergeRequestCommit: ((self
2✔
177
                          importCommitOfProject: aGLPHEMergeRequest project
2✔
178
                          withId: aGLPHEMergeRequest sha) ifNotNil: [ :commit |
2✔
179
                         foundCommits add: commit ]).
2✔
180

2✔
181
        ('Import commit merge_commit_sha of MR:  '
2✔
182
         , aGLPHEMergeRequest iid printString) recordInfo.
2✔
183
        aGLPHEMergeRequest mergedCommit: ((self
2✔
184
                          importCommitOfProject: aGLPHEMergeRequest project
2✔
185
                          withId: aGLPHEMergeRequest merge_commit_sha) ifNotNil: [ :commit |
2✔
186
                         foundCommits add: commit ]).
2✔
187

2✔
188
        ('Import commit squash_commit_sha of MR:  '
2✔
189
         , aGLPHEMergeRequest iid printString) recordInfo.
2✔
190
        aGLPHEMergeRequest squashCommit: ((self
2✔
191
                          importCommitOfProject: aGLPHEMergeRequest project
2✔
192
                          withId: aGLPHEMergeRequest squash_commit_sha) ifNotNil: [ :commit |
2✔
193
                         foundCommits add: commit ]).
2✔
194

2✔
195

2✔
196
        self chainsCommitsFrom: foundCommits.
2✔
197
        ^ foundCommits
2✔
198
]
2✔
199

200
{ #category : #'import - merge request' }
201
GLPHModelImporter >> importMergeRequests: aGLHProject [
2✔
202

2✔
203
        | results parsedResults mrs |
2✔
204
        ('Import merge request of Project: ' , aGLHProject id printString)
2✔
205
                recordInfo.
2✔
206

2✔
207
        results := self repoApi mergeRequests allOfProject: aGLHProject id.
2✔
208
        parsedResults := (results collect: [ :projectsJson | self parseMergeRequestResult: projectsJson ]) flattened. 
2✔
209

2✔
210
        aGLHProject mergeRequests
2✔
211
                addAll: parsedResults
2✔
212
                unless: self blockOnIdEquality.
2✔
213

2✔
214
        mrs := self glhModel
2✔
215
                       addAll: aGLHProject mergeRequests
2✔
216
                       unless: self blockOnIdEquality.
2✔
217

2✔
218

2✔
219
        "gets it related commits"
2✔
220
        aGLHProject mergeRequests do: [ :mr |
2✔
221
                self importMergeRequestMergeCommits: mr ].
2✔
222

2✔
223

2✔
224
        self withCommitDiffs ifTrue: [
2✔
225
                aGLHProject mergeRequests do: [ :mr |
2✔
226
                        self importDiffOfMergeRequest: mr ] ].
2✔
227

2✔
228
        ^ mrs
2✔
229
]
2✔
230

231
{ #category : #'import - merge request' }
232
GLPHModelImporter >> importMergeRequests: aGLHProject since: fromDate until: toDate [
×
233

×
NEW
234
        | params result mergeRequests |
×
235
        ('import MR of Project ' , aGLHProject name) recordInfo.
×
NEW
236
        params := {
×
NEW
237
                          (#created_after
×
NEW
238
                           ->
×
NEW
239
                           (fromDate
×
NEW
240
                                    ifNotNil: [ fromDate asDateAndTime asString ]
×
NEW
241
                                    ifNil: [ '' ])).
×
NEW
242
                          (#created_before
×
NEW
243
                           ->
×
NEW
244
                           (toDate
×
NEW
245
                                    ifNotNil: [ toDate asDateAndTime asString ]
×
NEW
246
                                    ifNil: [ '' ])).
×
NEW
247
                          (#scope -> 'all') } asDictionary.
×
NEW
248

×
NEW
249
        result := self repoApi mergeRequests
×
NEW
250
                          allOfProject: aGLHProject id
×
NEW
251
                          withParams: params.
×
NEW
252
        mergeRequests := (result collect: [ :mergeRequestsJson |
×
NEW
253
                                  self parseMergeRequestResult: mergeRequestsJson ])
×
NEW
254
                                 flattened.
×
255

×
NEW
256
        aGLHProject mergeRequests
×
NEW
257
                addAll: mergeRequests
×
NEW
258
                unless: self blockOnIdEquality.
×
259

×
260
        "gets it related commits"
×
261
        aGLHProject mergeRequests do: [ :mr |
×
262
                self importMergeRequestMergeCommits: mr ].
×
263

×
264
        self withCommitDiffs ifTrue: [
×
265
                aGLHProject mergeRequests do: [ :mr |
×
266
                        self importDiffOfMergeRequest: mr ] ].
×
267

×
NEW
268
        self glhModel
×
NEW
269
                addAll: mergeRequests
×
NEW
270
                unless: (self blockEqualityOn: #iid).
×
271

×
NEW
272
        ^ mergeRequests
×
273
]
×
274

275
{ #category : #'import - merge request' }
276
GLPHModelImporter >> importMergeResquestApprovals: aGLPHEMergeRequest [
×
277

×
278
        | results parsedResult |
×
279
        (String streamContents: [ :str |
×
280
                 str << 'Check approvals of '.
×
281
                 aGLPHEMergeRequest printOn: str ]) recordInfo.
×
NEW
282
        results := self repoApi mergeRequests approvalsOf: aGLPHEMergeRequest iid inProject: aGLPHEMergeRequest project id.
×
283

×
284
        parsedResult := generalReader
×
285
                                on: results readStream;
×
286
                                next.
×
287

×
288
        (parsedResult at: #approved_by) do: [ :approvedUser |
×
289
                aGLPHEMergeRequest addApproved_by:
×
290
                        (self importUser: ((approvedUser at: #user) at: #id)) ].
×
291
        aGLPHEMergeRequest approved: (parsedResult at: #approved).
×
292
        ^ aGLPHEMergeRequest
×
293
]
×
294

295
{ #category : #'import - merge request' }
296
GLPHModelImporter >> importMergeResquestAuthor: aGLPHEMergeRequest [
2✔
297

2✔
298
        | authorID |
2✔
299
        aGLPHEMergeRequest author ifNotNil: [ ^ aGLPHEMergeRequest author ].
2✔
300
        authorID := aGLPHEMergeRequest cacheAt: #authorID ifAbsent: [
2✔
301
                            | result |
2✔
302
                            result := self repoApi mergeRequests
2✔
303
                                              get: aGLPHEMergeRequest iid
2✔
304
                                              inProject: aGLPHEMergeRequest project_id.
2✔
305

2✔
306
                            (generalReader
2✔
307
                                     on: result readStream;
2✔
308
                                     next) at: #author at: #id ].
2✔
309
        ^aGLPHEMergeRequest author: (self importUser: authorID)
2✔
310
]
2✔
311

312
{ #category : #'import - merge request' }
313
GLPHModelImporter >> importMergeResquestMerger: aGLPHEMergeRequest [
2✔
314

2✔
315
        | authorID |
2✔
316
        aGLPHEMergeRequest merge_user ifNotNil: [
2✔
317
                ^ aGLPHEMergeRequest merge_user ].
2✔
318
        authorID := aGLPHEMergeRequest cacheAt: #mergeUserID ifAbsent: [
2✔
319
                            | result |
2✔
320
                            result := self repoApi mergeRequests
2✔
321
                                              get: aGLPHEMergeRequest iid
2✔
322
                                              inProject: aGLPHEMergeRequest project_id.
2✔
323
                            (generalReader
2✔
324
                                     on: result readStream;
2✔
325
                                     next)
2✔
326
                                    at: #merge_user
2✔
327
                                    ifPresent: [ :mergeUser |
2✔
328
                                    mergeUser ifNotNil: [ :mruser | mruser at: #id ] ] ].
2✔
329
        ^aGLPHEMergeRequest merge_user: (self importUser: authorID)
2✔
330
]
2✔
331

332
{ #category : #'import - projects' }
333
GLPHModelImporter >> importProject: aProjectID [
2✔
334

2✔
335
        | result projectResult |
2✔
336
        ('Import project with id:  ' , aProjectID printString) recordInfo.
2✔
337

2✔
338
        (glhModel allWithType: GLHProject)
2✔
339
                detect: [ :project | project id = aProjectID ]
2✔
340
                ifOne: [ :project | ^ project ].
2✔
341

2✔
342
        result := self repoApi projects get: aProjectID.
2✔
343
        projectResult := self parseProjectResult: result.
2✔
344

2✔
345
        ^ self completeImportProject: projectResult
2✔
346
]
2✔
347

348
{ #category : #'private - api' }
349
GLPHModelImporter >> importRepository: aGLHRepository [
2✔
350

2✔
351
        super importRepository: aGLHRepository.
2✔
352

2✔
353
        withInitialCommits ifTrue: [
2✔
354
                aGLHRepository branches do: [ :branch |
2✔
355
                        self importCommitsOfBranch: branch ] ]
2✔
356
]
2✔
357

358
{ #category : #initialization }
359
GLPHModelImporter >> initReader [
2✔
360

2✔
361
        super initReader.
2✔
362
        self configureReaderForMergeRequest: generalReader
2✔
363
]
2✔
364

365
{ #category : #initialization }
366
GLPHModelImporter >> initialize [
2✔
367

2✔
368
        super initialize.
2✔
369
        withCommitDiffs := true
2✔
370
]
2✔
371

372
{ #category : #'private - parsing' }
373
GLPHModelImporter >> parseMergeRequestResult: result [
2✔
374

2✔
375
        generalReader on: result readStream.
2✔
376
        ^ generalReader nextAs: #ArrayOfMergeRequest
2✔
377
]
2✔
378

379
{ #category : #'private - parsing' }
380
GLPHModelImporter >> parseProjectResult: aResult [ 
2✔
381
                | reader |
2✔
382
        reader := NeoJSONReader on: aResult readStream.
2✔
383
        reader for: GLHProject do: [ :mapping |
2✔
384
                mapping mapInstVars. ].
2✔
385
"        reader mapInstVarsFor: GLHProject."
2✔
386

2✔
387
        ^ reader nextAs: GLHProject
2✔
388
]
2✔
389

2✔
390
{ #category : #accessing }
2✔
391
GLPHModelImporter >> withCommitsSince: someDays [
2✔
392
        "substract the current date with a given number of days. Use to retrieve the commits submit in the last giving days"
2✔
393

2✔
394
        "(GLPHModelImporter new withCommitsSince: 1 week ) >>> (Date today - 1 week) asDateAndTime"
2✔
395

2✔
396
        "(GLPHModelImporter new withCommitsSince: 30 day ) >>> (Date today - 30 day) asDateAndTime"
2✔
397

2✔
398
        (someDays isKindOf: DateAndTime)
2✔
399
                ifTrue: [ withCommitsSince := someDays ]
2✔
400
                ifFalse: [
2✔
401
                withCommitsSince := (Date today - someDays) asDate asDateAndTime ]
2✔
402
]
2✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc