Compare commits

..

No commits in common. "master" and "v1.0.3.0" have entirely different histories.

13 changed files with 35 additions and 188 deletions

View File

@ -1,3 +0,0 @@
END {
system("cabal upload --username belka --password "ENVIRON["HACKAGE_PASSWORD"]" "$0)
}

View File

@ -2,8 +2,6 @@ name: Build
on: on:
push: push:
branches:
- '**'
pull_request: pull_request:
branches: [master] branches: [master]

View File

@ -1,17 +0,0 @@
name: Release
on:
push:
tags:
- '**'
jobs:
release:
runs-on: buildenv
steps:
- uses: actions/checkout@v4
- name: Upload a candidate
env:
HACKAGE_PASSWORD: ${{ secrets.HACKAGE_PASSWORD }}
run: |
cabal sdist | awk -f .gitea/deploy.awk

View File

@ -6,28 +6,6 @@ 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
### Added
- Add `ToGraphQL` and `FromGraphQL` instances for `Value` and `HashMap`.
## [1.0.4.0] - 2024-10-24
### Added
- `gql` quasi quoter which generates a string literal with the first line
starting at the first column and all following lines indented relative to the
first line.
## [1.0.3.0] - 2024-07-20 ## [1.0.3.0] - 2024-07-20
### Added ### Added
- Add `deriveToGraphQL` for deriving `ToGraphQL` instances automatically. - Add `deriveToGraphQL` for deriving `ToGraphQL` instances automatically.
@ -53,10 +31,6 @@ 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.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
[1.0.2.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.1.0...v1.0.2.0 [1.0.2.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.1.0...v1.0.2.0
[1.0.1.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.0.0...v1.0.1.0 [1.0.1.0]: https://git.caraus.tech/OSS/graphql-spice/compare/v1.0.0.0...v1.0.1.0

View File

@ -1,7 +1,7 @@
cabal-version: 3.0 cabal-version: 2.4
name: graphql-spice name: graphql-spice
version: 1.0.6.0 version: 1.0.3.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,45 +10,44 @@ 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-2025 Eugen Wissner copyright: (c) 2021-2023 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.10.1 GHC == 9.4.8
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
Language.GraphQL.TH Test.Hspec.GraphQL
Test.Hspec.GraphQL other-modules:
other-modules: hs-source-dirs: src
hs-source-dirs: src ghc-options: -Wall
ghc-options: -Wall build-depends:
build-depends: aeson >= 2.0.3 && < 2.3,
aeson >= 2.0.3 && < 2.3, base >= 4.7 && < 5,
base >= 4.7 && < 5, conduit ^>= 1.3.4,
conduit ^>= 1.3.4, containers ^>= 0.6.2,
containers >= 0.6 && < 0.8, exceptions ^>= 0.10.4,
exceptions ^>= 0.10.4, hspec-expectations >= 0.8.2 && < 0.9,
hspec-expectations >= 0.8.2 && < 0.9, graphql >= 1.2,
graphql ^>= 1.5.0, megaparsec >= 9.0 && < 10,
megaparsec >= 9.0 && < 10, scientific ^>= 0.3.7,
scientific ^>= 0.3.7, template-haskell >= 2.16 && < 3,
template-haskell >= 2.16 && < 3, text >= 1.2 && < 3,
text >= 1.2 && < 3, time >= 1.11.1,
time >= 1.12.2 && < 1.15, transformers >= 0.5.6 && < 0.7,
transformers >= 0.5.6 && < 0.7, vector >= 0.12 && < 0.14,
vector >= 0.12 && < 0.14, unordered-containers ^>= 0.2.16
unordered-containers ^>= 0.2.16 default-language: Haskell2010
default-language: Haskell2010
test-suite graphql-test test-suite graphql-test
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0
@ -59,7 +58,6 @@ 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

@ -5,7 +5,6 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TupleSections #-} {-# LANGUAGE TupleSections #-}
{-# LANGUAGE FlexibleInstances #-}
-- | ToGraphQL and FromGraphQL typeclasses used for user-defined type -- | ToGraphQL and FromGraphQL typeclasses used for user-defined type
-- conversion. -- conversion.
@ -99,18 +98,10 @@ class ToGraphQL a
where where
toGraphQL :: a -> Type.Value toGraphQL :: a -> Type.Value
instance ToGraphQL Type.Value
where
toGraphQL a = a
instance ToGraphQL Text 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
@ -204,30 +195,17 @@ instance ToGraphQL LocalTime
where where
toGraphQL = iso8601ToGraphQL toGraphQL = iso8601ToGraphQL
instance ToGraphQL a => ToGraphQL (HashMap.HashMap Text a)
where
toGraphQL = Type.Object . fmap toGraphQL
-- | Instances of this typeclass can be used to convert GraphQL internal -- | Instances of this typeclass can be used to convert GraphQL internal
-- representation to user-defined type. -- representation to user-defined type.
class FromGraphQL a class FromGraphQL a
where where
fromGraphQL :: Type.Value -> Maybe a fromGraphQL :: Type.Value -> Maybe a
instance FromGraphQL Type.Value
where
fromGraphQL = Just
instance FromGraphQL Text instance FromGraphQL Text
where where
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
@ -330,11 +308,6 @@ instance FromGraphQL LocalTime
where where
fromGraphQL = fromGraphQLToISO8601 fromGraphQL = fromGraphQLToISO8601
instance FromGraphQL a => FromGraphQL (HashMap.HashMap Text a)
where
fromGraphQL (Type.Object hm) = traverse fromGraphQL hm
fromGraphQL _ = Nothing
stringLE :: Name -> Q Exp stringLE :: Name -> Q Exp
stringLE = litE . stringL . nameBase stringLE = litE . stringL . nameBase

View File

@ -1,49 +0,0 @@
{- 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

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

View File

@ -3,7 +3,6 @@
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,6 +4,7 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE PackageImports #-}
module Language.GraphQL.DirectiveSpec module Language.GraphQL.DirectiveSpec
( spec ( spec
@ -17,7 +18,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 Test.Hspec.GraphQL import "graphql-spice" Test.Hspec.GraphQL
experimentalResolver :: Schema IO experimentalResolver :: Schema IO
experimentalResolver = schema queryType Nothing Nothing mempty experimentalResolver = schema queryType Nothing Nothing mempty

View File

@ -4,6 +4,7 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE PackageImports #-}
module Language.GraphQL.FragmentSpec module Language.GraphQL.FragmentSpec
( spec ( spec
@ -19,7 +20,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 Test.Hspec.GraphQL import "graphql-spice" Test.Hspec.GraphQL
size :: (Text, Value) size :: (Text, Value)
size = ("size", String "L") size = ("size", String "L")

View File

@ -4,6 +4,7 @@
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE PackageImports #-}
module Language.GraphQL.RootOperationSpec module Language.GraphQL.RootOperationSpec
( spec ( spec
@ -17,7 +18,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 Test.Hspec.GraphQL import "graphql-spice" Test.Hspec.GraphQL
hatType :: Out.ObjectType IO hatType :: Out.ObjectType IO
hatType = Out.ObjectType "Hat" Nothing [] hatType = Out.ObjectType "Hat" Nothing []

View File

@ -1,27 +0,0 @@
{- 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