Obscenity is a profanity filter gem for Ruby/Rubinius, Rails (through ActiveModel), and Rack middleware.
Obscenity is a profanity filter gem for Ruby/Rubinius, Rails (through ActiveModel), and Rack middleware.
Add this line to your application's Gemfile:
gem 'obscenity'
And then execute:
bundle install
Or install it yourself as:
gem install obscenity
Obscenity is compatible with Ruby 1.9.X, Ruby 2.0.X, Rubinius 1.9, Rails 3.X, and Rack as a middleware. Starting with Rails 3, the profanity validation works with any ORM supported by ActiveModel, e.g: ActiveRecord, MongoMapper, Mongoid, etc.
The following methods are available to use with Obscenity:
Obscenity.configure(&block)allows you to set custom global configuration options. Available options are:
config.blacklistaccepts the following values:
config.whitelistaccepts the following values:
config.replacementaccepts the following values:
Example:
Obscenity.configure do |config| config.blacklist = "path/to/blacklist/file.yml" config.whitelist = ["safe", "word"] config.replacement = :stars end
Obscenity.profane?(text)analyses the content and returns
trueor
falsebased on its profanity:
Obscenity.profane?("simple text") => falseObscenity.profane?("text with shit") => true
Obscenity.sanitize(text)sanities the content and returns a new sanitized content (if profane) or the original content (if not profane):
Obscenity.sanitize("simple text") => "simple text"Obscenity.sanitize("text with shit") => "text with [email protected]!#%"
Obscenity.replacement(style).sanitize(text)allows you to pass the replacement method to be used when sanitizing the given content. Available replacement values are
:default,
:garbled,
:stars,
:vowels, and a custom string.
Obscenity.replacement(:default).sanitize("text with shit") => "text with [email protected]!#%"Obscenity.replacement(:garbled).sanitize("text with shit") => "text with [email protected]!#%"
Obscenity.replacement(:stars).sanitize("text with shit") => "text with ****"
Obscenity.replacement(:vowels).sanitize("text with shit") => "text with sh*t"
Obscenity.replacement(:nonconsonants).sanitize('Oh 5hit') => "Oh ht"
Obscenity.replacement("[censored]").sanitize("text with shit") => "text with [censored]"
Obscenity.offensive(text)returns an array of profane words in the given content:
Obscenity.offensive("simple text") => []Obscenity.offensive("text with shit and another biatch") => ["shit", "biatch"]
The ActiveModel component provides easy profanity validation for your models.
First, you need to explicitly require the ActiveModel component:
require 'obscenity/active_model'
Then you can use it in your models as such:
# ActiveRecord example class Post < ActiveRecord::Basevalidates :title, obscenity: true validates :body, obscenity: { sanitize: true, replacement: "[censored]" } end
MongoMapper example
class Book include MongoMapper::Document
key :title, String key :body, String
validates :title, obscenity: true validates :body, obscenity: { sanitize: true, replacement: :vowels } end
Mongoid example
class Page include Mongoid::Document
field :title, type: String field :body, type: String
validates :title, obscenity: true validates :body, obscenity: { sanitize: true, replacement: :garbled } end
The following usage is available:
obscenity: true: Does a profanity validation in the field using
.profane?and returns
true/false. If true, ActiveModel's Validation will return a default error message.
obscenity: { message: 'Custom message' }: Does a profanity validation in the field using
.profane?and returns
true/false. If true, ActiveModel's Validation will return your custom error message.
obscenity: { sanitize: true }: Silently sanitizes the field and replaces its content with the sanitized version. If the
:replacementkey is included, it will use that style when replacing the content.
You can use Obscenity as a Rack middleware to automatically reject requests that include profane parameter values or sanitize those values before they reach your Application.
First you need to explicitly require the Rack middleware:
require 'obscenity/rack'
And to use the middleware, the basic syntax is:
use Rack::Obscenity, {} # options Hash
You need to use the options below inside the options Hash (above)
Any of the following options can be used to reject a request.
reject: true: will reject a request if any parameter value contains profanity.
use Rack::Obscenity, reject: true
reject: { params: [] }: will analyze the selected parameters and reject the request if their values contain profanity.
use Rack::Obscenity, reject: { params: [:foo, :bar] }
reject: { message: 'Custom message' }: will reject a request and display the custom message if any parameter value contains profanity
use Rack::Obscenity, reject: { message: "We don't allow profanity!" }
reject: { path: 'path/to/file' }: will reject a request and render the custom file if any parameter value contains profanity
use Rack::Obscenity, reject: { path: 'public/no_profanity.html' }
More usage example:
# Rejects the request for all params and renders a file use Rack::Obscenity, reject: { params: :all, path: 'public/no_profanity.html' }Rejects the request based on the selected params and renders a file
use Rack::Obscenity, reject: { params: [:foo, :bar], path: 'public/no_profanity.html' }
Rejects the request based on the selected params and displays a message
use Rack::Obscenity, reject: { params: [:foo, :bar], message: "Profanity is not allowed!" }
Any of the following options can be used to sanitize a request.
sanitize: true: will sanitize all parameter values if they contain profanity.
use Rack::Obscenity, sanitize: true
sanitize: { params: [] }: will analyze the selected parameters and sanitize them if their values contain profanity.
use Rack::Obscenity, sanitize: { params: [:foo, :bar] }
sanitize: { replacement: (:default | :garbled | :stars | :vowels | 'custom') }: will use this replacement method when sanitizing parameter values
use Rack::Obscenity, sanitize: { replacement: :vowels }
More usage example:
# Sanitizes all params and replaces their values using :stars use Rack::Obscenity, sanitize: { params: :all, replacement: :stars }Sanitizes the given params and replaces their values using a custom word
use Rack::Obscenity, sanitize: { params: [:foo, :bar], replacement: "[censored]" }
Sanitizes all params and replaces their values using :garbled
use Rack::Obscenity, sanitize: { replacement: :garbled }
Obscenity currently provides test helpers for RSpec only, but we have plans to add helpers to Shoulda as well.
A
be_profanematcher is available for RSpec. Its usage is very simple:
user.username.should_not be_profane
Copyright (c) 2012 Thiago Jackiw. See LICENSE.txt for further details.