@@ -21,29 +21,29 @@ import Distribution.Server.Util.Markdown
21
21
import Distribution.Server.Util.ServeTarball
22
22
( loadTarEntry )
23
23
import Distribution.Simple.Utils ( safeHead
24
- , safeLast
25
- )
24
+ , safeLast )
26
25
import Distribution.Types.Version
27
26
import qualified Distribution.Utils.ShortText as S
28
27
29
28
import qualified Codec.Archive.Tar as Tar
30
29
import Control.Exception ( SomeException (.. )
31
- , handle
32
- )
30
+ , handle )
33
31
import qualified Data.ByteString.Lazy as BSL
34
32
import Data.List ( maximumBy
35
- , sortBy
36
- )
33
+ , sortBy )
37
34
import Data.Maybe ( isNothing )
38
35
import Data.Ord ( comparing )
39
36
import qualified Data.Time.Clock as CL
40
37
import Distribution.Server.Packages.Readme
41
38
import GHC.Float ( int2Float )
42
39
import System.FilePath ( isExtensionOf )
43
40
41
+ -- HELPER FUNCTIONS
42
+
44
43
handleConst :: a -> IO a -> IO a
45
44
handleConst c = handle (\ (_ :: SomeException ) -> return c)
46
45
46
+ -- Scorer stores rank information
47
47
data Scorer = Scorer
48
48
{ maximumS :: ! Float
49
49
, score :: ! Float
@@ -70,6 +70,7 @@ total (Scorer a b) = b / a
70
70
scale :: Float -> Scorer -> Scorer
71
71
scale mx sc = fracScor mx (total sc)
72
72
73
+ -- calculates number of versions from version list
73
74
major :: Num a => [a ] -> a
74
75
major (x : _) = x
75
76
major _ = 0
@@ -86,6 +87,8 @@ numDays (Just first) (Just end) =
86
87
(toRational CL. nominalDay)
87
88
numDays _ _ = 0
88
89
90
+ -- Score Calculations
91
+
89
92
freshness :: [Version ] -> CL. UTCTime -> Bool -> IO Float
90
93
freshness [] _ _ = return 0
91
94
freshness (x : xs) lastUpd app =
@@ -148,6 +151,58 @@ readmeScore tarCache pkgI app = do
148
151
rows = getListsTables stats
149
152
sections = getSections stats
150
153
154
+ authorScore :: Int -> PackageDescription -> Scorer
155
+ authorScore maintainers desc =
156
+ boolScor 1 (not $ S. null $ author desc) <> maintScore
157
+ where
158
+ maintScore = boolScor 3 (maintainers > 1 ) <> scorer 5 (int2Float maintainers)
159
+
160
+ codeScore :: Float -> Float -> Scorer
161
+ codeScore documentS haskellL =
162
+ boolScor 1 (haskellL > 700 )
163
+ <> boolScor 1 (haskellL < 80000 )
164
+ <> fracScor 2 (min 1 (haskellL / 5000 ))
165
+ <> fracScor 2 (min 1 (documentS / ((3000 + haskellL) * 1600 )))
166
+
167
+ versionScore
168
+ :: [Version ]
169
+ -> VersionsFeature
170
+ -> [CL. UTCTime ]
171
+ -> PackageDescription
172
+ -> IO Scorer
173
+ versionScore versionList versions lastUploads desc = do
174
+ use <- intUsable
175
+ depre <- deprec
176
+ return $ calculateScore depre lastUploads use
177
+ where
178
+ pkgNm = pkgName $ package desc
179
+ partVers =
180
+ flip partitionVersions versionList <$> queryGetPreferredInfo versions pkgNm
181
+ intUsable = do
182
+ (norm, _, unpref) <- partVers
183
+ return $ versionNumbers <$> norm ++ unpref
184
+ deprec = do
185
+ (_, deprecN, _) <- partVers
186
+ return deprecN
187
+ calculateScore :: [Version ] -> [CL. UTCTime ] -> [[Int ]] -> Scorer
188
+ calculateScore depre lUps intUse =
189
+ boolScor 20 (length intUse > 1 )
190
+ <> scorer 40 (numDays (safeHead lUps) (safeLast lUps) / 11 )
191
+ <> scorer
192
+ 15
193
+ (int2Float $ length $ filter (\ x -> major x > 0 || minor x > 0 )
194
+ intUse
195
+ )
196
+ <> scorer
197
+ 20
198
+ (int2Float $ 4 * length
199
+ (filter (\ x -> major x > 0 && patches x > 0 ) intUse)
200
+ )
201
+ <> scorer 10 (int2Float $ patches $ maximumBy (comparing patches) intUse)
202
+ <> boolScor 8 (any (\ x -> major x == 0 && patches x > 0 ) intUse)
203
+ <> boolScor 10 (any (\ x -> major x > 0 && major x < 20 ) intUse)
204
+ <> boolScor 5 (not $ null depre)
205
+
151
206
baseScore
152
207
:: VersionsFeature
153
208
-> Int
@@ -213,58 +268,6 @@ baseScore vers maintainers docs env tarCache versionList lastUploads pkgI = do
213
268
return $ BlobStorage. filepath (serverBlobStore env) <$> blob
214
269
documHas = queryHasDocumentation docs pkgId
215
270
216
- authorScore :: Int -> PackageDescription -> Scorer
217
- authorScore maintainers desc =
218
- boolScor 1 (not $ S. null $ author desc) <> maintScore
219
- where
220
- maintScore = boolScor 3 (maintainers > 1 ) <> scorer 5 (int2Float maintainers)
221
-
222
- codeScore :: Float -> Float -> Scorer
223
- codeScore documentS haskellL =
224
- boolScor 1 (haskellL > 700 )
225
- <> boolScor 1 (haskellL < 80000 )
226
- <> fracScor 2 (min 1 (haskellL / 5000 ))
227
- <> fracScor 2 (min 1 (documentS / ((3000 + haskellL) * 1600 )))
228
-
229
- versionScore
230
- :: [Version ]
231
- -> VersionsFeature
232
- -> [CL. UTCTime ]
233
- -> PackageDescription
234
- -> IO Scorer
235
- versionScore versionList versions lastUploads desc = do
236
- use <- intUsable
237
- depre <- deprec
238
- return $ calculateScore depre lastUploads use
239
- where
240
- pkgNm = pkgName $ package desc
241
- partVers =
242
- flip partitionVersions versionList <$> queryGetPreferredInfo versions pkgNm
243
- intUsable = do
244
- (norm, _, unpref) <- partVers
245
- return $ versionNumbers <$> norm ++ unpref
246
- deprec = do
247
- (_, deprecN, _) <- partVers
248
- return deprecN
249
- calculateScore :: [Version ] -> [CL. UTCTime ] -> [[Int ]] -> Scorer
250
- calculateScore depre lUps intUse =
251
- boolScor 20 (length intUse > 1 )
252
- <> scorer 40 (numDays (safeHead lUps) (safeLast lUps) / 11 )
253
- <> scorer
254
- 15
255
- (int2Float $ length $ filter (\ x -> major x > 0 || minor x > 0 )
256
- intUse
257
- )
258
- <> scorer
259
- 20
260
- (int2Float $ 4 * length
261
- (filter (\ x -> major x > 0 && patches x > 0 ) intUse)
262
- )
263
- <> scorer 10 (int2Float $ patches $ maximumBy (comparing patches) intUse)
264
- <> boolScor 8 (any (\ x -> major x == 0 && patches x > 0 ) intUse)
265
- <> boolScor 10 (any (\ x -> major x > 0 && major x < 20 ) intUse)
266
- <> boolScor 5 (not $ null depre)
267
-
268
271
temporalScore
269
272
:: PackageDescription -> [CL. UTCTime ] -> [Version ] -> Int -> IO Scorer
270
273
temporalScore p lastUploads versionList recentDownloads = do
0 commit comments