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 +79/−4
- powerdns.cabal +1/−1
- spec/Spec.hs +23/−2
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