call-alloy 0.3 → 0.3.0.1
raw patch · 7 files changed
+72/−12 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog.md +5/−0
- README.md +3/−3
- call-alloy.cabal +3/−3
- src/Language/Alloy/Functions.hs +2/−2
- src/Language/Alloy/Internal/Call.hs +45/−0
- src/Language/Alloy/Parser.hs +13/−3
- test/Language/Alloy/CallSpec.hs +1/−1
ChangeLog.md view
@@ -4,6 +4,11 @@ ## Released changes +### 0.3.0.1++- support "State0" line in retrieved instances (introduced by Alloy 6)+- support CRLF at line end+ ### 0.3 - upgrade to Alloy 6.0.0
README.md view
@@ -4,7 +4,7 @@ This package includes a simple Java Library to make an API call to the Alloy Library. Alloy is included (as JAR file) within this library as well. -## Requriements+## Requirements - Java Runtime Environment: There is currently no warning if you have not set up any Java Runtime Environment.@@ -15,7 +15,7 @@ The Java interface to get Alloy instances as well as the [Alloy Jar](https://github.com/AlloyTools/org.alloytools.alloy/releases/download/v5.1.0/org.alloytools.alloy.dist.jar)-file are backed into this library.+file are baked into this library. On every call the application checks the [`XdgDirectory`](https://hackage.haskell.org/package/directory/docs/System-Directory.html#t:XdgDirectory) if the libraries exist in a current version. If not they are placed there together with a version identifier.@@ -59,7 +59,7 @@ ### An instance example -Calling Alloy using `getInstances` and the above program,+Calling Alloy using `getInstances` and the above program could return the following (abbreviated) instance: ``` Haskell
call-alloy.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: call-alloy-version: 0.3+version: 0.3.0.1 synopsis: A simple library to call Alloy given a specification description: Please see the README on GitHub at <https://github.com/marcellussiegburg/call-alloy#readme> category: Language@@ -57,7 +57,7 @@ , file-embed >=0.0.11 && <0.1 , filepath ==1.4.* , hashable >=1.2 && <1.5- , mtl ==2.2.*+ , mtl >=2.2 && <2.4 , process ==1.6.* , split ==0.2.* , trifecta >=2 && <2.2@@ -99,7 +99,7 @@ , filepath ==1.4.* , hashable >=1.2 && <1.5 , hspec- , mtl ==2.2.*+ , mtl >=2.2 && <2.4 , process ==1.6.* , split ==0.2.* , trifecta >=2 && <2.2
src/Language/Alloy/Functions.hs view
@@ -194,7 +194,7 @@ lookupRel kind rel e = case M.lookup rel (relation e) of Nothing -> throwError $ fromString $ "relation " ++ fromString rel ++ " is missing in the Alloy instance"- ++ " available are: " ++ intercalate ", " (M.keys $ relation e)+ ++ "; available are: " ++ intercalate ", " (M.keys $ relation e) Just r -> kind r {-|@@ -208,7 +208,7 @@ lookupSig s insta = case M.lookup s insta of Nothing -> throwError $ fromString $ showSignature s ++ " is missing in the Alloy instance"- ++ " available are: \"" ++ intercalate "\", " (showSignature <$> M.keys insta)+ ++ "; available are: \"" ++ intercalate "\", " (showSignature <$> M.keys insta) Just e -> return e identity
src/Language/Alloy/Internal/Call.hs view
@@ -237,6 +237,51 @@ mclassPath' <- readIORef mclassPath maybe readClassPath return mclassPath' +{-+{-+data CallAlloyConfig = Config {+ alloyJarFile :: FilePath,+ alloyClassFile :: FilePath,+ keepFiles :: Bool+ }+-}++jarFileEnv :: String+jarFileEnv = "ALLOY_JAR_FILE"++callAlloyEnv :: String+callAlloyEnv = "CALL_ALLOY_CLASS_FILE"++keepFilesEnv :: String+keepFilesEnv = "KEEP_ALLOY_FILES"++{-|+Lookup environment variables which are to prefer if present.+-}+getEnvironmentInformation :: IO CallAlloyConfig+getEnvironmentInformation = do+ alloy <- lookupEnv jarFileEnv+ callAlloy <- lookupEnv callAlloyEnv+ keep <- lookupEnv keepFilesEnv+ let mconfig = Config <$> alloy <*> callAlloy <*> pure (isJust keep)+ case mconfig of+ Nothing -> do+ dataDir <- getXdgDirectory XdgData $ appName </> "dataDir"+ Just c -> return c+-}+{-+getVersionFile :: IO FilePath+getVersionFile = do+ configDir <- getXdgDirectory XdgConfig appName+ let versionFile = configDir </> "version"+ exists <- doesFileExist versionFile+ if exists+ then do+ version <- read <$> readFile versionFile+ unless (version == versionHash) $ createVersionFile configDir versionFile+ else createVersionFile configDir versionFile+-}+ fallbackToTempDir :: IO FilePath -> IO FilePath fallbackToTempDir m = catch m $ \e -> if isDoesNotExistError e
src/Language/Alloy/Parser.hs view
@@ -57,9 +57,19 @@ alterSig e Nothing = e { relation = uncurry M.singleton $ relation e} alterSig e (Just y) = y { relation = uncurry M.insert (relation e) (relation y) } +crlf :: Parser Char+crlf = char '\r' *> char '\n'++endOfLine :: Parser Char+endOfLine = newline <|> crlf+ alloyInstance :: Parser [Entries (,)]-alloyInstance = (try (void $ string "---INSTANCE---" *> newline) <|> return ())- *> many entry+alloyInstance = (++)+ <$> entrySection "---INSTANCE---"+ <*> entrySection "------State 0-------"+ where+ entrySection x = (try (void $ string x *> endOfLine) <|> return ())+ *> many entry entry :: Parser (Entries (,)) entry = do@@ -69,7 +79,7 @@ <$> (Entry entryAnnotation <$> ((,) <$> ((string "<:" *> word) <|> pure "")- <*> parseRelations <* (void newline <|> eof)))+ <*> parseRelations <* (void endOfLine <|> eof))) sig :: Parser Signature sig = do
test/Language/Alloy/CallSpec.hs view
@@ -25,6 +25,6 @@ existsInstance "pred a (a: Int) { a > a }\nrun a" `shouldReturn` False describe "getInstances" $ do it "an empty spec returns a single trivial instance" $- (show <$> getInstances (Just 2) "") `shouldReturn` "[fromList [(Signature {scope = Nothing, sigName = \"end\"},Entry {annotation = Nothing, relation = fromList [(\"\",Id (NumberObject {number = 0}))]}),(Signature {scope = Nothing, sigName = \"integers\"},Entry {annotation = Nothing, relation = fromList [(\"\",Single (fromList [NumberObject {number = -8},NumberObject {number = -7},NumberObject {number = -6},NumberObject {number = -5},NumberObject {number = -4},NumberObject {number = -3},NumberObject {number = -2},NumberObject {number = -1},NumberObject {number = 0},NumberObject {number = 1},NumberObject {number = 2},NumberObject {number = 3},NumberObject {number = 4},NumberObject {number = 5},NumberObject {number = 6},NumberObject {number = 7}]))]}),(Signature {scope = Nothing, sigName = \"loop\"},Entry {annotation = Nothing, relation = fromList [(\"\",Id (NumberObject {number = 0}))]})]]"+ (show <$> getInstances (Just 2) "") `shouldReturn` "[fromList [(Signature {scope = Nothing, sigName = \"Int\"},Entry {annotation = Nothing, relation = fromList [(\"\",Single (fromList [NumberObject {number = -8},NumberObject {number = -7},NumberObject {number = -6},NumberObject {number = -5},NumberObject {number = -4},NumberObject {number = -3},NumberObject {number = -2},NumberObject {number = -1},NumberObject {number = 0},NumberObject {number = 1},NumberObject {number = 2},NumberObject {number = 3},NumberObject {number = 4},NumberObject {number = 5},NumberObject {number = 6},NumberObject {number = 7}]))]}),(Signature {scope = Nothing, sigName = \"String\"},Entry {annotation = Nothing, relation = fromList [(\"\",EmptyRelation)]}),(Signature {scope = Nothing, sigName = \"end\"},Entry {annotation = Nothing, relation = fromList [(\"\",Id (NumberObject {number = 0}))]}),(Signature {scope = Nothing, sigName = \"integers\"},Entry {annotation = Nothing, relation = fromList [(\"\",Single (fromList [NumberObject {number = -8},NumberObject {number = -7},NumberObject {number = -6},NumberObject {number = -5},NumberObject {number = -4},NumberObject {number = -3},NumberObject {number = -2},NumberObject {number = -1},NumberObject {number = 0},NumberObject {number = 1},NumberObject {number = 2},NumberObject {number = 3},NumberObject {number = 4},NumberObject {number = 5},NumberObject {number = 6},NumberObject {number = 7}]))]}),(Signature {scope = Nothing, sigName = \"loop\"},Entry {annotation = Nothing, relation = fromList [(\"\",Id (NumberObject {number = 0}))]}),(Signature {scope = Nothing, sigName = \"none\"},Entry {annotation = Nothing, relation = fromList [(\"\",EmptyRelation)]}),(Signature {scope = Nothing, sigName = \"univ\"},Entry {annotation = Nothing, relation = fromList [(\"\",Single (fromList [NumberObject {number = -8},NumberObject {number = -7},NumberObject {number = -6},NumberObject {number = -5},NumberObject {number = -4},NumberObject {number = -3},NumberObject {number = -2},NumberObject {number = -1},NumberObject {number = 0},NumberObject {number = 1},NumberObject {number = 2},NumberObject {number = 3},NumberObject {number = 4},NumberObject {number = 5},NumberObject {number = 6},NumberObject {number = 7}]))]}),(Signature {scope = Just \"seq\", sigName = \"Int\"},Entry {annotation = Nothing, relation = fromList [(\"\",Single (fromList [NumberObject {number = 0},NumberObject {number = 1},NumberObject {number = 2},NumberObject {number = 3}]))]})]]" it "a conflicting spec returns no instance" $ getInstances (Just 1) "pred a (a: Int) { a > a }\nrun a" `shouldReturn` []