MediaTypes::Validation
Add controller time validation for media types and react accordingly.
Deprecated since media-types-serialization@1.0.0
This library will nog longer receive updates because it has been completely obsoleted by changes in the media-types-serialization
. That library now takes care validating all media-type based serialization responses and media-type based deserialization requests.
Installation
Add this line to your application's Gemfile:
gem 'media_types-validation'
And then execute:
$ bundle
Or install it yourself as:
$ gem install media_types-validation
Usage
If you add the MediaTypes::Validation
controller concern, validate_json_with_media_type
becomes available during
actions. This does not validate only JSON
output, but stringifies and then parses the body as JSON
, so the
limitations of JSON
apply. This step is necessary in order to make sure rails
types and others are first correctly
casted (and formatted).
require 'media_types/validation'
class ApiController < ActionController::API
include MediaTypes::Validation
def render_json_media(media, status: :ok)
# serialize_media is a fictional method that returns a serializer
# -> serializer has .to_hash which returns the body as a hash
# -> serializer has .current_media_type which returns the MediaType::Constructable for the current state
serializer = serialize_media(media)
render json: validate_json_with_media_type(serializer.to_hash, media_type: serializer.current_media_type),
status: status,
content_type: request.format.to_s
end
end
class BookController < ApiController
def show
content = GenerateBookResponse.call(@book)
render_json_media(content)
end
end
By default, this method only outputs to stderr
when something is wrong; see configuration below if you want to assign
your own behaviour, such as adding a Warn
header, or raising a server error.
Configuration
In an initializer you can set procs in order to change the default behaviour:
MediaTypes::Validation.configure do
self.json_invalid_media_proc = proc do |media_type:, err:, body:|
response['Warn'] = '199 media type %s is invalid (%s)' % [media_type, err]
warn response['Warn'] + "\n" + body
end
# Or alternatively you can always raise
self.raise_on_json_invalid_media = true
end
Related
-
MediaTypes
: 💎 Library to create media type definitions, schemes and validations -
MediaTypes::Deserialization
: 🌀 Add media types supported deserialization using your favourite parser, and media type validation. -
MediaTypes::Serialization
: 🌀 Add media types supported serialization using your favourite serializer
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake test
to run the tests. You can
also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the
version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version,
push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at XPBytes/media_types-validation.