packages feed

powerdns 0.2.1 → 0.2.2

raw patch · 3 files changed

+103/−7 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ PowerDNS.API.Zones: instance GHC.Classes.Eq PowerDNS.API.Zones.CI

Files

PowerDNS/API/Zones.hs view
@@ -27,13 +27,15 @@ where  import           Data.Char (toUpper)+import           Data.Coerce (coerce) import           Data.Data (Data) import           Data.Word (Word32)  import           Control.DeepSeq (NFData) import           Data.Aeson (FromJSON(..), ToJSON(..), allNullaryToStringTag,-                             defaultOptions, fieldLabelModifier, constructorTagModifier,-                             genericParseJSON, genericToJSON, omitNothingFields)+                             constructorTagModifier, defaultOptions,+                             fieldLabelModifier, genericParseJSON,+                             genericToJSON, omitNothingFields) import qualified Data.Text as T import           Data.Time.Clock.POSIX (POSIXTime) import           Servant.API@@ -88,6 +90,9 @@  -- | Zone according to [PowerDNS Documentation](https://doc.powerdns.com/authoritative/http-api/zone.html#zone). -- All fields are optional because the PowerDNS API differs on which fields are required depending on the endpoint.+--+-- Note that the 'Eq' instance is up to limited case-sensitivity on 'zone_name' and equivalently contained rrset names+-- as per [RFC4343](https://datatracker.ietf.org/doc/html/rfc4343) data Zone = Zone   { zone_id :: Maybe T.Text   , zone_name :: Maybe T.Text@@ -111,8 +116,33 @@   , zone_nameservers :: Maybe [T.Text]   , zone_master_tsig_key_ids :: Maybe [T.Text]   , zone_slave_tsig_key_ids :: Maybe [T.Text]-  } deriving (Eq, Ord, Show, Generic, NFData, Data, Empty)+  } deriving (Ord, Show, Generic, NFData, Data, Empty) +instance Eq Zone where+  l == r+    = zone_id l == zone_id r+   && (coerce (zone_name l) :: Maybe CI) == (coerce (zone_name r) :: Maybe CI)+   && zone_type l == zone_type r+   && zone_url l == zone_url r+   && zone_kind l == zone_kind r+   && zone_rrsets l == zone_rrsets r+   && zone_serial l == zone_serial r+   && zone_notified_serial l == zone_notified_serial r+   && zone_edited_serial l == zone_edited_serial r+   && zone_masters l == zone_masters r+   && zone_dnssec l == zone_dnssec r+   && zone_nsec3param l == zone_nsec3param r+   && zone_nsec3narrow l == zone_nsec3narrow r+   && zone_presigned l == zone_presigned r+   && zone_soa_edit l == zone_soa_edit r+   && zone_soa_edit_api l == zone_soa_edit_api r+   && zone_api_rectify l == zone_api_rectify r+   && zone_zone l == zone_zone r+   && zone_account l == zone_account r+   && zone_nameservers l == zone_nameservers r+   && zone_master_tsig_key_ids l == zone_master_tsig_key_ids r+   && zone_slave_tsig_key_ids l == zone_slave_tsig_key_ids r+ instance ToJSON Zone where   toJSON = genericToJSON defaultOptions { fieldLabelModifier = strip "zone_"} @@ -142,7 +172,43 @@  ---------------------------------------------------------------------------------------- +newtype CI = CI T.Text++instance Eq CI where+  CI l == CI r = T.map caseFold l == T.map caseFold r+    where+        caseFold x = case x of+            'A' -> 'a'+            'B' -> 'b'+            'C' -> 'c'+            'D' -> 'd'+            'E' -> 'e'+            'F' -> 'f'+            'G' -> 'g'+            'H' -> 'h'+            'I' -> 'i'+            'J' -> 'j'+            'K' -> 'k'+            'L' -> 'l'+            'M' -> 'm'+            'N' -> 'n'+            'O' -> 'o'+            'P' -> 'p'+            'Q' -> 'q'+            'R' -> 'r'+            'S' -> 's'+            'T' -> 't'+            'U' -> 'u'+            'V' -> 'v'+            'W' -> 'w'+            'X' -> 'x'+            'Y' -> 'y'+            'Z' -> 'z'+            _   -> x+ -- | RRSet according to [PowerDNS Documentation](https://doc.powerdns.com/authoritative/http-api/zone.html#rrset).+--+-- Note that the 'Eq' instance is up to limited case-sensitivity on 'rrset_name' as per [RFC4343](https://datatracker.ietf.org/doc/html/rfc4343) data RRSet = RRSet   { rrset_name :: T.Text   , rrset_type :: RecordType@@ -150,7 +216,16 @@   , rrset_changetype :: Maybe ChangeType   , rrset_records :: Maybe [Record]   , rrset_comments :: Maybe [Comment]-  } deriving (Eq, Ord, Show, Generic, NFData, Data)+  } deriving (Ord, Show, Generic, NFData, Data)++instance Eq RRSet where+  l == r =+     (coerce (rrset_name l) :: CI) == (coerce (rrset_name r) :: CI)+   && rrset_type l == rrset_type r+   && rrset_ttl l == rrset_ttl r+   && rrset_changetype l == rrset_changetype r+   && rrset_records l == rrset_records r+   && rrset_comments l == rrset_comments r  instance ToJSON RRSet where   toJSON = genericToJSON defaultOptions { fieldLabelModifier = strip "rrset_"
powerdns.cabal view
@@ -1,6 +1,6 @@ cabal-version:      >=1.10 name:               powerdns-version:            0.2.1+version:            0.2.2 license:            BSD3 license-file:       LICENSE copyright:          (c) 2021 Victor Nawothnig
spec/Spec.hs view
@@ -20,7 +20,7 @@  {-# NOINLINE baseUrl #-} baseUrl :: BaseUrl-baseUrl = unsafePerformIO (parseBaseUrl "pdns:8081")+baseUrl = unsafePerformIO (parseBaseUrl "localhost:8081")  envNoAuth :: ClientEnv envNoAuth = mkClientEnv mgr baseUrl@@ -32,7 +32,8 @@ main = defaultMain tree  tree :: TestTree-tree = testGroup "All specs" [ versionSpec+tree = testGroup "All specs" [ otherSpecs+                             , versionSpec                              , authSpecs                              , zoneSpecs                              ]@@ -44,6 +45,26 @@ runOk c = do   r <- run c   assertRight "ClientM result" r++otherSpecs :: TestTree+otherSpecs = testGroup "Case-sensitivity"+    [ testCase "RRSet does case-insensitive comparison on ASCII codepoints" $+        assertEqual "" (RRSet "Foo." A 0 Nothing Nothing Nothing)+                       (RRSet "foo." A 0 Nothing Nothing Nothing)++    , testCase "RRSet does case-sensitive comparison on non-ASCII codepoints" $+       assertBool "" ((RRSet "\335." A 0 Nothing Nothing Nothing) /=+                      (RRSet "\375." A 0 Nothing Nothing Nothing))++    , testCase "Zone does case-insensitive comparison on ASCII codepoints" $+        assertEqual "" (empty { zone_name = Just "Foo." })+                       (empty { zone_name = Just "foo." })++    , testCase "Zone does case-sensitive comparison on non-ASCII codepoints" $+        assertBool "" ((empty { zone_name = Just "\335." }) /=+                       (empty { zone_name = Just "\375." }))++    ]  versionSpec :: TestTree versionSpec = testCase "Verifies API version" $ do