@@ -44,40 +44,56 @@ struct Package {
44
44
}
45
45
46
46
impl Package {
47
- fn immediate_dependents_count ( & self ) -> usize {
47
+ fn direct_dependents_count ( & self ) -> usize {
48
48
self . run
49
49
. pkg_dep_graph ( )
50
50
. immediate_ancestors ( & PackageNode :: Workspace ( self . name . clone ( ) ) )
51
51
. map_or ( 0 , |pkgs| pkgs. len ( ) )
52
52
}
53
53
54
- fn immediate_dependencies_count ( & self ) -> usize {
54
+ fn direct_dependencies_count ( & self ) -> usize {
55
55
self . run
56
56
. pkg_dep_graph ( )
57
57
. immediate_dependencies ( & PackageNode :: Workspace ( self . name . clone ( ) ) )
58
58
. map_or ( 0 , |pkgs| pkgs. len ( ) )
59
59
}
60
60
61
- fn dependent_count ( & self ) -> usize {
61
+ fn indirect_dependents_count ( & self ) -> usize {
62
62
let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
63
63
64
- self . run . pkg_dep_graph ( ) . ancestors ( & node) . len ( )
64
+ self . run . pkg_dep_graph ( ) . ancestors ( & node) . len ( ) - self . direct_dependents_count ( )
65
65
}
66
66
67
- fn dependency_count ( & self ) -> usize {
67
+ fn indirect_dependencies_count ( & self ) -> usize {
68
68
let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
69
69
70
- self . run . pkg_dep_graph ( ) . dependencies ( & node) . len ( )
70
+ self . run . pkg_dep_graph ( ) . dependencies ( & node) . len ( ) - self . direct_dependencies_count ( )
71
+ }
72
+
73
+ fn all_dependents_count ( & self ) -> usize {
74
+ self . run
75
+ . pkg_dep_graph ( )
76
+ . ancestors ( & PackageNode :: Workspace ( self . name . clone ( ) ) )
77
+ . len ( )
78
+ }
79
+
80
+ fn all_dependencies_count ( & self ) -> usize {
81
+ self . run
82
+ . pkg_dep_graph ( )
83
+ . dependencies ( & PackageNode :: Workspace ( self . name . clone ( ) ) )
84
+ . len ( )
71
85
}
72
86
}
73
87
74
88
#[ derive( Enum , Copy , Clone , Eq , PartialEq , Debug ) ]
75
89
enum PackageFields {
76
90
Name ,
77
- DependencyCount ,
78
- DependentCount ,
79
- ImmediateDependentCount ,
80
- ImmediateDependencyCount ,
91
+ DirectDependencyCount ,
92
+ DirectDependentCount ,
93
+ IndirectDependentCount ,
94
+ IndirectDependencyCount ,
95
+ AllDependentCount ,
96
+ AllDependencyCount ,
81
97
}
82
98
83
99
#[ derive( InputObject ) ]
@@ -107,89 +123,125 @@ impl PackagePredicate {
107
123
fn check_equals ( pkg : & Package , field : & PackageFields , value : & Any ) -> bool {
108
124
match ( field, & value. 0 ) {
109
125
( PackageFields :: Name , Value :: String ( name) ) => pkg. name . as_ref ( ) == name,
110
- ( PackageFields :: DependencyCount , Value :: Number ( n) ) => {
126
+ ( PackageFields :: DirectDependencyCount , Value :: Number ( n) ) => {
111
127
let Some ( n) = n. as_u64 ( ) else {
112
128
return false ;
113
129
} ;
114
- pkg. dependency_count ( ) == n as usize
130
+ pkg. direct_dependencies_count ( ) == n as usize
115
131
}
116
- ( PackageFields :: DependentCount , Value :: Number ( n) ) => {
132
+ ( PackageFields :: DirectDependentCount , Value :: Number ( n) ) => {
117
133
let Some ( n) = n. as_u64 ( ) else {
118
134
return false ;
119
135
} ;
120
- pkg. dependent_count ( ) == n as usize
136
+ pkg. direct_dependents_count ( ) == n as usize
121
137
}
122
- ( PackageFields :: ImmediateDependentCount , Value :: Number ( n) ) => {
138
+ ( PackageFields :: IndirectDependentCount , Value :: Number ( n) ) => {
123
139
let Some ( n) = n. as_u64 ( ) else {
124
140
return false ;
125
141
} ;
126
- pkg. immediate_dependents_count ( ) == n as usize
142
+ pkg. indirect_dependents_count ( ) == n as usize
127
143
}
128
- ( PackageFields :: ImmediateDependencyCount , Value :: Number ( n) ) => {
144
+ ( PackageFields :: IndirectDependencyCount , Value :: Number ( n) ) => {
129
145
let Some ( n) = n. as_u64 ( ) else {
130
146
return false ;
131
147
} ;
132
- pkg. immediate_dependencies_count ( ) == n as usize
148
+ pkg. indirect_dependencies_count ( ) == n as usize
149
+ }
150
+ ( PackageFields :: AllDependentCount , Value :: Number ( n) ) => {
151
+ let Some ( n) = n. as_u64 ( ) else {
152
+ return false ;
153
+ } ;
154
+ pkg. all_dependents_count ( ) == n as usize
155
+ }
156
+ ( PackageFields :: AllDependencyCount , Value :: Number ( n) ) => {
157
+ let Some ( n) = n. as_u64 ( ) else {
158
+ return false ;
159
+ } ;
160
+ pkg. all_dependencies_count ( ) == n as usize
133
161
}
134
162
_ => false ,
135
163
}
136
164
}
137
165
138
166
fn check_greater_than ( pkg : & Package , field : & PackageFields , value : & Any ) -> bool {
139
167
match ( field, & value. 0 ) {
140
- ( PackageFields :: DependencyCount , Value :: Number ( n) ) => {
168
+ ( PackageFields :: DirectDependencyCount , Value :: Number ( n) ) => {
169
+ let Some ( n) = n. as_u64 ( ) else {
170
+ return false ;
171
+ } ;
172
+ pkg. direct_dependencies_count ( ) > n as usize
173
+ }
174
+ ( PackageFields :: DirectDependentCount , Value :: Number ( n) ) => {
141
175
let Some ( n) = n. as_u64 ( ) else {
142
176
return false ;
143
177
} ;
144
- pkg. dependency_count ( ) > n as usize
178
+ pkg. direct_dependents_count ( ) > n as usize
145
179
}
146
- ( PackageFields :: DependentCount , Value :: Number ( n) ) => {
180
+ ( PackageFields :: IndirectDependentCount , Value :: Number ( n) ) => {
147
181
let Some ( n) = n. as_u64 ( ) else {
148
182
return false ;
149
183
} ;
150
- pkg. dependent_count ( ) > n as usize
184
+ pkg. indirect_dependents_count ( ) > n as usize
151
185
}
152
- ( PackageFields :: ImmediateDependentCount , Value :: Number ( n) ) => {
186
+ ( PackageFields :: IndirectDependencyCount , Value :: Number ( n) ) => {
153
187
let Some ( n) = n. as_u64 ( ) else {
154
188
return false ;
155
189
} ;
156
- pkg. immediate_dependents_count ( ) > n as usize
190
+ pkg. indirect_dependencies_count ( ) > n as usize
157
191
}
158
- ( PackageFields :: ImmediateDependencyCount , Value :: Number ( n) ) => {
192
+ ( PackageFields :: AllDependentCount , Value :: Number ( n) ) => {
159
193
let Some ( n) = n. as_u64 ( ) else {
160
194
return false ;
161
195
} ;
162
- pkg. immediate_dependencies_count ( ) > n as usize
196
+ pkg. all_dependents_count ( ) > n as usize
197
+ }
198
+ ( PackageFields :: AllDependencyCount , Value :: Number ( n) ) => {
199
+ let Some ( n) = n. as_u64 ( ) else {
200
+ return false ;
201
+ } ;
202
+ pkg. all_dependencies_count ( ) > n as usize
163
203
}
164
204
_ => false ,
165
205
}
166
206
}
167
207
168
208
fn check_less_than ( pkg : & Package , field : & PackageFields , value : & Any ) -> bool {
169
209
match ( field, & value. 0 ) {
170
- ( PackageFields :: DependencyCount , Value :: Number ( n) ) => {
210
+ ( PackageFields :: DirectDependencyCount , Value :: Number ( n) ) => {
171
211
let Some ( n) = n. as_u64 ( ) else {
172
212
return false ;
173
213
} ;
174
- pkg. dependency_count ( ) < n as usize
214
+ pkg. direct_dependencies_count ( ) < n as usize
175
215
}
176
- ( PackageFields :: DependentCount , Value :: Number ( n) ) => {
216
+ ( PackageFields :: DirectDependentCount , Value :: Number ( n) ) => {
177
217
let Some ( n) = n. as_u64 ( ) else {
178
218
return false ;
179
219
} ;
180
- pkg. dependent_count ( ) < n as usize
220
+ pkg. direct_dependents_count ( ) < n as usize
181
221
}
182
- ( PackageFields :: ImmediateDependentCount , Value :: Number ( n) ) => {
222
+ ( PackageFields :: IndirectDependentCount , Value :: Number ( n) ) => {
183
223
let Some ( n) = n. as_u64 ( ) else {
184
224
return false ;
185
225
} ;
186
- pkg. immediate_dependents_count ( ) < n as usize
226
+ pkg. indirect_dependents_count ( ) < n as usize
187
227
}
188
- ( PackageFields :: ImmediateDependencyCount , Value :: Number ( n) ) => {
228
+ ( PackageFields :: IndirectDependencyCount , Value :: Number ( n) ) => {
189
229
let Some ( n) = n. as_u64 ( ) else {
190
230
return false ;
191
231
} ;
192
- pkg. immediate_dependencies_count ( ) < n as usize
232
+ pkg. indirect_dependencies_count ( ) < n as usize
233
+ }
234
+ ( PackageFields :: AllDependentCount , Value :: Number ( n) ) => {
235
+ let Some ( n) = n. as_u64 ( ) else {
236
+ return false ;
237
+ } ;
238
+ pkg. all_dependents_count ( ) < n as usize
239
+ }
240
+ ( PackageFields :: AllDependencyCount , Value :: Number ( n) ) => {
241
+ let Some ( n) = n. as_u64 ( ) else {
242
+ return false ;
243
+ } ;
244
+ pkg. all_dependencies_count ( ) < n as usize
193
245
}
194
246
_ => false ,
195
247
}
@@ -319,7 +371,7 @@ impl Package {
319
371
}
320
372
321
373
/// The upstream packages that have this package as a direct dependency
322
- async fn dependents ( & self ) -> Result < Vec < Package > , Error > {
374
+ async fn direct_dependents ( & self ) -> Result < Vec < Package > , Error > {
323
375
let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
324
376
Ok ( self
325
377
. run
@@ -331,11 +383,12 @@ impl Package {
331
383
run : self . run . clone ( ) ,
332
384
name : package. as_package_name ( ) . clone ( ) ,
333
385
} )
386
+ . sorted_by ( |a, b| a. name . cmp ( & b. name ) )
334
387
. collect ( ) )
335
388
}
336
389
337
390
/// The downstream packages that directly depend on this package
338
- async fn dependencies ( & self ) -> Result < Vec < Package > , Error > {
391
+ async fn direct_dependencies ( & self ) -> Result < Vec < Package > , Error > {
339
392
let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
340
393
Ok ( self
341
394
. run
@@ -347,18 +400,55 @@ impl Package {
347
400
run : self . run . clone ( ) ,
348
401
name : package. as_package_name ( ) . clone ( ) ,
349
402
} )
403
+ . sorted_by ( |a, b| a. name . cmp ( & b. name ) )
404
+ . collect ( ) )
405
+ }
406
+
407
+ async fn all_dependents ( & self ) -> Result < Vec < Package > , Error > {
408
+ let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
409
+ Ok ( self
410
+ . run
411
+ . pkg_dep_graph ( )
412
+ . ancestors ( & node)
413
+ . iter ( )
414
+ . map ( |package| Package {
415
+ run : self . run . clone ( ) ,
416
+ name : package. as_package_name ( ) . clone ( ) ,
417
+ } )
418
+ . sorted_by ( |a, b| a. name . cmp ( & b. name ) )
419
+ . collect ( ) )
420
+ }
421
+
422
+ async fn all_dependencies ( & self ) -> Result < Vec < Package > , Error > {
423
+ let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
424
+ Ok ( self
425
+ . run
426
+ . pkg_dep_graph ( )
427
+ . dependencies ( & node)
428
+ . iter ( )
429
+ . map ( |package| Package {
430
+ run : self . run . clone ( ) ,
431
+ name : package. as_package_name ( ) . clone ( ) ,
432
+ } )
433
+ . sorted_by ( |a, b| a. name . cmp ( & b. name ) )
350
434
. collect ( ) )
351
435
}
352
436
353
437
/// The downstream packages that depend on this package, indirectly
354
438
async fn indirect_dependents ( & self ) -> Result < Vec < Package > , Error > {
355
439
let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
440
+ let immediate_dependents = self
441
+ . run
442
+ . pkg_dep_graph ( )
443
+ . immediate_ancestors ( & node)
444
+ . ok_or_else ( || Error :: PackageNotFound ( self . name . clone ( ) ) ) ?;
356
445
357
446
Ok ( self
358
447
. run
359
448
. pkg_dep_graph ( )
360
449
. ancestors ( & node)
361
450
. iter ( )
451
+ . filter ( |package| !immediate_dependents. contains ( * package) )
362
452
. map ( |package| Package {
363
453
run : self . run . clone ( ) ,
364
454
name : package. as_package_name ( ) . clone ( ) ,
@@ -370,12 +460,18 @@ impl Package {
370
460
/// The upstream packages that this package depends on, indirectly
371
461
async fn indirect_dependencies ( & self ) -> Result < Vec < Package > , Error > {
372
462
let node: PackageNode = PackageNode :: Workspace ( self . name . clone ( ) ) ;
463
+ let immediate_dependencies = self
464
+ . run
465
+ . pkg_dep_graph ( )
466
+ . immediate_dependencies ( & node)
467
+ . ok_or_else ( || Error :: PackageNotFound ( self . name . clone ( ) ) ) ?;
373
468
374
469
Ok ( self
375
470
. run
376
471
. pkg_dep_graph ( )
377
472
. dependencies ( & node)
378
473
. iter ( )
474
+ . filter ( |package| !immediate_dependencies. contains ( * package) )
379
475
. map ( |package| Package {
380
476
run : self . run . clone ( ) ,
381
477
name : package. as_package_name ( ) . clone ( ) ,
0 commit comments