1votos

Kata RestConsumer - Índice guay de un repositorio github en Haskell

por josejuan hace 3 años

Una.

Aquí tenéis la kata que hemos prouesto en el último IWT2 DojoUS. Espero que os guste. El índice guay (o G-Index) es un número que nos indica los guay que es un proyecto de github. Este índice se calcula con la siguiente fórmula: número de forks x 3 + número de estrellas + número de vistas (watchs). Escribe un fragmento de código que, dado un repositorio de Github y su dueño, calcule su G-index. Intenta utilizar TDD y un repositorio real de Github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{-# LANGUAGE DeriveGeneric #-} 
import System.Process 
import Data.Aeson 
import qualified Data.ByteString.Lazy.Char8 as C 
import Data.Maybe 
import GHC.IO.Exception 
import GHC.Generics 
 
-- Podemos representar un origen JSON como un tipo interno... 
data Repo = Repo { id               :: Int 
                 , stargazers_count :: Int 
                 , watchers_count   :: Int 
                 , forks_count      :: Int 
                 } deriving (Show, Generic) 
 
-- ... de forma automática. 
instance FromJSON Repo 
instance ToJSON Repo 
 
-- El cálculo del índice G 
computeGIndex r = forks_count r + 3 * stargazers_count r + watchers_count r 
 
-- Descarga de la información del repositorio 
downloadRepo user repo = do 
  jsonData <- downloadUrl $ "https://api.github.com/repos/" ++ user ++ "/" ++ repo 
  withMaybe jsonData $ return . decode . C.pack 
 
-- Descarga el repositorio y devuelve el índice en cuestión 
getGIndex user repo = downloadRepo user repo >>= flip withMaybe (return . Just . computeGIndex) 
 
 
 
 
 
 
-- Otras auxiliares 
withMaybe Nothing _ = return Nothing 
withMaybe (Just x) f = f x 
 
downloadUrl url = do 
  (status, output, _) <- readProcessWithExitCode "curl" [url] "" 
  return $ if status == ExitSuccess then Just output else Nothing 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.