panacea-rails 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rubocop.yml +17 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +69 -0
- data/LICENSE.txt +21 -0
- data/README.md +39 -0
- data/Rakefile +21 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/config/questions.yml +318 -0
- data/exe/panacea +9 -0
- data/lib/panacea/rails.rb +77 -0
- data/lib/panacea/rails/arguments_parser.rb +27 -0
- data/lib/panacea/rails/customizer.rb +164 -0
- data/lib/panacea/rails/generator.rb +316 -0
- data/lib/panacea/rails/runner.rb +39 -0
- data/lib/panacea/rails/stats.rb +65 -0
- data/lib/panacea/rails/template.rb +56 -0
- data/lib/panacea/rails/version.rb +7 -0
- data/panacea-rails.gemspec +33 -0
- data/templates/Gemfile.tt +90 -0
- data/templates/PANACEA.tt +188 -0
- data/templates/Procfile.tt +11 -0
- data/templates/README.tt +68 -0
- data/templates/Rakefile.tt +10 -0
- data/templates/application_system_test.tt +28 -0
- data/templates/default_locale.tt +4 -0
- data/templates/dotenv.tt +2 -0
- data/templates/githook.tt +3 -0
- data/templates/minitest_test_helper.tt +45 -0
- data/templates/oj_initializer.tt +3 -0
- data/templates/rspec_test_helper.tt +68 -0
- data/templates/rubocop.tt +6 -0
- data/templates/simplecov.tt +7 -0
- metadata +183 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "arguments_parser"
|
4
|
+
require_relative "customizer"
|
5
|
+
|
6
|
+
module Panacea # :nodoc:
|
7
|
+
module Rails # :nodoc:
|
8
|
+
###
|
9
|
+
# == Panacea::Rails::Runner
|
10
|
+
#
|
11
|
+
# This module is where Panacea's work start.
|
12
|
+
module Runner
|
13
|
+
extend ArgumentsParser
|
14
|
+
|
15
|
+
class << self
|
16
|
+
###
|
17
|
+
# This method receives the App's name and the arguments passed to Panacea command.
|
18
|
+
#
|
19
|
+
# It uses the Panacea::Rails::ArgumentsParser.parse_arguments method to transform the passed arguments.
|
20
|
+
#
|
21
|
+
# It also starts the Panacea::Rails::Customizer which is in charge of asking the configuration questions.
|
22
|
+
#
|
23
|
+
# Then, it appends the Panacea's Template option to the list of parsed arguments.
|
24
|
+
#
|
25
|
+
# It finally runs the rails new command with the App's name and the final list of arguments.
|
26
|
+
def call(app_name, rails_args)
|
27
|
+
parsed_arguments = parse_arguments(rails_args)
|
28
|
+
Customizer.start(app_name, parsed_arguments.dup)
|
29
|
+
|
30
|
+
panacea_template = __dir__ + "/template.rb"
|
31
|
+
parsed_arguments << " --template=#{panacea_template}"
|
32
|
+
parsed_arguments = parsed_arguments.split(" ")
|
33
|
+
|
34
|
+
system("rails", "new", app_name, *parsed_arguments)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
require "net/http"
|
5
|
+
|
6
|
+
module Panacea # :nodoc:
|
7
|
+
module Rails # :nodoc:
|
8
|
+
###
|
9
|
+
# == Panacea::Rails::Stats
|
10
|
+
#
|
11
|
+
# This class tracks the end users answers if they agree to.
|
12
|
+
class Stats
|
13
|
+
###
|
14
|
+
# Hash with the question's answers + ruby version + passed arguments
|
15
|
+
attr_reader :params
|
16
|
+
|
17
|
+
###
|
18
|
+
# Panacea's Stats App endpoint
|
19
|
+
API_BASE = "https://stats.panacea.website/statistics"
|
20
|
+
|
21
|
+
###
|
22
|
+
# It sends the end user's answers to the Panacea's Stats App.
|
23
|
+
def self.track(params)
|
24
|
+
new(params)
|
25
|
+
end
|
26
|
+
|
27
|
+
###
|
28
|
+
# Panacea::Rails::Stats initialize method.
|
29
|
+
def initialize(params)
|
30
|
+
@params = params
|
31
|
+
track
|
32
|
+
end
|
33
|
+
|
34
|
+
###
|
35
|
+
# Makes an async call to the Panacea's Stats App.
|
36
|
+
def track
|
37
|
+
request_async_post(params)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def request_async_post(params)
|
43
|
+
Thread.new do
|
44
|
+
request_post(params)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def request_post(params)
|
49
|
+
uri = URI(API_BASE)
|
50
|
+
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |http|
|
51
|
+
request = Net::HTTP::Post.new(uri)
|
52
|
+
request["Accept"] = "application/json"
|
53
|
+
request["Content-Type"] = "application/json"
|
54
|
+
request.body = params.to_json
|
55
|
+
|
56
|
+
http.request(request)
|
57
|
+
end
|
58
|
+
|
59
|
+
response.code == "201" || response.code != "422"
|
60
|
+
rescue Net::OpenTimeout, Errno::ECONNREFUSED
|
61
|
+
false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
###
|
4
|
+
# == Panacea::Rails::Template
|
5
|
+
#
|
6
|
+
# Template passed to the rails new command.
|
7
|
+
#
|
8
|
+
# If you want more information about what's happening you can read Panacea::Rails::Generator docs.
|
9
|
+
|
10
|
+
require "yaml"
|
11
|
+
require_relative "generator"
|
12
|
+
|
13
|
+
###
|
14
|
+
# Panacea's Installation directory
|
15
|
+
ROOT_DIR = File.expand_path("../../../", __dir__)
|
16
|
+
|
17
|
+
# Read .panacea configurations file
|
18
|
+
configurations_file = File.join(ROOT_DIR, ".panacea")
|
19
|
+
panacea_config = YAML.safe_load(File.read(configurations_file))
|
20
|
+
panacea_config["ruby_version"] = RUBY_VERSION
|
21
|
+
|
22
|
+
# Start running Panacea Generator Actions via Rails Generator / Thor
|
23
|
+
panacea_generator = Panacea::Rails::Generator.new(self, panacea_config, ROOT_DIR)
|
24
|
+
|
25
|
+
panacea_generator.update_source_paths
|
26
|
+
panacea_generator.copy_gemfile
|
27
|
+
panacea_generator.copy_readme
|
28
|
+
panacea_generator.generate_panacea_document
|
29
|
+
panacea_generator.setup_rubocop
|
30
|
+
panacea_generator.setup_letter_opener
|
31
|
+
panacea_generator.setup_timezone
|
32
|
+
panacea_generator.setup_default_locale
|
33
|
+
panacea_generator.setup_oj if panacea_config.dig("oj")
|
34
|
+
panacea_generator.setup_dotenv if panacea_config.dig("dotenv")
|
35
|
+
|
36
|
+
panacea_generator.after_bundle_hook do |generator|
|
37
|
+
generator.setup_bullet
|
38
|
+
generator.setup_test_suite
|
39
|
+
generator.override_test_helper
|
40
|
+
generator.setup_simplecov
|
41
|
+
generator.setup_background_job if panacea_config.dig("background_job") != "none"
|
42
|
+
generator.override_application_system_test if panacea_config.dig("headless_chrome")
|
43
|
+
generator.setup_devise if panacea_config.dig("devise")
|
44
|
+
generator.setup_money_rails if panacea_config.dig("money_rails")
|
45
|
+
generator.setup_kaminari if panacea_config.dig("kaminari")
|
46
|
+
generator.setup_webpack if panacea_config.dig("webpack")
|
47
|
+
generator.setup_foreman if panacea_config.dig("foreman")
|
48
|
+
generator.setup_pundit if panacea_config.dig("pundit")
|
49
|
+
|
50
|
+
# This should be always at the end
|
51
|
+
generator.fix_offenses!
|
52
|
+
generator.commit! if panacea_config.dig("autocommit")
|
53
|
+
generator.setup_githook if panacea_config.dig("githook") && !options[:skip_git]
|
54
|
+
|
55
|
+
generator.bye_message
|
56
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require "panacea/rails/version"
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.name = "panacea-rails"
|
10
|
+
spec.version = Panacea::Rails::VERSION
|
11
|
+
spec.authors = ["Guillermo Moreno", "Rafael Ramos", "Eduardo Figarola"]
|
12
|
+
spec.email = ["guillermo@michelada.io", "rafael@michelada.io", "eduardo@michelada.io"]
|
13
|
+
|
14
|
+
spec.summary = "Rails Apps Generator"
|
15
|
+
spec.homepage = "https://www.panacea.website"
|
16
|
+
spec.license = "MIT"
|
17
|
+
|
18
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
19
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
|
+
end
|
21
|
+
spec.bindir = "exe"
|
22
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
|
25
|
+
spec.add_dependency "bundler", "~> 1"
|
26
|
+
spec.add_dependency "slop", "~> 4.6"
|
27
|
+
spec.add_dependency "tty-prompt", "~> 0.17"
|
28
|
+
|
29
|
+
spec.add_development_dependency "minitest", "~> 5.0"
|
30
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
31
|
+
spec.add_development_dependency "rubocop", "~> 0.58"
|
32
|
+
spec.add_development_dependency "sdoc", "~> 1.0"
|
33
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
<%- db_gem = database_gemfile_entry -%>
|
3
|
+
|
4
|
+
source "https://rubygems.org"
|
5
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
6
|
+
|
7
|
+
ruby "<%= @panacea.dig("ruby_version") %>"
|
8
|
+
gem "rails", "~> 5.2.1"
|
9
|
+
gem "<%= db_gem.name %>"<%= %(, '#{db_gem.version}') if db_gem.version %>
|
10
|
+
|
11
|
+
gem "bootsnap", ">= 1.1.0", require: false
|
12
|
+
<% if @panacea.dig("devise") -%>
|
13
|
+
gem "devise"
|
14
|
+
<% end -%>
|
15
|
+
gem "haml-rails"
|
16
|
+
gem "interactor-rails"
|
17
|
+
<% if @panacea.dig("kaminari") -%>
|
18
|
+
gem "kaminari"
|
19
|
+
<% end -%>
|
20
|
+
<% if @panacea.dig("oj") -%>
|
21
|
+
gem "oj", "~> 3"
|
22
|
+
<% end -%>
|
23
|
+
<% if @panacea.dig("money_rails") -%>
|
24
|
+
gem "money-rails", "~> 1"
|
25
|
+
<% end -%>
|
26
|
+
<% if @panacea.dig("pg_search") -%>
|
27
|
+
gem "pg_search"
|
28
|
+
<% end -%>
|
29
|
+
gem "puma", "~> 3.11"
|
30
|
+
<% if @panacea.dig("pundit") -%>
|
31
|
+
gem "pundit"
|
32
|
+
<% end -%>
|
33
|
+
<% if @panacea.dig("markdown") -%>
|
34
|
+
gem "redcarpet"
|
35
|
+
<% end -%>
|
36
|
+
gem "sass-rails", "~> 5.0"
|
37
|
+
gem "turbolinks", "~> 5"
|
38
|
+
gem "uglifier", ">= 1.3.0"
|
39
|
+
<% if @panacea.dig("webpack") -%>
|
40
|
+
gem "webpacker"
|
41
|
+
<% end -%>
|
42
|
+
|
43
|
+
<% if @panacea.dig("background_job") != "none" -%>
|
44
|
+
# Background Jobs Adapter
|
45
|
+
gem "<%= @panacea.dig("background_job") %>"
|
46
|
+
<% end -%>
|
47
|
+
|
48
|
+
# Test Suite Gem
|
49
|
+
gem "<%= @panacea.dig("test_suite") %>-rails", group: [:development, :test]
|
50
|
+
|
51
|
+
group :development, :test do
|
52
|
+
<% if @panacea.dig("awesome_print") -%>
|
53
|
+
gem "awesome_print"
|
54
|
+
<% end -%>
|
55
|
+
<% if @panacea.dig("dotenv") -%>
|
56
|
+
gem "dotenv-rails"
|
57
|
+
<% end -%>
|
58
|
+
<% if @panacea.dig("factory_bot") -%>
|
59
|
+
gem "factory_bot_rails", "~> 4.0"
|
60
|
+
<% end -%>
|
61
|
+
gem "pry"
|
62
|
+
gem "rubocop-rails_config"
|
63
|
+
end
|
64
|
+
|
65
|
+
group :development do
|
66
|
+
gem "brakeman"
|
67
|
+
gem "bullet"
|
68
|
+
gem "web-console", ">= 3.3.0"
|
69
|
+
gem "listen", ">= 3.0.5", "< 3.2"
|
70
|
+
gem "spring"
|
71
|
+
gem "spring-watcher-listen", "~> 2.0.0"
|
72
|
+
gem "letter_opener"
|
73
|
+
end
|
74
|
+
|
75
|
+
group :test do
|
76
|
+
gem "capybara", ">= 2.15", "< 4.0"
|
77
|
+
gem "capybara-selenium"
|
78
|
+
gem "chromedriver-helper"
|
79
|
+
<% if @panacea.dig("faker") -%>
|
80
|
+
gem "faker"
|
81
|
+
<% end -%>
|
82
|
+
gem "selenium-webdriver"
|
83
|
+
gem "simplecov", require: false
|
84
|
+
<% if @panacea.dig("http_stubs") != "none" -%>
|
85
|
+
gem "<%= @panacea.dig("http_stubs") %>"
|
86
|
+
<% end -%>
|
87
|
+
end
|
88
|
+
|
89
|
+
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
90
|
+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|
@@ -0,0 +1,188 @@
|
|
1
|
+
# Panacea::Rails
|
2
|
+
|
3
|
+
Here is what Panacea has setup for you:
|
4
|
+
|
5
|
+
### Application Settings
|
6
|
+
|
7
|
+
#### Timezone
|
8
|
+
|
9
|
+
Default timezone was set to: **<%= @panacea.dig("timezone") %>** in *config/application.rb*
|
10
|
+
|
11
|
+
#### Locale
|
12
|
+
|
13
|
+
Default locale was set to: **<%= @panacea.dig("locale") %>** in *config/application.rb*
|
14
|
+
|
15
|
+
### Development Tools
|
16
|
+
|
17
|
+
<% if @panacea.dig("awesome_print") -%>
|
18
|
+
#### awesome_print
|
19
|
+
The gem was included in Gemfile.
|
20
|
+
<% end -%>
|
21
|
+
|
22
|
+
#### Bullet
|
23
|
+
* The gem was included in Gemfile.
|
24
|
+
* `config/environments/development.rb` was modified.
|
25
|
+
|
26
|
+
<% if @panacea.dig("foreman") -%>
|
27
|
+
#### Foreman
|
28
|
+
* Foreman gem was installed in system if needed.
|
29
|
+
* **Procfile** was created.
|
30
|
+
<% end -%>
|
31
|
+
|
32
|
+
<% if @panacea.dig("githook") -%>
|
33
|
+
#### Git hook
|
34
|
+
The Git hook was installed in *.git/hooks/<%= @panacea.dig("githook_type") %>*
|
35
|
+
<% end -%>
|
36
|
+
|
37
|
+
### General Purpose
|
38
|
+
|
39
|
+
<% if @panacea.dig("devise") -%>
|
40
|
+
#### devise
|
41
|
+
* The gem was included in Gemfile.
|
42
|
+
* `app/models/<%= @panacea.dig("devise_model_name") %>.rb` was created.
|
43
|
+
* <%= @panacea.dig("devise_override_views") ? "Devise views were created." : "Devise views were not created." %>
|
44
|
+
<% end -%>
|
45
|
+
|
46
|
+
<% if @panacea.dig("dotenv") -%>
|
47
|
+
#### dotenv-rails
|
48
|
+
* The gem was included in Gemfile.
|
49
|
+
* `.env` file was created
|
50
|
+
* `.env` file was added to .gitignore
|
51
|
+
<% end -%>
|
52
|
+
|
53
|
+
#### haml-rails
|
54
|
+
The gem was included in Gemfile.
|
55
|
+
|
56
|
+
#### interactor-rails
|
57
|
+
The gem was included in Gemfile.
|
58
|
+
|
59
|
+
<% if @panacea.dig("kaminari") -%>
|
60
|
+
#### Kaminari
|
61
|
+
* The gem was included in Gemfile.
|
62
|
+
* The `rails generate kaminari:config` generator was ran.
|
63
|
+
<% end -%>
|
64
|
+
|
65
|
+
#### letter_opener
|
66
|
+
* The gem was included in Gemfile.
|
67
|
+
* `config/environments/development.rb` was modified.
|
68
|
+
|
69
|
+
<% if @panacea.dig("money_rails") -%>
|
70
|
+
#### money-rails
|
71
|
+
* The gem was included in Gemfile.
|
72
|
+
* The `rails generate money_rails:initializer` generator was ran.
|
73
|
+
<% end -%>
|
74
|
+
|
75
|
+
<% if @panacea.dig("oj") -%>
|
76
|
+
#### oj
|
77
|
+
* The gem was included in Gemfile.
|
78
|
+
* The `config/initializers/oj.rb` file was created
|
79
|
+
<% end -%>
|
80
|
+
|
81
|
+
#### pry
|
82
|
+
The gem was included in Gemfile.
|
83
|
+
|
84
|
+
<% if @panacea.dig("pg_search") -%>
|
85
|
+
#### pg_search
|
86
|
+
The gem was included in Gemfile.
|
87
|
+
<% end -%>
|
88
|
+
|
89
|
+
<% if @panacea.dig("pundit") -%>
|
90
|
+
#### pundit
|
91
|
+
* The gem was included in Gemfile.
|
92
|
+
* `app/controllers/application_controller.rb` was modified.
|
93
|
+
* The `rails generate pundit:install` generator was ran.
|
94
|
+
<% end -%>
|
95
|
+
|
96
|
+
<% if @panacea.dig("markdown") -%>
|
97
|
+
#### redcarpet
|
98
|
+
The gem was included in Gemfile.
|
99
|
+
<% end -%>
|
100
|
+
|
101
|
+
<% if @panacea.dig("webpack") -%>
|
102
|
+
### Assets
|
103
|
+
|
104
|
+
#### webpacker
|
105
|
+
* The gem was included in Gemfile.
|
106
|
+
* **<%= @panacea.dig("webpack_type") %>** was the chosen framework.
|
107
|
+
<% end -%>
|
108
|
+
|
109
|
+
### Background Job
|
110
|
+
|
111
|
+
#### <%= @panacea.dig("background_job") %>
|
112
|
+
<% if @panacea.dig("background_job") != "none" -%>
|
113
|
+
* The gem was included in Gemfile.
|
114
|
+
* `config/application.rb` was modified.
|
115
|
+
<% end -%>
|
116
|
+
<% if @panacea.dig("background_job") =~ /sidekiq|resque/ -%>
|
117
|
+
* `config/routes.rb` were updated.
|
118
|
+
<% end -%>
|
119
|
+
<% if @panacea.dig("background_job") == "resque" -%>
|
120
|
+
* `Rakefile` was updated
|
121
|
+
<% end -%>
|
122
|
+
|
123
|
+
### Security
|
124
|
+
|
125
|
+
#### brakeman
|
126
|
+
The gem was included in Gemfile.
|
127
|
+
|
128
|
+
### Code Coverage
|
129
|
+
|
130
|
+
#### simplecov
|
131
|
+
* The gem was included in Gemfile.
|
132
|
+
* The expected code coverage was set to: <%= @panacea.dig("expected_coverage") %>
|
133
|
+
<% if @panacea.dig("test_suite") == "minitest" -%>
|
134
|
+
* `test/support/simplecov.rb` was created.
|
135
|
+
<% else -%>
|
136
|
+
* `spec/support/simplecov.rb` was created.
|
137
|
+
<% end -%>
|
138
|
+
|
139
|
+
### Linting
|
140
|
+
|
141
|
+
#### rubocop-rails_config
|
142
|
+
* The gem was included in Gemfile.
|
143
|
+
* The `.rubocop.yml` file was created.
|
144
|
+
|
145
|
+
### Testing
|
146
|
+
|
147
|
+
<% if @panacea.dig("factory_bot") -%>
|
148
|
+
#### factory_bot
|
149
|
+
* The gem was included in Gemfile.
|
150
|
+
<% if @panacea.dig("test_suite") == "minitest" -%>
|
151
|
+
* `test/test_helper.rb` was modified.
|
152
|
+
<% else -%>
|
153
|
+
* `spec/rails_helper.rb` was modified.
|
154
|
+
<% end -%>
|
155
|
+
<% end -%>
|
156
|
+
|
157
|
+
<% if @panacea.dig("faker") -%>
|
158
|
+
#### Faker
|
159
|
+
* The gem was included in Gemfile.
|
160
|
+
<% if @panacea.dig("test_suite") == "minitest" -%>
|
161
|
+
* `test/test_helper.rb` was modified.
|
162
|
+
<% else -%>
|
163
|
+
* `spec/rails_helper.rb` was modified.
|
164
|
+
<% end -%>
|
165
|
+
<% end -%>
|
166
|
+
|
167
|
+
#### <%= @panacea.dig("test_suite") %>-rails
|
168
|
+
* The gem was included in Gemfile.
|
169
|
+
<% if @panacea.dig("test_suite") == "minitest" -%>
|
170
|
+
* `test/test_helper.rb` was created.
|
171
|
+
<% else -%>
|
172
|
+
* `spec/rails_helper.rb` was created.
|
173
|
+
<% end -%>
|
174
|
+
|
175
|
+
<% if @panacea.dig("headless_chrome") -%>
|
176
|
+
#### Headless Chrome
|
177
|
+
The System Tests were configured to run using a Headless Chrome Driver.
|
178
|
+
<% end -%>
|
179
|
+
|
180
|
+
<% if @panacea.dig("http_stubs") != "none" -%>
|
181
|
+
#### <%= @panacea.dig("http_stubs") %>
|
182
|
+
* The gem was included in Gemfile.
|
183
|
+
<% if @panacea.dig("test_suite") == "minitest" -%>
|
184
|
+
* `test/test_helper.rb` was modified.
|
185
|
+
<% else -%>
|
186
|
+
* `spec/rails_helper.rb` was modified.
|
187
|
+
<% end -%>
|
188
|
+
<% end -%>
|