Skip to content

featurist/interfaceable

master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
bin
 
 
lib
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Interfaceable Build Status Gem Version

Impose interfaces on classes and let this gem automatically check that the interface constraints are met.

Installation

Add this line to your application's Gemfile:

gem 'interfaceable'

And then execute:

$ bundle install

Usage

In this example:

module Carrier
  def call(number); end

  def text(number, text); end
end

class Giffgaff
  extend Interfaceable

  implements Carrier
end

An attempt to load this code will result in the following error:

Giffgaff must implement: (Interfaceable::Error)
  - Carrier#text
  - Carrier#call

It will keep failing until Giffgaff defines those methods.

Correctly! E.g.:

class Giffgaff
  def call(number); end

  def text(number, text = ''); end
end

Will fail because of method signature mismatch:

Giffgaff must implement correctly: (Interfaceable::Error)
  - Carrier#text:
    - expected arguments: (req, req)
    - actual arguments: (req, opt=)

Rails

Mix in Interfaceable before any of the application code is loaded. For example, in the initializer. For extra peace of mind, you can noop interface checking in production:

# config/initializers/interfaceable.rb
class Class
  if Rails.env.production?
    def implements(*args); end
  else
    include Interfaceable
  end
end

About

Strict interfaces in Ruby

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published