autopilot-rails 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +42 -0
- data/Rakefile +27 -0
- data/lib/autopilot.rb +4 -0
- data/lib/generators/autopilot/accounts_generator.rb +44 -0
- data/lib/generators/autopilot/admin_generator.rb +24 -0
- data/lib/generators/autopilot/example_generator.rb +12 -0
- data/lib/generators/autopilot/go_generator.rb +44 -0
- data/lib/generators/autopilot/routes_generator.rb +37 -0
- data/lib/generators/autopilot/users_generator.rb +19 -0
- data/lib/templates/account.rb +5 -0
- data/lib/templates/controllers/accounts_controller.rb +26 -0
- data/lib/templates/controllers/application_controller.rb +8 -0
- data/lib/templates/controllers/pages_controller.rb +10 -0
- data/lib/templates/routes-with-home.rb +16 -0
- data/lib/templates/routes-without-home.rb +16 -0
- data/lib/templates/user.rb +25 -0
- data/lib/templates/views/accounts/users.html.erb +24 -0
- data/lib/templates/views/layouts/_nav.html.erb +9 -0
- data/lib/templates/views/pages/dash.html.erb +2 -0
- data/lib/templates/views/pages/home.html.erb +2 -0
- metadata +87 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1f1263c2b13ad874e16683c2592423a3f8c16fe2faaff652df9d58874228d1ad
|
4
|
+
data.tar.gz: c5521addd46867b05042f1d34f396ab9e5d493ec799444b63630585c532657d1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5fe3a57ef797c27e2f65b6e48dbabe94c9c6ffddf212a60518ffa8f984fcb594a382e0d0af3d51d651055e32aefc9dcd317cc4447517ce9db7f20f7d1d3e6c74
|
7
|
+
data.tar.gz: 969a72f022ec58114b76762124b6aa35575228ba73c99ac71496eb060c9153eee75ff3791c5f6b0c2dc9ade80cb36b90d60ac18c274d79cd730d3a2091fa75e6
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2019 Dylan Feltus
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Autopilot Rails
|
2
|
+
|
3
|
+
_⚠️ This project is still a WIP. It currently works with a limited set of features._
|
4
|
+
|
5
|
+
Ship your next SaaS product in hours, not days or weeks.
|
6
|
+
|
7
|
+
This gem will help you to scaffold your next project. Currently it will add:
|
8
|
+
- Users with authentication via Devise
|
9
|
+
- Accounts with devise_invitable
|
10
|
+
- Super admin area with ActiveAdmin
|
11
|
+
- Default routes and pages
|
12
|
+
|
13
|
+
More features coming soon:
|
14
|
+
- User roles & permissions
|
15
|
+
- Stripe billing with optional annual plans
|
16
|
+
- Feature flipper for super admins
|
17
|
+
- UI themes
|
18
|
+
|
19
|
+
## Install
|
20
|
+
|
21
|
+
To install Autopilot, simply add the gem to your Gemfile:
|
22
|
+
`gem 'autopilot', git: 'https://github.com/stratuslabs/autopilot.git'`
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
To generate a project run `rails generate autopilot:go` to get started. The generator will ask a few questions to customize the output.
|
27
|
+
|
28
|
+
| Option | Description |
|
29
|
+
| --- | --- |
|
30
|
+
| Do you want to have multiple users per account? | This will add an Account model, some account related helpers, and [Devise Invitable](https://github.com/scambra/devise_invitable). You will also get a `account/users` page with a list of users and the invite form. |
|
31
|
+
| Do you want to include ActiveAdmin? | This will install ActiveAdmin with a few extra features like "Log in as user" and an account growth chart. |
|
32
|
+
| Do you want to include a home page? | This will add a blank html page and set it as your unauthenticated root path. When set to false your log in page will be the root. |
|
33
|
+
|
34
|
+
## Starting from scratch
|
35
|
+
|
36
|
+
Here are some instructions to help you start a Rails app from scratch:
|
37
|
+
|
38
|
+
- rails new example --database=postgresql
|
39
|
+
- ~~Add config~~
|
40
|
+
- gem 'autopilot', git: 'https://github.com/stratuslabs/autopilot.git'
|
41
|
+
- `bundle install`
|
42
|
+
- Set up database
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'Autopilot'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.md')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
require 'bundler/gem_tasks'
|
18
|
+
|
19
|
+
require 'rake/testtask'
|
20
|
+
|
21
|
+
Rake::TestTask.new(:test) do |t|
|
22
|
+
t.libs << 'test'
|
23
|
+
t.pattern = 'test/**/*_test.rb'
|
24
|
+
t.verbose = false
|
25
|
+
end
|
26
|
+
|
27
|
+
task default: :test
|
data/lib/autopilot.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Autopilot
|
2
|
+
module Generators
|
3
|
+
class AccountsGenerator < Rails::Generators::Base
|
4
|
+
desc "Generate Account model with devise_invitable"
|
5
|
+
source_root File.expand_path("../../../templates", __FILE__)
|
6
|
+
|
7
|
+
def do_magic
|
8
|
+
puts "Setting up multiple users per accounts"
|
9
|
+
|
10
|
+
gem 'devise_invitable', '~> 2.0.0'
|
11
|
+
Bundler.with_clean_env do
|
12
|
+
run "bundle install"
|
13
|
+
end
|
14
|
+
generate "devise_invitable:install"
|
15
|
+
generate "devise_invitable User"
|
16
|
+
|
17
|
+
generate "model Account"
|
18
|
+
template "account.rb", "app/models/account.rb", force: true
|
19
|
+
template "user.rb", "app/models/user.rb", force: true
|
20
|
+
|
21
|
+
copy_file "controllers/accounts_controller.rb", "app/controllers/accounts_controller.rb", force: true
|
22
|
+
copy_file "controllers/application_controller.rb", "app/controllers/application_controller.rb", force: true
|
23
|
+
|
24
|
+
route "get 'account/users', to: 'accounts#users', as: :account_users"
|
25
|
+
route "post 'account/send_user_invite' => 'accounts#send_user_invite', as: :send_user_invite"
|
26
|
+
copy_file "views/accounts/users.html.erb", "app/views/accounts/users.html.erb"
|
27
|
+
|
28
|
+
inject_into_file 'app/views/layouts/_nav.html.erb', after: "dash_path %>\n" do <<-'RUBY'
|
29
|
+
<%= link_to "Users", account_users_path %>
|
30
|
+
RUBY
|
31
|
+
end
|
32
|
+
|
33
|
+
inject_into_file 'config/environments/development.rb', after: "Rails.application.configure do\n" do <<-'RUBY'
|
34
|
+
config.action_mailer.default_url_options = { :host => 'localhost' }
|
35
|
+
RUBY
|
36
|
+
end
|
37
|
+
|
38
|
+
generate "migration AddAccountToUsers account:references"
|
39
|
+
generate "migration AddOwnerIdToAccounts owner_id:integer"
|
40
|
+
generate "migration AddDeletedAtToAccounts deleted_at:datetime:index"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Autopilot
|
2
|
+
module Generators
|
3
|
+
class AdminGenerator < Rails::Generators::Base
|
4
|
+
desc "Add ActiveAdmin to your project"
|
5
|
+
|
6
|
+
def do_magic
|
7
|
+
puts "Set up active admin"
|
8
|
+
|
9
|
+
gem "activeadmin"
|
10
|
+
Bundler.with_clean_env do
|
11
|
+
run "bundle install"
|
12
|
+
end
|
13
|
+
generate "active_admin:install"
|
14
|
+
run "db:migrate"
|
15
|
+
run "db:seed"
|
16
|
+
|
17
|
+
puts "Admin account generated:"
|
18
|
+
puts "Email: admin@example.com"
|
19
|
+
puts "Password: password"
|
20
|
+
puts "Access your admin account at /admin"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Autopilot
|
2
|
+
module Generators
|
3
|
+
class GoGenerator < Rails::Generators::Base
|
4
|
+
desc "This generator will create your app based on the answers you provide."
|
5
|
+
|
6
|
+
def do_magic
|
7
|
+
|
8
|
+
if yes?("Do you want to have multiple users per account? [y|n]")
|
9
|
+
include_accounts = true
|
10
|
+
else
|
11
|
+
include_accounts = false
|
12
|
+
end
|
13
|
+
|
14
|
+
if yes?("Do you want to include ActiveAdmin? [y|n]")
|
15
|
+
include_admin = true
|
16
|
+
else
|
17
|
+
include_admin = false
|
18
|
+
end
|
19
|
+
|
20
|
+
if yes?("Do you want to include a home page? [y|n]")
|
21
|
+
include_home = true
|
22
|
+
else
|
23
|
+
include_home = false
|
24
|
+
end
|
25
|
+
|
26
|
+
gem "paranoia", "~> 2.2"
|
27
|
+
|
28
|
+
generate "autopilot:users"
|
29
|
+
generate "autopilot:routes #{include_home ? '--home' : nil}"
|
30
|
+
|
31
|
+
if include_accounts
|
32
|
+
generate "autopilot:accounts"
|
33
|
+
end
|
34
|
+
|
35
|
+
if include_admin
|
36
|
+
generate "autopilot:admin"
|
37
|
+
end
|
38
|
+
|
39
|
+
rake "db:migrate"
|
40
|
+
run "rails s"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Autopilot
|
2
|
+
module Generators
|
3
|
+
class RoutesGenerator < Rails::Generators::Base
|
4
|
+
desc "Generate basic routes and pages"
|
5
|
+
class_option :home, type: :boolean
|
6
|
+
source_root File.expand_path("../../../templates", __FILE__)
|
7
|
+
|
8
|
+
def do_magic
|
9
|
+
puts "Setting up routes..."
|
10
|
+
@home = options['home']
|
11
|
+
|
12
|
+
template "controllers/pages_controller.rb", "app/controllers/pages_controller.rb"
|
13
|
+
template "views/pages/dash.html.erb", "app/views/pages/dash.html.erb"
|
14
|
+
copy_file "views/layouts/_nav.html.erb", "app/views/layouts/_nav.html.erb"
|
15
|
+
|
16
|
+
inject_into_file 'app/views/layouts/application.html.erb', after: "<body>\n" do <<-'RUBY'
|
17
|
+
<%= render 'layouts/nav' %>
|
18
|
+
RUBY
|
19
|
+
end
|
20
|
+
|
21
|
+
if @home
|
22
|
+
puts "Set up marketing home page..."
|
23
|
+
|
24
|
+
template "views/pages/home.html.erb", "app/views/pages/home.html.erb"
|
25
|
+
template "routes-with-home.rb", "config/routes.rb", force: true
|
26
|
+
|
27
|
+
inject_into_file 'app/views/layouts/_nav.html.erb', after: "<% else %>\n" do <<-'RUBY'
|
28
|
+
<%= link_to "Home", root_path %>
|
29
|
+
RUBY
|
30
|
+
end
|
31
|
+
else
|
32
|
+
template "routes-without-home.rb", "config/routes.rb", force: true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Autopilot
|
2
|
+
module Generators
|
3
|
+
class UsersGenerator < Rails::Generators::Base
|
4
|
+
desc "Generate User model with Devise"
|
5
|
+
|
6
|
+
def do_magic
|
7
|
+
puts "Setting up users & authentication..."
|
8
|
+
gem "devise"
|
9
|
+
Bundler.with_clean_env do
|
10
|
+
run "bundle install"
|
11
|
+
end
|
12
|
+
generate "devise:install"
|
13
|
+
generate "devise User"
|
14
|
+
generate "devise:views"
|
15
|
+
generate "migration AddDeletedAtToUsers deleted_at:datetime:index"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class AccountsController < ApplicationController
|
2
|
+
before_action :authenticate_user!
|
3
|
+
|
4
|
+
def users
|
5
|
+
@users = current_account.users.all
|
6
|
+
end
|
7
|
+
|
8
|
+
def send_user_invite
|
9
|
+
email = params[:user][:email]
|
10
|
+
|
11
|
+
if User.only_deleted.where(email: email).any?
|
12
|
+
user = User.only_deleted.where(email: email).first
|
13
|
+
if user.deleted_at
|
14
|
+
user.restore
|
15
|
+
user.update(account: current_account)
|
16
|
+
user.invite!(user)
|
17
|
+
end
|
18
|
+
else
|
19
|
+
User.invite!(email: email, account: current_account)
|
20
|
+
end
|
21
|
+
|
22
|
+
respond_to do |format|
|
23
|
+
format.html { redirect_to account_users_path, notice: 'Invite sent successfully' }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
devise_for :users
|
3
|
+
|
4
|
+
authenticated :user do
|
5
|
+
root "pages#dash", as: :authenticated_root
|
6
|
+
end
|
7
|
+
|
8
|
+
devise_scope :user do
|
9
|
+
get "join", to: "devise/registrations#new"
|
10
|
+
get "login", to: "devise/sessions#new"
|
11
|
+
get "logout", to: "devise/sessions#destroy"
|
12
|
+
root to: 'pages#home'
|
13
|
+
end
|
14
|
+
|
15
|
+
get "/dash", to: "pages#dash", as: :dash
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Rails.application.routes.draw do
|
2
|
+
devise_for :users
|
3
|
+
|
4
|
+
authenticated :user do
|
5
|
+
root "pages#dash", as: :authenticated_root
|
6
|
+
end
|
7
|
+
|
8
|
+
devise_scope :user do
|
9
|
+
get "join", to: "devise/registrations#new"
|
10
|
+
get "login", to: "devise/sessions#new"
|
11
|
+
get "logout", to: "devise/sessions#destroy"
|
12
|
+
root to: 'devise/sessions#new'
|
13
|
+
end
|
14
|
+
|
15
|
+
get "/dash", to: "pages#dash", as: :dash
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class User < ApplicationRecord
|
2
|
+
acts_as_paranoid
|
3
|
+
devise :database_authenticatable, :registerable, :recoverable,
|
4
|
+
:rememberable, :validatable, :invitable
|
5
|
+
|
6
|
+
belongs_to :account, optional: true
|
7
|
+
|
8
|
+
validates_uniqueness_of :email
|
9
|
+
|
10
|
+
after_create :create_account, unless: :invited_to_sign_up?
|
11
|
+
|
12
|
+
def is_pending
|
13
|
+
owner = Account.find(self.account_id).users.first
|
14
|
+
true unless self.invitation_accepted_at || self == owner
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def create_account
|
20
|
+
if self.account_id.nil?
|
21
|
+
account = Account.create(owner_id: self.id)
|
22
|
+
self.update(account: account)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<h1>Users</h1>
|
2
|
+
|
3
|
+
<% @users.each do |u| %>
|
4
|
+
<div class="user" style="display: flex; border: 1px solid lightgrey; padding: 10px; margin-bottom: 15px;">
|
5
|
+
<p><%= u.email %></p>
|
6
|
+
<% if u.is_pending %>
|
7
|
+
<p class="pending">
|
8
|
+
Invite is pending.
|
9
|
+
<%= link_to "Resend", {
|
10
|
+
controller: 'accounts',
|
11
|
+
action: 'send_user_invite',
|
12
|
+
user: { email: u.email },
|
13
|
+
}, method: :post %>
|
14
|
+
</p>
|
15
|
+
<% end %>
|
16
|
+
</div>
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<h3>Invite your team</h3>
|
20
|
+
<%= form_for [current_account, User.new], url: { action: "send_user_invite" } do |f| %>
|
21
|
+
<%= f.label :email, "Email address" %>
|
22
|
+
<%= f.text_field :email, placeholder: "example@gmail.com", required: true %>
|
23
|
+
<%= f.submit "Send invite" %>
|
24
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<nav>
|
2
|
+
<% if current_user %>
|
3
|
+
<%= link_to "Dash", dash_path %>
|
4
|
+
<%= link_to "Log out", destroy_user_session_path, method: :delete %>
|
5
|
+
<% else %>
|
6
|
+
<%= link_to "Log in", new_user_session_path %>
|
7
|
+
<%= link_to "Create an account", new_user_registration_path %>
|
8
|
+
<% end %>
|
9
|
+
</nav>
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: autopilot-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dylan Feltus
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-05-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 5.2.2
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 5.2.2.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 5.2.2
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 5.2.2.1
|
33
|
+
description: With Autopilot for Rails you can generate a starting point for your next
|
34
|
+
SaaS project. Add accounts with multiple users, Stripe billing, permissions, onboarding
|
35
|
+
flows, and more.
|
36
|
+
email:
|
37
|
+
- contact@dylanfeltus.com
|
38
|
+
executables: []
|
39
|
+
extensions: []
|
40
|
+
extra_rdoc_files: []
|
41
|
+
files:
|
42
|
+
- MIT-LICENSE
|
43
|
+
- README.md
|
44
|
+
- Rakefile
|
45
|
+
- lib/autopilot.rb
|
46
|
+
- lib/generators/autopilot/accounts_generator.rb
|
47
|
+
- lib/generators/autopilot/admin_generator.rb
|
48
|
+
- lib/generators/autopilot/example_generator.rb
|
49
|
+
- lib/generators/autopilot/go_generator.rb
|
50
|
+
- lib/generators/autopilot/routes_generator.rb
|
51
|
+
- lib/generators/autopilot/users_generator.rb
|
52
|
+
- lib/templates/account.rb
|
53
|
+
- lib/templates/controllers/accounts_controller.rb
|
54
|
+
- lib/templates/controllers/application_controller.rb
|
55
|
+
- lib/templates/controllers/pages_controller.rb
|
56
|
+
- lib/templates/routes-with-home.rb
|
57
|
+
- lib/templates/routes-without-home.rb
|
58
|
+
- lib/templates/user.rb
|
59
|
+
- lib/templates/views/accounts/users.html.erb
|
60
|
+
- lib/templates/views/layouts/_nav.html.erb
|
61
|
+
- lib/templates/views/pages/dash.html.erb
|
62
|
+
- lib/templates/views/pages/home.html.erb
|
63
|
+
homepage: https://github.com/stratuslabs/autopilot
|
64
|
+
licenses:
|
65
|
+
- MIT
|
66
|
+
metadata: {}
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
requirements: []
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 2.7.8
|
84
|
+
signing_key:
|
85
|
+
specification_version: 4
|
86
|
+
summary: Generate your next SaaS app using Rails
|
87
|
+
test_files: []
|