launchdarkly-server-sdk 1.0.4 → 2.0.0
raw patch · 9 files changed
+24/−25 lines, 9 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- LaunchDarkly.Server: EvalErrorUserNotSpecified :: EvalErrorKind
- LaunchDarkly.Server.Client: EvalErrorUserNotSpecified :: EvalErrorKind
- LaunchDarkly.Server: userSetKey :: Maybe Text -> User -> User
+ LaunchDarkly.Server: userSetKey :: Text -> User -> User
- LaunchDarkly.Server.User: userSetKey :: Maybe Text -> User -> User
+ LaunchDarkly.Server.User: userSetKey :: Text -> User -> User
Files
- CHANGELOG.md +7/−0
- launchdarkly-server-sdk.cabal +2/−2
- src/LaunchDarkly/Server/Client.hs +1/−2
- src/LaunchDarkly/Server/Client/Internal.hs +1/−1
- src/LaunchDarkly/Server/Details.hs +0/−4
- src/LaunchDarkly/Server/Evaluate.hs +4/−7
- src/LaunchDarkly/Server/Events.hs +3/−3
- src/LaunchDarkly/Server/User.hs +2/−2
- src/LaunchDarkly/Server/User/Internal.hs +4/−4
CHANGELOG.md view
@@ -2,6 +2,13 @@ All notable changes to the LaunchDarkly Haskell Server-side SDK will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org). +## [2.0.0] - 2020-04-21+### Changed:+- The function `userSetKey` is now takes `Text` instead of `Maybe Text` for the key. This originally existed for compatibility with an internal test suite.++### Removed:+- The constructor `EvalErrorUserNotSpecified` has been removed from `EvalErrorKind`.+ ## [1.0.4] - 2020-04-06 ### Fixed: - Widened time and lens dependency ranges. Thanks @nbouscal!
launchdarkly-server-sdk.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 161f412cb18d22ca3dbf8912fdfd91f3f8a844d9b0ef1d9d61ab1105f61c243a+-- hash: 19d9bbded7c024d267d0d6dc115cbc0e8fd60ae0e82b84bb73b68c68f60e3d73 name: launchdarkly-server-sdk-version: 1.0.4+version: 2.0.0 synopsis: Server-side SDK for integrating with LaunchDarkly description: Please see the README on GitHub at <https://github.com/launchdarkly/haskell-server-sdk#readme> category: Web
src/LaunchDarkly/Server/Client.hs view
@@ -38,7 +38,6 @@ import Data.Aeson (Value(..)) import Data.Generics.Product (getField, setField) import Data.Scientific (toRealFloat, fromFloatDigits)-import Data.Maybe (isNothing) import Network.HTTP.Client (newManager) import Network.HTTP.Client.TLS (tlsManagerSettings) import System.Clock (TimeSpec(..))@@ -95,7 +94,7 @@ -- will be returned. This method does not send analytics events back to -- LaunchDarkly. allFlags :: Client -> User -> IO (HashMap Text Value)-allFlags (Client client) (User user) = if isNothing $ getField @"key" user then pure mempty else do+allFlags (Client client) (User user) = do status <- getAllFlagsC $ getField @"store" client case status of Left _ -> pure HM.empty
src/LaunchDarkly/Server/Client/Internal.hs view
@@ -25,7 +25,7 @@ -- | The version string for this library. clientVersion :: Text-clientVersion = "1.0.4"+clientVersion = "2.0.0" -- | The status of the client initialization. data Status
src/LaunchDarkly/Server/Details.hs view
@@ -82,9 +82,6 @@ | EvalErrorWrongType -- ^ Indicates that the result value was not of the requested type, e.g. -- you called boolVariationDetail but the value was an integer.- | EvalErrorUserNotSpecified- -- ^ Indicates that the caller passed a user without a key for the user- -- parameter. | EvalErrorClientNotReady -- ^ Indicates that the caller tried to evaluate a flag before the client -- had successfully initialized.@@ -97,6 +94,5 @@ EvalErrorKindMalformedFlag -> "MALFORMED_FLAG" EvalErrorFlagNotFound -> "FLAG_NOT_FOUND" EvalErrorWrongType -> "WRONG_TYPE"- EvalErrorUserNotSpecified -> "USER_NOT_SPECIFIED" EvalErrorClientNotReady -> "CLIENT_NOT_READY" EvalErrorExternalStore _ -> "EXTERNAL_STORE_ERROR"
src/LaunchDarkly/Server/Evaluate.hs view
@@ -55,9 +55,7 @@ let event = newUnknownFlagEvent key fallback (EvaluationReasonError EvalErrorFlagNotFound) pure (errorDetail EvalErrorFlagNotFound, True, pure event) Right (Just flag) -> do- (reason, events) <- case getField @"key" user of- Nothing -> pure (errorDetail EvalErrorUserNotSpecified, [])- Just _ -> evaluateDetail flag user $ getField @"store" client+ (reason, events) <- evaluateDetail flag user $ getField @"store" client let reason' = setFallback reason fallback pure (reason', False, flip (:) events $ newSuccessfulEvalEvent flag (getField @"variationIndex" reason') (getField @"value" reason') (Just fallback) (getField @"reason" reason') Nothing)@@ -111,7 +109,7 @@ evaluateInternal :: (Monad m, LaunchDarklyStoreRead store m) => Flag -> UserI -> store -> m (EvaluationDetail Value) evaluateInternal flag user store = result where- checkTarget target = if elem (getField @"key" user) (Just <$> getField @"values" target)+ checkTarget target = if elem (getField @"key" user) (getField @"values" target) then Just $ getVariation flag (getField @"variation" target) EvaluationReasonTargetMatch else Nothing checkRule (ruleIndex, rule) = ifM (ruleMatchesUser rule user store) (pure $ Just $ getValueForVariationOrRollout flag (getField @"variationOrRollout" rule) user@@ -214,9 +212,8 @@ segmentContainsUser :: Segment -> UserI -> Bool segmentContainsUser segment user- | Nothing <- getField @"key" user = False- | elem (fromJust $ getField @"key" user) (getField @"included" segment) = True- | elem (fromJust $ getField @"key" user) (getField @"excluded" segment) = False+ | elem (getField @"key" user) (getField @"included" segment) = True+ | elem (getField @"key" user) (getField @"excluded" segment) = False | Just _ <- find (\r -> segmentRuleMatchesUser r user (getField @"key" segment) (getField @"salt" segment)) (getField @"rules" segment) = True
src/LaunchDarkly/Server/Events.hs view
@@ -107,7 +107,7 @@ } deriving (Generic, Show, ToJSON) data IdentifyEvent = IdentifyEvent- { key :: !(Maybe Text)+ { key :: !Text , user :: !Value } deriving (Generic, ToJSON, Show) @@ -156,7 +156,7 @@ addUserToEvent :: (HasField' "user" r (Maybe Value), HasField' "userKey" r (Maybe Text)) => ConfigI -> UserI -> r -> r addUserToEvent config user event = if getField @"inlineUsersInEvents" config then setField @"user" (pure $ userSerializeRedacted config user) event- else setField @"userKey" (getField @"key" user) event+ else setField @"userKey" (pure $ getField @"key" user) event makeFeatureEvent :: ConfigI -> UserI -> Bool -> EvalEvent -> FeatureEvent makeFeatureEvent config user includeReason event = addUserToEvent config user $ FeatureEvent@@ -306,7 +306,7 @@ maybeIndexUser :: Natural -> ConfigI -> UserI -> EventState -> IO () maybeIndexUser now config user state = modifyMVar_ (getField @"userKeyLRU" state) $ \cache ->- let key = fromMaybe "" $ getField @"key" user in case LRU.lookup key cache of+ let key = getField @"key" user in case LRU.lookup key cache of (cache', Just _) -> pure cache' (cache', Nothing) -> do queueEvent config state (EventTypeIndex $ BaseEvent now $ IndexEvent { user = userSerializeRedacted config user })
src/LaunchDarkly/Server/User.hs view
@@ -28,7 +28,7 @@ -- | Creates a new user identified by the given key. makeUser :: Text -> User makeUser key = User $ UserI- { key = pure key+ { key = key , secondary = mempty , ip = mempty , country = mempty@@ -43,7 +43,7 @@ } -- | Set the primary key for a user.-userSetKey :: (Maybe Text) -> User -> User+userSetKey :: Text -> User -> User userSetKey = mapUser . setField @"key" -- | Set the secondary key for a user.
src/LaunchDarkly/Server/User/Internal.hs view
@@ -6,7 +6,7 @@ , userSerializeRedacted ) where -import Data.Aeson (FromJSON, ToJSON, Value(..), (.:?), withObject, object, parseJSON, toJSON)+import Data.Aeson (FromJSON, ToJSON, Value(..), (.:), (.:?), withObject, object, parseJSON, toJSON) import Data.Foldable (fold, or) import Data.Generics.Product (getField) import qualified Data.HashMap.Strict as HM@@ -30,7 +30,7 @@ newtype User = User { unwrapUser :: UserI } data UserI = UserI- { key :: !(Maybe Text)+ { key :: !Text , secondary :: !(Maybe Text) , ip :: !(Maybe Text) , country :: !(Maybe Text)@@ -52,7 +52,7 @@ instance FromJSON UserI where parseJSON = withObject "User" $ \o -> UserI- <$> o .:? "key"+ <$> o .: "key" <*> o .:? "secondary" <*> o .:? "ip" <*> o .:? "country"@@ -83,7 +83,7 @@ valueOf :: UserI -> Text -> Maybe Value valueOf user attribute = case attribute of- "key" -> String <$> getField @"key" user+ "key" -> pure $ String $ getField @"key" user "secondary" -> String <$> getField @"secondary" user "ip" -> String <$> getField @"ip" user "country" -> String <$> getField @"country" user