plutonium 0.10.1 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/app/assets/javascripts/turbo/index.js +1 -1
  4. data/app/views/application/_flash_alerts.html.erb +3 -0
  5. data/app/views/application/_flash_toasts.html.erb +2 -0
  6. data/app/views/application/_resource_header.html.erb +12 -12
  7. data/app/views/components/base.rb +1 -1
  8. data/app/views/layouts/resource.html copy.erb +2 -2
  9. data/app/views/layouts/resource.html.erb +3 -2
  10. data/app/views/layouts/rodauth.html.erb +13 -8
  11. data/app/views/resource/_nav_user.html.erb +1 -1
  12. data/app/views/resource/index.rabl +1 -1
  13. data/app/views/rodauth/add_recovery_codes.html.erb +8 -7
  14. data/app/views/rodauth/otp_auth.html.erb +1 -1
  15. data/app/views/rodauth/otp_setup.html.erb +10 -8
  16. data/brakeman.ignore +1 -1
  17. data/config/initializers/rabl.rb +2 -0
  18. data/css.manifest +1 -1
  19. data/js.manifest +2 -2
  20. data/lib/generators/pu/core/install/templates/config/initializers/plutonium.rb +0 -3
  21. data/lib/generators/pu/core/ruby/ruby_generator.rb +30 -0
  22. data/lib/generators/pu/core/ruby/templates/.keep +0 -0
  23. data/lib/generators/pu/docker/install/install_generator.rb +35 -0
  24. data/lib/generators/pu/docker/install/templates/.keep +0 -0
  25. data/lib/generators/pu/docker/install/templates/Dockerfile.dev.tt +30 -0
  26. data/lib/generators/pu/docker/install/templates/Dockerfile.tt +75 -0
  27. data/lib/generators/pu/docker/install/templates/bin/console +3 -0
  28. data/lib/generators/pu/docker/install/templates/bin/restart +3 -0
  29. data/lib/generators/pu/docker/install/templates/bin/shell +3 -0
  30. data/lib/generators/pu/docker/install/templates/docker-compose.yml +29 -0
  31. data/lib/generators/pu/gem/dotenv/dotenv_generator.rb +32 -0
  32. data/lib/generators/pu/gem/dotenv/templates/.env +6 -0
  33. data/lib/generators/pu/gem/dotenv/templates/.env.local +5 -0
  34. data/lib/generators/pu/gem/dotenv/templates/.env.local.template +5 -0
  35. data/lib/generators/pu/gem/dotenv/templates/.env.template +6 -0
  36. data/lib/generators/pu/gem/dotenv/templates/.keep +0 -0
  37. data/lib/generators/pu/gem/dotenv/templates/config/initializers/001_ensure_required_env.rb +15 -0
  38. data/lib/generators/pu/gem/redis/redis_generator.rb +22 -0
  39. data/lib/generators/pu/gem/redis/templates/.keep +0 -0
  40. data/lib/generators/pu/gen/pug/pug_generator.rb +6 -0
  41. data/lib/generators/pu/gen/pug/templates/pug.rb.tt +1 -1
  42. data/lib/generators/pu/lib/plutonium_generators/concerns/actions.rb +154 -32
  43. data/lib/generators/pu/lib/plutonium_generators/generator.rb +6 -6
  44. data/lib/generators/pu/lib/plutonium_generators/installer.rb +1 -1
  45. data/lib/generators/pu/pkg/app/templates/config/routes.rb.tt +3 -3
  46. data/lib/generators/pu/rodauth/account_generator.rb +10 -10
  47. data/lib/generators/pu/rodauth/install_generator.rb +9 -2
  48. data/lib/generators/pu/rodauth/migration/sequel/audit_logging.erb +2 -2
  49. data/lib/generators/pu/rodauth/migration_generator.rb +1 -1
  50. data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/account_rodauth_plugin.rb.tt +2 -2
  51. data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/rodauth_plugin.rb.tt +0 -3
  52. data/lib/generators/pu/rodauth/templates/db/migrate/install_rodauth.rb.tt +5 -0
  53. data/lib/generators/pu/service/postgres/postgres_generator.rb +61 -0
  54. data/lib/generators/pu/service/postgres/templates/.keep +0 -0
  55. data/lib/generators/pu/service/postgres/templates/bin/initdb.d/create-multiple-postgresql-databases.sh +22 -0
  56. data/lib/generators/pu/service/postgres/templates/database.yml.tt +93 -0
  57. data/lib/generators/pu/service/sidekiq/sidekiq_generator.rb +62 -0
  58. data/lib/generators/pu/service/sidekiq/templates/.keep +0 -0
  59. data/lib/generators/pu/service/sidekiq/templates/app/sidekiq/sidekiq_job.rb +5 -0
  60. data/lib/generators/pu/service/sidekiq/templates/config/initializers/sidekiq.rb +53 -0
  61. data/lib/generators/pu/service/sidekiq/templates/config/sidekiq.yml +6 -0
  62. data/lib/plutonium/config.rb +7 -13
  63. data/lib/plutonium/core/autodiscovery/input_discoverer.rb +1 -1
  64. data/lib/plutonium/core/autodiscovery/renderer_discoverer.rb +1 -1
  65. data/lib/plutonium/core/controllers/base.rb +13 -3
  66. data/lib/plutonium/core/controllers/entity_scoping.rb +3 -3
  67. data/lib/plutonium/core/controllers/queryable.rb +3 -1
  68. data/lib/plutonium/icons.rb +1 -1
  69. data/lib/plutonium/pkg/app.rb +6 -0
  70. data/lib/plutonium/railtie.rb +19 -0
  71. data/lib/plutonium/reloader.rb +99 -0
  72. data/lib/plutonium/resource/controller.rb +62 -22
  73. data/lib/plutonium/resource/policy.rb +56 -9
  74. data/lib/plutonium/resource/presenter.rb +44 -12
  75. data/lib/plutonium/resource/query_object.rb +186 -73
  76. data/lib/plutonium/resource/record.rb +213 -119
  77. data/lib/plutonium/rodauth/controller_methods.rb +7 -0
  78. data/lib/plutonium/version.rb +1 -1
  79. data/lib/plutonium.rb +54 -12
  80. data/lib/tasks/create_rodauth_admin.rake +16 -0
  81. data/package-lock.json +174 -0
  82. data/package.json +2 -0
  83. data/public/plutonium-assets/plutonium-app-6WILQCTT.js +39 -0
  84. data/public/plutonium-assets/plutonium-app-6WILQCTT.js.map +7 -0
  85. data/public/plutonium-assets/plutonium-logo-original.png +0 -0
  86. data/public/plutonium-assets/plutonium-logo-white.png +0 -0
  87. data/public/plutonium-assets/plutonium-logo.png +0 -0
  88. data/public/plutonium-assets/plutonium.2d4f0c333cd000051d3b.css +3424 -0
  89. data/public/plutonium-assets/plutonium.8bee7a8482988b0360e3.css +3420 -0
  90. data/public/plutonium-assets/plutonium.ico +0 -0
  91. metadata +44 -7
  92. data/lib/plutonium/reactor/core.rb +0 -78
  93. data/public/plutonium-assets/logo.png +0 -0
  94. /data/lib/generators/pu/rodauth/templates/app/{misc → rodauth}/rodauth_app.rb.tt +0 -0
@@ -38,6 +38,12 @@ module Pu
38
38
  def pug_class
39
39
  "#{pug_name.demodulize}Generator"
40
40
  end
41
+
42
+ def lib_path
43
+ depth = name.split(":").count
44
+ base = ([".."] * depth).join "/"
45
+ "#{base}/lib/plutonium_generators"
46
+ end
41
47
  end
42
48
  end
43
49
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.expand_path('../../../../plutonium_generators', __dir__)
3
+ require_relative "<%= lib_path %>"
4
4
 
5
5
  module Pu
6
6
  module <%= pug_module %>
@@ -22,7 +22,10 @@ module PlutoniumGenerators
22
22
 
23
23
  in_root do
24
24
  create_file ".ruby-version", version, force: true, verbose: false
25
- gsub_file "Gemfile", /^ruby ["'].*["']/, "ruby '~> #{version}'", verbose: false
25
+ gsub_file("Gemfile", /^ruby .*/, "ruby File.read(\".ruby-version\").strip", verbose: false)
26
+ %w[Dockerfile Dockerfile.prod Dockerfile.dev].each do |file|
27
+ gsub_file(file, /^ARG RUBY_VERSION=.*/, "ARG RUBY_VERSION=#{version}", verbose: false) if File.exist?(file)
28
+ end
26
29
  end
27
30
  end
28
31
 
@@ -95,29 +98,84 @@ module PlutoniumGenerators
95
98
  # gsub_file "Gemfile", /(:?^.*#.*\n)*.*gem ['"]#{gem}['"].*\n/, "", verbose: false
96
99
  # end
97
100
 
98
- #
99
- # Evaluates the given template and merges it with the project's docker-compose.yml
100
- #
101
- # @param [String] source the template filename
102
- #
103
- # @return [void]
104
- #
105
- def docker_compose(source)
106
- log :docker_compose, source
101
+ # #
102
+ # # Evaluates the given template and merges it with the project's docker-compose.yml
103
+ # #
104
+ # # @param [String] source the template filename
105
+ # #
106
+ # # @return [void]
107
+ # #
108
+ # def docker_compose(source)
109
+ # log :docker_compose, source
110
+
111
+ # in_root do
112
+ # compose_file = "docker-compose.yml"
113
+ # compose_definition = YAML.load_file(compose_file) if File.exist?(compose_file)
114
+ # compose_definition ||= {
115
+ # version: "3.7",
116
+ # services: {}
117
+ # }
118
+ # compose_definition.deep_stringify_keys!
119
+
120
+ # new_definition = YAML.load template_eval("docker-compose/#{source}.yml.tt")
121
+ # compose_definition.deep_merge! new_definition.deep_stringify_keys
122
+
123
+ # create_file compose_file, YAML.dump(compose_definition), force: true
124
+ # end
125
+ # end
126
+
127
+ def managed_compose(file = "docker-compose.yml")
128
+ @managed_compose ||= {}
129
+
130
+ @managed_compose[file] ||= in_root do
131
+ next unless File.exist?(file)
132
+
133
+ parsed_yaml = YAML.load_file(file, aliases: true)
134
+ parsed_yaml if parsed_yaml["x-managed-by"] == "plutonium"
135
+ end
136
+ end
137
+
138
+ def add_compose_service(service, config, file = "docker-compose.yml")
139
+ docker_compose = managed_compose(file)
140
+ error "Docker compose is not managed by plutonium" unless docker_compose
141
+ error "#{service} is already added to compose" if docker_compose["services"].key?(service.to_s)
107
142
 
108
143
  in_root do
109
- compose_file = "docker-compose.yml"
110
- compose_definition = YAML.load_file(compose_file) if File.exist?(compose_file)
111
- compose_definition ||= {
112
- version: "3.7",
113
- services: {}
114
- }
115
- compose_definition.deep_stringify_keys!
116
-
117
- new_definition = YAML.load template_eval("docker-compose/#{source}.yml.tt")
118
- compose_definition.deep_merge! new_definition.deep_stringify_keys
119
-
120
- create_file compose_file, YAML.dump(compose_definition), force: true
144
+ insert_into_file file, indent(config, 2), after: /.*# additional services go here.*\n/
145
+ end
146
+ end
147
+
148
+ def add_compose_env(key, value, service = "x-app", file = "docker-compose.yml")
149
+ raise NotImplementedError, "only service: x-app is currently supported" unless service == "x-app"
150
+
151
+ docker_compose = managed_compose(file)
152
+ error "Docker compose is not managed by plutonium" unless docker_compose
153
+
154
+ in_root do
155
+ gsub_file file, "environment: {} # x-app", "environment: # #{service}"
156
+ gsub_file file, /.*#{key}:.*# #{service}.*\n/, ""
157
+ config = "#{key}: #{value} # #{service}\n"
158
+ insert_into_file file, indent(config, 4), after: /.*environment: # #{service}.*\n/
159
+ end
160
+ end
161
+
162
+ def add_compose_dependency(value, service = "x-app", file = "docker-compose.yml")
163
+ raise NotImplementedError, "only service: x-app is currently supported" unless service == "x-app"
164
+
165
+ docker_compose = managed_compose(file)
166
+ error "Docker compose is not managed by plutonium" unless docker_compose
167
+
168
+ in_root do
169
+ gsub_file file, "depends_on: [] # x-app", "depends_on: # #{service}"
170
+ gsub_file file, /.*- #{value}.*# #{service}.*\n/, ""
171
+ config = "- #{value} # #{service}\n"
172
+ insert_into_file file, indent(config, 4), after: /.*depends_on: # #{service}.*\n/
173
+ end
174
+ end
175
+
176
+ def add_docker_dependency(config, file = "Dockerfile.dev")
177
+ in_root do
178
+ insert_into_file file, "#{config}\n", after: /.*# Additional dependencies go here*\n\n/
121
179
  end
122
180
  end
123
181
 
@@ -283,6 +341,23 @@ module PlutoniumGenerators
283
341
  end
284
342
  end
285
343
 
344
+ #
345
+ # Insert the given directives into .dockerignore
346
+ #
347
+ # @param [String] *directives directives to ignore
348
+ #
349
+ # @return [void]
350
+ #
351
+ def dockerignore(*directives)
352
+ in_root do
353
+ # Doing this one by one so that duplication detection during insertion will work
354
+ directives.each do |directive|
355
+ log :dockerignore, directive
356
+ insert_into_file ".dockerignore", "#{directive}\n", verbose: false
357
+ end
358
+ end
359
+ end
360
+
286
361
  #
287
362
  # Similar to #run, this executes a command but returns both success and output
288
363
  #
@@ -313,6 +388,58 @@ module PlutoniumGenerators
313
388
  [success, output]
314
389
  end
315
390
 
391
+ def bin_directory
392
+ # Copy the directory and store the list of copied files
393
+ @copied_files = directory "bin"
394
+ # Change permissions of the copied files to make them executable
395
+ in_root do
396
+ @copied_files.each do |file|
397
+ file = file.split("/bin/")[1]
398
+ file = "bin/#{file}"
399
+ puts file
400
+ chmod file, "+x" if File.file?(file)
401
+ end
402
+ end
403
+ end
404
+
405
+ def bundle!
406
+ log :bundle, "install"
407
+
408
+ Bundler.with_unbundled_env do
409
+ run "bundle install", verbose: false
410
+ end
411
+ end
412
+
413
+ def bundle(*gems, **options)
414
+ gems = Array(gems).join " "
415
+ options = hash_to_cli_options options
416
+ cmd_args = "add #{gems} #{options}"
417
+
418
+ log :bundle, cmd_args
419
+ Bundler.with_unbundled_env do
420
+ run "bundle #{cmd_args}", verbose: false
421
+ end
422
+ end
423
+
424
+ def unbundle(*gems)
425
+ gems = Array(gems).join " "
426
+ cmd_args = "remove #{gems}"
427
+
428
+ log :bundle, cmd_args
429
+ Bundler.with_unbundled_env do
430
+ run "bundle remove #{Array(gems).join " "}", verbose: false
431
+ end
432
+ end
433
+
434
+ def add_required_env_vars(*vars)
435
+ vars = Array(vars).join " "
436
+ log :equired_env_vars, vars
437
+ in_root do
438
+ cmd = "required_env_vars += %w[#{vars}]\n"
439
+ insert_into_file "config/initializers/001_ensure_required_env.rb", cmd, after: /# Add additional env vars here.*\n/
440
+ end
441
+ end
442
+
316
443
  private
317
444
 
318
445
  #
@@ -351,16 +478,11 @@ module PlutoniumGenerators
351
478
  end
352
479
  end
353
480
 
354
- def bundle(*gems)
355
- Bundler.with_unbundled_env do
356
- run "bundle add #{Array(gems).join " "}"
357
- end
358
- end
359
-
360
- def unbundle(*gems)
361
- Bundler.with_unbundled_env do
362
- run "bundle remove #{Array(gems).join " "}"
363
- end
481
+ def hash_to_cli_options(hash)
482
+ hash.map do |key, value|
483
+ formatted_value = value.is_a?(Array) ? value.join(",") : value
484
+ "--#{key.to_s.tr("_", "-")}=#{formatted_value}"
485
+ end.join(" ")
364
486
  end
365
487
  end
366
488
  end
@@ -64,13 +64,13 @@ module PlutoniumGenerators
64
64
  @prompt ||= TTY::Prompt.new
65
65
  end
66
66
 
67
- def appname
68
- defined?(Rails.application) ? Rails.application.class.module_parent.name : "PlutoniumGenerators"
69
- end
67
+ # def appname
68
+ # defined?(Rails.application) ? Rails.application.class.module_parent.name : "PlutoniumGenerators"
69
+ # end
70
70
 
71
- def app_name
72
- appname.underscore
73
- end
71
+ # def app_name
72
+ # appname.underscore
73
+ # end
74
74
 
75
75
  def pug_installed?(feature, version: nil)
76
76
  installed_version = read_config(:installed, feature)
@@ -21,7 +21,7 @@ module PlutoniumGenerators
21
21
  protected
22
22
 
23
23
  def install!(feature)
24
- set_ruby_version! if root_pug?
24
+ # set_ruby_version! if root_pug?
25
25
 
26
26
  from_version = read_config(:installed, feature, default: "0.0.0")
27
27
  versions = methods.map do |m|
@@ -1,7 +1,7 @@
1
- <%= package_name %>::Engine.routes.draw do
2
- root to: "dashboard#index"
1
+ <%= package_name %>::Engine.draw_custom_routes do
2
+ # draw custom routes here
3
3
 
4
- # add custom app routes here
4
+ root to: "dashboard#index"
5
5
  end
6
6
 
7
7
  # draw routes for registered resources
@@ -28,7 +28,7 @@ module Pu
28
28
  end
29
29
 
30
30
  def create_rodauth_app
31
- template "app/misc/account_rodauth_plugin.rb", "app/misc/#{account_path}_rodauth_plugin.rb"
31
+ template "app/rodauth/account_rodauth_plugin.rb", "app/rodauth/#{account_path}_rodauth_plugin.rb"
32
32
  end
33
33
 
34
34
  def configure_rodauth_plugin
@@ -36,16 +36,16 @@ module Pu
36
36
  plugin_name = indent(
37
37
  "configure ::#{account_path.classify}RodauthPlugin#{", :#{table_prefix}" unless primary?}\n", 2
38
38
  )
39
- gsub_file "app/misc/rodauth_app.rb", /.*# configure RodauthMain\n/, ""
40
- insert_into_file "app/misc/rodauth_app.rb", plugin_name, after: "# auth configuration\n"
39
+ gsub_file "app/rodauth/rodauth_app.rb", /.*# configure RodauthMain\n/, ""
40
+ insert_into_file "app/rodauth/rodauth_app.rb", plugin_name, after: "# auth configuration\n"
41
41
  end
42
42
  end
43
43
 
44
44
  def configure_rodauth_plugin_load_route
45
45
  in_root do
46
46
  route_config = indent("r.rodauth#{"(:#{table_prefix})" unless primary?}\n", 4)
47
- gsub_file "app/misc/rodauth_app.rb", /.*# r\.rodauth\n/, ""
48
- insert_into_file "app/misc/rodauth_app.rb", route_config, after: "# auth route configuration\n"
47
+ gsub_file "app/rodauth/rodauth_app.rb", /.*# r\.rodauth\n/, ""
48
+ insert_into_file "app/rodauth/rodauth_app.rb", route_config, after: "# auth route configuration\n"
49
49
  end
50
50
  end
51
51
 
@@ -54,15 +54,15 @@ module Pu
54
54
  plugin_config = indent(
55
55
  "rodauth#{"(:#{table_prefix})" unless primary?}.load_memory # autologin remembered #{table}\n", 4
56
56
  )
57
- gsub_file "app/misc/rodauth_app.rb", /.*# rodauth\.load_memory.*\n/, ""
57
+ gsub_file "app/rodauth/rodauth_app.rb", /.*# rodauth\.load_memory.*\n/, ""
58
58
 
59
59
  if remember?
60
- insert_into_file "app/misc/rodauth_app.rb", plugin_config, after: "# plugin route configuration\n"
60
+ insert_into_file "app/rodauth/rodauth_app.rb", plugin_config, after: "# plugin route configuration\n"
61
61
  else
62
- gsub_file "app/misc/rodauth_app.rb", plugin_config, ""
62
+ gsub_file "app/rodauth/rodauth_app.rb", plugin_config, ""
63
63
  in_root do
64
- unless File.read("app/misc/rodauth_app.rb").match?(/.*\.load_memory # autologin/)
65
- insert_into_file "app/misc/rodauth_app.rb", indent("# rodauth.load_memory # autologin remembered users\n", 4),
64
+ unless File.read("app/rodauth/rodauth_app.rb").match?(/.*\.load_memory # autologin/)
65
+ insert_into_file "app/rodauth/rodauth_app.rb", indent("# rodauth.load_memory # autologin remembered users\n", 4),
66
66
  after: "# plugin route configuration\n"
67
67
  end
68
68
  end
@@ -1,9 +1,12 @@
1
1
  require "rails/generators/base"
2
+ require "rails/generators/active_record/migration"
2
3
  require "securerandom"
3
4
 
4
5
  module Pu
5
6
  module Rodauth
6
7
  class InstallGenerator < ::Rails::Generators::Base
8
+ include ::ActiveRecord::Generators::Migration
9
+
7
10
  SEQUEL_ADAPTERS = {
8
11
  "postgresql" => (RUBY_ENGINE == "jruby") ? "postgresql" : "postgres",
9
12
  "mysql2" => (RUBY_ENGINE == "jruby") ? "mysql" : "mysql2",
@@ -31,8 +34,8 @@ module Pu
31
34
  end
32
35
 
33
36
  def create_rodauth_app
34
- template "app/misc/rodauth_app.rb"
35
- template "app/misc/rodauth_plugin.rb"
37
+ template "app/rodauth/rodauth_app.rb"
38
+ template "app/rodauth/rodauth_plugin.rb"
36
39
  end
37
40
 
38
41
  def add_dev_config
@@ -41,6 +44,10 @@ module Pu
41
44
  before: /^end/
42
45
  end
43
46
 
47
+ def create_install_migration
48
+ migration_template "db/migrate/install_rodauth.rb", "db/migrate/install_rodauth.rb" # , File.join(db_migrate_path, "#{migration_name}.rb")
49
+ end
50
+
44
51
  def show_instructions
45
52
  readme "INSTRUCTIONS" if behavior == :invoke
46
53
  end
@@ -12,6 +12,6 @@ create_table :<%= table_prefix %>_authentication_audit_logs do
12
12
  <% else -%>
13
13
  String :metadata
14
14
  <% end -%>
15
- index [:<%= table_prefix %>_id, :at], name: :audit_<%= table_prefix %>_at_idx
16
- index :at, name: :audit_at_idx
15
+ index [:<%= table_prefix %>_id, :at], name: :<%= table_prefix %>_audit_<%= table_prefix %>_at_idx
16
+ index :at, name: :<%= table_prefix %>_audit_at_idx
17
17
  end
@@ -69,7 +69,7 @@ module Pu
69
69
  private
70
70
 
71
71
  def plugin_filename
72
- "app/misc/#{account_path}_rodauth_plugin.rb"
72
+ "app/rodauth/#{account_path}_rodauth_plugin.rb"
73
73
  end
74
74
 
75
75
  def migration_name
@@ -38,8 +38,8 @@ class <%= account_path.classify %>RodauthPlugin < RodauthPlugin
38
38
  rails_account_model { <%= account_path.classify %> }
39
39
  <% if verify_account? -%>
40
40
 
41
- # Set password when verifying account.
42
- verify_account_set_password? false
41
+ # Set password password during create account.
42
+ # verify_account_set_password? false
43
43
  <% end -%>
44
44
 
45
45
  # Change some default param keys.
@@ -50,9 +50,6 @@ class RodauthPlugin < Rodauth::Rails::Auth
50
50
  # Store account status in an integer column without foreign key constraint.
51
51
  account_status_column :status
52
52
 
53
- # Set password when verifying account.
54
- # verify_account_set_password? false
55
-
56
53
  # Change some default param keys/labels.
57
54
  login_label "Email"
58
55
  login_param "email"
@@ -0,0 +1,5 @@
1
+ class InstallRodauth < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
+ def change
3
+ enable_extension "citext"
4
+ end
5
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../lib/plutonium_generators"
4
+
5
+ module Pu
6
+ module Service
7
+ class PostgresGenerator < Rails::Generators::Base
8
+ include PlutoniumGenerators::Generator
9
+
10
+ source_root File.expand_path("templates", __dir__)
11
+
12
+ desc "Set up postgres for project"
13
+
14
+ def start
15
+ bundle "goldiloader"
16
+ template "database.yml", "config/database.yml", force: true
17
+ bin_directory
18
+ add_compose_env :POSTGRES_HOST, service
19
+ add_compose_dependency service
20
+ add_compose_service service, compose_config
21
+ add_docker_dependency docker_deps
22
+ rescue => e
23
+ exception "#{self.class} failed:", e
24
+ end
25
+
26
+ private
27
+
28
+ def service
29
+ :postgres
30
+ end
31
+
32
+ def compose_config
33
+ <<~COMPOSE
34
+ postgres:
35
+ image: postgres:15 # postgres
36
+ # postgres properties
37
+ environment: # postgres
38
+ POSTGRES_MULTIPLE_DATABASES: #{db_prefix}_development,#{db_prefix}_test # postgres
39
+ POSTGRES_USER: postgres # postgres
40
+ POSTGRES_PASSWORD: postgres # postgres
41
+ volumes: # postgres
42
+ - "./.volumes/postgres/data:/var/lib/postgresql/data" # postgres
43
+ - "./bin/initdb.d:/docker-entrypoint-initdb.d" # postgres
44
+ COMPOSE
45
+ end
46
+
47
+ def docker_deps
48
+ <<~DEPS
49
+ # Install packages needed for postgres
50
+ RUN apt-get update -qq && \\
51
+ apt-get install --no-install-recommends -y curl postgresql-client && \\
52
+ rm -rf /var/lib/apt/lists /var/cache/apt/archives
53
+ DEPS
54
+ end
55
+
56
+ def db_prefix
57
+ Plutonium.application_name.underscore
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,22 @@
1
+ #!/bin/bash
2
+
3
+ set -e
4
+ set -u
5
+
6
+ function create_user_and_database() {
7
+ local database=$1
8
+ echo " Creating user and database '$database'"
9
+ psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
10
+ CREATE USER $database;
11
+ CREATE DATABASE $database;
12
+ GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
13
+ EOSQL
14
+ }
15
+
16
+ if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
17
+ echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
18
+ for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
19
+ create_user_and_database $db
20
+ done
21
+ echo "Multiple databases created"
22
+ fi
@@ -0,0 +1,93 @@
1
+ # PostgreSQL. Versions 9.3 and up are supported.
2
+ #
3
+ # Install the pg driver:
4
+ # gem install pg
5
+ # On macOS with Homebrew:
6
+ # gem install pg -- --with-pg-config=/usr/local/bin/pg_config
7
+ # On Windows:
8
+ # gem install pg
9
+ # Choose the win32 build.
10
+ # Install PostgreSQL and put its /bin directory on your path.
11
+ #
12
+ # Configure Using Gemfile
13
+ # gem "pg"
14
+ #
15
+ default: &default
16
+ adapter: postgresql
17
+ encoding: unicode
18
+ # For details on connection pooling, see Rails configuration guide
19
+ # https://guides.rubyonrails.org/configuring.html#database-pooling
20
+ pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
21
+ # Timeouts
22
+ connect_timeout: 1
23
+ checkout_timeout: 1
24
+ variables:
25
+ statement_timeout: <%%= ENV["STATEMENT_TIMEOUT"] || "15s" %> # or ms, min, etc
26
+
27
+ local: &local
28
+ host: <%%= ENV["POSTGRES_HOST"] %>
29
+ port: 5432
30
+ username: postgres
31
+ password: postgres
32
+
33
+ development:
34
+ <<: [*default, *local]
35
+ database: <%= db_prefix %>_development
36
+
37
+ # The specified database role being used to connect to PostgreSQL.
38
+ # To create additional roles in PostgreSQL see `$ createuser --help`.
39
+ # When left blank, PostgreSQL will use the default role. This is
40
+ # the same name as the operating system user running Rails.
41
+ #username: <%= db_prefix %>
42
+
43
+ # The password associated with the PostgreSQL role (username).
44
+ #password:
45
+
46
+ # Connect on a TCP socket. Omitted by default since the client uses a
47
+ # domain socket that doesn't need configuration. Windows does not have
48
+ # domain sockets, so uncomment these lines.
49
+ #host: localhost
50
+
51
+ # The TCP port the server listens on. Defaults to 5432.
52
+ # If your server runs on a different port number, change accordingly.
53
+ #port: 5432
54
+
55
+ # Schema search path. The server defaults to $user,public
56
+ #schema_search_path: myapp,sharedapp,public
57
+
58
+ # Minimum log levels, in increasing order:
59
+ # debug5, debug4, debug3, debug2, debug1,
60
+ # log, notice, warning, error, fatal, and panic
61
+ # Defaults to warning.
62
+ #min_messages: notice
63
+
64
+ # Warning: The database defined as "test" will be erased and
65
+ # re-generated from your development database when you run "rake".
66
+ # Do not set this db to the same as development or production.
67
+ test:
68
+ <<: [*default, *local]
69
+ database: <%= db_prefix %>_test
70
+
71
+ # As with config/credentials.yml, you never want to store sensitive information,
72
+ # like your database password, in your source code. If your source code is
73
+ # ever seen by anyone, they now have access to your database.
74
+ #
75
+ # Instead, provide the password or a full connection URL as an environment
76
+ # variable when you boot the app. For example:
77
+ #
78
+ # DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
79
+ #
80
+ # If the connection URL is provided in the special DATABASE_URL environment
81
+ # variable, Rails will automatically merge its configuration values on top of
82
+ # the values provided in this file. Alternatively, you can specify a connection
83
+ # URL environment variable explicitly:
84
+ #
85
+ # production:
86
+ # url: <%%= ENV["MY_APP_DATABASE_URL"] %>
87
+ #
88
+ # Read https://guides.rubyonrails.org/configuring.html#configuring-a-database
89
+ # for a full overview on how database connection configuration can be specified.
90
+ #
91
+ production:
92
+ <<: *default
93
+ database: <%= db_prefix %>_production
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../../lib/plutonium_generators"
4
+
5
+ module Pu
6
+ module Service
7
+ class SidekiqGenerator < Rails::Generators::Base
8
+ include PlutoniumGenerators::Generator
9
+
10
+ source_root File.expand_path("templates", __dir__)
11
+
12
+ desc "Set up sidekiq for project"
13
+
14
+ def start
15
+ bundle "sidekiq"
16
+ bundle "sidekiq-failures"
17
+ directory "app"
18
+ directory "config"
19
+
20
+ in_root do
21
+ insert_into_file "app/jobs/application_job.rb", "\n sidekiq_options failures: :exhausted\n", before: /^end/
22
+ end
23
+
24
+ add_compose_env :REDIS_QUEUE_URL, "redis://redis-queue/0"
25
+ add_required_env_vars :REDIS_QUEUE_URL
26
+ add_compose_dependency redis_service
27
+ add_compose_service service, sidekiq_compose_config
28
+ add_compose_service redis_service, redis_compose_config
29
+ rescue => e
30
+ exception "#{self.class} failed:", e
31
+ end
32
+
33
+ private
34
+
35
+ def service
36
+ :sidekiq
37
+ end
38
+
39
+ def redis_service
40
+ :"redis-queue"
41
+ end
42
+
43
+ def sidekiq_compose_config
44
+ <<~COMPOSE
45
+ sidekiq:
46
+ <<: *app # sidekiq
47
+ command: /bin/sh -c "bundle && sidekiq" # sidekiq
48
+ # sidekiq properties
49
+ COMPOSE
50
+ end
51
+
52
+ def redis_compose_config
53
+ <<~COMPOSE
54
+ redis-queue:
55
+ image: redis # redis-queue
56
+ command: bash -c "redis-server --maxmemory-policy noeviction" # redis-queue
57
+ # redis-queue properties
58
+ COMPOSE
59
+ end
60
+ end
61
+ end
62
+ end
File without changes