potassium 2.3.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3f71e24e05f47b7fb707f13f8c0fca1d2ea0e5c0
4
- data.tar.gz: c384d34410bc2b3550dbaa9e3b862eeb2e823416
3
+ metadata.gz: 3c4a19d0503fea30781bf341b2b73f8356e9ad07
4
+ data.tar.gz: 9de9d7b253c62e7d3c5486204c7a408f4375bc5f
5
5
  SHA512:
6
- metadata.gz: b0e757d2e989811ed3215629d60470f77958919e028814aed72652ac747d85a4398a92c2772559da40d6488a6152e8fa82cd9e4179d37343c451c90de0a92cc8
7
- data.tar.gz: 1b8ea264f0c9567348662c020011b548b467d7bb67210ae1db5ad0205436e1d6f3dbb4d1eca25e8cb618715fd12b39cbb4a590afdb2beb797ffe2428abbdcc08
6
+ metadata.gz: d09d2f6e7342f589e44d54981dd093cd89a3998ef39007e326be9653509fe637cce0e255ffeffea5b6229a7b7416e948b52de17d6888d96125ef507c22a4ba19
7
+ data.tar.gz: db39d009346a0d435f9d6f316205ef9d5e0670637188a92695e2dc33bc0c78ce232236e8e24fa50f9ed52d854e9dc2af32db0b8c45b9cb287dda85d3f1a642fd
data/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 3.0.0
6
+
7
+ Features:
8
+ - Rails 5.0.2
9
+ - `better_errors` and `binding_of_caller` gem in development
10
+ - Update `aws_sdk` to `~> 2.5`
11
+ - Update `paperclip` to `~> 5,0`
12
+ - Add draper gem to decorate models
13
+
5
14
  ## 2.3.0
6
15
 
7
16
  Features:
data/README.md CHANGED
@@ -59,7 +59,7 @@ The following optional integrations are added too:
59
59
  - [ActiveAdminAddons](https://github.com/platanus/activeadmin_addons) for some help with ActiveAdmin.
60
60
  - [Pundit](https://github.com/elabs/pundit) for role-based authorization.
61
61
  - [DelayedJob](https://github.com/collectiveidea/delayed_job) to execute longer tasks in the background.]
62
- - Mailing configuration for [AWS SES](https://github.com/aws/aws-sdk-rails)
62
+ - Mailing configuration for [AWS SES](https://github.com/aws/aws-sdk-rails)
63
63
  and [Sendgrid](https://github.com/platanus/send_grid_mailer) with recipient interceptor support
64
64
  - [Clockwork](https://github.com/Rykian/clockwork) to run scheduled processes
65
65
  - [Sentry](https://sentry.io) to monitor exceptions and errors
@@ -71,7 +71,7 @@ A few more things are added to the project:
71
71
  - Create the github repository for the project (it used `hub` under the hood)
72
72
  - A `bin/setup` script to setup things on a newly cloned project
73
73
  - A `bin/cibuild` script to run continuous integration build on CI
74
- - A `db:fake_data:load` rake task to load fake data for development
74
+ - A `db:fake_data:load` rake task to load fake data for development
75
75
 
76
76
  [pool]: https://devcenter.heroku.com/articles/concurrency-and-database-connections
77
77
 
@@ -141,6 +141,23 @@ Go to https://monkeyci.platan.us, choose the repository from the list and hit
141
141
  [buildpack-deploy-tasks]: http://github.com/gunpowderlabs/buildpack-ruby-rake-deploy-tasks
142
142
  [circle-ci]: https://circleci.com
143
143
 
144
+ ## Development Tools
145
+
146
+ ### Creating a new **Test** project from scratch
147
+
148
+ This is useful when you are adding new recipes to Potassium, and you want to use the `potassium create` command, to check the new functionality without pain.
149
+ To achieve this you need to run, **In the Potassium's root path**, the `bin/potassium_test create` instead of `potassium create` command.
150
+ This command, will do the same as `potassium create` but first:
151
+
152
+ - Will drop any existent database of the test app.
153
+ - Will remove the directory containing a previous version of the test app.
154
+
155
+ It's important to remember that `bin/potassium_test create`:
156
+
157
+ - Does not receive an `app_path` param. It always creates the test project inside `/tmp/dummy_app`
158
+ - Can receive the same options as `potassium create`.
159
+ - Runs with options with a default value. This is to avoid the "asking part" of the creation process. You need to enable what you want to test like this: `$ bin/potassium_test create --clockwork`
160
+
144
161
  ## Contributing
145
162
 
146
163
  If you want to add functionality please go to
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
3
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
4
+
5
+ # require 'potassium/cli'
6
+ require 'potassium/test_cli'
@@ -62,7 +62,7 @@ readme:
62
62
  style_guide:
63
63
  title: "Style Guides"
64
64
  body: |
65
- The style guides are enforced through a self hosted version of [Hound CI](http://monkyeci.platan.us). The style configuration can also be used locally
65
+ The style guides are enforced through a self hosted version of [Hound CI](http://monkeyci.platan.us). The style configuration can also be used locally
66
66
  in development runing `rubocop` or just using the rubocop integration for your text editor of choice.
67
67
 
68
68
  You can add custom rules to this project just adding them to the `.ruby-style.yml` file.
@@ -98,6 +98,9 @@ readme:
98
98
  sentry:
99
99
  title: "Error Reporting"
100
100
  body: "To report our errors we use [Sentry](https://github.com/getsentry/raven-ruby)"
101
+ draper:
102
+ title: "Presentation Layer"
103
+ body: "This project uses [Draper](https://github.com/drapergem/draper) to add an object-oriented layer of presentation logic"
101
104
  seeds:
102
105
  title: "Seeds"
103
106
  body: |
@@ -0,0 +1,62 @@
1
+ class ApiResponder < ActionController::Responder
2
+ def respond
3
+ return display_errors if has_errors?
4
+ return head :no_content if delete?
5
+
6
+ display resource, status_code: status_code
7
+ end
8
+
9
+ private
10
+
11
+ def display(_resource, given_options = {})
12
+ controller.render options.merge(given_options).merge(
13
+ json: serializer.as_json
14
+ )
15
+ end
16
+
17
+ def serializer
18
+ serializer_class = ActiveModel::Serializer.serializer_for(resource)
19
+ if serializer_class.present?
20
+ serializer_options = infer_serializer(serializer_class).merge(options)
21
+ serializer_class.new(decorated_resource, serializer_options)
22
+ else
23
+ decorated_resource
24
+ end
25
+ end
26
+
27
+ def status_code
28
+ return :created if post?
29
+ :ok
30
+ end
31
+
32
+ def display_errors
33
+ controller.render(
34
+ status: :unprocessable_entity,
35
+ json: { msg: "invalid_attributes", errors: format_errors }
36
+ )
37
+ end
38
+
39
+ def format_errors
40
+ resource.errors.as_json
41
+ end
42
+
43
+ def infer_serializer(serializer_class)
44
+ if serializer_class == ActiveModel::ArraySerializer
45
+ s = options.delete(:each_serializer) || "#{resource.klass}Serializer".constantize
46
+ { each_serializer: s }
47
+ else
48
+ s = options.delete(:serializer) || "#{resource.class}Serializer".constantize
49
+ { serializer: s }
50
+ end
51
+ end
52
+
53
+ def decorated_resource
54
+ if resource.respond_to?(:decorate)
55
+ resource.decorate
56
+ else
57
+ resource
58
+ end
59
+ rescue Draper::UninferrableDecoratorError
60
+ resource
61
+ end
62
+ end
@@ -14,7 +14,7 @@ bundle check || bundle install
14
14
  bower install
15
15
 
16
16
  # Set up database
17
- bin/rake db:setup
17
+ bin/rails db:setup
18
18
 
19
19
  # Add binstubs to PATH via export PATH=".git/safe/../../bin:$PATH" in ~/.zshenv
20
20
  mkdir -p .git/safe
@@ -1,4 +1,8 @@
1
+ require 'potassium/cli_options'
2
+
1
3
  module Potassium::CLI
4
+ extend Potassium::CliOptions
5
+
2
6
  desc "Create a new Potassium Rails project."
3
7
  arg 'app_path'
4
8
  command :create do |c|
@@ -8,64 +12,7 @@ module Potassium::CLI
8
12
  desc: "Performs a version check before running.",
9
13
  negatable: true
10
14
 
11
- c.flag [:db, :database],
12
- desc: "Decides which database to use. Available: mysql, postgresql, none"
13
- c.flag "locale",
14
- desc: "Decides which locale to use. Available: es-CL, en"
15
- c.flag [:email_service, :email],
16
- desc: "Decides which email adapter to use. Available: aws_ses, sendgrid, none"
17
- c.switch "devise",
18
- desc: "Whether to use Devise for authentication or not",
19
- negatable: true,
20
- default_value: "none"
21
- c.switch "devise-user-model",
22
- desc: "Whether to create a User model for Devise",
23
- negatable: true,
24
- default_value: "none"
25
- c.switch "admin",
26
- desc: "Whether to use ActiveAdmin or not",
27
- negatable: true,
28
- default_value: "none"
29
- c.switch "angular-admin",
30
- desc: "Whether to use Angular within ActiveAdmin or not",
31
- negatable: true,
32
- default_value: "none"
33
- c.switch "pundit",
34
- desc: "Whether to use Pundit for authorization or not",
35
- negatable: true,
36
- default_value: "none"
37
- c.switch "api",
38
- desc: "Whether to apply the API mode or not",
39
- negatable: true,
40
- default_value: "none"
41
- c.switch "paperclip",
42
- desc: "Whether to include Paperclip as dependency",
43
- negatable: true,
44
- default_value: "none"
45
- c.switch "heroku",
46
- desc: "Whether to prepare to application for Heroku or not",
47
- negatable: true,
48
- default_value: "none"
49
- c.switch "delayed-job",
50
- desc: "Whether to use DelayedJob or not",
51
- negatable: true,
52
- default_value: "none"
53
- c.switch "github",
54
- desc: "Whether to create a github repository",
55
- negatable: true,
56
- default_value: "none"
57
- c.switch "github-private",
58
- desc: "Whether to the github repository is private",
59
- negatable: true,
60
- default_value: false
61
- c.switch "clockwork",
62
- desc: "Whether to use clockwork as job scheduler",
63
- negatable: true,
64
- default_value: "none"
65
- c.switch "sentry",
66
- desc: "Whether to use Sentry as error reporting tool",
67
- negatable: true,
68
- default_value: "none"
15
+ create_options.each { |opts| c.send(opts.delete(:type), opts.delete(:name), opts) }
69
16
 
70
17
  c.action do |_global_options, options, _args|
71
18
  require "potassium/newest_version_ensurer"
data/lib/potassium/cli.rb CHANGED
@@ -4,11 +4,9 @@ require "gli"
4
4
  module Potassium::CLI
5
5
  extend GLI::App
6
6
 
7
- program_desc "Plataus Rails application generator"
8
-
7
+ program_desc "Platanus Rails application generator"
9
8
  version Potassium::VERSION
10
9
  hide_commands_without_desc true
11
-
12
10
  commands_from "potassium/cli/commands"
13
11
 
14
12
  exit Potassium::CLI.run(ARGV)
@@ -0,0 +1,151 @@
1
+ module Potassium::CliOptions # rubocop:disable Metrics/ModuleLength
2
+ CREATE_OPTIONS = [
3
+ {
4
+ type: :flag,
5
+ name: [:db, :database],
6
+ desc: "Decides which database to use. Available: mysql, postgresql, none",
7
+ default_test_value: "postgresql"
8
+ },
9
+ {
10
+ type: :flag,
11
+ name: "locale",
12
+ desc: "Decides which locale to use. Available: es-CL, en",
13
+ default_test_value: "es-CL"
14
+ },
15
+ {
16
+ type: :flag,
17
+ name: [:email_service, :email],
18
+ desc: "Decides which email adapter to use. Available: aws_ses, sendgrid, none",
19
+ default_test_value: "aws_ses"
20
+ },
21
+ {
22
+ type: :switch,
23
+ name: "devise",
24
+ desc: "Whether to use Devise for authentication or not",
25
+ negatable: true,
26
+ default_value: "none",
27
+ default_test_value: false
28
+ },
29
+ {
30
+ type: :switch,
31
+ name: "devise-user-model",
32
+ desc: "Whether to create a User model for Devise",
33
+ negatable: true,
34
+ default_value: "none",
35
+ default_test_value: false
36
+ },
37
+ {
38
+ type: :switch,
39
+ name: "admin",
40
+ desc: "Whether to use ActiveAdmin or not",
41
+ negatable: true,
42
+ default_value: "none",
43
+ default_test_value: false
44
+ },
45
+ {
46
+ type: :switch,
47
+ name: "angular-admin",
48
+ desc: "Whether to use Angular within ActiveAdmin or not",
49
+ negatable: true,
50
+ default_value: "none",
51
+ default_test_value: false
52
+ },
53
+ {
54
+ type: :switch,
55
+ name: "pundit",
56
+ desc: "Whether to use Pundit for authorization or not",
57
+ negatable: true,
58
+ default_value: "none",
59
+ default_test_value: false
60
+ },
61
+ {
62
+ type: :switch,
63
+ name: "api",
64
+ desc: "Whether to apply the API mode or not",
65
+ negatable: true,
66
+ default_value: "none",
67
+ default_test_value: false
68
+ },
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: "heroku",
80
+ desc: "Whether to prepare to application for Heroku or not",
81
+ negatable: true,
82
+ default_value: "none",
83
+ default_test_value: false
84
+ },
85
+ {
86
+ type: :switch,
87
+ name: "delayed-job",
88
+ desc: "Whether to use DelayedJob or not",
89
+ negatable: true,
90
+ default_value: "none",
91
+ default_test_value: false
92
+ },
93
+ {
94
+ type: :switch,
95
+ name: "draper",
96
+ desc: "Whether to use Draper or not",
97
+ negatable: true,
98
+ default_value: "none",
99
+ default_test_value: false
100
+ },
101
+ {
102
+ type: :switch,
103
+ name: "github",
104
+ desc: "Whether to create a github repository",
105
+ negatable: true,
106
+ default_value: "none",
107
+ default_test_value: false
108
+ },
109
+ {
110
+ type: :switch,
111
+ name: "github-private",
112
+ desc: "Whether to the github repository is private",
113
+ negatable: true,
114
+ default_value: false,
115
+ default_test_value: false
116
+ },
117
+ {
118
+ type: :switch,
119
+ name: "clockwork",
120
+ desc: "Whether to use clockwork as job scheduler",
121
+ negatable: true,
122
+ default_value: "none",
123
+ default_test_value: false
124
+ },
125
+ {
126
+ type: :switch,
127
+ name: "sentry",
128
+ desc: "Whether to use Sentry as error reporting tool",
129
+ negatable: true,
130
+ default_value: "none",
131
+ default_test_value: false
132
+ }
133
+ ]
134
+
135
+ def create_options(test_env = false)
136
+ CREATE_OPTIONS.map do |opts|
137
+ opts = opts.dup
138
+ test_default_value = opts.delete(:default_test_value)
139
+ opts[:default_value] = test_default_value if test_env
140
+ opts
141
+ end
142
+ end
143
+
144
+ def create_arguments(test_env = false)
145
+ create_options(test_env).inject({}) do |memo, opts|
146
+ opt = opts[:name].is_a?(Array) ? opts[:name].first : opts[:name]
147
+ memo[opt.to_s] = opts[:default_value]
148
+ memo
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,15 @@
1
+ module RubocopHelpers
2
+ def rubocop_revision
3
+ fix_environments
4
+ end
5
+
6
+ private
7
+
8
+ def fix_environments
9
+ # Style problem in Rails 5 production environments
10
+ file_name = "config/environments/production.rb"
11
+ production = File.read(file_name)
12
+ production.gsub!("config.log_tags = [ :request_id ]", "config.log_tags = [:request_id]")
13
+ File.open(file_name, "w") { |file| file.write(production) }
14
+ end
15
+ end
@@ -9,6 +9,7 @@ module TemplateDSL
9
9
  require_relative './answer-helpers'
10
10
  require_relative './info-helpers'
11
11
  require_relative './readme-helpers'
12
+ require_relative './rubocop-helpers'
12
13
 
13
14
  object.send :extend, TemplateHelpers
14
15
  object.send :extend, VariableHelpers
@@ -18,6 +19,7 @@ module TemplateDSL
18
19
  object.send :extend, AnswerHelpers
19
20
  object.send :extend, InfoHelpers
20
21
  object.send :extend, ReadmeHelpers
22
+ object.send :extend, RubocopHelpers
21
23
 
22
24
  object.send :source_path, source_path
23
25
  object.load_answers
@@ -1,5 +1,5 @@
1
1
  class Recipes::AwsSdk < Rails::AppBuilder
2
2
  def create
3
- gather_gem('aws-sdk')
3
+ gather_gem('aws-sdk', '~> 2.5')
4
4
  end
5
5
  end
@@ -0,0 +1,8 @@
1
+ class Recipes::BetterErrors < Rails::AppBuilder
2
+ def create
3
+ gather_gems(:development, :test) do
4
+ gather_gem('better_errors')
5
+ gather_gem('binding_of_caller')
6
+ end
7
+ end
8
+ end
@@ -31,7 +31,7 @@ class Recipes::DelayedJob < Rails::AppBuilder
31
31
  add_readme_section :internal_dependencies, :delayed_job
32
32
 
33
33
  if selected?(:heroku)
34
- gsub_file("Procfile", /^.*$/m) { |match| "#{match}worker: bundle exec rake jobs:work" }
34
+ gsub_file("Procfile", /^.*$/m) { |match| "#{match}worker: bundle exec rails jobs:work" }
35
35
  end
36
36
  end
37
37
  end
@@ -0,0 +1,35 @@
1
+ class Recipes::Draper < Rails::AppBuilder
2
+ def ask
3
+ draper = answer(:draper) { Ask.confirm('Do you want to use Draper to decorate models?') }
4
+ set(:draper, draper)
5
+ end
6
+
7
+ def create
8
+ return unless selected?(:draper)
9
+ add_draper
10
+ add_api_responder if selected?(:api_support)
11
+ end
12
+
13
+ def installed?
14
+ gem_exists?(/draper/)
15
+ end
16
+
17
+ def install
18
+ add_draper
19
+ api_recipe = load_recipe(:api)
20
+ add_api_responder if api_recipe.installed?
21
+ end
22
+
23
+ def add_draper
24
+ gather_gem 'activemodel-serializers-xml', github: 'rails/activemodel-serializers-xml'
25
+ gather_gem 'draper'
26
+ add_readme_section :internal_dependencies, :draper
27
+ create_file 'app/decorators/.keep'
28
+ end
29
+
30
+ def add_api_responder
31
+ after(:gem_install) do
32
+ copy_file '../assets/api/draper_responder.rb', 'app/responders/api_responder.rb', force: true
33
+ end
34
+ end
35
+ end
@@ -2,7 +2,9 @@ class Recipes::Github < Rails::AppBuilder
2
2
  def ask
3
3
  repo_name = "platanus/#{get(:dasherized_app_name)}"
4
4
  github_repo_create = answer(:github) do
5
- Ask.confirm("Do you want to use create the github repository? (#{repo_name})")
5
+ q = "Do you want to create the Github repository (https://github.com/#{repo_name}) " +
6
+ "for this project?"
7
+ Ask.confirm(q)
6
8
  end
7
9
  if github_repo_create
8
10
  github_repo_private = answer(:"github-private") do
@@ -19,8 +19,8 @@ class Recipes::I18n < Rails::AppBuilder
19
19
  template('../assets/es-CL.yml', 'config/locales/es-CL.yml')
20
20
  end
21
21
 
22
- gsub_file 'config/application.rb', /# config\.i18n\.default_locale =[^\n]+\n/ do
23
- "config.i18n.default_locale = '#{get(:lang)}'\n config.i18n.fallbacks = [:es, :en]\n"
22
+ gsub_file 'config/application.rb', /< Rails::Application/ do
23
+ "< Rails::Application\n config.i18n.default_locale = '#{get(:lang)}'\n config.i18n.fallbacks = [:es, :en]\n"
24
24
  end
25
25
  end
26
26
  end
@@ -74,7 +74,7 @@ class Recipes::Mailer < Rails::AppBuilder
74
74
  RUBY
75
75
 
76
76
  prepend_file "config/environments/production.rb", mailer_config
77
- copy_file '../assets/app/mailers/application_mailer.rb', 'app/mailers/application_mailer.rb'
77
+ copy_file '../assets/app/mailers/application_mailer.rb', 'app/mailers/application_mailer.rb', force: true
78
78
 
79
79
  send(service[:name])
80
80
  end
@@ -22,7 +22,7 @@ class Recipes::Paperclip < Rails::AppBuilder
22
22
  private
23
23
 
24
24
  def add_paperclip
25
- gather_gem 'paperclip', '~> 4.3'
25
+ gather_gem 'paperclip', '~> 5.0'
26
26
  paperclip_config =
27
27
  <<-RUBY.gsub(/^ {7}/, '')
28
28
  config.paperclip_defaults = {
@@ -1,12 +1,10 @@
1
1
  class Recipes::Puma < Rails::AppBuilder
2
2
  def create
3
- gather_gem 'puma'
4
-
5
3
  gather_gems(:production) do
6
4
  gather_gem 'rack-timeout'
7
5
  end
8
6
 
9
- copy_file '../assets/config/puma.rb', 'config/puma.rb'
7
+ copy_file '../assets/config/puma.rb', 'config/puma.rb', force: true
10
8
 
11
9
  # Configure rack-timout
12
10
  rack_timeout_config =
@@ -4,7 +4,7 @@ class Recipes::RackCors < Rails::AppBuilder
4
4
  after(:gem_install) do
5
5
  rack_cors_config =
6
6
  <<-RUBY.gsub(/^ {7}/, '')
7
- config.middleware.insert_before 0, "Rack::Cors" do
7
+ config.middleware.insert_before 0, Rack::Cors do
8
8
  allow do
9
9
  origins '*'
10
10
  resource '*',
@@ -3,6 +3,10 @@ set :titleized_app_name, get(:app_name).titleize
3
3
  set :underscorized_app_name, get(:app_name).underscore
4
4
  set :dasherized_app_name, get(:app_name).dasherize
5
5
 
6
+ run_action(:after_create_rails) do
7
+ rubocop_revision
8
+ end
9
+
6
10
  run_action(:cleaning) do
7
11
  clean_gemfile
8
12
  gather_gem("spring")
@@ -19,6 +23,7 @@ run_action(:asking) do
19
23
  ask :pundit
20
24
  ask :i18n
21
25
  ask :api
26
+ ask :draper
22
27
  ask :paperclip
23
28
  ask :mailer
24
29
  ask :heroku
@@ -42,6 +47,7 @@ run_action(:recipe_loading) do
42
47
  create :mailer
43
48
  create :i18n
44
49
  create :pry
50
+ create :better_errors
45
51
  create :devise
46
52
  create :admin
47
53
  create :angular_admin
@@ -53,6 +59,7 @@ run_action(:recipe_loading) do
53
59
  create :secrets
54
60
  create :git
55
61
  create :api
62
+ create :draper
56
63
  create :rack_cors
57
64
  create :paperclip
58
65
  create :tzinfo
@@ -69,6 +76,6 @@ run_action(:gem_install) do
69
76
  end
70
77
 
71
78
  run_action(:database_creation) do
72
- run "bundle exec rake db:create db:migrate"
73
- run "RACK_ENV=test bundle exec rake db:create db:migrate"
79
+ run "bundle exec rails db:create db:migrate"
80
+ run "RACK_ENV=test bundle exec rails db:create db:migrate"
74
81
  end
@@ -0,0 +1,33 @@
1
+ require "potassium/version"
2
+ require 'potassium/cli_options'
3
+ require './spec/support/potassium_test_helpers'
4
+ require "term/ansicolor"
5
+ require "gli"
6
+
7
+ module Potassium::TestCLI
8
+ extend self
9
+ extend GLI::App
10
+ extend PotassiumTestHelpers
11
+ extend Potassium::CliOptions
12
+ extend Term::ANSIColor
13
+
14
+ program_desc "Platanus Rails TEST application generator"
15
+ version Potassium::VERSION
16
+ hide_commands_without_desc true
17
+
18
+ desc "Create a new Potassium TEST project"
19
+ command :create do |c|
20
+ c.default_desc "Create a TEST project"
21
+
22
+ create_options(true).each { |opts| c.send(opts.delete(:type), opts.delete(:name), opts) }
23
+
24
+ c.action do |_global_options, options, _args|
25
+ drop_dummy_database
26
+ remove_project_directory
27
+ create_dummy_project(options)
28
+ puts green("Your test app was created inside the #{project_path} directory")
29
+ end
30
+ end
31
+
32
+ exit Potassium::TestCLI.run(ARGV)
33
+ end
@@ -1,6 +1,6 @@
1
1
  module Potassium
2
- VERSION = "2.3.0"
2
+ VERSION = "3.0.0"
3
3
  RUBY_VERSION = "2.3.1"
4
- RAILS_VERSION = "~> 4.2.0"
4
+ RAILS_VERSION = "~> 5.0.2"
5
5
  RUBOCOP_VERSION = "~> 0.46.0"
6
6
  end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "Draper" do
4
+ before :all do
5
+ drop_dummy_database
6
+ remove_project_directory
7
+ create_dummy_project("draper" => true, "api" => true)
8
+ end
9
+
10
+ it "adds the Draper gem to Gemfile" do
11
+ gemfile_content = IO.read("#{project_path}/Gemfile")
12
+ expect(gemfile_content).to include("gem 'draper'")
13
+ end
14
+
15
+ it "adds the Draper brief to README file" do
16
+ readme = IO.read("#{project_path}/README.md")
17
+ expect(readme).to include("Draper")
18
+ end
19
+
20
+ it "adds api responder to work with draper" do
21
+ responder_content = IO.read("#{project_path}/app/responders/api_responder.rb")
22
+ expect(responder_content).to include("decorated_resource")
23
+ end
24
+
25
+ it "adds decorators directory" do
26
+ content = IO.read("#{project_path}/app/decorators/.keep")
27
+ expect(content).to be_empty
28
+ end
29
+ end
@@ -1,4 +1,10 @@
1
+ require 'pathname'
2
+ require 'bundler'
3
+ require 'potassium/cli_options'
4
+
1
5
  module PotassiumTestHelpers
6
+ include Potassium::CliOptions
7
+
2
8
  APP_NAME = "dummy_app"
3
9
 
4
10
  def remove_project_directory
@@ -13,7 +19,7 @@ module PotassiumTestHelpers
13
19
  Dir.chdir(tmp_path) do
14
20
  Bundler.with_clean_env do
15
21
  add_fakes_to_path
16
- full_arguments = hash_to_arguments(default_arguments.merge(arguments))
22
+ full_arguments = hash_to_arguments(create_arguments(true).merge(arguments))
17
23
  run_command("#{potassium_bin} create #{APP_NAME} #{full_arguments}")
18
24
  on_project { run_command("hound rules update ruby --local") }
19
25
  end
@@ -22,7 +28,7 @@ module PotassiumTestHelpers
22
28
 
23
29
  def drop_dummy_database
24
30
  return unless File.exist?(project_path)
25
- on_project { run_command("bundle exec rake db:drop") }
31
+ on_project { run_command("bundle exec rails db:drop") }
26
32
  end
27
33
 
28
34
  def add_fakes_to_path
@@ -51,25 +57,6 @@ module PotassiumTestHelpers
51
57
  File.join(root_path, "bin", "potassium")
52
58
  end
53
59
 
54
- def default_arguments
55
- {
56
- "db" => "postgresql",
57
- "locale" => "es-CL",
58
- "heroku" => false,
59
- "admin" => false,
60
- "pundit" => false,
61
- "paperclip" => false,
62
- "email_service" => "aws_ses",
63
- "devise" => false,
64
- "api" => false,
65
- "delayed-job" => false,
66
- "github" => false,
67
- "github-private" => false,
68
- "clockwork" => false,
69
- "sentry" => false
70
- }
71
- end
72
-
73
60
  def hash_to_arguments(hash)
74
61
  hash.map do |key, value|
75
62
  if value == true
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: 2.3.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - juliogarciag
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-27 00:00:00.000000000 Z
11
+ date: 2017-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 4.2.0
89
+ version: 5.0.2
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 4.2.0
96
+ version: 5.0.2
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: gli
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -169,6 +169,7 @@ email:
169
169
  - julioggonz@gmail.com
170
170
  executables:
171
171
  - potassium
172
+ - potassium_test
172
173
  extensions: []
173
174
  extra_rdoc_files: []
174
175
  files:
@@ -182,6 +183,7 @@ files:
182
183
  - README.md
183
184
  - Rakefile
184
185
  - bin/potassium
186
+ - bin/potassium_test
185
187
  - circle.yml
186
188
  - docs/CONTRIBUTING.md
187
189
  - docs/DSL.md
@@ -203,6 +205,7 @@ files:
203
205
  - lib/potassium/assets/active_admin/pundit_page_policy.rb
204
206
  - lib/potassium/assets/api/api_error_concern.rb
205
207
  - lib/potassium/assets/api/base_controller.rb
208
+ - lib/potassium/assets/api/draper_responder.rb
206
209
  - lib/potassium/assets/api/responder.rb
207
210
  - lib/potassium/assets/app/mailers/application_mailer.rb
208
211
  - lib/potassium/assets/bin/cibuild.erb
@@ -231,6 +234,7 @@ files:
231
234
  - lib/potassium/cli.rb
232
235
  - lib/potassium/cli/commands/create.rb
233
236
  - lib/potassium/cli/commands/install.rb
237
+ - lib/potassium/cli_options.rb
234
238
  - lib/potassium/generators/application.rb
235
239
  - lib/potassium/generators/recipe.rb
236
240
  - lib/potassium/helpers/answer-helpers.rb
@@ -240,6 +244,7 @@ files:
240
244
  - lib/potassium/helpers/gem-helpers.rb
241
245
  - lib/potassium/helpers/info-helpers.rb
242
246
  - lib/potassium/helpers/readme-helpers.rb
247
+ - lib/potassium/helpers/rubocop-helpers.rb
243
248
  - lib/potassium/helpers/template-dsl.rb
244
249
  - lib/potassium/helpers/template-helpers.rb
245
250
  - lib/potassium/helpers/variable-helpers.rb
@@ -250,12 +255,14 @@ files:
250
255
  - lib/potassium/recipes/annotate.rb
251
256
  - lib/potassium/recipes/api.rb
252
257
  - lib/potassium/recipes/aws_sdk.rb
258
+ - lib/potassium/recipes/better_errors.rb
253
259
  - lib/potassium/recipes/bower.rb
254
260
  - lib/potassium/recipes/ci.rb
255
261
  - lib/potassium/recipes/cleanup.rb
256
262
  - lib/potassium/recipes/database.rb
257
263
  - lib/potassium/recipes/delayed_job.rb
258
264
  - lib/potassium/recipes/devise.rb
265
+ - lib/potassium/recipes/draper.rb
259
266
  - lib/potassium/recipes/editorconfig.rb
260
267
  - lib/potassium/recipes/env.rb
261
268
  - lib/potassium/recipes/error_reporting.rb
@@ -281,6 +288,7 @@ files:
281
288
  - lib/potassium/template_finder.rb
282
289
  - lib/potassium/templates/application.rb
283
290
  - lib/potassium/templates/recipe.rb
291
+ - lib/potassium/test_cli.rb
284
292
  - lib/potassium/text_spinner.rb
285
293
  - lib/potassium/version.rb
286
294
  - potassium.gemspec
@@ -288,6 +296,7 @@ files:
288
296
  - spec/fakes/bin/hub
289
297
  - spec/features/ci_spec.rb
290
298
  - spec/features/clockwork_spec.rb
299
+ - spec/features/draper_spec.rb
291
300
  - spec/features/error_reporting_spec.rb
292
301
  - spec/features/github_spec.rb
293
302
  - spec/features/heroku_spec.rb
@@ -326,6 +335,7 @@ test_files:
326
335
  - spec/fakes/bin/hub
327
336
  - spec/features/ci_spec.rb
328
337
  - spec/features/clockwork_spec.rb
338
+ - spec/features/draper_spec.rb
329
339
  - spec/features/error_reporting_spec.rb
330
340
  - spec/features/github_spec.rb
331
341
  - spec/features/heroku_spec.rb