diff --git a/.travis.yml b/.travis.yml index 1e67206..1d712c9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,12 +10,12 @@ dist: trusty language: c services: - - redis-server + - redis-server addons: apt: packages: - - libgmp-dev + - libgmp-dev postgresql: "9.3" cache: @@ -25,8 +25,7 @@ cache: matrix: include: - - env: STACKARGS="--resolver=lts-11" - - env: STACKARGS="--resolver=lts-12" + - env: STACKARGS="--resolver=lts-15" - env: STACKARGS="--resolver=nightly" allow_failures: - env: STACKARGS="--resolver=nightly" diff --git a/examples/serversession-example-yesod-persistent/Model.hs b/examples/serversession-example-yesod-persistent/Model.hs index cbe20c4..91ab7b5 100644 --- a/examples/serversession-example-yesod-persistent/Model.hs +++ b/examples/serversession-example-yesod-persistent/Model.hs @@ -1,3 +1,6 @@ +{-# LANGUAGE DerivingStrategies #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE UndecidableInstances #-} module Model where import ClassyPrelude.Yesod diff --git a/serversession-backend-acid-state/src/Web/ServerSession/Backend/Acid/Internal.hs b/serversession-backend-acid-state/src/Web/ServerSession/Backend/Acid/Internal.hs index 4b353db..3f06379 100644 --- a/serversession-backend-acid-state/src/Web/ServerSession/Backend/Acid/Internal.hs +++ b/serversession-backend-acid-state/src/Web/ServerSession/Backend/Acid/Internal.hs @@ -109,14 +109,14 @@ instance SafeCopy SS.SessionMap where -- | We can't @deriveSafeCopy 0 'base ''SS.SessionId@ as -- otherwise we'd require an unneeded @SafeCopy sess@. -instance SafeCopy (SS.SessionId sess) where +instance Typeable sess => SafeCopy (SS.SessionId sess) where putCopy = contain . safePut . SSI.unS getCopy = contain $ SSI.S <$> safeGet -- | We can't @deriveSafeCopy 0 'base ''SS.Session@ due to the -- required context. -instance SafeCopy (SS.Decomposed sess) => SafeCopy (SS.Session sess) where +instance (Typeable sess, SafeCopy (SS.Decomposed sess)) => SafeCopy (SS.Session sess) where putCopy (SS.Session key authId data_ createdAt accessedAt) = contain $ do put_t <- getSafePut safePut key @@ -136,7 +136,7 @@ instance SafeCopy (SS.Decomposed sess) => SafeCopy (SS.Session sess) where -- | We can't @deriveSafeCopy 0 'base ''ServerSessionAcidState@ due -- to the required context. -instance SafeCopy (SS.Decomposed sess) => SafeCopy (ServerSessionAcidState sess) where +instance (Typeable sess, SafeCopy (SS.Decomposed sess)) => SafeCopy (ServerSessionAcidState sess) where putCopy (ServerSessionAcidState sits aits) = contain $ do safePut (HM.toList sits) safePut (HM.toList aits) @@ -273,23 +273,23 @@ data DeleteAllSessionsOfAuthId sess = DeleteAllSessionsOfAuthId SS.AuthId derivi data InsertSession sess = InsertSession (SS.Session sess) deriving (Typeable) data ReplaceSession sess = ReplaceSession (SS.Session sess) deriving (Typeable) -instance SafeCopy (GetSession sess) where +instance Typeable sess => SafeCopy (GetSession sess) where putCopy (GetSession v) = contain $ safePut v getCopy = contain $ GetSession <$> safeGet -instance SafeCopy (DeleteSession sess) where +instance Typeable sess => SafeCopy (DeleteSession sess) where putCopy (DeleteSession v) = contain $ safePut v getCopy = contain $ DeleteSession <$> safeGet -instance SafeCopy (DeleteAllSessionsOfAuthId sess) where +instance Typeable sess => SafeCopy (DeleteAllSessionsOfAuthId sess) where putCopy (DeleteAllSessionsOfAuthId v) = contain $ safePut v getCopy = contain $ DeleteAllSessionsOfAuthId <$> safeGet -instance SafeCopy (SS.Decomposed sess) => SafeCopy (InsertSession sess) where +instance (Typeable sess, SafeCopy (SS.Decomposed sess)) => SafeCopy (InsertSession sess) where putCopy (InsertSession v) = contain $ safePut v getCopy = contain $ InsertSession <$> safeGet -instance SafeCopy (SS.Decomposed sess) => SafeCopy (ReplaceSession sess) where +instance (Typeable sess, SafeCopy (SS.Decomposed sess)) => SafeCopy (ReplaceSession sess) where putCopy (ReplaceSession v) = contain $ safePut v getCopy = contain $ ReplaceSession <$> safeGet @@ -322,8 +322,8 @@ instance AcidContext sess => Method (ReplaceSession sess) where instance AcidContext sess => IsAcidic (ServerSessionAcidState sess) where acidEvents = - [ QueryEvent $ \(GetSession sid) -> getSession sid - , UpdateEvent $ \(DeleteSession sid) -> deleteSession sid - , UpdateEvent $ \(DeleteAllSessionsOfAuthId authId) -> deleteAllSessionsOfAuthId authId - , UpdateEvent $ \(InsertSession session) -> insertSession session - , UpdateEvent $ \(ReplaceSession session) -> replaceSession session ] + [ QueryEvent (\(GetSession sid) -> getSession sid) safeCopyMethodSerialiser + , UpdateEvent (\(DeleteSession sid) -> deleteSession sid) safeCopyMethodSerialiser + , UpdateEvent (\(DeleteAllSessionsOfAuthId authId) -> deleteAllSessionsOfAuthId authId) safeCopyMethodSerialiser + , UpdateEvent (\(InsertSession session) -> insertSession session) safeCopyMethodSerialiser + , UpdateEvent (\(ReplaceSession session) -> replaceSession session) safeCopyMethodSerialiser ] diff --git a/serversession-backend-persistent/src/Web/ServerSession/Backend/Persistent/Internal/Impl.hs b/serversession-backend-persistent/src/Web/ServerSession/Backend/Persistent/Internal/Impl.hs index 623857c..36cc39e 100644 --- a/serversession-backend-persistent/src/Web/ServerSession/Backend/Persistent/Internal/Impl.hs +++ b/serversession-backend-persistent/src/Web/ServerSession/Backend/Persistent/Internal/Impl.hs @@ -96,6 +96,7 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe ["Eq", "Ord", "Show", "Typeable"] M.mempty False + Nothing where pfd :: P.EntityField (PersistentSession sess) typ -> P.FieldDef pfd = P.persistFieldDef @@ -142,8 +143,10 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe (P.SqlOther "SqlType unset for key") [] True - P.NoReference] + P.NoReference + Nothing] [])) + Nothing persistFieldDef PersistentSessionKey = P.FieldDef (P.HaskellName "key") @@ -153,6 +156,7 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe ["maxlen=30"] True P.NoReference + Nothing persistFieldDef PersistentSessionAuthId = P.FieldDef (P.HaskellName "authId") @@ -162,6 +166,7 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe ["Maybe", "default=NULL"] True P.NoReference + Nothing persistFieldDef PersistentSessionSession = P.FieldDef (P.HaskellName "session") @@ -171,6 +176,7 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe [] True P.NoReference + Nothing persistFieldDef PersistentSessionCreatedAt = P.FieldDef (P.HaskellName "createdAt") @@ -180,6 +186,7 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe [] True P.NoReference + Nothing persistFieldDef PersistentSessionAccessedAt = P.FieldDef (P.HaskellName "accessedAt") @@ -189,6 +196,7 @@ instance forall sess. P.PersistFieldSql (Decomposed sess) => P.PersistEntity (Pe [] True P.NoReference + Nothing persistIdField = PersistentSessionId diff --git a/serversession-backend-redis/serversession-backend-redis.cabal b/serversession-backend-redis/serversession-backend-redis.cabal index 7281279..584d3bd 100644 --- a/serversession-backend-redis/serversession-backend-redis.cabal +++ b/serversession-backend-redis/serversession-backend-redis.cabal @@ -27,7 +27,7 @@ library build-depends: base == 4.* , bytestring - , hedis < 0.11 + , hedis < 0.13 , path-pieces , tagged >= 0.7 , text diff --git a/serversession/serversession.cabal b/serversession/serversession.cabal index e0a38e5..d9ce51c 100644 --- a/serversession/serversession.cabal +++ b/serversession/serversession.cabal @@ -29,6 +29,7 @@ library , hashable , nonce == 1.0.* , path-pieces + , persistent-test , text , time , transformers diff --git a/serversession/src/Web/ServerSession/Core/StorageTests.hs b/serversession/src/Web/ServerSession/Core/StorageTests.hs index 875d1b1..b7e7fda 100644 --- a/serversession/src/Web/ServerSession/Core/StorageTests.hs +++ b/serversession/src/Web/ServerSession/Core/StorageTests.hs @@ -10,6 +10,7 @@ module Web.ServerSession.Core.StorageTests import Control.Applicative as A import Control.Exception (Exception) import Control.Monad +import DataTypeTest (roundUTCTime) import Web.ServerSession.Core.Internal import qualified Crypto.Nonce as N @@ -173,8 +174,8 @@ allStorageTests storage it runIO parallel _shouldBe shouldReturn shouldThrow = d { sessionKey = sid , sessionAuthId = Nothing , sessionData = SessionMap $ HM.fromList vals - , sessionCreatedAt = now - , sessionAccessedAt = now + , sessionCreatedAt = roundUTCTime now + , sessionAccessedAt = roundUTCTime now } ver2 = session { sessionData = SessionMap HM.empty } run (getSession storage sid) `shouldReturn` Nothing @@ -223,8 +224,8 @@ generateSession gen hasAuthId = do { sessionKey = sid , sessionAuthId = authId , sessionData = SessionMap data_ - , sessionCreatedAt = TI.addUTCTime (-1000) now - , sessionAccessedAt = now + , sessionCreatedAt = roundUTCTime $ TI.addUTCTime (-1000) now + , sessionAccessedAt = roundUTCTime $ now } data HasAuthId = HasAuthId | NoAuthId diff --git a/stack.yaml b/stack.yaml index fd71006..055ac39 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,18 @@ -resolver: lts-12.13 +flags: + serversession-backend-acid-state: + lib-Werror: true + serversession-frontend-wai: + lib-Werror: true + serversession-backend-persistent: + lib-Werror: true + serversession: + lib-Werror: true + serversession-backend-redis: + lib-Werror: true + serversession-frontend-yesod: + lib-Werror: true + serversession-frontend-snap: + lib-Werror: true packages: - serversession - serversession-backend-acid-state @@ -8,25 +22,11 @@ packages: - serversession-frontend-wai - serversession-frontend-yesod - examples/serversession-example-yesod-persistent -flags: - serversession: - lib-Werror: true - serversession-backend-acid-state: - lib-Werror: true - serversession-backend-persistent: - lib-Werror: true - serversession-backend-redis: - lib-Werror: true - serversession-frontend-snap: - lib-Werror: true - serversession-frontend-wai: - lib-Werror: true - serversession-frontend-yesod: - lib-Werror: true extra-deps: - - acid-state-0.14.3 - - snap-1.1.1.0 - - heist-1.1 - - map-syntax-0.3 - - pwstore-fast-2.4.4 - - xmlhtml-0.2.5.2 + - snap-1.1.3.0@sha256:0c0814d2ab1c3d5f22cef4615b2913ded18e87710ea6febdbe6e3ab8d9838735,8872 + - acid-state-0.16.0@sha256:a5640fd8d99bdb5f152476a2ae56cc8eb81864b280c8ec7d1387e81296ed844d,6190 + - heist-1.1.0.1@sha256:7355cf8c1a7ef84c0c800c0539f7b99e7e540cace697238009a2dea1f05231f1,9311 + - map-syntax-0.3@sha256:ca8b449615fa57419c16a5e98844624a6ac758692b87b3cfae8c74c87c56f1b2,2420 + - pwstore-fast-2.4.4@sha256:9b6a37510d8b9f37f409a8ab3babac9181afcaaa3fce8ba1c131a7ed3de30698,1351 + - xmlhtml-0.2.5.2@sha256:3f0990f725551985d777e8edb5563fe99aee998f1fde6a7633f720f76df54701,46997 +resolver: lts-15.8 diff --git a/stack.yaml.lock b/stack.yaml.lock new file mode 100644 index 0000000..3da7d60 --- /dev/null +++ b/stack.yaml.lock @@ -0,0 +1,54 @@ +# This file was autogenerated by Stack. +# You should not edit this file by hand. +# For more information, please see the documentation at: +# https://docs.haskellstack.org/en/stable/lock_files + +packages: +- completed: + hackage: snap-1.1.3.0@sha256:0c0814d2ab1c3d5f22cef4615b2913ded18e87710ea6febdbe6e3ab8d9838735,8872 + pantry-tree: + size: 5743 + sha256: 804f55a8cab81e720547308e799243e81f43e089b860c0d3160a938cad86ed0d + original: + hackage: snap-1.1.3.0@sha256:0c0814d2ab1c3d5f22cef4615b2913ded18e87710ea6febdbe6e3ab8d9838735,8872 +- completed: + hackage: acid-state-0.16.0@sha256:a5640fd8d99bdb5f152476a2ae56cc8eb81864b280c8ec7d1387e81296ed844d,6190 + pantry-tree: + size: 13678 + sha256: c6e4b7f00d2a500e6286beafe3a2da7ba898a9ea31f5744df57cdce8a8f5890f + original: + hackage: acid-state-0.16.0@sha256:a5640fd8d99bdb5f152476a2ae56cc8eb81864b280c8ec7d1387e81296ed844d,6190 +- completed: + hackage: heist-1.1.0.1@sha256:7355cf8c1a7ef84c0c800c0539f7b99e7e540cace697238009a2dea1f05231f1,9311 + pantry-tree: + size: 7354 + sha256: a2635ed49de6debaf8b98189989f83ab58dcc125c6ae8e57f6fe0903bc7fa8ff + original: + hackage: heist-1.1.0.1@sha256:7355cf8c1a7ef84c0c800c0539f7b99e7e540cace697238009a2dea1f05231f1,9311 +- completed: + hackage: map-syntax-0.3@sha256:ca8b449615fa57419c16a5e98844624a6ac758692b87b3cfae8c74c87c56f1b2,2420 + pantry-tree: + size: 558 + sha256: c196bee0433f9540e4251ebd1be06d802ff7cc4931e6f0aedc38babd28683a3c + original: + hackage: map-syntax-0.3@sha256:ca8b449615fa57419c16a5e98844624a6ac758692b87b3cfae8c74c87c56f1b2,2420 +- completed: + hackage: pwstore-fast-2.4.4@sha256:9b6a37510d8b9f37f409a8ab3babac9181afcaaa3fce8ba1c131a7ed3de30698,1351 + pantry-tree: + size: 270 + sha256: ff4a44ede62515efe5cd366a5803f7183c811c4a0cf56eea88da94181c4844c0 + original: + hackage: pwstore-fast-2.4.4@sha256:9b6a37510d8b9f37f409a8ab3babac9181afcaaa3fce8ba1c131a7ed3de30698,1351 +- completed: + hackage: xmlhtml-0.2.5.2@sha256:3f0990f725551985d777e8edb5563fe99aee998f1fde6a7633f720f76df54701,46997 + pantry-tree: + size: 61835 + sha256: bb1bd95db3738e18d112bbc9724510ee64a51b7eda61494507f4957c5e2281f6 + original: + hackage: xmlhtml-0.2.5.2@sha256:3f0990f725551985d777e8edb5563fe99aee998f1fde6a7633f720f76df54701,46997 +snapshots: +- completed: + size: 492015 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/15/8.yaml + sha256: 926bc3d70249dd0ba05277ff00943c0addb35b627cb641752669e7cf771310d0 + original: lts-15.8