rails_template_18f 0.1.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +4 -1
  5. data/README.md +16 -19
  6. data/exe/rails_template_18f +60 -0
  7. data/lib/generators/rails_template18f/active_storage/active_storage_generator.rb +135 -0
  8. data/lib/generators/rails_template18f/active_storage/templates/app/jobs/file_scan_job.rb +33 -0
  9. data/lib/generators/rails_template18f/active_storage/templates/app/models/file_upload.rb +25 -0
  10. data/lib/generators/rails_template18f/active_storage/templates/doc/adr/clamav.md.tt +30 -0
  11. data/lib/generators/rails_template18f/active_storage/templates/spec/jobs/file_scan_job_spec.rb +35 -0
  12. data/lib/generators/rails_template18f/active_storage/templates/spec/models/file_upload_spec.rb +38 -0
  13. data/lib/generators/rails_template18f/circleci/circleci_generator.rb +26 -10
  14. data/lib/generators/rails_template18f/cloud_gov_config/cloud_gov_config_generator.rb +28 -0
  15. data/lib/generators/rails_template18f/cloud_gov_config/templates/app/models/cloud_gov_config.rb +15 -0
  16. data/lib/generators/rails_template18f/cloud_gov_config/templates/spec/models/cloud_gov_config_spec.rb +44 -0
  17. data/lib/generators/rails_template18f/dap/dap_generator.rb +72 -0
  18. data/lib/generators/rails_template18f/github_actions/github_actions_generator.rb +27 -11
  19. data/lib/generators/rails_template18f/i18n/i18n_generator.rb +107 -0
  20. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/en.yml.tt +3 -3
  21. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/es.yml +3 -3
  22. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/fr.yml +3 -6
  23. data/{templates → lib/generators/rails_template18f/i18n/templates}/config/locales/zh.yml +0 -0
  24. data/lib/generators/rails_template18f/i18n_js/i18n_js_generator.rb +60 -0
  25. data/lib/generators/rails_template18f/i18n_js/templates/lib/tasks/i18n.rake +9 -0
  26. data/lib/generators/rails_template18f/newrelic/newrelic_generator.rb +79 -0
  27. data/{templates/config/newrelic.yml → lib/generators/rails_template18f/newrelic/templates/config/newrelic.yml.tt} +7 -7
  28. data/lib/generators/rails_template18f/sidekiq/sidekiq_generator.rb +70 -0
  29. data/lib/generators/rails_template18f/sidekiq/templates/config/initializers/redis.rb +14 -0
  30. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/README.md.tt +0 -0
  31. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/import.sh +0 -0
  32. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/main.tf.tt +3 -3
  33. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/providers.tf +0 -0
  34. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/run.sh.tt +1 -1
  35. data/lib/generators/rails_template18f/terraform/templates/terraform/bootstrap/teardown_creds.sh.tt +5 -0
  36. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/bootstrap/variables.tf +0 -0
  37. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/create_space_deployer.sh +0 -0
  38. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/destroy_space_deployer.sh +0 -0
  39. data/lib/generators/rails_template18f/terraform/templates/terraform/production/main.tf.tt +82 -0
  40. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/providers.tf.tt +0 -0
  41. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/production/variables.tf +0 -0
  42. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/clamav/main.tf.tt +50 -0
  43. data/{templates/terraform/shared/database → lib/generators/rails_template18f/terraform/templates/terraform/shared/clamav}/providers.tf +0 -0
  44. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/clamav/variables.tf +47 -0
  45. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/main.tf.tt +0 -0
  46. data/{templates/terraform/shared/domain → lib/generators/rails_template18f/terraform/templates/terraform/shared/database}/providers.tf +0 -0
  47. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/database/variables.tf +0 -0
  48. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/main.tf.tt +1 -1
  49. data/{templates/terraform/shared/s3 → lib/generators/rails_template18f/terraform/templates/terraform/shared/domain}/providers.tf +0 -0
  50. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/domain/variables.tf +0 -0
  51. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/redis/main.tf.tt +23 -0
  52. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/redis/providers.tf +16 -0
  53. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/redis/variables.tf +42 -0
  54. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/main.tf +0 -0
  55. data/lib/generators/rails_template18f/terraform/templates/terraform/shared/s3/providers.tf +16 -0
  56. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/shared/s3/variables.tf +0 -0
  57. data/lib/generators/rails_template18f/terraform/templates/terraform/staging/main.tf.tt +62 -0
  58. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/providers.tf.tt +0 -0
  59. data/{templates → lib/generators/rails_template18f/terraform/templates}/terraform/staging/variables.tf +0 -0
  60. data/lib/generators/rails_template18f/terraform/terraform_generator.rb +84 -0
  61. data/lib/rails_template18f/app_updater.rb +19 -0
  62. data/lib/rails_template18f/generators/base.rb +53 -0
  63. data/lib/rails_template18f/generators/cloud_gov_options.rb +53 -0
  64. data/lib/rails_template18f/generators/pipeline_options.rb +18 -0
  65. data/lib/rails_template18f/generators.rb +11 -0
  66. data/lib/rails_template18f/version.rb +1 -1
  67. data/lib/rails_template_18f.rb +1 -4
  68. data/rails-template-18f.gemspec +1 -0
  69. data/template.rb +84 -148
  70. data/templates/README.md.tt +7 -44
  71. data/templates/config/deployment/staging.yml +1 -1
  72. data/templates/config/environments/ci.rb +0 -1
  73. data/templates/doc/compliance/apps/application.boundary.md.tt +4 -31
  74. data/templates/githooks/{pre-commit.tt → pre-commit} +0 -15
  75. data/templates/manifest.yml.tt +1 -2
  76. metadata +77 -34
  77. data/lib/rails_template18f/terraform_options.rb +0 -68
  78. data/templates/terraform/bootstrap/teardown_creds.sh.tt +0 -5
  79. data/templates/terraform/production/main.tf.tt +0 -50
  80. data/templates/terraform/staging/main.tf.tt +0 -30
@@ -0,0 +1,82 @@
1
+ locals {
2
+ cf_org_name = "<%= cloud_gov_organization %>"
3
+ cf_space_name = "<%= cloud_gov_production_space %>"
4
+ env = "production"
5
+ recursive_delete = false
6
+ }
7
+
8
+ module "database" {
9
+ source = "../shared/database"
10
+
11
+ cf_user = var.cf_user
12
+ cf_password = var.cf_password
13
+ cf_org_name = local.cf_org_name
14
+ cf_space_name = local.cf_space_name
15
+ env = local.env
16
+ recursive_delete = local.recursive_delete
17
+ rds_plan_name = "TKTK-production-rds-plan"
18
+ }
19
+ <% if has_active_job? %>
20
+ module "redis" {
21
+ source = "../shared/redis"
22
+
23
+ cf_user = var.cf_user
24
+ cf_password = var.cf_password
25
+ cf_org_name = local.cf_org_name
26
+ cf_space_name = local.cf_space_name
27
+ env = local.env
28
+ recursive_delete = local.recursive_delete
29
+ redis_plan_name = "TKTK-production-redis-plan"
30
+ }
31
+ <% end %>
32
+ <% if has_active_storage? %>
33
+ module "s3" {
34
+ source = "../shared/s3"
35
+
36
+ cf_user = var.cf_user
37
+ cf_password = var.cf_password
38
+ cf_org_name = local.cf_org_name
39
+ cf_space_name = local.cf_space_name
40
+ recursive_delete = local.recursive_delete
41
+ s3_service_name = "<%= app_name %>-s3-${local.env}"<% if cloud_gov_organization == "sandbox-gsa" %>
42
+ s3_plan_name = "basic-sandbox"<% end %>
43
+ }
44
+
45
+ ###########################################################################
46
+ # The following lines need to be commented out for the initial `terraform apply`
47
+ # It can be re-enabled after:
48
+ # 1) the app has first been deployed
49
+ # 2) Your organization has sufficient memory. Each clamav app requires 3GB
50
+ ###########################################################################
51
+ # module "clamav" {
52
+ # source = "../shared/clamav"
53
+ #
54
+ # cf_user = var.cf_user
55
+ # cf_password = var.cf_password
56
+ # cf_org_name = local.cf_org_name
57
+ # cf_space_name = local.cf_space_name
58
+ # env = local.env
59
+ # clamav_image = "ajilaag/clamav-rest:20211229"
60
+ # max_file_size = "30M"
61
+ # }
62
+ <% end %>
63
+
64
+ ###########################################################################
65
+ # The following lines need to be commented out for the initial `terraform apply`
66
+ # It can be re-enabled after:
67
+ # 1) the app has first been deployed
68
+ # 2) the route has been manually created by an OrgManager:
69
+ # `cf create-domain <%= cloud_gov_organization %> TKTK-production-domain-name`
70
+ ###########################################################################
71
+ # module "domain" {
72
+ # source = "../shared/domain"
73
+ #
74
+ # cf_user = var.cf_user
75
+ # cf_password = var.cf_password
76
+ # cf_org_name = local.cf_org_name
77
+ # cf_space_name = local.cf_space_name
78
+ # env = local.env
79
+ # recursive_delete = local.recursive_delete
80
+ # cdn_plan_name = "domain"
81
+ # domain_name = "TKTK-production-domain-name"
82
+ # }
@@ -0,0 +1,50 @@
1
+ ###
2
+ # Target space/org
3
+ ###
4
+
5
+ data "cloudfoundry_space" "space" {
6
+ org_name = var.cf_org_name
7
+ name = var.cf_space_name
8
+ }
9
+
10
+ data "cloudfoundry_domain" "internal" {
11
+ name = "apps.internal"
12
+ }
13
+
14
+ data "cloudfoundry_app" "app" {
15
+ name_or_id = "<%= app_name %>-${var.env}"
16
+ space = data.cloudfoundry_space.space.id
17
+ }
18
+
19
+ ###
20
+ # ClamAV API app
21
+ ###
22
+
23
+ resource "cloudfoundry_route" "clamav_route" {
24
+ space = data.cloudfoundry_space.space.id
25
+ domain = data.cloudfoundry_domain.internal.id
26
+ hostname = "<%= app_name %>-clamapi-${var.env}"
27
+ }
28
+
29
+ resource "cloudfoundry_app" "clamav_api" {
30
+ name = "<%= app_name %>-clamav-api-${var.env}"
31
+ space = data.cloudfoundry_space.space.id
32
+ memory = var.clamav_memory
33
+ disk_quota = 2048
34
+ timeout = 600
35
+ docker_image = var.clamav_image
36
+ routes {
37
+ route = cloudfoundry_route.clamav_route.id
38
+ }
39
+ environment = {
40
+ MAX_FILE_SIZE = var.max_file_size
41
+ }
42
+ }
43
+
44
+ resource "cloudfoundry_network_policy" "clamav_routing" {
45
+ policy {
46
+ source_app = data.cloudfoundry_app.app.id
47
+ destination_app = cloudfoundry_app.clamav_api.id
48
+ port = "9443"
49
+ }
50
+ }
@@ -0,0 +1,47 @@
1
+ variable "cf_api_url" {
2
+ type = string
3
+ description = "cloud.gov api url"
4
+ default = "https://api.fr.cloud.gov"
5
+ }
6
+
7
+ variable "cf_user" {
8
+ type = string
9
+ description = "cloud.gov deployer account user"
10
+ }
11
+
12
+ variable "cf_password" {
13
+ type = string
14
+ description = "secret; cloud.gov deployer account password"
15
+ sensitive = true
16
+ }
17
+
18
+ variable "cf_org_name" {
19
+ type = string
20
+ description = "cloud.gov organization name"
21
+ }
22
+
23
+ variable "cf_space_name" {
24
+ type = string
25
+ description = "cloud.gov space name (staging or prod)"
26
+ }
27
+
28
+ variable "env" {
29
+ type = string
30
+ description = "deployment environment (staging, production)"
31
+ }
32
+
33
+ variable "clamav_image" {
34
+ type = string
35
+ description = "Docker image to deploy the clamav api app"
36
+ }
37
+
38
+ variable "clamav_memory" {
39
+ type = number
40
+ description = "Memory in MB to allocate to clamav app"
41
+ default = 3072
42
+ }
43
+
44
+ variable "max_file_size" {
45
+ type = string
46
+ description = "Maximum file size the API will accept for scanning"
47
+ }
@@ -19,7 +19,7 @@ data "cloudfoundry_app" "app" {
19
19
  ###########################################################################
20
20
  # Route must be manually created by an OrgManager before terraform is run:
21
21
  #
22
- # cf create-domain <%= @cloud_gov_organization %> TKTK-production-domain-name
22
+ # cf create-domain <%= cloud_gov_organization %> TKTK-production-domain-name
23
23
  ###########################################################################
24
24
  data "cloudfoundry_domain" "origin_url" {
25
25
  name = var.domain_name
@@ -0,0 +1,23 @@
1
+ ###
2
+ # Target space/org
3
+ ###
4
+
5
+ data "cloudfoundry_space" "space" {
6
+ org_name = var.cf_org_name
7
+ name = var.cf_space_name
8
+ }
9
+
10
+ ###
11
+ # RDS instance
12
+ ###
13
+
14
+ data "cloudfoundry_service" "redis" {
15
+ name = "aws-elasticache-redis"
16
+ }
17
+
18
+ resource "cloudfoundry_service_instance" "redis" {
19
+ name = "<%= app_name %>-redis-${var.env}"
20
+ space = data.cloudfoundry_space.space.id
21
+ service_plan = data.cloudfoundry_service.redis.service_plans[var.redis_plan_name]
22
+ recursive_delete = var.recursive_delete
23
+ }
@@ -0,0 +1,16 @@
1
+ terraform {
2
+ required_version = "~> 1.0"
3
+ required_providers {
4
+ cloudfoundry = {
5
+ source = "cloudfoundry-community/cloudfoundry"
6
+ version = "0.15.0"
7
+ }
8
+ }
9
+ }
10
+
11
+ provider "cloudfoundry" {
12
+ api_url = var.cf_api_url
13
+ user = var.cf_user
14
+ password = var.cf_password
15
+ app_logs_max = 30
16
+ }
@@ -0,0 +1,42 @@
1
+ variable "cf_api_url" {
2
+ type = string
3
+ description = "cloud.gov api url"
4
+ default = "https://api.fr.cloud.gov"
5
+ }
6
+
7
+ variable "cf_user" {
8
+ type = string
9
+ description = "cloud.gov deployer account user"
10
+ }
11
+
12
+ variable "cf_password" {
13
+ type = string
14
+ description = "secret; cloud.gov deployer account password"
15
+ sensitive = true
16
+ }
17
+
18
+ variable "cf_org_name" {
19
+ type = string
20
+ description = "cloud.gov organization name"
21
+ }
22
+
23
+ variable "cf_space_name" {
24
+ type = string
25
+ description = "cloud.gov space name (staging or prod)"
26
+ }
27
+
28
+ variable "env" {
29
+ type = string
30
+ description = "deployment environment (staging, production)"
31
+ }
32
+
33
+ variable "recursive_delete" {
34
+ type = bool
35
+ description = "when true, deletes service bindings attached to the resource (not recommended for production)"
36
+ default = false
37
+ }
38
+
39
+ variable "redis_plan_name" {
40
+ type = string
41
+ description = "name of the service plan name to create"
42
+ }
@@ -0,0 +1,16 @@
1
+ terraform {
2
+ required_version = "~> 1.0"
3
+ required_providers {
4
+ cloudfoundry = {
5
+ source = "cloudfoundry-community/cloudfoundry"
6
+ version = "0.15.0"
7
+ }
8
+ }
9
+ }
10
+
11
+ provider "cloudfoundry" {
12
+ api_url = var.cf_api_url
13
+ user = var.cf_user
14
+ password = var.cf_password
15
+ app_logs_max = 30
16
+ }
@@ -0,0 +1,62 @@
1
+ locals {
2
+ cf_org_name = "<%= cloud_gov_organization %>"
3
+ cf_space_name = "<%= cloud_gov_staging_space %>"
4
+ env = "staging"
5
+ recursive_delete = true
6
+ }
7
+
8
+ module "database" {
9
+ source = "../shared/database"
10
+
11
+ cf_user = var.cf_user
12
+ cf_password = var.cf_password
13
+ cf_org_name = local.cf_org_name
14
+ cf_space_name = local.cf_space_name
15
+ env = local.env
16
+ recursive_delete = local.recursive_delete
17
+ rds_plan_name = "micro-psql"
18
+ }
19
+ <% if has_active_job? %>
20
+ module "redis" {
21
+ source = "../shared/redis"
22
+
23
+ cf_user = var.cf_user
24
+ cf_password = var.cf_password
25
+ cf_org_name = local.cf_org_name
26
+ cf_space_name = local.cf_space_name
27
+ env = local.env
28
+ recursive_delete = local.recursive_delete
29
+ redis_plan_name = "redis-dev"
30
+ }
31
+ <% end %>
32
+ <% if has_active_storage? %>
33
+ module "s3" {
34
+ source = "../shared/s3"
35
+
36
+ cf_user = var.cf_user
37
+ cf_password = var.cf_password
38
+ cf_org_name = local.cf_org_name
39
+ cf_space_name = local.cf_space_name
40
+ recursive_delete = local.recursive_delete
41
+ s3_service_name = "<%= app_name %>-s3-${local.env}"<% if cloud_gov_organization == "sandbox-gsa" %>
42
+ s3_plan_name = "basic-sandbox"<% end %>
43
+ }
44
+
45
+ ###########################################################################
46
+ # The following lines need to be commented out for the initial `terraform apply`
47
+ # It can be re-enabled after:
48
+ # 1) the app has first been deployed
49
+ # 2) Your organization has sufficient memory. Each clamav app requires 3GB
50
+ ###########################################################################
51
+ # module "clamav" {
52
+ # source = "../shared/clamav"
53
+ #
54
+ # cf_user = var.cf_user
55
+ # cf_password = var.cf_password
56
+ # cf_org_name = local.cf_org_name
57
+ # cf_space_name = local.cf_space_name
58
+ # env = local.env
59
+ # clamav_image = "ajilaag/clamav-rest:20211229"
60
+ # max_file_size = "30M"
61
+ # }
62
+ <% end %>
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ module RailsTemplate18f
6
+ module Generators
7
+ class TerraformGenerator < ::Rails::Generators::Base
8
+ include Base
9
+ include CloudGovOptions
10
+
11
+ desc <<~DESC
12
+ Description:
13
+ Install terraform files for cloud.gov database and s3 services
14
+ DESC
15
+
16
+ def install
17
+ directory "terraform", mode: :preserve
18
+ chmod "terraform/bootstrap/run.sh", 0o755
19
+ chmod "terraform/bootstrap/teardown_creds.sh", 0o755
20
+ end
21
+
22
+ def ignore_files
23
+ unless skip_git?
24
+ append_to_file ".gitignore", <<~EOM
25
+
26
+ # Terraform
27
+ .terraform.lock.hcl
28
+ **/.terraform/*
29
+ secrets.auto.tfvars
30
+ terraform.tfstate
31
+ terraform.tfstate.backup
32
+ EOM
33
+ end
34
+ end
35
+
36
+ def update_readme
37
+ gsub_file "README.md", /^(### Automatic linting)/, '\1 and terraform formatting'
38
+ gsub_file "README.md", /(ruby linting) (on every)/, '\1 and terraform formatting \2'
39
+ gsub_file "README.md", /^Before the first deploy only.*$/, "Follow the instructions in `terraform/README.md` to create the supporting services."
40
+ end
41
+
42
+ def install_githook
43
+ githook_file = ".githooks/pre-commit"
44
+ if File.exist?(File.expand_path(githook_file, destination_root))
45
+ append_to_file githook_file, "\n#{githook_content}"
46
+ else
47
+ create_file githook_file, <<~EOM
48
+ #! /usr/bin/env bash
49
+ #
50
+ # This hook runs on `git commit` and will prevent you from committing without
51
+ # approval from the linter and tests.
52
+ #
53
+ # To run, this file must be symlinked to:
54
+ # .git/hooks/pre-commit
55
+ #
56
+ # To bypass this hook, run:
57
+ # $ git commit --no-verify
58
+ # $ git commit -n
59
+
60
+ #{githook_content}
61
+ EOM
62
+ chmod githook_file, 0o755
63
+ end
64
+ end
65
+
66
+ no_tasks do
67
+ def githook_content
68
+ <<~EOM
69
+ echo "Running Terraform formatter"
70
+ files=$(git diff --cached --name-only terraform)
71
+ for f in $files
72
+ do
73
+ # Format any *.tf files that were cached/staged
74
+ if [ -e "$f" ] && [[ $f == *.tf ]]; then
75
+ terraform fmt "$f"
76
+ git add "$f"
77
+ fi
78
+ done
79
+ EOM
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,19 @@
1
+ require "rails/app_updater"
2
+
3
+ module AppUpdaterOptions
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ def generator_options
8
+ options = super
9
+ # These options all end up hardcoded to true in the default `rails app:update`
10
+ options[:skip_active_job] = !defined?(ActiveJob::Railtie)
11
+ options[:skip_action_mailbox] = !defined?(ActionMailbox::Engine)
12
+ options[:skip_action_text] = !defined?(ActionText::Engine)
13
+ options[:skip_test] = !defined?(Rails::TestUnitRailtie)
14
+ options
15
+ end
16
+ end
17
+ end
18
+
19
+ Rails::AppUpdater.prepend(AppUpdaterOptions)
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTemplate18f
4
+ module Generators
5
+ module Base
6
+ extend ActiveSupport::Concern
7
+ include ::Rails::Generators::AppName
8
+
9
+ class_methods do
10
+ attr_accessor :source_path
11
+
12
+ def source_root
13
+ @source_root ||= File.expand_path("templates", File.dirname(source_path))
14
+ end
15
+ end
16
+
17
+ included do
18
+ self.source_path = RailsTemplate18f::Generators.const_source_location(name).first
19
+ end
20
+
21
+ private
22
+
23
+ def file_content(filename)
24
+ file_path = File.expand_path(filename, destination_root)
25
+ if File.exist? file_path
26
+ File.read(file_path)
27
+ else
28
+ ""
29
+ end
30
+ end
31
+
32
+ def ruby_version
33
+ RUBY_VERSION
34
+ end
35
+
36
+ def terraform_dir_exists?
37
+ Dir.exist? File.expand_path("terraform", destination_root)
38
+ end
39
+
40
+ def skip_git?
41
+ !Dir.exist?(File.expand_path(".git", destination_root))
42
+ end
43
+
44
+ def has_active_job?
45
+ defined?(::ActiveJob)
46
+ end
47
+
48
+ def has_active_storage?
49
+ defined?(::ActiveStorage)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTemplate18f
4
+ module Generators
5
+ module CloudGovOptions
6
+ extend ActiveSupport::Concern
7
+
8
+ included do
9
+ class_option :cg_org, desc: "cloud.gov organization name"
10
+ class_option :cg_staging, desc: "cloud.gov space name for staging"
11
+ class_option :cg_prod, desc: "cloud.gov space name for production"
12
+ end
13
+
14
+ private
15
+
16
+ def cloud_gov_organization
17
+ if options[:cg_org].present?
18
+ return options[:cg_org]
19
+ elsif terraform_dir_exists?
20
+ staging_main = file_content("terraform/staging/main.tf")
21
+ if (matches = staging_main.match(/cf_org_name\s+= "(?<org_name>.*)"/))
22
+ return matches[:org_name]
23
+ end
24
+ end
25
+ "TKTK-cloud.gov-org-name"
26
+ end
27
+
28
+ def cloud_gov_staging_space
29
+ if options[:cg_staging].present?
30
+ return options[:cg_staging]
31
+ elsif terraform_dir_exists?
32
+ staging_main = file_content("terraform/staging/main.tf")
33
+ if (matches = staging_main.match(/cf_space_name\s+= "(?<space_name>.*)"/))
34
+ return matches[:space_name]
35
+ end
36
+ end
37
+ "staging"
38
+ end
39
+
40
+ def cloud_gov_production_space
41
+ if options[:cg_prod].present?
42
+ return options[:cg_prod]
43
+ elsif terraform_dir_exists?
44
+ prod_main = file_content("terraform/production/main.tf")
45
+ if (matches = prod_main.match(/cf_space_name\s+= "(?<space_name>.*)"/))
46
+ return matches[:space_name]
47
+ end
48
+ end
49
+ "prod"
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTemplate18f
4
+ module Generators
5
+ module PipelineOptions
6
+ extend ActiveSupport::Concern
7
+ include CloudGovOptions
8
+
9
+ included do
10
+ class_option :terraform, type: :boolean, desc: "Generate actions for planning and applying terraform"
11
+ end
12
+
13
+ def terraform?
14
+ options[:terraform].nil? ? terraform_dir_exists? : options[:terraform]
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsTemplate18f
4
+ module Generators
5
+ extend ActiveSupport::Autoload
6
+
7
+ autoload :Base
8
+ autoload :CloudGovOptions
9
+ autoload :PipelineOptions
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsTemplate18f
4
- VERSION = "0.1.0"
4
+ VERSION = "0.4.0"
5
5
  end
@@ -1,12 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "rails_template18f/version"
4
+ require_relative "rails_template18f/generators"
4
5
 
5
6
  module RailsTemplate18f
6
- extend ActiveSupport::Autoload
7
-
8
- autoload :TerraformOptions
9
-
10
7
  class Error < StandardError; end
11
8
 
12
9
  class Railtie < ::Rails::Railtie; end
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  # guide at: https://bundler.io/guides/creating_gem.html
34
34
  spec.add_dependency "railties", "~> 7.0.0"
35
35
  spec.add_dependency "activesupport", "~> 7.0.0"
36
+ spec.add_dependency "thor", "~> 1.0"
36
37
 
37
38
  spec.add_development_dependency "rspec", "~> 3.11"
38
39
  spec.add_development_dependency "ammeter", "~> 1.1"