mirror of https://github.com/rwf2/Rocket.git
New version: 0.4.0-rc.1.
This commit is contained in:
parent
4b5000e33b
commit
4dbd87a36f
385
CHANGELOG.md
385
CHANGELOG.md
|
@ -1,3 +1,387 @@
|
||||||
|
# Version 0.4.0-rc.1 (Oct 31, 2018)
|
||||||
|
|
||||||
|
## New Features
|
||||||
|
|
||||||
|
This release includes the following new features:
|
||||||
|
|
||||||
|
* Introduced [Typed URIs].
|
||||||
|
* Introduced [ORM agnostic database support].
|
||||||
|
* Introduced [Request-Local State].
|
||||||
|
* Introduced mountable static-file serving via [`StaticFiles`].
|
||||||
|
* Introduced automatic [live template reloading].
|
||||||
|
* Introduced custom stateful handlers via [`Handler`].
|
||||||
|
* Introduced [transforming] data guards via [`FromData::transform()`].
|
||||||
|
* Introduced revamped [query string handling].
|
||||||
|
* Added [derive for `FromFormValue`].
|
||||||
|
* Added [derive for `Responder`].
|
||||||
|
* Added [`Template::custom()`] for customizing templating engines including
|
||||||
|
registering filters and helpers.
|
||||||
|
* Cookies are automatically tracked and propagated by [`Client`].
|
||||||
|
* Private cookies can be added to local requests with
|
||||||
|
[`LocalRequest::private_cookie()`].
|
||||||
|
* Release builds default to the `production` environment.
|
||||||
|
* Keep-alive can be configured via the `keep_alive` configuration parameter.
|
||||||
|
* Allow CLI colors and emoji to be disabled with `ROCKET_CLI_COLORS=off`.
|
||||||
|
* Route `format` accepts [shorthands] such as `json` and `html`.
|
||||||
|
* Implemented [`Responder` for `Status`].
|
||||||
|
* Added [`Response::cookies()`] for retrieving response cookies.
|
||||||
|
* All logging is disabled when `log` is set to `off`.
|
||||||
|
* Added [`Metadata`] guard for retrieving templating information.
|
||||||
|
* The [`Uri`] type parses URIs according to RFC 7230 into one of [`Origin`],
|
||||||
|
[`Absolute`], or [`Authority`].
|
||||||
|
* Added [`Outcome::and_then()`], [`Outcome::failure_then()`], and
|
||||||
|
[`Outcome::forward_then()`].
|
||||||
|
* Implemented `Responder` for `&[u8]`.
|
||||||
|
* Any `T: Into<Vec<Route>>` can be [`mount()`]ed.
|
||||||
|
* [Default rankings] range from -6 to -1, differentiating on static query
|
||||||
|
strings.
|
||||||
|
* Added [`Request::get_query_value()`] for retrieving a query value by key.
|
||||||
|
|
||||||
|
[Typed URIs]: https://rocket.rs/v0.4/guide/responses/#typed-uris
|
||||||
|
[ORM agnostic database support]: https://rocket.rs/v0.4/guide/state/#databases
|
||||||
|
[`Template::custom()`]: https://api.rocket.rs/v0.4/rocket_contrib/templates/struct.Template.html#method.custom
|
||||||
|
[`LocalRequest::private_cookie()`]: https://api.rocket.rs/v0.4/rocket/local/struct.LocalRequest.html#method.private_cookie
|
||||||
|
[`LocalRequest`]: https://api.rocket.rs/v0.4/rocket/local/struct.LocalRequest.html
|
||||||
|
[shorthands]: https://api.rocket.rs/v0.4/rocket/http/struct.ContentType.html#method.parse_flexible
|
||||||
|
[derive for `FromFormValue`]: https://api.rocket.rs/v0.4/rocket_codegen/derive.FromFormValue.html
|
||||||
|
[derive for `Responder`]: https://api.rocket.rs/v0.4/rocket_codegen/derive.Responder.html
|
||||||
|
[`Response::cookies()`]: https://api.rocket.rs/v0.4/rocket/struct.Response.html#method.cookies
|
||||||
|
[`Client`]: https://api.rocket.rs/v0.4/rocket/local/struct.Client.html
|
||||||
|
[Request-Local State]: https://rocket.rs/v0.4/guide/state/#request-local-state
|
||||||
|
[`Metadata`]: https://api.rocket.rs/v0.4/rocket_contrib/templates/struct.Metadata.html
|
||||||
|
[`Uri`]: https://api.rocket.rs/v0.4/rocket/http/uri/enum.Uri.html
|
||||||
|
[`Origin`]: https://api.rocket.rs/v0.4/rocket/http/uri/struct.Origin.html
|
||||||
|
[`Absolute`]: https://api.rocket.rs/v0.4/rocket/http/uri/struct.Absolute.html
|
||||||
|
[`Authority`]: https://api.rocket.rs/v0.4/rocket/http/uri/struct.Authority.html
|
||||||
|
[`Outcome::and_then()`]: https://api.rocket.rs/v0.4/rocket/enum.Outcome.html#method.and_then
|
||||||
|
[`Outcome::forward_then()`]: https://api.rocket.rs/v0.4/rocket/enum.Outcome.html#method.forward_then
|
||||||
|
[`Outcome::failure_then()`]: https://api.rocket.rs/v0.4/rocket/enum.Outcome.html#method.failure_then
|
||||||
|
[`StaticFiles`]: https://api.rocket.rs/v0.4/rocket_contrib/serve/struct.StaticFiles.html
|
||||||
|
[live template reloading]: https://rocket.rs/v0.4/guide/responses/#live-reloading
|
||||||
|
[`Handler`]: https://api.rocket.rs/v0.4/rocket/trait.Handler.html
|
||||||
|
[`mount()`]: https://api.rocket.rs/v0.4/rocket/struct.Rocket.html#method.mount
|
||||||
|
[`FromData::transform()`]: https://api.rocket.rs/v0.4/rocket/data/trait.FromData.html#tymethod.transform
|
||||||
|
[transforming]: https://api.rocket.rs/v0.4/rocket/data/trait.FromData.html#transforming
|
||||||
|
[query string handling]: https://rocket.rs/v0.4/guide/requests/#query-strings
|
||||||
|
[Default rankings]: https://rocket.rs/v0.4/guide/requests/#default-ranking
|
||||||
|
[`Request::get_query_value()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.get_query_value
|
||||||
|
[`Responder` for `Status`]: https://rocket.rs/v0.4/guide/responses/#status
|
||||||
|
|
||||||
|
## Codegen Rewrite
|
||||||
|
|
||||||
|
The [`rocket_codegen`] crate has been entirely rewritten using to-be-stable
|
||||||
|
procedural macro APIs. We expect nightly breakages to drop dramatically, likely
|
||||||
|
to zero, as a result. The new prelude import for Rocket applications is:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- #![feature(plugin)]
|
||||||
|
- #![plugin(rocket_codegen)]
|
||||||
|
+ #![feature(proc_macro_hygiene, decl_macro)]
|
||||||
|
|
||||||
|
- extern crate rocket;
|
||||||
|
+ #[macro_use] extern crate rocket;
|
||||||
|
```
|
||||||
|
|
||||||
|
The [`rocket_codegen`] crate should **_not_** be a direct dependency. Remove it
|
||||||
|
from your `Cargo.toml`:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
[dependencies]
|
||||||
|
- rocket = "0.3"
|
||||||
|
+ rocket = "0.4"
|
||||||
|
- rocket_codegen = "0.3"
|
||||||
|
```
|
||||||
|
|
||||||
|
[`rocket_codegen`]: https://api.rocket.rs/v0.4/rocket_codegen/index.html
|
||||||
|
|
||||||
|
## Breaking Changes
|
||||||
|
|
||||||
|
This release includes many breaking changes. These changes are listed below
|
||||||
|
along with a short note about how to handle the breaking change in existing
|
||||||
|
applications when applicable.
|
||||||
|
|
||||||
|
* **[`LaunchErrorKind::Collision`] contains a vector of the colliding routes.**
|
||||||
|
|
||||||
|
Destruct using `LaunchErrorKind::Collision(..)` to ignore the vector.
|
||||||
|
|
||||||
|
* **[`json!`] returns a [`JsonValue`], no longer needs wrapping.**
|
||||||
|
|
||||||
|
Change instances of `Json(json!(..))` to `json!` and change the
|
||||||
|
corresponding type to `JsonValue`.
|
||||||
|
|
||||||
|
* **[`ring`] was updated to 0.13.**
|
||||||
|
|
||||||
|
Ensure all transitive dependencies to `ring` refer to version `0.13`.
|
||||||
|
|
||||||
|
* **TLS certificates require the `subjectAltName` extension.**
|
||||||
|
|
||||||
|
Ensure that your TLS certificates contain the `subjectAltName` extension
|
||||||
|
with a value set to your domain.
|
||||||
|
|
||||||
|
* **Route paths, mount points, and [`LocalRequest`] URIs are strictly
|
||||||
|
checked.**
|
||||||
|
|
||||||
|
Ensure your mount points are absolute paths with no parameters, ensure your
|
||||||
|
route paths are absolute paths with proper parameter syntax, and ensure that
|
||||||
|
paths passed to `LocalRequest` are valid.
|
||||||
|
|
||||||
|
* **[`Template::show()`] takes an `&Rocket`, doesn't accept a `root`.**
|
||||||
|
|
||||||
|
Use [`client.rocket()`] to get a reference to an instance of `Rocket` when
|
||||||
|
testing. Use [`Template::render()`] in routes.
|
||||||
|
|
||||||
|
* **[`Request::remote()`] returns the _actual_ remote IP, doesn't rewrite.**
|
||||||
|
|
||||||
|
Use [`Request::real_ip()`] or [`Request::client_ip()`] to retrieve the IP
|
||||||
|
address from the "X-Real-IP" header if it is present.
|
||||||
|
|
||||||
|
* **Release builds default to the production environment.**
|
||||||
|
|
||||||
|
Manually set the environment to `debug` with `ROCKET_ENV=debug` for the
|
||||||
|
previous behavior.
|
||||||
|
|
||||||
|
* **All environments default to port 8000.**
|
||||||
|
|
||||||
|
Manually configure a port of `80` for the `stage` and `production`
|
||||||
|
environments for the previous behavior.
|
||||||
|
|
||||||
|
* **[`Bind`] variant was added to [`LaunchErrorKind`].**
|
||||||
|
|
||||||
|
Ensure matches on `LaunchErrorKind` include or ignore the `Bind` variant.
|
||||||
|
|
||||||
|
* **Cookies are automatically tracked and propagated by [`Client`].**
|
||||||
|
|
||||||
|
For the previous behavior, construct a `Client` with
|
||||||
|
[`Client::untracked()`].
|
||||||
|
|
||||||
|
* **`UUID` was renamed to [`Uuid`].**
|
||||||
|
|
||||||
|
Use `Uuid` instead of `UUID`.
|
||||||
|
|
||||||
|
* **The `#[error]` attribute and `errors!` macro were removed.**
|
||||||
|
|
||||||
|
Use `#[catch]` and `catchers!` instead.
|
||||||
|
|
||||||
|
* **`Rocket::catch()` was renamed to [`Rocket::register()`].**
|
||||||
|
|
||||||
|
Change calls of the form `.catch(errors![..])` to
|
||||||
|
`.register(catchers![..])`.
|
||||||
|
|
||||||
|
* **The `#[catch]` attribute only accepts functions with 0 or 1 argument.**
|
||||||
|
|
||||||
|
Ensure the argument to the catcher, if any, is of type `&Request`.
|
||||||
|
|
||||||
|
* **`LocalRequest::cloned_dispatch()` was removed.**
|
||||||
|
|
||||||
|
Chain calls to `.clone().dispatch()` for the previous behavior.
|
||||||
|
|
||||||
|
* **`Uri` was largely replaced by [`Origin`].**
|
||||||
|
|
||||||
|
In general, replace the type `Uri` with `Origin`. The `base` and `uri`
|
||||||
|
fields of [`Route`] are now of type [`Origin`]. The `&Uri` guard is now
|
||||||
|
`&Origin`. [`Request::uri()`] now returns an [`Origin`].
|
||||||
|
|
||||||
|
* **[`Redirect`] constructors take a generic type of `T:
|
||||||
|
TryInto<Uri<'static>>`.**
|
||||||
|
|
||||||
|
A call to a `Redirect` constructor with a non-`'static` `&str` of the form
|
||||||
|
`Redirect::to(string)` should become `Redirect::to(string.to_string())`,
|
||||||
|
heap-allocating the string before being passed to the constructor.
|
||||||
|
|
||||||
|
* **The [`FromData`] impl for [`Form`] and [`LenientForm`] now return an error
|
||||||
|
of type [`FormDataError`].**
|
||||||
|
|
||||||
|
On non-I/O errors, the form string is stored in the variant as an `&'f str`.
|
||||||
|
|
||||||
|
* **[`Missing`] variant was added to [`ConfigError`].**
|
||||||
|
|
||||||
|
Ensure matches on `ConfigError` include or ignore the `Missing` variant.
|
||||||
|
|
||||||
|
* **Route and catcher attributes respect function privacy.**
|
||||||
|
|
||||||
|
To mount a route or register a catcher outside of the module it is declared,
|
||||||
|
ensure that the handler function is marked `pub` or `crate`.
|
||||||
|
|
||||||
|
* **The [`FromData`] impl for [`Json`] now returns an error of type
|
||||||
|
[`JsonError`].**
|
||||||
|
|
||||||
|
The previous `SerdeError` is now the `.1` member of the `JsonError` `enum`.
|
||||||
|
Match and destruct the variant for the previous behavior.
|
||||||
|
|
||||||
|
* **[`FromData`] is now emulated by [`FromDataSimple`].**
|
||||||
|
|
||||||
|
Change _implementations_, not uses, of `FromData` to `FromDataSimple`.
|
||||||
|
Consider whether your implementation could benefit from [transformations].
|
||||||
|
|
||||||
|
* **[`Form`] and [`LenientForm`] lost a lifetime parameter, `get()` method.**
|
||||||
|
|
||||||
|
Change a type of `Form<'a, T<'a>>` to `Form<T>` or `Form<T<'a>>`. `Form<T>`
|
||||||
|
and `LenientForm<T>` now implement `Deref<Target = T>`, allowing for calls
|
||||||
|
to `.get()` to be removed.
|
||||||
|
|
||||||
|
* **Query handling syntax has been completely revamped.**
|
||||||
|
|
||||||
|
A query parameter of `<param>` is now `<param..>`. Consider whether your
|
||||||
|
application benefits from the revamped [query string handling].
|
||||||
|
|
||||||
|
* **[`FormItems`] iterates over values of type [`FormItem`].**
|
||||||
|
|
||||||
|
Map using `.map(|item| item.key_value())` for the previous behavior.
|
||||||
|
|
||||||
|
* **All items in [`rocket_contrib`] are namespaced behind modules.**
|
||||||
|
|
||||||
|
* `Json` is now `json::Json`
|
||||||
|
* `MsgPack` is now `msgpack::MsgPack`
|
||||||
|
* `MsgPackError` is now `msgpack::Error`
|
||||||
|
* `Template` is now `templates::Template`
|
||||||
|
* `UUID` is now `uuid::Uuid`
|
||||||
|
* `Value` is replaced by `json::JsonValue`
|
||||||
|
|
||||||
|
* **[`Request::get_param()`] and [`Request::get_segments()`] are indexed by
|
||||||
|
_segment_, not dynamic parameter.**
|
||||||
|
|
||||||
|
Modify the `n` argument in calls to these functions appropriately.
|
||||||
|
|
||||||
|
* **Method-based route attributes no longer accept a keyed `path` parameter.**
|
||||||
|
|
||||||
|
Change an attribute of the form `#[get(path = "..")]` to `#[get("..")]`.
|
||||||
|
|
||||||
|
* **[`Json`] and [`MsgPack`] data guards no longer reject requests with an
|
||||||
|
unexpected Content-Type**
|
||||||
|
|
||||||
|
To approximate the previous behavior, add a `format = "json"` route
|
||||||
|
parameter when using `Json` or `format = "msgpack"` when using `MsgPack`.
|
||||||
|
|
||||||
|
* **Implemented [`Responder` for `Status`]. Removed `Failure`,
|
||||||
|
`status::NoContent`, and `status::Reset` responders.**
|
||||||
|
|
||||||
|
Replace uses of `Failure(status)` with `status` directly. Replace
|
||||||
|
`status::NoContent` with `Status::NoContent`. Replace `status::Reset` with
|
||||||
|
`Status::ResetContent`.
|
||||||
|
|
||||||
|
* **[`Status::new()`] is no longer `const`.**
|
||||||
|
|
||||||
|
* **[`Json`] no longer has a default value for its type parameter.**
|
||||||
|
|
||||||
|
* **Using `data` on a non-payload method route is a warning instead of error.**
|
||||||
|
|
||||||
|
* **The `raw_form_string` method of [`Form`] and [`LenientForm`] was
|
||||||
|
removed.**
|
||||||
|
|
||||||
|
* **Various impossible `Error` associated types are now set to `!`.**
|
||||||
|
|
||||||
|
* **All [`AdHoc`] constructors require a name as the first parameter.**
|
||||||
|
|
||||||
|
* **The top-level `Error` type was removed.**
|
||||||
|
|
||||||
|
[`LaunchErrorKind::Collision`]: https://api.rocket.rs/v0.4/rocket/error/enum.LaunchErrorKind.html#variant.Collision
|
||||||
|
[`json!`]: https://api.rocket.rs/v0.4/rocket_contrib/macro.json.html
|
||||||
|
[`JsonValue`]: https://api.rocket.rs/v0.4/rocket_contrib/json/struct.JsonValue.html
|
||||||
|
[`Json`]: https://api.rocket.rs/v0.4/rocket_contrib/json/struct.Json.html
|
||||||
|
[`ring`]: https://crates.io/crates/ring
|
||||||
|
[`Template::show()`]: https://api.rocket.rs/v0.4/rocket_contrib/templates/struct.Template.html#method.show
|
||||||
|
[`Template::render()`]: https://api.rocket.rs/v0.4/rocket_contrib/templates/struct.Template.html#method.render
|
||||||
|
[`client.rocket()`]: https://api.rocket.rs/v0.4/rocket/local/struct.Client.html#method.rocket
|
||||||
|
[`Request::remote()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.remote
|
||||||
|
[`Request::real_ip()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.real_ip
|
||||||
|
[`Request::client_ip()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.client_ip
|
||||||
|
[`Bind`]: https://api.rocket.rs/v0.4/rocket/error/enum.LaunchErrorKind.html#variant.Bind
|
||||||
|
[`LaunchErrorKind`]: https://api.rocket.rs/v0.4/rocket/error/enum.LaunchErrorKind.html
|
||||||
|
[`Client::untracked()`]: https://api.rocket.rs/v0.4/rocket/local/struct.Client.html#method.untracked
|
||||||
|
[`Uuid`]: https://api.rocket.rs/v0.4/rocket_contrib/uuid/struct.Uuid.html
|
||||||
|
[`Route`]: https://api.rocket.rs/v0.4/rocket/struct.Route.html
|
||||||
|
[`Redirect`]: https://api.rocket.rs/v0.4/rocket/response/struct.Redirect.html
|
||||||
|
[`Request::uri()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.uri
|
||||||
|
[`FormDataError`]: https://api.rocket.rs/v0.4/rocket/request/enum.FormDataError.html
|
||||||
|
[`FromData`]: https://api.rocket.rs/v0.4/rocket/data/trait.FromData.html
|
||||||
|
[`Form`]: https://api.rocket.rs/v0.4/rocket/request/struct.Form.html
|
||||||
|
[`LenientForm`]: https://api.rocket.rs/v0.4/rocket/request/struct.LenientForm.html
|
||||||
|
[`AdHoc`]: https://api.rocket.rs/v0.4/rocket/fairing/struct.AdHoc.html
|
||||||
|
[`Missing`]: https://api.rocket.rs/v0.4/rocket/config/enum.ConfigError.html#variant.Missing
|
||||||
|
[`ConfigError`]: https://api.rocket.rs/v0.4/rocket/config/enum.ConfigError.html
|
||||||
|
[`Rocket::register()`]: https://api.rocket.rs/v0.4/rocket/struct.Rocket.html#method.register
|
||||||
|
[`JsonError`]: https://api.rocket.rs/v0.4/rocket_contrib/json/enum.JsonError.html
|
||||||
|
[transformations]: https://api.rocket.rs/v0.4/rocket/data/trait.FromData.html#transforming
|
||||||
|
[`FromDataSimple`]: https://api.rocket.rs/v0.4/rocket/data/trait.FromDataSimple.html
|
||||||
|
[`Request::get_param()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.get_param
|
||||||
|
[`Request::get_segments()`]: https://api.rocket.rs/v0.4/rocket/struct.Request.html#method.get_segments
|
||||||
|
[`FormItem`]: https://api.rocket.rs/v0.4/rocket/request/struct.FormItem.html
|
||||||
|
[`rocket_contrib`]: https://api.rocket.rs/v0.4/rocket_contrib/index.html
|
||||||
|
[`MsgPack`]: https://api.rocket.rs/v0.4/rocket_contrib/msgpack/struct.MsgPack.html
|
||||||
|
[`Status::new()`]: https://api.rocket.rs/v0.4/rocket/http/struct.Status.html#method.new
|
||||||
|
|
||||||
|
## General Improvements
|
||||||
|
|
||||||
|
In addition to new features, Rocket saw the following improvements:
|
||||||
|
|
||||||
|
* Log messages now refer to routes by name.
|
||||||
|
* Collision errors on launch name the colliding routes.
|
||||||
|
* Launch fairing failures refer to the failing fairing by name.
|
||||||
|
* The default `403` catcher now references authorization, not authentication.
|
||||||
|
* Private cookies are set to `HttpOnly` and are given an expiration date of 1
|
||||||
|
week by default.
|
||||||
|
* A [Tera templates example] was added.
|
||||||
|
* Invalid client requests receive a response of `400` instead of `500`.
|
||||||
|
* Response bodies are reliably stripped on `HEAD` requests.
|
||||||
|
* Added a default catcher for `504: Gateway Timeout`.
|
||||||
|
* Configuration information is logged in all environments.
|
||||||
|
* Use of `unsafe` was reduced from 9 to 2 in core library.
|
||||||
|
* [`FormItems`] now parses empty keys and values as well as keys without
|
||||||
|
values.
|
||||||
|
* Added [`Config::active()`] as a shorthand for
|
||||||
|
`Config::new(Environment::active()?)`.
|
||||||
|
* Address/port binding errors at launch are detected and explicitly emitted.
|
||||||
|
* [`Flash`] cookies are cleared only after they are inspected.
|
||||||
|
* `Sync` bound on [`AdHoc::on_attach()`], [`AdHoc::on_launch()`] was removed.
|
||||||
|
* [`AdHoc::on_attach()`], [`AdHoc::on_launch()`] accept an `FnOnce`.
|
||||||
|
* Added [`Config::root_relative()`] for retrieving paths relative to the
|
||||||
|
configuration file.
|
||||||
|
* Added [`Config::tls_enabled()`] for determining whether TLS is actively
|
||||||
|
enabled.
|
||||||
|
* ASCII color codes are not emitted on versions of Windows that do not support
|
||||||
|
them.
|
||||||
|
* Added FLAC (`audio/flac`), Icon (`image/x-icon`), WEBA (`audio/webm`), TIFF
|
||||||
|
(`image/tiff`), AAC (`audio/aac`), Calendar (`text/calendar`), MPEG
|
||||||
|
(`video/mpeg`), TAR (`application/x-tar`), GZIP (`application/gzip`), MOV
|
||||||
|
(`video/quicktime`), MP4 (`video/mp4`) as known media types.
|
||||||
|
* Added `.weba` (`WEBA`), `.ogv` (`OGG`), `.mp4` (`MP4`), `.mpeg4` (`MP4`),
|
||||||
|
`.aac` (`AAC`), `.ics` (`Calendar`), `.bin` (`Binary`), `.mpg` (`MPEG`),
|
||||||
|
`.mpeg` (`MPEG`), `.tar` (`TAR`), `.gz` (`GZIP`), `.tif` (`TIFF`), `.tiff`
|
||||||
|
(`TIFF`), `.mov` (`MOV`) as known extensions.
|
||||||
|
* Interaction between route attributes and declarative macros has been
|
||||||
|
improved.
|
||||||
|
* Generated code now logs through logging infrastructures as opposed to using
|
||||||
|
`println!`.
|
||||||
|
* Routing has been optimized by caching routing metadata.
|
||||||
|
* All macros, derives, and attributes are individually documented in
|
||||||
|
[`rocket_codegen`].
|
||||||
|
* The `log` dependency was updated to `0.4`.
|
||||||
|
* The `handlebars` dependency was updated to `1.0`.
|
||||||
|
* The `tera` dependency was updated to `0.11`.
|
||||||
|
* The `uuid` dependency was updated to `0.7`.
|
||||||
|
* The `rustls` dependency was updated to `0.14`.
|
||||||
|
* The `cookie` dependency was updated to `0.11`.
|
||||||
|
|
||||||
|
[Tera templates example]: https://github.com/SergioBenitez/Rocket/tree/v0.4/examples/tera_templates
|
||||||
|
[`FormItems`]: https://api.rocket.rs/v0.4/rocket/request/enum.FormItems.html
|
||||||
|
[`Config::active()`]: https://api.rocket.rs/v0.4/rocket/config/struct.Config.html#method.active
|
||||||
|
[`Flash`]: https://api.rocket.rs/v0.4/rocket/response/struct.Flash.html
|
||||||
|
[`AdHoc::on_attach()`]: https://api.rocket.rs/v0.4/rocket/fairing/struct.AdHoc.html#method.on_attach
|
||||||
|
[`AdHoc::on_launch()`]: https://api.rocket.rs/v0.4/rocket/fairing/struct.AdHoc.html#method.on_launch
|
||||||
|
[`Config::root_relative()`]: https://api.rocket.rs/v0.4/rocket/struct.Config.html#method.root_relative
|
||||||
|
[`Config::tls_enabled()`]: https://api.rocket.rs/v0.4/rocket/struct.Config.html#method.tls_enabled
|
||||||
|
[`rocket_codegen`]: https://api.rocket.rs/v0.4/rocket_codegen/index.html
|
||||||
|
|
||||||
|
## Infrastructure
|
||||||
|
|
||||||
|
* All documentation is versioned.
|
||||||
|
* Previous, current, and development versions of all documentation are hosted.
|
||||||
|
* The repository was reorganized with top-level directories of `core` and
|
||||||
|
`contrib`.
|
||||||
|
* The `http` module was split into its own `rocket_http` crate. This is an
|
||||||
|
internal change only.
|
||||||
|
* All uses of `unsafe` are documented with informal proofs of correctness.
|
||||||
|
|
||||||
# Version 0.3.16 (Aug 24, 2018)
|
# Version 0.3.16 (Aug 24, 2018)
|
||||||
|
|
||||||
## Codegen
|
## Codegen
|
||||||
|
@ -498,6 +882,7 @@ In addition to new features, Rocket saw the following improvements:
|
||||||
* Console logging for table-based config values is improved.
|
* Console logging for table-based config values is improved.
|
||||||
* `PartialOrd`, `Ord`, and `Hash` are now implemented for [`State`].
|
* `PartialOrd`, `Ord`, and `Hash` are now implemented for [`State`].
|
||||||
* The format of a request is always logged when available.
|
* The format of a request is always logged when available.
|
||||||
|
* Route matching on `format` now functions as documented.
|
||||||
|
|
||||||
[`yansi`]: https://crates.io/crates/yansi
|
[`yansi`]: https://crates.io/crates/yansi
|
||||||
[`Request`]: https://api.rocket.rs/v0.3/rocket/struct.Request.html
|
[`Request`]: https://api.rocket.rs/v0.3/rocket/struct.Request.html
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rocket_contrib_codegen"
|
name = "rocket_contrib_codegen"
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||||
description = "Procedural macros for the Rocket contrib libraries."
|
description = "Procedural macros for the Rocket contrib libraries."
|
||||||
documentation = "https://api.rocket.rs/v0.4/rocket_contrib/"
|
documentation = "https://api.rocket.rs/v0.4/rocket_contrib/"
|
||||||
|
@ -9,7 +9,7 @@ repository = "https://github.com/SergioBenitez/Rocket"
|
||||||
readme = "../../README.md"
|
readme = "../../README.md"
|
||||||
keywords = ["rocket", "contrib", "code", "generation", "proc-macro"]
|
keywords = ["rocket", "contrib", "code", "generation", "proc-macro"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
build = "../../core/lib/build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
database_attribute = []
|
database_attribute = []
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
//! This tiny build script ensures that rocket is not compiled with an
|
||||||
|
//! incompatible version of rust.
|
||||||
|
|
||||||
|
extern crate yansi;
|
||||||
|
extern crate version_check;
|
||||||
|
|
||||||
|
use yansi::Color::{Red, Yellow, Blue, White};
|
||||||
|
use version_check::{supports_features, is_min_version, is_min_date};
|
||||||
|
|
||||||
|
// Specifies the minimum nightly version needed to compile Rocket.
|
||||||
|
const MIN_DATE: &'static str = "2018-10-05";
|
||||||
|
const MIN_VERSION: &'static str = "1.31.0-nightly";
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let ok_channel = supports_features();
|
||||||
|
let ok_version = is_min_version(MIN_VERSION);
|
||||||
|
let ok_date = is_min_date(MIN_DATE);
|
||||||
|
let triple = (ok_channel, ok_version, ok_date);
|
||||||
|
|
||||||
|
let print_version_err = |version: &str, date: &str| {
|
||||||
|
eprintln!("{} {}. {} {}.",
|
||||||
|
White.paint("Installed version is:"),
|
||||||
|
Yellow.paint(format!("{} ({})", version, date)),
|
||||||
|
White.paint("Minimum required:"),
|
||||||
|
Yellow.paint(format!("{} ({})", MIN_VERSION, MIN_DATE)));
|
||||||
|
};
|
||||||
|
|
||||||
|
if let (Some(ok_channel), Some((ok_version, version)), Some((ok_date, date))) = triple {
|
||||||
|
if !ok_channel {
|
||||||
|
eprintln!("{} {}",
|
||||||
|
Red.paint("Error:").bold(),
|
||||||
|
White.paint("Rocket requires a nightly or dev version of Rust."));
|
||||||
|
print_version_err(&*version, &*date);
|
||||||
|
eprintln!("{}{}{}",
|
||||||
|
Blue.paint("See the getting started guide ("),
|
||||||
|
White.paint("https://rocket.rs/v0.4/guide/getting-started/"),
|
||||||
|
Blue.paint(") for more information."));
|
||||||
|
panic!("Aborting compilation due to incompatible compiler.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok_version || !ok_date {
|
||||||
|
eprintln!("{} {}",
|
||||||
|
Red.paint("Error:").bold(),
|
||||||
|
White.paint("Rocket requires a more recent version of rustc."));
|
||||||
|
eprintln!("{}{}{}",
|
||||||
|
Blue.paint("Use `"),
|
||||||
|
White.paint("rustup update"),
|
||||||
|
Blue.paint("` or your preferred method to update Rust."));
|
||||||
|
print_version_err(&*version, &*date);
|
||||||
|
panic!("Aborting compilation due to incompatible compiler.")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
println!("cargo:warning={}", "Rocket was unable to check rustc compatibility.");
|
||||||
|
println!("cargo:warning={}", "Build may fail due to incompatible rustc version.");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rocket_contrib"
|
name = "rocket_contrib"
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||||
description = "Community contributed libraries for the Rocket web framework."
|
description = "Community contributed libraries for the Rocket web framework."
|
||||||
documentation = "https://api.rocket.rs/v0.4/rocket_contrib/"
|
documentation = "https://api.rocket.rs/v0.4/rocket_contrib/"
|
||||||
|
@ -35,8 +35,8 @@ redis_pool = ["databases", "redis", "r2d2_redis"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Global dependencies.
|
# Global dependencies.
|
||||||
rocket_contrib_codegen = { version = "0.4.0-rc", path = "../codegen", optional = true }
|
rocket_contrib_codegen = { version = "0.4.0-rc.1", path = "../codegen", optional = true }
|
||||||
rocket = { version = "0.4.0-rc", path = "../../core/lib/" }
|
rocket = { version = "0.4.0-rc.1", path = "../../core/lib/" }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
||||||
# Serialization and templating dependencies.
|
# Serialization and templating dependencies.
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
//!
|
//!
|
||||||
//! ```toml
|
//! ```toml
|
||||||
//! [dependencies.rocket_contrib]
|
//! [dependencies.rocket_contrib]
|
||||||
//! version = "0.4.0-dev"
|
//! version = "0.4.0-rc.1"
|
||||||
//! default-features = false
|
//! default-features = false
|
||||||
//! features = ["diesel_sqlite_pool"]
|
//! features = ["diesel_sqlite_pool"]
|
||||||
//! ```
|
//! ```
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
//!
|
//!
|
||||||
//! ```toml
|
//! ```toml
|
||||||
//! [dependencies.rocket_contrib]
|
//! [dependencies.rocket_contrib]
|
||||||
//! version = "0.4.0-dev"
|
//! version = "0.4.0-rc.1"
|
||||||
//! default-features = false
|
//! default-features = false
|
||||||
//! features = ["json"]
|
//! features = ["json"]
|
||||||
//! ```
|
//! ```
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
//!
|
//!
|
||||||
//! ```toml
|
//! ```toml
|
||||||
//! [dependencies.rocket_contrib]
|
//! [dependencies.rocket_contrib]
|
||||||
//! version = 0.4.0-dev
|
//! version = 0.4.0-rc.1
|
||||||
//! default-features = false
|
//! default-features = false
|
||||||
//! features = ["handlebars_templates", "tera_templates"]
|
//! features = ["handlebars_templates", "tera_templates"]
|
||||||
//! ```
|
//! ```
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rocket_codegen"
|
name = "rocket_codegen"
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||||
description = "Procedural macros for the Rocket web framework."
|
description = "Procedural macros for the Rocket web framework."
|
||||||
documentation = "https://api.rocket.rs/v0.4/rocket_codegen/"
|
documentation = "https://api.rocket.rs/v0.4/rocket_codegen/"
|
||||||
|
@ -9,7 +9,7 @@ repository = "https://github.com/SergioBenitez/Rocket"
|
||||||
readme = "../../README.md"
|
readme = "../../README.md"
|
||||||
keywords = ["rocket", "web", "framework", "code", "generation"]
|
keywords = ["rocket", "web", "framework", "code", "generation"]
|
||||||
license = "MIT/Apache-2.0"
|
license = "MIT/Apache-2.0"
|
||||||
build = "../lib/build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
proc-macro = true
|
proc-macro = true
|
||||||
|
@ -17,7 +17,7 @@ proc-macro = true
|
||||||
[dependencies]
|
[dependencies]
|
||||||
indexmap = "1.0"
|
indexmap = "1.0"
|
||||||
quote = "0.6.1"
|
quote = "0.6.1"
|
||||||
rocket_http = { version = "0.4.0-dev", path = "../http/" }
|
rocket_http = { version = "0.4.0-rc.1", path = "../http/" }
|
||||||
devise = "0.1"
|
devise = "0.1"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
|
@ -25,5 +25,5 @@ yansi = "0.4"
|
||||||
version_check = "0.1.3"
|
version_check = "0.1.3"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rocket = { version = "0.4.0-dev", path = "../lib" }
|
rocket = { version = "0.4.0-rc.1", path = "../lib" }
|
||||||
compiletest_rs = { git = "https://github.com/laumann/compiletest-rs" }
|
compiletest_rs = { git = "https://github.com/laumann/compiletest-rs" }
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
//! This tiny build script ensures that rocket is not compiled with an
|
||||||
|
//! incompatible version of rust.
|
||||||
|
|
||||||
|
extern crate yansi;
|
||||||
|
extern crate version_check;
|
||||||
|
|
||||||
|
use yansi::Color::{Red, Yellow, Blue, White};
|
||||||
|
use version_check::{supports_features, is_min_version, is_min_date};
|
||||||
|
|
||||||
|
// Specifies the minimum nightly version needed to compile Rocket.
|
||||||
|
const MIN_DATE: &'static str = "2018-10-05";
|
||||||
|
const MIN_VERSION: &'static str = "1.31.0-nightly";
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let ok_channel = supports_features();
|
||||||
|
let ok_version = is_min_version(MIN_VERSION);
|
||||||
|
let ok_date = is_min_date(MIN_DATE);
|
||||||
|
let triple = (ok_channel, ok_version, ok_date);
|
||||||
|
|
||||||
|
let print_version_err = |version: &str, date: &str| {
|
||||||
|
eprintln!("{} {}. {} {}.",
|
||||||
|
White.paint("Installed version is:"),
|
||||||
|
Yellow.paint(format!("{} ({})", version, date)),
|
||||||
|
White.paint("Minimum required:"),
|
||||||
|
Yellow.paint(format!("{} ({})", MIN_VERSION, MIN_DATE)));
|
||||||
|
};
|
||||||
|
|
||||||
|
if let (Some(ok_channel), Some((ok_version, version)), Some((ok_date, date))) = triple {
|
||||||
|
if !ok_channel {
|
||||||
|
eprintln!("{} {}",
|
||||||
|
Red.paint("Error:").bold(),
|
||||||
|
White.paint("Rocket requires a nightly or dev version of Rust."));
|
||||||
|
print_version_err(&*version, &*date);
|
||||||
|
eprintln!("{}{}{}",
|
||||||
|
Blue.paint("See the getting started guide ("),
|
||||||
|
White.paint("https://rocket.rs/v0.4/guide/getting-started/"),
|
||||||
|
Blue.paint(") for more information."));
|
||||||
|
panic!("Aborting compilation due to incompatible compiler.")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ok_version || !ok_date {
|
||||||
|
eprintln!("{} {}",
|
||||||
|
Red.paint("Error:").bold(),
|
||||||
|
White.paint("Rocket requires a more recent version of rustc."));
|
||||||
|
eprintln!("{}{}{}",
|
||||||
|
Blue.paint("Use `"),
|
||||||
|
White.paint("rustup update"),
|
||||||
|
Blue.paint("` or your preferred method to update Rust."));
|
||||||
|
print_version_err(&*version, &*date);
|
||||||
|
panic!("Aborting compilation due to incompatible compiler.")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
println!("cargo:warning={}", "Rocket was unable to check rustc compatibility.");
|
||||||
|
println!("cargo:warning={}", "Build may fail due to incompatible rustc version.");
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,7 +23,7 @@
|
||||||
//!
|
//!
|
||||||
//! ```toml
|
//! ```toml
|
||||||
//! [dependencies]
|
//! [dependencies]
|
||||||
//! rocket = "0.4.0-dev"
|
//! rocket = "0.4.0-rc.1"
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! And to import all macros, attributes, and derives via `#[macro_use]` in the
|
//! And to import all macros, attributes, and derives via `#[macro_use]` in the
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rocket_http"
|
name = "rocket_http"
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||||
description = """
|
description = """
|
||||||
Types, traits, and parsers for HTTP requests, responses, and headers.
|
Types, traits, and parsers for HTTP requests, responses, and headers.
|
||||||
|
@ -34,4 +34,4 @@ features = ["server"]
|
||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rocket = { version = "0.4.0-dev", path = "../lib" }
|
rocket = { version = "0.4.0-rc.1", path = "../lib" }
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "rocket"
|
name = "rocket"
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
authors = ["Sergio Benitez <sb@sergio.bz>"]
|
||||||
description = """
|
description = """
|
||||||
Web framework for nightly with a focus on ease-of-use, expressibility, and speed.
|
Web framework for nightly with a focus on ease-of-use, expressibility, and speed.
|
||||||
|
@ -18,8 +18,8 @@ categories = ["web-programming::http-server"]
|
||||||
tls = ["rocket_http/tls"]
|
tls = ["rocket_http/tls"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rocket_codegen = { version = "0.4.0-dev", path = "../codegen" }
|
rocket_codegen = { version = "0.4.0-rc.1", path = "../codegen" }
|
||||||
rocket_http = { version = "0.4.0-dev", path = "../http" }
|
rocket_http = { version = "0.4.0-rc.1", path = "../http" }
|
||||||
yansi = "0.4"
|
yansi = "0.4"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
toml = "0.4.7"
|
toml = "0.4.7"
|
||||||
|
|
|
@ -47,7 +47,7 @@
|
||||||
//!
|
//!
|
||||||
//! ```toml
|
//! ```toml
|
||||||
//! [dependencies]
|
//! [dependencies]
|
||||||
//! rocket = "0.4.0-dev"
|
//! rocket = "0.4.0-rc.1"
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! Then, add the following to the top of your `main.rs` file:
|
//! Then, add the following to the top of your `main.rs` file:
|
||||||
|
|
|
@ -24,9 +24,9 @@ function relative() {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Full and major version of Rocket
|
# Full and major version of Rocket
|
||||||
ROCKET_VERSION="0.4.0-dev"
|
ROCKET_VERSION="0.4.0-rc.1"
|
||||||
ROCKET_MAJOR_VERSION="0.4"
|
ROCKET_MAJOR_VERSION="0.4"
|
||||||
CURRENT_RELEASE=false
|
CURRENT_RELEASE=true
|
||||||
|
|
||||||
# Root of workspace-like directories.
|
# Root of workspace-like directories.
|
||||||
PROJECT_ROOT=$(relative "") || exit $?
|
PROJECT_ROOT=$(relative "") || exit $?
|
||||||
|
|
|
@ -15,7 +15,7 @@ For instance, the following set of commands runs the `hello_world` example:
|
||||||
```sh
|
```sh
|
||||||
git clone https://github.com/SergioBenitez/Rocket
|
git clone https://github.com/SergioBenitez/Rocket
|
||||||
cd Rocket
|
cd Rocket
|
||||||
git checkout v0.4.0-dev
|
git checkout v0.4.0-rc.1
|
||||||
cd examples/hello_world
|
cd examples/hello_world
|
||||||
cargo run
|
cargo run
|
||||||
```
|
```
|
||||||
|
|
|
@ -43,8 +43,8 @@ Then add the usual Rocket dependencies to the `Cargo.toml` file:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rocket = "0.4.0-dev"
|
rocket = "0.4.0-rc.1"
|
||||||
rocket_codegen = "0.4.0-dev"
|
rocket_codegen = "0.4.0-rc.1"
|
||||||
```
|
```
|
||||||
|
|
||||||
And finally, create a skeleton Rocket application to work off of in
|
And finally, create a skeleton Rocket application to work off of in
|
||||||
|
|
|
@ -50,7 +50,7 @@ Now, add Rocket as a dependency in your `Cargo.toml`:
|
||||||
|
|
||||||
```
|
```
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rocket = "0.4.0-dev"
|
rocket = "0.4.0-rc.1"
|
||||||
```
|
```
|
||||||
|
|
||||||
Modify `src/main.rs` so that it contains the code for the Rocket `Hello, world!`
|
Modify `src/main.rs` so that it contains the code for the Rocket `Hello, world!`
|
||||||
|
|
|
@ -215,7 +215,7 @@ databases, you'd write in `Cargo.toml`:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies.rocket_contrib]
|
[dependencies.rocket_contrib]
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["diesel_sqlite_pool"]
|
features = ["diesel_sqlite_pool"]
|
||||||
```
|
```
|
||||||
|
|
|
@ -276,7 +276,7 @@ dependency in your `Cargo.toml` file:
|
||||||
|
|
||||||
```
|
```
|
||||||
[dependencies]
|
[dependencies]
|
||||||
rocket = { version = "0.4.0-dev", features = ["tls"] }
|
rocket = { version = "0.4.0-rc.1", features = ["tls"] }
|
||||||
```
|
```
|
||||||
|
|
||||||
TLS is configured through the `tls` configuration parameter. The value of `tls`
|
TLS is configured through the `tls` configuration parameter. The value of `tls`
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
[release]
|
[release]
|
||||||
version = "0.4.0-dev"
|
version = "0.4.0-rc.1"
|
||||||
date = "Oct 28, 2018"
|
date = "Oct 31, 2018"
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Top features: displayed in the header under the introductory text.
|
# Top features: displayed in the header under the introductory text.
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Rocket v0.4 Release Candidate
|
||||||
|
|
||||||
|
<p class="metadata"><strong>
|
||||||
|
Posted by <a href="https://sergio.bz">Sergio Benitez</a> on October 31, 2018
|
||||||
|
</strong></p>
|
||||||
|
|
||||||
|
I am delighted to announce that a release candidate for Rocket v0.4 is available
|
||||||
|
today! This release brings over a year of features, improvements, and
|
||||||
|
refinements, resolving some of the most called for requests and bringing Rocket
|
||||||
|
measurably closer to stable compatibility.
|
||||||
|
|
||||||
|
The release candidate is an opportunity to discover issues with Rocket v0.4 and
|
||||||
|
its documentation before its general release. We encourage all users to migrate
|
||||||
|
their applications to the release candidate and report any issues to the [GitHub
|
||||||
|
issue tracker].
|
||||||
|
|
||||||
|
Barring any major issues, the general release of Rocket v0.4 is planned for
|
||||||
|
Friday, November 9th, when we'll post a full news article covering the biggest
|
||||||
|
features and changes in Rocket v0.4. Until then, the [CHANGELOG] contains every
|
||||||
|
feature addition, change, and improvement since v0.3, as well as information on
|
||||||
|
migrating your applications to v0.4. All documentation, including the [guide]
|
||||||
|
and [API docs], has been updated in full for v0.4.
|
||||||
|
|
||||||
|
We're excited for your feedback, and we look forward to seeing you again on
|
||||||
|
Friday, November 9th for the general release!
|
||||||
|
|
||||||
|
[GitHub issue tracker]: https://github.com/SergioBenitez/Rocket/issues
|
||||||
|
[API docs]: https://api.rocket.rs/v0.4/rocket/
|
||||||
|
[guide]: ../../guide
|
||||||
|
[CHANGELOG]: https://github.com/SergioBenitez/Rocket/tree/v0.4/CHANGELOG.md#version-040-rc-oct-31-2018
|
||||||
|
|
||||||
|
## About Rocket
|
||||||
|
|
||||||
|
Rocket is a web framework for Rust with a focus on ease of use, expressibility,
|
||||||
|
and speed. Rocket makes it simple to write fast web applications without
|
||||||
|
sacrificing flexibility or type safety. All with minimal code.
|
||||||
|
|
||||||
|
Not already using Rocket? Join the tens of thousands of users and hundreds of
|
||||||
|
companies happily using Rocket today! Rocket's extensive documentation makes it
|
||||||
|
easy. Get started now by [reading through the guide](../../guide) or learning
|
||||||
|
more from [the overview](../../overview).
|
|
@ -1,3 +1,23 @@
|
||||||
|
[[articles]]
|
||||||
|
title = "Rocket v0.4 Release Candidate"
|
||||||
|
slug = "2018-10-31-version-0.4-rc"
|
||||||
|
author = "Sergio Benitez"
|
||||||
|
author_url = "https://sergio.bz"
|
||||||
|
date = "October 31, 2018"
|
||||||
|
snippet = """
|
||||||
|
I am delighted to announce that a release candidate for Rocket v0.4 is available
|
||||||
|
today! This release brings over a year of features, improvements, and
|
||||||
|
refinements, resolving some of the most called for requests and bringing Rocket
|
||||||
|
measurably closer to stable compatibility.
|
||||||
|
|
||||||
|
The release candidate is an opportunity to discover issues with Rocket v0.4 and
|
||||||
|
its documentation before its general release. We encourage all users to migrate
|
||||||
|
their applications to the release candidate and report any issues to the [GitHub
|
||||||
|
issue tracker].
|
||||||
|
|
||||||
|
[GitHub issue tracker]: https://github.com/SergioBenitez/Rocket/issues
|
||||||
|
"""
|
||||||
|
|
||||||
[[articles]]
|
[[articles]]
|
||||||
title = "Rocket v0.3: Fairings, TLS, Private Cookies"
|
title = "Rocket v0.3: Fairings, TLS, Private Cookies"
|
||||||
slug = "2017-07-14-version-0.3"
|
slug = "2017-07-14-version-0.3"
|
||||||
|
|
Loading…
Reference in New Issue