@@ -1,50 +1,52 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Develop.Generate.Index
3module Develop.Generate.Index
10import Control.Monad (filterM)
9import Control.Monad (filterM)
11import qualified Data.ByteString.Builder as B
10import qualified Data.ByteString.Builder as B
12−import qualified Data.ByteString.Lazy.UTF8 as Utf8
11+import qualified Data.Map as Map
13−import qualified Data.List as List
14import qualified Data.Text as Text
12import qualified Data.Text as Text
15import qualified Data.Text.IO as Text
13import qualified Data.Text.IO as Text
16import qualified System.Directory as Dir
14import qualified System.Directory as Dir
17−import System.FilePath ((</>), joinPath, splitDirectories, takeExtension)
15+import System.FilePath ((</>), splitDirectories, takeExtension)
18−import qualified Text.Blaze.Html5 as H
20import qualified Develop.Generate.Help as Help
17import qualified Develop.Generate.Help as Help
21−import qualified Develop.StaticFiles as StaticFiles
18+import qualified Elm.Package as Pkg
19+import qualified Elm.Project.Json as Project
20+import qualified Elm.Project.Summary as Summary
22import qualified Json.Encode as E
21import qualified Json.Encode as E
22+import qualified Reporting.Progress as Progress
23+import qualified Reporting.Task as Task
24+import qualified Stuff.Verify as Verify
29−data Project =
31+get :: FilePath -> FilePath -> IO B.Builder
30− Project
32+get root pwd =
31− { _root :: FilePath
33+ do flags <- getFlags root pwd
32− , _info :: PerhapsInfo
34+ return $ Help.makePageHtml "Index" (E.encode (encode flags))
37− = Bad (Maybe FilePath)
41−data Info =
41+data Flags =
43− { _pwd :: [String]
44+ , _pwd :: [String]
44 , _dirs :: [FilePath]
45 , _dirs :: [FilePath]
45 , _files :: [(FilePath, Bool)]
46 , _files :: [(FilePath, Bool)]
46 , _readme :: Maybe Text.Text
47 , _readme :: Maybe Text.Text
47− , _config :: Text.Text
48+ , _project :: Maybe Project.Project
49+ , _exactDeps :: Map.Map Pkg.Name Pkg.Version
@@ -52,17 +54,17 @@ data Info =
55−goodToJson :: FilePath -> Info -> String
57+encode :: Flags -> E.Value
56−goodToJson root (Info pwd dirs files readme config) =
58+encode (Flags root pwd dirs files readme project exactDeps) =
57− Utf8.toString $ B.toLazyByteString $ E.encodeUgly $
59− [ ( "root", encodeFilePath root )
60+ [ ( "root", encodeFilePath root )
60− , ( "pwd", E.list encodeFilePath pwd )
61+ , ( "pwd", E.list encodeFilePath pwd )
61− , ( "dirs", E.list encodeFilePath dirs )
62+ , ( "dirs", E.list encodeFilePath dirs )
62− , ( "files", E.list encodeFile files )
63+ , ( "files", E.list encodeFile files )
63− , ( "readme", maybe E.null E.text readme )
64+ , ( "readme", maybe E.null E.text readme )
64− , ( "config", E.text config )
65+ , ( "project", maybe E.null Project.encode project )
66+ , ( "exactDeps", E.dict Pkg.toText Pkg.encodeVersion exactDeps)
68encodeFilePath :: FilePath -> E.Value
70encodeFilePath :: FilePath -> E.Value
@@ -72,102 +74,37 @@ encodeFilePath filePath =
73encodeFile :: (FilePath, Bool) -> E.Value
75encodeFile :: (FilePath, Bool) -> E.Value
74encodeFile (file, hasMain) =
76encodeFile (file, hasMain) =
75− E.array [ encodeFilePath file, E.bool hasMain ]
78+ [ ("name", encodeFilePath file)
76−
79+ , ("runnable", E.bool hasMain)
78−badJson :: FilePath -> Maybe FilePath -> String
79−badJson root potentialRoot =
80− Utf8.toString $ B.toLazyByteString $ E.encodeUgly $
82− [ ( "root", encodeFilePath root )
83− , ( "suggestion", maybe E.null encodeFilePath potentialRoot )
91−toHtml :: Project -> H.Html
84+-- GET FLAGS
92−toHtml (Project root perhapsInfo) =
94− Good info@(Info pwd _ _ _ _) ->
96− (List.intercalate "/" ("~" : pwd))
97− ("/" ++ StaticFiles.elmPath)
98− ("Elm.Index.fullscreen(" ++ goodToJson root info ++ ");")
102− (maybe "New Project!" (const "Existing Project?") suggestion)
103− ("/" ++ StaticFiles.elmPath)
104− ("Elm.Start.fullscreen(" ++ badJson root suggestion ++ ");")
87+getFlags :: FilePath -> FilePath -> IO Flags
89+ do (dirs, files) <- getDirsAndFiles pwd
90+ readme <- getReadme pwd
93+ Task.run Progress.silentReporter $
94+ Verify.verify root =<< Project.read "elm.json"
111−getProject :: FilePath -> IO Project
112−getProject directory =
113− do root <- Dir.getCurrentDirectory
114− exists <- Dir.doesFileExist "elm.json"
118− Bad <$> findNearestConfig (splitDirectories root)
121− do json <- Text.readFile "elm.json"
122− Good <$> getInfo json directory
125−findNearestConfig :: [String] -> IO (Maybe FilePath)
126−findNearestConfig dirs =
131− do exists <- Dir.doesFileExist (joinPath dirs </> "elm.json")
133− then return (Just (joinPath dirs))
134− else findNearestConfig (init dirs)
139− do subDir <- Dir.getCurrentDirectory
140− maybeRoot <- findNearestConfig (splitDirectories subDir)
146− Dir.setCurrentDirectory root
153−getInfo :: Text.Text -> FilePath -> IO Info
154−getInfo config directory =
155− do (dirs, files) <- getDirectoryInfo directory
156− readme <- getReadme directory
159− { _pwd = dropWhile ("." ==) (splitDirectories directory)
99+ , _pwd = dropWhile ("." ==) (splitDirectories pwd)
160 , _dirs = dirs
100 , _dirs = dirs
161 , _files = files
101 , _files = files
162 , _readme = readme
102 , _readme = readme
163− , _config = config
103+ , _project = fmap Summary._project maybeSummary
104+ , _exactDeps = maybe Map.empty (Map.map fst . Summary._depsGraph) maybeSummary
171getReadme :: FilePath -> IO (Maybe Text.Text)
108getReadme :: FilePath -> IO (Maybe Text.Text)
172getReadme dir =
109getReadme dir =
173 do let readmePath = dir </> "README.md"
110 do let readmePath = dir </> "README.md"
@@ -177,28 +114,21 @@ getReadme dir =
177 else return Nothing
114 else return Nothing
181−-- DIRECTORIES / FILES
184−getDirectoryInfo :: FilePath -> IO ([FilePath], [(FilePath, Bool)])
117+getDirsAndFiles :: FilePath -> IO ([FilePath], [(FilePath, Bool)])
185−getDirectoryInfo dir =
118+getDirsAndFiles pwd =
186− do contents <- Dir.getDirectoryContents dir
119+ do contents <- Dir.getDirectoryContents pwd
188− allDirs <- filterM (Dir.doesDirectoryExist . (dir </>)) contents
120+ dirs <- filterM (Dir.doesDirectoryExist . (pwd </>)) contents
189− rawFiles <- filterM (Dir.doesFileExist . (dir </>)) contents
121+ filePaths <- filterM (Dir.doesFileExist . (pwd </>)) contents
191− files <- mapM (inspectFile dir) rawFiles
122+ files <- mapM (inspectFile pwd) filePaths
193− return (allDirs, files)
123+ return (dirs, files)
196inspectFile :: FilePath -> FilePath -> IO (FilePath, Bool)
126inspectFile :: FilePath -> FilePath -> IO (FilePath, Bool)
197−inspectFile dir filePath =
127+inspectFile pwd path =
198− if takeExtension filePath == ".elm" then
128+ if takeExtension path == ".elm" then
199− do source <- Text.readFile (dir </> filePath)
129+ do source <- Text.readFile (pwd </> path)
200 let hasMain = Text.isInfixOf "\nmain " source
130 let hasMain = Text.isInfixOf "\nmain " source
201− return (filePath, hasMain)
131+ return (path, hasMain)
204− return (filePath, False)
134+ return (path, False)