Rails OpenAPI Gen
Rails comment-driven OpenAPI specification generator.
Requirements
- Ruby 3.0 or higher
- Rails 6.0 or higher
Installation
Add this line to your application's Gemfile:
gem 'rails-openapi-gen'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install rails-openapi-gen
Overview
rails-openapi-gen analyzes your Rails application's routes.rb, controllers, and jbuilder templates to automatically generate OpenAPI documentation. It uses AST parsing to extract JSON structure and relies on # @openapi
comments for accurate type information.
Note
AST analysis alone cannot accurately infer all conditional branches and partial patterns. Type, required status, enum values, and descriptions should be explicitly defined using # @openapi
comments as the source of truth.
Limitations
The following Jbuilder patterns are not currently supported:
-
Shorthand array syntax:
json.array! @items, :id, :name
- This shorthand notation cannot be annotated with@openapi
comments. Use the block form instead:json.array! @items do |item| # @openapi id:integer required:true description:"Item ID" json.id item.id # @openapi name:string required:true description:"Item name" json.name item.name end
-
Extract shorthand:
json.extract! @item, :id, :name
- This shorthand notation cannot be annotated with@openapi
comments. Use explicit property assignments instead:# @openapi id:integer required:true description:"Item ID" json.id @item.id # @openapi name:string required:true description:"Item name" json.name @item.name
Installation
Add this line to your application's Gemfile:
gem 'rails-openapi-gen'
And then execute:
$ bundle install
Usage
Comment Format
Add # @openapi
comments to your jbuilder templates:
# @openapi id:integer required:true description:"User ID"
json.id @user.id
# @openapi status:string enum:[active,inactive] description:"User status"
json.status @user.status
# @openapi email:string required:true description:"User email address"
json.email @user.email
# @openapi created_at:string description:"ISO 8601 timestamp"
json.created_at @user.created_at.iso8601
Generate OpenAPI Specification
bin/rails openapi:generate
This creates the following structure:
openapi/
openapi.yaml # Main OpenAPI file
paths/
users.yaml # Path definitions
posts.yaml
components/
schemas/
user.yaml # Schema definitions
post.yaml
Check for Missing Comments
bin/rails openapi:check
This command will:
- Generate the OpenAPI specification
- Check for missing
@openapi
comments (marked as "TODO: MISSING COMMENT") - Verify no uncommitted changes in the openapi/ directory
- Exit with code 1 if issues are found
CI Integration
Add to your CI pipeline:
name: OpenAPI Spec Check
on: [push, pull_request]
jobs:
openapi-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Generate OpenAPI Spec
run: bin/rails openapi:generate
- name: Check for missing comments
run: |
if grep -r "TODO: MISSING COMMENT" openapi/; then
echo "❌ Missing @openapi comments!"
exit 1
fi
- name: Check for unexpected diffs
run: git diff --exit-code openapi/
Comment Attributes
-
type
: Data type (string, integer, boolean, number, array, object) -
required
: Whether the field is required (true/false) -
enum
: Allowed values for the field -
description
: Human-readable description
Features
- ✅ Routes.rb parsing for endpoint discovery
- ✅ Controller analysis to locate jbuilder templates
- ✅ AST-based jbuilder parsing with partial support
- ✅ Comment-driven type annotations
- ✅ Split YAML generation with $ref support
- ✅ CI-friendly validation commands
- 🚧 ActiveRecord model inference (optional, future)
- 🚧 Serializer support (future)
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/rails-openapi-gen/rails-openapi-gen.
License
The gem is available as open source under the terms of the MIT License.