git.iko.soy/typeable/hjsonschema
on 43bf0cd help sign in
7 files changed+45−61
since splitsnapshots
unifiedsplit
.travis.yml+5−5 README.md+20−8 changelog.md−11 hjsonschema.cabal+5−2 src/JSONSchema/Fetch.hs+1−2 src/JSONSchema/Validator/Draft4/Any.hs+8−32 stack.yaml+6−1
.travis.yml+5−5
@@ -26,15 +26,15 @@ before_cache:
2626
2727matrix:
2828 include:
29+ - compiler: "ghc-7.10.3"
30+ # env: TEST=--disable-tests BENCH=--disable-benchmarks
31+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-7.10.3], sources: [hvr-ghc]}}
2932 - compiler: "ghc-8.0.2"
3033 # env: TEST=--disable-tests BENCH=--disable-benchmarks
3134 addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.0.2], sources: [hvr-ghc]}}
32− - compiler: "ghc-8.2.2"
33− # env: TEST=--disable-tests BENCH=--disable-benchmarks
34− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.2], sources: [hvr-ghc]}}
35− - compiler: "ghc-8.4.1"
35+ - compiler: "ghc-8.2.1"
3636 # env: TEST=--disable-tests BENCH=--disable-benchmarks
37− addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.4.1], sources: [hvr-ghc]}}
37+ addons: {apt: {packages: [ghc-ppa-tools,cabal-install-head,ghc-8.2.1], sources: [hvr-ghc]}}
3838
3939before_install:
4040 - HC=${CC}
README.md+20−8
@@ -1,12 +1,6 @@
1−# DEPRECATION NOTICE
1+# Summary
22
3−`hjsonschema` was an attempt to build a very modular JSON Schema library. Validators have [a concrete type](src/JSONSchema/Validator/Types.hs) and can be mixed and matched into new [Specs](src/JSONSchema/Types.hs).
4−
5−However this flexibility came at the price of complicating the code. I don't think it was the right tradeoff, especially since situations where you'd want to change what validators make up a `Spec` at runtime seem rare.
6−
7−Also, there are many parts of JSON Schema that `hjsonschema` doesn't implement properly (as you can see from the issue tracker). I'm hoping that a new JSON Schema library will come along that handles these correctly. In the meantime I'm happy to merge working fixes into here.
8−
9−# Links
3+A Haskell implementation of [JSON Schema](http://json-schema.org/) ([Draft 4](http://json-schema.org/specification-links.html)).
104
115[Hackage](https://hackage.haskell.org/package/hjsonschema) / [GitHub](https://github.com/seagreen/hjsonschema) / [Travis CI](https://travis-ci.org/seagreen/hjsonschema)
126
@@ -14,12 +8,30 @@ Also, there are many parts of JSON Schema that `hjsonschema` doesn't implement p
148
159See [here](https://github.com/seagreen/hjsonschema/blob/master/examples/Simple.hs).
1610
11+# Design
12+
13+`hjsonschema` was an attempt to build a very modular JSON Schema library. Validators have [a concrete type](src/JSONSchema/Validator/Types.hs) and can be mixed and matched into new [Specs](src/JSONSchema/Types.hs).
14+
15+However this flexibility comes at the price of complicating the code. I'm no longer sure it was the right tradeoff, especially since situations where you'd want to change what validators make up a `Spec` at runtime seem rare.
16+
17+Also, there are edge cases of JSON Schema that `hjsonschema` doesn't implement properly (as you can see from the issue tracker). My motivation to fix them myself has ended. However, I'll still maintain the library, give feedback on issues, and merge PRs. I'd also be happy to advise any Haskellers who are interested in writing their own JSON Schema libraries.
18+
1719# System dependencies
1820
1921+ Requires [pcre](http://www.pcre.org/) (`pkgs.pcre` in Nixpkgs).
2022
23+# Tests
24+
25+Run all: `stack test`
26+
27+Run only local tests: `stack test hjsonschema:local`
28+
29+Run only remote tests (temporarily starts an HTTP server on port 1234 and makes GETs to json-schema.org): `stack test hjsonschema:remote`
30+
2131## Vendoring
2232
2333+ `JSON-Schema-Test-Suite` is vendored from commit # c1b12bf699f29a04b4286711c6e3bbfba66f21e5 [here](https://github.com/json-schema-org/JSON-Schema-Test-Suite).
2434
2535+ `src/draft4.json` is from commit # c1b12bf699f29a04b4286711c6e3bbfba66f21e5 [here](https://github.com/json-schema/json-schema). The [root ref in remote ref](./JSON-Schema-Test-Suite/tests/draft4/refRemote.json) test has been modified to fix [#175](https://github.com/json-schema-org/JSON-Schema-Test-Suite/issues/175).
36+
37++ `.travis.yml` was created with `make_travis_yml_2.hs` commit # ea6c7d177a97bfbfb2fdc4deba943d60d2aff199.
changelog.md−11
@@ -1,14 +1,3 @@
1−# 1.8.0
2−
3−+ Add GHC 8.4 support (thanks @4e6 !).
4−+ Drop GHC 7.10 support.
5−+ Fix JSON Pointer resolution error.
6−
7−# 1.8.0
8−
9−+ Allow HTTPS references (thanks @creichert!).
10−+ Use `safe-exceptions` to eliminate the risk of catching asynchronous exceptions.
11−
121# 1.7.2
132
143+ Remove upper bounds.
hjsonschema.cabal+5−2
@@ -1,5 +1,5 @@
11name: hjsonschema
2−version: 1.9.0
2+version: 1.7.2
33synopsis: JSON Schema library
44homepage: https://github.com/seagreen/hjsonschema
55license: MIT
@@ -10,7 +10,7 @@ category: Data
1010build-type: Simple
1111cabal-version: >=1.10
1212-- Rerun multi-ghc-travis (executable make-travis-yml-2) after changing:
13−Tested-With: GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1
13+Tested-With: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.1
1414extra-source-files:
1515 changelog.md
1616 JSON-Schema-Test-Suite/remotes/*.json
@@ -77,6 +77,7 @@ library
7777 , QuickCheck >= 2.8
7878 , safe-exceptions >= 0.1.6
7979 , scientific >= 0.3
80+ , semigroups >= 0.18
8081 , unordered-containers >= 0.2
8182 , text >= 1.1
8283 , vector >= 0.10
@@ -114,6 +115,7 @@ test-suite local
114115 , hjsonschema
115116 , profunctors
116117 , protolude
118+ , semigroups
117119 , text
118120 , QuickCheck
119121 , unordered-containers
@@ -152,6 +154,7 @@ test-suite remote
152154 , hjsonschema
153155 , profunctors
154156 , protolude
157+ , semigroups
155158 , text
156159 , unordered-containers
157160 , vector
src/JSONSchema/Fetch.hs+1−2
@@ -7,7 +7,6 @@ import Control.Monad (foldM)
77import qualified Data.ByteString as BS
88import qualified Data.ByteString.Lazy as LBS
99import qualified Data.HashMap.Strict as HM
10−import qualified Data.Semigroup as S
1110import qualified Data.Text as T
1211import qualified Network.HTTP.Client as NC
1312import qualified Network.HTTP.Client.TLS as NCTLS
@@ -30,7 +29,7 @@ data FetchInfo schema = FetchInfo
3029-- | Keys are URIs (without URI fragments).
3130newtype URISchemaMap schema
3231 = URISchemaMap { _unURISchemaMap :: HashMap Text schema }
33− deriving (Eq, Show, S.Semigroup, Monoid)
32+ deriving (Eq, Show, Monoid)
3433
3534-- | A top-level schema along with its location.
3635data SchemaWithURI schema = SchemaWithURI
src/JSONSchema/Validator/Draft4/Any.hs+8−32
@@ -4,7 +4,6 @@ import Import hiding ((<>))
44
55import Data.Aeson.TH (constructorTagModifier)
66import Data.Char (toLower)
7−import qualified Data.HashMap.Strict as HM
87import Data.List.NonEmpty (NonEmpty((:|)))
98import qualified Data.List.NonEmpty as NE
109import qualified Data.Scientific as SCI
@@ -134,7 +133,7 @@ data JSONPointerError
134133 deriving (Eq, Show)
135134
136135resolveFragment
137− :: (FromJSON schema, ToJSON schema)
136+ :: forall schema. (FromJSON schema, ToJSON schema)
138137 => (BaseURI -> schema -> BaseURI)
139138 -> Scope schema
140139 -> Text
@@ -159,40 +158,17 @@ resolveFragment updateScope scope fragment = do
159158 -- as property keys that aren't meant to change scope?
160159 -- Perhaps this should be added to the language agnostic
161160 -- test suite as well.
162− --
163− -- In the meantime 'newBaseURIFromFragment' drops all keys
164− -- from JSON objects except "id", which at least prevents
165− -- SubschemaDecodingError in a situation where one of the
166− -- values we step through isn't a valid schema.
167161 go :: (Value, BaseURI)
168162 -> JP.Token
169163 -> Either JSONPointerError (Value, BaseURI)
170− go (lastVal, baseURI) tok = do
164+ go (lastVal, uri) tok = do
171165 v <- first ResolutionError (JP.resolveToken tok lastVal)
172− newBase <- newBaseURIFromFragment updateScope baseURI v
173− Right (v, newBase)
174−
175−-- | Update the 'BaseURI' (the store of the current "id" value)
176−-- after resolving one token of a JSON Pointer and stepping into
177−-- a new 'Value'.
178−newBaseURIFromFragment
179− :: FromJSON schema
180− => (BaseURI -> schema -> BaseURI)
181− -> BaseURI
182− -> Value
183− -> Either JSONPointerError BaseURI
184−newBaseURIFromFragment updateScope baseURI v =
185− case v of
186− Object hm -> do
187− let hmWithOnlyId = case HM.lookup idKey hm of
188− Nothing -> mempty
189− Just idVal -> HM.singleton idKey idVal
190− schema <- first SubschemaDecodingError (fromJSONEither (Object hmWithOnlyId))
191− Right (updateScope baseURI schema)
192− _ -> Right baseURI
193− where
194− idKey :: Text
195− idKey = "id"
166+ case v of
167+ Array _ -> pure (v, uri)
168+ _ -> do
169+ -- PERFORMANCE: Avoid deserializing subschemas.
170+ schema <- first SubschemaDecodingError (fromJSONEither v)
171+ pure (v, updateScope uri schema)
196172
197173--------------------------------------------------
198174-- * enum
stack.yaml+6−1
@@ -1,2 +1,7 @@
11resolver: lts-10.8
2−pvp-bounds: upper-revision
2+# packages:
3+# - './'
4+# - location: '../hjsonpointer'
5+# extra-dep: true
6+extra-deps:
7+ - hjsonpointer-1.3.0