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:
Gabriel Gonzalez 2018-08-27 12:55:46 -07:00 committed by GitHub
parent 8f48c673d9
commit 9ac11a5741
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 27 additions and 5 deletions

View File

@ -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,

View File

@ -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

View File

@ -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)

View File

@ -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"
]
]

View File

@ -0,0 +1 @@
{ foo = 1, bar = True }

View File

@ -0,0 +1 @@
{ bar = True, foo = 1 }

View File

@ -0,0 +1,3 @@
{ example0 = ./fieldOrderA.dhall sha256:c8e5944a964f1b35da4f2a7dc16b8de0221a518997fd84b0363a955d8f4459a4
, example1 = ./fieldOrderB.dhall sha256:c8e5944a964f1b35da4f2a7dc16b8de0221a518997fd84b0363a955d8f4459a4
}