rails_packager 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +34 -0
- data/exe/rails_package +25 -0
- data/lib/rails_packager.rb +8 -0
- data/lib/rails_packager/command.rb +84 -0
- data/lib/rails_packager/command_parser.rb +66 -0
- data/lib/rails_packager/engine.rb +4 -0
- data/lib/rails_packager/runner.rb +138 -0
- data/lib/rails_packager/util.rb +30 -0
- data/lib/rails_packager/version.rb +3 -0
- data/lib/tasks/rails_packager_tasks.rake +8 -0
- data/test/dummy/Gemfile +2 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +22 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +56 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/dummy/db/schema.rb +15 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +7 -0
- data/test/dummy/log/test.log +21747 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/files/environment-variable-in-one-command-merges-with-env.yml +9 -0
- data/test/files/environment-variable-in-one-command.yml +5 -0
- data/test/files/environment-variable-replacement.yml +7 -0
- data/test/files/execution-path.yml +3 -0
- data/test/files/failure-integration.yml +6 -0
- data/test/files/files-is-within-quotes.yml +2 -0
- data/test/files/files-not-its-own-argument.yml +2 -0
- data/test/files/fully-customized.yml +13 -0
- data/test/files/missing-command-name.yml +5 -0
- data/test/files/quotes-in-command.yml +2 -0
- data/test/files/simple-integration.yml +7 -0
- data/test/integration_test.rb +224 -0
- data/test/jruby_dummy/Jarfile +1 -0
- data/test/jruby_dummy/README.rdoc +28 -0
- data/test/jruby_dummy/Rakefile +6 -0
- data/test/jruby_dummy/app/assets/javascripts/application.js +13 -0
- data/test/jruby_dummy/app/assets/stylesheets/application.css +15 -0
- data/test/jruby_dummy/app/controllers/application_controller.rb +5 -0
- data/test/jruby_dummy/app/helpers/application_helper.rb +2 -0
- data/test/jruby_dummy/app/views/layouts/application.html.erb +14 -0
- data/test/jruby_dummy/bin/bundle +3 -0
- data/test/jruby_dummy/bin/rails +4 -0
- data/test/jruby_dummy/bin/rake +4 -0
- data/test/jruby_dummy/bin/setup +29 -0
- data/test/jruby_dummy/config.ru +4 -0
- data/test/jruby_dummy/config/application.rb +22 -0
- data/test/jruby_dummy/config/boot.rb +5 -0
- data/test/jruby_dummy/config/database.yml +23 -0
- data/test/jruby_dummy/config/environment.rb +5 -0
- data/test/jruby_dummy/config/environments/development.rb +41 -0
- data/test/jruby_dummy/config/environments/production.rb +79 -0
- data/test/jruby_dummy/config/environments/test.rb +42 -0
- data/test/jruby_dummy/config/initializers/assets.rb +11 -0
- data/test/jruby_dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/jruby_dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/jruby_dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/jruby_dummy/config/initializers/inflections.rb +16 -0
- data/test/jruby_dummy/config/initializers/mime_types.rb +4 -0
- data/test/jruby_dummy/config/initializers/session_store.rb +3 -0
- data/test/jruby_dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/jruby_dummy/config/locales/en.yml +23 -0
- data/test/jruby_dummy/config/routes.rb +56 -0
- data/test/jruby_dummy/config/secrets.yml +22 -0
- data/test/jruby_dummy/db/schema.rb +15 -0
- data/test/jruby_dummy/public/404.html +67 -0
- data/test/jruby_dummy/public/422.html +67 -0
- data/test/jruby_dummy/public/500.html +66 -0
- data/test/jruby_dummy/public/favicon.ico +0 -0
- data/test/rails_packager/command_parser_test.rb +74 -0
- data/test/rails_packager/runner_test.rb +225 -0
- data/test/rails_packager/util_test.rb +84 -0
- data/test/rails_packager_test.rb +7 -0
- data/test/support/util_helper.rb +20 -0
- data/test/test_helper.rb +22 -0
- metadata +279 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 496700d2c25783048dddb01349963eb88ac182ae
|
4
|
+
data.tar.gz: 6d14489090ca004941521543918efa1d859980ae
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7f3ee49843a6fc52874788e9e88c16d3374e0d4051693cc8423c1393125d8cc8a28ae7fe12f47940ec1fce9717731afc191c11f27a08ad9a1fbcd1d7aaadd73d
|
7
|
+
data.tar.gz: 5dcc909d6791bd0f3ddcc650f413fd72e702a185b3729cf816e6a7de9590d6a1c86fca4ab5dec5e43c1d45149f593dad633beeb2907243cadfeb8a7c73c9f33c
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2017 Mike Virata-Stone
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'RailsPackager'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
Bundler::GemHelper.install_tasks
|
23
|
+
|
24
|
+
require 'rake/testtask'
|
25
|
+
|
26
|
+
Rake::TestTask.new(:test) do |t|
|
27
|
+
t.libs << 'lib'
|
28
|
+
t.libs << 'test'
|
29
|
+
t.pattern = 'test/**/*_test.rb'
|
30
|
+
t.verbose = false
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
task default: :test
|
data/exe/rails_package
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "pathname"
|
3
|
+
require "optparse"
|
4
|
+
require "rails_packager"
|
5
|
+
|
6
|
+
options = {}
|
7
|
+
OptionParser.new do |opts|
|
8
|
+
opts.banner = "Usage: rails_package [options]"
|
9
|
+
|
10
|
+
opts.on("-v", "--verbose", "Include verbose output") do |v|
|
11
|
+
options[:verbose] = v
|
12
|
+
end
|
13
|
+
|
14
|
+
opts.on("-n", "--name NAME", "Change the NAME used for packaging the app") do |name|
|
15
|
+
options[:name] = name
|
16
|
+
end
|
17
|
+
end.parse!
|
18
|
+
|
19
|
+
abort "No Gemfile detected, are you in the root of a Rails project?" unless File.exist?("Gemfile")
|
20
|
+
abort "The 'rails' gem is missing from the Gemfile, are you in the root of a Rails project?" unless File.read("Gemfile") =~ /\brails\b/
|
21
|
+
dir = Pathname.new(".").realpath
|
22
|
+
config_path = dir.join(".rails-package")
|
23
|
+
config_file = config_path if config_path.exist?
|
24
|
+
runner = RailsPackager::Runner.new(config_file: config_file, dir: dir, name: options[:name])
|
25
|
+
runner.execute(verbose: options[:verbose])
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require "rails_packager/engine" if defined?(Rails)
|
2
|
+
|
3
|
+
module RailsPackager
|
4
|
+
autoload :Command, "rails_packager/command"
|
5
|
+
autoload :CommandParser, "rails_packager/command_parser"
|
6
|
+
autoload :Runner, "rails_packager/runner"
|
7
|
+
autoload :Util, "rails_packager/util"
|
8
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require "active_support/core_ext/object/blank"
|
2
|
+
|
3
|
+
module RailsPackager
|
4
|
+
class Command
|
5
|
+
def self.replace_variables(runner, value, allow_files: false)
|
6
|
+
return nil if value.nil?
|
7
|
+
result = value.dup
|
8
|
+
result.gsub!(/\$\{(\w+)\}/) { |m| ENV.fetch($1, "") }
|
9
|
+
result["@{name}"] = runner.name if result["@{name}"]
|
10
|
+
|
11
|
+
if allow_files
|
12
|
+
raise ArgumentError, "@{files} must be a singular argument" if result["@{files}"] && result != "@{files}"
|
13
|
+
raise ArgumentError, "@{files_file} must be a singular argument" if result["@{files_file}"] && result != "@{files_file}"
|
14
|
+
|
15
|
+
if result == "@{files}"
|
16
|
+
result = runner.files
|
17
|
+
elsif result == "@{files_file}"
|
18
|
+
result = runner.files_file
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
result
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.parse(runner, value)
|
26
|
+
parsed = CommandParser.parse(value)
|
27
|
+
new(parsed.name, *parsed.args, runner: runner, env: parsed.env)
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize(name, *args, runner:, env: {})
|
31
|
+
@runner = runner
|
32
|
+
@name = replace_variables(name)
|
33
|
+
@args = args
|
34
|
+
@env = env
|
35
|
+
end
|
36
|
+
|
37
|
+
def name
|
38
|
+
raise ArgumentError, "Invalid command: empty command name is not valid" if @name.blank?
|
39
|
+
@name
|
40
|
+
end
|
41
|
+
|
42
|
+
def dir
|
43
|
+
@runner.dir
|
44
|
+
end
|
45
|
+
|
46
|
+
def env
|
47
|
+
@runner.env.merge(@env).inject({}) do |result, (key, value)|
|
48
|
+
result[key] = replace_variables(value)
|
49
|
+
result
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def args
|
54
|
+
@args.map do |arg|
|
55
|
+
replace_variables(arg, allow_files: true)
|
56
|
+
end.flatten
|
57
|
+
end
|
58
|
+
|
59
|
+
def execute(verbose: false)
|
60
|
+
command_name = name
|
61
|
+
command_args = args
|
62
|
+
command_line = ([command_name] + command_args).join(" ")
|
63
|
+
puts "$ #{command_line}" if verbose
|
64
|
+
system(env, command_name, *command_args, chdir: dir)
|
65
|
+
@status = $?
|
66
|
+
STDERR.puts "ERROR: '#{command_line}' returned error code: #{exit_code}" unless successful?
|
67
|
+
successful?
|
68
|
+
end
|
69
|
+
|
70
|
+
def exit_code
|
71
|
+
@status.exitstatus
|
72
|
+
end
|
73
|
+
|
74
|
+
def successful?
|
75
|
+
@status.success?
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def replace_variables(value, allow_files: false)
|
81
|
+
RailsPackager::Command.replace_variables(@runner, value, allow_files: allow_files)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module RailsPackager
|
2
|
+
class CommandParser
|
3
|
+
attr_reader :env, :name, :args
|
4
|
+
|
5
|
+
def self.parse(command)
|
6
|
+
new(command).tap(&:parse)
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(command)
|
10
|
+
@parsed = false
|
11
|
+
@unparsed = command
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse
|
15
|
+
return if @parsed
|
16
|
+
@parsed = true
|
17
|
+
|
18
|
+
result =
|
19
|
+
if @unparsed.is_a?(Array)
|
20
|
+
@env = parse_env(@unparsed.last)
|
21
|
+
parse_command(@unparsed.first)
|
22
|
+
else
|
23
|
+
@env = {}
|
24
|
+
parse_command(@unparsed)
|
25
|
+
end
|
26
|
+
|
27
|
+
raise ArgumentError, "Empty command is not allowed" if result.empty?
|
28
|
+
@name = result.shift
|
29
|
+
@args = result
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def parse_env(options)
|
35
|
+
{}.tap do |result|
|
36
|
+
if options.include?("unsetenv")
|
37
|
+
options["unsetenv"].each do |var|
|
38
|
+
result[var] = nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
if options.include?("env")
|
43
|
+
result.merge!(options["env"])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_command(command, result = [])
|
49
|
+
command = command.strip
|
50
|
+
return result if command.empty?
|
51
|
+
|
52
|
+
if command[0] == "'"
|
53
|
+
value, remaining = command[1..-1].split("'", 2)
|
54
|
+
raise ArgumentError, "Mismatched single quote" unless remaining
|
55
|
+
elsif command[0] == '"'
|
56
|
+
value, remaining = command[1..-1].split('"', 2)
|
57
|
+
raise ArgumentError, "Mismatched single quote" unless remaining
|
58
|
+
else
|
59
|
+
value, remaining = command.split(" ", 2)
|
60
|
+
end
|
61
|
+
|
62
|
+
result << value
|
63
|
+
parse_command(remaining || "", result)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require "active_support/core_ext/hash/keys"
|
2
|
+
require "active_support/core_ext/object/blank"
|
3
|
+
require "tempfile"
|
4
|
+
require "yaml"
|
5
|
+
|
6
|
+
module RailsPackager
|
7
|
+
class Runner
|
8
|
+
attr_reader :includes, :excludes, :env, :dir, :name, :before, :package, :after
|
9
|
+
|
10
|
+
# This command is inserted after bundle install when jbundler usage is detected
|
11
|
+
JBUNDLE_COMMAND = "jbundle install --vendor".freeze
|
12
|
+
|
13
|
+
DEFAULT_CONFIG = RailsPackager::Util.deep_freeze(
|
14
|
+
env: {},
|
15
|
+
exclude: ["**/.git", "tmp"],
|
16
|
+
before: [
|
17
|
+
["bundle install --deployment --without development test", {
|
18
|
+
"unsetenv" => ["RUBYOPT", "RUBYLIB", "BUNDLER_ORIG_GEM_PATH", "BUNDLER_ORIG_PATH"],
|
19
|
+
"env" => { "GEM_PATH" => "${BUNDLER_ORIG_GEM_PATH}" }
|
20
|
+
}],
|
21
|
+
"gem install bundler --install-dir vendor/bundle",
|
22
|
+
["bundle exec rake assets:precompile", {
|
23
|
+
"unsetenv" => ["RUBYOPT", "RUBYLIB", "BUNDLER_ORIG_GEM_PATH", "BUNDLER_ORIG_PATH"],
|
24
|
+
"env" => {
|
25
|
+
"RAILS_ENV" => "production",
|
26
|
+
"GEM_PATH" => "${BUNDLER_ORIG_GEM_PATH}"
|
27
|
+
}
|
28
|
+
}]
|
29
|
+
],
|
30
|
+
package: "tar --no-recursion --files-from @{files_file} -zcvf @{name}.tar.gz"
|
31
|
+
)
|
32
|
+
|
33
|
+
def initialize(dir:, name: nil, config_file: nil)
|
34
|
+
@files_file_tempfile = nil
|
35
|
+
@dir = dir
|
36
|
+
@name = name
|
37
|
+
|
38
|
+
config =
|
39
|
+
if config_file
|
40
|
+
YAML.load_file(config_file)
|
41
|
+
else
|
42
|
+
{}
|
43
|
+
end
|
44
|
+
|
45
|
+
load_config(config)
|
46
|
+
end
|
47
|
+
|
48
|
+
def files
|
49
|
+
result = Dir.glob(File.join(dir, "**/*"), File::FNM_DOTMATCH).map do |file|
|
50
|
+
file.sub(File.join(dir, "/"), "")
|
51
|
+
end
|
52
|
+
|
53
|
+
# Drop special directory files
|
54
|
+
result.reject! { |f| f =~ %r{/\.\.?\z} || f =~ /\A\.\.?\z/ }
|
55
|
+
|
56
|
+
result.select! { |f| includes.any? { |i| RailsPackager::Util.glob_match?(i, f) } } if includes
|
57
|
+
result.reject! { |f| excludes.any? { |e| RailsPackager::Util.glob_match?(e, f) } } if excludes
|
58
|
+
result
|
59
|
+
end
|
60
|
+
|
61
|
+
def files_file
|
62
|
+
@files_file_tempfile ||=
|
63
|
+
begin
|
64
|
+
Tempfile.new("rails_packager_file_names").tap do |tempfile|
|
65
|
+
files.each { |f| tempfile.puts f }
|
66
|
+
tempfile.close
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
@files_file_tempfile.path
|
71
|
+
end
|
72
|
+
|
73
|
+
def commands
|
74
|
+
before + [package] + after
|
75
|
+
end
|
76
|
+
|
77
|
+
def execute(verbose: false)
|
78
|
+
commands.each { |cmd| break unless cmd.execute(verbose: verbose) }
|
79
|
+
ensure
|
80
|
+
close
|
81
|
+
end
|
82
|
+
|
83
|
+
def close
|
84
|
+
if @files_file_tempfile
|
85
|
+
@files_file_tempfile.unlink
|
86
|
+
@files_file_tempfile = nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def successful?
|
91
|
+
commands.all?(&:successful?)
|
92
|
+
end
|
93
|
+
|
94
|
+
def exit_code
|
95
|
+
errored = commands.find { |cmd| !cmd.successful? }
|
96
|
+
|
97
|
+
if errored
|
98
|
+
errored.exit_code
|
99
|
+
else
|
100
|
+
0
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def replace_variables(value)
|
107
|
+
RailsPackager::Command.replace_variables(self, value)
|
108
|
+
end
|
109
|
+
|
110
|
+
def load_config(config)
|
111
|
+
config = config.symbolize_keys
|
112
|
+
customized_before = config.include?(:before)
|
113
|
+
config = DEFAULT_CONFIG.merge(config)
|
114
|
+
|
115
|
+
if !customized_before && jbundler_in_use?
|
116
|
+
config[:before] = config[:before].dup
|
117
|
+
config[:before].insert(2, JBUNDLE_COMMAND)
|
118
|
+
end
|
119
|
+
|
120
|
+
@includes = config[:include]
|
121
|
+
@excludes = config[:exclude]
|
122
|
+
|
123
|
+
@env = config[:env].inject({}) do |result, (key, value)|
|
124
|
+
result[key] = replace_variables(value)
|
125
|
+
result
|
126
|
+
end
|
127
|
+
|
128
|
+
@name = name.presence || replace_variables(config.fetch(:name) { File.basename(File.realpath(dir)) })
|
129
|
+
@before = config.fetch(:before, []).map { |x| RailsPackager::Command.parse(self, x) }
|
130
|
+
@after = config.fetch(:after, []).map { |x| RailsPackager::Command.parse(self, x) }
|
131
|
+
@package = RailsPackager::Command.parse(self, config[:package])
|
132
|
+
end
|
133
|
+
|
134
|
+
def jbundler_in_use?
|
135
|
+
File.exist? File.join(dir, "Jarfile")
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module RailsPackager
|
2
|
+
module Util
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def deep_freeze(object)
|
6
|
+
case object
|
7
|
+
when Hash
|
8
|
+
object.freeze
|
9
|
+
object.each { |k, v| deep_freeze(k); deep_freeze(v) }
|
10
|
+
when Array
|
11
|
+
object.freeze
|
12
|
+
object.each { |y| deep_freeze(y) }
|
13
|
+
when Symbol
|
14
|
+
# Unneeded
|
15
|
+
else
|
16
|
+
object.freeze
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
TERMINAL_FILES = deep_freeze([".", "/", ""])
|
21
|
+
|
22
|
+
def glob_match?(glob, file)
|
23
|
+
if File.fnmatch(glob, file, File::FNM_PATHNAME | File::FNM_DOTMATCH)
|
24
|
+
true
|
25
|
+
elsif !TERMINAL_FILES.include?(file)
|
26
|
+
glob_match?(glob, File.dirname(file))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
desc "Package this Rails project"
|
2
|
+
task :package, [:name] => :environment do |t, args|
|
3
|
+
require "rails_packager"
|
4
|
+
config_path = Rails.root.join(".rails-package")
|
5
|
+
config_file = config_path if config_path.exist?
|
6
|
+
runner = RailsPackager::Runner.new(config_file: config_file, dir: Rails.root, name: args[:name].presence)
|
7
|
+
runner.execute(verbose: ENV["verbose"] == "true")
|
8
|
+
end
|