potassium 5.2.2 → 5.2.3

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +2 -5
  3. data/CHANGELOG.md +23 -1
  4. data/README.md +1 -1
  5. data/lib/potassium/assets/Makefile.erb +15 -0
  6. data/lib/potassium/assets/README.yml +1 -1
  7. data/lib/potassium/assets/bin/cibuild.erb +5 -5
  8. data/lib/potassium/assets/bin/release +1 -1
  9. data/lib/potassium/assets/docker-compose.ci.yml +1 -1
  10. data/lib/potassium/assets/sidekiq_scheduler.yml +1 -1
  11. data/lib/potassium/cli_options.rb +4 -13
  12. data/lib/potassium/helpers/gem-helpers.rb +1 -1
  13. data/lib/potassium/recipes/api.rb +9 -1
  14. data/lib/potassium/recipes/background_processor.rb +4 -1
  15. data/lib/potassium/recipes/ci.rb +2 -0
  16. data/lib/potassium/recipes/data_migrate.rb +44 -0
  17. data/lib/potassium/recipes/database_container.rb +2 -1
  18. data/lib/potassium/recipes/file_storage.rb +83 -0
  19. data/lib/potassium/recipes/front_end.rb +35 -10
  20. data/lib/potassium/templates/application.rb +3 -5
  21. data/lib/potassium/version.rb +1 -1
  22. data/potassium.gemspec +1 -0
  23. data/spec/features/data_migrate_spec.rb +14 -0
  24. data/spec/features/database_container_spec.rb +0 -4
  25. data/spec/features/file_storage_spec.rb +74 -0
  26. data/spec/features/front_end.rb +9 -6
  27. data/spec/features/heroku_spec.rb +1 -1
  28. data/spec/features/new_project_spec.rb +5 -13
  29. data/spec/spec_helper.rb +4 -0
  30. data/spec/support/potassium_test_helpers.rb +4 -0
  31. metadata +23 -9
  32. data/lib/potassium/assets/aws.rb +0 -1
  33. data/lib/potassium/recipes/active_storage.rb +0 -40
  34. data/lib/potassium/recipes/aws_sdk.rb +0 -7
  35. data/lib/potassium/recipes/paperclip.rb +0 -47
  36. data/spec/features/active_storage_spec.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28763549d04fed43f8cbe7206b9ca47dc79b1d631b1fd338a638ca59e18ec70c
4
- data.tar.gz: f70e44992829f10fa2e5dff986fc6e56d293ab13b5210575b4da8be95784174b
3
+ metadata.gz: b9fb3b1b4a6ac80cce023a76b98629143523145baa3adcdf7a8afa46a56c97a1
4
+ data.tar.gz: 0e99964ae4b0d55e7d8ba7bd610240e22d40203450cb8651009418970bcf16d3
5
5
  SHA512:
6
- metadata.gz: 2714545c45a60fc3981ecb0237f5bbe3ac00f0da0c4384ff8a8f2ee01b37d449008804a196d08b1642c4f931c85f12b8e0b92476cf8bb269fa89c39b18c521ae
7
- data.tar.gz: c113ea96c6e0be9a328d92f55a52f90e65d0ced49a621211e5f055a015804a972d8163d713d2c451e42be15ef86626951e300de6e4c3fa9c1fd3d4d10e4ff31b
6
+ metadata.gz: e759b1f5f9b8ff6a6eebcfa1e60366fb7a4cc188fb1561a2367439155014312f5dcfe168c8a8a1a3e1a2c43de2f6e837cea04cb0746b4452aae5090f5635755b
7
+ data.tar.gz: 7a1ea34a7dde786ab915f79c9b1e59a62bf0f593dd1d331cd0a25284669b66e74d4628b62e4846ce6aeb1bae933ea965ae88fece52b424effad7c82dbeb87ad7
@@ -6,14 +6,11 @@ jobs:
6
6
  shell: /bin/bash --login
7
7
 
8
8
  docker:
9
- - image: circleci/build-image:ubuntu-14.04-XXL-upstart-1189-5614f37
10
- command: /sbin/init
9
+ - image: circleci/ruby:2.5.5-node
11
10
 
12
11
  steps:
13
12
  - checkout
14
- - run: rm -f app/.rvmrc; echo 2.5.1 > app/.ruby-version; rvm use 2.5.1 --default
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:
@@ -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
- storage:
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
@@ -4,6 +4,6 @@ set -e
4
4
 
5
5
  echo 'Release Phase...'
6
6
 
7
- bundle exec rails db:migrate
7
+ bundle exec rails db:migrate:with_data
8
8
 
9
9
  echo 'Release Phase: OK'
@@ -6,6 +6,6 @@ services:
6
6
  context: "."
7
7
  dockerfile: Dockerfile.ci
8
8
  volumes:
9
- - "./vendor/bundle:/usr/local/bundle"
9
+ - "test_data:/usr/local/bundle"
10
10
  environment:
11
11
  RACK_ENV: test
@@ -2,7 +2,7 @@ production:
2
2
  :concurrency: 5
3
3
  :queues:
4
4
  - default
5
- :schedule:
5
+ # :schedule:
6
6
  # an_scheduled_task:
7
7
  # cron: '0 * * * * *' # Runs once per minute
8
8
  # class: ExampleJob
@@ -67,20 +67,11 @@ module Potassium::CliOptions # rubocop:disable Metrics/ModuleLength
67
67
  default_test_value: false
68
68
  },
69
69
  {
70
- type: :switch,
71
- name: "paperclip",
72
- desc: "Whether to include Paperclip as dependency",
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: false
74
+ default_test_value: "active_storage"
84
75
  },
85
76
  {
86
77
  type: :switch,
@@ -69,7 +69,7 @@ module GemHelpers
69
69
  def add_original_rails_gems
70
70
  gemfile_entries.each do |entry|
71
71
  unless entry.commented_out
72
- gather_gem(entry.name, entry.version)
72
+ gather_gem(entry.name, version: entry[:version])
73
73
  end
74
74
  end
75
75
  end
@@ -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', 'app/controllers/concerns/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
- gsub_file("Procfile", /^.*$/m) { |match| "#{match}worker: #{cmd}" } if selected?(:heroku)
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)
@@ -41,6 +41,8 @@ class Recipes::Ci < Rails::AppBuilder
41
41
  compose.add_env('test', 'DB_PORT', '5432')
42
42
  end
43
43
 
44
+ compose.add_volume('test_data')
45
+
44
46
  add_readme_header :ci
45
47
 
46
48
  application 'config.assets.js_compressor = :uglifier', env: 'test'
@@ -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
- - mysql_data:/var/lib/mysql
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', github: 'rails/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 :active_storage
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 :active_storage
73
- create :paperclip
71
+ create :file_storage
74
72
  create :tzinfo
75
73
  create :script
76
74
  create :github
@@ -1,5 +1,5 @@
1
1
  module Potassium
2
- VERSION = "5.2.2"
2
+ VERSION = "5.2.3"
3
3
  RUBY_VERSION = "2.5.5"
4
4
  RAILS_VERSION = "~> 5.2.1"
5
5
  RUBOCOP_VERSION = "~> 0.65.0"
@@ -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
@@ -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 wihtout vue as front end framework" do
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
- expect(run_rubocop).to eq(true)
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
 
@@ -26,6 +26,10 @@ RSpec.configure do |config|
26
26
  create_tmp_directory
27
27
  end
28
28
 
29
+ config.after(:each) do
30
+ docker_cleanup
31
+ end
32
+
29
33
  config.before(:each) do
30
34
  FakeGithub.clear!
31
35
  FakeHeroku.clear!
@@ -47,6 +47,10 @@ module PotassiumTestHelpers
47
47
  end
48
48
  end
49
49
 
50
+ def docker_cleanup
51
+ run_command(`docker-compose -f #{project_path}/docker-compose.yml down --volumes`)
52
+ end
53
+
50
54
  private
51
55
 
52
56
  def tmp_path
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.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: 2019-07-17 00:00:00.000000000 Z
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.4
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
@@ -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,7 +0,0 @@
1
- class Recipes::AwsSdk < Rails::AppBuilder
2
- def create
3
- gather_gem('aws-sdk', '~> 3')
4
-
5
- template("../assets/aws.rb", "config/initializers/aws.rb", force: true)
6
- end
7
- 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