Make semantic integrity check insensitive to field order (#552)
... as standardized in https://github.com/dhall-lang/dhall-lang/pull/223 Fixes #548 This changes β-normalization to sort fields so that semantic integrity checks don't change when reordering fields * Fix test failure The Nix build sets `HOME=/homeless-shelter`, which leads to a test failure since the test tries to create a "${HOME}/.cache" directory without first checking if "${HOME}" is accessible. This changes the `assertDirectory` function to recursively check parent directories to avoid this issue, which in turn fixes the test (since it gracefully creates no directories if none are accessible).
This commit is contained in:
parent
8f48c673d9
commit
9ac11a5741
|
@ -181,6 +181,7 @@ Library
|
|||
directory >= 1.2.7.1 && < 1.4 ,
|
||||
exceptions >= 0.8.3 && < 0.11,
|
||||
filepath >= 1.4 && < 1.5 ,
|
||||
hashable < 1.3 ,
|
||||
haskeline >= 0.7.3.0 && < 0.8 ,
|
||||
insert-ordered-containers >= 0.2.1.0 && < 0.3 ,
|
||||
lens-family-core >= 1.0.0 && < 1.3 ,
|
||||
|
@ -266,7 +267,7 @@ Test-Suite tasty
|
|||
containers ,
|
||||
deepseq >= 1.2.0.1 && < 1.5 ,
|
||||
dhall ,
|
||||
hashable < 1.3 ,
|
||||
hashable ,
|
||||
insert-ordered-containers == 0.2.1.0 ,
|
||||
prettyprinter ,
|
||||
QuickCheck >= 2.10 && < 2.12,
|
||||
|
|
|
@ -64,6 +64,7 @@ import Crypto.Hash (SHA256)
|
|||
import Data.Bifunctor (Bifunctor(..))
|
||||
import Data.Data (Data)
|
||||
import Data.Foldable
|
||||
import Data.Hashable (Hashable)
|
||||
import Data.HashMap.Strict.InsOrd (InsOrdHashMap)
|
||||
import Data.HashSet (HashSet)
|
||||
import Data.String (IsString(..))
|
||||
|
@ -81,8 +82,10 @@ import Prelude hiding (succ)
|
|||
|
||||
import qualified Control.Monad
|
||||
import qualified Crypto.Hash
|
||||
import qualified Data.List
|
||||
import qualified Data.HashMap.Strict.InsOrd
|
||||
import qualified Data.HashSet
|
||||
import qualified Data.Ord
|
||||
import qualified Data.Sequence
|
||||
import qualified Data.Set
|
||||
import qualified Data.Text
|
||||
|
@ -1371,6 +1374,12 @@ denote (Project a b ) = Project (denote a) b
|
|||
denote (ImportAlt a b ) = ImportAlt (denote a) (denote b)
|
||||
denote (Embed a ) = Embed a
|
||||
|
||||
sortMap :: (Ord k, Hashable k) => InsOrdHashMap k v -> InsOrdHashMap k v
|
||||
sortMap =
|
||||
Data.HashMap.Strict.InsOrd.fromList
|
||||
. Data.List.sortBy (Data.Ord.comparing fst)
|
||||
. Data.HashMap.Strict.InsOrd.toList
|
||||
|
||||
{-| Reduce an expression to its normal form, performing beta reduction and applying
|
||||
any custom definitions.
|
||||
|
||||
|
@ -1646,16 +1655,16 @@ normalizeWith ctx e0 = loop (denote e0)
|
|||
es' = fmap loop es
|
||||
OptionalFold -> OptionalFold
|
||||
OptionalBuild -> OptionalBuild
|
||||
Record kts -> Record kts'
|
||||
Record kts -> Record (sortMap kts')
|
||||
where
|
||||
kts' = fmap loop kts
|
||||
RecordLit kvs -> RecordLit kvs'
|
||||
RecordLit kvs -> RecordLit (sortMap kvs')
|
||||
where
|
||||
kvs' = fmap loop kvs
|
||||
Union kts -> Union kts'
|
||||
Union kts -> Union (sortMap kts')
|
||||
where
|
||||
kts' = fmap loop kts
|
||||
UnionLit k v kvs -> UnionLit k v' kvs'
|
||||
UnionLit k v kvs -> UnionLit k v' (sortMap kvs')
|
||||
where
|
||||
v' = loop v
|
||||
kvs' = fmap loop kvs
|
||||
|
|
|
@ -186,6 +186,7 @@ import qualified Dhall.Pretty.Internal
|
|||
import qualified Dhall.TypeCheck
|
||||
import qualified System.Environment
|
||||
import qualified System.Directory as Directory
|
||||
import qualified System.FilePath as FilePath
|
||||
import qualified Text.Megaparsec
|
||||
import qualified Text.Parser.Combinators
|
||||
import qualified Text.Parser.Token
|
||||
|
@ -535,6 +536,8 @@ getCacheFile hash = do
|
|||
guard (accessible permissions)
|
||||
|
||||
else do
|
||||
assertDirectory (FilePath.takeDirectory directory)
|
||||
|
||||
liftIO (Directory.createDirectory directory)
|
||||
|
||||
liftIO (Directory.setPermissions directory private)
|
||||
|
|
|
@ -47,6 +47,10 @@ importTests =
|
|||
"works"
|
||||
"./tests/import/data/foo/bar"
|
||||
"./tests/import/relative.dhall"
|
||||
, shouldNotFailRelative
|
||||
"a semantic integrity check if fields are reordered"
|
||||
"./tests/import/"
|
||||
"./tests/import/fieldOrderC.dhall"
|
||||
]
|
||||
]
|
||||
|
||||
|
|
1
tests/import/fieldOrderA.dhall
Normal file
1
tests/import/fieldOrderA.dhall
Normal file
|
@ -0,0 +1 @@
|
|||
{ foo = 1, bar = True }
|
1
tests/import/fieldOrderB.dhall
Normal file
1
tests/import/fieldOrderB.dhall
Normal file
|
@ -0,0 +1 @@
|
|||
{ bar = True, foo = 1 }
|
3
tests/import/fieldOrderC.dhall
Normal file
3
tests/import/fieldOrderC.dhall
Normal file
|
@ -0,0 +1,3 @@
|
|||
{ example0 = ./fieldOrderA.dhall sha256:c8e5944a964f1b35da4f2a7dc16b8de0221a518997fd84b0363a955d8f4459a4
|
||||
, example1 = ./fieldOrderB.dhall sha256:c8e5944a964f1b35da4f2a7dc16b8de0221a518997fd84b0363a955d8f4459a4
|
||||
}
|
Loading…
Reference in New Issue
Block a user