Skip to content

Commit

Permalink
Fixes #64 add test flag to install command
Browse files Browse the repository at this point in the history
  • Loading branch information
decioferreira committed Feb 6, 2025
1 parent 0c27a3e commit f0566fb
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 20 deletions.
16 changes: 12 additions & 4 deletions src/Builder/Deps/Solver.elm
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,8 @@ getTransitive constraints solution unvisited visited =
-- ADD TO APP - used in Install


addToApp : Stuff.PackageCache -> Connection -> Registry.Registry -> Pkg.Name -> Outline.AppOutline -> IO (SolverResult AppSolution)
addToApp cache connection registry pkg (Outline.AppOutline elm srcDirs direct indirect testDirect testIndirect) =
addToApp : Stuff.PackageCache -> Connection -> Registry.Registry -> Pkg.Name -> Outline.AppOutline -> Bool -> IO (SolverResult AppSolution)
addToApp cache connection registry pkg (Outline.AppOutline elm srcDirs direct indirect testDirect testIndirect) forTest =
Stuff.withRegistryLock cache <|
let
allIndirects : Dict ( String, String ) Pkg.Name V.Version
Expand Down Expand Up @@ -196,15 +196,23 @@ addToApp cache connection registry pkg (Outline.AppOutline elm srcDirs direct in
let
d : Dict ( String, String ) Pkg.Name V.Version
d =
Dict.intersection Pkg.compareName new (Dict.insert identity pkg V.one direct)
if forTest then
Dict.intersection Pkg.compareName new direct

else
Dict.intersection Pkg.compareName new (Dict.insert identity pkg V.one direct)

i : Dict ( String, String ) Pkg.Name V.Version
i =
Dict.diff (getTransitive constraints new (Dict.toList compare d) Dict.empty) d

td : Dict ( String, String ) Pkg.Name V.Version
td =
Dict.intersection Pkg.compareName new (Dict.remove identity pkg testDirect)
if forTest then
Dict.intersection Pkg.compareName new (Dict.insert identity pkg V.one testDirect)

else
Dict.intersection Pkg.compareName new (Dict.remove identity pkg testDirect)

ti : Dict ( String, String ) Pkg.Name V.Version
ti =
Expand Down
138 changes: 127 additions & 11 deletions src/Terminal/Install.elm
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ type Args


type Flags
= Flags Bool
= Flags Bool Bool


run : Args -> Flags -> IO ()
run args (Flags autoYes) =
run args (Flags forTest autoYes) =
Reporting.attempt Exit.installToReport
(Stuff.findRoot
|> IO.bind
Expand All @@ -61,11 +61,11 @@ run args (Flags autoYes) =
(\oldOutline ->
case oldOutline of
Outline.App outline ->
makeAppPlan env pkg outline
makeAppPlan env pkg outline forTest
|> Task.bind (\changes -> attemptChanges root env oldOutline V.toChars changes autoYes)

Outline.Pkg outline ->
makePkgPlan env pkg outline
makePkgPlan env pkg outline forTest
|> Task.bind (\changes -> attemptChanges root env oldOutline C.toChars changes autoYes)
)
)
Expand Down Expand Up @@ -222,9 +222,57 @@ attemptChangesHelp root env oldOutline newOutline autoYes question =
-- MAKE APP PLAN


makeAppPlan : Solver.Env -> Pkg.Name -> Outline.AppOutline -> Task (Changes V.Version)
makeAppPlan (Solver.Env cache _ connection registry) pkg ((Outline.AppOutline elmVersion sourceDirs direct indirect testDirect testIndirect) as outline) =
if Dict.member identity pkg direct then
makeAppPlan : Solver.Env -> Pkg.Name -> Outline.AppOutline -> Bool -> Task (Changes V.Version)
makeAppPlan (Solver.Env cache _ connection registry) pkg ((Outline.AppOutline elmVersion sourceDirs direct indirect testDirect testIndirect) as outline) forTest =
if forTest then
if Dict.member identity pkg testDirect then
Task.pure AlreadyInstalled

else
(-- is it already an indirect test dependency?
case Dict.get identity pkg testIndirect of
Just vsn ->
Task.pure <|
PromoteTest <|
Outline.App <|
Outline.AppOutline elmVersion
sourceDirs
direct
indirect
(Dict.insert identity pkg vsn testDirect)
(Dict.remove identity pkg testIndirect)

Nothing ->
-- finally try to add it from scratch
case Registry.getVersions_ pkg registry of
Err suggestions ->
case connection of
Solver.Online _ ->
Task.throw (Exit.InstallUnknownPackageOnline pkg suggestions)

Solver.Offline ->
Task.throw (Exit.InstallUnknownPackageOffline pkg suggestions)

Ok _ ->
Task.io (Solver.addToApp cache connection registry pkg outline forTest)
|> Task.bind
(\result ->
case result of
Solver.SolverOk (Solver.AppSolution old new app) ->
Task.pure (Changes (detectChanges old new) (Outline.App app))

Solver.NoSolution ->
Task.throw (Exit.InstallNoOnlineAppSolution pkg)

Solver.NoOfflineSolution ->
Task.throw (Exit.InstallNoOfflineAppSolution pkg)

Solver.SolverErr exit ->
Task.throw (Exit.InstallHadSolverTrouble exit)
)
)

else if Dict.member identity pkg direct then
Task.pure AlreadyInstalled

else
Expand Down Expand Up @@ -281,7 +329,7 @@ makeAppPlan (Solver.Env cache _ connection registry) pkg ((Outline.AppOutline el
Task.throw (Exit.InstallUnknownPackageOffline pkg suggestions)

Ok _ ->
Task.io (Solver.addToApp cache connection registry pkg outline)
Task.io (Solver.addToApp cache connection registry pkg outline forTest)
|> Task.bind
(\result ->
case result of
Expand All @@ -303,9 +351,77 @@ makeAppPlan (Solver.Env cache _ connection registry) pkg ((Outline.AppOutline el
-- MAKE PACKAGE PLAN


makePkgPlan : Solver.Env -> Pkg.Name -> Outline.PkgOutline -> Task (Changes C.Constraint)
makePkgPlan (Solver.Env cache _ connection registry) pkg (Outline.PkgOutline name summary license version exposed deps test elmVersion) =
if Dict.member identity pkg deps then
makePkgPlan : Solver.Env -> Pkg.Name -> Outline.PkgOutline -> Bool -> Task (Changes C.Constraint)
makePkgPlan (Solver.Env cache _ connection registry) pkg (Outline.PkgOutline name summary license version exposed deps test elmVersion) forTest =
if forTest then
if Dict.member identity pkg test then
Task.pure AlreadyInstalled

else
-- try to add a new dependency
case Registry.getVersions_ pkg registry of
Err suggestions ->
case connection of
Solver.Online _ ->
Task.throw (Exit.InstallUnknownPackageOnline pkg suggestions)

Solver.Offline ->
Task.throw (Exit.InstallUnknownPackageOffline pkg suggestions)

Ok (Registry.KnownVersions _ _) ->
let
cons : Dict ( String, String ) Pkg.Name C.Constraint
cons =
Dict.insert identity pkg C.anything test
in
Task.io (Solver.verify cache connection registry cons)
|> Task.bind
(\result ->
case result of
Solver.SolverOk solution ->
let
(Solver.Details vsn _) =
Utils.find identity pkg solution

con : C.Constraint
con =
C.untilNextMajor vsn

newTest : Dict ( String, String ) Pkg.Name C.Constraint
newTest =
Dict.insert identity pkg con test

changes : Dict ( String, String ) Pkg.Name (Change C.Constraint)
changes =
detectChanges test newTest

news : Dict ( String, String ) Pkg.Name C.Constraint
news =
Utils.mapMapMaybe identity Pkg.compareName keepNew changes
in
Task.pure <|
Changes changes <|
Outline.Pkg <|
Outline.PkgOutline name
summary
license
version
exposed
deps
(addNews (Just pkg) news test)
elmVersion

Solver.NoSolution ->
Task.throw (Exit.InstallNoOnlinePkgSolution pkg)

Solver.NoOfflineSolution ->
Task.throw (Exit.InstallNoOfflinePkgSolution pkg)

Solver.SolverErr exit ->
Task.throw (Exit.InstallHadSolverTrouble exit)
)

else if Dict.member identity pkg deps then
Task.pure AlreadyInstalled

else
Expand Down
2 changes: 2 additions & 0 deletions src/Terminal/Main.elm
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ install =
installFlags : Terminal.Flags
installFlags =
Terminal.flags
|> Terminal.more (Terminal.onOff "test" "Install as a test-dependency.")
|> Terminal.more (Terminal.onOff "yes" "Reply 'yes' to all automated prompts.")
in
Terminal.Command "install" Terminal.Uncommon details example installArgs installFlags <|
Expand All @@ -270,6 +271,7 @@ install =
)
]
(Chomp.pure Install.Flags
|> Chomp.apply (Chomp.chompOnOffFlag "test")
|> Chomp.apply (Chomp.chompOnOffFlag "yes")
|> Chomp.bind
(\value ->
Expand Down
11 changes: 6 additions & 5 deletions src/Terminal/Uninstall.elm
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,13 @@ makeAppPlan (Solver.Env cache _ connection registry) pkg ((Outline.AppOutline _

makePkgPlan : Pkg.Name -> Outline.PkgOutline -> Task (Changes C.Constraint)
makePkgPlan pkg (Outline.PkgOutline name summary license version exposed deps test elmVersion) =
if Dict.member identity pkg deps then
let
old : Dict ( String, String ) Pkg.Name C.Constraint
old =
Dict.union deps test
in
if Dict.member identity pkg old then
let
old : Dict ( String, String ) Pkg.Name C.Constraint
old =
Dict.union deps test

new : Dict ( String, String ) Pkg.Name C.Constraint
new =
Dict.remove identity pkg old
Expand Down

0 comments on commit f0566fb

Please sign in to comment.