Skip to content

Commit

Permalink
wip devcontainer generator
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewn617 committed May 17, 2024
1 parent 05b9cdb commit e8f4266
Show file tree
Hide file tree
Showing 7 changed files with 148 additions and 13 deletions.
4 changes: 0 additions & 4 deletions railties/lib/rails/generators/app_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -450,10 +450,6 @@ def to_s
end
end

def gem_ruby_version
Gem::Version.new(Gem::VERSION) >= Gem::Version.new("3.3.13") ? Gem.ruby_version : RUBY_VERSION
end

def rails_prerelease?
options.dev? || options.edge? || options.main?
end
Expand Down
4 changes: 4 additions & 0 deletions railties/lib/rails/generators/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,10 @@ def self.default_generator_root # :doc:
path = File.expand_path(File.join(base_name, generator_name), base_root)
path if File.exist?(path)
end

def gem_ruby_version
Gem::Version.new(Gem::VERSION) >= Gem::Version.new("3.3.13") ? Gem.ruby_version : RUBY_VERSION
end
end
end
end
17 changes: 12 additions & 5 deletions railties/lib/rails/generators/rails/app/app_generator.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# frozen_string_literal: true

require "rails/generators/app_base"
require "rails/generators/rails/devcontainer/devcontainer_generator"

module Rails
module ActionMethods # :nodoc:
Expand Down Expand Up @@ -268,11 +269,17 @@ def config_target_version
end

def devcontainer
empty_directory ".devcontainer"

template ".devcontainer/devcontainer.json"
template ".devcontainer/Dockerfile"
template ".devcontainer/compose.yaml"
devcontainer_options = {
database: options[:database],
redis: !(options[:skip_action_cable] && options[:skip_active_job]),
system_test: depends_on_system_test?,
active_storage: !options[:skip_active_storage],
dev: options[:dev],
node: using_node?,
app_name: app_name
}

Rails::Generators::Devcontainer::DevcontainerGenerator.new([], devcontainer_options).generate
end
end

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# frozen_string_literal: true

require "rails/generators"

module Rails
module Generators
module Devcontainer
class DevcontainerGenerator < Base # :nodoc:
class_option :database, enum: Database::DATABASES, type: :string,
desc: "Database"

class_option :redis, type: :boolean, default: true,
desc: "Redis"

class_option :system_test, type: :boolean, default: true,
desc: "System"

class_option :active_storage, type: :boolean, default: true,
desc: "System"

class_option :node, type: :boolean, default: false,
desc: "System"

class_option :dev, type: :boolean, default: false,
desc: "Dev"

class_option :app_name, type: :string, default: "Rails app", desc: "Name"

def generate
empty_directory ".devcontainer"

template ".devcontainer/devcontainer.json"
template ".devcontainer/Dockerfile"
template ".devcontainer/compose.yaml"
end

private
def devcontainer_dependencies
return @devcontainer_dependencies if @devcontainer_dependencies

@devcontainer_dependencies = []

@devcontainer_dependencies << "selenium" if options[:system_test]
@devcontainer_dependencies << "redis" if options[:redis]
@devcontainer_dependencies << database.name if database.service
@devcontainer_dependencies
end

def devcontainer_variables
return @devcontainer_variables if @devcontainer_variables

@devcontainer_variables = {}

@devcontainer_variables["CAPYBARA_SERVER_PORT"] = "45678" if options[:system_test]
@devcontainer_variables["SELENIUM_HOST"] = "selenium" if options[:system_test]
@devcontainer_variables["REDIS_URL"] = "redis://redis:6379/1" if options[:redis]
@devcontainer_variables["DB_HOST"] = database.name if database.service

@devcontainer_variables
end

def devcontainer_volumes
return @devcontainer_volumes if @devcontainer_volumes

@devcontainer_volumes = []

@devcontainer_volumes << "redis-data" if options[:redis]
@devcontainer_volumes << database.volume if database.volume

@devcontainer_volumes
end

def devcontainer_features
return @devcontainer_features if @devcontainer_features

@devcontainer_features = {
"ghcr.io/devcontainers/features/github-cli:1" => {}
}

@devcontainer_features["ghcr.io/rails/devcontainer/features/activestorage"] = {} if options[:active_storage]
@devcontainer_features["ghcr.io/devcontainers/features/node:1"] = {} if options[:node]

@devcontainer_features.merge!(database.feature) if database.feature

@devcontainer_features
end

def devcontainer_mounts
return @devcontainer_mounts if @devcontainer_mounts

@devcontainer_mounts = []

@devcontainer_mounts << local_rails_mount if options[:dev]

@devcontainer_mounts
end

def devcontainer_forward_ports
return @devcontainer_forward_ports if @devcontainer_forward_ports

@devcontainer_forward_ports = [3000]
@devcontainer_forward_ports << database.port if database.port
@devcontainer_forward_ports << 6379 if options[:redis]

@devcontainer_forward_ports
end

def database
@database ||= Database.build(options[:database])
end

def devcontainer_db_service_yaml(**options)
return unless service = database.service

{ database.name => service }.to_yaml(**options)[4..-1]
end

def local_rails_mount
{
type: "bind",
source: Rails::Generators::RAILS_DEV_PATH,
target: Rails::Generators::RAILS_DEV_PATH
}
end
end
end
end
end
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: "<%= app_name %>"
name: "<%= options[:app_name] %>"

services:
rails-app:
Expand Down Expand Up @@ -28,7 +28,7 @@ services:
- <%= dependency %>
<%- end -%>
<%- end -%>
<%- if depends_on_system_test? -%>
<%- if options[:system_test] -%>

selenium:
image: seleniarm/standalone-chromium
Expand All @@ -37,7 +37,7 @@ services:
- default
<%- end -%>

<%- if devcontainer_needs_redis? -%>
<%- if options[:redis] -%>
redis:
image: redis:7.2
restart: unless-stopped
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/ruby
{
"name": "<%= app_name %>",
"name": "<%= options[:app_name] %>",
"dockerComposeFile": "compose.yaml",
"service": "rails-app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
Expand Down

0 comments on commit e8f4266

Please sign in to comment.