on master help sign in
Update deps format in elm.json for apps

The new format has two sections (dependencies and test-dependencies) and they contain everything to fully constrain the project (direct and indirect) It is possible for packages to appear in both json.dependencies.indirect and json[‘test-dependencies’].direct in rare cases, so the duplicate entry check is delayed until a bit later in the process.

commit49e5b46a431b46ef28ac8079301af7fb87f58c68 authorEvan Czaplicki <evancz@users.noreply.github.com> dateSun 10 Jun 2018, 21:14 (8 years ago) parent3de162f
3 files changed+51−103
builder/src/Elm/Project/Json.hs+50−73 builder/src/Elm/Project/Summary.hs+1−1 builder/src/Reporting/Exit/Assets.hs−29
builder/src/Elm/Project/Json.hs+50−73
@@ -12,11 +12,10 @@ module Elm.Project.Json
1212 , read
1313 , pkgDecoder
1414 -- queries
15− , appSolution
1615 , isPlatformPackage
17− , get
1816 , getName
1917 , getExposed
18+ , check
2019 )
2120 where
2221
@@ -62,9 +61,10 @@ data AppInfo =
6261 AppInfo
6362 { _app_elm_version :: Version
6463 , _app_source_dirs :: [FilePath]
65− , _app_deps :: Map Name Version
66− , _app_test_deps :: Map Name Version
67− , _app_trans_deps :: Map Name Version
64+ , _app_deps_direct :: Map Name Version
65+ , _app_deps_trans :: Map Name Version
66+ , _app_test_direct :: Map Name Version
67+ , _app_test_trans :: Map Name Version
6868 }
6969
7070
@@ -103,15 +103,6 @@ defaultSummary =
103103-- QUERIES
104104
105105
106−appSolution :: AppInfo -> Map Name Version
107−appSolution info =
108− Map.unions
109− [ _app_deps info
110− , _app_test_deps info
111− , _app_trans_deps info
112− ]
113−
114−
115106isPlatformPackage :: Project -> Bool
116107isPlatformPackage project =
117108 case project of
@@ -120,25 +111,20 @@ isPlatformPackage project =
120111
121112 Pkg info ->
122113 let
123− (Pkg.Name user _) =
114+ (Pkg.Name author _) =
124115 _pkg_name info
125116 in
126− user == "elm" || user == "elm-explorations"
117+ author == "elm" || author == "elm-explorations"
127118
128119
129−get :: (AppInfo -> a) -> (PkgInfo -> a) -> Project -> a
130−get appFunc pkgFunc project =
120+getName :: Project -> Name
121+getName project =
131122 case project of
132− App info ->
133− appFunc info
123+ App _ ->
124+ Pkg.dummyName
134125
135126 Pkg info ->
136− pkgFunc info
137−
138−
139−getName :: Project -> Name
140−getName project =
141− get (\_ -> Pkg.dummyName) _pkg_name project
127+ _pkg_name info
142128
143129
144130getExposed :: PkgInfo -> [Module.Raw]
@@ -151,6 +137,25 @@ getExposed info =
151137 concatMap snd chunks
152138
153139
140+check :: Project -> Task.Task ()
141+check project =
142+ case project of
143+ Pkg (PkgInfo _ _ _ _ _ deps _ _) ->
144+ if Map.member Pkg.core deps
145+ then return ()
146+ else throwBadJson E.NoPkgCore
147+
148+ App (AppInfo _ _ direct indirect _ _) ->
149+ if Map.member Pkg.core direct then
150+
151+ if Map.member Pkg.json direct || Map.member Pkg.json indirect
152+ then return ()
153+ else throwBadJson E.NoAppJson
154+
155+ else
156+ throwBadJson E.NoAppCore
157+
158+
154159
155160-- WRITE
156161
@@ -167,15 +172,21 @@ write root project =
167172encode :: Project -> E.Value
168173encode project =
169174 case project of
170− App (AppInfo elm srcDirs deps tests trans) ->
175+ App (AppInfo elm srcDirs depsDirect depsTrans testDirect testTrans) ->
171176 E.object
172177 [ "type" ==> E.text "application"
173178 , "source-directories" ==> E.list (E.text . Text.pack) srcDirs
174179 , "elm-version" ==> encodeVersion elm
175− , "dependencies" ==> encodeDeps encodeVersion deps
176− , "test-dependencies" ==> encodeDeps encodeVersion tests
177− , "do-not-edit-this-by-hand" ==>
178− E.object [ "transitive-dependencies" ==> encodeDeps encodeVersion trans ]
180+ , "dependencies" ==>
181+ E.object
182+ [ "direct" ==> encodeDeps encodeVersion depsDirect
183+ , "indirect" ==> encodeDeps encodeVersion depsTrans
184+ ]
185+ , "test-dependencies" ==>
186+ E.object
187+ [ "direct" ==> encodeDeps encodeVersion testDirect
188+ , "indirect" ==> encodeDeps encodeVersion testTrans
189+ ]
179190 ]
180191
181192 Pkg (PkgInfo name summary license version exposed deps tests elm) ->
@@ -238,17 +249,11 @@ read path =
238249 Left err ->
239250 throwBadJson (E.BadJson err)
240251
241− Right project@(Pkg (PkgInfo name _ _ _ _ deps tests _)) ->
242− do checkOverlap "dependencies" "test-dependencies" deps tests
243− pkgHasCore name deps
244− return project
252+ Right project@(Pkg _) ->
253+ return project
245254
246− Right project@(App (AppInfo _ srcDirs deps tests trans)) ->
247− do checkOverlap "dependencies" "test-dependencies" deps tests
248− checkOverlap "dependencies" "transitive-dependencies" deps trans
249− checkOverlap "test-dependencies" "transitive-dependencies" tests trans
250− mapM_ doesDirectoryExist srcDirs
251− appHasCoreAndJson (Map.union deps trans)
255+ Right project@(App (AppInfo _ srcDirs _ _ _ _)) ->
256+ do mapM_ doesDirectoryExist srcDirs
252257 return project
253258
254259
@@ -257,16 +262,6 @@ throwBadJson problem =
257262 Task.throw (Exit.Assets (E.BadElmJson problem))
258263
259264
260−checkOverlap :: String -> String -> Map Name a -> Map Name a -> Task.Task ()
261−checkOverlap field1 field2 deps1 deps2 =
262− case Map.keys (Map.intersection deps1 deps2) of
263− [] ->
264− return ()
265−
266− dup : dups ->
267− throwBadJson (E.BadDepDup field1 field2 dup dups)
268−
269−
270265doesDirectoryExist :: FilePath -> Task.Task ()
271266doesDirectoryExist dir =
272267 do exists <- liftIO $ Dir.doesDirectoryExist dir
@@ -275,25 +270,6 @@ doesDirectoryExist dir =
275270 else throwBadJson (E.BadSrcDir dir)
276271
277272
278−appHasCoreAndJson :: Map Name a -> Task.Task ()
279−appHasCoreAndJson pkgs =
280− if Map.member Pkg.core pkgs then
281−
282− if Map.member Pkg.json pkgs
283− then return ()
284− else throwBadJson E.NoAppJson
285−
286− else
287− throwBadJson E.NoAppCore
288−
289−
290−pkgHasCore :: Name -> Map Name a -> Task.Task ()
291−pkgHasCore name pkgs =
292− if name == Pkg.core || Map.member Pkg.core pkgs
293− then return ()
294− else throwBadJson E.NoPkgCore
295−
296−
297273
298274-- JSON DECODE
299275
@@ -321,9 +297,10 @@ appDecoder =
321297 AppInfo
322298 <$> D.field "elm-version" versionDecoder
323299 <*> D.field "source-directories" (D.list dirDecoder)
324− <*> D.field "dependencies" (depsDecoder versionDecoder)
325− <*> D.field "test-dependencies" (depsDecoder versionDecoder)
326− <*> D.at ["do-not-edit-this-by-hand", "transitive-dependencies"] (depsDecoder versionDecoder)
300+ <*> D.field "dependencies" (D.field "direct" (depsDecoder versionDecoder))
301+ <*> D.field "dependencies" (D.field "indirect" (depsDecoder versionDecoder))
302+ <*> D.field "test-dependencies" (D.field "direct" (depsDecoder versionDecoder))
303+ <*> D.field "test-dependencies" (D.field "indirect" (depsDecoder versionDecoder))
327304
328305
329306pkgDecoder :: Decoder PkgInfo
builder/src/Elm/Project/Summary.hs+1−1
@@ -52,7 +52,7 @@ init root project deps ifaces =
5252 exposed =
5353 case project of
5454 Project.App info ->
55− getExposed deps (_app_deps info)
55+ getExposed deps (_app_deps_direct info)
5656
5757 Project.Pkg info ->
5858 getExposed deps (_pkg_deps info)
builder/src/Reporting/Exit/Assets.hs−29
@@ -34,7 +34,6 @@ data Exit
3434
3535data ElmJsonProblem
3636 = BadJson D.Doc
37− | BadDepDup String String Pkg.Name [Pkg.Name]
3837 | BadSrcDir FilePath
3938 | NoPkgCore
4039 | NoAppCore
@@ -130,34 +129,6 @@ elmJsonProblemToReport problem =
130129
131130
132131
133− BadDepDup field1 field2 dup dups ->
134− let
135− packagesAre =
136− if null dups then "package is" else "packages are"
137−
138− advice =
139− if null dups then
140− "Delete one of the entries."
141− else
142− "Delete duplicates until each package lives in ONE category."
143− in
144− Help.report "BAD JSON" (Just "elm.json")
145− (
146− if null dups then
147− "The following package appears twice in your elm.json file:"
148− else
149− "The following packages appear twice in your elm.json file:"
150− )
151− [ D.dullyellow $ D.indent 4 $ D.vcat $
152− map (D.fromString . Pkg.toString) (dup:dups)
153− , D.reflow $
154− "The " ++ packagesAre ++ " available in \"" ++ field1
155− ++ "\", so it is redundant to list it again in \"" ++ field2
156− ++ "\". It is already available! " ++ advice
157− ]
158−
159−
160−
161132-- PROBLEM TO DOCS
162133
163134