Mortymer
███╗ ███╗ ██████╗ ██████╗ ████████╗██╗ ██╗███╗ ███╗███████╗██████╗
████╗ ████║██╔═══██╗██╔══██╗╚══██╔══╝╚██╗ ██╔╝████╗ ████║██╔════╝██╔══██╗
██╔████╔██║██║ ██║██████╔╝ ██║ ╚████╔╝ ██╔████╔██║█████╗ ██████╔╝
██║╚██╔╝██║██║ ██║██╔══██╗ ██║ ╚██╔╝ ██║╚██╔╝██║██╔══╝ ██╔══██╗
██║ ╚═╝ ██║╚██████╔╝██║ ██║ ██║ ██║ ██║ ╚═╝ ██║███████╗██║ ██║Mortymer is a Ruby gem that simplifies API endpoint management and documentation for Ruby on Rails applications. It provides a clean DSL for defining API endpoints with input/output contracts and automatically generates OpenAPI documentation. It provides a really convenient way to handle dependency Injection in Ruby, with an explicit approach but a really easy setup. No complex container initialization or registration (although it is supported). Fully compatible with ruby constructors.
!IMPORTANT
This gem is going under rapid development and as new features are added it might brake compatibility from one version to another. I plan to give a stable release with version 0.1.0 and from there, follow semantic versioning.
Features
- 🚀 Simple DSL for defining API endpoints
- 📝 Automatic OpenAPI documentation generation
- ✨ Input/Output contract validation
- 🎯 Dependency injection support
- 🛣️ Seamless Rails integration
Installation
Add this line to your application's Gemfile:
gem 'mortymer'And then execute:
bundle installUsage
Basic Example
class UserProfileEndpoint < ApplicationController
include Mortymer::ApiMetadata
# Define an endpoint with input/output contracts
get input: UserProfileInput, output: UserProfileOutput, path: '/api/v1/users/:id/profile'
def call(input)
user = User.find(input.id)
UserProfileOutput.new(
id: user.id,
name: user.name,
email: user.email
)
end
endInput/Output Contracts
class UserProfileInput < Mortymer::Model
attribute :id, Types::Integer
attribute :include_details, Types::Bool.optional.default(false)
end
class UserProfileOutput < Mortymer::Model
attribute :id, Types::Integer
attribute :name, Types::String
attribute :email, Types::String
endDependency Injection
class UserService
include Mortymer::DependenciesDsl
# Inject dependencies
inject UserRepository
inject EmailService, as: :mailer
def process_user(id)
user = @user_repository.find_user(id)
@email_service.send_email(user.email, "Welcome!")
end
endRails Integration
In your config/routes.rb:
Rails.application.routes.draw do
Mortymer::Rails::Routes.new(self).mount_controllers
endOpenAPI Documentation
Mortymer automatically generates OpenAPI documentation for your API endpoints. The documentation includes:
- Endpoint paths and HTTP methods
- Request/response schemas
- Input validation rules
- Error responses
To generate the OpenAPI documentation:
generator = Mortymer::OpenapiGenerator.new(
prefix: "/api",
title: "My API",
version: "v1"
)
generator.generateContributing
We love your input! We want to make contributing to Mortymer as easy and transparent as possible, whether it's:
- Reporting a bug
- Discussing the current state of the code
- Submitting a fix
- Proposing new features
- Becoming a maintainer
Development Process
- Fork the repo and create your branch from
master - If you've added code, please, add some tests to contribute to gem health
- If you've changed APIs, update the documentation accordingly
- Ensure the test suite passes
- Make sure your code lints
- Issue that pull request!
Running Tests
bundle install
bundle exec rspecLicense
MIT License. See LICENSE for details.
Code of Conduct
This project follows the Contributor Covenant Code of Conduct.
Support
If you have any questions or need help with Mortymer:
- Open an issue
- Join our Discord community (coming soon)
Credits
Mortymer is maintained by [Adrian Gonzalez] and was inspired by the need for a simple, yet powerful API management solution in the Ruby ecosystem, that integrates well with existing frameworks. We deserve a FastAPI experience within the ruby side.