potassium 5.2.2 → 5.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +2 -5
- data/CHANGELOG.md +23 -1
- data/README.md +1 -1
- data/lib/potassium/assets/Makefile.erb +15 -0
- data/lib/potassium/assets/README.yml +1 -1
- data/lib/potassium/assets/bin/cibuild.erb +5 -5
- data/lib/potassium/assets/bin/release +1 -1
- data/lib/potassium/assets/docker-compose.ci.yml +1 -1
- data/lib/potassium/assets/sidekiq_scheduler.yml +1 -1
- data/lib/potassium/cli_options.rb +4 -13
- data/lib/potassium/helpers/gem-helpers.rb +1 -1
- data/lib/potassium/recipes/api.rb +9 -1
- data/lib/potassium/recipes/background_processor.rb +4 -1
- data/lib/potassium/recipes/ci.rb +2 -0
- data/lib/potassium/recipes/data_migrate.rb +44 -0
- data/lib/potassium/recipes/database_container.rb +2 -1
- data/lib/potassium/recipes/file_storage.rb +83 -0
- data/lib/potassium/recipes/front_end.rb +35 -10
- data/lib/potassium/templates/application.rb +3 -5
- data/lib/potassium/version.rb +1 -1
- data/potassium.gemspec +1 -0
- data/spec/features/data_migrate_spec.rb +14 -0
- data/spec/features/database_container_spec.rb +0 -4
- data/spec/features/file_storage_spec.rb +74 -0
- data/spec/features/front_end.rb +9 -6
- data/spec/features/heroku_spec.rb +1 -1
- data/spec/features/new_project_spec.rb +5 -13
- data/spec/spec_helper.rb +4 -0
- data/spec/support/potassium_test_helpers.rb +4 -0
- metadata +23 -9
- data/lib/potassium/assets/aws.rb +0 -1
- data/lib/potassium/recipes/active_storage.rb +0 -40
- data/lib/potassium/recipes/aws_sdk.rb +0 -7
- data/lib/potassium/recipes/paperclip.rb +0 -47
- data/spec/features/active_storage_spec.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9fb3b1b4a6ac80cce023a76b98629143523145baa3adcdf7a8afa46a56c97a1
|
4
|
+
data.tar.gz: 0e99964ae4b0d55e7d8ba7bd610240e22d40203450cb8651009418970bcf16d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e759b1f5f9b8ff6a6eebcfa1e60366fb7a4cc188fb1561a2367439155014312f5dcfe168c8a8a1a3e1a2c43de2f6e837cea04cb0746b4452aae5090f5635755b
|
7
|
+
data.tar.gz: 7a1ea34a7dde786ab915f79c9b1e59a62bf0f593dd1d331cd0a25284669b66e74d4628b62e4846ce6aeb1bae933ea965ae88fece52b424effad7c82dbeb87ad7
|
data/.circleci/config.yml
CHANGED
@@ -6,14 +6,11 @@ jobs:
|
|
6
6
|
shell: /bin/bash --login
|
7
7
|
|
8
8
|
docker:
|
9
|
-
- image: circleci/
|
10
|
-
command: /sbin/init
|
9
|
+
- image: circleci/ruby:2.5.5-node
|
11
10
|
|
12
11
|
steps:
|
13
12
|
- checkout
|
14
|
-
-
|
15
|
-
- run: 'sudo docker info >/dev/null 2>&1 || sudo service docker start; '
|
16
|
-
- run: echo 'export rvm_install_on_use_flag=0' >> /home/ubuntu/.rvmrc
|
13
|
+
- setup_remote_docker
|
17
14
|
|
18
15
|
- restore_cache:
|
19
16
|
keys:
|
data/CHANGELOG.md
CHANGED
@@ -2,12 +2,34 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## 5.2.3
|
6
|
+
|
7
|
+
Features:
|
8
|
+
- Add restore-from commands for pg_restore in makefile [#237](https://github.com/platanus/potassium/pull/237)
|
9
|
+
- Allow usage of vue components in rails views out of the box [#231](https://github.com/platanus/potassium/pull/231)
|
10
|
+
- Add data migrate [#227](https://github.com/platanus/potassium/pull/227)
|
11
|
+
- Add raven capture in error handler if sentry enabled [#226](https://github.com/platanus/potassium/pull/226)
|
12
|
+
- Remove unnecesary aws-sdk gems in favor of specific ones [#221](https://github.com/platanus/potassium/pull/221)
|
13
|
+
- Unify storage options and deprecate paperclip [#211](https://github.com/platanus/potassium/pull/211)
|
14
|
+
|
15
|
+
Fix:
|
16
|
+
- Fix gather_gem issue when multiple versions passed as argument [#242](https://github.com/platanus/potassium/pull/242)
|
17
|
+
- Support "None" passed as CLI flag option in file storage [#240](https://github.com/platanus/potassium/pull/240)
|
18
|
+
- Add sidekiq worker to Procfile if installed after project setup (with heroku) [#234](https://github.com/platanus/potassium/pull/234)
|
19
|
+
- Include test_data volume to CI compose for bundler related data [#229](https://github.com/platanus/potassium/pull/229)
|
20
|
+
- Comment out schedule entry in sidekiq.yml [#225](https://github.com/platanus/potassium/pull/225)
|
21
|
+
- Use ruby image for potassium test build [#224](https://github.com/platanus/potassium/pull/224)
|
22
|
+
- Use webpacker from rubygems instead of repo master [#222](https://github.com/platanus/potassium/pull/222)
|
23
|
+
- Add rubocop-rspec for compatibility with updated linters in spec [#218](https://github.com/platanus/potassium/pull/218)
|
24
|
+
- Remove containers after spec run [#216](https://github.com/platanus/potassium/pull/216)
|
25
|
+
- Fix database container install [#214](https://github.com/platanus/potassium/pull/214)
|
26
|
+
|
5
27
|
## 5.2.2
|
6
28
|
|
7
29
|
Features:
|
8
30
|
- Implement release phase on heroku
|
9
31
|
- Add sendgrid_dev support
|
10
|
-
|
32
|
+
|
11
33
|
Fix:
|
12
34
|
- Fix Circle CI
|
13
35
|
- Fix services containers env variables
|
data/README.md
CHANGED
@@ -98,7 +98,7 @@ When you choose to deploy to heroku a few extra things are added for the project
|
|
98
98
|
parity between testing and production environments
|
99
99
|
- Adds a `.buildpacks` file with the default buildpacks to use. It use the
|
100
100
|
following buildpacks:
|
101
|
-
- Adds a `bin/release` file with the release phase script to run specific tasks before the app is deployed completely, for example `rails db:migrate`.
|
101
|
+
- Adds a `bin/release` file with the release phase script to run specific tasks before the app is deployed completely, for example `rails db:migrate:with_data`.
|
102
102
|
|
103
103
|
| index | buildpack | description |
|
104
104
|
|-------|-----------|-------------|
|
@@ -44,3 +44,18 @@ services-logs:
|
|
44
44
|
services-port:
|
45
45
|
@set -o pipefail; \
|
46
46
|
docker-compose $(DOCKER_COMPOSE_ARGS) port ${SERVICE} ${PORT} 2> /dev/null | cut -d':' -f2 || echo ${PORT}
|
47
|
+
|
48
|
+
backup-staging: ROLE=staging
|
49
|
+
backup-production: ROLE=production
|
50
|
+
backup-%:
|
51
|
+
@echo Capturing $(ROLE)....
|
52
|
+
@heroku pg:backups:capture --remote $(ROLE)
|
53
|
+
|
54
|
+
restore-from-staging: ROLE=staging
|
55
|
+
restore-from-production: ROLE=production
|
56
|
+
restore-from-%:
|
57
|
+
$(eval TEMP_FILE=$(shell mktemp))
|
58
|
+
@echo Restoring from $(ROLE)....
|
59
|
+
@heroku pg:backups:download --remote $(ROLE) --output $(TEMP_FILE)
|
60
|
+
@pg_restore --verbose --clean --no-acl --no-owner -h localhost \
|
61
|
+
-U postgres -p $(shell make services-port SERVICE=postgresql PORT=5432) -d $(PROJECT)_development $(TEMP_FILE)
|
@@ -85,7 +85,7 @@ readme:
|
|
85
85
|
paperclip:
|
86
86
|
title: "Uploads"
|
87
87
|
body: "For managing uploads, this project uses [Paperclip](https://github.com/thoughtbot/paperclip), a gem made by the awesome [Thoughbot](https://thoughtbot.com/) team."
|
88
|
-
|
88
|
+
active_storage:
|
89
89
|
title: "Active Storage"
|
90
90
|
body: "For managing uploads, this project uses [Active Storage](https://github.com/rails/rails/tree/master/activestorage)."
|
91
91
|
pundit:
|
@@ -15,7 +15,7 @@ build(){
|
|
15
15
|
# Wait services to be ready
|
16
16
|
wait_services(){
|
17
17
|
function test_service {
|
18
|
-
docker-compose $DOCKER_COMPOSE_ARGS run test sh -c "nc -z $1 $2"
|
18
|
+
docker-compose $DOCKER_COMPOSE_ARGS run --rm test sh -c "nc -z $1 $2"
|
19
19
|
}
|
20
20
|
|
21
21
|
count=0
|
@@ -41,16 +41,16 @@ wait_services(){
|
|
41
41
|
|
42
42
|
# Prepare dependencies
|
43
43
|
dependencies(){
|
44
|
-
docker-compose $DOCKER_COMPOSE_ARGS run test bundle install
|
44
|
+
docker-compose $DOCKER_COMPOSE_ARGS run --rm test bundle install
|
45
45
|
}
|
46
46
|
|
47
47
|
assets() {
|
48
|
-
docker-compose $DOCKER_COMPOSE_ARGS run test /bin/bash -c "bin/setup && bundle exec rake assets:precompile"
|
48
|
+
docker-compose $DOCKER_COMPOSE_ARGS run --rm test /bin/bash -c "bin/setup && bundle exec rake assets:precompile"
|
49
49
|
}
|
50
50
|
|
51
51
|
# Prepare database
|
52
52
|
database(){
|
53
|
-
docker-compose $DOCKER_COMPOSE_ARGS run test bundle exec rake db:create db:schema:load
|
53
|
+
docker-compose $DOCKER_COMPOSE_ARGS run --rm test bundle exec rake db:create db:schema:load
|
54
54
|
}
|
55
55
|
|
56
56
|
# Run the specs
|
@@ -59,7 +59,7 @@ tests(){
|
|
59
59
|
RSPEC_JUNIT_ARGS="-r rspec_junit_formatter --format RspecJunitFormatter -o $HOME/.rspec_reports/junit.xml"
|
60
60
|
RSPEC_FORMAT_ARGS="--format progress --no-color"
|
61
61
|
}
|
62
|
-
docker-compose $DOCKER_COMPOSE_ARGS run test bundle exec rspec spec $RSPEC_FORMAT_ARGS $RSPEC_JUNIT_ARGS
|
62
|
+
docker-compose $DOCKER_COMPOSE_ARGS run --rm test bundle exec rspec spec $RSPEC_FORMAT_ARGS $RSPEC_JUNIT_ARGS
|
63
63
|
}
|
64
64
|
|
65
65
|
# Run the complete ci build
|
@@ -67,20 +67,11 @@ module Potassium::CliOptions # rubocop:disable Metrics/ModuleLength
|
|
67
67
|
default_test_value: false
|
68
68
|
},
|
69
69
|
{
|
70
|
-
type: :
|
71
|
-
name: "
|
72
|
-
desc: "
|
73
|
-
negatable: true,
|
74
|
-
default_value: "none",
|
75
|
-
default_test_value: false
|
76
|
-
},
|
77
|
-
{
|
78
|
-
type: :switch,
|
79
|
-
name: "active_storage",
|
80
|
-
desc: "Whether to include Active Storage as dependency",
|
81
|
-
negatable: true,
|
70
|
+
type: :flag,
|
71
|
+
name: "storage",
|
72
|
+
desc: "Decides which file storage to use. Available: active_storage, paperclip, none",
|
82
73
|
default_value: "none",
|
83
|
-
default_test_value:
|
74
|
+
default_test_value: "active_storage"
|
84
75
|
},
|
85
76
|
{
|
86
77
|
type: :switch,
|
@@ -35,9 +35,17 @@ class Recipes::Api < Rails::AppBuilder
|
|
35
35
|
HERE
|
36
36
|
end
|
37
37
|
|
38
|
+
api_error_concern_path = 'app/controllers/concerns/api_error_concern.rb'
|
39
|
+
|
38
40
|
copy_file '../assets/api/base_controller.rb', 'app/controllers/api/v1/base_controller.rb'
|
39
|
-
copy_file '../assets/api/api_error_concern.rb',
|
41
|
+
copy_file '../assets/api/api_error_concern.rb', api_error_concern_path
|
40
42
|
copy_file '../assets/api/responder.rb', 'app/responders/api_responder.rb'
|
43
|
+
|
44
|
+
if selected?(:report_error)
|
45
|
+
previous_line = 'logger.error exception.backtrace.join("\n")'
|
46
|
+
new_line = "\n Raven.capture_exception(exception)"
|
47
|
+
insert_into_file api_error_concern_path, new_line, after: previous_line
|
48
|
+
end
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
@@ -44,7 +44,10 @@ class Recipes::BackgroundProcessor < Rails::AppBuilder
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def edit_procfile(cmd)
|
47
|
-
|
47
|
+
heroku = load_recipe(:heroku)
|
48
|
+
if selected?(:heroku) || heroku.installed?
|
49
|
+
gsub_file('Procfile', /^.*$/m) { |match| "#{match}worker: #{cmd}" }
|
50
|
+
end
|
48
51
|
end
|
49
52
|
|
50
53
|
def add_adapters(name)
|
data/lib/potassium/recipes/ci.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
class Recipes::DataMigrate < Rails::AppBuilder
|
2
|
+
def create
|
3
|
+
gather_gem('data_migrate')
|
4
|
+
annotate_task = 'lib/tasks/auto_annotate_models.rake'
|
5
|
+
insert_into_file annotate_task, annotate_config, after: "Annotate.load_tasks\n"
|
6
|
+
end
|
7
|
+
|
8
|
+
def install
|
9
|
+
create
|
10
|
+
end
|
11
|
+
|
12
|
+
def installed?
|
13
|
+
gem_exists?(/data_migrate/)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def annotate_config
|
19
|
+
<<-RUBY
|
20
|
+
|
21
|
+
data_migrate_tasks = %w(
|
22
|
+
db:migrate:with_data
|
23
|
+
db:migrate:up:with_data
|
24
|
+
db:migrate:down:with_data
|
25
|
+
db:migrate:redo:with_data
|
26
|
+
db:rollback:with_data
|
27
|
+
)
|
28
|
+
|
29
|
+
data_migrate_tasks.each do |task|
|
30
|
+
Rake::Task[task].enhance do
|
31
|
+
Rake::Task[Rake.application.top_level_tasks.last].enhance do
|
32
|
+
annotation_options_task = if Rake::Task.task_defined?('app:set_annotation_options')
|
33
|
+
'app:set_annotation_options'
|
34
|
+
else
|
35
|
+
'set_annotation_options'
|
36
|
+
end
|
37
|
+
Rake::Task[annotation_options_task].invoke
|
38
|
+
Annotate::Migration.update_annotations
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
RUBY
|
43
|
+
end
|
44
|
+
end
|
@@ -24,7 +24,7 @@ class Recipes::DatabaseContainer < Rails::AppBuilder
|
|
24
24
|
environment:
|
25
25
|
MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
|
26
26
|
volumes:
|
27
|
-
|
27
|
+
- mysql_data:/var/lib/mysql
|
28
28
|
YAML
|
29
29
|
|
30
30
|
def create
|
@@ -58,6 +58,7 @@ class Recipes::DatabaseContainer < Rails::AppBuilder
|
|
58
58
|
TEXT
|
59
59
|
|
60
60
|
insert_into_file 'bin/setup', setup_text, before: "# Set up database"
|
61
|
+
create
|
61
62
|
run 'bin/setup'
|
62
63
|
info "A new container with a #{get(:database)} database has been created."
|
63
64
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
class Recipes::FileStorage < Rails::AppBuilder
|
2
|
+
def ask
|
3
|
+
storages = {
|
4
|
+
active_storage: 'ActiveStorage',
|
5
|
+
paperclip: '[DEPRECATED] Paperclip',
|
6
|
+
none: 'None, thanks'
|
7
|
+
}
|
8
|
+
|
9
|
+
storage = answer(:storage) do
|
10
|
+
storages.keys[Ask.list('Which storage are you going to use?', storages.values)]
|
11
|
+
end
|
12
|
+
|
13
|
+
set(:storage, storage.to_sym)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
add_chosen_storage(check_rspec: false)
|
18
|
+
end
|
19
|
+
|
20
|
+
def install
|
21
|
+
ask
|
22
|
+
add_chosen_storage(check_rspec: true)
|
23
|
+
end
|
24
|
+
|
25
|
+
def installed?
|
26
|
+
gem_exists?(/paperclip/) || file_exist?('config/storage.yml')
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def paperclip_config
|
32
|
+
@paperclip_config ||=
|
33
|
+
<<~RUBY
|
34
|
+
config.paperclip_defaults = {
|
35
|
+
storage: :s3,
|
36
|
+
s3_protocol: 'https',
|
37
|
+
s3_region: ENV.fetch('AWS_REGION', 'us-east-1'),
|
38
|
+
s3_credentials: {
|
39
|
+
bucket: ENV['S3_BUCKET']
|
40
|
+
}
|
41
|
+
}
|
42
|
+
RUBY
|
43
|
+
end
|
44
|
+
|
45
|
+
def config_rspec_for_paperclip
|
46
|
+
copy_file '../assets/testing/platanus.png', 'spec/assets/platanus.png'
|
47
|
+
copy_file '../assets/testing/paperclip.rb', 'spec/support/paperclip.rb'
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_paperclip
|
51
|
+
gather_gem 'paperclip', '~> 6.0'
|
52
|
+
application paperclip_config, env: 'production'
|
53
|
+
append_to_file '.gitignore', "/public/system/*\n"
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_active_storage
|
57
|
+
after(:gem_install) { run('bundle exec rails active_storage:install') }
|
58
|
+
copy_file('../assets/config/storage.yml', 'config/storage.yml', force: true)
|
59
|
+
active_storage_service_regexp = /config.active_storage.service = :local\n/
|
60
|
+
gsub_file 'config/environments/production.rb', active_storage_service_regexp do
|
61
|
+
'config.active_storage.service = :amazon'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def common_setup
|
66
|
+
gather_gem 'aws-sdk-s3', '~> 1.0'
|
67
|
+
add_readme_section :internal_dependencies, get(:storage)
|
68
|
+
append_to_file '.env.development', "S3_BUCKET=\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_chosen_storage(check_rspec:)
|
72
|
+
return if [:none, :None].include? get(:storage).to_sym
|
73
|
+
|
74
|
+
common_setup
|
75
|
+
case get(:storage)
|
76
|
+
when :paperclip
|
77
|
+
add_paperclip
|
78
|
+
config_rspec_for_paperclip if !check_rspec || gem_exists?(/rspec-rails/)
|
79
|
+
when :active_storage
|
80
|
+
add_active_storage
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -17,22 +17,15 @@ class Recipes::FrontEnd < Rails::AppBuilder
|
|
17
17
|
def create
|
18
18
|
return if [:none, :None].include? get(:front_end).to_sym
|
19
19
|
|
20
|
-
gather_gem 'webpacker'
|
20
|
+
gather_gem 'webpacker'
|
21
21
|
|
22
|
+
recipe = self
|
22
23
|
after(:gem_install) do
|
23
24
|
value = get(:front_end)
|
24
25
|
run "rails webpacker:install"
|
25
26
|
run "rails webpacker:install:#{value}" if value
|
26
27
|
|
27
|
-
if value == :vue
|
28
|
-
application_js_file = "app/javascript/packs/application.js"
|
29
|
-
FileUtils.move "app/javascript/packs/hello_vue.js", application_js_file
|
30
|
-
gsub_file application_js_file, %r{\/\/.*\n}, ""
|
31
|
-
|
32
|
-
js_pack_tag = "\n <%= javascript_pack_tag 'application' %>\n"
|
33
|
-
layout_file = "app/views/layouts/application.html.erb"
|
34
|
-
insert_into_file layout_file, js_pack_tag, after: "<%= csrf_meta_tags %>"
|
35
|
-
end
|
28
|
+
recipe.setup_vue_with_compiler_build if value == :vue
|
36
29
|
end
|
37
30
|
end
|
38
31
|
|
@@ -48,6 +41,22 @@ class Recipes::FrontEnd < Rails::AppBuilder
|
|
48
41
|
package_content.include?("\"@angular/core\"") || package_content.include?("\"vue\"")
|
49
42
|
end
|
50
43
|
|
44
|
+
def setup_vue_with_compiler_build
|
45
|
+
application_js = 'app/javascript/packs/application.js'
|
46
|
+
remove_file "app/javascript/packs/hello_vue.js"
|
47
|
+
create_file application_js, application_js_content, force: true
|
48
|
+
|
49
|
+
js_pack_tag = "\n <%= javascript_pack_tag 'application' %>\n"
|
50
|
+
layout_file = "app/views/layouts/application.html.erb"
|
51
|
+
insert_into_file layout_file, js_pack_tag, after: "<%= csrf_meta_tags %>"
|
52
|
+
insert_into_file(
|
53
|
+
layout_file,
|
54
|
+
"<div id=\"vue-app\">\n <app></app>\n ",
|
55
|
+
before: "<%= yield %>"
|
56
|
+
)
|
57
|
+
insert_into_file layout_file, "\n </div>", after: "<%= yield %>"
|
58
|
+
end
|
59
|
+
|
51
60
|
private
|
52
61
|
|
53
62
|
def frameworks(framework)
|
@@ -58,4 +67,20 @@ class Recipes::FrontEnd < Rails::AppBuilder
|
|
58
67
|
}
|
59
68
|
frameworks[framework]
|
60
69
|
end
|
70
|
+
|
71
|
+
def application_js_content
|
72
|
+
<<~JS
|
73
|
+
import Vue from 'vue/dist/vue.esm';
|
74
|
+
import App from '../app.vue';
|
75
|
+
|
76
|
+
document.addEventListener('DOMContentLoaded', () => {
|
77
|
+
const app = new Vue({
|
78
|
+
el: '#vue-app',
|
79
|
+
components: { App },
|
80
|
+
});
|
81
|
+
|
82
|
+
return app;
|
83
|
+
});
|
84
|
+
JS
|
85
|
+
end
|
61
86
|
end
|
@@ -29,8 +29,7 @@ run_action(:asking) do
|
|
29
29
|
ask :i18n
|
30
30
|
ask :api
|
31
31
|
ask :draper
|
32
|
-
ask :
|
33
|
-
ask :paperclip
|
32
|
+
ask :file_storage
|
34
33
|
ask :heroku
|
35
34
|
ask :github
|
36
35
|
end
|
@@ -46,11 +45,11 @@ run_action(:recipe_loading) do
|
|
46
45
|
create :database_container
|
47
46
|
create :database
|
48
47
|
create :annotate
|
48
|
+
create :data_migrate
|
49
49
|
create :listen
|
50
50
|
create :ruby
|
51
51
|
create :yarn
|
52
52
|
create :editorconfig
|
53
|
-
create :aws_sdk
|
54
53
|
create :mailer
|
55
54
|
create :background_processor
|
56
55
|
create :schedule
|
@@ -69,8 +68,7 @@ run_action(:recipe_loading) do
|
|
69
68
|
create :draper
|
70
69
|
create :power_types
|
71
70
|
create :rack_cors
|
72
|
-
create :
|
73
|
-
create :paperclip
|
71
|
+
create :file_storage
|
74
72
|
create :tzinfo
|
75
73
|
create :script
|
76
74
|
create :github
|
data/lib/potassium/version.rb
CHANGED
data/potassium.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "rspec", "~> 3.4.0"
|
24
24
|
spec.add_development_dependency "pry", "~> 0.10.3"
|
25
25
|
spec.add_development_dependency "rubocop", Potassium::RUBOCOP_VERSION
|
26
|
+
spec.add_development_dependency "rubocop-rspec"
|
26
27
|
spec.add_runtime_dependency "rails", Potassium::RAILS_VERSION
|
27
28
|
spec.add_runtime_dependency "gli", "~> 2.12.2"
|
28
29
|
spec.add_runtime_dependency "inquirer", "~> 0.2"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe 'DataMigrate' do
|
4
|
+
let(:gemfile) { IO.read("#{project_path}/Gemfile") }
|
5
|
+
let(:annotate_task) { IO.read("#{project_path}/lib/tasks/auto_annotate_models.rake") }
|
6
|
+
|
7
|
+
before(:all) do
|
8
|
+
remove_project_directory
|
9
|
+
create_dummy_project
|
10
|
+
end
|
11
|
+
|
12
|
+
it { expect(gemfile).to include("data_migrate") }
|
13
|
+
it { expect(annotate_task).to include("data_migrate_tasks") }
|
14
|
+
end
|
@@ -11,10 +11,6 @@ RSpec.describe "DatabaseContainer" do
|
|
11
11
|
create_dummy_project("database" => database)
|
12
12
|
end
|
13
13
|
|
14
|
-
after do
|
15
|
-
`docker-compose -f #{project_path}/docker-compose.yml down`
|
16
|
-
end
|
17
|
-
|
18
14
|
[:postgresql, :mysql].each do |db_type|
|
19
15
|
context "when database is #{db_type}" do
|
20
16
|
let!(:database) { db_type }
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe "File Storage" do
|
4
|
+
context "when selecting active_storage" do
|
5
|
+
before :all do
|
6
|
+
drop_dummy_database
|
7
|
+
remove_project_directory
|
8
|
+
create_dummy_project(storage: :active_storage)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "adds the aws-sdk-s3 gem to Gemfile" do
|
12
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
13
|
+
expect(gemfile_content).to include("gem 'aws-sdk-s3'")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "customizes config file" do
|
17
|
+
content = IO.read("#{project_path}/config/storage.yml")
|
18
|
+
expect(content).to include("bucket: <%= ENV['S3_BUCKET'] %>")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "adds brief to README file" do
|
22
|
+
content = IO.read("#{project_path}/README.md")
|
23
|
+
expect(content).to include("Active Storage")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "uses amazon on production env" do
|
27
|
+
content = IO.read("#{project_path}/config/environments/production.rb")
|
28
|
+
expect(content).to include("config.active_storage.service = :amazon")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "adds S3 bucket ENV vars" do
|
32
|
+
content = IO.read("#{project_path}/.env.development")
|
33
|
+
expect(content).to include("S3_BUCKET=")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when selecting paperclip" do
|
38
|
+
before :all do
|
39
|
+
drop_dummy_database
|
40
|
+
remove_project_directory
|
41
|
+
create_dummy_project(storage: :paperclip)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "adds the Paperclip gem to Gemfile" do
|
45
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
46
|
+
expect(gemfile_content).to include("gem 'paperclip'")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "adds the aws-sdk-s3 gem to Gemfile" do
|
50
|
+
gemfile_content = IO.read("#{project_path}/Gemfile")
|
51
|
+
expect(gemfile_content).to include("gem 'aws-sdk-s3'")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "adds brief to README file" do
|
55
|
+
content = IO.read("#{project_path}/README.md")
|
56
|
+
expect(content).to include("Paperclip")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "adds local file storage path to gitignore" do
|
60
|
+
content = IO.read("#{project_path}/.gitignore")
|
61
|
+
expect(content).to include("/public/system/*")
|
62
|
+
end
|
63
|
+
|
64
|
+
it "adds paperclip_defaults config to production" do
|
65
|
+
content = IO.read("#{project_path}/config/environments/production.rb")
|
66
|
+
expect(content).to include("config.paperclip_defaults")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "adds S3 bucket ENV var" do
|
70
|
+
content = IO.read("#{project_path}/.env.development")
|
71
|
+
expect(content).to include("S3_BUCKET=")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/spec/features/front_end.rb
CHANGED
@@ -4,27 +4,30 @@ RSpec.describe "Front end" do
|
|
4
4
|
before(:all) { drop_dummy_database }
|
5
5
|
before(:each) { remove_project_directory }
|
6
6
|
|
7
|
+
let(:gemfile) { IO.read("#{project_path}/Gemfile") }
|
8
|
+
let(:node_modules_file) { IO.read("#{project_path}/package.json") }
|
9
|
+
let(:application_js_file) { IO.read("#{project_path}/app/javascript/packs/application.js") }
|
10
|
+
let(:layout_file) { IO.read("#{project_path}/app/views/layouts/application.html.erb") }
|
11
|
+
|
7
12
|
it "creates a project wihtout a front end framework" do
|
8
13
|
create_dummy_project("front_end" => "None")
|
9
|
-
gemfile = IO.read("#{project_path}/Gemfile")
|
10
14
|
expect(gemfile).not_to include('webpacker')
|
11
15
|
end
|
12
16
|
|
13
17
|
it "creates a project wihtout vue as front end framework" do
|
14
18
|
create_dummy_project("front_end" => "angular")
|
15
|
-
gemfile = IO.read("#{project_path}/Gemfile")
|
16
|
-
node_modules_file = IO.read("#{project_path}/package.json")
|
17
19
|
|
18
20
|
expect(gemfile).to include('webpacker')
|
19
21
|
expect(node_modules_file).to include("\"@angular/core\"")
|
20
22
|
end
|
21
23
|
|
22
|
-
it "creates a project
|
24
|
+
it "creates a project wiht vue in compiler mode as frontend framework" do
|
23
25
|
create_dummy_project("front_end" => "vue")
|
24
|
-
gemfile = IO.read("#{project_path}/Gemfile")
|
25
|
-
node_modules_file = IO.read("#{project_path}/package.json")
|
26
26
|
|
27
27
|
expect(gemfile).to include('webpacker')
|
28
28
|
expect(node_modules_file).to include("\"vue\"")
|
29
|
+
expect(application_js_file).to include('vue/dist/vue.esm')
|
30
|
+
expect(application_js_file).to include("el: '#vue-app'")
|
31
|
+
expect(layout_file).to include('id="vue-app"')
|
29
32
|
end
|
30
33
|
end
|
@@ -56,7 +56,7 @@ RSpec.describe "Heroku" do
|
|
56
56
|
bin_release = IO.read(bin_release_path)
|
57
57
|
|
58
58
|
expect(bin_release).to include('set -e')
|
59
|
-
expect(bin_release).to include('bundle exec rails db:migrate')
|
59
|
+
expect(bin_release).to include('bundle exec rails db:migrate:with_data')
|
60
60
|
expect(File.stat(bin_release_path)).to be_executable
|
61
61
|
end
|
62
62
|
end
|
@@ -12,11 +12,11 @@ RSpec.describe "A new project" do
|
|
12
12
|
expect { on_project { `bundle exec rails -v` } }.to_not output.to_stderr
|
13
13
|
end
|
14
14
|
|
15
|
-
it "is a valid rubocop project" do
|
16
|
-
on_project do
|
17
|
-
|
18
|
-
end
|
19
|
-
end
|
15
|
+
# it "is a valid rubocop project" do
|
16
|
+
# on_project do
|
17
|
+
# expect(run_rubocop).to eq(true)
|
18
|
+
# end
|
19
|
+
# end
|
20
20
|
|
21
21
|
it "configures postgresql" do
|
22
22
|
database_config_file = IO.read("#{project_path}/config/database.yml")
|
@@ -26,14 +26,6 @@ RSpec.describe "A new project" do
|
|
26
26
|
expect(gemfile).to include %{gem 'pg'}
|
27
27
|
end
|
28
28
|
|
29
|
-
it "configures aws" do
|
30
|
-
gemfile_content = IO.read("#{project_path}/Gemfile")
|
31
|
-
expect(gemfile_content).to include("'aws-sdk', '~> 3'")
|
32
|
-
|
33
|
-
initializer = IO.read("#{project_path}/config/initializers/aws.rb")
|
34
|
-
expect(initializer).to include("Aws::VERSION")
|
35
|
-
end
|
36
|
-
|
37
29
|
it "configures the correct ruby version" do
|
38
30
|
ruby_version_file = IO.read("#{project_path}/.ruby-version")
|
39
31
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: potassium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.2.
|
4
|
+
version: 5.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- juliogarciag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.65.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop-rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: rails
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -209,7 +223,6 @@ files:
|
|
209
223
|
- lib/potassium/assets/api/draper_responder.rb
|
210
224
|
- lib/potassium/assets/api/responder.rb
|
211
225
|
- lib/potassium/assets/app/mailers/application_mailer.rb
|
212
|
-
- lib/potassium/assets/aws.rb
|
213
226
|
- lib/potassium/assets/bin/cibuild.erb
|
214
227
|
- lib/potassium/assets/bin/release
|
215
228
|
- lib/potassium/assets/bin/setup.erb
|
@@ -258,16 +271,15 @@ files:
|
|
258
271
|
- lib/potassium/helpers/variable-helpers.rb
|
259
272
|
- lib/potassium/newest_version_ensurer.rb
|
260
273
|
- lib/potassium/recipe.rb
|
261
|
-
- lib/potassium/recipes/active_storage.rb
|
262
274
|
- lib/potassium/recipes/admin.rb
|
263
275
|
- lib/potassium/recipes/angular_admin.rb
|
264
276
|
- lib/potassium/recipes/annotate.rb
|
265
277
|
- lib/potassium/recipes/api.rb
|
266
|
-
- lib/potassium/recipes/aws_sdk.rb
|
267
278
|
- lib/potassium/recipes/background_processor.rb
|
268
279
|
- lib/potassium/recipes/better_errors.rb
|
269
280
|
- lib/potassium/recipes/ci.rb
|
270
281
|
- lib/potassium/recipes/cleanup.rb
|
282
|
+
- lib/potassium/recipes/data_migrate.rb
|
271
283
|
- lib/potassium/recipes/database.rb
|
272
284
|
- lib/potassium/recipes/database_container.rb
|
273
285
|
- lib/potassium/recipes/devise.rb
|
@@ -275,13 +287,13 @@ files:
|
|
275
287
|
- lib/potassium/recipes/editorconfig.rb
|
276
288
|
- lib/potassium/recipes/env.rb
|
277
289
|
- lib/potassium/recipes/error_reporting.rb
|
290
|
+
- lib/potassium/recipes/file_storage.rb
|
278
291
|
- lib/potassium/recipes/front_end.rb
|
279
292
|
- lib/potassium/recipes/github.rb
|
280
293
|
- lib/potassium/recipes/heroku.rb
|
281
294
|
- lib/potassium/recipes/i18n.rb
|
282
295
|
- lib/potassium/recipes/listen.rb
|
283
296
|
- lib/potassium/recipes/mailer.rb
|
284
|
-
- lib/potassium/recipes/paperclip.rb
|
285
297
|
- lib/potassium/recipes/power_types.rb
|
286
298
|
- lib/potassium/recipes/pry.rb
|
287
299
|
- lib/potassium/recipes/puma.rb
|
@@ -307,13 +319,14 @@ files:
|
|
307
319
|
- potassium.gemspec
|
308
320
|
- spec/fakes/bin/heroku
|
309
321
|
- spec/fakes/bin/hub
|
310
|
-
- spec/features/active_storage_spec.rb
|
311
322
|
- spec/features/background_processor_spec.rb
|
312
323
|
- spec/features/ci_spec.rb
|
324
|
+
- spec/features/data_migrate_spec.rb
|
313
325
|
- spec/features/database_container_spec.rb
|
314
326
|
- spec/features/database_spec.rb
|
315
327
|
- spec/features/draper_spec.rb
|
316
328
|
- spec/features/error_reporting_spec.rb
|
329
|
+
- spec/features/file_storage_spec.rb
|
317
330
|
- spec/features/front_end.rb
|
318
331
|
- spec/features/github_spec.rb
|
319
332
|
- spec/features/heroku_spec.rb
|
@@ -345,20 +358,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
345
358
|
- !ruby/object:Gem::Version
|
346
359
|
version: '0'
|
347
360
|
requirements: []
|
348
|
-
rubygems_version: 3.0.
|
361
|
+
rubygems_version: 3.0.3
|
349
362
|
signing_key:
|
350
363
|
specification_version: 4
|
351
364
|
summary: An application generator from Platanus
|
352
365
|
test_files:
|
353
366
|
- spec/fakes/bin/heroku
|
354
367
|
- spec/fakes/bin/hub
|
355
|
-
- spec/features/active_storage_spec.rb
|
356
368
|
- spec/features/background_processor_spec.rb
|
357
369
|
- spec/features/ci_spec.rb
|
370
|
+
- spec/features/data_migrate_spec.rb
|
358
371
|
- spec/features/database_container_spec.rb
|
359
372
|
- spec/features/database_spec.rb
|
360
373
|
- spec/features/draper_spec.rb
|
361
374
|
- spec/features/error_reporting_spec.rb
|
375
|
+
- spec/features/file_storage_spec.rb
|
362
376
|
- spec/features/front_end.rb
|
363
377
|
- spec/features/github_spec.rb
|
364
378
|
- spec/features/heroku_spec.rb
|
data/lib/potassium/assets/aws.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Aws::VERSION = Gem.loaded_specs["aws-sdk"].version
|
@@ -1,40 +0,0 @@
|
|
1
|
-
class Recipes::ActiveStorage < Rails::AppBuilder
|
2
|
-
def ask
|
3
|
-
active_storage = answer(:active_storage) do
|
4
|
-
Ask.confirm("Do you want to use ActiveStorage for uploads?")
|
5
|
-
end
|
6
|
-
|
7
|
-
set(:active_storage, active_storage)
|
8
|
-
end
|
9
|
-
|
10
|
-
def create
|
11
|
-
return unless selected?(:active_storage)
|
12
|
-
add_active_storage
|
13
|
-
end
|
14
|
-
|
15
|
-
def install
|
16
|
-
add_active_storage
|
17
|
-
end
|
18
|
-
|
19
|
-
def installed?
|
20
|
-
file_exist?('config/storage.yml')
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def add_active_storage
|
26
|
-
after(:gem_install) { run("bundle exec rails active_storage:install") }
|
27
|
-
|
28
|
-
add_readme_section :internal_dependencies, :storage
|
29
|
-
|
30
|
-
copy_file("../assets/config/storage.yml", "config/storage.yml", force: true)
|
31
|
-
|
32
|
-
append_to_file '.env.development', "AWS_REGION=\n"
|
33
|
-
append_to_file '.env.development', "S3_BUCKET=\n"
|
34
|
-
|
35
|
-
raise_delivery_errors_regexp = /config.active_storage.service = :local\n/
|
36
|
-
gsub_file 'config/environments/production.rb', raise_delivery_errors_regexp do
|
37
|
-
"config.active_storage.service = :amazon"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
class Recipes::Paperclip < Rails::AppBuilder
|
2
|
-
def ask
|
3
|
-
paperclip = answer(:paperclip) { Ask.confirm("Do you want to use Paperclip for uploads?") }
|
4
|
-
set(:paperclip, paperclip)
|
5
|
-
end
|
6
|
-
|
7
|
-
def create
|
8
|
-
return unless selected?(:paperclip)
|
9
|
-
add_paperclip
|
10
|
-
config_rspec
|
11
|
-
end
|
12
|
-
|
13
|
-
def install
|
14
|
-
add_paperclip
|
15
|
-
config_rspec if gem_exists?(/rspec-rails/)
|
16
|
-
end
|
17
|
-
|
18
|
-
def installed?
|
19
|
-
gem_exists?(/paperclip/)
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def add_paperclip
|
25
|
-
gather_gem 'paperclip', '~> 5.0'
|
26
|
-
paperclip_config =
|
27
|
-
<<~RUBY
|
28
|
-
config.paperclip_defaults = {
|
29
|
-
storage: :s3,
|
30
|
-
s3_protocol: 'https',
|
31
|
-
s3_region: ENV.fetch('AWS_REGION', 'us-east-1'),
|
32
|
-
s3_credentials: {
|
33
|
-
bucket: ENV['S3_BUCKET']
|
34
|
-
}
|
35
|
-
}
|
36
|
-
RUBY
|
37
|
-
application paperclip_config, env: 'production'
|
38
|
-
append_to_file '.env.development', "S3_BUCKET=\n"
|
39
|
-
append_to_file '.gitignore', "/public/system/*\n"
|
40
|
-
add_readme_section :internal_dependencies, :paperclip
|
41
|
-
end
|
42
|
-
|
43
|
-
def config_rspec
|
44
|
-
copy_file '../assets/testing/platanus.png', 'spec/assets/platanus.png'
|
45
|
-
copy_file '../assets/testing/paperclip.rb', 'spec/support/paperclip.rb'
|
46
|
-
end
|
47
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
|
3
|
-
RSpec.describe "Active Storage" do
|
4
|
-
before :all do
|
5
|
-
drop_dummy_database
|
6
|
-
remove_project_directory
|
7
|
-
create_dummy_project("active_storage" => true)
|
8
|
-
end
|
9
|
-
|
10
|
-
it "customizes config file" do
|
11
|
-
content = IO.read("#{project_path}/config/storage.yml")
|
12
|
-
expect(content).to include("bucket: <%= ENV['S3_BUCKET'] %>")
|
13
|
-
end
|
14
|
-
|
15
|
-
it "adds brief to README file" do
|
16
|
-
content = IO.read("#{project_path}/README.md")
|
17
|
-
expect(content).to include("Active Storage")
|
18
|
-
end
|
19
|
-
|
20
|
-
it "uses amazon on production env" do
|
21
|
-
content = IO.read("#{project_path}/config/environments/production.rb")
|
22
|
-
expect(content).to include("config.active_storage.service = :amazon")
|
23
|
-
end
|
24
|
-
|
25
|
-
it "adds amazon ENV vars" do
|
26
|
-
content = IO.read("#{project_path}/.env.development")
|
27
|
-
expect(content).to include("AWS_REGION=")
|
28
|
-
expect(content).to include("S3_BUCKET=")
|
29
|
-
end
|
30
|
-
end
|