modulorails 1.5.0.pre2 → 1.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 928b92b50a47d10967876fd9fec84d9f1e0da9b9082d642a48cb2ee0eb49be89
4
- data.tar.gz: 599f3d7b1546dfa9b294e8c09d9f1d429ad9d2b2ce69914c62f53e45cf213776
3
+ metadata.gz: 49cd77852f9aee93c053c1722f8332ad44fa712f2ff00830ddd44ab0e873a722
4
+ data.tar.gz: 6ce2b6f0314ee71f843bdc4f012ceda11ead2b326e98e954b517e334e1646fde
5
5
  SHA512:
6
- metadata.gz: 3bcc2bc9acd9c84f41dd80c60036adffdcc85eb4c79c549209852d8dd918806e5d488d40df6b222648512e056b4d09f0f94f894a97215472577d222eea1d996e
7
- data.tar.gz: '09cad76576542012ce824cd16891309d6d6e1b380b808e9839799294d099da9b9f6406a71be92a2d7ac8345044fd11c46bf9b8c28580fbb876b12ff06a8d86d3'
6
+ metadata.gz: 104ac0e4ab98f6194fec633367c0a87b25198fa5c8f0aef3cadac808ff8328c1c96fa1b11bd6881690f414c0400b9eacfc86a083c982a60e87039358c5ad8274
7
+ data.tar.gz: 3652ed356e878e708d54ae4d17cb18707afd7deabe57846cacdb2fc53caff699ae1c0cb3a932699a0829fd01be80978a406960df7eb534fec1c16daa1b124c36
data/CHANGELOG.md CHANGED
@@ -4,7 +4,7 @@ This file is used to list changes made in each version of the gem.
4
4
 
5
5
  # Unreleased
6
6
 
7
- # 1.5.0
7
+ # 1.5.1
8
8
 
9
9
  - Update templates according to new standards:
10
10
  - Optimize layers in Dockerfile.prod.
@@ -28,6 +28,10 @@ This file is used to list changes made in each version of the gem.
28
28
  - Deprecate `Modulorails::BaseService#log` and `Modulorails::LogsForMethodService`.
29
29
  - Add a common base for all generators.
30
30
 
31
+ # 1.5.0
32
+
33
+ - Released then
34
+
31
35
  # 1.4.0.1
32
36
 
33
37
  - Fix auto-update.
@@ -67,7 +67,7 @@ class Modulorails::DockerGenerator < Modulorails::Generators::Base
67
67
 
68
68
  def create_new_file(old_file, new_file, executable: true)
69
69
  if File.exist?(old_file)
70
- copy_file old_file, new_file
70
+ copy_original_file old_file, new_file
71
71
  remove_file old_file
72
72
  else
73
73
  template old_file, new_file
@@ -75,4 +75,20 @@ class Modulorails::DockerGenerator < Modulorails::Generators::Base
75
75
  chmod new_file, 0o755 if executable
76
76
  end
77
77
 
78
+ def copy_original_file(source, *args, &block)
79
+ config = args.last.is_a?(Hash) ? args.pop : {}
80
+ destination = args.first || source
81
+ source = File.expand_path(source, destination_root)
82
+
83
+ create_file destination, nil, config do
84
+ content = File.binread(source)
85
+ content = yield(content) if block
86
+ content
87
+ end
88
+ if config[:mode] == :preserve
89
+ mode = File.stat(source).mode
90
+ chmod(destination, mode, config)
91
+ end
92
+ end
93
+
78
94
  end
@@ -21,4 +21,4 @@ if [ "$1" = "./bin/rails" ] && [ "$2" = "server" ]; then
21
21
  fi
22
22
 
23
23
  # Execute the CMD
24
- exec "$@"
24
+ exec "${@}"
@@ -18,7 +18,7 @@ module Modulorails
18
18
  private
19
19
 
20
20
  def create_hook_executor
21
- template 'dockeruby.sh', 'bin/dockeruby'
21
+ template 'dockeruby.rb', 'bin/dockeruby'
22
22
  chmod 'bin/dockeruby', 0o755
23
23
  end
24
24
 
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/ruby
2
+ # frozen_string_literal: true
3
+
4
+ def require_or_install(gem_name, version=nil)
5
+ gem(gem_name, "~> #{version}") unless version.nil?
6
+ require gem_name
7
+ rescue LoadError
8
+ warn "Installing gem #{gem_name}"
9
+ if version.nil?
10
+ Gem.install(gem_name)
11
+ else
12
+ Gem.install(gem_name, "~> #{version}")
13
+ gem(gem_name, "~> #{version}")
14
+ end
15
+ require gem_name
16
+ end
17
+
18
+ require_or_install('shellwords')
19
+
20
+ def check_dockerfile(verbose: false)
21
+ return true if File.exist?('Dockerfile')
22
+
23
+ puts('No Dockerfile') if verbose
24
+ false
25
+ end
26
+
27
+ def entrypoint_location
28
+ entrypoint_line = File.readlines('Dockerfile').find { |line| line.start_with?('ENTRYPOINT') }
29
+
30
+ return nil if entrypoint_line.nil?
31
+
32
+ md = /\[["'](.+)["']\]/.match(entrypoint_line)
33
+ return nil if md.nil? || md[1].nil?
34
+
35
+ md[1]
36
+ end
37
+
38
+ VALID_LAST_INSTRUCTION = /exec "\$\{?@}?"/
39
+
40
+ def check_entrypoint(verbose: false)
41
+ el = entrypoint_location
42
+ return true if el.nil?
43
+
44
+ unless File.exist?(el)
45
+ warn("Entrypoint not found at location: #{el}") if verbose
46
+ return false
47
+ end
48
+
49
+ last_line = File.readlines(el).last&.strip
50
+ return true if VALID_LAST_INSTRUCTION.match?(last_line)
51
+
52
+ warn("Invalid entrypoint: Last instruction should be 'exec \"${@}\"' instead of '#{last_line}'") if verbose
53
+
54
+ false
55
+ end
56
+
57
+ def executer_docker_run(docker_args, verbose: false)
58
+ pwd = Dir.pwd
59
+ working_directory = File.basename(pwd)
60
+
61
+ volumes = `docker volume ls -q -f name=modulogem`
62
+ volumes = volumes.split("\n").map(&:strip)
63
+ modulogem_gems = volumes.find { |volume| volume.include?('modulogem_gems') }
64
+ modulogem = volumes.find { |volume| volume.include?('modulogem') }
65
+ modulogem_gems_option = modulogem_gems.nil? ? '' : "-v #{modulogem_gems}:/usr/local/bundle"
66
+ modulogem_option = modulogem.nil? ? '' : "-v #{modulogem}:/root"
67
+
68
+ # Check if the shell is a TTY
69
+ tty_option = $stdout.isatty ? '-ti' : ''
70
+
71
+ # Build the command string
72
+ # rubocop:disable Layout/LineLength
73
+ command = %(docker run --rm #{modulogem_gems_option} #{modulogem_option} -v '#{pwd}:/app/#{working_directory}' #{tty_option} -w '/app/#{working_directory}' ezveus/ruby:latest #{docker_args})
74
+ # rubocop:enable Layout/LineLength
75
+
76
+ puts(command) if verbose
77
+ exec(command)
78
+ end
79
+
80
+ def executer_compose_run(docker_args, verbose: false)
81
+ entrypoint_option = check_entrypoint(verbose: verbose) ? '' : '--entrypoint "sh -c"'
82
+ git_email = `git config --get user.email`.strip
83
+ git_name = `git config --get user.name`.strip
84
+
85
+ # Check if the shell is a TTY
86
+ tty_option = $stdout.isatty ? '-ti' : ''
87
+
88
+ # rubocop:disable Layout/LineLength
89
+ command = %(docker compose build && docker compose run --rm #{tty_option} -e "GIT_AUTHOR_EMAIL=#{git_email}" -e "GIT_AUTHOR_NAME=#{git_name}" -e "GIT_COMMITTER_EMAIL=#{git_email}" -e "GIT_COMMITTER_NAME=#{git_name}" #{entrypoint_option} app)
90
+ command = if entrypoint_option == ''
91
+ "#{command} #{docker_args}"
92
+ else
93
+ "#{command} '#{docker_args}'"
94
+ end
95
+ # rubocop:enable Layout/LineLength
96
+ puts(command) if verbose
97
+ exec(command)
98
+ end
99
+
100
+ def main(args, verbose: false)
101
+ # Escape each argument individually
102
+ escaped_args = args.map { |arg| Shellwords.escape(arg) }
103
+
104
+ # Check if the arguments contain a Ruby command or only options
105
+ contains_command = false
106
+ escaped_args.each_with_index do |arg, index|
107
+ if !arg.start_with?('-') && (index.zero? || !escaped_args[index - 1].start_with?('-'))
108
+ contains_command = true
109
+ break
110
+ end
111
+ end
112
+
113
+ docker_args = if contains_command
114
+ escaped_args.join(' ')
115
+ else
116
+ "ruby #{escaped_args.join(' ')}"
117
+ end
118
+
119
+ if check_dockerfile(verbose: verbose)
120
+ executer_compose_run(docker_args, verbose: verbose)
121
+ else
122
+ executer_docker_run(docker_args, verbose: verbose)
123
+ end
124
+ end
125
+
126
+ main(ARGV, verbose: true)
@@ -1,6 +1,6 @@
1
1
  module Modulorails
2
2
 
3
- VERSION = '1.5.0.pre2'.freeze
3
+ VERSION = '1.5.1'.freeze
4
4
 
5
5
  # Useful to compare the current Ruby version
6
6
  COMPARABLE_RUBY_VERSION = Gem::Version.new(RUBY_VERSION)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modulorails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0.pre2
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu Ciappara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-22 00:00:00.000000000 Z
11
+ date: 2024-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler-audit
@@ -183,7 +183,7 @@ files:
183
183
  - lib/generators/modulorails/docker/templates/entrypoints/docker-entrypoint.sh.tt
184
184
  - lib/generators/modulorails/docker/templates/entrypoints/webpack-entrypoint.sh.tt
185
185
  - lib/generators/modulorails/githooks/githooks_generator.rb
186
- - lib/generators/modulorails/githooks/templates/dockeruby.sh
186
+ - lib/generators/modulorails/githooks/templates/dockeruby.rb
187
187
  - lib/generators/modulorails/githooks/templates/post-rewrite.sh
188
188
  - lib/generators/modulorails/githooks/templates/pre-merge-commit.sh
189
189
  - lib/generators/modulorails/githooks/templates/refresh_generations.sh
@@ -1,112 +0,0 @@
1
- #!/bin/sh
2
- set -e
3
-
4
- # shellcheck disable=SC2016
5
- VALID_LAST_INSTRUCTION='exec "${@}"'
6
-
7
- # Check if the Dockerfile exists
8
- check_dockerfile() {
9
- if [ -f "Dockerfile" ]; then
10
- return 0
11
- else
12
- echo "No Dockerfile"
13
- return 1
14
- fi
15
- }
16
-
17
- # Get the entrypoint location from the Dockerfile
18
- entrypoint_location() {
19
- entrypoint_line=$(grep '^ENTRYPOINT' Dockerfile || true)
20
-
21
- if [ -z "$entrypoint_line" ]; then
22
- echo ""
23
- else
24
- echo "$entrypoint_line" | sed -n 's/.*\[\(.*\)\].*/\1/p' | tr -d '"'
25
- fi
26
- }
27
-
28
- # Check if the entrypoint is valid
29
- check_entrypoint() {
30
- el=$(entrypoint_location)
31
- if [ -z "$el" ]; then
32
- return 0
33
- fi
34
-
35
- if [ ! -f "$el" ]; then
36
- echo "Entrypoint not found at location: $el"
37
- return 1
38
- fi
39
-
40
- last_line=$(tail -n 1 "$el" | xargs)
41
-
42
- if [ "$last_line" != "$VALID_LAST_INSTRUCTION" ]; then
43
- echo "Invalid entrypoint: Last instruction should be '$VALID_LAST_INSTRUCTION' instead of '$last_line'"
44
- return 1
45
- fi
46
-
47
- return 0
48
- }
49
-
50
- # Run docker with the necessary options
51
- executer_docker_run() {
52
- pwd=$(pwd)
53
- working_directory=$(basename "$pwd")
54
-
55
- tty_option=""
56
- if [ -t 1 ]; then
57
- tty_option="-ti"
58
- fi
59
-
60
- command="docker run --rm -v '$pwd:/app/$working_directory' -w '/app/$working_directory' $tty_option $git_environment ezveus/ruby:latest $docker_args"
61
- echo "$command"
62
- exec "$command"
63
- }
64
-
65
- executer_dockerfile_run() {
66
- if check_entrypoint; then
67
- entrypoint_option=""
68
- else
69
- entrypoint_option="--entrypoint \"sh -c\""
70
- fi
71
-
72
- command="docker compose build && docker compose run --rm $tty_option $git_environment $entrypoint_option app $docker_args"
73
- echo "$command"
74
- exec "$command"
75
- }
76
-
77
- # Main function
78
- main() {
79
- args="$*"
80
- docker_args=""
81
- contains_command=false
82
- git_name=$(git config --get user.name || whoami)
83
- git_email=$(git config --get user.email || echo "$git_name@local")
84
- git_environment="-e \"GIT_AUTHOR_EMAIL=$git_email\" -e \"GIT_AUTHOR_NAME=$git_name\" -e \"GIT_COMMITTER_EMAIL=$git_email\" -e \"GIT_COMMITTER_NAME=$git_name\""
85
-
86
- tty_option=""
87
- if [ -t 1 ]; then
88
- tty_option="-ti"
89
- fi
90
-
91
- for arg in "$@"; do
92
- # Check if any argument is not an option (doesn't start with '-')
93
- if [ "${arg#-}" = "$arg" ]; then
94
- contains_command=true
95
- break
96
- fi
97
- done
98
-
99
- if [ "$contains_command" = false ]; then
100
- docker_args="ruby $args"
101
- else
102
- docker_args="$args"
103
- fi
104
-
105
- if check_dockerfile; then
106
- executer_dockerfile_run
107
- else
108
- executer_docker_run "$docker_args"
109
- fi
110
- }
111
-
112
- main "$@"