From 905c73af78f7470b3e9cac20641c48c17b978d04 Mon Sep 17 00:00:00 2001 From: Christian Legnitto <christian@legnitto.com> Date: Mon, 17 Dec 2018 14:02:33 -0800 Subject: [PATCH] Move juniper changelog to a single file in juniper crate --- changelog/0.10.0.md | 58 ----- changelog/0.9.0.md | 95 ------- changelog/0.9.2.md | 13 - changelog/master.md | 89 ------- changelog/older.md | 340 ------------------------- juniper/CHANGELOG.md | 582 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 582 insertions(+), 595 deletions(-) delete mode 100644 changelog/0.10.0.md delete mode 100644 changelog/0.9.0.md delete mode 100644 changelog/0.9.2.md delete mode 100644 changelog/master.md delete mode 100644 changelog/older.md create mode 100644 juniper/CHANGELOG.md diff --git a/changelog/0.10.0.md b/changelog/0.10.0.md deleted file mode 100644 index f56d9da2..00000000 --- a/changelog/0.10.0.md +++ /dev/null @@ -1,58 +0,0 @@ -# [0.10.0] 2018-09-13 - -## Changes - -- Changed serialization of `NaiveDate` when using the optional `chronos` support. - - **Note:** while this is not a Rust breaking change, if you relied on the serialization format (perhaps by storing serialized data in a database or making asumptions in your client code written in another language) it could be a breaking change for your application. - - [#151](https://github.com/graphql-rust/juniper/pull/151) - -- The `GraphQLObject`, `GraphQLInputObject`, and `GraphQLEnum` custom derives will reject - invalid [names](http://facebook.github.io/graphql/October2016/#Name) at compile time. - - [#170](https://github.com/graphql-rust/juniper/pull/170) - -- Large integers (> signed 32bit) are now deserialized as floats. Previously, - they produced an "integer out of range" error. For languages that do not - have a distinction between integer and floating point types (such as - javascript), this meant large whole floating point values could not be - decoded (because they were represented without a fractional value such as `.0`). - - [#179](https://github.com/graphql-rust/juniper/pull/179) - -- The `GraphQLObject`, `GraphQLInputObject`, and `GraphQLEnum` custom derives - now parse doc strings and use them as descriptions. This behavior can be - overridden by using an explicit GraphQL `description` annotation such as - `#[graphql(description = "my description")]`. [View documentation](https://graphql-rust.github.io/types/objects/defining_objects.html#defining-objects). - - [#194](https://github.com/graphql-rust/juniper/issues/194) - -- Introduced `IntoFieldError` trait to allow custom error handling - i.e. custom result type. The error type must implement this trait resolving - the errors into `FieldError`. [View documentation](https://graphql-rust.github.io/types/objects/error_handling.html#structured-errors). - - [#40](https://github.com/graphql-rust/juniper/issues/40) - -- `GraphQLType` and `ToInputValue` are now implemented for Arc<T> - - [#212](https://github.com/graphql-rust/juniper/pull/212) - -- Error responses no longer have a _data_ field, instead, error details are stored in the _extensions_ field - - **Note:** while this is a breaking change, it is a necessary one to better align with the latest [GraphQL June 2018](https://facebook.github.io/graphql/June2018/#sec-Errors) specification, which defines the reserved _extensions_ field for error details. [View documentation](https://graphql-rust.github.io/types/objects/error_handling.html#structured-errors). - - [#219](https://github.com/graphql-rust/juniper/pull/219) - -* The `GraphQLObject` and `GraphQLInputObject` custom derives - now support lifetime annotations. - - [#225](https://github.com/graphql-rust/juniper/issues/225) - -* When using the `GraphQLObject` custom derive, fields can now be omitted by annotating the field with `#[graphql(skip)]`. [View documentation](https://graphql-rust.github.io/types/objects/defining_objects.html#skipping-fields). - - [#220](https://github.com/graphql-rust/juniper/issues/220) - -* Due to newer dependencies, the oldest Rust version supported is now 1.22.0 - - [#231](https://github.com/graphql-rust/juniper/pull/231) diff --git a/changelog/0.9.0.md b/changelog/0.9.0.md deleted file mode 100644 index 1b67aa9b..00000000 --- a/changelog/0.9.0.md +++ /dev/null @@ -1,95 +0,0 @@ - -## [0.9.0] 2017-12-03 - -## Changes - -This is the first release in a long time. -Quite a few changes have accumulated since `0.8.1`, including multiple breaking -changes. - -### Custom derive & macros - -Juniper has gained custom derive implementations for input objects, objects and -enums. - -* `#[derive(GraphQLInputObject)]` -* `#[derive(GraphQLEnum)]` -* `#[derive(GraphQLObject)]` - -The `graphql_enum!` and `graphql_input_object!` macros did not provide any more -benefits, so they have been removed! -All functionality is now covered by custom derive. -Check the [docs](https://graphql-rust.github.io) to find out more. - -### Web framework integrations - Iron & Rocket - -The iron and rocket integrations were removed from the main crate, and are now -available via the [juniper_iron](https://crates.io/crates/juniper_iron) and -[juniper_rocket](https://crates.io/crates/juniper_rocket) crates. - -### FieldError rewrite (custom data) - -The `FieldError` type now supports custom data with the `Value` type from -serde_json. Use this to populate the `data` field in returned errors. - -This also means that try! and `?` now work in resolvers, which is quite nice. - -Also, the `ResultExt` extension and the `jtry!` macro were removed, since they -are redundant now! - -### Dynamic Schemas - -Juniper has gained support for dynamic schemas, thanks to @srijs. - -That also means the type of `RootNode` has changed to include a lifetime. - -The repository was restructured to a multi crate workspace to enable several new -features like custom_derive and an extracted parser. - -#[#66](https://github.com/graphql-rust/juniper/pull/66) - -### Data Type Integrations - -Integrations with multiple popular crates was added to make working with them -easier. - -* uuid -* url -* chrono - -### Field Order - -To better comply with the specification, order of requested fields is -now preserved. - -[#82](https://github.com/graphql-rust/juniper/issues/82 - -### From/ToInputValue - -The `::from` and `::to` methods in `From/ToInputValue` were renamed to -`from/to_input_value()` to not conflict with other methods. - -[#90](https://github.com/graphql-rust/juniper/pull/90) - -### Other changes - -* Several small performance improvements -* Use [fnv](https://github.com/servo/rust-fnv) hash map for better performance - - -## Contributors - -A big shoutout to the many contributors for this version, sorted alphabetically. - -* Cameron Eldridge <cameldridge+git@gmail.com> -* Christian Legnitto <christian@legnitto.com> -* Jacob Haslehurst <jacob@haslehurst.net> -* Jane Keibler <wanderingelf14@gmail.com> -* Magnus Hallin <mhallin@fastmail.com> -* rushmorem <rushmore@webenchanter.com> -* Rushmore Mushambi <rushmore@webenchanter.com> -* Sagie Gur-Ari <sagiegurari@gmail.com> -* Sam Rijs <srijs@airpost.net> -* Stanko Krtalić <stanko.krtalic@gmail.com> -* theduke <chris@theduke.at> -* thomas-jeepe <penguinSoccer@outlook.com> diff --git a/changelog/0.9.2.md b/changelog/0.9.2.md deleted file mode 100644 index b3a09336..00000000 --- a/changelog/0.9.2.md +++ /dev/null @@ -1,13 +0,0 @@ -# [0.9.2] 2018-01-13 - -## Changes - -### `__typename` for unions - -The [`__typename`](http://graphql.org/learn/queries/#meta-fields) query meta-field now works on unions. - -[#112](https://github.com/graphql-rust/juniper/issues/112) - -### Debug impls. - -http::GraphQLRequest now implements `Debug`. diff --git a/changelog/master.md b/changelog/master.md deleted file mode 100644 index 2eb32fb8..00000000 --- a/changelog/master.md +++ /dev/null @@ -1,89 +0,0 @@ -# [master] yyyy-mm-dd - -## Changes - -- The minimum required Rust version is now `1.28.0`. - - [#271](https://github.com/graphql-rust/juniper/pull/271) - -- Juniper is now generic about the exact representation of scalar values. This - allows downstream crates to add support for own scalar value representations. - - There are two use cases for this feature: - * You want to support new scalar types not representable by the provided default - scalar value representation like for example `i64` - * You want to support a type from a third party crate that is not supported by juniper - - **Note:** This may need some changes in down stream code, especially if working with - generic code. To retain the current behaviour use `DefaultScalarValue` as scalar value type - - [#251](https://github.com/graphql-rust/juniper/pull/251) - -- The `GraphQLObject` and `GraphQLEnum` derives will mark graphql fields as - `@deprecated` when struct fields or enum variants are marked with the - builtin `#[deprecated]` attribute. - - The deprecation reason can be set using the `note = ...` meta item - (e.g. `#[deprecated(note = "Replaced by betterField")]`). - The `since` attribute is ignored. - - [#269](https://github.com/graphql-rust/juniper/pull/269) - - -- There is an alternative syntax for setting a field's _description_ and - _deprecation reason_ in the `graphql_object!` and `graphql_interface!` macros. - - To __deprecate__ a graphql field: - ```rust - // Original syntax for setting deprecation reason - field deprecated "Reason" my_field() -> { ... } - - // New alternative syntax for deprecation reason. - #[deprecated(note = "Reason")] - field my_field() -> { ... } - - // You can now also deprecate without a reason. - #[deprecated] - field my_field() -> { ... } - ``` - - To set the __description__ of a graphql field: - ```rust - // Original syntax for field descriptions - field my_field() as "Description" -> { ... } - - // Original syntax for argument descriptions - field my_field( - floops: i32 as "The number of starfish to be returned. \ - Can't be more than 100.", - ) -> { - ... - } - - // New alternative syntax for field descriptions - /// Description - field my_field() -> { ... } - - // New alternative syntax for argument descriptions - field my_field( - /// The number of starfish to be returned. - /// Can't be more than 100. - arg: i32, - ) -> { - ... - } - - // You can also use raw strings and const &'static str. - // - // Multiple docstrings will be collapsed into a single - // description separated by newlines. - /// This is my field. - /// - /// Make sure not to filtz the bitlet. - /// Flitzing without a bitlet has undefined behaviour. - /// - #[doc = my_consts::ADDED_IN_VERSION_XYZ] - field my_field() -> { ... } - ``` - - [#269](https://github.com/graphql-rust/juniper/pull/269) diff --git a/changelog/older.md b/changelog/older.md deleted file mode 100644 index 182f201b..00000000 --- a/changelog/older.md +++ /dev/null @@ -1,340 +0,0 @@ -Change log -========== - - -## [0.8.1] – 2017-06-15 - -Tiny release to fix broken crate metadata on crates.io. - -## [0.8.0] – 2017-06-15 - -## Breaking changes - -* To better comply with the specification, and to avoid weird bugs with very - large positive or negative integers, support for `i64` has been completely - dropped and replaced with `i32`. `i64` is no longer a valid GraphQL type in - Juniper, and `InputValue`/`Value` can only represent 32 bit integers. - - If an incoming integer is out of range for a 32 bit signed integer type, an - error will be returned to the client. - ([#52](https://github.com/graphql-rust/juniper/issues/52), - [#49](https://github.com/graphql-rust/juniper/issues/49)) - -* Serde has been updated to 1.0. If your application depends on an older - version, you will need to first update your application before you can upgrade - to a more recent Juniper. ([#43](https://github.com/graphql-rust/juniper/pull/43)) - -* `rustc_serialize` support has been dropped since this library is now - deprecated. ([#51](https://github.com/graphql-rust/juniper/pull/51)) - -## New features - -* A new `rocket-handlers` feature now includes some tools to use the - [Rocket](https://rocket.rs) framework. [A simple - example](juniper_rocket/examples/rocket-server.rs) has been added to the examples folder. - -## Bugfixes - -* A panic in the parser has been replaced with a proper error - ([#44](https://github.com/graphql-rust/juniper/pull/44)) - -## [0.7.0] – 2017-02-26 - -### Breaking changes - -* The `iron-handlers` feature now depends on Iron 0.5 - ([#30](https://github.com/graphql-rust/juniper/pull/30)). Because of - this, support for Rust 1.12 has been dropped. It might still work if - you're not using the Iron integrations feature, however. - -### New features - -* Input objects defined by the `graphql_input_object!` can now be used - as default values to field arguments and other input object fields. - - -## [0.6.3] – 2017-02-19 - -### New features - -* Add support for default values on input object fields - ([#28](https://github.com/graphql-rust/juniper/issues/28)) - -## [0.6.2] – 2017-02-05 - -### New features - -* The `null` literal is now supported in the GraphQL - language. ([#26](https://github.com/graphql-rust/juniper/pull/26)) -* Rustc-serialize is now optional, but enabled by default. If you - _only_ want Serde support, include Juniper without default features - and enable - Serde. ([#12](https://github.com/graphql-rust/juniper/pull/12)) -* The built-in `ID` type now has a public constructor and derives a - few traits (`Clone`, `Debug`, `Eq`, `PartialEq`, `From<String>`, - `Deref<Target=str>`). ([#19](https://github.com/graphql-rust/juniper/pull/19)) -* Juniper is now built and tested against all Rust compilers since - version 1.12.1. - -### Minor breaking change - -* Serde has been updated to - 0.9. ([#25](https://github.com/graphql-rust/juniper/pull/25)) - -### Bugfixes - -* The built-in GraphiQL handler had a bug in variable serialization. - ([#16](https://github.com/graphql-rust/juniper/pull/16)) -* The example should now build and run without problems on - Windows. ([#15](https://github.com/graphql-rust/juniper/pull/15)) -* Object types now properly implement - `__typename`. ([#22](https://github.com/graphql-rust/juniper/pull/22)) -* String variables are now properly parsed into GraphQL - enums. ([#17](https://github.com/graphql-rust/juniper/pull/17)) - -## [0.6.1] – 2017-01-06 - -### New features - -* Optional Serde support - ([#8](https://github.com/graphql-rust/juniper/pull/8)) - -### Improvements - -* The `graphql_input_object!` macro can now be used to define input - objects as public Rust structs. -* GraphiQL in the Iron GraphiQL handler has been updated to 0.8.1 - (#[#11](https://github.com/graphql-rust/juniper/pull/11)) - -### Minor breaking changes - -Some undocumented but public APIs were changed. - -* `to_snake_case` correctly renamed to `to_camel_case` - ([#9](https://github.com/graphql-rust/juniper/pull/9)) -* JSON serialization of `GraphQLError` changed to be more consistent - with how other values were serialized - ([#10](https://github.com/graphql-rust/juniper/pull/10)). - -## [0.6.0] – 2017-01-02 - -TL;DR: Many big changes in how context types work and how they -interact with the executor. Not too much to worry about if you're only -using the macros and not deriving `GraphQLType` directly. - -### Breaking changes - -* The `executor` argument in all resolver methods is now - immutable. The executor instead uses interior mutability to store - errors in a thread-safe manner. - - This change could open up for asynchronous or multi-threaded - execution: you can today use something like rayon in your resolve - methods to let child nodes be concurrently resolved. - - **How to fix:** All field resolvers that looked like `field - name(&mut executor` now should say `field name(&executor`. - -* The context type of `GraphQLType` is moved to an associated type; - meaning it's no longer generic. This only affects people who - implement the trait manually, _not_ macro users. - - This greatly simplifies a lot of code by ensuring that there only - can be one `GraphQLType` implementation for any given Rust - type. However, it has the downside that support for generic contexts - previously used in scalars, has been removed. Instead, use the new - context conversion features to accomplish the same task. - - **How to fix:** Instead of `impl GraphQLType<MyContext> for ...`, - you use `impl GraphQLType for ... { type Context = MyContext;`. - -* All context types must derive the `Context` marker trait. This is - part of an overarching change to allow different types to use - different contexts. - - **How to fix:** If you have written e.g. `graphql_object!(MyType: - MyContext ...)` you will need to add `impl Context for MyContext - {}`. Simple as that. - -* `Registry` and all meta type structs now takes one lifetime - parameter, which affects `GraphQLType`'s `meta` method. This only - affects people who implement the trait manually. - - **How to fix:** Change the type signature of `meta()` to read `fn - meta<'r>(registry: &mut Registry<'r>) -> MetaType<'r>`. - -* The type builder methods on `Registry` no longer return functions - taking types or fields. Due to how the borrow checker works with - expressions, you will have to split up the instantiation into two - statements. This only affects people who implement the `GraphQLType` - trait manually. - - **How to fix:** Change the contents of your `meta()` methods to - something like this: - - ```rust - fn meta<'r>(registry: &mut Registry<r>) -> MetaType<'r> { - let fields = &[ /* your fields ... */ ]; - - registry.build_object_type::<Self>(fields).into_meta() - } - - ``` - - -### Added - -* Support for different contexts for different types. As GraphQL - schemas tend to get large, narrowing down the context type to - exactly what a given type needs is great for - encapsulation. Similarly, letting different subsystems use different - resources thorugh the context is also useful for the same reasons. - - Juniper supports two different methods of doing this, depending on - your needs: if you have two contexts where one can be converted into - the other _without any extra knowledge_, you can implement the new - `FromContext` trait. This is useful if you have multiple crates or - modules that all belong to the same GraphQL schema: - - ```rust - - struct TopContext { - db: DatabaseConnection, - session: WebSession, - current_user: User, - } - - struct ModuleOneContext { - db: DatabaseConnection, // This module only requires a database connection - } - - impl Context for TopContext {} - impl Context for ModuleOneContext {} - - impl FromContext<TopContext> for ModuleOneContext { - fn from(ctx: &TopContext) -> ModuleOneContext { - ModuleOneContext { - db: ctx.db.clone() - } - } - } - - graphql_object!(Query: TopContext |&self| { - field item(&executor) -> Item { - executor.context().db.get_item() - } - }); - - // The `Item` type uses another context type - conversion is automatic - graphql_object!(Item: ModuleOneContext |&self| { - // ... - }); - - ``` - - The other way is to manually perform the conversion in a field - resolver. This method is preferred when the child context needs - extra knowledge than what exists in the parent context: - - ```rust - - // Each entity has its own context - struct TopContext { - entities: HashMap<i32, EntityContext>, - db: DatabaseConnection, - } - - struct EntityContext { - // fields - } - - impl Context for TopContext {} - impl Context for EntityContext {} - - graphql_object!(Query: TopContext |&self| { - // By returning a tuple (&Context, GraphQLType), you can tell the executor - // to switch out the context for the returned value. You can wrap the - // tuple in Option<>, FieldResult<>, FieldResult<Option<>>, or just return - // the tuple without wrapping it. - field entity(&executor, key: i32) -> Option<(&EntityContext, Entity)> { - executor.context().entities.get(&key) - .map(|ctx| (ctx, executor.context().db.get_entity(key))) - } - }); - - graphql_object!(Entity: EntityContext |&self| { - // ... - }); - - ``` - -### Improvements - -* Parser and query execution has now reduced the allocation overhead - by reusing as much as possible from the query source and meta type - information. - -## [0.5.3] – 2016-12-05 - -### Added - -* `jtry!`: Helper macro to produce `FieldResult`s from regular - `Result`s. Wherever you would be using `try!` in a regular function - or method, you can use `jtry!` in a field resolver: - - ```rust - graphql_object(MyType: Database |&self| { - field count(&executor) -> FieldResult<i32> { - let txn = jtry!(executor.context().transaction()); - - let count = jtry!(txn.execute("SELECT COUNT(*) FROM user")); - - Ok(count[0][0]) - } - }); - ``` - -### Changes - -* Relax context type trait requirements for the iron handler: your - contexts no longer have to be `Send + Sync`. - -* `RootNode` is now `Send` and `Sync` if both the mutation and query - types implement `Send` and `Sync`. - -### Bugfixes - -* `return` statements inside field resolvers no longer cause syntax - errors. - - - -## 0.5.2 – 2016-11-13 - -### Added - -* Support for marking fields and enum values deprecated. -* `input_object!` helper macro - -### Changes - -* The included example server now uses the simple Star Wars schema - used in query/introspection tests. - -### Bugfixes - -* The query validators - particularly ones concerned with validation - of input data and variables - have been improved significantly. A - large number of test cases have been added. - -* Macro syntax stability has also been improved. All syntactical edge - cases of the macros have gotten tests to verify their correctness. - -[0.8.0]: https://github.com/graphql-rust/juniper/compare/0.8.0...0.8.1 -[0.8.0]: https://github.com/graphql-rust/juniper/compare/0.7.0...0.8.0 -[0.7.0]: https://github.com/graphql-rust/juniper/compare/0.6.3...0.7.0 -[0.6.3]: https://github.com/graphql-rust/juniper/compare/0.6.2...0.6.3 -[0.6.2]: https://github.com/graphql-rust/juniper/compare/0.6.1...0.6.2 -[0.6.1]: https://github.com/graphql-rust/juniper/compare/0.6.0...0.6.1 -[0.6.0]: https://github.com/graphql-rust/juniper/compare/0.5.3...0.6.0 -[0.5.3]: https://github.com/graphql-rust/juniper/compare/0.5.2...0.5.3 diff --git a/juniper/CHANGELOG.md b/juniper/CHANGELOG.md new file mode 100644 index 00000000..f8df9e74 --- /dev/null +++ b/juniper/CHANGELOG.md @@ -0,0 +1,582 @@ +# master + +## Changes + +- The minimum required Rust version is now `1.28.0`. + + [#271](https://github.com/graphql-rust/juniper/pull/271) + +- Juniper is now generic about the exact representation of scalar values. This + allows downstream crates to add support for own scalar value representations. + + There are two use cases for this feature: + + - You want to support new scalar types not representable by the provided default + scalar value representation like for example `i64` + - You want to support a type from a third party crate that is not supported by juniper + + **Note:** This may need some changes in down stream code, especially if working with + generic code. To retain the current behaviour use `DefaultScalarValue` as scalar value type + + [#251](https://github.com/graphql-rust/juniper/pull/251) + +- The `GraphQLObject` and `GraphQLEnum` derives will mark graphql fields as + `@deprecated` when struct fields or enum variants are marked with the + builtin `#[deprecated]` attribute. + + The deprecation reason can be set using the `note = ...` meta item + (e.g. `#[deprecated(note = "Replaced by betterField")]`). + The `since` attribute is ignored. + + [#269](https://github.com/graphql-rust/juniper/pull/269) + +* There is an alternative syntax for setting a field's _description_ and + _deprecation reason_ in the `graphql_object!` and `graphql_interface!` macros. + + To **deprecate** a graphql field: + + ```rust + // Original syntax for setting deprecation reason + field deprecated "Reason" my_field() -> { ... } + + // New alternative syntax for deprecation reason. + #[deprecated(note = "Reason")] + field my_field() -> { ... } + + // You can now also deprecate without a reason. + #[deprecated] + field my_field() -> { ... } + ``` + + To set the **description** of a graphql field: + + ```rust + // Original syntax for field descriptions + field my_field() as "Description" -> { ... } + + // Original syntax for argument descriptions + field my_field( + floops: i32 as "The number of starfish to be returned. \ + Can't be more than 100.", + ) -> { + ... + } + + // New alternative syntax for field descriptions + /// Description + field my_field() -> { ... } + + // New alternative syntax for argument descriptions + field my_field( + /// The number of starfish to be returned. + /// Can't be more than 100. + arg: i32, + ) -> { + ... + } + + // You can also use raw strings and const &'static str. + // + // Multiple docstrings will be collapsed into a single + // description separated by newlines. + /// This is my field. + /// + /// Make sure not to filtz the bitlet. + /// Flitzing without a bitlet has undefined behaviour. + /// + #[doc = my_consts::ADDED_IN_VERSION_XYZ] + field my_field() -> { ... } + ``` + + [#269](https://github.com/graphql-rust/juniper/pull/269) + +# [0.10.0] 2018-09-13 + +## Changes + +- Changed serialization of `NaiveDate` when using the optional `chronos` support. + + **Note:** while this is not a Rust breaking change, if you relied on the serialization format (perhaps by storing serialized data in a database or making asumptions in your client code written in another language) it could be a breaking change for your application. + + [#151](https://github.com/graphql-rust/juniper/pull/151) + +- The `GraphQLObject`, `GraphQLInputObject`, and `GraphQLEnum` custom derives will reject + invalid [names](http://facebook.github.io/graphql/October2016/#Name) at compile time. + + [#170](https://github.com/graphql-rust/juniper/pull/170) + +- Large integers (> signed 32bit) are now deserialized as floats. Previously, + they produced an "integer out of range" error. For languages that do not + have a distinction between integer and floating point types (such as + javascript), this meant large whole floating point values could not be + decoded (because they were represented without a fractional value such as `.0`). + + [#179](https://github.com/graphql-rust/juniper/pull/179) + +- The `GraphQLObject`, `GraphQLInputObject`, and `GraphQLEnum` custom derives + now parse doc strings and use them as descriptions. This behavior can be + overridden by using an explicit GraphQL `description` annotation such as + `#[graphql(description = "my description")]`. [View documentation](https://graphql-rust.github.io/types/objects/defining_objects.html#defining-objects). + + [#194](https://github.com/graphql-rust/juniper/issues/194) + +- Introduced `IntoFieldError` trait to allow custom error handling + i.e. custom result type. The error type must implement this trait resolving + the errors into `FieldError`. [View documentation](https://graphql-rust.github.io/types/objects/error_handling.html#structured-errors). + + [#40](https://github.com/graphql-rust/juniper/issues/40) + +- `GraphQLType` and `ToInputValue` are now implemented for Arc<T> + + [#212](https://github.com/graphql-rust/juniper/pull/212) + +- Error responses no longer have a _data_ field, instead, error details are stored in the _extensions_ field + + **Note:** while this is a breaking change, it is a necessary one to better align with the latest [GraphQL June 2018](https://facebook.github.io/graphql/June2018/#sec-Errors) specification, which defines the reserved _extensions_ field for error details. [View documentation](https://graphql-rust.github.io/types/objects/error_handling.html#structured-errors). + + [#219](https://github.com/graphql-rust/juniper/pull/219) + +* The `GraphQLObject` and `GraphQLInputObject` custom derives + now support lifetime annotations. + + [#225](https://github.com/graphql-rust/juniper/issues/225) + +* When using the `GraphQLObject` custom derive, fields can now be omitted by annotating the field with `#[graphql(skip)]`. [View documentation](https://graphql-rust.github.io/types/objects/defining_objects.html#skipping-fields). + + [#220](https://github.com/graphql-rust/juniper/issues/220) + +* Due to newer dependencies, the oldest Rust version supported is now 1.22.0 + + [#231](https://github.com/graphql-rust/juniper/pull/231) + +# [0.9.2] 2018-01-13 + +## Changes + +### `__typename` for unions + +The [`__typename`](http://graphql.org/learn/queries/#meta-fields) query meta-field now works on unions. + +[#112](https://github.com/graphql-rust/juniper/issues/112) + +### Debug impls. + +http::GraphQLRequest now implements `Debug`. + +# [0.9.0] 2017-12-03 + +## Changes + +This is the first release in a long time. +Quite a few changes have accumulated since `0.8.1`, including multiple breaking +changes. + +### Custom derive & macros + +Juniper has gained custom derive implementations for input objects, objects and +enums. + +- `#[derive(GraphQLInputObject)]` +- `#[derive(GraphQLEnum)]` +- `#[derive(GraphQLObject)]` + +The `graphql_enum!` and `graphql_input_object!` macros did not provide any more +benefits, so they have been removed! +All functionality is now covered by custom derive. +Check the [docs](https://graphql-rust.github.io) to find out more. + +### Web framework integrations - Iron & Rocket + +The iron and rocket integrations were removed from the main crate, and are now +available via the [juniper_iron](https://crates.io/crates/juniper_iron) and +[juniper_rocket](https://crates.io/crates/juniper_rocket) crates. + +### FieldError rewrite (custom data) + +The `FieldError` type now supports custom data with the `Value` type from +serde_json. Use this to populate the `data` field in returned errors. + +This also means that try! and `?` now work in resolvers, which is quite nice. + +Also, the `ResultExt` extension and the `jtry!` macro were removed, since they +are redundant now! + +### Dynamic Schemas + +Juniper has gained support for dynamic schemas, thanks to @srijs. + +That also means the type of `RootNode` has changed to include a lifetime. + +The repository was restructured to a multi crate workspace to enable several new +features like custom_derive and an extracted parser. + +#[#66](https://github.com/graphql-rust/juniper/pull/66) + +### Data Type Integrations + +Integrations with multiple popular crates was added to make working with them +easier. + +- uuid +- url +- chrono + +### Field Order + +To better comply with the specification, order of requested fields is +now preserved. + +[#82](https://github.com/graphql-rust/juniper/issues/82 + +### From/ToInputValue + +The `::from` and `::to` methods in `From/ToInputValue` were renamed to +`from/to_input_value()` to not conflict with other methods. + +[#90](https://github.com/graphql-rust/juniper/pull/90) + +### Other changes + +- Several small performance improvements +- Use [fnv](https://github.com/servo/rust-fnv) hash map for better performance + +## Contributors + +A big shoutout to the many contributors for this version, sorted alphabetically. + +- Cameron Eldridge <mailto:cameldridge+git@gmail.com> +- Christian Legnitto <mailto:christian@legnitto.com> +- Jacob Haslehurst <mailto:jacob@haslehurst.net> +- Jane Keibler <mailto:wanderingelf14@gmail.com> +- Magnus Hallin <mailto:mhallin@fastmail.com> +- rushmorem <mailto:rushmore@webenchanter.com> +- Rushmore Mushambi <mailto:rushmore@webenchanter.com> +- Sagie Gur-Ari <mailto:sagiegurari@gmail.com> +- Sam Rijs <mailto:srijs@airpost.net> +- Stanko Krtalić <mailto:stanko.krtalic@gmail.com> +- theduke <mailto:chris@theduke.at> +- thomas-jeepe <mailto:penguinSoccer@outlook.com> + +# [0.8.1] – 2017-06-15 + +Tiny release to fix broken crate metadata on crates.io. + +# [0.8.0] – 2017-06-15 + +## Breaking changes + +- To better comply with the specification, and to avoid weird bugs with very + large positive or negative integers, support for `i64` has been completely + dropped and replaced with `i32`. `i64` is no longer a valid GraphQL type in + Juniper, and `InputValue`/`Value` can only represent 32 bit integers. + + If an incoming integer is out of range for a 32 bit signed integer type, an + error will be returned to the client. + ([#52](https://github.com/graphql-rust/juniper/issues/52), + [#49](https://github.com/graphql-rust/juniper/issues/49)) + +- Serde has been updated to 1.0. If your application depends on an older + version, you will need to first update your application before you can upgrade + to a more recent Juniper. ([#43](https://github.com/graphql-rust/juniper/pull/43)) + +- `rustc_serialize` support has been dropped since this library is now + deprecated. ([#51](https://github.com/graphql-rust/juniper/pull/51)) + +## New features + +- A new `rocket-handlers` feature now includes some tools to use the + [Rocket](https://rocket.rs) framework. [A simple + example](juniper_rocket/examples/rocket-server.rs) has been added to the examples folder. + +## Bugfixes + +- A panic in the parser has been replaced with a proper error + ([#44](https://github.com/graphql-rust/juniper/pull/44)) + +# [0.7.0] – 2017-02-26 + +### Breaking changes + +- The `iron-handlers` feature now depends on Iron 0.5 + ([#30](https://github.com/graphql-rust/juniper/pull/30)). Because of + this, support for Rust 1.12 has been dropped. It might still work if + you're not using the Iron integrations feature, however. + +### New features + +- Input objects defined by the `graphql_input_object!` can now be used + as default values to field arguments and other input object fields. + +# [0.6.3] – 2017-02-19 + +### New features + +- Add support for default values on input object fields + ([#28](https://github.com/graphql-rust/juniper/issues/28)) + +# [0.6.2] – 2017-02-05 + +### New features + +- The `null` literal is now supported in the GraphQL + language. ([#26](https://github.com/graphql-rust/juniper/pull/26)) +- Rustc-serialize is now optional, but enabled by default. If you + _only_ want Serde support, include Juniper without default features + and enable + Serde. ([#12](https://github.com/graphql-rust/juniper/pull/12)) +- The built-in `ID` type now has a public constructor and derives a + few traits (`Clone`, `Debug`, `Eq`, `PartialEq`, `From<String>`, + `Deref<Target=str>`). ([#19](https://github.com/graphql-rust/juniper/pull/19)) +- Juniper is now built and tested against all Rust compilers since + version 1.12.1. + +### Minor breaking change + +- Serde has been updated to + 0.9. ([#25](https://github.com/graphql-rust/juniper/pull/25)) + +### Bugfixes + +- The built-in GraphiQL handler had a bug in variable serialization. + ([#16](https://github.com/graphql-rust/juniper/pull/16)) +- The example should now build and run without problems on + Windows. ([#15](https://github.com/graphql-rust/juniper/pull/15)) +- Object types now properly implement + `__typename`. ([#22](https://github.com/graphql-rust/juniper/pull/22)) +- String variables are now properly parsed into GraphQL + enums. ([#17](https://github.com/graphql-rust/juniper/pull/17)) + +# [0.6.1] – 2017-01-06 + +### New features + +- Optional Serde support + ([#8](https://github.com/graphql-rust/juniper/pull/8)) + +### Improvements + +- The `graphql_input_object!` macro can now be used to define input + objects as public Rust structs. +- GraphiQL in the Iron GraphiQL handler has been updated to 0.8.1 + (#[#11](https://github.com/graphql-rust/juniper/pull/11)) + +### Minor breaking changes + +Some undocumented but public APIs were changed. + +- `to_snake_case` correctly renamed to `to_camel_case` + ([#9](https://github.com/graphql-rust/juniper/pull/9)) +- JSON serialization of `GraphQLError` changed to be more consistent + with how other values were serialized + ([#10](https://github.com/graphql-rust/juniper/pull/10)). + +# [0.6.0] – 2017-01-02 + +TL;DR: Many big changes in how context types work and how they +interact with the executor. Not too much to worry about if you're only +using the macros and not deriving `GraphQLType` directly. + +### Breaking changes + +- The `executor` argument in all resolver methods is now + immutable. The executor instead uses interior mutability to store + errors in a thread-safe manner. + + This change could open up for asynchronous or multi-threaded + execution: you can today use something like rayon in your resolve + methods to let child nodes be concurrently resolved. + + **How to fix:** All field resolvers that looked like `field name(&mut executor` now should say `field name(&executor`. + +- The context type of `GraphQLType` is moved to an associated type; + meaning it's no longer generic. This only affects people who + implement the trait manually, _not_ macro users. + + This greatly simplifies a lot of code by ensuring that there only + can be one `GraphQLType` implementation for any given Rust + type. However, it has the downside that support for generic contexts + previously used in scalars, has been removed. Instead, use the new + context conversion features to accomplish the same task. + + **How to fix:** Instead of `impl GraphQLType<MyContext> for ...`, + you use `impl GraphQLType for ... { type Context = MyContext;`. + +- All context types must derive the `Context` marker trait. This is + part of an overarching change to allow different types to use + different contexts. + + **How to fix:** If you have written e.g. `graphql_object!(MyType: MyContext ...)` you will need to add `impl Context for MyContext {}`. Simple as that. + +- `Registry` and all meta type structs now takes one lifetime + parameter, which affects `GraphQLType`'s `meta` method. This only + affects people who implement the trait manually. + + **How to fix:** Change the type signature of `meta()` to read `fn meta<'r>(registry: &mut Registry<'r>) -> MetaType<'r>`. + +- The type builder methods on `Registry` no longer return functions + taking types or fields. Due to how the borrow checker works with + expressions, you will have to split up the instantiation into two + statements. This only affects people who implement the `GraphQLType` + trait manually. + + **How to fix:** Change the contents of your `meta()` methods to + something like this: + + ```rust + fn meta<'r>(registry: &mut Registry<r>) -> MetaType<'r> { + let fields = &[ /* your fields ... */ ]; + + registry.build_object_type::<Self>(fields).into_meta() + } + ``` + +### Added + +- Support for different contexts for different types. As GraphQL + schemas tend to get large, narrowing down the context type to + exactly what a given type needs is great for + encapsulation. Similarly, letting different subsystems use different + resources thorugh the context is also useful for the same reasons. + + Juniper supports two different methods of doing this, depending on + your needs: if you have two contexts where one can be converted into + the other _without any extra knowledge_, you can implement the new + `FromContext` trait. This is useful if you have multiple crates or + modules that all belong to the same GraphQL schema: + + ```rust + struct TopContext { + db: DatabaseConnection, + session: WebSession, + current_user: User, + } + + struct ModuleOneContext { + db: DatabaseConnection, // This module only requires a database connection + } + + impl Context for TopContext {} + impl Context for ModuleOneContext {} + + impl FromContext<TopContext> for ModuleOneContext { + fn from(ctx: &TopContext) -> ModuleOneContext { + ModuleOneContext { + db: ctx.db.clone() + } + } + } + + graphql_object!(Query: TopContext |&self| { + field item(&executor) -> Item { + executor.context().db.get_item() + } + }); + + // The `Item` type uses another context type - conversion is automatic + graphql_object!(Item: ModuleOneContext |&self| { + // ... + }); + ``` + + The other way is to manually perform the conversion in a field + resolver. This method is preferred when the child context needs + extra knowledge than what exists in the parent context: + + ```rust + // Each entity has its own context + struct TopContext { + entities: HashMap<i32, EntityContext>, + db: DatabaseConnection, + } + + struct EntityContext { + // fields + } + + impl Context for TopContext {} + impl Context for EntityContext {} + + graphql_object!(Query: TopContext |&self| { + // By returning a tuple (&Context, GraphQLType), you can tell the executor + // to switch out the context for the returned value. You can wrap the + // tuple in Option<>, FieldResult<>, FieldResult<Option<>>, or just return + // the tuple without wrapping it. + field entity(&executor, key: i32) -> Option<(&EntityContext, Entity)> { + executor.context().entities.get(&key) + .map(|ctx| (ctx, executor.context().db.get_entity(key))) + } + }); + + graphql_object!(Entity: EntityContext |&self| { + // ... + }); + ``` + +### Improvements + +- Parser and query execution has now reduced the allocation overhead + by reusing as much as possible from the query source and meta type + information. + +# [0.5.3] – 2016-12-05 + +### Added + +- `jtry!`: Helper macro to produce `FieldResult`s from regular + `Result`s. Wherever you would be using `try!` in a regular function + or method, you can use `jtry!` in a field resolver: + + ```rust + graphql_object(MyType: Database |&self| { + field count(&executor) -> FieldResult<i32> { + let txn = jtry!(executor.context().transaction()); + + let count = jtry!(txn.execute("SELECT COUNT(*) FROM user")); + + Ok(count[0][0]) + } + }); + ``` + +### Changes + +- Relax context type trait requirements for the iron handler: your + contexts no longer have to be `Send + Sync`. + +- `RootNode` is now `Send` and `Sync` if both the mutation and query + types implement `Send` and `Sync`. + +### Bugfixes + +- `return` statements inside field resolvers no longer cause syntax + errors. + +## 0.5.2 – 2016-11-13 + +### Added + +- Support for marking fields and enum values deprecated. +- `input_object!` helper macro + +### Changes + +- The included example server now uses the simple Star Wars schema + used in query/introspection tests. + +### Bugfixes + +- The query validators - particularly ones concerned with validation + of input data and variables - have been improved significantly. A + large number of test cases have been added. + +- Macro syntax stability has also been improved. All syntactical edge + cases of the macros have gotten tests to verify their correctness. + +[0.8.0]: https://github.com/graphql-rust/juniper/compare/0.8.0...0.8.1 +[0.8.0]: https://github.com/graphql-rust/juniper/compare/0.7.0...0.8.0 +[0.7.0]: https://github.com/graphql-rust/juniper/compare/0.6.3...0.7.0 +[0.6.3]: https://github.com/graphql-rust/juniper/compare/0.6.2...0.6.3 +[0.6.2]: https://github.com/graphql-rust/juniper/compare/0.6.1...0.6.2 +[0.6.1]: https://github.com/graphql-rust/juniper/compare/0.6.0...0.6.1 +[0.6.0]: https://github.com/graphql-rust/juniper/compare/0.5.3...0.6.0 +[0.5.3]: https://github.com/graphql-rust/juniper/compare/0.5.2...0.5.3