iri-orphans (empty) → 0.0.0.0
raw patch · 25 files changed
+602/−0 lines, 25 filesdep +QuickCheckdep +aesondep +autodocodec
Dependencies added: QuickCheck, aeson, autodocodec, base, debug-print, generic-arbitrary, hspec, hspec-junit-formatter, ip, iri, iri-orphans, lens, openapi3, persistent, serialise, text, vector, wide-word
Files
- CHANGELOG.md +5/−0
- LICENSE +21/−0
- README.md +3/−0
- iri-orphans.cabal +135/−0
- package.yaml +100/−0
- src/Iri/Orphans.hs +9/−0
- src/Iri/Orphans/Aeson.hs +4/−0
- src/Iri/Orphans/Aeson/FromJSON.hs +10/−0
- src/Iri/Orphans/Aeson/ToJSON.hs +10/−0
- src/Iri/Orphans/Autodocodec.hs +3/−0
- src/Iri/Orphans/Autodocodec/HasCodec.hs +20/−0
- src/Iri/Orphans/DebugPrint.hs +3/−0
- src/Iri/Orphans/DebugPrint/ToDebugPrintValue.hs +14/−0
- src/Iri/Orphans/OpenApi.hs +3/−0
- src/Iri/Orphans/OpenApi/ToSchema.hs +15/−0
- src/Iri/Orphans/Persistent.hs +4/−0
- src/Iri/Orphans/Persistent/PersistField.hs +16/−0
- src/Iri/Orphans/Persistent/PersistFieldSql.hs +14/−0
- src/Iri/Orphans/QuickCheck.hs +3/−0
- src/Iri/Orphans/QuickCheck/Arbitrary.hs +142/−0
- src/Iri/Orphans/Serialise.hs +3/−0
- src/Iri/Orphans/Serialise/Serialise.hs +23/−0
- test/Iri/Orphans/QuickCheck/ArbitrarySpec.hs +30/−0
- test/Spec.hs +1/−0
- test/SpecHook.hs +11/−0
+ CHANGELOG.md view
@@ -0,0 +1,5 @@+## [_Unreleased_](https://github.com/freckle/iri-orphans/compare/v0.0.0.0...main)++## [v0.0.0.0](https://github.com/freckle/iri-orphans/tree/v0.0.0.0)++First tagged release.
+ LICENSE view
@@ -0,0 +1,21 @@+MIT License++Copyright (c) 2025 Freckle++Permission is hereby granted, free of charge, to any person obtaining a copy+of this software and associated documentation files (the "Software"), to deal+in the Software without restriction, including without limitation the rights+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+copies of the Software, and to permit persons to whom the Software is+furnished to do so, subject to the following conditions:++The above copyright notice and this permission notice shall be included in all+copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE+SOFTWARE.
+ README.md view
@@ -0,0 +1,3 @@+# iri-orphans++Haskell package defining orphan instances for types defined in the `iri` package
+ iri-orphans.cabal view
@@ -0,0 +1,135 @@+cabal-version: 1.18+name: iri-orphans+version: 0.0.0.0+license: MIT+license-file: LICENSE+maintainer: Freckle Education+homepage: https://github.com/freckle/iri-orphans#readme+bug-reports: https://github.com/freckle/iri-orphans/issues+synopsis: Orphan instances for iri+description: Orphan instances for types defined in the `iri` package.+category: Utils+build-type: Simple+extra-source-files: package.yaml+extra-doc-files:+ README.md+ CHANGELOG.md++source-repository head+ type: git+ location: https://github.com/freckle/iri-orphans++library+ exposed-modules:+ Iri.Orphans+ Iri.Orphans.Aeson+ Iri.Orphans.Aeson.FromJSON+ Iri.Orphans.Aeson.ToJSON+ Iri.Orphans.Autodocodec+ Iri.Orphans.Autodocodec.HasCodec+ Iri.Orphans.DebugPrint+ Iri.Orphans.DebugPrint.ToDebugPrintValue+ Iri.Orphans.OpenApi+ Iri.Orphans.OpenApi.ToSchema+ Iri.Orphans.Persistent+ Iri.Orphans.Persistent.PersistField+ Iri.Orphans.Persistent.PersistFieldSql+ Iri.Orphans.QuickCheck+ Iri.Orphans.QuickCheck.Arbitrary+ Iri.Orphans.Serialise+ Iri.Orphans.Serialise.Serialise++ hs-source-dirs: src+ other-modules: Paths_iri_orphans+ default-language: GHC2021+ default-extensions:+ ApplicativeDo BangPatterns BlockArguments DataKinds+ DerivingStrategies DerivingVia FlexibleContexts FlexibleInstances+ GADTs GeneralizedNewtypeDeriving LambdaCase MultiParamTypeClasses+ NoImplicitPrelude NoMonomorphismRestriction OverloadedStrings+ RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving+ TypeApplications TypeFamilies++ ghc-options:+ -Weverything -Wno-all-missed-specialisations+ -Wno-missed-specialisations -Wno-missing-exported-signatures+ -Wno-missing-import-lists -Wno-missing-local-signatures+ -Wno-monomorphism-restriction -Wno-safe -Wno-unsafe++ build-depends:+ QuickCheck >=2.14.3,+ aeson >=2.1.2.1,+ autodocodec >=0.2.2.0,+ base >=4.17.2.1 && <5,+ debug-print >=0.2.0.1,+ generic-arbitrary >=1.0.1,+ ip >=1.7.8,+ iri >=0.5.1.1,+ lens >=5.2.3,+ openapi3 >=3.2.4,+ persistent >=2.14.6.0,+ serialise >=0.2.6.1,+ text >=2.0.2,+ vector >=0.13.1.0,+ wide-word >=0.1.6.0++ if impl(ghc >=9.8)+ ghc-options:+ -Wno-missing-role-annotations -Wno-missing-poly-kind-signatures++ if impl(ghc >=9.2)+ ghc-options: -Wno-missing-kind-signatures++ if impl(ghc >=8.10)+ ghc-options:+ -Wno-missing-safe-haskell-mode -Wno-prepositive-qualified-module++ if impl(ghc >=8.8)+ ghc-options: -fwrite-ide-info++test-suite spec+ type: exitcode-stdio-1.0+ main-is: Spec.hs+ hs-source-dirs: test+ other-modules:+ Iri.Orphans.QuickCheck.ArbitrarySpec+ SpecHook+ Paths_iri_orphans++ default-language: GHC2021+ default-extensions:+ ApplicativeDo BangPatterns BlockArguments DataKinds+ DerivingStrategies DerivingVia FlexibleContexts FlexibleInstances+ GADTs GeneralizedNewtypeDeriving LambdaCase MultiParamTypeClasses+ NoImplicitPrelude NoMonomorphismRestriction OverloadedStrings+ RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving+ TypeApplications TypeFamilies++ ghc-options:+ -Weverything -Wno-all-missed-specialisations+ -Wno-missed-specialisations -Wno-missing-exported-signatures+ -Wno-missing-import-lists -Wno-missing-local-signatures+ -Wno-monomorphism-restriction -Wno-safe -Wno-unsafe -threaded+ -rtsopts -with-rtsopts=-N++ build-depends:+ QuickCheck >=2.14.3,+ base >=4.17.2.1 && <5,+ hspec >=2.11.10,+ hspec-junit-formatter >=1.1.2.1,+ iri >=0.5.1.1,+ iri-orphans++ if impl(ghc >=9.8)+ ghc-options:+ -Wno-missing-role-annotations -Wno-missing-poly-kind-signatures++ if impl(ghc >=9.2)+ ghc-options: -Wno-missing-kind-signatures++ if impl(ghc >=8.10)+ ghc-options:+ -Wno-missing-safe-haskell-mode -Wno-prepositive-qualified-module++ if impl(ghc >=8.8)+ ghc-options: -fwrite-ide-info
+ package.yaml view
@@ -0,0 +1,100 @@+name: iri-orphans+version: 0.0.0.0+maintainer: Freckle Education+category: Utils+github: freckle/iri-orphans+synopsis: Orphan instances for iri+description: |+ Orphan instances for types defined in the `iri` package.++extra-doc-files:+ - README.md+ - CHANGELOG.md++extra-source-files:+ - package.yaml++ghc-options:+ - -Weverything+ - -Wno-all-missed-specialisations+ - -Wno-missed-specialisations+ - -Wno-missing-exported-signatures # re-enables missing-signatures+ - -Wno-missing-import-lists+ - -Wno-missing-local-signatures+ - -Wno-monomorphism-restriction+ - -Wno-safe+ - -Wno-unsafe++when:+ - condition: "impl(ghc >= 9.8)"+ ghc-options:+ - -Wno-missing-role-annotations+ - -Wno-missing-poly-kind-signatures+ - condition: "impl(ghc >= 9.2)"+ ghc-options:+ - -Wno-missing-kind-signatures+ - condition: "impl(ghc >= 8.10)"+ ghc-options:+ - -Wno-missing-safe-haskell-mode+ - -Wno-prepositive-qualified-module+ - condition: "impl(ghc >= 8.8)"+ ghc-options:+ - -fwrite-ide-info++dependencies:+ - base < 5++language: GHC2021++default-extensions:+ - ApplicativeDo+ - BangPatterns+ - BlockArguments+ - DataKinds+ - DerivingStrategies+ - DerivingVia+ - FlexibleContexts+ - FlexibleInstances+ - GADTs+ - GeneralizedNewtypeDeriving+ - LambdaCase+ - MultiParamTypeClasses+ - NoImplicitPrelude+ - NoMonomorphismRestriction+ - OverloadedStrings+ - RankNTypes+ - RecordWildCards+ - ScopedTypeVariables+ - StandaloneDeriving+ - TypeApplications+ - TypeFamilies++library:+ source-dirs: src+ dependencies:+ - aeson+ - autodocodec+ - debug-print+ - generic-arbitrary+ - ip+ - iri+ - lens+ - openapi3+ - persistent+ - QuickCheck+ - serialise+ - text+ - vector+ - wide-word++tests:+ spec:+ main: Spec.hs+ source-dirs: test+ ghc-options: -threaded -rtsopts "-with-rtsopts=-N"+ dependencies:+ - hspec+ - hspec-junit-formatter+ - iri+ - iri-orphans+ - QuickCheck
+ src/Iri/Orphans.hs view
@@ -0,0 +1,9 @@+module Iri.Orphans () where++import Iri.Orphans.Aeson ()+import Iri.Orphans.Autodocodec ()+import Iri.Orphans.DebugPrint ()+import Iri.Orphans.OpenApi ()+import Iri.Orphans.Persistent ()+import Iri.Orphans.QuickCheck ()+import Iri.Orphans.Serialise ()
+ src/Iri/Orphans/Aeson.hs view
@@ -0,0 +1,4 @@+module Iri.Orphans.Aeson () where++import Iri.Orphans.Aeson.FromJSON ()+import Iri.Orphans.Aeson.ToJSON ()
+ src/Iri/Orphans/Aeson/FromJSON.hs view
@@ -0,0 +1,10 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.Aeson.FromJSON () where++import Autodocodec (Autodocodec (..))+import Data.Aeson (FromJSON)+import Iri.Data (HttpIri)+import Iri.Orphans.Autodocodec.HasCodec ()++deriving via Autodocodec HttpIri instance FromJSON HttpIri
+ src/Iri/Orphans/Aeson/ToJSON.hs view
@@ -0,0 +1,10 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.Aeson.ToJSON () where++import Autodocodec (Autodocodec (..))+import Data.Aeson (ToJSON)+import Iri.Data (HttpIri)+import Iri.Orphans.Autodocodec.HasCodec ()++deriving via Autodocodec HttpIri instance ToJSON HttpIri
+ src/Iri/Orphans/Autodocodec.hs view
@@ -0,0 +1,3 @@+module Iri.Orphans.Autodocodec () where++import Iri.Orphans.Autodocodec.HasCodec ()
+ src/Iri/Orphans/Autodocodec/HasCodec.hs view
@@ -0,0 +1,20 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.Autodocodec.HasCodec () where++import Prelude++import Autodocodec (HasCodec (codec), bimapCodec)+import Data.Bifunctor (first)+import Data.Text (Text)+import Data.Text qualified as T+import Iri.Data (HttpIri)+import Iri.Parsing.Text qualified+import Iri.Rendering.Text qualified++instance HasCodec HttpIri where+ codec =+ bimapCodec+ (first T.unpack . Iri.Parsing.Text.httpIri)+ Iri.Rendering.Text.httpIri+ (codec @Text)
+ src/Iri/Orphans/DebugPrint.hs view
@@ -0,0 +1,3 @@+module Iri.Orphans.DebugPrint () where++import Iri.Orphans.DebugPrint.ToDebugPrintValue ()
+ src/Iri/Orphans/DebugPrint/ToDebugPrintValue.hs view
@@ -0,0 +1,14 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.DebugPrint.ToDebugPrintValue () where++import Prelude++import Data.Text (Text)+import DebugPrint (ToDebugPrintValue (..))+import Iri.Data (HttpIri)+import Iri.Rendering.Text qualified++instance ToDebugPrintValue HttpIri where+ toDebugPrintValue =+ toDebugPrintValue @Text . Iri.Rendering.Text.httpIri
+ src/Iri/Orphans/OpenApi.hs view
@@ -0,0 +1,3 @@+module Iri.Orphans.OpenApi () where++import Iri.Orphans.OpenApi.ToSchema ()
+ src/Iri/Orphans/OpenApi/ToSchema.hs view
@@ -0,0 +1,15 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.OpenApi.ToSchema () where++import Prelude++import Control.Lens ((&), (?~))+import Data.OpenApi+import Iri.Data (HttpIri)++instance ToSchema HttpIri where+ declareNamedSchema _ =+ pure+ $ NamedSchema (Just "HttpIri")+ $ mempty & type_ ?~ OpenApiString
+ src/Iri/Orphans/Persistent.hs view
@@ -0,0 +1,4 @@+module Iri.Orphans.Persistent () where++import Iri.Orphans.Persistent.PersistField ()+import Iri.Orphans.Persistent.PersistFieldSql ()
+ src/Iri/Orphans/Persistent/PersistField.hs view
@@ -0,0 +1,16 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.Persistent.PersistField () where++import Prelude++import Control.Monad ((<=<))+import Data.Text (Text)+import Database.Persist+import Iri.Data (HttpIri)+import Iri.Parsing.Text qualified+import Iri.Rendering.Text qualified++instance PersistField HttpIri where+ toPersistValue = toPersistValue @Text . Iri.Rendering.Text.httpIri+ fromPersistValue = Iri.Parsing.Text.httpIri <=< fromPersistValue @Text
+ src/Iri/Orphans/Persistent/PersistFieldSql.hs view
@@ -0,0 +1,14 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.Persistent.PersistFieldSql () where++import Prelude++import Data.Proxy+import Data.Text (Text)+import Database.Persist.Sql+import Iri.Data (HttpIri)+import Iri.Orphans.Persistent.PersistField ()++instance PersistFieldSql HttpIri where+ sqlType _ = sqlType $ Proxy @Text
+ src/Iri/Orphans/QuickCheck.hs view
@@ -0,0 +1,3 @@+module Iri.Orphans.QuickCheck () where++import Iri.Orphans.QuickCheck.Arbitrary ()
+ src/Iri/Orphans/QuickCheck/Arbitrary.hs view
@@ -0,0 +1,142 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.QuickCheck.Arbitrary () where++import Prelude++import Data.Text qualified as T+import Data.Text.Encoding qualified as T+import Data.Vector qualified as V+import Iri.Data+ ( DomainLabel (..)+ , Fragment (..)+ , Host (..)+ , HttpIri+ , Path (..)+ , PathSegment (..)+ , Port+ , Query (..)+ , RegName (..)+ , Security (..)+ )+import Test.QuickCheck+ ( Arbitrary+ , Gen+ , arbitrary+ , choose+ , elements+ , listOf+ , listOf1+ , oneof+ )+import Test.QuickCheck.Arbitrary.Generic+ ( GenericArbitrary+ , genericArbitrary+ )+import Test.QuickCheck.Arbitrary.Generic qualified++instance Arbitrary DomainLabel where+ arbitrary = DomainLabel . T.pack <$> listOf1 char+ where+ char =+ oneof+ [ choose ('a', 'z')+ , choose ('A', 'Z')+ , choose ('0', '9')+ , elements "-_~!$&'()*+,;="+ ]++instance Arbitrary Fragment where+ arbitrary = Fragment . T.encodeUtf8 . T.pack <$> listOf char+ where+ char =+ oneof+ [ choose ('a', 'z')+ , choose ('A', 'Z')+ , choose ('0', '9')+ , elements "-._~:@/?|"+ , ucs+ ]++instance Arbitrary Host where+ -- Don't generate an IPv6 host because+ -- https://github.com/nikita-volkov/iri/issues/2+ arbitrary =+ oneof+ [ NamedHost <$> arbitrary+ , IpV4Host <$> genericArbitrary+ ]++deriving via+ GenericArbitrary HttpIri+ instance+ Arbitrary HttpIri++instance Arbitrary Path where+ arbitrary = Path . V.fromList <$> listOf arbitrary++instance Arbitrary PathSegment where+ arbitrary = PathSegment . T.encodeUtf8 . T.pack <$> listOf1 char+ where+ char =+ oneof+ [ choose ('a', 'z')+ , choose ('A', 'Z')+ , choose ('0', '9')+ , elements "-._~:@"+ , ucs+ ]++deriving via+ GenericArbitrary Port+ instance+ Arbitrary Port++instance Arbitrary Query where+ arbitrary = Query . T.encodeUtf8 . T.pack <$> listOf1 char+ where+ char =+ oneof+ [ choose ('a', 'z')+ , choose ('A', 'Z')+ , choose ('0', '9')+ , elements "-._~:@/?|"+ , ucs+ , private+ ]++instance Arbitrary RegName where+ arbitrary = RegName . V.fromList <$> listOf1 arbitrary++deriving newtype instance+ Arbitrary Security++ucs :: Gen Char+ucs =+ oneof+ [ choose ('\xA0', '\xD7FF')+ , choose ('\xF900', '\xFDCF')+ , choose ('\xFDF0', '\xFFEF')+ , choose ('\x10000', '\x1FFFD')+ , choose ('\x20000', '\x2FFFD')+ , choose ('\x30000', '\x3FFFD')+ , choose ('\x40000', '\x4FFFD')+ , choose ('\x50000', '\x5FFFD')+ , choose ('\x60000', '\x6FFFD')+ , choose ('\x70000', '\x7FFFD')+ , choose ('\x80000', '\x8FFFD')+ , choose ('\x90000', '\x9FFFD')+ , choose ('\xA0000', '\xAFFFD')+ , choose ('\xB0000', '\xBFFFD')+ , choose ('\xC0000', '\xCFFFD')+ , choose ('\xD0000', '\xDFFFD')+ , choose ('\xE1000', '\xEFFFD')+ ]++private :: Gen Char+private =+ oneof+ [ choose ('\xE000', '\xF8FF')+ , choose ('\xF0000', '\xFFFFD')+ , choose ('\x100000', '\x10FFFD')+ ]
+ src/Iri/Orphans/Serialise.hs view
@@ -0,0 +1,3 @@+module Iri.Orphans.Serialise () where++import Iri.Orphans.Serialise.Serialise ()
+ src/Iri/Orphans/Serialise/Serialise.hs view
@@ -0,0 +1,23 @@+{-# OPTIONS_GHC -Wno-orphans #-}++module Iri.Orphans.Serialise.Serialise () where++import Codec.Serialise (Serialise)+import Data.WideWord.Word128 (Word128)+import Iri.Data+import Net.IPv4 (IPv4)+import Net.IPv6 (IPv6)++instance Serialise DomainLabel+instance Serialise Fragment+instance Serialise Host+instance Serialise HttpIri+instance Serialise IPv4+instance Serialise IPv6+instance Serialise Path+instance Serialise PathSegment+instance Serialise Port+instance Serialise Query+instance Serialise RegName+instance Serialise Security+instance Serialise Word128
+ test/Iri/Orphans/QuickCheck/ArbitrarySpec.hs view
@@ -0,0 +1,30 @@+module Iri.Orphans.QuickCheck.ArbitrarySpec+ ( spec+ ) where++import Prelude++import Data.List (intercalate)+import Iri.Data (HttpIri (..))+import Iri.Orphans.QuickCheck ()+import Iri.Parsing.Text qualified+import Iri.Rendering.Text qualified+import Test.Hspec+import Test.QuickCheck (counterexample, property)++spec :: Spec+spec =+ it "generates only parseable values" $ property $ \x ->+ counterexample+ ( let HttpIri security host port path query fragment = x+ in intercalate+ ", "+ [ show security+ , show host+ , show port+ , show path+ , show query+ , show fragment+ ]+ )+ $ Iri.Parsing.Text.httpIri (Iri.Rendering.Text.httpIri x) == Right x
+ test/Spec.hs view
@@ -0,0 +1,1 @@+{-# OPTIONS_GHC -F -pgmF hspec-discover -Wno-missing-export-lists #-}
+ test/SpecHook.hs view
@@ -0,0 +1,11 @@+module SpecHook+ ( hook+ ) where++import Prelude++import Test.Hspec+import Test.Hspec.JUnit.Formatter.Env as Formatter++hook :: Spec -> Spec+hook = Formatter.whenEnabled Formatter.add . parallel