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
endBy 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
endRelated
-
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.