hephaestus 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +13 -0
  4. data/LICENSE.txt +9 -0
  5. data/README.md +19 -0
  6. data/bin/hephaestus +55 -0
  7. data/lib/hephaestus/actions/strip_comments_action.rb +263 -0
  8. data/lib/hephaestus/actions.rb +116 -0
  9. data/lib/hephaestus/app_builder.rb +168 -0
  10. data/lib/hephaestus/exit_on_failure.rb +22 -0
  11. data/lib/hephaestus/generators/app_generator.rb +158 -0
  12. data/lib/hephaestus/generators/base.rb +65 -0
  13. data/lib/hephaestus/generators/config_generator.rb +102 -0
  14. data/lib/hephaestus/generators/core_generator.rb +50 -0
  15. data/lib/hephaestus/generators/deployment_generator.rb +18 -0
  16. data/lib/hephaestus/generators/lib_generator.rb +16 -0
  17. data/lib/hephaestus/generators/license_generator.rb +16 -0
  18. data/lib/hephaestus/generators/rubocop_generator.rb +18 -0
  19. data/lib/hephaestus/generators/sorbet_generator.rb +16 -0
  20. data/lib/hephaestus/version.rb +11 -0
  21. data/lib/hephaestus.rb +21 -0
  22. data/templates/Gemfile.erb +121 -0
  23. data/templates/Procfile.debug +2 -0
  24. data/templates/Procfile.dev +2 -0
  25. data/templates/README.md.erb +1 -0
  26. data/templates/app/controllers/application_controller.rb +107 -0
  27. data/templates/app/controllers/concerns/authable.rb +32 -0
  28. data/templates/app/controllers/root_controller.rb +11 -0
  29. data/templates/app/controllers/settings_controller.rb +7 -0
  30. data/templates/app/controllers/staff_controller.rb +15 -0
  31. data/templates/app/controllers/yetto_controller.rb +30 -0
  32. data/templates/app/jobs/application_job.rb +10 -0
  33. data/templates/app/jobs/update_yetto_job.rb +27 -0
  34. data/templates/app/lib/body_parameter/yetto_parameters.rb +8 -0
  35. data/templates/app/lib/body_parameter.rb +6 -0
  36. data/templates/app/lib/constants/app.rb +8 -0
  37. data/templates/app/lib/headers/yetto.rb +17 -0
  38. data/templates/app/lib/headers.rb +5 -0
  39. data/templates/app/lib/path_parameter/yetto_parameters.rb +25 -0
  40. data/templates/app/lib/path_parameter.rb +8 -0
  41. data/templates/app/lib/plug_app/http.rb +34 -0
  42. data/templates/app/lib/plug_app/middleware/malformed_request.rb +110 -0
  43. data/templates/app/lib/plug_app/middleware/not_found.rb +41 -0
  44. data/templates/app/lib/plug_app/middleware/openapi_validation.rb +54 -0
  45. data/templates/app/lib/plug_app/middleware/tracing_attributes.rb +42 -0
  46. data/templates/app/lib/query_parameter.rb +6 -0
  47. data/templates/app/serializers/error_serializer.rb +16 -0
  48. data/templates/app/services/yetto_service.rb +61 -0
  49. data/templates/app/views/settings/index.json.jbuilder +15 -0
  50. data/templates/config/initializers/cors.rb +18 -0
  51. data/templates/config/initializers/environment.rb +30 -0
  52. data/templates/config/initializers/filter_parameter_logging.rb +22 -0
  53. data/templates/config/initializers/inflections.rb +20 -0
  54. data/templates/config/initializers/lograge.rb +25 -0
  55. data/templates/config/initializers/open_telemetry.rb +27 -0
  56. data/templates/config/initializers/sidekiq.rb +11 -0
  57. data/templates/config/initializers/slack_webhook_logger.rb +17 -0
  58. data/templates/config/sidekiq.yml +18 -0
  59. data/templates/hephaestus_gitignore +296 -0
  60. data/templates/lib/plug_app/schemas/api/2023-03-06/components/parameters/headers/yetto.json +42 -0
  61. data/templates/lib/plug_app/schemas/api/2023-03-06/components/parameters/plugInstallation.json +12 -0
  62. data/templates/lib/plug_app/schemas/api/2023-03-06/components/schemas/plug.json +9 -0
  63. data/templates/lib/plug_app/schemas/api/2023-03-06/components/schemas/responses.json +64 -0
  64. data/templates/lib/plug_app/schemas/api/2023-03-06/components/schemas/yetto.json +1 -0
  65. data/templates/lib/plug_app/schemas/api/2023-03-06/openapi.json +27 -0
  66. data/templates/lib/plug_app/schemas/api/2023-03-06/paths/plug.json +91 -0
  67. data/templates/lib/plug_app/schemas/api/2023-03-06/paths/yetto/after_create_message.json +41 -0
  68. data/templates/lib/plug_app/schemas/api/2023-03-06/paths/yetto/after_create_plug_installation.json +41 -0
  69. data/templates/lib/tasks/test_tasks.rake +10 -0
  70. data/templates/script/ci +7 -0
  71. data/templates/script/hmac_text +22 -0
  72. data/templates/script/licenses +51 -0
  73. data/templates/script/ngrok +5 -0
  74. data/templates/script/security_checks/brakeman +5 -0
  75. data/templates/script/security_checks/bundle-audit +5 -0
  76. data/templates/script/server +5 -0
  77. data/templates/script/server-debug +5 -0
  78. data/templates/script/test +5 -0
  79. data/templates/script/typecheck +42 -0
  80. data/templates/sorbet/custom.rbi +14 -0
  81. data/templates/test/controllers/root_controller_test.rb +12 -0
  82. data/templates/test/controllers/settings_controller_test.rb +27 -0
  83. data/templates/test/controllers/yetto_controller_test.rb +130 -0
  84. data/templates/test/jobs/update_yetto_job_test.rb +41 -0
  85. data/templates/test/support/api.rb +74 -0
  86. data/templates/test/support/rails.rb +39 -0
  87. data/templates/test/support/webmocks/slack_webmock.rb +24 -0
  88. data/templates/test/support/webmocks/yetto.rb +94 -0
  89. data/templates/test/support/webmocks.rb +5 -0
  90. data/templates/test/test_helper.rb +24 -0
  91. metadata +209 -0
@@ -0,0 +1,158 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require "rails/generators"
5
+ require "rails/generators/rails/app/app_generator"
6
+
7
+ module Hephaestus
8
+ class AppGenerator < Rails::Generators::AppGenerator
9
+ include ExitOnFailure
10
+
11
+ hide!
12
+
13
+ class_option :version,
14
+ type: :boolean,
15
+ aliases: "-v",
16
+ group: :hephaestus,
17
+ desc: "Show Hephaestus version number and quit"
18
+
19
+ class_option :help,
20
+ type: :boolean,
21
+ aliases: "-h",
22
+ group: :hephaestus,
23
+ desc: "Show this help message and quit"
24
+
25
+ def finish_template
26
+ say("Invoking Hephaestus customization")
27
+ invoke(:hephaestus_customization)
28
+ super
29
+ end
30
+
31
+ def leftovers
32
+ build(:replace_generic_variables)
33
+ generate("hephaestus:license")
34
+ generate("hephaestus:rubocop")
35
+
36
+ generate("hephaestus:sorbet")
37
+ invoke(:commit)
38
+ invoke(:outro)
39
+ end
40
+
41
+ def hephaestus_customization
42
+ invoke(:customize_gemfile)
43
+ invoke(:copy_github_actions)
44
+ invoke(:setup_development_environment)
45
+ invoke(:setup_staging_environment)
46
+ invoke(:setup_production_environment)
47
+ invoke(:setup_test_environment)
48
+ invoke(:configure_app)
49
+ invoke(:purge_unneeded_files)
50
+ invoke(:copy_vscode_settings)
51
+ invoke(:generate_default)
52
+ invoke(:create_github_repo)
53
+ end
54
+
55
+ def customize_gemfile
56
+ build(:replace_gemfile)
57
+ bundle_command("install")
58
+ bundle_command("lock --add-platform x86_64-linux")
59
+ end
60
+
61
+ def copy_github_actions
62
+ source = File.join(Hephaestus::AppGenerator.source_root, ".github")
63
+ directory(source, ".github")
64
+ end
65
+
66
+ def setup_development_environment
67
+ say("Setting up the development environment")
68
+ build(:configure_local_mail)
69
+ build(:raise_on_delivery_errors)
70
+ build(:configure_dev_hosting)
71
+ build(:copy_setup_scripts)
72
+ end
73
+
74
+ def copy_vscode_settings
75
+ source = File.join(Hephaestus::AppGenerator.source_root, ".vscode")
76
+ directory(source, ".vscode")
77
+ end
78
+
79
+ def purge_unneeded_files
80
+ remove_dir("app/assets")
81
+ remove_file("app/controllers/concerns/.keep")
82
+ remove_dir("app/helpers")
83
+ remove_dir("app/models")
84
+ remove_dir("app/views/layouts")
85
+ remove_dir("lib/assets")
86
+ remove_dir("lib/tasks/.keep")
87
+ remove_dir("test/helpers")
88
+ remove_dir("test/channels")
89
+ remove_dir("test/models")
90
+ end
91
+
92
+ def setup_staging_environment
93
+ build(:setup_staging_environment)
94
+ end
95
+
96
+ def setup_production_environment
97
+ say("Setting up the production environment")
98
+ build(:setup_asset_host)
99
+ build(:setup_background_worker)
100
+ build(:setup_slack_logger)
101
+ end
102
+
103
+ def setup_test_environment
104
+ say("Setting up the production environment")
105
+ build(:setup_test_environment)
106
+ end
107
+
108
+ def configure_app
109
+ say("Configuring app")
110
+ build(:configure_time_formats)
111
+ end
112
+
113
+ def create_github_repo
114
+ if !options[:skip_git] && options[:github]
115
+ say("Creating Github repo")
116
+ build(:create_github_repo, options[:github])
117
+ end
118
+ end
119
+
120
+ def generate_default
121
+ run("spring stop > /dev/null 2>&1 || true")
122
+
123
+ generate("hephaestus:core")
124
+ generate("hephaestus:deployment")
125
+ generate("hephaestus:lib")
126
+
127
+ # keep this at the end
128
+ generate("hephaestus:config")
129
+ end
130
+
131
+ def commit
132
+ run("git add .")
133
+ run("git commit -m 'Initial commit'")
134
+ end
135
+
136
+ def outro
137
+ say("\nCongratulations! You just made a plug.")
138
+ say("\nTry running `rails c` to ensure that everything was set up correctly.")
139
+ say("\nRunning `rake test` is also a good idea.")
140
+ end
141
+
142
+ class << self
143
+ def banner
144
+ "hephaestus #{arguments.map(&:usage).join(" ")} [options]"
145
+ end
146
+ end
147
+
148
+ protected
149
+
150
+ def get_builder_class # rubocop:disable Naming/AccessorMethodName
151
+ Hephaestus::AppBuilder
152
+ end
153
+
154
+ def using_active_record?
155
+ !options[:skip_active_record]
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,65 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require "rails/generators"
5
+ require_relative "../actions"
6
+
7
+ module Hephaestus
8
+ module Generators
9
+ class Base < Rails::Generators::Base
10
+ include Hephaestus::Actions
11
+ include ExitOnFailure
12
+
13
+ class << self
14
+ def default_source_root
15
+ File.expand_path(File.join("..", "..", "..", "templates"), __dir__)
16
+ end
17
+
18
+ def inherited(subclass)
19
+ super
20
+
21
+ description_file = File.expand_path(
22
+ File.join(
23
+ default_source_root,
24
+ "descriptions",
25
+ "#{subclass.generator_name}.md",
26
+ ),
27
+ )
28
+
29
+ subclass.desc(File.read(description_file))
30
+ rescue Errno::ENOENT # rubocop:disable Lint/SuppressedException
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def app_name
37
+ Rails.app_class.module_parent_name.demodulize.underscore.dasherize
38
+ end
39
+
40
+ def empty_directory_with_keep_file(destination)
41
+ empty_directory(destination, {})
42
+ keep_file(destination)
43
+ end
44
+
45
+ def keep_file(destination)
46
+ create_file(File.join(destination, ".keep"))
47
+ end
48
+
49
+ def append_template_to_file(destination, source, *args)
50
+ partial = File.expand_path(find_in_source_paths(source))
51
+ append_to_file(destination, File.read(partial, *args))
52
+ end
53
+
54
+ def prepend_template_to_file(destination, source, *args)
55
+ partial = File.expand_path(find_in_source_paths(source))
56
+ prepend_to_file(destination, File.read(partial, *args))
57
+ end
58
+
59
+ def inject_template_into_file(destination, source, *args)
60
+ partial = File.expand_path(find_in_source_paths(source))
61
+ inject_into_file(destination, File.read(partial), *args)
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,102 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class ConfigGenerator < Generators::Base
8
+ def application
9
+ config = <<~CONFIG
10
+
11
+
12
+ if ENV.fetch("DEBUG", false) && defined?(Rails::Server) && Rails.env.development?
13
+ require "debug/open_nonstop"
14
+ end
15
+
16
+ CONFIG
17
+
18
+ inject_into_file(
19
+ "config/application.rb",
20
+ config,
21
+ after: "require \"rails/test_unit/railtie\"",
22
+ )
23
+ inject_into_file(
24
+ "config/application.rb",
25
+ "\n CURRENT_VERSION = \"2023-03-06\"\n\n",
26
+ before: "class Application < Rails::Application",
27
+ )
28
+
29
+ config = <<~CONFIG
30
+
31
+ # Only loads a smaller set of middleware suitable for API only apps.
32
+ # Middleware like session, flash, cookies can be added back manually.
33
+ # Skip views, helpers and assets when generating a new resource.
34
+ config.api_only = true
35
+
36
+ Rails.root.glob("app/lib/#{app_name.underscore}/middleware/*.{rb}").each { |file| require_relative file }
37
+
38
+ config.middleware.insert(0, PlugEmail::Middleware::TracingAttributes)
39
+ config.middleware.insert(0, PlugEmail::Middleware::MalformedRequest)
40
+
41
+ config.middleware.use(PlugEmail::Middleware::OpenapiValidation)
42
+
43
+ GIT_SHA = %x(git rev-parse HEAD).chomp
44
+ CONFIG
45
+
46
+ inject_into_file(
47
+ "config/application.rb",
48
+ config,
49
+ before: "\n end",
50
+ )
51
+
52
+ replace_in_file(
53
+ "config/application.rb",
54
+ "require \"rails\"\n",
55
+ "",
56
+ )
57
+
58
+ comment_lines("config/application.rb", "require \"active_model/railtie\"")
59
+ uncomment_lines("config/application.rb", "require \"active_job/railtie\"")
60
+ end
61
+
62
+ def boot
63
+ boot = "require \"bootsnap/setup\" # Speed up boot time by caching expensive operations."
64
+ inject_into_file(
65
+ "config/boot.rb",
66
+ boot,
67
+ )
68
+ end
69
+
70
+ def initializers
71
+ remove_dir("config/initializers")
72
+ directory("config/initializers", "config/initializers")
73
+ end
74
+
75
+ def configure_routes
76
+ routes = <<~ROUTES
77
+ root "root#index"
78
+
79
+ # events into the plug, usually from yetto
80
+ get "/api/2023-03-06/settings", to: "settings#index"
81
+ post "/api/2023-03-06/:event/:record_type", to: "yetto#event"
82
+
83
+ # Staff pages
84
+ get "staff", to: "staff#index"
85
+ require "sidekiq/web"
86
+ constraints ->(request) { StaffController.staff_request?(request) } do
87
+ mount Sidekiq::Web => "staff/sidekiq"
88
+ end
89
+ ROUTES
90
+
91
+ replace_in_file(
92
+ "config/routes.rb",
93
+ "# root \"articles#index\"",
94
+ routes,
95
+ )
96
+ end
97
+
98
+ def sidekiq
99
+ copy_file("config/sidekiq.yml", "config/sidekiq.yml")
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,50 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class CoreGenerator < Generators::Base
8
+ def controllers
9
+ remove_file("app/controllers/application_controller.rb")
10
+ copy_file("app/controllers/application_controller.rb", "app/controllers/application_controller.rb")
11
+
12
+ copy_file("app/controllers/root_controller.rb", "app/controllers/root_controller.rb")
13
+ copy_file("app/controllers/settings_controller.rb", "app/controllers/settings_controller.rb")
14
+ copy_file("app/controllers/staff_controller.rb", "app/controllers/staff_controller.rb")
15
+ copy_file("app/controllers/yetto_controller.rb", "app/controllers/yetto_controller.rb")
16
+
17
+ copy_file("app/controllers/concerns/authable.rb", "app/controllers/concerns/authable.rb")
18
+ end
19
+
20
+ def jobs
21
+ copy_file("app/jobs/application_job.rb", "app/jobs/application_job.rb")
22
+ copy_file("app/jobs/update_yetto_job.rb", "app/jobs/update_yetto_job.rb")
23
+ end
24
+
25
+ def libs
26
+ bare_app_name = app_name.split("-").last
27
+ copy_file("app/lib/body_parameter/yetto_parameters.rb", "app/lib/body_parameter/yetto_parameters.rb")
28
+ copy_file("app/lib/constants/app.rb", "app/lib/constants/#{bare_app_name}.rb")
29
+ copy_file("app/lib/headers/yetto.rb", "app/lib/headers/yetto.rb")
30
+ copy_file("app/lib/path_parameter/yetto_parameters.rb", "app/lib/path_parameter/yetto_parameters.rb")
31
+ directory("app/lib/plug_app", "app/lib/#{app_name.underscore}")
32
+
33
+ copy_file("app/lib/body_parameter.rb", "app/lib/body_parameter.rb")
34
+ copy_file("app/lib/headers.rb", "app/lib/headers.rb")
35
+ copy_file("app/lib/path_parameter.rb", "app/lib/path_parameter.rb")
36
+ end
37
+
38
+ def serializers
39
+ copy_file("app/serializers/error_serializer.rb", "app/serializers/error_serializer.rb")
40
+ end
41
+
42
+ def services
43
+ copy_file("app/services/yetto_service.rb", "app/services/yetto_service.rb")
44
+ end
45
+
46
+ def views
47
+ copy_file("app/views/settings/index.json.jbuilder", "app/views/settings/index.json.jbuilder")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,18 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class DeploymentGenerator < Generators::Base
8
+ def procfile
9
+ copy_file("Procfile.dev", "Procfile.dev")
10
+ copy_file("Procfile.debug", "Procfile.debug")
11
+ end
12
+
13
+ def sample_env
14
+ copy_file(".env.test", ".env.test")
15
+ copy_file(".env.test", ".env")
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class LibGenerator < Generators::Base
8
+ def lib_plug
9
+ directory("lib/plug_app", "lib/#{app_name.underscore}")
10
+ end
11
+
12
+ def lib_tasks
13
+ directory("lib/tasks", "lib/tasks")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class LicenseGenerator < Generators::Base
8
+ def licensed
9
+ copy_file(".licensed.yml", ".licensed.yml")
10
+ end
11
+
12
+ def generate_licenses
13
+ run("script/licenses --update")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class RubocopGenerator < Generators::Base
8
+ def rubocop
9
+ copy_file(".rubocop.yml", ".rubocop.yml")
10
+ end
11
+
12
+ def lint
13
+ Bundler.with_unbundled_env do
14
+ run("bundle exec rubocop -A", abort_on_failure: false)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ require_relative "base"
5
+
6
+ module Hephaestus
7
+ class SorbetGenerator < Generators::Base
8
+ def sorbet
9
+ copy_file("sorbet/custom.rbi", "sorbet/custom.rbi")
10
+ Bundler.with_unbundled_env do
11
+ run("bundle exec tapioca init")
12
+ run("script/typecheck --update")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ module Hephaestus
5
+ VERSION = "0.0.1"
6
+ RAILS_VERSION = "~> 7.0.0"
7
+ RUBY_VERSION = File
8
+ .read("#{File.dirname(__FILE__)}/../../.ruby-version")
9
+ .strip
10
+ .freeze
11
+ end
data/lib/hephaestus.rb ADDED
@@ -0,0 +1,21 @@
1
+ # typed: false
2
+ # frozen_string_literal: true
3
+
4
+ DEBUG = ENV.fetch("DEBUG", false)
5
+
6
+ def debugging?
7
+ DEBUG
8
+ end
9
+
10
+ require "debug" if debugging?
11
+
12
+ require "hephaestus/version"
13
+ require "hephaestus/exit_on_failure"
14
+ require "hephaestus/generators/app_generator"
15
+ Dir.glob(File.join(__dir__, "hephaestus", "generators", "*.rb")).each do |file|
16
+ require file
17
+ end
18
+
19
+ require "hephaestus/actions"
20
+ require "hephaestus/actions/strip_comments_action"
21
+ require "hephaestus/app_builder"
@@ -0,0 +1,121 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) do |repo_name|
4
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
5
+ "https://github.com/#{repo_name}.git"
6
+ end
7
+
8
+ ruby "<%= Hephaestus::RUBY_VERSION %>"
9
+
10
+ # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
11
+ gem "rails", "~> 7.0"
12
+
13
+ # Use the Puma web server [https://github.com/puma/puma]
14
+ gem "puma", "~> 6.1"
15
+
16
+ # for making kick-ass http queries
17
+ gem "httpx", "~> 0.22"
18
+
19
+ # Build JSON APIs with ease [https://github.com/rails/jbuilder]
20
+ gem "jbuilder", "~> 2.11"
21
+
22
+ # Use Redis adapter to run Action Cable in production
23
+ gem "redis", "~> 5.0"
24
+
25
+ # Use hiredis to get better performance than the "redis" gem
26
+ gem "hiredis", "~> 0.6"
27
+
28
+ # better loggin'
29
+ gem "lograge", "~> 0.12"
30
+
31
+ # provides middleware to make OpenAPI parsing simpler
32
+ gem "openapi_first", "~> 0.20"
33
+
34
+ # For Honeycomb.io
35
+ gem "opentelemetry-sdk", "~> 1.1"
36
+ gem "opentelemetry-exporter-otlp", "~> 0.23"
37
+ gem "opentelemetry-semantic_conventions", "~> 1.1"
38
+
39
+ gem "opentelemetry-instrumentation-rack", "~> 0.22"
40
+ gem "opentelemetry-instrumentation-rails", "~> 0.24"
41
+ gem "opentelemetry-instrumentation-concurrent_ruby", "~> 0.20"
42
+
43
+ gem "opentelemetry-instrumentation-net_http", "~> 0.21"
44
+
45
+ gem "opentelemetry-instrumentation-active_job", "~> 0.4"
46
+ gem "opentelemetry-instrumentation-redis", "~> 0.24"
47
+ gem "opentelemetry-instrumentation-sidekiq", "~> 0.23"
48
+
49
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
50
+ gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
51
+
52
+ # Reduces boot times through caching; required in config/boot.rb
53
+ gem "bootsnap", require: false
54
+
55
+ gem "safety_dance", "~> 1.0"
56
+
57
+ # Use Sidekiq for the jobs queue
58
+ gem "sidekiq", "~> 7.0"
59
+
60
+ # sends logs to Slack
61
+ gem "slack_webhook_logger", "~> 0.1"
62
+
63
+ group :development, :test do
64
+ # better debug output with `ap`
65
+ gem "amazing_print"
66
+
67
+ # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
68
+ gem "debug", platforms: [:mri, :mingw, :x64_mingw], require: false
69
+
70
+ gem "faker", "~> 2.20"
71
+ gem "rubocop", require: false
72
+ gem "rubocop-standard", require: false
73
+ end
74
+
75
+ group :development do
76
+ gem "dotenv-rails"
77
+
78
+ gem "foreman", "~> 0.87"
79
+
80
+ gem "licensed", "~> 4.0"
81
+
82
+ gem "ruby-lsp", "~> 0.3", require: false
83
+
84
+ gem "spoom"
85
+ gem "sorbet"
86
+ gem "tapioca", require: false
87
+ end
88
+ gem "sorbet-runtime"
89
+
90
+ group :test do
91
+ # Adds support for Capybara system testing and selenium driver
92
+ gem "capybara", "~> 3.26"
93
+
94
+ # track down flakey tests
95
+ gem "minitest-bisect"
96
+
97
+ # mocking lib
98
+ gem "mocha"
99
+
100
+ # allow easier middleware testing
101
+ gem "rack-test", "~> 2.0"
102
+
103
+ # navigate website
104
+ gem "selenium-webdriver"
105
+
106
+ # jump around through time
107
+ gem "timecop", "~> 0.9"
108
+
109
+ # Easy installation and use of web drivers to run system tests with browsers
110
+ gem "webdrivers", "~> 5.0", require: false
111
+
112
+ # prevents real http requests
113
+ gem "webmock", "~> 3.8"
114
+ end
115
+
116
+ group :ci do
117
+ gem "brakeman", "~> 5.3"
118
+ gem "bundle-audit", "~> 0.1"
119
+ end
120
+
121
+ gem "hephaestus", group: [:development, :test]
@@ -0,0 +1,2 @@
1
+ web: rdbg -n --open=vscode -c -- bin/rails server -p 6661
2
+ worker: bundle exec sidekiq -c 2
@@ -0,0 +1,2 @@
1
+ web: bin/rails server -p 6661
2
+ worker: bundle exec sidekiq -c 2
@@ -0,0 +1 @@
1
+ # <%= app_name.titlecase %>