https://github.com/samuelgiles/duckface
A collection of tools to enforce duck typing based interfaces in Ruby.
https://github.com/samuelgiles/duckface
duck-typing interfaces ruby type-safety
Last synced: 7 months ago
JSON representation
A collection of tools to enforce duck typing based interfaces in Ruby.
- Host: GitHub
- URL: https://github.com/samuelgiles/duckface
- Owner: samuelgiles
- License: mit
- Created: 2018-05-27T20:16:58.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2021-10-19T10:34:47.000Z (over 4 years ago)
- Last Synced: 2025-10-07T16:41:31.780Z (7 months ago)
- Topics: duck-typing, interfaces, ruby, type-safety
- Language: Ruby
- Homepage:
- Size: 37.1 KB
- Stars: 10
- Watchers: 0
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: MIT-LICENSE
Awesome Lists containing this project
README

# Duckface [](https://circleci.com/gh/samuelgiles/duckface)
A collection of tools to enforce duck typing based interfaces in Ruby.
## Install
From gem:
```
gem 'duckface-interfaces', require: 'duckface'
```
From source:
```
gem 'duckface-interfaces', require: 'duckface', git: 'git@github.com:samuelgiles/duckface.git'
```
## Configure
### RSpec
`spec/spec_helper.rb`
```ruby
require 'duckface/rspec'
```
## Usage
### Define an interface
```ruby
require 'duckface'
module MyInterface
extend Duckface::ActsAsInterface
exclude_methods_from_interface_enforcement :ignoreable_method_a, :ignoreable_method_b
def say_my_name(_name)
raise NotImplementedMethod
end
def ignoreable_method_a
puts 'I can be ignored'
end
def ignoreable_method_b
puts 'And so can I'
end
end
```
### Define an implementation
```ruby
require 'duckface'
class MyImplementation
implements_interface MyInterface
def say_my_name(name)
puts name
end
end
```
### Test that an implementation correctly implements an interface
```ruby
require 'spec_helper'
describe MyImplementation
it_behaves_like 'it implements', MyInterface
end
```
If it fails you'll get messages pointing out where you've gone wrong:
```ruby
Failures:
1) MyImplementation behaves like it implements MyInterface correctly
Failure/Error: expect(check_session.successful?).to be(true), formatted_message(check_session)
expected to correctly implement MyInterface:
- say_my_name is not present
```