packages feed

phino 0.0.0.8 → 0.0.0.9

raw patch · 3 files changed

+42/−11 lines, 3 filesdep +time

Dependencies added: time

Files

phino.cabal view
@@ -1,7 +1,7 @@ cabal-version:      3.0  name:               phino-version:            0.0.0.8+version:            0.0.0.9 license:            MIT synopsis:           Command-Line Manipulator of 𝜑-Calculus Expressions description:        Please see the README on GitHub at <https://github.com/objectionary/phino#readme>@@ -61,7 +61,8 @@     optparse-applicative,     vector,     random,-    xml-conduit ^>=1.10+    xml-conduit ^>=1.10,+    time ^>=1.12   default-language: Haskell2010  -- Executable using the library
src/XMIR.hs view
@@ -1,10 +1,11 @@ {-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE RecordWildCards #-}  -- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com -- SPDX-License-Identifier: MIT -module XMIR (programToXMIR, printXMIR) where+module XMIR (programToXMIR, printXMIR, toName, element) where  import Ast import Control.Exception (throwIO)@@ -19,7 +20,12 @@ import qualified Data.Text as T import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Builder as TB+import Data.Time+import Data.Time.Clock.POSIX (utcTimeToPOSIXSeconds)+import Data.Time.Format (defaultTimeLocale, formatTime)+import Data.Version (showVersion) import Debug.Trace (trace)+import Paths_phino (version) import Pretty (prettyAttribute, prettyBinding, prettyExpression, prettyProgram) import Text.Printf (printf) import Text.XML@@ -68,7 +74,7 @@         if null base'           then [("as", as)]           else [("as", as), ("base", base')]-  pure (base, object attrs children' : children)+  pure (base, children ++ [object attrs children']) expression (ExApplication (ExFormation bds) tau) = throwIO (UnsupportedExpression (ExApplication (ExFormation bds) tau)) expression expr = throwIO (UnsupportedExpression expr) @@ -81,7 +87,7 @@   pure (Just (object [("name", label)] inners)) formationBinding (BiTau (AtLabel label) expr) = do   (base, children) <- expression expr-  pure (Just (object [("name", label), ("base", base)] (reverse children)))+  pure (Just (object [("name", label), ("base", base)] children)) formationBinding (BiTau AtRho _) = pure Nothing formationBinding (BiDelta bytes) = pure (Just (NodeContent (T.pack bytes))) formationBinding (BiLambda func) = pure (Just (object [("name", "λ")] []))@@ -131,16 +137,33 @@     | not (null pckg)   ] +time :: UTCTime -> String+time now = do+  let base = formatTime defaultTimeLocale "%Y-%m-%dT%H:%M:%S" now+      posix = utcTimeToPOSIXSeconds now+      fractional :: Double+      fractional = realToFrac posix - fromInteger (floor posix)+      nanos = floor (fractional * 1_000_000_000) :: Int+  base ++ "." ++ printf "%09d" nanos ++ "Z"+ programToXMIR :: Program -> IO Document programToXMIR (Program expr) = do   (pckg, expr') <- getPackage expr   root <- rootExpression expr'+  now <- getCurrentTime   pure     ( Document         (Prologue [] Nothing [])         ( element             "object"-            [("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance")]+            [ ("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"),+              ("dob", formatTime defaultTimeLocale "%Y-%m-%dT%H:%M:%S" now),+              ("ms", "0"),+              ("revision", "1234567"),+              ("time", time now),+              ("version", showVersion version),+              ("xsi:noNamespaceSchemaLocation", "https://raw.githubusercontent.com/objectionary/eo/refs/heads/gh-pages/XMIR.xsd")+            ]             ( NodeElement (element "listing" [] [NodeContent (T.pack (prettyProgram (Program expr)))])                 : root                 : metasWithPackage (intercalate "." pckg)@@ -190,10 +213,12 @@         <> TB.fromString ">"         <> newline   where-    attrsText =+    attrsText = do+      let attrs' = M.toList attrs+          first = if length attrs' > 4 then newline <> indent (indentLevel + 1) else TB.fromString " "       mconcat-        [ TB.fromString " " <> TB.fromText (nameLocalName k) <> TB.fromString "=\"" <> TB.fromText v <> TB.fromString "\""-          | (k, v) <- M.toList attrs+        [ first <> TB.fromText (nameLocalName k) <> TB.fromString "=\"" <> TB.fromText v <> TB.fromString "\""+          | (k, v) <- attrs'         ]      isTextNode (NodeContent _) = True
test/XMIRSpec.hs view
@@ -3,12 +3,15 @@  module XMIRSpec where -import Test.Hspec (Spec, it, shouldBe, runIO)+import Test.Hspec (Spec, it, shouldBe, runIO, pending) import XMIR import Misc (ensuredFile) import Parser (parseProgramThrows) import qualified Data.Text as T +-- @todo #126:30min Enable XMIR test. It's not possible anymore to compare XMIRs like strings+--  because they contain random data, e.g. system time. We need to introduce some convenient+--  test system for testing XML and use it here here. spec :: Spec spec = do   phi <- runIO $ readFile =<< ensuredFile "test-resources/xmir/program.phi"@@ -16,4 +19,6 @@   prog <- runIO (parseProgramThrows phi)   doc <- runIO $ programToXMIR prog   let xmir' = printXMIR doc-  it "prints valid xmir" $ T.stripEnd (T.pack xmir) `shouldBe` T.stripEnd (T.pack xmir')+  it "prints valid xmir" $ do+    pending+    T.stripEnd (T.pack xmir) `shouldBe` T.stripEnd (T.pack xmir')