bridgetown-plugin-nano 0.2.0
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/.gitignore +38 -0
- data/.rubocop.yml +23 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +30 -0
- data/Rakefile +5 -0
- data/bridgetown-plugin-nano.gemspec +26 -0
- data/lib/bridgetown-plugin-nano.rb +4 -0
- data/lib/bridgetown-plugin-nano/command.rb +112 -0
- data/lib/bridgetown-plugin-nano/command_helpers/database_helpers.rb +42 -0
- data/lib/bridgetown-plugin-nano/command_helpers/email_helpers.rb +28 -0
- data/lib/bridgetown-plugin-nano/command_helpers/general_helpers.rb +46 -0
- data/lib/bridgetown-plugin-nano/command_helpers/jobs_helpers.rb +32 -0
- data/lib/bridgetown-plugin-nano/rack_middleware.rb +4 -0
- data/lib/bridgetown-plugin-nano/rack_middleware/not_found.rb +23 -0
- data/lib/bridgetown-plugin-nano/rack_middleware/static.rb +29 -0
- data/lib/bridgetown-plugin-nano/templates/base_classes/application_job.rb +7 -0
- data/lib/bridgetown-plugin-nano/templates/base_classes/application_mailer.rb +4 -0
- data/lib/bridgetown-plugin-nano/templates/base_classes/application_record.rb +3 -0
- data/lib/bridgetown-plugin-nano/templates/bridgetown_root/Rakefile +16 -0
- data/lib/bridgetown-plugin-nano/templates/bridgetown_root/config.ru.tt +11 -0
- data/lib/bridgetown-plugin-nano/templates/databases/postgresql.yml.tt +85 -0
- data/lib/bridgetown-plugin-nano/templates/email/app/views/layouts/mailer.html.erb +14 -0
- data/lib/bridgetown-plugin-nano/templates/email/app/views/test_mailer/greetings.html.erb +1 -0
- data/lib/bridgetown-plugin-nano/templates/email/config/initializers/email.rb +15 -0
- data/lib/bridgetown-plugin-nano/templates/email/test_mailer.rb +6 -0
- data/lib/bridgetown-plugin-nano/templates/jobs/test_job.rb +7 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/Rakefile +3 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/bin/rails +5 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/config/application.rb +20 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/config/base_classes.rb +2 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/config/boot.rb +3 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/config/initializers/cors.rb +12 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/config/routes.rb.tt +5 -0
- data/lib/bridgetown-plugin-nano/templates/new_app/nano_controller.rb +16 -0
- data/lib/bridgetown-plugin-nano/version.rb +5 -0
- metadata +155 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: a6d4e8b58579fa4420e46b3a7971d43e72f4a93dcf78d9cb478077a3d952ea8e
|
|
4
|
+
data.tar.gz: c38c74346a665fde4cd252ff64e1a5ecdd47b47dc85239ffb5d65e6868f504b0
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 1c50d7e3edc9424bcd3c9c9dd630801f5349f73b8cbe01823a57e727e4a225da02ff4c2a9b8de20065d73eb6b1ec1e261b60c164381609e4dce6a4e4ed9478ce
|
|
7
|
+
data.tar.gz: 489ec22ee1301cd5fd8abb02717edcdea78d22667d08936481cb4422f8a5c7d45a97c991782b3297d3749cf09aa35480f245f31b055f4ef83a7f4b56dc44fd4b
|
data/.gitignore
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/vendor
|
|
2
|
+
/.bundle/
|
|
3
|
+
/.yardoc
|
|
4
|
+
/Gemfile.lock
|
|
5
|
+
/_yardoc/
|
|
6
|
+
/coverage/
|
|
7
|
+
/doc/
|
|
8
|
+
/pkg/
|
|
9
|
+
/spec/reports/
|
|
10
|
+
/tmp/
|
|
11
|
+
*.bundle
|
|
12
|
+
*.so
|
|
13
|
+
*.o
|
|
14
|
+
*.a
|
|
15
|
+
mkmf.log
|
|
16
|
+
*.gem
|
|
17
|
+
Gemfile.lock
|
|
18
|
+
.bundle
|
|
19
|
+
.ruby-version
|
|
20
|
+
|
|
21
|
+
# Node
|
|
22
|
+
node_modules
|
|
23
|
+
.npm
|
|
24
|
+
.node_repl_history
|
|
25
|
+
|
|
26
|
+
# Yarn
|
|
27
|
+
yarn-error.log
|
|
28
|
+
yarn-debug.log*
|
|
29
|
+
.pnp/
|
|
30
|
+
.pnp.js
|
|
31
|
+
|
|
32
|
+
# Yarn Integrity file
|
|
33
|
+
.yarn-integrity
|
|
34
|
+
|
|
35
|
+
spec/dest
|
|
36
|
+
.bridgetown-metadata
|
|
37
|
+
.bridgetown-cache
|
|
38
|
+
.bridgetown-webpack
|
data/.rubocop.yml
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require: rubocop-bridgetown
|
|
2
|
+
|
|
3
|
+
inherit_gem:
|
|
4
|
+
rubocop-bridgetown: .rubocop.yml
|
|
5
|
+
|
|
6
|
+
AllCops:
|
|
7
|
+
TargetRubyVersion: 2.5
|
|
8
|
+
Include:
|
|
9
|
+
- lib/**/*.rb
|
|
10
|
+
|
|
11
|
+
Exclude:
|
|
12
|
+
- .gitignore
|
|
13
|
+
- .rspec
|
|
14
|
+
- .rubocop.yml
|
|
15
|
+
|
|
16
|
+
- Gemfile.lock
|
|
17
|
+
- CHANGELOG.md
|
|
18
|
+
- LICENSE.txt
|
|
19
|
+
- README.md
|
|
20
|
+
|
|
21
|
+
- script/**/*
|
|
22
|
+
- vendor/**/*
|
|
23
|
+
- lib/bridgetown-plugin-nano/templates/**/*
|
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2020-present
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# bridgetown-plugin-nano
|
|
2
|
+
One-step commands to install and configure a Rails-based Nano API backend for Bridgetown
|
|
3
|
+
|
|
4
|
+
**Coming in Q1 2021!**
|
|
5
|
+
|
|
6
|
+
## Installation
|
|
7
|
+
|
|
8
|
+
Run this command to add this plugin to your site's Gemfile:
|
|
9
|
+
|
|
10
|
+
```shell
|
|
11
|
+
$ bundle add bridgetown-plugin-nano -g bridgetown_plugins
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
The plugin will…
|
|
17
|
+
|
|
18
|
+
## Testing
|
|
19
|
+
|
|
20
|
+
* Run `bundle exec rake` to run the test suite
|
|
21
|
+
* Or run `script/cibuild` to validate with Rubocop and test together.
|
|
22
|
+
|
|
23
|
+
## Contributing
|
|
24
|
+
|
|
25
|
+
1. Fork it (https://github.com/bridgetownrb/bridgetown-nano-plugin/fork)
|
|
26
|
+
2. Clone the fork using `git clone` to your local development machine.
|
|
27
|
+
3. Create your feature branch (`git checkout -b my-new-feature`)
|
|
28
|
+
4. Commit your changes (`git commit -am 'Add some feature'`)
|
|
29
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
|
30
|
+
6. Create a new Pull Request
|
data/Rakefile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/bridgetown-plugin-nano/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "bridgetown-plugin-nano"
|
|
7
|
+
spec.version = BridgetownPluginNano::VERSION
|
|
8
|
+
spec.author = "Bridgetown Team"
|
|
9
|
+
spec.email = "maintainers@bridgetownrb.com"
|
|
10
|
+
spec.summary = "Sets up a Rails-based Nano API backend for Bridgetown"
|
|
11
|
+
spec.homepage = "https://github.com/bridgetownrb/bridgetown-plugin-nano"
|
|
12
|
+
spec.license = "MIT"
|
|
13
|
+
|
|
14
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r!^(test|script|spec|features|frontend)/!) }
|
|
15
|
+
spec.test_files = spec.files.grep(%r!^spec/!)
|
|
16
|
+
spec.require_paths = ["lib"]
|
|
17
|
+
|
|
18
|
+
spec.required_ruby_version = ">= 2.5.0"
|
|
19
|
+
|
|
20
|
+
spec.add_dependency "bridgetown", ">= 0.15", "< 2.0"
|
|
21
|
+
spec.add_dependency "rack", ">= 2.2"
|
|
22
|
+
|
|
23
|
+
spec.add_development_dependency "bundler"
|
|
24
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
|
25
|
+
spec.add_development_dependency "rubocop-bridgetown", "~> 0.2"
|
|
26
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_all "bridgetown-core/commands/concerns"
|
|
4
|
+
|
|
5
|
+
require "bridgetown-plugin-nano/command_helpers/database_helpers"
|
|
6
|
+
require "bridgetown-plugin-nano/command_helpers/email_helpers"
|
|
7
|
+
require "bridgetown-plugin-nano/command_helpers/general_helpers"
|
|
8
|
+
require "bridgetown-plugin-nano/command_helpers/jobs_helpers"
|
|
9
|
+
|
|
10
|
+
module BridgetownPluginNano
|
|
11
|
+
module Commands
|
|
12
|
+
class Nano < Thor
|
|
13
|
+
include Thor::Actions
|
|
14
|
+
include Bridgetown::Commands::ConfigurationOverridable
|
|
15
|
+
include DatabaseHelpers
|
|
16
|
+
include EmailHelpers
|
|
17
|
+
include GeneralHelpers
|
|
18
|
+
include JobsHelpers
|
|
19
|
+
|
|
20
|
+
attr_reader :folder_name, :database_prefix
|
|
21
|
+
|
|
22
|
+
Bridgetown::Commands::Registrations.register do
|
|
23
|
+
desc "nano <command>", "Install or interact with the Nano backend"
|
|
24
|
+
subcommand "nano", Nano
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.source_root
|
|
28
|
+
File.expand_path("templates", __dir__)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
desc "new [NAME optional]", "Install a new Nano backend into the destination " \
|
|
32
|
+
'subfolder (default "backend") of the Bridgetown site'
|
|
33
|
+
def new(folder_name = "backend")
|
|
34
|
+
@folder_name = folder_name
|
|
35
|
+
self.destination_root = File.expand_path(folder_name)
|
|
36
|
+
|
|
37
|
+
say_status :nano, %(Setting up Nano in "#{folder_name}")
|
|
38
|
+
directory "new_app", ".", exclude_pattern: %r!DS_Store$!
|
|
39
|
+
|
|
40
|
+
self.destination_root = File.expand_path(".")
|
|
41
|
+
configure_new_nano_app # GeneralHelpers
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
desc "about", "Prints information about your Rails configuration"
|
|
45
|
+
def about
|
|
46
|
+
determine_folder_name
|
|
47
|
+
system("cd #{folder_name} && bundle exec rails about")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
desc "database TYPE:PREFIX", 'Configure a database (types: "postgresql") and ' \
|
|
51
|
+
"use prefix in database name"
|
|
52
|
+
def database(type_prefix)
|
|
53
|
+
# NOTE: self.database_prefix is accessed by the YAML template
|
|
54
|
+
dbtype, @database_prefix = type_prefix.split(":")
|
|
55
|
+
|
|
56
|
+
determine_folder_name
|
|
57
|
+
|
|
58
|
+
case dbtype
|
|
59
|
+
when "postgresql"
|
|
60
|
+
setup_postgresql
|
|
61
|
+
else
|
|
62
|
+
raise "The #{dbtype} database type is not supported"
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
finish_database_setup # DatabaseHelpers
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
desc "email", "Configure ActionMailer for sending emails"
|
|
69
|
+
def email
|
|
70
|
+
determine_folder_name
|
|
71
|
+
configure_action_mailer
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
desc "jobs", "Configure ActiveJob for async background tasks"
|
|
75
|
+
def jobs
|
|
76
|
+
determine_folder_name
|
|
77
|
+
configure_active_job
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
desc "exec", "Execute any Rails subcommand"
|
|
81
|
+
def exec(*args)
|
|
82
|
+
determine_folder_name
|
|
83
|
+
system("cd #{folder_name} && bundle exec rails #{args.join(" ")}")
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
desc "console", %(Rails console (short-cut alias: "c"))
|
|
87
|
+
def console
|
|
88
|
+
determine_folder_name
|
|
89
|
+
system("cd #{folder_name} && bundle exec rails console")
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
desc "generate", %(Rails generator (short-cut alias: "g"))
|
|
93
|
+
def generate(*args)
|
|
94
|
+
determine_folder_name
|
|
95
|
+
system("cd #{folder_name} && bundle exec rails generate #{args.join(" ")}")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
def determine_folder_name
|
|
101
|
+
rackfile = File.read("config.ru")
|
|
102
|
+
matches = %r!require_relative "\./(.*?)/config/application"!.match(rackfile)
|
|
103
|
+
if matches
|
|
104
|
+
@folder_name = matches[1]
|
|
105
|
+
else
|
|
106
|
+
raise "Nano backend folder could not be determined. Is there an" \
|
|
107
|
+
"appropriate require_relative statement in your config.ru file?"
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BridgetownPluginNano
|
|
4
|
+
module Commands
|
|
5
|
+
class Nano < Thor
|
|
6
|
+
module DatabaseHelpers
|
|
7
|
+
def setup_postgresql
|
|
8
|
+
template "databases/postgresql.yml", "#{folder_name}/config/database.yml"
|
|
9
|
+
|
|
10
|
+
create_file "#{folder_name}/db/.keep", ""
|
|
11
|
+
|
|
12
|
+
append_to_file "Gemfile" do
|
|
13
|
+
<<~RUBY
|
|
14
|
+
|
|
15
|
+
if ENV["RAILS_ENV"]
|
|
16
|
+
gem "pg"
|
|
17
|
+
end
|
|
18
|
+
RUBY
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def finish_database_setup
|
|
23
|
+
self.destination_root = File.expand_path(folder_name)
|
|
24
|
+
|
|
25
|
+
append_to_file(
|
|
26
|
+
"config/base_classes.rb",
|
|
27
|
+
"\n" + File.read("#{self.class.source_root}/base_classes/application_record.rb")
|
|
28
|
+
)
|
|
29
|
+
inject_into_file "config/application.rb",
|
|
30
|
+
"require \"active_record/railtie\"\n",
|
|
31
|
+
after: "require \"action_controller/railtie\"\n"
|
|
32
|
+
|
|
33
|
+
say_status :nano, "Database configuration complete!"
|
|
34
|
+
say_status :nano, "You will need a RAILS_ENV environment variable set,"
|
|
35
|
+
say_status :nano, "then run `bundle install`."
|
|
36
|
+
say_status :nano, "Afterwards, you can now run commands like" \
|
|
37
|
+
" `bridgetown nano exec db:setup` to create your database."
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BridgetownPluginNano
|
|
4
|
+
module Commands
|
|
5
|
+
class Nano < Thor
|
|
6
|
+
module EmailHelpers
|
|
7
|
+
def configure_action_mailer
|
|
8
|
+
self.destination_root = File.expand_path(folder_name)
|
|
9
|
+
|
|
10
|
+
say_status :nano, %(Setting up ActionMailer in "#{folder_name}")
|
|
11
|
+
directory "email", ".", exclude_pattern: %r!DS_Store$!
|
|
12
|
+
inject_into_file "config/application.rb",
|
|
13
|
+
"require \"action_mailer/railtie\"\n",
|
|
14
|
+
after: "require \"action_controller/railtie\"\n"
|
|
15
|
+
append_to_file(
|
|
16
|
+
"config/base_classes.rb",
|
|
17
|
+
"\n" + File.read("#{self.class.source_root}/base_classes/application_mailer.rb")
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
say_status :nano, "ActionMailer configuration complete!"
|
|
21
|
+
say_status :nano, "Take a look at #{folder_name}/test_mailer.rb for an example mailer,"
|
|
22
|
+
say_status :nano, "and #{folder_name}/config/initializers/email.rb to set " \
|
|
23
|
+
"up your SMTP connection."
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BridgetownPluginNano
|
|
4
|
+
module Commands
|
|
5
|
+
class Nano < Thor
|
|
6
|
+
module GeneralHelpers
|
|
7
|
+
def configure_new_nano_app # rubocop:disable Metrics/MethodLength
|
|
8
|
+
template "bridgetown_root/config.ru", "config.ru"
|
|
9
|
+
copy_file "bridgetown_root/Rakefile", "Rakefile"
|
|
10
|
+
|
|
11
|
+
gsub_file "start.js",
|
|
12
|
+
'sleep 4; yarn serve --port " + port',
|
|
13
|
+
'sleep 4; bundle exec rake nano:start -- --port=" + port'
|
|
14
|
+
gsub_file "webpack.config.js",
|
|
15
|
+
%(const path = require("path");\n),
|
|
16
|
+
%(const path = require("path");\nconst webpack = require("webpack");\n)
|
|
17
|
+
|
|
18
|
+
inject_into_file "webpack.config.js", <<-JS, after: "\n plugins: [\n"
|
|
19
|
+
new webpack.DefinePlugin({
|
|
20
|
+
NANO_API_URL: JSON.stringify(process.env.NANO_API_URL || "")
|
|
21
|
+
}),
|
|
22
|
+
JS
|
|
23
|
+
|
|
24
|
+
append_to_file "Gemfile" do
|
|
25
|
+
<<~RUBY
|
|
26
|
+
|
|
27
|
+
# Gems required by the Nano backend:
|
|
28
|
+
gem "dotenv"
|
|
29
|
+
gem "puma"
|
|
30
|
+
gem "rails"
|
|
31
|
+
gem "rack-cors"
|
|
32
|
+
RUBY
|
|
33
|
+
end
|
|
34
|
+
Bridgetown.with_unbundled_env do
|
|
35
|
+
run "bundle install", abort_on_failure: true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
logger = Bridgetown.logger
|
|
39
|
+
logger.info ""
|
|
40
|
+
logger.info "Success!".green, "🎉 Your Nano backend was" \
|
|
41
|
+
" generated in #{folder_name.cyan}."
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BridgetownPluginNano
|
|
4
|
+
module Commands
|
|
5
|
+
class Nano < Thor
|
|
6
|
+
module JobsHelpers
|
|
7
|
+
def configure_active_job
|
|
8
|
+
self.destination_root = File.expand_path(folder_name)
|
|
9
|
+
|
|
10
|
+
say_status :nano, %(Setting up ActiveJob in "#{folder_name}")
|
|
11
|
+
directory "jobs", ".", exclude_pattern: %r!DS_Store$!
|
|
12
|
+
inject_into_file "config/application.rb",
|
|
13
|
+
"require \"active_job/railtie\"\n",
|
|
14
|
+
after: "require \"action_controller/railtie\"\n"
|
|
15
|
+
|
|
16
|
+
inject_into_file "config/application.rb",
|
|
17
|
+
"# config.active_job.queue_adapter = :sidekiq\n",
|
|
18
|
+
after: "Rails.logger = config.logger\n"
|
|
19
|
+
append_to_file(
|
|
20
|
+
"config/base_classes.rb",
|
|
21
|
+
"\n" + File.read("#{self.class.source_root}/base_classes/application_job.rb")
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
say_status :nano, "ActiveJob configuration complete!"
|
|
25
|
+
say_status :nano, "Take a look at #{folder_name}/test_job.rb for an example job,"
|
|
26
|
+
say_status :nano, "and #{folder_name}/config/application.rb to set your " \
|
|
27
|
+
"queue backend (such as Sidekiq)."
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BridgetownPluginNano
|
|
4
|
+
module Middleware
|
|
5
|
+
class NotFound
|
|
6
|
+
def initialize(app, path, content_type = "text/html; charset=utf-8")
|
|
7
|
+
@app = app
|
|
8
|
+
@content = File.read(path)
|
|
9
|
+
@length = @content.bytesize.to_s
|
|
10
|
+
@content_type = content_type
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def call(env)
|
|
14
|
+
response = @app.call(env)
|
|
15
|
+
if response[0] == 404
|
|
16
|
+
[404, { "Content-Type" => @content_type, "Content-Length" => @length }, [@content]]
|
|
17
|
+
else
|
|
18
|
+
response
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module BridgetownPluginNano
|
|
4
|
+
module Middleware
|
|
5
|
+
# Based on Rack::TryStatic middleware
|
|
6
|
+
# https://github.com/rack/rack-contrib/blob/master/lib/rack/contrib/try_static.rb
|
|
7
|
+
|
|
8
|
+
class Static
|
|
9
|
+
def initialize(app, options)
|
|
10
|
+
@app = app
|
|
11
|
+
@try = ["", ".html", "index.html", "/index.html", *options[:try]]
|
|
12
|
+
@static = Rack::Static.new(
|
|
13
|
+
->(_) { [404, {}, []] },
|
|
14
|
+
options
|
|
15
|
+
)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def call(env)
|
|
19
|
+
orig_path = env["PATH_INFO"]
|
|
20
|
+
found = nil
|
|
21
|
+
@try.each do |path|
|
|
22
|
+
resp = @static.call(env.merge!({ "PATH_INFO" => orig_path + path }))
|
|
23
|
+
break if !(403..405).cover?(resp[0]) && (found = resp)
|
|
24
|
+
end
|
|
25
|
+
found || @app.call(env.merge!("PATH_INFO" => orig_path))
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
class ApplicationJob < ActiveJob::Base
|
|
2
|
+
# Automatically retry jobs that encountered a deadlock
|
|
3
|
+
# retry_on ActiveRecord::Deadlocked
|
|
4
|
+
|
|
5
|
+
# Most jobs are safe to ignore if the underlying records are no longer available
|
|
6
|
+
# discard_on ActiveJob::DeserializationError
|
|
7
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require "rake"
|
|
2
|
+
|
|
3
|
+
namespace :nano do
|
|
4
|
+
desc "Boot up both the Bridgetown watcher and Puma/Rack"
|
|
5
|
+
task :start do
|
|
6
|
+
args = ARGV[1..].reject {|arg| arg == "--" }
|
|
7
|
+
|
|
8
|
+
trap("SIGINT") do
|
|
9
|
+
puts "- Stopping Bridgetown & Puma"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
Process.spawn("bundle exec bridgetown build -w")
|
|
13
|
+
Process.spawn("bundle exec puma #{args.join(' ')}")
|
|
14
|
+
Process.waitall
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require "dotenv/load"
|
|
2
|
+
require "bridgetown-plugin-nano/rack_middleware"
|
|
3
|
+
require_relative "./<%= folder_name %>/config/application"
|
|
4
|
+
|
|
5
|
+
if Dir.exist?("output")
|
|
6
|
+
# Only use static middleware if the output folder exists:
|
|
7
|
+
use BridgetownPluginNano::Middleware::Static, root: "output", urls: %w[/]
|
|
8
|
+
use BridgetownPluginNano::Middleware::NotFound, "output/404.html"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
run NanoAPI
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# PostgreSQL. Versions 9.3 and up are supported.
|
|
2
|
+
#
|
|
3
|
+
# Install the pg driver:
|
|
4
|
+
# gem install pg
|
|
5
|
+
# On macOS with Homebrew:
|
|
6
|
+
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
|
|
7
|
+
# On macOS with MacPorts:
|
|
8
|
+
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
|
|
9
|
+
# On Windows:
|
|
10
|
+
# gem install pg
|
|
11
|
+
# Choose the win32 build.
|
|
12
|
+
# Install PostgreSQL and put its /bin directory on your path.
|
|
13
|
+
#
|
|
14
|
+
# Configure Using Gemfile
|
|
15
|
+
# gem 'pg'
|
|
16
|
+
#
|
|
17
|
+
default: &default
|
|
18
|
+
adapter: postgresql
|
|
19
|
+
encoding: unicode
|
|
20
|
+
# For details on connection pooling, see Rails configuration guide
|
|
21
|
+
# https://guides.rubyonrails.org/configuring.html#database-pooling
|
|
22
|
+
pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
|
|
23
|
+
|
|
24
|
+
development:
|
|
25
|
+
<<: *default
|
|
26
|
+
database: <%= database_prefix %>_development
|
|
27
|
+
|
|
28
|
+
# The specified database role being used to connect to postgres.
|
|
29
|
+
# To create additional roles in postgres see `$ createuser --help`.
|
|
30
|
+
# When left blank, postgres will use the default role. This is
|
|
31
|
+
# the same name as the operating system user that initialized the database.
|
|
32
|
+
#username: <%= database_prefix %>
|
|
33
|
+
|
|
34
|
+
# The password associated with the postgres role (username).
|
|
35
|
+
#password:
|
|
36
|
+
|
|
37
|
+
# Connect on a TCP socket. Omitted by default since the client uses a
|
|
38
|
+
# domain socket that doesn't need configuration. Windows does not have
|
|
39
|
+
# domain sockets, so uncomment these lines.
|
|
40
|
+
#host: localhost
|
|
41
|
+
|
|
42
|
+
# The TCP port the server listens on. Defaults to 5432.
|
|
43
|
+
# If your server runs on a different port number, change accordingly.
|
|
44
|
+
#port: 5432
|
|
45
|
+
|
|
46
|
+
# Schema search path. The server defaults to $user,public
|
|
47
|
+
#schema_search_path: myapp,sharedapp,public
|
|
48
|
+
|
|
49
|
+
# Minimum log levels, in increasing order:
|
|
50
|
+
# debug5, debug4, debug3, debug2, debug1,
|
|
51
|
+
# log, notice, warning, error, fatal, and panic
|
|
52
|
+
# Defaults to warning.
|
|
53
|
+
#min_messages: notice
|
|
54
|
+
|
|
55
|
+
# Warning: The database defined as "test" will be erased and
|
|
56
|
+
# re-generated from your development database when you run "rake".
|
|
57
|
+
# Do not set this db to the same as development or production.
|
|
58
|
+
test:
|
|
59
|
+
<<: *default
|
|
60
|
+
database: <%= database_prefix %>_test
|
|
61
|
+
|
|
62
|
+
# As with config/credentials.yml, you never want to store sensitive information,
|
|
63
|
+
# like your database password, in your source code. If your source code is
|
|
64
|
+
# ever seen by anyone, they now have access to your database.
|
|
65
|
+
#
|
|
66
|
+
# Instead, provide the password as a unix environment variable when you boot
|
|
67
|
+
# the app. Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
|
|
68
|
+
# for a full rundown on how to provide these environment variables in a
|
|
69
|
+
# production deployment.
|
|
70
|
+
#
|
|
71
|
+
# On Heroku and other platform providers, you may have a full connection URL
|
|
72
|
+
# available as an environment variable. For example:
|
|
73
|
+
#
|
|
74
|
+
# DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
|
|
75
|
+
#
|
|
76
|
+
# You can use this database configuration with:
|
|
77
|
+
#
|
|
78
|
+
# production:
|
|
79
|
+
# url: <%%= ENV['DATABASE_URL'] %>
|
|
80
|
+
#
|
|
81
|
+
production:
|
|
82
|
+
<<: *default
|
|
83
|
+
database: <%= database_prefix %>_production
|
|
84
|
+
username: <%= database_prefix %>
|
|
85
|
+
password: <%%= ENV['<%= database_prefix.upcase %>_DATABASE_PASSWORD'] %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<p>Howdy! Nice to meet you <%= @name %> 😎</p>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# This is only one example of configuring ActionMailer, in this case SendGrid.
|
|
2
|
+
# For more information, read: https://guides.rubyonrails.org/action_mailer_basics.html#action-mailer-configuration
|
|
3
|
+
|
|
4
|
+
Rails.application.configure do
|
|
5
|
+
config.action_mailer.delivery_method = :smtp
|
|
6
|
+
config.action_mailer.smtp_settings = {
|
|
7
|
+
address: "smtp.sendgrid.net",
|
|
8
|
+
port: 587,
|
|
9
|
+
domain: ENV["SENDGRID_DOMAIN"],
|
|
10
|
+
user_name: ENV["SENDGRID_USERNAME"],
|
|
11
|
+
password: ENV["SENDGRID_KEY"],
|
|
12
|
+
authentication: "plain",
|
|
13
|
+
enable_starttls_auto: true
|
|
14
|
+
}
|
|
15
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "action_controller/railtie"
|
|
2
|
+
|
|
3
|
+
class NanoAPI < Rails::Application
|
|
4
|
+
config.root = File.dirname(__dir__) # set the root to `backend`
|
|
5
|
+
config.autoloader = :zeitwerk
|
|
6
|
+
if Rails.env.production?
|
|
7
|
+
config.eager_load = true
|
|
8
|
+
config.cache_classes = true
|
|
9
|
+
else
|
|
10
|
+
config.eager_load = false
|
|
11
|
+
end
|
|
12
|
+
config.autoload_paths << File.dirname(__dir__) # autoload right from `backend`
|
|
13
|
+
config.api_only = true # removes middleware we don't need
|
|
14
|
+
config.logger = ActiveSupport::Logger.new($stdout)
|
|
15
|
+
Rails.logger = config.logger
|
|
16
|
+
config.filter_parameters += [:password]
|
|
17
|
+
config.secret_key_base = ENV["SECRET_KEY_BASE"] # Rails won't boot w/o a secret token for session, cookies, etc.
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
NanoAPI.initialize!
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "rack/cors"
|
|
2
|
+
|
|
3
|
+
Rails.application.config.middleware.insert_before 0, Rack::Cors, logger: (-> { Rails.logger }) do
|
|
4
|
+
allow do
|
|
5
|
+
origins "*"
|
|
6
|
+
|
|
7
|
+
resource "*",
|
|
8
|
+
headers: :any,
|
|
9
|
+
methods: [:get, :post, :delete, :put, :patch, :options, :head],
|
|
10
|
+
max_age: 0
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class NanoController < ApplicationController
|
|
2
|
+
def index
|
|
3
|
+
render json: {
|
|
4
|
+
status: "index route",
|
|
5
|
+
hello: "Howdy! I'm Nano, your friendly neighborhood Ruby on Rails backend. :)",
|
|
6
|
+
current_time: Time.now
|
|
7
|
+
}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def show
|
|
11
|
+
render json: {
|
|
12
|
+
status: "show route",
|
|
13
|
+
id: params[:id]
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: bridgetown-plugin-nano
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.2.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Bridgetown Team
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2021-02-13 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bridgetown
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0.15'
|
|
20
|
+
- - "<"
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '2.0'
|
|
23
|
+
type: :runtime
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
requirements:
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: '0.15'
|
|
30
|
+
- - "<"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.0'
|
|
33
|
+
- !ruby/object:Gem::Dependency
|
|
34
|
+
name: rack
|
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '2.2'
|
|
40
|
+
type: :runtime
|
|
41
|
+
prerelease: false
|
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.2'
|
|
47
|
+
- !ruby/object:Gem::Dependency
|
|
48
|
+
name: bundler
|
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
54
|
+
type: :development
|
|
55
|
+
prerelease: false
|
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '0'
|
|
61
|
+
- !ruby/object:Gem::Dependency
|
|
62
|
+
name: rake
|
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '12.0'
|
|
68
|
+
type: :development
|
|
69
|
+
prerelease: false
|
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '12.0'
|
|
75
|
+
- !ruby/object:Gem::Dependency
|
|
76
|
+
name: rubocop-bridgetown
|
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0.2'
|
|
82
|
+
type: :development
|
|
83
|
+
prerelease: false
|
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '0.2'
|
|
89
|
+
description:
|
|
90
|
+
email: maintainers@bridgetownrb.com
|
|
91
|
+
executables: []
|
|
92
|
+
extensions: []
|
|
93
|
+
extra_rdoc_files: []
|
|
94
|
+
files:
|
|
95
|
+
- ".gitignore"
|
|
96
|
+
- ".rubocop.yml"
|
|
97
|
+
- CHANGELOG.md
|
|
98
|
+
- Gemfile
|
|
99
|
+
- LICENSE.txt
|
|
100
|
+
- README.md
|
|
101
|
+
- Rakefile
|
|
102
|
+
- bridgetown-plugin-nano.gemspec
|
|
103
|
+
- lib/bridgetown-plugin-nano.rb
|
|
104
|
+
- lib/bridgetown-plugin-nano/command.rb
|
|
105
|
+
- lib/bridgetown-plugin-nano/command_helpers/database_helpers.rb
|
|
106
|
+
- lib/bridgetown-plugin-nano/command_helpers/email_helpers.rb
|
|
107
|
+
- lib/bridgetown-plugin-nano/command_helpers/general_helpers.rb
|
|
108
|
+
- lib/bridgetown-plugin-nano/command_helpers/jobs_helpers.rb
|
|
109
|
+
- lib/bridgetown-plugin-nano/rack_middleware.rb
|
|
110
|
+
- lib/bridgetown-plugin-nano/rack_middleware/not_found.rb
|
|
111
|
+
- lib/bridgetown-plugin-nano/rack_middleware/static.rb
|
|
112
|
+
- lib/bridgetown-plugin-nano/templates/base_classes/application_job.rb
|
|
113
|
+
- lib/bridgetown-plugin-nano/templates/base_classes/application_mailer.rb
|
|
114
|
+
- lib/bridgetown-plugin-nano/templates/base_classes/application_record.rb
|
|
115
|
+
- lib/bridgetown-plugin-nano/templates/bridgetown_root/Rakefile
|
|
116
|
+
- lib/bridgetown-plugin-nano/templates/bridgetown_root/config.ru.tt
|
|
117
|
+
- lib/bridgetown-plugin-nano/templates/databases/postgresql.yml.tt
|
|
118
|
+
- lib/bridgetown-plugin-nano/templates/email/app/views/layouts/mailer.html.erb
|
|
119
|
+
- lib/bridgetown-plugin-nano/templates/email/app/views/test_mailer/greetings.html.erb
|
|
120
|
+
- lib/bridgetown-plugin-nano/templates/email/config/initializers/email.rb
|
|
121
|
+
- lib/bridgetown-plugin-nano/templates/email/test_mailer.rb
|
|
122
|
+
- lib/bridgetown-plugin-nano/templates/jobs/test_job.rb
|
|
123
|
+
- lib/bridgetown-plugin-nano/templates/new_app/Rakefile
|
|
124
|
+
- lib/bridgetown-plugin-nano/templates/new_app/bin/rails
|
|
125
|
+
- lib/bridgetown-plugin-nano/templates/new_app/config/application.rb
|
|
126
|
+
- lib/bridgetown-plugin-nano/templates/new_app/config/base_classes.rb
|
|
127
|
+
- lib/bridgetown-plugin-nano/templates/new_app/config/boot.rb
|
|
128
|
+
- lib/bridgetown-plugin-nano/templates/new_app/config/initializers/cors.rb
|
|
129
|
+
- lib/bridgetown-plugin-nano/templates/new_app/config/routes.rb.tt
|
|
130
|
+
- lib/bridgetown-plugin-nano/templates/new_app/nano_controller.rb
|
|
131
|
+
- lib/bridgetown-plugin-nano/version.rb
|
|
132
|
+
homepage: https://github.com/bridgetownrb/bridgetown-plugin-nano
|
|
133
|
+
licenses:
|
|
134
|
+
- MIT
|
|
135
|
+
metadata: {}
|
|
136
|
+
post_install_message:
|
|
137
|
+
rdoc_options: []
|
|
138
|
+
require_paths:
|
|
139
|
+
- lib
|
|
140
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
|
+
requirements:
|
|
142
|
+
- - ">="
|
|
143
|
+
- !ruby/object:Gem::Version
|
|
144
|
+
version: 2.5.0
|
|
145
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
146
|
+
requirements:
|
|
147
|
+
- - ">="
|
|
148
|
+
- !ruby/object:Gem::Version
|
|
149
|
+
version: '0'
|
|
150
|
+
requirements: []
|
|
151
|
+
rubygems_version: 3.1.4
|
|
152
|
+
signing_key:
|
|
153
|
+
specification_version: 4
|
|
154
|
+
summary: Sets up a Rails-based Nano API backend for Bridgetown
|
|
155
|
+
test_files: []
|