hjsonschema 1.8.0 → 1.9.0
raw patch · 5 files changed
+50/−34 lines, 5 filesdep −semigroupsdep ~aesonPVP ok
version bump matches the API change (PVP)
Dependencies removed: semigroups
Dependency ranges changed: aeson
API changes (from Hackage documentation)
- JSONSchema.Draft4.Schema: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Draft4.Schema.Schema
- JSONSchema.Draft4.Schema: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Draft4.Schema.Schema
- JSONSchema.Types: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Types.Schema
- JSONSchema.Types: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Types.Schema
- JSONSchema.Validator.Draft4: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Definitions schema)
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.EnumValidator
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.Ref
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.SchemaType
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.TypeContext
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Any.TypeValidator
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.AllOf schema)
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.AnyOf schema)
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.NotValidator schema)
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Any.OneOf schema)
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Validator.Draft4.Any.SchemaType
- JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.ToJSON.ToJSON JSONSchema.Validator.Draft4.Any.TypeValidator
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Array.MaxItems
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Array.MinItems
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Array.UniqueItems
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Array.Items schema)
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Array.ItemsRelated schema)
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
- JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Draft4.Array.Items schema)
- JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Number.Maximum
- JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Number.Minimum
- JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Number.MultipleOf
- JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Object.MaxProperties
- JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Object.MinProperties
- JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.Object.Required
- JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Object.DependenciesValidator schema)
- JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.FromJSON.FromJSON schema => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Draft4.Object.Dependency schema)
- JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.ToJSON.ToJSON schema => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Draft4.Object.Dependency schema)
- JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.String.MaxLength
- JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.String.MinLength
- JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.FromJSON.FromJSON JSONSchema.Validator.Draft4.String.PatternValidator
- JSONSchema.Validator.Utils: instance Data.Aeson.Types.FromJSON.FromJSON a => Data.Aeson.Types.FromJSON.FromJSON (JSONSchema.Validator.Utils.NonEmpty' a)
- JSONSchema.Validator.Utils: instance Data.Aeson.Types.ToJSON.ToJSON a => Data.Aeson.Types.ToJSON.ToJSON (JSONSchema.Validator.Utils.NonEmpty' a)
+ JSONSchema.Draft4.Schema: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Draft4.Schema: instance Data.Aeson.Types.Class.ToJSON JSONSchema.Draft4.Schema.Schema
+ JSONSchema.Fetch: instance Data.Semigroup.Semigroup (JSONSchema.Fetch.URISchemaMap schema)
+ JSONSchema.Types: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Types.Schema
+ JSONSchema.Types: instance Data.Aeson.Types.Class.ToJSON JSONSchema.Types.Schema
+ JSONSchema.Validator.Draft4: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Definitions schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Any.EnumValidator
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Any.Ref
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Any.SchemaType
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Any.TypeContext
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Any.AllOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Any.AnyOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Any.NotValidator schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Any.OneOf schema)
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.ToJSON JSONSchema.Validator.Draft4.Any.SchemaType
+ JSONSchema.Validator.Draft4.Any: instance Data.Aeson.Types.Class.ToJSON JSONSchema.Validator.Draft4.Any.TypeValidator
+ JSONSchema.Validator.Draft4.Any: newBaseURIFromFragment :: FromJSON schema => (BaseURI -> schema -> BaseURI) -> BaseURI -> Value -> Either JSONPointerError BaseURI
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Array.MaxItems
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Array.MinItems
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Array.UniqueItems
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Array.ItemsRelated schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.ToJSON schema => Data.Aeson.Types.Class.ToJSON (JSONSchema.Validator.Draft4.Array.AdditionalItems schema)
+ JSONSchema.Validator.Draft4.Array: instance Data.Aeson.Types.Class.ToJSON schema => Data.Aeson.Types.Class.ToJSON (JSONSchema.Validator.Draft4.Array.Items schema)
+ JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Number.Maximum
+ JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Number.Minimum
+ JSONSchema.Validator.Draft4.Number: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Number.MultipleOf
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Object.MaxProperties
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Object.MinProperties
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.Object.Required
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Object.DependenciesValidator schema)
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.Class.FromJSON schema => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.Object: instance Data.Aeson.Types.Class.ToJSON schema => Data.Aeson.Types.Class.ToJSON (JSONSchema.Validator.Draft4.Object.Dependency schema)
+ JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.String.MaxLength
+ JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.String.MinLength
+ JSONSchema.Validator.Draft4.String: instance Data.Aeson.Types.Class.FromJSON JSONSchema.Validator.Draft4.String.PatternValidator
+ JSONSchema.Validator.Utils: instance Data.Aeson.Types.Class.FromJSON a => Data.Aeson.Types.Class.FromJSON (JSONSchema.Validator.Utils.NonEmpty' a)
+ JSONSchema.Validator.Utils: instance Data.Aeson.Types.Class.ToJSON a => Data.Aeson.Types.Class.ToJSON (JSONSchema.Validator.Utils.NonEmpty' a)
- JSONSchema.Validator.Draft4.Any: resolveFragment :: forall schema. (FromJSON schema, ToJSON schema) => (BaseURI -> schema -> BaseURI) -> Scope schema -> Text -> Either JSONPointerError (Scope schema, schema)
+ JSONSchema.Validator.Draft4.Any: resolveFragment :: (FromJSON schema, ToJSON schema) => (BaseURI -> schema -> BaseURI) -> Scope schema -> Text -> Either JSONPointerError (Scope schema, schema)
Files
- README.md +8/−20
- changelog.md +6/−0
- hjsonschema.cabal +2/−5
- src/JSONSchema/Fetch.hs +2/−1
- src/JSONSchema/Validator/Draft4/Any.hs +32/−8
README.md view
@@ -1,37 +1,25 @@-# Summary--A Haskell implementation of [JSON Schema](http://json-schema.org/) ([Draft 4](http://json-schema.org/specification-links.html)).+# DEPRECATION NOTICE -[Hackage](https://hackage.haskell.org/package/hjsonschema) / [GitHub](https://github.com/seagreen/hjsonschema) / [Travis CI](https://travis-ci.org/seagreen/hjsonschema)+`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). -# Example+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. -See [here](https://github.com/seagreen/hjsonschema/blob/master/examples/Simple.hs).+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. -# Design+# Links -`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).+[Hackage](https://hackage.haskell.org/package/hjsonschema) / [GitHub](https://github.com/seagreen/hjsonschema) / [Travis CI](https://travis-ci.org/seagreen/hjsonschema) -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.+# Example -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.+See [here](https://github.com/seagreen/hjsonschema/blob/master/examples/Simple.hs). # System dependencies + Requires [pcre](http://www.pcre.org/) (`pkgs.pcre` in Nixpkgs). -# Tests--Run all: `stack test`--Run only local tests: `stack test hjsonschema:local`--Run only remote tests (temporarily starts an HTTP server on port 1234 and makes GETs to json-schema.org): `stack test hjsonschema:remote`- ## Vendoring + `JSON-Schema-Test-Suite` is vendored from commit # c1b12bf699f29a04b4286711c6e3bbfba66f21e5 [here](https://github.com/json-schema-org/JSON-Schema-Test-Suite). + `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).--+ `.travis.yml` was created with `make_travis_yml_2.hs` commit # ea6c7d177a97bfbfb2fdc4deba943d60d2aff199.
changelog.md view
@@ -1,5 +1,11 @@ # 1.8.0 ++ Add GHC 8.4 support (thanks @4e6 !).++ Drop GHC 7.10 support.++ Fix JSON Pointer resolution error.++# 1.8.0+ + Allow HTTPS references (thanks @creichert!). + Use `safe-exceptions` to eliminate the risk of catching asynchronous exceptions.
hjsonschema.cabal view
@@ -1,5 +1,5 @@ name: hjsonschema-version: 1.8.0+version: 1.9.0 synopsis: JSON Schema library homepage: https://github.com/seagreen/hjsonschema license: MIT@@ -10,7 +10,7 @@ build-type: Simple cabal-version: >=1.10 -- Rerun multi-ghc-travis (executable make-travis-yml-2) after changing:-Tested-With: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.1+Tested-With: GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.1 extra-source-files: changelog.md JSON-Schema-Test-Suite/remotes/*.json@@ -77,7 +77,6 @@ , QuickCheck >= 2.8 , safe-exceptions >= 0.1.6 , scientific >= 0.3- , semigroups >= 0.18 , unordered-containers >= 0.2 , text >= 1.1 , vector >= 0.10@@ -115,7 +114,6 @@ , hjsonschema , profunctors , protolude- , semigroups , text , QuickCheck , unordered-containers@@ -154,7 +152,6 @@ , hjsonschema , profunctors , protolude- , semigroups , text , unordered-containers , vector
src/JSONSchema/Fetch.hs view
@@ -7,6 +7,7 @@ import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS import qualified Data.HashMap.Strict as HM+import qualified Data.Semigroup as S import qualified Data.Text as T import qualified Network.HTTP.Client as NC import qualified Network.HTTP.Client.TLS as NCTLS@@ -29,7 +30,7 @@ -- | Keys are URIs (without URI fragments). newtype URISchemaMap schema = URISchemaMap { _unURISchemaMap :: HashMap Text schema }- deriving (Eq, Show, Monoid)+ deriving (Eq, Show, S.Semigroup, Monoid) -- | A top-level schema along with its location. data SchemaWithURI schema = SchemaWithURI
src/JSONSchema/Validator/Draft4/Any.hs view
@@ -4,6 +4,7 @@ import Data.Aeson.TH (constructorTagModifier) import Data.Char (toLower)+import qualified Data.HashMap.Strict as HM import Data.List.NonEmpty (NonEmpty((:|))) import qualified Data.List.NonEmpty as NE import qualified Data.Scientific as SCI@@ -133,7 +134,7 @@ deriving (Eq, Show) resolveFragment- :: forall schema. (FromJSON schema, ToJSON schema)+ :: (FromJSON schema, ToJSON schema) => (BaseURI -> schema -> BaseURI) -> Scope schema -> Text@@ -158,17 +159,40 @@ -- as property keys that aren't meant to change scope? -- Perhaps this should be added to the language agnostic -- test suite as well.+ --+ -- In the meantime 'newBaseURIFromFragment' drops all keys+ -- from JSON objects except "id", which at least prevents+ -- SubschemaDecodingError in a situation where one of the+ -- values we step through isn't a valid schema. go :: (Value, BaseURI) -> JP.Token -> Either JSONPointerError (Value, BaseURI)- go (lastVal, uri) tok = do+ go (lastVal, baseURI) tok = do v <- first ResolutionError (JP.resolveToken tok lastVal)- case v of- Array _ -> pure (v, uri)- _ -> do- -- PERFORMANCE: Avoid deserializing subschemas.- schema <- first SubschemaDecodingError (fromJSONEither v)- pure (v, updateScope uri schema)+ newBase <- newBaseURIFromFragment updateScope baseURI v+ Right (v, newBase)++-- | Update the 'BaseURI' (the store of the current "id" value)+-- after resolving one token of a JSON Pointer and stepping into+-- a new 'Value'.+newBaseURIFromFragment+ :: FromJSON schema+ => (BaseURI -> schema -> BaseURI)+ -> BaseURI+ -> Value+ -> Either JSONPointerError BaseURI+newBaseURIFromFragment updateScope baseURI v =+ case v of+ Object hm -> do+ let hmWithOnlyId = case HM.lookup idKey hm of+ Nothing -> mempty+ Just idVal -> HM.singleton idKey idVal+ schema <- first SubschemaDecodingError (fromJSONEither (Object hmWithOnlyId))+ Right (updateScope baseURI schema)+ _ -> Right baseURI+ where+ idKey :: Text+ idKey = "id" -------------------------------------------------- -- * enum