Compare commits

..

4 Commits

Author SHA1 Message Date
e3d3cb93b2
Update copyright, indent cabal consistently
All checks were successful
Build / audit (push) Successful in 7s
Build / test (push) Successful in 7m10s
Build / doc (push) Successful in 7m19s
2025-01-20 18:24:58 +01:00
88f41271eb
Add String instances from ToGraphQL and FromGraphQL
All checks were successful
Build / audit (push) Successful in 7s
Build / test (push) Successful in 7m41s
Build / doc (push) Successful in 7m40s
2024-12-07 18:50:48 +01:00
b399bddb90
Depend on graphql ^>= 1.5.0
All checks were successful
Build / audit (push) Successful in 7s
Build / test (push) Successful in 7m36s
Build / doc (push) Successful in 7m27s
Release / release (push) Successful in 5s
2024-12-06 20:15:49 +01:00
131576e56c
Move gql to Language.GraphQL.TH
All checks were successful
Build / audit (push) Successful in 6s
Build / test (push) Successful in 7m6s
Build / doc (push) Successful in 7m22s
2024-12-03 20:41:40 +01:00
10 changed files with 135 additions and 86 deletions

View File

@ -6,6 +6,18 @@ The format is based on
and this project adheres to and this project adheres to
[Haskell Package Versioning Policy](https://pvp.haskell.org/). [Haskell Package Versioning Policy](https://pvp.haskell.org/).
## [Unreleased]
### Removed
- Deprecated `Language.GraphQL.Class.gql` (moved to `Language.GraphQL.TH`).
### Added
- `String` instances from `ToGraphQL` and `FromGraphQL`.
## [1.0.6.0] - 2024-12-06
### Added
- `Language.GraphQL.Class.gql` is moved to `Language.GraphQL.TH` where it was
before in `graphql`.
## [1.0.5.0] - 2024-11-21 ## [1.0.5.0] - 2024-11-21
### Added ### Added
- Add `ToGraphQL` and `FromGraphQL` instances for `Value` and `HashMap`. - Add `ToGraphQL` and `FromGraphQL` instances for `Value` and `HashMap`.
@ -41,6 +53,8 @@ and this project adheres to
- JSON serialization. - JSON serialization.
- Test helpers. - Test helpers.
[Unreleased]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.6.0...master
[1.0.6.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.5.0...v1.0.6.0
[1.0.5.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.4.0...v1.0.5.0 [1.0.5.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.4.0...v1.0.5.0
[1.0.4.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.3.0...v1.0.4.0 [1.0.4.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.3.0...v1.0.4.0
[1.0.3.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.2.0...v1.0.3.0 [1.0.3.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.2.0...v1.0.3.0

View File

@ -1,7 +1,7 @@
cabal-version: 3.0 cabal-version: 3.0
name: graphql-spice name: graphql-spice
version: 1.0.5.0 version: 1.0.6.0
synopsis: GraphQL with batteries synopsis: GraphQL with batteries
description: Various extensions and convenience functions for the core description: Various extensions and convenience functions for the core
graphql package. graphql package.
@ -10,44 +10,45 @@ homepage: https://git.caraus.tech/OSS/graphql-spice
bug-reports: https://git.caraus.tech/OSS/graphql-spice/issues bug-reports: https://git.caraus.tech/OSS/graphql-spice/issues
author: Eugen Wissner <belka@caraus.de> author: Eugen Wissner <belka@caraus.de>
maintainer: belka@caraus.de maintainer: belka@caraus.de
copyright: (c) 2021-2024 Eugen Wissner copyright: (c) 2021-2025 Eugen Wissner
license: MPL-2.0 license: MPL-2.0
license-files: LICENSE license-files: LICENSE
build-type: Simple build-type: Simple
extra-source-files: CHANGELOG.md extra-source-files: CHANGELOG.md
tested-with: tested-with:
GHC == 9.8.2 GHC == 9.10.1
source-repository head source-repository head
type: git type: git
location: https://git.caraus.tech/OSS/graphql-spice.git location: https://git.caraus.tech/OSS/graphql-spice.git
library library
exposed-modules: exposed-modules:
Language.GraphQL.Class Language.GraphQL.Class
Language.GraphQL.JSON Language.GraphQL.JSON
Language.GraphQL.Resolver Language.GraphQL.Resolver
Test.Hspec.GraphQL Language.GraphQL.TH
other-modules: Test.Hspec.GraphQL
hs-source-dirs: src other-modules:
ghc-options: -Wall hs-source-dirs: src
build-depends: ghc-options: -Wall
aeson >= 2.0.3 && < 2.3, build-depends:
base >= 4.7 && < 5, aeson >= 2.0.3 && < 2.3,
conduit ^>= 1.3.4, base >= 4.7 && < 5,
containers >= 0.6 && < 0.8, conduit ^>= 1.3.4,
exceptions ^>= 0.10.4, containers >= 0.6 && < 0.8,
hspec-expectations >= 0.8.2 && < 0.9, exceptions ^>= 0.10.4,
graphql >= 1.3.0 && < 1.5.0, hspec-expectations >= 0.8.2 && < 0.9,
megaparsec >= 9.0 && < 10, graphql ^>= 1.5.0,
scientific ^>= 0.3.7, megaparsec >= 9.0 && < 10,
template-haskell >= 2.16 && < 3, scientific ^>= 0.3.7,
text >= 1.2 && < 3, template-haskell >= 2.16 && < 3,
time >= 1.12.2 && < 1.15, text >= 1.2 && < 3,
transformers >= 0.5.6 && < 0.7, time >= 1.12.2 && < 1.15,
vector >= 0.12 && < 0.14, transformers >= 0.5.6 && < 0.7,
unordered-containers ^>= 0.2.16 vector >= 0.12 && < 0.14,
default-language: Haskell2010 unordered-containers ^>= 0.2.16
default-language: Haskell2010
test-suite graphql-test test-suite graphql-test
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0
@ -58,6 +59,7 @@ test-suite graphql-test
Language.GraphQL.DirectiveSpec Language.GraphQL.DirectiveSpec
Language.GraphQL.FragmentSpec Language.GraphQL.FragmentSpec
Language.GraphQL.RootOperationSpec Language.GraphQL.RootOperationSpec
Language.GraphQL.THSpec
hs-source-dirs: hs-source-dirs:
tests tests
ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall

View File

@ -14,7 +14,6 @@ module Language.GraphQL.Class
, ToGraphQL(..) , ToGraphQL(..)
, deriveFromGraphQL , deriveFromGraphQL
, deriveToGraphQL , deriveToGraphQL
, gql
) where ) where
import Data.Int (Int8, Int16, Int32, Int64) import Data.Int (Int8, Int16, Int32, Int64)
@ -47,7 +46,6 @@ import Language.Haskell.TH
, Dec(..) , Dec(..)
, Exp(..) , Exp(..)
, Info(..) , Info(..)
, Lit(..)
, Quote(..) , Quote(..)
, Name , Name
, Q , Q
@ -75,7 +73,6 @@ import Language.Haskell.TH
, litP , litP
, wildP , wildP
) )
import Language.Haskell.TH.Quote (QuasiQuoter(..))
import Data.Foldable (Foldable(..)) import Data.Foldable (Foldable(..))
import qualified Data.HashMap.Strict as HashMap import qualified Data.HashMap.Strict as HashMap
import qualified Language.GraphQL.Type as Type import qualified Language.GraphQL.Type as Type
@ -110,6 +107,10 @@ instance ToGraphQL Text
where where
toGraphQL = Type.String toGraphQL = Type.String
instance ToGraphQL String
where
toGraphQL = Type.String . Text.pack
instance ToGraphQL Int instance ToGraphQL Int
where where
toGraphQL = Type.Int . fromIntegral toGraphQL = Type.Int . fromIntegral
@ -222,6 +223,11 @@ instance FromGraphQL Text
fromGraphQL (Type.String value) = Just value fromGraphQL (Type.String value) = Just value
fromGraphQL _ = Nothing fromGraphQL _ = Nothing
instance FromGraphQL String
where
fromGraphQL (Type.String value) = Just $ Text.unpack value
fromGraphQL _ = Nothing
instance FromGraphQL Int instance FromGraphQL Int
where where
fromGraphQL = fromGraphQLToIntegral fromGraphQL = fromGraphQLToIntegral
@ -459,39 +465,3 @@ deriveToGraphQL typeName = do
[ litE (stringL $ nameBase name') [ litE (stringL $ nameBase name')
, [|toGraphQL $(varE alias)|] , [|toGraphQL $(varE alias)|]
] ]
stripIndentation :: String -> String
stripIndentation code = reverse
$ dropWhile isLineBreak
$ reverse
$ unlines
$ indent spaces <$> lines' withoutLeadingNewlines
where
indent 0 xs = xs
indent count (' ' : xs) = indent (count - 1) xs
indent _ xs = xs
withoutLeadingNewlines = dropWhile isLineBreak code
spaces = length $ takeWhile (== ' ') withoutLeadingNewlines
lines' "" = []
lines' string =
let (line, rest) = break isLineBreak string
reminder =
case rest of
[] -> []
'\r' : '\n' : strippedString -> lines' strippedString
_ : strippedString -> lines' strippedString
in line : reminder
isLineBreak = flip any ['\n', '\r'] . (==)
-- | Removes leading and trailing newlines. Indentation of the first line is
-- removed from each line of the string.
gql :: QuasiQuoter
gql = QuasiQuoter
{ quoteExp = pure . LitE . StringL . stripIndentation
, quotePat = const
$ fail "Illegal gql QuasiQuote (allowed as expression only, used as a pattern)"
, quoteType = const
$ fail "Illegal gql QuasiQuote (allowed as expression only, used as a type)"
, quoteDec = const
$ fail "Illegal gql QuasiQuote (allowed as expression only, used as a declaration)"
}

View File

@ -0,0 +1,49 @@
{- This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can
obtain one at https://mozilla.org/MPL/2.0/. -}
module Language.GraphQL.TH
( gql
) where
import Language.Haskell.TH
( Exp(..)
, Lit(..)
)
import Language.Haskell.TH.Quote (QuasiQuoter(..))
stripIndentation :: String -> String
stripIndentation code = reverse
$ dropWhile isLineBreak
$ reverse
$ unlines
$ indent spaces <$> lines' withoutLeadingNewlines
where
indent 0 xs = xs
indent count (' ' : xs) = indent (count - 1) xs
indent _ xs = xs
withoutLeadingNewlines = dropWhile isLineBreak code
spaces = length $ takeWhile (== ' ') withoutLeadingNewlines
lines' "" = []
lines' string =
let (line, rest) = break isLineBreak string
reminder =
case rest of
[] -> []
'\r' : '\n' : strippedString -> lines' strippedString
_ : strippedString -> lines' strippedString
in line : reminder
isLineBreak = flip any ['\n', '\r'] . (==)
-- | Removes leading and trailing newlines. Indentation of the first line is
-- removed from each line of the string.
gql :: QuasiQuoter
gql = QuasiQuoter
{ quoteExp = pure . LitE . StringL . stripIndentation
, quotePat = const
$ fail "Illegal gql QuasiQuote (allowed as expression only, used as a pattern)"
, quoteType = const
$ fail "Illegal gql QuasiQuote (allowed as expression only, used as a type)"
, quoteDec = const
$ fail "Illegal gql QuasiQuote (allowed as expression only, used as a declaration)"
}

View File

@ -5,6 +5,7 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
module Language.GraphQL.ClassSpec module Language.GraphQL.ClassSpec
( spec ( spec
) where ) where
@ -18,7 +19,6 @@ import Language.GraphQL.Class
, ToGraphQL(..) , ToGraphQL(..)
, deriveFromGraphQL , deriveFromGraphQL
, deriveToGraphQL , deriveToGraphQL
, gql
) )
import Test.Hspec (Spec, describe, it, shouldBe) import Test.Hspec (Spec, describe, it, shouldBe)
import qualified Data.HashMap.Strict as HashMap import qualified Data.HashMap.Strict as HashMap
@ -161,14 +161,3 @@ spec = do
let given = Type.Enum "TWO_FIELD_ENUM_2" let given = Type.Enum "TWO_FIELD_ENUM_2"
expected = TWO_FIELD_ENUM_2 expected = TWO_FIELD_ENUM_2
in fromGraphQL given `shouldBe` Just expected in fromGraphQL given `shouldBe` Just expected
describe "gql" $
it "replaces CRNL with NL" $
let expected :: Text
expected = "line1\nline2\nline3"
actual = [gql|
line1
line2
line3
|]
in actual `shouldBe` expected

View File

@ -3,6 +3,7 @@
obtain one at https://mozilla.org/MPL/2.0/. -} obtain one at https://mozilla.org/MPL/2.0/. -}
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
module Language.GraphQL.CoerceSpec module Language.GraphQL.CoerceSpec
( spec ( spec
) where ) where

View File

@ -4,7 +4,6 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE PackageImports #-}
module Language.GraphQL.DirectiveSpec module Language.GraphQL.DirectiveSpec
( spec ( spec
@ -18,7 +17,7 @@ import Language.GraphQL.TH
import Language.GraphQL.Type import Language.GraphQL.Type
import qualified Language.GraphQL.Type.Out as Out import qualified Language.GraphQL.Type.Out as Out
import Test.Hspec (Spec, describe, it) import Test.Hspec (Spec, describe, it)
import "graphql-spice" Test.Hspec.GraphQL import Test.Hspec.GraphQL
experimentalResolver :: Schema IO experimentalResolver :: Schema IO
experimentalResolver = schema queryType Nothing Nothing mempty experimentalResolver = schema queryType Nothing Nothing mempty

View File

@ -4,7 +4,6 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE PackageImports #-}
module Language.GraphQL.FragmentSpec module Language.GraphQL.FragmentSpec
( spec ( spec
@ -20,7 +19,7 @@ import qualified Language.GraphQL.Type.Out as Out
import Language.GraphQL.TH import Language.GraphQL.TH
import qualified Language.GraphQL as GraphQL import qualified Language.GraphQL as GraphQL
import Test.Hspec (Spec, describe, it) import Test.Hspec (Spec, describe, it)
import "graphql-spice" Test.Hspec.GraphQL import Test.Hspec.GraphQL
size :: (Text, Value) size :: (Text, Value)
size = ("size", String "L") size = ("size", String "L")

View File

@ -4,7 +4,6 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE PackageImports #-}
module Language.GraphQL.RootOperationSpec module Language.GraphQL.RootOperationSpec
( spec ( spec
@ -18,7 +17,7 @@ import Test.Hspec (Spec, describe, it)
import Language.GraphQL.TH import Language.GraphQL.TH
import Language.GraphQL.Type import Language.GraphQL.Type
import qualified Language.GraphQL.Type.Out as Out import qualified Language.GraphQL.Type.Out as Out
import "graphql-spice" Test.Hspec.GraphQL import Test.Hspec.GraphQL
hatType :: Out.ObjectType IO hatType :: Out.ObjectType IO
hatType = Out.ObjectType "Hat" Nothing [] hatType = Out.ObjectType "Hat" Nothing []

View File

@ -0,0 +1,27 @@
{- This Source Code Form is subject to the terms of the Mozilla Public License,
v. 2.0. If a copy of the MPL was not distributed with this file, You can
obtain one at https://mozilla.org/MPL/2.0/. -}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
module Language.GraphQL.THSpec
( spec
) where
import Data.Text (Text)
import Language.GraphQL.TH (gql)
import Test.Hspec (Spec, describe, it, shouldBe)
spec :: Spec
spec = do
describe "gql" $
it "replaces CRNL with NL" $
let expected :: Text
expected = "line1\nline2\nline3"
actual = [gql|
line1
line2
line3
|]
in actual `shouldBe` expected