Merge pull request #27 from input-output-hk/feature/acronym-to-ticker
Rename acronym field to ticker
Rename acronym field to ticker
nix-shell --run "cabal repl $(target) --project-file=cabal-nix.project"
style: ## Apply stylish-haskell on all *.hs files
nix-shell --pure --run 'find . -type f -name "*.hs" -not -path ".git" -not -path "*.stack-work*" -print0 | xargs -0 stylish-haskell -i'
nix-shell --pure --run 'find . -type f -name "*.hs" -not -path ".git" -not -path "*.stack-work*" -not -path "./dist*" -print0 | xargs -0 stylish-haskell -i'
, metaUnit :: Maybe (Property AssetUnit)
, metaLogo :: Maybe (Property AssetLogo)
, metaURL :: Maybe (Property AssetURL)
, metaAcronym :: Maybe (Property Acronym)
, metaTicker :: Maybe (Property Ticker)
, metaOther :: HM.HashMap PropertyName Weakly.Property
}
deriving (Show, Eq)
instance NFData AssetURL
newtype Acronym = Acronym { unAcronym :: Text }
newtype Ticker = Ticker { unTicker :: Text }
deriving (Generic, Eq, Ord, ToJSON)
deriving newtype (IsString)
deriving (Show) via (Quiet Acronym)
deriving (Show) via (Quiet Ticker)
instance FromJSON Acronym where
parseJSON = Aeson.withText "Acronym" $ \t ->
Acronym <$> applyValidator validateMetadataAcronym t
instance FromJSON Ticker where
parseJSON = Aeson.withText "Ticker" $ \t ->
Ticker <$> applyValidator validateMetadataTicker t
fromWeaklyTypedMetadata :: Weakly.Metadata -> Aeson.Parser Metadata
fromWeaklyTypedMetadata (Weakly.Metadata subj props) =
obj = HM.fromList $ fmap (Bifunctor.bimap unPropertyName Aeson.toJSON) $ HM.toList $ props
rest :: HM.HashMap PropertyName Weakly.Property
rest = foldr HM.delete props ["name", "description", "unit", "logo", "url", "acronym"]
rest = foldr HM.delete props ["name", "description", "unit", "logo", "url", "ticker"]
in
Metadata
<$> (applyValidator validateMetadataSubject subj)
<*> obj .:? "unit"
<*> obj .:? "logo"
<*> obj .:? "url"
<*> obj .:? "acronym"
<*> obj .:? "ticker"
<*> pure rest
where
pure prop
toWeaklyTypedMetadata :: Metadata -> Weakly.Metadata
toWeaklyTypedMetadata (Metadata subj name desc unit logo url acronym rest) =
toWeaklyTypedMetadata (Metadata subj name desc unit logo url ticker rest) =
Weakly.Metadata subj $
HM.fromList $
[ ("name" , Weakly.toWeaklyTypedProperty name)
, ("description", Weakly.toWeaklyTypedProperty desc)
] <> optionalProperty "unit" unit
<> optionalProperty "logo" logo
<> optionalProperty "url" url
<> optionalProperty "acronym" acronym
<> optionalProperty "ticker" ticker
<> HM.toList rest
where
optionalProperty :: ToJSON a => PropertyName -> Maybe (Property a) -> [(PropertyName, Property Aeson.Value)]
validateMetadataName :: Text -> Either String Text
validateMetadataName = validateMinLength 1 >=> validateMaxLength 50
validateMetadataAcronym :: Text -> Either String Text
validateMetadataAcronym = validateMinLength 2 >=> validateMaxLength 4
validateMetadataTicker :: Text -> Either String Text
validateMetadataTicker = validateMinLength 2 >=> validateMaxLength 4
validateMetadataDescription :: Text -> Either String Text
validateMetadataDescription = validateMaxLength 500
assetURL :: MonadGen m => m Wallet.AssetURL
assetURL = Wallet.AssetURL <$> httpsURI
acronym :: MonadGen m => m Wallet.Acronym
acronym = Wallet.Acronym <$> Gen.text (Range.linear 2 4) Gen.unicodeAll
ticker :: MonadGen m => m Wallet.Ticker
ticker = Wallet.Ticker <$> Gen.text (Range.linear 2 4) Gen.unicodeAll
assetLogo :: MonadGen m => m Wallet.AssetLogo
assetLogo = Wallet.AssetLogo . Encoded . convertToBase Base64 . BS.pack <$> Gen.list (Range.linear 0 256) (Gen.word8 Range.constantBounded)
<*> Gen.maybe (stronglyTypedProperty assetUnit)
<*> Gen.maybe (stronglyTypedProperty assetLogo)
<*> Gen.maybe (stronglyTypedProperty assetURL)
<*> Gen.maybe (stronglyTypedProperty acronym)
<*> Gen.maybe (stronglyTypedProperty ticker)
<*> (fmap HM.fromList $ Gen.list (Range.linear 1 5) ((,) <$> propertyName <*> weaklyTypedProperty))
batchRequest :: MonadGen m => m BatchRequest
Subject (Subject),
asPublicKey, asSignature,
unPropertyName, unSubject)
import Cardano.Metadata.Types.Wallet (Acronym (Acronym),
AssetLogo (AssetLogo),
import Cardano.Metadata.Types.Wallet (AssetLogo (AssetLogo),
AssetURL (AssetURL),
AssetUnit (AssetUnit),
Ticker (Ticker),
assetLogoMaxLength)
import qualified Cardano.Metadata.Types.Wallet as Wallet
import qualified Cardano.Metadata.Types.Weakly as Weakly
, testProperty "AssetUnit/json/roundtrips" (prop_json_roundtrips Gen.assetUnit)
, testCase "AssetUnit/json/matches-spec" unit_assetUnit_json_spec
, testProperty "Acronym/json/roundtrips" (prop_json_roundtrips Gen.acronym)
, testCase "Acronym/json/matches-spec" unit_acronym_json_spec
, testProperty "Ticker/json/roundtrips" (prop_json_roundtrips Gen.ticker)
, testCase "Ticker/json/matches-spec" unit_ticker_json_spec
, testCase "Wallet/extra-constraints/json/matches-spec" unit_extra_constraints_json_spec
, testProperty "Wallet/Metadata/fromWeakly/roundtrips" prop_fromWeakly_roundtrips
(asWeakMetadata badSubject2 goodName goodDescription)
(Left "Error in $: Length must be no more than 256 characters, got 257")
unit_acronym_json_spec :: Assertion
unit_acronym_json_spec = do
let goodAcronym = "ABCD"
badAcronym1 = "A"
badAcronym2 = "ABCDE"
unit_ticker_json_spec :: Assertion
unit_ticker_json_spec = do
let goodTicker = "ABCD"
badTicker1 = "A"
badTicker2 = "ABCDE"
asJSON = Aeson.String
asAssetURL = AssetURL . fromJust . parseURI . T.unpack
Aeson.fromJSON (asJSON goodAcronym) @?= (Aeson.Success $ Acronym goodAcronym)
Aeson.fromJSON (asJSON badAcronym1) @?= (Aeson.Error "Length must be at least 2 characters, got 1" :: Aeson.Result Acronym)
Aeson.fromJSON (asJSON badAcronym2) @?= (Aeson.Error "Length must be no more than 4 characters, got 5" :: Aeson.Result Acronym)
Aeson.fromJSON (asJSON goodTicker) @?= (Aeson.Success $ Ticker goodTicker)
Aeson.fromJSON (asJSON badTicker1) @?= (Aeson.Error "Length must be at least 2 characters, got 1" :: Aeson.Result Ticker)
Aeson.fromJSON (asJSON badTicker2) @?= (Aeson.Error "Length must be no more than 4 characters, got 5" :: Aeson.Result Ticker)
unit_assetLogo_json_spec :: Assertion
unit_assetLogo_json_spec = do
}
}
},
"acronym": {
"ticker": {
"type": "object",
"additionalProperties": false,
"required": [
BUN