@@ -21,29 +21,29 @@ import Distribution.Server.Util.Markdown
2121import Distribution.Server.Util.ServeTarball
2222 ( loadTarEntry )
2323import Distribution.Simple.Utils ( safeHead
24- , safeLast
25- )
24+ , safeLast )
2625import Distribution.Types.Version
2726import qualified Distribution.Utils.ShortText as S
2827
2928import qualified Codec.Archive.Tar as Tar
3029import Control.Exception ( SomeException (.. )
31- , handle
32- )
30+ , handle )
3331import qualified Data.ByteString.Lazy as BSL
3432import Data.List ( maximumBy
35- , sortBy
36- )
33+ , sortBy )
3734import Data.Maybe ( isNothing )
3835import Data.Ord ( comparing )
3936import qualified Data.Time.Clock as CL
4037import Distribution.Server.Packages.Readme
4138import GHC.Float ( int2Float )
4239import System.FilePath ( isExtensionOf )
4340
41+ -- HELPER FUNCTIONS
42+
4443handleConst :: a -> IO a -> IO a
4544handleConst c = handle (\ (_ :: SomeException ) -> return c)
4645
46+ -- Scorer stores rank information
4747data Scorer = Scorer
4848 { maximumS :: ! Float
4949 , score :: ! Float
@@ -70,6 +70,7 @@ total (Scorer a b) = b / a
7070scale :: Float -> Scorer -> Scorer
7171scale mx sc = fracScor mx (total sc)
7272
73+ -- calculates number of versions from version list
7374major :: Num a => [a ] -> a
7475major (x : _) = x
7576major _ = 0
@@ -86,6 +87,8 @@ numDays (Just first) (Just end) =
8687 (toRational CL. nominalDay)
8788numDays _ _ = 0
8889
90+ -- Score Calculations
91+
8992freshness :: [Version ] -> CL. UTCTime -> Bool -> IO Float
9093freshness [] _ _ = return 0
9194freshness (x : xs) lastUpd app =
@@ -148,6 +151,58 @@ readmeScore tarCache pkgI app = do
148151 rows = getListsTables stats
149152 sections = getSections stats
150153
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+
151206baseScore
152207 :: VersionsFeature
153208 -> Int
@@ -213,58 +268,6 @@ baseScore vers maintainers docs env tarCache versionList lastUploads pkgI = do
213268 return $ BlobStorage. filepath (serverBlobStore env) <$> blob
214269 documHas = queryHasDocumentation docs pkgId
215270
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-
268271temporalScore
269272 :: PackageDescription -> [CL. UTCTime ] -> [Version ] -> Int -> IO Scorer
270273temporalScore p lastUploads versionList recentDownloads = do
0 commit comments