Restore fork-specific features lost during upstream sync:

- README.md: Restore WaboSign branding and content (was overwritten by upstream)
- Routes: Restore account_logo, omniauth_callbacks, send_sms, sms test_message, sso create actions
- Account model: Restore LOGO constants and logo attachment
- User model: Restore EDITOR_ROLE, VIEWER_ROLE, editor?, viewer?, from_google_omniauth, signed_in_via_sso?, default_sso_account
- Ability model: Restore role-based permissions (admin, editor, viewer)
- SMS controller: Restore create and test_message actions
- SSO controller: Restore create action and fix config key
- Brakeman fix: Escape JSON in mcp_settings to fix XSS warning
pull/687/head
Wabo 3 weeks ago
parent a153e926f8
commit d9b86d464c

@ -1,107 +1,77 @@
<h1 align="center" style="border-bottom: none">
<div>
<a href="https://www.docuseal.com">
<img alt="DocuSeal" src="https://github.com/user-attachments/assets/38b45682-ffa4-4919-abde-d2d422325c44" width="80" />
<a href="https://sign.wabo.cc">
<img alt="WaboSign" src="public/favicon.svg" width="80" />
<br>
</a>
DocuSeal
WaboSign
</div>
</h1>
<h3 align="center">
Open source document filling and signing
Self-hosted document filling and signing
</h3>
<p align="center">
<a href="https://hub.docker.com/r/docuseal/docuseal">
<img alt="Docker releases" src="https://img.shields.io/docker/v/docuseal/docuseal">
</a>
<a href="https://discord.gg/qygYCDGck9">
<img src="https://img.shields.io/discord/1125112641170448454?logo=discord"/>
</a>
<a href="https://twitter.com/intent/follow?screen_name=docusealco">
<img src="https://img.shields.io/twitter/follow/docusealco?style=social" alt="Follow @docusealco" />
</a>
</p>
<p>
DocuSeal is an open source platform that provides secure and efficient digital document signing and processing. Create PDF forms to have them filled and signed online on any device with an easy-to-use, mobile-optimized web tool.
WaboSign is a self-hosted, open-source platform for secure digital document signing and processing. Create PDF forms, fill them in online from any device, and collect signatures with an easy-to-use, mobile-optimized web tool.
</p>
<h2 align="center">
<a href="https://demo.docuseal.tech">✨ Live Demo</a>
<span>|</span>
<a href="https://docuseal.com/sign_up">☁️ Try in Cloud</a>
</h2>
[![Demo](https://github.com/docusealco/docuseal/assets/5418788/d8703ea3-361a-423f-8bfe-eff1bd9dbe14)](https://demo.docuseal.tech)
WaboSign is a fork of [DocuSeal](https://github.com/docusealco/docuseal) under AGPLv3, with the upstream's "Pro" feature paywall removed so that every shipped capability is available out of the box on a self-hosted deployment.
## Features
- PDF form fields builder (WYSIWYG)
- 12 field types available (Signature, Date, File, Checkbox etc.)
- 12 field types (Signature, Date, File, Checkbox, Phone, Verification, etc.)
- Multiple submitters per document
- Automated emails via SMTP
- Files storage on disk or AWS S3, Google Storage, Azure Cloud
- File storage on disk or AWS S3, Google Storage, Azure Blob
- Automatic PDF eSignature
- PDF signature verification
- Users management
- Mobile-optimized
- 7 UI languages with signing available in 14 languages
- API and Webhooks for integrations
- Easy to deploy in minutes
## Pro Features
- Company logo and white-label
- User roles
- Automated reminders
- Invitation and identity verification via SMS
- User management and roles
- Mobile-optimized signing flow
- 14 UI languages
- API + Webhooks for integrations
- SMS invitations via [BulkVS, Twilio, VoIP.ms, or SignalWire](SMS.md)
- Bulk send via CSV / XLSX import
- Google Workspace SSO ([setup guide](GOOGLE_SSO.md))
- Conditional fields and formulas
- Bulk send with CSV, XLSX spreadsheet import
- SSO / SAML
- Template creation with HTML API ([Guide](https://www.docuseal.com/guides/create-pdf-document-fillable-form-with-html-api))
- Template creation with PDF or DOCX and field tags API ([Guide](https://www.docuseal.com/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form))
- Embedded signing form ([React](https://github.com/docusealco/docuseal-react), [Vue](https://github.com/docusealco/docuseal-vue), [Angular](https://github.com/docusealco/docuseal-angular) or [JavaScript](https://www.docuseal.com/docs/embedded))
- Embedded document form builder ([React](https://github.com/docusealco/docuseal-react), [Vue](https://github.com/docusealco/docuseal-vue), [Angular](https://github.com/docusealco/docuseal-angular) or [JavaScript](https://www.docuseal.com/docs/embedded))
- [Learn more](https://www.docuseal.com/pricing)
## Deploy
- Custom branding (logo, colors, reply-to)
- Easy Docker deployment
|Heroku|Railway|
|:--:|:---:|
| [<img alt="Deploy on Heroku" src="https://www.herokucdn.com/deploy/button.svg" height="40">](https://heroku.com/deploy?template=https://github.com/docusealco/docuseal-heroku) | [<img alt="Deploy on Railway" src="https://railway.app/button.svg" height="40">](https://railway.com/deploy/IGoDnc?referralCode=ruU7JR)|
|**DigitalOcean**|**Render**|
| [<img alt="Deploy on DigitalOcean" src="https://www.deploytodo.com/do-btn-blue.svg" height="40">](https://cloud.digitalocean.com/apps/new?repo=https://github.com/docusealco/docuseal-digitalocean/tree/master&refcode=421d50f53990) | [<img alt="Deploy to Render" src="https://render.com/images/deploy-to-render-button.svg" height="40">](https://render.com/deploy?repo=https://github.com/docusealco/docuseal-render)
#### Docker
## Docker
```sh
docker run --name docuseal -p 3000:3000 -v.:/data docuseal/docuseal
docker run --name wabosign -p 3000:3000 -v .:/data ghcr.io/wabolabs/wabosign:1.3.2
```
By default DocuSeal docker container uses an SQLite database to store data and configurations. Alternatively, it is possible to use PostgreSQL or MySQL databases by specifying the `DATABASE_URL` env variable.
`:latest` always tracks the most recent release; pin a `MAJOR.MINOR.PATCH` tag for reproducible deployments.
#### Docker Compose
By default the container uses SQLite for data. Point at PostgreSQL or MySQL by setting `DATABASE_URL`.
Download docker-compose.yml into your private server:
```sh
curl https://raw.githubusercontent.com/docusealco/docuseal/master/docker-compose.yml > docker-compose.yml
```
### Docker Compose
Run the app under a custom domain over https using docker compose (make sure your DNS points to the server to automatically issue ssl certs with Caddy):
```sh
sudo HOST=your-domain-name.com docker compose up
sudo HOST=sign.example.com docker compose up
```
## For Businesses
### Integrate seamless document signing into your web or mobile apps with DocuSeal
Make sure your DNS points at the server so Caddy can issue an SSL cert automatically.
At DocuSeal we have expertise and technologies to make documents creation, filling, signing and processing seamlessly integrated with your product. We specialize in working with various industries, including **Banking, Healthcare, Transport, Real Estate, eCommerce, KYC, CRM, and other software products** that require bulk document signing. By leveraging DocuSeal, we can assist in reducing the overall cost of developing and processing electronic documents while ensuring security and compliance with local electronic document laws.
## Authentication
[Book a Meeting](https://www.docuseal.com/contact)
WaboSign ships with email + password (Devise) and TOTP two-factor auth out of the box. Google Workspace SSO can be enabled by setting three environment variables — see [GOOGLE_SSO.md](GOOGLE_SSO.md) for the full operator guide.
## Releases
- **Current release:** 1.3.2 — see [CHANGELOG.md](CHANGELOG.md).
- **Container image:** `ghcr.io/wabolabs/wabosign:1.3.2` (or `:latest`).
- **Versioning:** `MAJOR.MINOR.PATCH` per [semver.org](https://semver.org).
- **Tagging triggers a build:** pushing a `MAJOR.MINOR.PATCH` git tag runs [`.github/workflows/docker.yml`](.github/workflows/docker.yml), which builds `linux/amd64` + `linux/arm64` and pushes to GHCR.
## License
Distributed under the AGPLv3 License with Section 7(b) Additional Terms. See [LICENSE](https://github.com/docusealco/docuseal/blob/master/LICENSE) and [LICENSE_ADDITIONAL_TERMS](https://github.com/docusealco/docuseal/blob/master/LICENSE_ADDITIONAL_TERMS) for more information.
Unless otherwise noted, all files © 2023-2026 DocuSeal LLC.
WaboSign is distributed under the [GNU Affero General Public License v3.0](LICENSE), with the §7(b) [Additional Terms](LICENSE_ADDITIONAL_TERMS) preserved from upstream.
WaboSign is a fork of [DocuSeal](https://github.com/docusealco/docuseal) © 20232026 DocuSeal LLC. The upstream attribution required by §7(b) is preserved in interactive UIs and in the [NOTICE](NOTICE) file. Modifications © 2026 the WaboSign authors.
## Tools
## Acknowledgements
- [Signature Maker](https://www.docuseal.com/online-signature)
- [Sign Document Online](https://www.docuseal.com/sign-documents-online)
- [Fill PDF Online](https://www.docuseal.com/fill-pdf)
This software builds on the substantial work of the [DocuSeal](https://github.com/docusealco/docuseal) team. Their open-source release made this fork possible. WaboSign retains the embedding SDK contract (`<docuseal-form>`, `@docuseal/react`, `@docuseal/vue`, `@docuseal/angular`) so existing DocuSeal embedding code continues to work.

@ -3,14 +3,49 @@
class SmsSettingsController < ApplicationController
before_action :load_encrypted_config
authorize_resource :encrypted_config, only: :index
authorize_resource :encrypted_config, parent: false, except: :index
authorize_resource :encrypted_config, parent: false, only: %i[create test_message]
def index; end
def create
new_value = build_sms_value
if @encrypted_config.update(value: new_value)
redirect_to settings_sms_path, notice: I18n.t('changes_have_been_saved')
else
render :index, status: :unprocessable_content
end
rescue StandardError => e
flash[:alert] = e.message
render :index, status: :unprocessable_content
end
def test_message
to = params[:phone].to_s.strip
if to.blank?
flash[:alert] = 'Enter a phone number to test against.'
return redirect_to(settings_sms_path)
end
Sms.send_message(account: current_account,
to: to,
text: "Test SMS from #{Wabosign.branded_product_name(current_account)}.")
redirect_to settings_sms_path, notice: "Test SMS dispatched to #{to}."
rescue Sms::Error => e
redirect_to settings_sms_path, alert: "Test failed: #{e.message}"
rescue StandardError => e
redirect_to settings_sms_path, alert: "Unexpected error: #{e.message}"
end
private
def load_encrypted_config
@encrypted_config =
EncryptedConfig.find_or_initialize_by(account: current_account, key: 'sms_configs')
end
def build_sms_value
params.require(:encrypted_config).permit(:provider, :account_sid, :auth_token, :from_number, :bulkvs_api_key, :bulkvs_sender_id, :signalwire_app_id, :signalwire_app_token, :signalwire_url, :signalwire_message_profile_id, :twilio_sid, :twilio_token, :twilio_from_number, :voipms_user, :voipms_pass, :voipms_sender_id)[:encrypted_config]
end
end

@ -3,13 +3,45 @@
class SsoSettingsController < ApplicationController
before_action :load_encrypted_config
authorize_resource :encrypted_config, only: :index
authorize_resource :encrypted_config, parent: false, only: :create
def index; end
def create
new_value = build_sso_value
if @encrypted_config.update(value: new_value)
redirect_to settings_sso_index_path, notice: I18n.t('changes_have_been_saved')
else
render :index, status: :unprocessable_content
end
rescue StandardError => e
flash[:alert] = e.message
render :index, status: :unprocessable_content
end
private
def load_encrypted_config
@encrypted_config =
EncryptedConfig.find_or_initialize_by(account: current_account, key: 'saml_configs')
EncryptedConfig.find_or_initialize_by(account: current_account,
key: EncryptedConfig::GOOGLE_SSO_KEY)
end
def build_sso_value
submitted = params.require(:encrypted_config).permit(value: {})[:value].to_h
existing = @encrypted_config.value || {}
# Don't clobber the saved secret with a blank one — the field is
# rendered empty (we never echo it back) so an unchanged form would
# otherwise wipe it out.
submitted['client_secret'] = existing['client_secret'] if submitted['client_secret'].to_s.empty?
submitted['allowed_domains'] =
submitted.delete('allowed_domains_csv').to_s.split(',').map(&:strip).reject(&:empty?)
submitted['enabled'] = submitted['enabled'].to_s == '1' || submitted['enabled'].to_s == 'true'
submitted.compact
end
end

@ -18,8 +18,13 @@
# index_accounts_on_uuid (uuid) UNIQUE
#
class Account < ApplicationRecord
LOGO_CONTENT_TYPES = %w[image/png image/jpeg image/svg+xml].freeze
LOGO_MAX_BYTES = 2.megabytes
attribute :uuid, :string, default: -> { SecureRandom.uuid }
has_one_attached :logo
has_many :users, dependent: :destroy
has_many :encrypted_configs, dependent: :destroy
has_many :account_configs, dependent: :destroy

@ -116,6 +116,10 @@ class User < ApplicationRecord
[first_name&.first, last_name&.first].compact_blank.join.upcase
end
def signed_in_via_sso?
provider == 'google_oauth2' && uid.present?
end
def full_name
[first_name, last_name].compact_blank.join(' ')
end
@ -127,4 +131,40 @@ class User < ApplicationRecord
email
end
end
def self.from_google_omniauth(auth)
raw_info = auth.extra&.raw_info
hosted_domain = raw_info.respond_to?(:hd) ? raw_info.hd : raw_info&.dig('hd')
return nil unless Wabosign.google_domain_allowed?(hosted_domain)
email = auth.info.email.to_s.downcase
return nil if email.blank?
user = find_by('lower(email) = ?', email)
if user
return nil if user.provider.present? && user.uid != auth.uid
user.update!(provider: 'google_oauth2', uid: auth.uid) if user.provider.blank?
return user
end
account = default_sso_account
return nil if account.nil?
create!(
account: account,
email: email,
first_name: auth.info.first_name,
last_name: auth.info.last_name,
role: ADMIN_ROLE,
password: SecureRandom.hex(32),
provider: 'google_oauth2',
uid: auth.uid,
confirmed_at: Time.current
)
end
def self.default_sso_account
Account.where(archived_at: nil).order(:created_at).first
end
end

@ -36,7 +36,7 @@
<p class="text-2xl font-semibold"><%= t('connect_to_docuseal_mcp') %></p>
<p class="text-lg"><%= t('add_the_following_to_your_mcp_client_configuration') %>:</p>
<div class="mockup-code overflow-hidden">
<% text = JSON.pretty_generate({ mcpServers: { wabosign: { type: 'http', url: "#{root_url(Wabosign.default_url_options)}mcp", headers: { Authorization: "Bearer #{@mcp_token.token}" } } } }).strip %>
<% text = CGI.escapeHTML(JSON.pretty_generate({ mcpServers: { wabosign: { type: 'http', url: "#{root_url(Wabosign.default_url_options)}mcp", headers: { Authorization: "Bearer #{@mcp_token.token}" } } } }).strip) %>
<span class="top-0 right-0 absolute">
<%= render 'shared/clipboard_copy', icon: 'copy', text:, class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
</span>

@ -14,8 +14,15 @@ Rails.application.routes.draw do
get 'up' => 'rails/health#show'
get 'manifest' => 'pwa#manifest'
devise_for :users, path: '/', only: %i[sessions passwords],
controllers: { sessions: 'sessions', passwords: 'passwords' }
# User is always :omniauthable (see app/models/user.rb); the strategy is
# registered with a setup proc in config/initializers/devise.rb that pulls
# live credentials from ENV or the database at request time.
devise_for :users, path: '/', only: %i[sessions passwords omniauth_callbacks],
controllers: {
sessions: 'sessions',
passwords: 'passwords',
omniauth_callbacks: 'users/omniauth_callbacks'
}
devise_scope :user do
resource :invitation, only: %i[update] do
@ -172,13 +179,18 @@ Rails.application.routes.draw do
resources :download, only: %i[index], controller: 'submitters_download', constraints: { submitter_id: /\d+/ }
resources :download, only: %i[index], controller: 'submit_form_completed_download'
resources :send_email, only: %i[create], controller: 'submitters_send_email'
resources :send_sms, only: %i[create], controller: 'submitters_send_sms'
end
scope '/settings', as: :settings do
unless Wabosign.multitenant?
resources :storage, only: %i[index create], controller: 'storage_settings'
resources :search_entries_reindex, only: %i[create]
resources :sms, only: %i[index], controller: 'sms_settings'
resources :sms, only: %i[index create], controller: 'sms_settings' do
collection do
post :test_message
end
end
resources :mcp, only: %i[index new create destroy], controller: 'mcp_settings'
end
if Wabosign.demo? || !Wabosign.multitenant?
@ -186,7 +198,7 @@ Rails.application.routes.draw do
resource :reveal_access_token, only: %i[show create], controller: 'reveal_access_token'
end
resources :email, only: %i[index create], controller: 'email_smtp_settings'
resources :sso, only: %i[index], controller: 'sso_settings'
resources :sso, only: %i[index create], controller: 'sso_settings'
resources :notifications, only: %i[index create], controller: 'notifications_settings'
resource :esign, only: %i[show create new update destroy], controller: 'esign_settings'
resources :users, only: %i[index]
@ -195,6 +207,7 @@ Rails.application.routes.draw do
resources :integration_users, only: %i[index], path: 'users/:status', controller: 'users',
defaults: { status: :integration }
resource :personalization, only: %i[show create], controller: 'personalization_settings'
resource :account_logo, only: %i[create destroy], controller: 'account_logo'
resources :webhooks, only: %i[index show new create update destroy], controller: 'webhook_settings' do
post :resend

@ -4,6 +4,28 @@ class Ability
include CanCan::Ability
def initialize(user)
return if user.blank?
grant_personal_abilities(user)
case user.role
when User::ADMIN_ROLE then grant_admin_abilities(user)
when User::EDITOR_ROLE then grant_editor_abilities(user)
when User::VIEWER_ROLE then grant_viewer_abilities(user)
end
end
private
def grant_personal_abilities(user)
can :read, Account, id: user.account_id
can :manage, User, id: user.id
can :manage, UserConfig, user_id: user.id
can :manage, EncryptedUserConfig, user_id: user.id
can :manage, AccessToken, user_id: user.id
end
def grant_admin_abilities(user)
can %i[read create update], Template, Abilities::TemplateConditions.collection(user) do |template|
Abilities::TemplateConditions.entity(template, user:, ability: 'manage')
end
@ -15,14 +37,36 @@ class Ability
can :manage, Submitter, account_id: user.account_id
can :manage, User, account_id: user.account_id
can :manage, EncryptedConfig, account_id: user.account_id
can :manage, EncryptedUserConfig, user_id: user.id
can :manage, AccountConfig, account_id: user.account_id
can :manage, UserConfig, user_id: user.id
can :manage, Account, id: user.account_id
can :manage, AccessToken, user_id: user.id
can :manage, McpToken, user_id: user.id
can :manage, WebhookUrl, account_id: user.account_id
can :manage, :mcp
end
def grant_editor_abilities(user)
can %i[read create update], Template, Abilities::TemplateConditions.collection(user) do |template|
Abilities::TemplateConditions.entity(template, user:, ability: 'manage')
end
can :destroy, Template, account_id: user.account_id
can :manage, TemplateFolder, account_id: user.account_id
can :manage, TemplateSharing, template: { account_id: user.account_id }
can :manage, Submission, account_id: user.account_id
can :manage, Submitter, account_id: user.account_id
can :read, AccountConfig, account_id: user.account_id
end
def grant_viewer_abilities(user)
can :read, Template, Abilities::TemplateConditions.collection(user, ability: :read) do |template|
Abilities::TemplateConditions.entity(template, user:, ability: 'read')
end
can :read, TemplateFolder, account_id: user.account_id
can :read, TemplateSharing, template: { account_id: user.account_id }
can :read, Submission, account_id: user.account_id
can :read, Submitter, account_id: user.account_id
can :read, AccountConfig, account_id: user.account_id
end
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'annotaterb' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('annotaterb', 'annotaterb', version)
else
load Gem.activate_bin_path('annotaterb', 'annotaterb', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'bootsnap' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('bootsnap', 'bootsnap', version)
else
load Gem.activate_bin_path('bootsnap', 'bootsnap', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'brakeman' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('brakeman', 'brakeman', version)
else
load Gem.activate_bin_path('brakeman', 'brakeman', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'coderay' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('coderay', 'coderay', version)
else
load Gem.activate_bin_path('coderay', 'coderay', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'dotenv' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('dotenv', 'dotenv', version)
else
load Gem.activate_bin_path('dotenv', 'dotenv', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'erb' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('erb', 'erb', version)
else
load Gem.activate_bin_path('erb', 'erb', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'erb_lint' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('erb_lint', 'erb_lint', version)
else
load Gem.activate_bin_path('erb_lint', 'erb_lint', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'erb_lint' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('erb_lint', 'erblint', version)
else
load Gem.activate_bin_path('erb_lint', 'erblint', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'faker' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('faker', 'faker', version)
else
load Gem.activate_bin_path('faker', 'faker', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'foreman' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('foreman', 'foreman', version)
else
load Gem.activate_bin_path('foreman', 'foreman', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'hexapdf' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('hexapdf', 'hexapdf', version)
else
load Gem.activate_bin_path('hexapdf', 'hexapdf', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'diff-lcs' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('diff-lcs', 'htmldiff', version)
else
load Gem.activate_bin_path('diff-lcs', 'htmldiff', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'irb' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('irb', 'irb', version)
else
load Gem.activate_bin_path('irb', 'irb', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'jmespath' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('jmespath', 'jmespath.rb', version)
else
load Gem.activate_bin_path('jmespath', 'jmespath.rb', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'sidekiq' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('sidekiq', 'kiq', version)
else
load Gem.activate_bin_path('sidekiq', 'kiq', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'launchy' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('launchy', 'launchy', version)
else
load Gem.activate_bin_path('launchy', 'launchy', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'diff-lcs' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('diff-lcs', 'ldiff', version)
else
load Gem.activate_bin_path('diff-lcs', 'ldiff', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'minitest' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('minitest', 'minitest', version)
else
load Gem.activate_bin_path('minitest', 'minitest', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'nokogiri' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('nokogiri', 'nokogiri', version)
else
load Gem.activate_bin_path('nokogiri', 'nokogiri', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'pagy' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('pagy', 'pagy', version)
else
load Gem.activate_bin_path('pagy', 'pagy', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'pry' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('pry', 'pry', version)
else
load Gem.activate_bin_path('pry', 'pry', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'puma' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('puma', 'puma', version)
else
load Gem.activate_bin_path('puma', 'puma', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'puma' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('puma', 'pumactl', version)
else
load Gem.activate_bin_path('puma', 'pumactl', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'racc' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('racc', 'racc', version)
else
load Gem.activate_bin_path('racc', 'racc', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rackup' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rackup', 'rackup', version)
else
load Gem.activate_bin_path('rackup', 'rackup', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('railties', 'rails', version)
else
load Gem.activate_bin_path('railties', 'rails', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rake' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rake', 'rake', version)
else
load Gem.activate_bin_path('rake', 'rake', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'debug' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('debug', 'rdbg', version)
else
load Gem.activate_bin_path('debug', 'rdbg', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rdoc' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rdoc', 'rdoc', version)
else
load Gem.activate_bin_path('rdoc', 'rdoc', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rdoc' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rdoc', 'ri', version)
else
load Gem.activate_bin_path('rdoc', 'ri', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rotp' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rotp', 'rotp', version)
else
load Gem.activate_bin_path('rotp', 'rotp', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rouge' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rouge', 'rougify', version)
else
load Gem.activate_bin_path('rouge', 'rougify', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rspec-core' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rspec-core', 'rspec', version)
else
load Gem.activate_bin_path('rspec-core', 'rspec', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'rubocop' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('rubocop', 'rubocop', version)
else
load Gem.activate_bin_path('rubocop', 'rubocop', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'parser' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('parser', 'ruby-parse', version)
else
load Gem.activate_bin_path('parser', 'ruby-parse', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'parser' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('parser', 'ruby-rewrite', version)
else
load Gem.activate_bin_path('parser', 'ruby-rewrite', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'sidekiq' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('sidekiq', 'sidekiq', version)
else
load Gem.activate_bin_path('sidekiq', 'sidekiq', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'sidekiq' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('sidekiq', 'sidekiqmon', version)
else
load Gem.activate_bin_path('sidekiq', 'sidekiqmon', version)
end

@ -0,0 +1,28 @@
#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'thor' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
Gem.use_gemdeps
version = ">= 0.a"
str = ARGV.first
if str
str = str.b[/\A_(.*)_\z/, 1]
if str and Gem::Version.correct?(str)
version = str
ARGV.shift
end
end
if Gem.respond_to?(:activate_and_load_bin_path)
Gem.activate_and_load_bin_path('thor', 'thor', version)
else
load Gem.activate_bin_path('thor', 'thor', version)
end

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save