Skip to content

Commit 969576f

Browse files
committed
Fix SourceRepoParser, Add Expectations (#6101)
1 parent 0070444 commit 969576f

File tree

2 files changed

+61
-61
lines changed

2 files changed

+61
-61
lines changed

cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ module Distribution.Client.ProjectConfig.Parsec (
1313
runParseResult
1414
) where
1515

16-
import Control.Monad.State.Strict (StateT, execStateT, lift)
16+
import Control.Monad.State.Strict (StateT, execStateT, lift, modify)
1717
import Distribution.CabalSpecVersion
1818
import Distribution.Compat.Lens
1919
import Distribution.Compat.Prelude
2020
import Distribution.FieldGrammar
2121
-- TODO #6101 .Legacy -> ProjectConfigSkeleton should probably be moved here
2222
import Distribution.Client.ProjectConfig.FieldGrammar (projectConfigFieldGrammar)
2323
import Distribution.Client.ProjectConfig.Legacy (ProjectConfigSkeleton, ProjectConfigImport)
24+
import qualified Distribution.Client.ProjectConfig.Lens as L
2425
import Distribution.Client.ProjectConfig.Types (ProjectConfig (..))
2526
import Distribution.Client.Types.SourceRepo (sourceRepositoryPackageGrammar, SourceRepoList)
2627
import Distribution.Fields.ConfVar (parseConditionConfVar)
@@ -69,25 +70,27 @@ parseProjectSkeleton' lexWarnings utf8WarnPos fs = do
6970
parseCondTree fs
7071

7172
-- List of conditional blocks
72-
newtype Conditionals = Conditionals [[Section Position]]
73+
newtype Conditional ann = Conditional [Section ann]
74+
deriving (Eq, Show)
7375

74-
-- | Separate conditional blocks from other sections so
76+
-- | Separate valid conditional blocks from other sections so
7577
-- all conditionals form their own groups.
76-
partitionConditionals :: [[Section Position]] -> ([[Section Position]], Conditionals)
77-
partitionConditionals sections = undefined
78+
-- TODO implement
79+
partitionConditionals :: [[Section ann]] -> ([Section ann], [Conditional ann])
80+
partitionConditionals sections = (concat sections, [])
7881

7982
parseCondTree
8083
:: [Field Position]
8184
-> ParseResult ProjectConfigSkeleton
8285
parseCondTree fields0 = do
8386
-- sections are groups of sections between fields
84-
let (fs, sections) = partitionFields fields0
85-
(sectionGroups, conditionals) = partitionConditionals sections
87+
let (fs, sectionGroups) = partitionFields fields0
88+
(sections, conditionals) = partitionConditionals sectionGroups
8689
msg = show sectionGroups
8790
imports <- parseImports fs
8891
config <- parseFieldGrammar cabalSpecLatest fs projectConfigFieldGrammar
89-
config' <- view stateConfig <$> execStateT (goSections sectionGroups) (SectionS config)
90-
let configSkeleton = CondNode config imports []
92+
config' <- view stateConfig <$> execStateT (goSections sections) (SectionS config)
93+
let configSkeleton = CondNode config' imports []
9194
-- TODO parse conditionals
9295
return configSkeleton
9396

@@ -103,17 +106,15 @@ stateConfig :: Lens' SectionS ProjectConfig
103106
stateConfig f (SectionS cfg) = SectionS <$> f cfg
104107
{-# INLINEABLE stateConfig #-}
105108

106-
goSections :: [[Section Position]] -> SectionParser ()
107-
goSections = traverse_ parseSectionGroup
108-
109-
parseSectionGroup :: [Section Position] -> SectionParser ()
110-
parseSectionGroup = traverse_ parseSection
109+
goSections :: [Section Position] -> SectionParser ()
110+
goSections = traverse_ parseSection
111111

112112
parseSection :: Section Position -> SectionParser ()
113113
parseSection (MkSection (Name pos name) args secFields)
114114
| name == "source-repository-package" = do
115115
let (fields, secs) = partitionFields secFields
116116
srp <- lift $ parseFieldGrammar cabalSpecLatest fields sourceRepositoryPackageGrammar
117+
stateConfig . L.projectPackagesRepo %= (++ [srp])
117118
unless (null secs) (warnInvalidSubsection pos name)
118119
| otherwise = do
119120
warnInvalidSubsection pos name
Lines changed: 46 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,37 @@
11
-- | Integration Tests related to parsing of ProjectConfigs
2-
32
module IntegrationTests2.ProjectConfig.ParsecTests (parserTests) where
43

5-
import qualified Data.ByteString as BS
6-
import System.Directory
7-
import System.FilePath
8-
import Test.Tasty
9-
import Test.Tasty.HUnit
10-
import Test.Tasty.Options
11-
12-
import Distribution.Client.HttpUtils
4+
import qualified Data.ByteString as BS
135
import Distribution.Client.DistDirLayout
6+
import Distribution.Client.HttpUtils
147
import Distribution.Client.ProjectConfig
8+
import Distribution.Client.ProjectConfig.Parsec
159
import Distribution.Client.RebuildMonad (runRebuild)
10+
import Distribution.Client.Types.SourceRepo
1611
import Distribution.Types.CondTree (CondTree (..))
1712
import Distribution.Types.PackageName
1813
import Distribution.Types.PackageVersionConstraint (PackageVersionConstraint (..))
14+
import Distribution.Types.SourceRepo (KnownRepoType (..), RepoType (..))
1915
import Distribution.Types.Version (Version, mkVersion)
2016
import Distribution.Types.VersionRange.Internal (VersionRange (..))
2117
import Distribution.Verbosity
18+
import System.Directory
19+
import System.FilePath
20+
import Test.Tasty
21+
import Test.Tasty.HUnit
22+
import Test.Tasty.Options
2223

2324
-- TODO create tests:
2425
-- - parser tests to read and compare to expected values
2526
-- - golden tests for warnings and errors
2627
parserTests :: [TestTree]
27-
parserTests = [
28-
-- testCase "read with legacy parser" testLegacyRead
29-
testCase "read packages" testPackages
30-
, testCase "read optional-packages" testOptionalPackages
31-
, testCase "read extra-packages" testExtraPackages
32-
, testCase "read source-repository-package" testSourceRepoList
28+
parserTests =
29+
[ testCase "read packages" testPackages,
30+
testCase "read optional-packages" testOptionalPackages,
31+
testCase "read extra-packages" testExtraPackages,
32+
testCase "read source-repository-package" testSourceRepoList
3333
]
3434

35-
testLegacyRead :: Assertion
36-
testLegacyRead = do
37-
httpTransport <- configureTransport verbosity [] Nothing
38-
projectRootDir <- canonicalizePath basedir
39-
40-
-- let projectRoot = ProjectRootImplicit projectRootDir
41-
let projectFileName = "cabal-minimal.project"
42-
projectRoot = ProjectRootExplicit projectRootDir projectFileName
43-
extensionName = ""
44-
distDirLayout = defaultDistDirLayout projectRoot Nothing
45-
extensionDescription = "description"
46-
distProjectConfigFp = distProjectFile distDirLayout extensionName
47-
print distProjectConfigFp
48-
exists <- doesFileExist distProjectConfigFp
49-
print $ exists
50-
projectConfigSkeletonLegacy <- runRebuild projectRootDir $
51-
readProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription
52-
projectConfigSkeleton <- runRebuild projectRootDir $
53-
readProjectFileSkeleton verbosity httpTransport distDirLayout extensionName extensionDescription
54-
projectConfigSkeleton @?= projectConfigSkeletonLegacy
55-
5635
testPackages :: Assertion
5736
testPackages = do
5837
let expected = [".", "packages/packages.cabal"] -- TODO also test https link
@@ -69,23 +48,41 @@ testOptionalPackages = do
6948

7049
testSourceRepoList :: Assertion
7150
testSourceRepoList = do
72-
let expected = [
73-
]
51+
let expected =
52+
[ SourceRepositoryPackage
53+
{ srpType = KnownRepoType Git,
54+
srpLocation = "https://example.com/Project.git",
55+
srpTag = Just "1234",
56+
srpBranch = Nothing,
57+
srpSubdir = [],
58+
srpCommand = []
59+
},
60+
SourceRepositoryPackage
61+
{ srpType = KnownRepoType Git,
62+
srpLocation = "https://example.com/example-dir/",
63+
srpTag = Just "12345",
64+
srpBranch = Nothing,
65+
srpSubdir = ["subproject"],
66+
srpCommand = []
67+
}
68+
]
7469
(config, legacy) <- readConfigDefault "source-repository-packages"
7570
assertConfig expected config legacy (projectPackagesRepo . condTreeData)
7671

7772
testExtraPackages :: Assertion
7873
testExtraPackages = do
79-
let expected = [
80-
PackageVersionConstraint (mkPackageName "a") (OrLaterVersion (mkVersion [0])),
81-
PackageVersionConstraint (mkPackageName "b") (IntersectVersionRanges (OrLaterVersion (mkVersion [0,7,3])) (EarlierVersion (mkVersion [0,9])))
82-
]
74+
let expected =
75+
[ PackageVersionConstraint (mkPackageName "a") (OrLaterVersion (mkVersion [0])),
76+
PackageVersionConstraint (mkPackageName "b") (IntersectVersionRanges (OrLaterVersion (mkVersion [0, 7, 3])) (EarlierVersion (mkVersion [0, 9])))
77+
]
8378
(config, legacy) <- readConfigDefault "extra-packages"
8479
assertConfig expected config legacy (projectPackagesNamed . condTreeData)
8580

8681
readConfigDefault :: FilePath -> IO (ProjectConfigSkeleton, ProjectConfigSkeleton)
8782
readConfigDefault rootFp = readConfig rootFp "cabal.project"
8883

84+
-- TODO this is an overkill, look at warningTests, they just use runParseResult without
85+
-- httpTransport etc
8986
readConfig :: FilePath -> FilePath -> IO (ProjectConfigSkeleton, ProjectConfigSkeleton)
9087
readConfig rootFp projectFileName = do
9188
-- TODO extract argument so it can be mocked
@@ -99,10 +96,12 @@ readConfig rootFp projectFileName = do
9996
distProjectConfigFp = distProjectFile distDirLayout extensionName
10097
exists <- doesFileExist distProjectConfigFp
10198
assertBool ("projectConfig does not exist: " <> distProjectConfigFp) exists
102-
parsec <- runRebuild projectRootDir $
103-
readProjectFileSkeleton verbosity httpTransport distDirLayout extensionName extensionDescription
104-
legacy <- runRebuild projectRootDir $
105-
readProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription
99+
parsec <-
100+
runRebuild projectRootDir $
101+
readProjectFileSkeleton verbosity httpTransport distDirLayout extensionName extensionDescription
102+
legacy <-
103+
runRebuild projectRootDir $
104+
readProjectFileSkeletonLegacy verbosity httpTransport distDirLayout extensionName extensionDescription
106105
return (parsec, legacy)
107106

108107
assertConfig' :: (Eq a, Show a) => a -> ProjectConfigSkeleton -> (ProjectConfigSkeleton -> a) -> IO ()
@@ -123,7 +122,7 @@ emptyProjectConfig :: ProjectConfig
123122
emptyProjectConfig = mempty
124123

125124
verbosity :: Verbosity
126-
verbosity = minBound --normal --verbose --maxBound --minBound
125+
verbosity = normal -- minBound --normal --verbose --maxBound --minBound
127126

128127
basedir :: FilePath
129128
basedir = "tests" </> "IntegrationTests2" </> "ProjectConfig" </> "files"

0 commit comments

Comments
 (0)