boxing 0.10.0 → 0.11.0
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 +4 -4
- data/Gemfile +2 -2
- data/Gemfile.lock +24 -21
- data/README.md +6 -0
- data/boxing.gemspec +1 -1
- data/exe/boxing +3 -1
- data/lib/boxing/command.rb +17 -9
- data/lib/boxing/config.rb +10 -1
- data/lib/boxing/context.rb +10 -1
- data/lib/boxing/generator.rb +177 -0
- data/lib/boxing/hanami.rb +8 -0
- data/lib/boxing/railtie.rb +13 -0
- data/lib/boxing/tasks/compose.rake +6 -0
- data/lib/boxing/tasks/config.rake +10 -0
- data/lib/boxing/tasks/generate.rake +7 -0
- data/lib/boxing/tasks/update.rake +12 -0
- data/lib/boxing/template.rb +52 -0
- data/lib/boxing/utils.rb +33 -0
- data/lib/boxing/version.rb +1 -1
- data/lib/boxing.rb +32 -6
- data/templates/Dockerfile.tt +1 -1
- metadata +15 -10
- data/lib/boxing/commands/base.rb +0 -39
- data/lib/boxing/commands/compose.rb +0 -24
- data/lib/boxing/commands/generate.rb +0 -26
- data/lib/boxing/commands/update.rb +0 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9773fb28536f4bfb3f3e20e77cd648bcf5be7bd6d42f62eaf7e32a1e19296bcf
|
|
4
|
+
data.tar.gz: 54678763c575369965b2851c0bbeaa64270d8d7c393bbe53e4b1a2fcf212b0f7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: dd4b4ef0a9a8f889358f7d79996b09c3f65129a439eb3c88f1e85862a766998508c041dbfbfcdbdc88c2a002bdd46ae67a01bb01d5aebfacaec4eaea04f1c2df
|
|
7
|
+
data.tar.gz: ead9627559679e296ecb1a6466bbcbccc6e2b71a85429a6dcdbef5abd7778dbd7eca7b0869c19c86cc1890dbb9f97f0ff79b12267cb63ab989e9096989455b58
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
boxing (0.
|
|
4
|
+
boxing (0.11.0)
|
|
5
5
|
bundler (~> 2.0)
|
|
6
|
-
|
|
6
|
+
zeitwerk (~> 2.6)
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
@@ -16,7 +16,7 @@ GEM
|
|
|
16
16
|
diff-lcs (1.5.0)
|
|
17
17
|
docile (1.4.0)
|
|
18
18
|
iniparse (1.5.0)
|
|
19
|
-
overcommit (0.
|
|
19
|
+
overcommit (0.61.0)
|
|
20
20
|
childprocess (>= 0.6.3, < 5)
|
|
21
21
|
iniparse (~> 1.4)
|
|
22
22
|
rexml (~> 3.2)
|
|
@@ -24,22 +24,22 @@ GEM
|
|
|
24
24
|
parser (3.1.2.0)
|
|
25
25
|
ast (~> 2.4.1)
|
|
26
26
|
rainbow (3.1.1)
|
|
27
|
-
rake (13.0
|
|
27
|
+
rake (13.1.0)
|
|
28
28
|
regexp_parser (2.4.0)
|
|
29
|
-
rexml (3.2.
|
|
30
|
-
rspec (3.
|
|
31
|
-
rspec-core (~> 3.
|
|
32
|
-
rspec-expectations (~> 3.
|
|
33
|
-
rspec-mocks (~> 3.
|
|
34
|
-
rspec-core (3.
|
|
35
|
-
rspec-support (~> 3.
|
|
36
|
-
rspec-expectations (3.
|
|
29
|
+
rexml (3.2.6)
|
|
30
|
+
rspec (3.12.0)
|
|
31
|
+
rspec-core (~> 3.12.0)
|
|
32
|
+
rspec-expectations (~> 3.12.0)
|
|
33
|
+
rspec-mocks (~> 3.12.0)
|
|
34
|
+
rspec-core (3.12.2)
|
|
35
|
+
rspec-support (~> 3.12.0)
|
|
36
|
+
rspec-expectations (3.12.3)
|
|
37
37
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
38
|
-
rspec-support (~> 3.
|
|
39
|
-
rspec-mocks (3.
|
|
38
|
+
rspec-support (~> 3.12.0)
|
|
39
|
+
rspec-mocks (3.12.6)
|
|
40
40
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
41
|
-
rspec-support (~> 3.
|
|
42
|
-
rspec-support (3.
|
|
41
|
+
rspec-support (~> 3.12.0)
|
|
42
|
+
rspec-support (3.12.1)
|
|
43
43
|
rubocop (1.30.0)
|
|
44
44
|
parallel (~> 1.10)
|
|
45
45
|
parser (>= 3.1.0.0)
|
|
@@ -56,30 +56,33 @@ GEM
|
|
|
56
56
|
rubocop-rspec (2.11.1)
|
|
57
57
|
rubocop (~> 1.19)
|
|
58
58
|
ruby-progressbar (1.11.0)
|
|
59
|
-
simplecov (0.
|
|
59
|
+
simplecov (0.22.0)
|
|
60
60
|
docile (~> 1.1)
|
|
61
61
|
simplecov-html (~> 0.11)
|
|
62
62
|
simplecov_json_formatter (~> 0.1)
|
|
63
63
|
simplecov-html (0.12.3)
|
|
64
64
|
simplecov_json_formatter (0.1.4)
|
|
65
|
-
thor (1.2.
|
|
65
|
+
thor (1.2.2)
|
|
66
66
|
unicode-display_width (2.1.0)
|
|
67
|
+
zeitwerk (2.6.12)
|
|
67
68
|
|
|
68
69
|
PLATFORMS
|
|
70
|
+
arm64-darwin-23
|
|
69
71
|
x86_64-darwin-20
|
|
70
72
|
x86_64-darwin-21
|
|
73
|
+
x86_64-darwin-22
|
|
71
74
|
x86_64-linux
|
|
72
75
|
|
|
73
76
|
DEPENDENCIES
|
|
74
77
|
boxing!
|
|
75
78
|
bundler-audit
|
|
76
79
|
overcommit
|
|
77
|
-
rake (~> 13.
|
|
78
|
-
rspec (~> 3.
|
|
80
|
+
rake (~> 13.1)
|
|
81
|
+
rspec (~> 3.12)
|
|
79
82
|
rubocop (~> 1.22)
|
|
80
83
|
rubocop-rake
|
|
81
84
|
rubocop-rspec
|
|
82
85
|
simplecov
|
|
83
86
|
|
|
84
87
|
BUNDLED WITH
|
|
85
|
-
2.
|
|
88
|
+
2.4.10
|
data/README.md
CHANGED
|
@@ -42,6 +42,12 @@ The final Rails image will be around 100MB and can be flexible to delivery to an
|
|
|
42
42
|
|
|
43
43
|
If your gem dependency included `bootsnap` the generated Dockerfile will add precompile options to speed up the application bootstrap.
|
|
44
44
|
|
|
45
|
+
### AWS Lambda Runtime Interface Client
|
|
46
|
+
|
|
47
|
+
When the `aws_lambda_ric` gem is detected, the `boxing` will choose to use `bin/aws_lambda_ric` as entrypoint.
|
|
48
|
+
|
|
49
|
+
To make it works correctly, run `bundle binstub aws_lambda_ric` to make it can run it correctly.
|
|
50
|
+
|
|
45
51
|
### Revision
|
|
46
52
|
|
|
47
53
|
To identity your image version, the default build argument `REVISION` will be configured by default.
|
data/boxing.gemspec
CHANGED
|
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
|
30
30
|
|
|
31
31
|
# Uncomment to register a new dependency of your gem
|
|
32
32
|
spec.add_dependency 'bundler', '~> 2.0'
|
|
33
|
-
spec.add_dependency '
|
|
33
|
+
spec.add_dependency 'zeitwerk', '~> 2.6'
|
|
34
34
|
|
|
35
35
|
# For more information and examples about making a new gem, checkout our
|
|
36
36
|
# guide at: https://bundler.io/guides/creating_gem.html
|
data/exe/boxing
CHANGED
data/lib/boxing/command.rb
CHANGED
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require '
|
|
3
|
+
require 'rake'
|
|
4
4
|
|
|
5
5
|
module Boxing
|
|
6
6
|
# The Main Command
|
|
7
7
|
#
|
|
8
8
|
# @since 0.1.0
|
|
9
|
-
class Command <
|
|
10
|
-
#
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
class Command < Rake::Application
|
|
10
|
+
# @since 0.11.0
|
|
11
|
+
TASK_ROOT = File.expand_path('./tasks', __dir__)
|
|
12
|
+
|
|
13
|
+
# @see Rake::Application#run
|
|
14
|
+
def run(argv = ARGV)
|
|
15
|
+
standard_exception_handling do
|
|
16
|
+
init('boxing', argv)
|
|
17
|
+
load_rakefile
|
|
18
|
+
top_level
|
|
19
|
+
end
|
|
13
20
|
end
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
# @see Rake::Application#load_rakefile
|
|
23
|
+
def load_rakefile
|
|
24
|
+
glob("#{TASK_ROOT}/**/*.rake").each { |task| add_import task }
|
|
25
|
+
load_imports
|
|
26
|
+
end
|
|
19
27
|
end
|
|
20
28
|
end
|
data/lib/boxing/config.rb
CHANGED
|
@@ -14,7 +14,8 @@ module Boxing
|
|
|
14
14
|
:assets_precompile, :node_version,
|
|
15
15
|
:build_packages, :runtime_packages,
|
|
16
16
|
:revision, :sentry_release,
|
|
17
|
-
:entrypoint, :command
|
|
17
|
+
:entrypoint, :command,
|
|
18
|
+
:exclude_groups
|
|
18
19
|
|
|
19
20
|
# @since 0.5.0
|
|
20
21
|
def initialize(&block)
|
|
@@ -23,8 +24,16 @@ module Boxing
|
|
|
23
24
|
@port = 9292
|
|
24
25
|
@health_check_path = '/status'
|
|
25
26
|
@assets_precompile = false
|
|
27
|
+
@exclude_groups = default_exclude_groups
|
|
26
28
|
|
|
27
29
|
instance_exec(self, &block) if defined?(yield)
|
|
28
30
|
end
|
|
31
|
+
|
|
32
|
+
# @since 0.11.0
|
|
33
|
+
def default_exclude_groups
|
|
34
|
+
return %w[development test cli] if defined?(Hanami)
|
|
35
|
+
|
|
36
|
+
%w[development test]
|
|
37
|
+
end
|
|
29
38
|
end
|
|
30
39
|
end
|
data/lib/boxing/context.rb
CHANGED
|
@@ -37,6 +37,15 @@ module Boxing
|
|
|
37
37
|
)
|
|
38
38
|
end
|
|
39
39
|
|
|
40
|
+
# Exclude Gems in container images
|
|
41
|
+
#
|
|
42
|
+
# @return [Array<String>]
|
|
43
|
+
#
|
|
44
|
+
# @since 0.11.0
|
|
45
|
+
def exclude_groups
|
|
46
|
+
@exclude_groups ||= config.exclude_groups || []
|
|
47
|
+
end
|
|
48
|
+
|
|
40
49
|
# Check rubygems exists
|
|
41
50
|
#
|
|
42
51
|
# @param names [Array<String>]
|
|
@@ -77,7 +86,7 @@ module Boxing
|
|
|
77
86
|
#
|
|
78
87
|
# @since 0.6.0
|
|
79
88
|
def extra_packages
|
|
80
|
-
|
|
89
|
+
[config.build_packages, config.runtime_packages].flatten.map do |name|
|
|
81
90
|
next if name.nil?
|
|
82
91
|
|
|
83
92
|
Package.new(name, mode: mode_of(name))
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'tempfile'
|
|
4
|
+
|
|
5
|
+
module Boxing
|
|
6
|
+
# Generate file from template
|
|
7
|
+
#
|
|
8
|
+
# @since 0.11.0
|
|
9
|
+
class Generator
|
|
10
|
+
ASCII_CLEAR = "\e[0m"
|
|
11
|
+
ASCII_BOLD = "\e[1m"
|
|
12
|
+
ASCII_RED = "\e[31m"
|
|
13
|
+
|
|
14
|
+
CREATED_MESSAGE = "#{ASCII_BOLD}create#{ASCII_CLEAR}\t%s"
|
|
15
|
+
IDENTICAL_MESSAGE = "#{ASCII_BOLD}identical#{ASCII_CLEAR}\t%s"
|
|
16
|
+
CONFLICT_MESSAGE = "#{ASCII_BOLD}#{ASCII_RED}conflict#{ASCII_CLEAR}\t%s"
|
|
17
|
+
OVERWRITE_MESSAGE = 'Overwrite %s? (enter "h" for help) [Ynqdhm] '
|
|
18
|
+
FORCE_MESSAGE = "#{ASCII_BOLD}force#{ASCII_CLEAR}\t%s"
|
|
19
|
+
SKIP_MESSAGE = "#{ASCII_BOLD}skip#{ASCII_CLEAR}\t%s"
|
|
20
|
+
MERGE_TOOL_NOT_FOUND = 'Please configure merge.tool in your Git config.'
|
|
21
|
+
|
|
22
|
+
attr_reader :destination, :path
|
|
23
|
+
|
|
24
|
+
include Utils
|
|
25
|
+
|
|
26
|
+
# @since 0.11.0
|
|
27
|
+
def initialize(destination, content)
|
|
28
|
+
@destination = destination
|
|
29
|
+
@path = current_path.join(@destination)
|
|
30
|
+
@content = content
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Generate file
|
|
34
|
+
#
|
|
35
|
+
# @since 0.11.0
|
|
36
|
+
def execute
|
|
37
|
+
with_conflict do
|
|
38
|
+
FileUtils.mkdir_p(File.dirname(path))
|
|
39
|
+
File.write(path, render)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Render content
|
|
44
|
+
#
|
|
45
|
+
# @return [String]
|
|
46
|
+
#
|
|
47
|
+
# @since 0.11.0
|
|
48
|
+
def render
|
|
49
|
+
@render ||= if @content.is_a?(Proc)
|
|
50
|
+
@content.call
|
|
51
|
+
else
|
|
52
|
+
@content
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Check if file exists
|
|
57
|
+
#
|
|
58
|
+
# @return [TrueClass|FalseClass]
|
|
59
|
+
#
|
|
60
|
+
# @since 0.11.0
|
|
61
|
+
def exist?
|
|
62
|
+
path.exist?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Check if file identical
|
|
66
|
+
#
|
|
67
|
+
# @return [TrueClass|FalseClass]
|
|
68
|
+
#
|
|
69
|
+
# @since 0.11.0
|
|
70
|
+
def identical?
|
|
71
|
+
exist? && File.binread(path) == String.new(render).force_encoding('ASCII-8BIT')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
protected
|
|
75
|
+
|
|
76
|
+
# With conflict
|
|
77
|
+
#
|
|
78
|
+
# @param [Proc] block
|
|
79
|
+
#
|
|
80
|
+
# @since 0.11.0
|
|
81
|
+
def with_conflict(&block)
|
|
82
|
+
return on_conflict(&block) if exist?
|
|
83
|
+
|
|
84
|
+
yield
|
|
85
|
+
puts format(CREATED_MESSAGE, destination)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# On conflict
|
|
89
|
+
#
|
|
90
|
+
# @param [Proc] block
|
|
91
|
+
#
|
|
92
|
+
# @since 0.11.0
|
|
93
|
+
def on_conflict
|
|
94
|
+
return puts format(IDENTICAL_MESSAGE, destination) if identical?
|
|
95
|
+
|
|
96
|
+
puts format(CONFLICT_MESSAGE, destination)
|
|
97
|
+
return puts format(SKIP_MESSAGE, destination) unless do_overwrite
|
|
98
|
+
|
|
99
|
+
puts format(FORCE_MESSAGE, destination)
|
|
100
|
+
yield if block_given?
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Do overwrite
|
|
104
|
+
#
|
|
105
|
+
# @return [TrueClass|FalseClass]
|
|
106
|
+
# @raise [SystemExit] if user quits
|
|
107
|
+
#
|
|
108
|
+
# @api private
|
|
109
|
+
# @since 0.11.0
|
|
110
|
+
def do_overwrite # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity
|
|
111
|
+
loop do
|
|
112
|
+
print format(OVERWRITE_MESSAGE, destination)
|
|
113
|
+
|
|
114
|
+
case $stdin.gets.chomp
|
|
115
|
+
when 'Y', 'y', '' then return true
|
|
116
|
+
when 'n', 'N' then return false
|
|
117
|
+
when 'd', 'D' then show_diff
|
|
118
|
+
when 'h', 'H' then show_help
|
|
119
|
+
when 'm', 'M'
|
|
120
|
+
puts MERGE_TOOL_NOT_FOUND unless do_merge
|
|
121
|
+
return false
|
|
122
|
+
when 'q', 'Q' then raise SystemExit
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Show diff
|
|
128
|
+
#
|
|
129
|
+
# @since 0.11.0
|
|
130
|
+
# @api private
|
|
131
|
+
def show_diff
|
|
132
|
+
Tempfile.open(destination) do |tempfile|
|
|
133
|
+
tempfile.write(render)
|
|
134
|
+
tempfile.rewind
|
|
135
|
+
|
|
136
|
+
system("diff -u --color #{path} #{tempfile.path}")
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Do merge
|
|
141
|
+
#
|
|
142
|
+
# @return [TrueClass|FalseClass]
|
|
143
|
+
#
|
|
144
|
+
# @since 0.11.0
|
|
145
|
+
# @api private
|
|
146
|
+
def do_merge # rubocop:disable Metrics/MethodLength
|
|
147
|
+
tool = begin
|
|
148
|
+
`git config merge.tool`.rstrip
|
|
149
|
+
rescue StandardError
|
|
150
|
+
''
|
|
151
|
+
end
|
|
152
|
+
return false if tool.empty?
|
|
153
|
+
|
|
154
|
+
Tempfile.open(destination) do |tempfile|
|
|
155
|
+
tempfile.write(render)
|
|
156
|
+
tempfile.rewind
|
|
157
|
+
|
|
158
|
+
system("#{tool} #{tempfile.path} #{path}")
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Show help
|
|
163
|
+
#
|
|
164
|
+
# @since 0.11.0
|
|
165
|
+
# @api private
|
|
166
|
+
def show_help
|
|
167
|
+
puts <<-HELP
|
|
168
|
+
Y - yes, overwrite
|
|
169
|
+
n - no, do not overwrite
|
|
170
|
+
d - diff, show the differences between the old and the new
|
|
171
|
+
h - help, show this help
|
|
172
|
+
m - merge, run merge tool
|
|
173
|
+
q - quit, exit this program
|
|
174
|
+
HELP
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Boxing
|
|
4
|
+
# :nodoc:
|
|
5
|
+
class Railtie < ::Rails::Railtie
|
|
6
|
+
rake_tasks do
|
|
7
|
+
namespace :boxing do
|
|
8
|
+
path = File.join(Boxing::Command::TASK_ROOT, '**/*.rake')
|
|
9
|
+
FileList.glob(path.tr('\\', '/')).each { |file| load file }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'erb'
|
|
4
|
+
|
|
5
|
+
module Boxing
|
|
6
|
+
# Generate file from template
|
|
7
|
+
#
|
|
8
|
+
# @since 0.11.0
|
|
9
|
+
class Template
|
|
10
|
+
# @since 0.11.0
|
|
11
|
+
TEMPLATE_DIR = File.expand_path('../../templates', __dir__)
|
|
12
|
+
|
|
13
|
+
# @param [String] template
|
|
14
|
+
# @param [Binding] context
|
|
15
|
+
#
|
|
16
|
+
# @since 0.11.0
|
|
17
|
+
def initialize(template)
|
|
18
|
+
@template = template
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Create template engine
|
|
22
|
+
#
|
|
23
|
+
# @return [ERB]
|
|
24
|
+
#
|
|
25
|
+
# @since 0.11.0
|
|
26
|
+
# @api private
|
|
27
|
+
def engine
|
|
28
|
+
@engine ||= ERB.new(content, trim_mode: '-')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Get template content
|
|
32
|
+
#
|
|
33
|
+
# @return [String]
|
|
34
|
+
#
|
|
35
|
+
# @since 0.11.0
|
|
36
|
+
# @api private
|
|
37
|
+
def content
|
|
38
|
+
@content ||= File.read("#{TEMPLATE_DIR}/#{@template}")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Render template
|
|
42
|
+
#
|
|
43
|
+
# @return [String]
|
|
44
|
+
#
|
|
45
|
+
# @since 0.11.0
|
|
46
|
+
# @api private
|
|
47
|
+
def render(context = nil)
|
|
48
|
+
context = context.to_binding if context.respond_to?(:to_binding)
|
|
49
|
+
engine.result(context)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
data/lib/boxing/utils.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'pathname'
|
|
4
|
+
|
|
5
|
+
module Boxing
|
|
6
|
+
# Utility methods
|
|
7
|
+
#
|
|
8
|
+
# @since 0.11.0
|
|
9
|
+
module Utils
|
|
10
|
+
# Get project root
|
|
11
|
+
#
|
|
12
|
+
# @return [String]
|
|
13
|
+
#
|
|
14
|
+
# @since 0.11.0
|
|
15
|
+
def current_path
|
|
16
|
+
return Hanami.app.root if defined?(Hanami)
|
|
17
|
+
return Rails.root if defined?(Rails)
|
|
18
|
+
|
|
19
|
+
Pathname.new(Dir.pwd)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Generate file from template
|
|
23
|
+
#
|
|
24
|
+
# @param [String] destination
|
|
25
|
+
# @param [String] template
|
|
26
|
+
# @param [Binding] context
|
|
27
|
+
#
|
|
28
|
+
# @since 0.11.0
|
|
29
|
+
def template(destination, template, context: nil)
|
|
30
|
+
Generator.new(destination, -> { Template.new(template).render(context) }).execute
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/lib/boxing/version.rb
CHANGED
data/lib/boxing.rb
CHANGED
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
require_relative 'boxing/config'
|
|
5
|
-
require_relative 'boxing/package'
|
|
6
|
-
require_relative 'boxing/database'
|
|
7
|
-
require_relative 'boxing/context'
|
|
8
|
-
require_relative 'boxing/command'
|
|
3
|
+
require 'zeitwerk'
|
|
9
4
|
|
|
10
5
|
# The tool to generate Dockerfile without config
|
|
11
6
|
#
|
|
@@ -15,6 +10,19 @@ module Boxing
|
|
|
15
10
|
|
|
16
11
|
module_function
|
|
17
12
|
|
|
13
|
+
# @since 0.11.0
|
|
14
|
+
# @api private
|
|
15
|
+
def loader
|
|
16
|
+
@loader ||= Zeitwerk::Loader.for_gem.tap do |loader|
|
|
17
|
+
loader.ignore("#{__dir__}/boxing/{railtie,hanami}.rb")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
loader.setup
|
|
22
|
+
|
|
23
|
+
require_relative 'boxing/railtie' if defined?(Rails::Railtie)
|
|
24
|
+
require_relative 'boxing/hanami' if defined?(Hanami::CLI)
|
|
25
|
+
|
|
18
26
|
# @return [Bundler::Dependency]
|
|
19
27
|
#
|
|
20
28
|
# @since 0.1.0
|
|
@@ -39,4 +47,22 @@ module Boxing
|
|
|
39
47
|
|
|
40
48
|
@config
|
|
41
49
|
end
|
|
50
|
+
|
|
51
|
+
# @return [Boxing::Database]
|
|
52
|
+
#
|
|
53
|
+
# @since 0.11.0
|
|
54
|
+
def database
|
|
55
|
+
@database ||= Database.new
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Boxing::Context]
|
|
59
|
+
#
|
|
60
|
+
# @since 0.11.0
|
|
61
|
+
def context
|
|
62
|
+
@context ||= Context.new(
|
|
63
|
+
config,
|
|
64
|
+
database,
|
|
65
|
+
dependencies
|
|
66
|
+
)
|
|
67
|
+
end
|
|
42
68
|
end
|
data/templates/Dockerfile.tt
CHANGED
|
@@ -15,7 +15,7 @@ RUN gem install bundler:<%= Bundler::VERSION %> \
|
|
|
15
15
|
&& bundle config --local deployment 'true' \
|
|
16
16
|
&& bundle config --local frozen 'true' \
|
|
17
17
|
&& bundle config --local no-cache 'true' \
|
|
18
|
-
&& bundle config --local without '
|
|
18
|
+
&& bundle config --local without '<%= exclude_groups.join(' ') %>' \
|
|
19
19
|
&& bundle install -j "$(getconf _NPROCESSORS_ONLN)" \
|
|
20
20
|
&& find ${APP_ROOT}/vendor/bundle -type f -name '*.c' -delete \
|
|
21
21
|
&& find ${APP_ROOT}/vendor/bundle -type f -name '*.h' -delete \
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: boxing
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.11.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- 蒼時弦也
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-12-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -25,19 +25,19 @@ dependencies:
|
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '2.0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
28
|
+
name: zeitwerk
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
33
|
+
version: '2.6'
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
40
|
+
version: '2.6'
|
|
41
41
|
description: The zero-configuration Dockerfile generator for Ruby
|
|
42
42
|
email:
|
|
43
43
|
- contact@frost.tw
|
|
@@ -60,14 +60,19 @@ files:
|
|
|
60
60
|
- exe/boxing
|
|
61
61
|
- lib/boxing.rb
|
|
62
62
|
- lib/boxing/command.rb
|
|
63
|
-
- lib/boxing/commands/base.rb
|
|
64
|
-
- lib/boxing/commands/compose.rb
|
|
65
|
-
- lib/boxing/commands/generate.rb
|
|
66
|
-
- lib/boxing/commands/update.rb
|
|
67
63
|
- lib/boxing/config.rb
|
|
68
64
|
- lib/boxing/context.rb
|
|
69
65
|
- lib/boxing/database.rb
|
|
66
|
+
- lib/boxing/generator.rb
|
|
67
|
+
- lib/boxing/hanami.rb
|
|
70
68
|
- lib/boxing/package.rb
|
|
69
|
+
- lib/boxing/railtie.rb
|
|
70
|
+
- lib/boxing/tasks/compose.rake
|
|
71
|
+
- lib/boxing/tasks/config.rake
|
|
72
|
+
- lib/boxing/tasks/generate.rake
|
|
73
|
+
- lib/boxing/tasks/update.rake
|
|
74
|
+
- lib/boxing/template.rb
|
|
75
|
+
- lib/boxing/utils.rb
|
|
71
76
|
- lib/boxing/version.rb
|
|
72
77
|
- templates/Dockerfile.tt
|
|
73
78
|
- templates/docker-compose.yml.tt
|
|
@@ -91,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
91
96
|
- !ruby/object:Gem::Version
|
|
92
97
|
version: '0'
|
|
93
98
|
requirements: []
|
|
94
|
-
rubygems_version: 3.
|
|
99
|
+
rubygems_version: 3.5.3
|
|
95
100
|
signing_key:
|
|
96
101
|
specification_version: 4
|
|
97
102
|
summary: The zero-configuration Dockerfile generator for Ruby
|
data/lib/boxing/commands/base.rb
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Boxing
|
|
4
|
-
# :nodoc:
|
|
5
|
-
module Commands
|
|
6
|
-
# The Base Command
|
|
7
|
-
#
|
|
8
|
-
# @since 0.5.0
|
|
9
|
-
class Base < Thor::Group
|
|
10
|
-
include Thor::Actions
|
|
11
|
-
|
|
12
|
-
# :nodoc:
|
|
13
|
-
def self.source_root
|
|
14
|
-
Pathname.new(File.dirname(__FILE__)).join('../../..')
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Prepare command environment
|
|
18
|
-
#
|
|
19
|
-
# @since 0.5.0
|
|
20
|
-
def prepare
|
|
21
|
-
config = Bundler.root.join('config/boxing.rb')
|
|
22
|
-
return unless config.exist?
|
|
23
|
-
|
|
24
|
-
load config
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
# :nodoc:
|
|
30
|
-
def context
|
|
31
|
-
@context = Context.new(
|
|
32
|
-
Boxing.config,
|
|
33
|
-
Database.new,
|
|
34
|
-
Boxing.dependencies
|
|
35
|
-
)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Boxing
|
|
4
|
-
# :nodoc:
|
|
5
|
-
module Commands
|
|
6
|
-
# The Docker Compose Generator
|
|
7
|
-
#
|
|
8
|
-
# @since 0.1.0
|
|
9
|
-
class Compose < Base
|
|
10
|
-
# Create Dockerfile
|
|
11
|
-
#
|
|
12
|
-
# @since 0.1.0
|
|
13
|
-
def execute
|
|
14
|
-
Database.download! unless Database.exist?
|
|
15
|
-
|
|
16
|
-
# TODO: Allow set image registry
|
|
17
|
-
# TODO: Allow set application name
|
|
18
|
-
template('templates/docker-compose.yml.tt', 'docker-compose.yml', context: context.to_binding)
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
Boxing::Command.register(Compose, 'compose', 'compose', 'Generate docker-compose.yml')
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'pathname'
|
|
4
|
-
require 'set'
|
|
5
|
-
|
|
6
|
-
module Boxing
|
|
7
|
-
# :nodoc:
|
|
8
|
-
module Commands
|
|
9
|
-
# The Dockerfle Generator
|
|
10
|
-
#
|
|
11
|
-
# @since 0.1.0
|
|
12
|
-
class Generate < Base
|
|
13
|
-
# Create Dockerfile
|
|
14
|
-
#
|
|
15
|
-
# @since 0.1.0
|
|
16
|
-
def execute
|
|
17
|
-
Database.download! unless Database.exist?
|
|
18
|
-
|
|
19
|
-
template('templates/Dockerfile.tt', 'Dockerfile', context: context.to_binding)
|
|
20
|
-
template('templates/dockerignore.tt', '.dockerignore', context: context.to_binding)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
Boxing::Command.register(Generate, 'generate', 'generate', 'Generate Dockerfile')
|
|
25
|
-
end
|
|
26
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Boxing
|
|
4
|
-
# :nodoc:
|
|
5
|
-
module Commands
|
|
6
|
-
# The Database Updater
|
|
7
|
-
#
|
|
8
|
-
# @since 0.3.0
|
|
9
|
-
class Update < Base
|
|
10
|
-
# Update Database
|
|
11
|
-
#
|
|
12
|
-
# @since 0.3.0
|
|
13
|
-
def execute
|
|
14
|
-
if Database.exist?
|
|
15
|
-
Database.new.update!
|
|
16
|
-
else
|
|
17
|
-
Database.download!
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
Boxing::Command.register(Update, 'update', 'update', 'Update Database')
|
|
23
|
-
end
|
|
24
|
-
end
|