potassium 1.3.5 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +1 -1
  5. data/.ruby_style.yml +6 -2
  6. data/CHANGELOG.md +19 -1
  7. data/README.md +79 -74
  8. data/circle.yml +9 -0
  9. data/docs/CONTRIBUTING.md +132 -0
  10. data/docs/{dsl.md → DSL.md} +146 -18
  11. data/lib/potassium/{templates/application/assets → assets}/.bowerrc +0 -0
  12. data/lib/potassium/assets/.buildpacks +3 -0
  13. data/lib/potassium/{templates/application/assets → assets}/.editorconfig +0 -0
  14. data/lib/potassium/assets/.env.example.erb +8 -0
  15. data/lib/potassium/assets/.hound.yml +2 -0
  16. data/lib/potassium/{templates/application/assets → assets}/.pryrc +0 -0
  17. data/lib/potassium/assets/.rubocop.yml +3 -0
  18. data/lib/potassium/assets/.ruby_style.yml +0 -0
  19. data/lib/potassium/assets/Dockerfile.ci +4 -0
  20. data/lib/potassium/assets/Procfile +1 -0
  21. data/lib/potassium/assets/README.md.erb +2 -0
  22. data/lib/potassium/assets/README.yml +83 -0
  23. data/lib/potassium/{templates/application/assets → assets}/active_admin/active_admin.js.coffee +0 -0
  24. data/lib/potassium/{templates/application/assets → assets}/active_admin/admin_user_policy.rb +0 -0
  25. data/lib/potassium/{templates/application/assets → assets}/active_admin/comment_policy.rb +0 -0
  26. data/lib/potassium/{templates/application/assets → assets}/active_admin/init_activeadmin_angular.rb +0 -0
  27. data/lib/potassium/{templates/application/assets → assets}/active_admin/pundit_page_policy.rb +0 -0
  28. data/lib/potassium/{templates/application/assets → assets}/api/api_error_concern.rb +0 -0
  29. data/lib/potassium/{templates/application/assets → assets}/api/base_controller.rb +0 -0
  30. data/lib/potassium/{templates/application/assets → assets}/api/responder.rb +0 -0
  31. data/lib/potassium/assets/bin/cibuild.erb +27 -0
  32. data/lib/potassium/assets/bin/setup.erb +22 -0
  33. data/lib/potassium/assets/bin/setup_heroku.erb +21 -0
  34. data/lib/potassium/{templates/application/assets → assets}/bower.json +0 -0
  35. data/lib/potassium/assets/circle.yml +16 -0
  36. data/lib/potassium/assets/config/database_mysql.yml.erb +25 -0
  37. data/lib/potassium/assets/config/database_postgresql.yml.erb +25 -0
  38. data/lib/potassium/assets/config/environments/staging.rb +5 -0
  39. data/lib/potassium/assets/config/puma.rb +29 -0
  40. data/lib/potassium/assets/config/secrets.yml.erb +14 -0
  41. data/lib/potassium/assets/docker-compose.ci.yml +6 -0
  42. data/lib/potassium/{templates/application/assets → assets}/es.yml +0 -0
  43. data/lib/potassium/{templates/application/assets → assets}/testing/.rspec +0 -0
  44. data/lib/potassium/{templates/application/assets → assets}/testing/rails_helper.rb +0 -0
  45. data/lib/potassium/cli/commands/create.rb +55 -4
  46. data/lib/potassium/cli/commands/install.rb +27 -13
  47. data/lib/potassium/{templates/application/generator.rb → generators/application.rb} +7 -2
  48. data/lib/potassium/{templates/application/recipe_generator.rb → generators/recipe.rb} +11 -2
  49. data/lib/potassium/helpers/answer-helpers.rb +21 -0
  50. data/lib/potassium/{templates/application/helpers → helpers}/callback-helpers.rb +0 -0
  51. data/lib/potassium/helpers/docker-helpers.rb +37 -0
  52. data/lib/potassium/{templates/application/helpers → helpers}/environment-helpers.rb +0 -0
  53. data/lib/potassium/{templates/application/helpers → helpers}/gem-helpers.rb +6 -2
  54. data/lib/potassium/helpers/info-helpers.rb +16 -0
  55. data/lib/potassium/helpers/readme-helpers.rb +85 -0
  56. data/lib/potassium/{templates/application/helpers → helpers}/template-dsl.rb +8 -0
  57. data/lib/potassium/helpers/template-helpers.rb +97 -0
  58. data/lib/potassium/{templates/application/helpers → helpers}/variable-helpers.rb +0 -0
  59. data/lib/potassium/recipe.rb +2 -0
  60. data/lib/potassium/{templates/application/recipes → recipes}/admin.rb +36 -6
  61. data/lib/potassium/recipes/angular_admin.rb +56 -0
  62. data/lib/potassium/recipes/api.rb +43 -0
  63. data/lib/potassium/recipes/aws_sdk.rb +5 -0
  64. data/lib/potassium/recipes/bower.rb +13 -0
  65. data/lib/potassium/recipes/ci.rb +42 -0
  66. data/lib/potassium/recipes/cleanup.rb +10 -0
  67. data/lib/potassium/recipes/database.rb +42 -0
  68. data/lib/potassium/recipes/delayed_job.rb +41 -0
  69. data/lib/potassium/recipes/devise.rb +64 -0
  70. data/lib/potassium/recipes/editorconfig.rb +5 -0
  71. data/lib/potassium/recipes/env.rb +10 -0
  72. data/lib/potassium/recipes/git.rb +13 -0
  73. data/lib/potassium/recipes/github.rb +27 -0
  74. data/lib/potassium/recipes/heroku.rb +138 -0
  75. data/lib/potassium/recipes/i18n.rb +26 -0
  76. data/lib/potassium/recipes/paperclip.rb +37 -0
  77. data/lib/potassium/recipes/production.rb +7 -0
  78. data/lib/potassium/recipes/pry.rb +10 -0
  79. data/lib/potassium/recipes/puma.rb +19 -0
  80. data/lib/potassium/recipes/pundit.rb +61 -0
  81. data/lib/potassium/recipes/rack_cors.rb +21 -0
  82. data/lib/potassium/recipes/readme.rb +7 -0
  83. data/lib/potassium/recipes/ruby.rb +23 -0
  84. data/lib/potassium/recipes/script.rb +16 -0
  85. data/lib/potassium/recipes/secrets.rb +5 -0
  86. data/lib/potassium/recipes/staging.rb +5 -0
  87. data/lib/potassium/recipes/style.rb +13 -0
  88. data/lib/potassium/recipes/testing.rb +37 -0
  89. data/lib/potassium/templates/application.rb +67 -0
  90. data/lib/potassium/templates/recipe.rb +12 -0
  91. data/lib/potassium/text_spinner.rb +0 -5
  92. data/lib/potassium/version.rb +2 -1
  93. data/potassium.gemspec +3 -0
  94. data/spec/fakes/bin/heroku +5 -0
  95. data/spec/fakes/bin/hub +5 -0
  96. data/spec/features/ci_spec.rb +14 -0
  97. data/spec/features/github_spec.rb +22 -0
  98. data/spec/features/heroku_spec.rb +61 -0
  99. data/spec/features/new_project_spec.rb +38 -0
  100. data/spec/spec_helper.rb +33 -0
  101. data/spec/support/fake_github.rb +25 -0
  102. data/spec/support/fake_heroku.rb +77 -0
  103. data/spec/support/potassium_test_helpers.rb +98 -0
  104. metadata +149 -62
  105. data/lib/potassium/templates/application/assets/.rbenv-vars.example +0 -8
  106. data/lib/potassium/templates/application/assets/config/database_mysql.yml +0 -40
  107. data/lib/potassium/templates/application/assets/config/database_postgresql.yml +0 -26
  108. data/lib/potassium/templates/application/helpers/recipe-helpers.rb +0 -5
  109. data/lib/potassium/templates/application/helpers/template-helpers.rb +0 -35
  110. data/lib/potassium/templates/application/recipe_template.rb +0 -23
  111. data/lib/potassium/templates/application/recipes/angular_admin.rb +0 -26
  112. data/lib/potassium/templates/application/recipes/api.rb +0 -22
  113. data/lib/potassium/templates/application/recipes/asks/admin.rb +0 -9
  114. data/lib/potassium/templates/application/recipes/asks/api.rb +0 -2
  115. data/lib/potassium/templates/application/recipes/asks/database.rb +0 -9
  116. data/lib/potassium/templates/application/recipes/asks/devise.rb +0 -10
  117. data/lib/potassium/templates/application/recipes/asks/i18n.rb +0 -8
  118. data/lib/potassium/templates/application/recipes/asks/paperclip.rb +0 -2
  119. data/lib/potassium/templates/application/recipes/asks/pundit.rb +0 -4
  120. data/lib/potassium/templates/application/recipes/aws_sdk.rb +0 -1
  121. data/lib/potassium/templates/application/recipes/bower.rb +0 -3
  122. data/lib/potassium/templates/application/recipes/checks/devise.rb +0 -1
  123. data/lib/potassium/templates/application/recipes/database.rb +0 -22
  124. data/lib/potassium/templates/application/recipes/dependencies/admin.rb +0 -3
  125. data/lib/potassium/templates/application/recipes/devise.rb +0 -28
  126. data/lib/potassium/templates/application/recipes/editorconfig.rb +0 -1
  127. data/lib/potassium/templates/application/recipes/git.rb +0 -9
  128. data/lib/potassium/templates/application/recipes/i18n.rb +0 -9
  129. data/lib/potassium/templates/application/recipes/paperclip.rb +0 -20
  130. data/lib/potassium/templates/application/recipes/production.rb +0 -3
  131. data/lib/potassium/templates/application/recipes/pry.rb +0 -6
  132. data/lib/potassium/templates/application/recipes/pundit.rb +0 -33
  133. data/lib/potassium/templates/application/recipes/rack-cors.rb +0 -15
  134. data/lib/potassium/templates/application/recipes/rbenv.rb +0 -23
  135. data/lib/potassium/templates/application/recipes/readme.rb +0 -2
  136. data/lib/potassium/templates/application/recipes/testing.rb +0 -32
  137. data/lib/potassium/templates/application/recipes/unicorn.rb +0 -5
  138. data/lib/potassium/templates/application/template.rb +0 -58
@@ -1,22 +1,28 @@
1
1
  require 'levenshtein'
2
2
  require 'inquirer'
3
- require "potassium/templates/application/recipe_generator"
3
+ require 'potassium/generators/recipe'
4
+ require 'potassium/recipe'
4
5
 
5
6
  module Potassium::CLI
6
7
  desc "Installs a new feature or library"
7
8
  command :install do |c|
8
- c.action do |_global_options, _options, args|
9
+ c.switch "force",
10
+ desc: "Whether to force the recipe installation",
11
+ default_value: false
12
+ c.action do |_global_options, options, args|
9
13
  if args.first.nil?
10
14
  index = Ask.list('Select a recipe to install', recipe_name_list)
11
15
  ARGV << recipe_name_list[index]
12
- Potassium::RecipeGenerator.start
16
+ template = Potassium::RecipeGenerator
17
+ template.cli_options = options
18
+ template.start
19
+ elsif recipe_exists?(args)
20
+ template = Potassium::RecipeGenerator
21
+ template.cli_options = options
22
+ template.start
13
23
  else
14
- if recipe_exists?(args)
15
- Potassium::RecipeGenerator.start
16
- else
17
- guess = guess_recipe_name(args)
18
- puts "Oops! Sorry, that recipe doesn't exist. Were you looking for this?: #{guess}"
19
- end
24
+ guess = guess_recipe_name(args)
25
+ puts "Oops! Sorry, that recipe doesn't exist. Were you looking for this?: #{guess}"
20
26
  end
21
27
  end
22
28
  end
@@ -34,11 +40,19 @@ module Potassium::CLI
34
40
  end
35
41
 
36
42
  def self.recipe_name_list
37
- @recipe_name_list ||= begin
38
- source_root = File.expand_path('../../../templates/application/recipes', __FILE__)
39
- files = Dir.entries(source_root).select { |e| e.end_with?('.rb') }
40
- files.map { |e| e.gsub('.rb', '') }
43
+ list = []
44
+
45
+ source_root = File.expand_path('../../../recipes', __FILE__)
46
+ Dir.entries(source_root).each do |file_name|
47
+ if file_name.end_with?('.rb')
48
+ recipe_name = file_name.gsub('.rb', '')
49
+ require "potassium/recipes/#{recipe_name}"
50
+ recipe_class = Recipes.const_get(recipe_name.camelize)
51
+ list << recipe_name if recipe_class.method_defined?(:install)
52
+ end
41
53
  end
54
+
55
+ list
42
56
  end
43
57
 
44
58
  def self.find_closest_recipe(recipe_list, possible_recipe)
@@ -1,13 +1,18 @@
1
1
  require "rails/generators"
2
2
  require "rails/generators/rails/app/app_generator"
3
3
  require "inquirer"
4
+ require "potassium/recipe"
4
5
 
5
6
  module Potassium
6
7
  class ApplicationGenerator < Rails::Generators::AppGenerator
8
+ class << self
9
+ attr_accessor :cli_options
10
+ end
11
+
7
12
  def finish_template
8
- require_relative "./helpers/template-dsl"
13
+ require_relative "../helpers/template-dsl"
9
14
  TemplateDSL.extend_dsl(self, source_path: __FILE__)
10
- template_location = File.expand_path('./template.rb', File.dirname(__FILE__))
15
+ template_location = File.expand_path('../templates/application.rb', File.dirname(__FILE__))
11
16
  instance_eval File.read(template_location), template_location
12
17
  super
13
18
  end
@@ -1,13 +1,22 @@
1
1
  require "rails/generators"
2
2
  require "rails/generators/rails/app/app_generator"
3
3
  require "inquirer"
4
+ require "potassium/recipe"
5
+
6
+ class Rails::AppBuilder
7
+ include Rails::ActionMethods
8
+ end
4
9
 
5
10
  module Potassium
6
11
  class RecipeGenerator < Rails::Generators::NamedBase
12
+ class << self
13
+ attr_accessor :cli_options
14
+ end
15
+
7
16
  def run_generator
8
- require_relative "./helpers/template-dsl"
17
+ require_relative "../helpers/template-dsl"
9
18
  TemplateDSL.extend_dsl(self, source_path: __FILE__)
10
- template_location = File.expand_path('./recipe_template.rb', File.dirname(__FILE__))
19
+ template_location = File.expand_path('../templates/recipe.rb', File.dirname(__FILE__))
11
20
  instance_eval File.read(template_location), template_location
12
21
  end
13
22
  end
@@ -0,0 +1,21 @@
1
+ module AnswerHelpers
2
+ def answer(key, &fallback)
3
+ found = get(:answers)[key]
4
+ found.nil? ? fallback.call : found
5
+ end
6
+
7
+ def load_answers
8
+ set(:answers, extract_answers(self.class.cli_options))
9
+ end
10
+
11
+ private
12
+
13
+ def extract_answers(options)
14
+ options.except(
15
+ "version-check", :"version-check",
16
+ "force", :force
17
+ ).reduce({}) do |hash, (k, v)|
18
+ hash.merge(k => v == "none" ? nil : v)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ class DockerHelpers
2
+ def initialize(compose_path)
3
+ @compose_path = compose_path
4
+ @compose = YAML.load(File.read(compose_path))
5
+ end
6
+
7
+ def add_link(target_service, linked_service)
8
+ service = @compose[target_service]
9
+ unless service['links'].is_a? Array
10
+ service['links'] = []
11
+ end
12
+ service['links'].push(linked_service)
13
+ save
14
+ end
15
+
16
+ def add_env(target_service, variable_key, variable_value)
17
+ service = @compose[target_service]
18
+ unless service['environment'].is_a? Hash
19
+ service['environment'] = {}
20
+ end
21
+ service['environment'][variable_key] = variable_value
22
+ save
23
+ end
24
+
25
+ def add_service(name, definition)
26
+ service = {}
27
+ service[name] = YAML.load(definition)
28
+ @compose.merge!(service)
29
+ save
30
+ end
31
+
32
+ private
33
+
34
+ def save
35
+ File.open(@compose_path, 'w') { |f| f.write @compose.to_yaml }
36
+ end
37
+ end
@@ -32,8 +32,7 @@ module GemHelpers
32
32
  end
33
33
 
34
34
  def build_gemfile
35
- call_gem_for_gathered_gems
36
- fix_withespace_issues
35
+ fix_withespace_issues if call_gem_for_gathered_gems
37
36
  end
38
37
 
39
38
  private
@@ -42,6 +41,8 @@ module GemHelpers
42
41
  ensure_variable(:gems, {})
43
42
  gems = get(:gems)
44
43
 
44
+ return false if gems.empty?
45
+
45
46
  base_gems = gems.delete([:base]) || []
46
47
 
47
48
  call_gem_for_gems(base_gems)
@@ -51,6 +52,8 @@ module GemHelpers
51
52
  call_gem_for_gems(env_gems)
52
53
  end
53
54
  end
55
+
56
+ true
54
57
  end
55
58
 
56
59
  def call_gem_for_gems(gems)
@@ -75,5 +78,6 @@ module GemHelpers
75
78
 
76
79
  def fix_withespace_issues
77
80
  gsub_file("Gemfile", /^group/, "\ngroup")
81
+ gsub_file("Gemfile", /^\n\n/, "\n")
78
82
  end
79
83
  end
@@ -0,0 +1,16 @@
1
+ module InfoHelpers
2
+ def success(message)
3
+ say(message, :green)
4
+ true
5
+ end
6
+
7
+ def error(message)
8
+ say(message, :red)
9
+ false
10
+ end
11
+
12
+ def info(message)
13
+ say(message, :yellow)
14
+ true
15
+ end
16
+ end
@@ -0,0 +1,85 @@
1
+ module ReadmeHelpers
2
+ def add_readme_section(header, section, iterpolation_values = {})
3
+ section_data = readme_section_data(header, section, iterpolation_values)
4
+ add_readme_header(header, iterpolation_values)
5
+
6
+ insert_into_readme(section_data[:header_title]) do
7
+ <<-HERE.gsub(/^ {6}/, '')
8
+
9
+ ### #{section_data[:title]}
10
+
11
+ #{section_data[:body]}
12
+ HERE
13
+ end
14
+ end
15
+
16
+ def add_readme_header(header, iterpolation_values = {})
17
+ header_data = readme_header_data(header, iterpolation_values)
18
+ return if read_file("README.md").match("## #{header_data[:title]}")
19
+
20
+ if header_data[:body]
21
+ insert_into_readme do
22
+ <<-HERE.gsub(/^ {8}/, '')
23
+
24
+ ## #{header_data[:title]}
25
+
26
+ #{header_data[:body]}
27
+ HERE
28
+ end
29
+ else
30
+ insert_into_readme do
31
+ <<-HERE.gsub(/^ {8}/, '')
32
+
33
+ ## #{header_data[:title]}
34
+ HERE
35
+ end
36
+ end
37
+ end
38
+
39
+ def readme_header_data(header, iterpolation_values)
40
+ file = get_readme
41
+ header_data = file["readme"]["headers"][header.to_s]
42
+
43
+ {
44
+ title: header_data["title"],
45
+ body: interpolate_text(header_data["body"], iterpolation_values)
46
+ }
47
+ end
48
+
49
+ def readme_section_data(header, section, iterpolation_values)
50
+ file = get_readme
51
+ header_data = file["readme"]["headers"][header.to_s]
52
+ section_data = header_data["sections"][section.to_s]
53
+
54
+ {
55
+ header_title: header_data["title"],
56
+ title: interpolate_text(section_data["title"], iterpolation_values),
57
+ body: interpolate_text(section_data["body"], iterpolation_values)
58
+ }
59
+ end
60
+
61
+ def interpolate_text(text, iterpolation_values)
62
+ return unless text
63
+ b = binding
64
+ iterpolation_values.each { |k, v| singleton_class.send(:define_method, k) { v } }
65
+ ERB.new(text).result(b)
66
+ end
67
+
68
+ def get_readme
69
+ file = File.expand_path("../../assets/README.yml", __FILE__)
70
+ YAML.load(File.read(file))
71
+ end
72
+
73
+ def insert_into_readme(after_text = nil, &block)
74
+ if after_text
75
+ line = "#{after_text}\n"
76
+ insert_into_file "README.md", after: line do
77
+ block.call
78
+ end
79
+ else
80
+ append_to_file "README.md" do
81
+ block.call
82
+ end
83
+ end
84
+ end
85
+ end
@@ -4,14 +4,22 @@ module TemplateDSL
4
4
  require_relative './variable-helpers'
5
5
  require_relative './environment-helpers'
6
6
  require_relative './gem-helpers'
7
+ require_relative './docker-helpers'
7
8
  require_relative './callback-helpers'
9
+ require_relative './answer-helpers'
10
+ require_relative './info-helpers'
11
+ require_relative './readme-helpers'
8
12
 
9
13
  object.send :extend, TemplateHelpers
10
14
  object.send :extend, VariableHelpers
11
15
  object.send :extend, EnvironmentHelpers
12
16
  object.send :extend, GemHelpers
13
17
  object.send :extend, CallbackHelpers
18
+ object.send :extend, AnswerHelpers
19
+ object.send :extend, InfoHelpers
20
+ object.send :extend, ReadmeHelpers
14
21
 
15
22
  object.send :source_path, source_path
23
+ object.load_answers
16
24
  end
17
25
  end
@@ -0,0 +1,97 @@
1
+ module TemplateHelpers
2
+ def app_name
3
+ @app_name || app_name_from_file
4
+ end
5
+
6
+ def load_recipe(recipe_name)
7
+ @recipes ||= {}
8
+ @recipes[recipe_name] ||= get_recipe_class(recipe_name.to_sym).new(self)
9
+ end
10
+
11
+ def create(recipe_name)
12
+ recipe = load_recipe(recipe_name)
13
+ recipe.create
14
+ end
15
+
16
+ def ask(recipe_name)
17
+ recipe = load_recipe(recipe_name)
18
+ recipe.ask
19
+ end
20
+
21
+ def install(recipe_name)
22
+ recipe = load_recipe(recipe_name)
23
+
24
+ if !recipe.respond_to?(:installed?) || !recipe.installed? || force?
25
+ recipe.install
26
+ else
27
+ info "#{recipe_name.to_s.titleize} is already installed"
28
+ info "Use --force to force the installation"
29
+ end
30
+ end
31
+
32
+ def eval_file(source)
33
+ location = File.expand_path(find_in_source_paths(source))
34
+ unique_name = SecureRandom.hex
35
+
36
+ define_singleton_method unique_name do
37
+ instance_eval File.read(location)
38
+ end
39
+
40
+ public_send unique_name
41
+ end
42
+
43
+ def source_path(path)
44
+ define_singleton_method :source_paths do
45
+ [File.expand_path(File.dirname(path))]
46
+ end
47
+ end
48
+
49
+ def erase_comments(file)
50
+ gsub_file file, /^\s*#[^\n]*\n/, ''
51
+ end
52
+
53
+ # TODO: Refactor to be able to reuse it and reduce the duplication and confusion.
54
+ def cut_comments(file, limit: 100)
55
+ gsub_file file, /^\s*#[^\n]*\n/ do |match|
56
+ if match.size > limit
57
+ match.partition(/[\w\W]{#{limit - 1}}/).reject(&:blank?).map do |line|
58
+ (line.size == limit - 1) ? "#{line}-" : "# #{line}"
59
+ end.join("\n")
60
+ else
61
+ match
62
+ end
63
+ end
64
+ end
65
+
66
+ def file_exist?(file_path)
67
+ File.exist?(file_path)
68
+ end
69
+
70
+ def dir_exist?(dir_path)
71
+ Dir.exist?(dir_path)
72
+ end
73
+
74
+ def read_file(file_path)
75
+ fail "#{file_path} does not exist in destination" unless file_exist?(file_path)
76
+ File.read(file_path)
77
+ end
78
+
79
+ def cli_options
80
+ self.class.cli_options
81
+ end
82
+
83
+ def force?
84
+ cli_options[:force]
85
+ end
86
+
87
+ private
88
+
89
+ def get_recipe_class(recipe_name)
90
+ require_relative "../recipes/#{recipe_name}"
91
+ Recipes.const_get(recipe_name.to_s.camelize)
92
+ end
93
+
94
+ def app_name_from_file
95
+ File.read('config/application.rb').match(/module\s(.*)/)[1].underscore.dasherize
96
+ end
97
+ end
@@ -0,0 +1,2 @@
1
+ module Recipes
2
+ end
@@ -1,12 +1,43 @@
1
- if selected?(:admin_mode)
2
- if selected?(:authentication, :devise)
1
+ class Recipes::Admin < Rails::AppBuilder
2
+ def ask
3
+ if selected?(:authentication)
4
+ admin_mode = answer(:admin) { Ask.confirm("Do you want to use ActiveAdmin?") }
5
+ set(:admin_mode, admin_mode)
6
+ end
7
+ end
8
+
9
+ def create
10
+ if selected?(:admin_mode)
11
+ if selected?(:authentication)
12
+ add_active_admin
13
+ else
14
+ info "ActiveAdmin can't be installed because Devise isn't enabled."
15
+ end
16
+ end
17
+ end
18
+
19
+ def install
20
+ devise = load_recipe(:devise)
21
+ if devise.installed?
22
+ add_active_admin
23
+ else
24
+ info "ActiveAdmin can't be installed because Devise isn't installed."
25
+ end
26
+ end
27
+
28
+ def installed?
29
+ gem_exists?(/activeadmin/)
30
+ end
31
+
32
+ private
33
+
34
+ def add_active_admin
3
35
  gather_gem 'activeadmin', github: 'activeadmin'
4
36
  gather_gem 'activeadmin_addons'
5
37
  gather_gem 'active_skin'
6
38
 
7
39
  after(:gem_install, wrap_in_action: :admin_install) do
8
40
  generate "active_admin:install"
9
-
10
41
  line = "ActiveAdmin.setup do |config|"
11
42
  initializer = "config/initializers/active_admin.rb"
12
43
  gsub_file initializer, /(#{Regexp.escape(line)})/mi do |_match|
@@ -24,7 +55,6 @@ if selected?(:admin_mode)
24
55
 
25
56
  line = "@import \"active_admin/base\";"
26
57
  style = "app/assets/stylesheets/active_admin.css.scss"
27
-
28
58
  style = File.exist?(style) ? style : "app/assets/stylesheets/active_admin.scss"
29
59
 
30
60
  gsub_file style, /(#{Regexp.escape(line)})/mi do |_match|
@@ -38,8 +68,8 @@ if selected?(:admin_mode)
38
68
  @import "active_skin";
39
69
  HERE
40
70
  end
71
+
72
+ generate "activeadmin_addons:install"
41
73
  end
42
- else
43
- say "ActiveAdmin can't be installed because Devise isn't enabled.", :red
44
74
  end
45
75
  end