tara 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99f4bc434bfa007f054a82265445cd9846937302
4
- data.tar.gz: 270a01f1559d5747ecc0d50834ba1b0b98336a39
3
+ metadata.gz: b6ef9fe204be70664e2bbbfe3233e05e90a7f937
4
+ data.tar.gz: 843fe69f1d2c59112dd1c727ee9e5e0aa4ac8bf6
5
5
  SHA512:
6
- metadata.gz: dc93d8fc594db3d1c1f0a415166f3ac5b9151034b7f7d7fefff32b8f244c882a93c64709878b2f8d392659018592710a160457402efaafdd3b3e6819d2b43192
7
- data.tar.gz: 156522d2729c5ca0ffe381d183030add5dd930ccda05eeb07d4efaae8cc4af147969b0397f4788231efdd694e8ec22c97a165adc33eec2a868ff4f0fa131bc8b
6
+ metadata.gz: 82977fc6aacec266f7ce3a4a525cbe42029a1bdc3ec6c2533aa26406c3e3e27a668b55cb2f1dd4333b425b7d9d62dd8be68c85896d9863c1b09f800efbf8f7bb
7
+ data.tar.gz: ec39e9ef990d76d91b252db3cfa8186f6a38e3108fe9db65896b9c1c28bd43a028e2f0d645edc370930bdd9a81cd3429fad531365fe1d78ccfbe00392e71bb25
data/lib/tara/archive.rb CHANGED
@@ -1,13 +1,61 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Tara
4
+ # Packs an application along with a Ruby runtime and dependencies into a TAR archive.
5
+ #
6
+ # The archive will include the source code of your project (which is assumed to
7
+ # be in the `lib` directory), wrapper scripts for each executable (assumed to be
8
+ # in the `bin` directory), and all gems that aren't in the `test` or `development`
9
+ # groups in your project's Gemfile.
10
+ #
11
+ # @example Creating an archive from a Rake task
12
+ # task :archive do
13
+ # Tara::Archive.new.create
14
+ # end
15
+ #
16
+ # @example Configuring the archive to be created
17
+ # task :archive do
18
+ # archive = Tara::Archive.new(
19
+ # target: 'osx',
20
+ # traveling_ruby_version: '20150204',
21
+ # without_groups: %w[test],
22
+ # )
23
+ # archive.create
24
+ # end
25
+ #
4
26
  class Archive
27
+ # Create a new instance of `Archive` with the specified configuration.
28
+ #
29
+ # Tara attempts to use sane defaults in most of all cases, for example like
30
+ # assuming that the source code is in the `lib` directory of your project,
31
+ # that the name of the application is the same as the project directory.
32
+ #
33
+ # @param [Hash] config
34
+ # @option config [String] :app_dir (Dir.pwd) absolute path to the application
35
+ # directory.
36
+ # @option config [String] :app_name (File.basename(@config[:app_dir])) name of
37
+ # the application.
38
+ # @option config [String] :build_dir (File.join(@config[:app_dir], 'build'))
39
+ # the directory where the archive will be created.
40
+ # @option config [String] :download_dir (File.join(@config[:build_dir], 'downloads'))
41
+ # the directory where Traveling Ruby artifacts will be downloaded.
42
+ # @option config [String] :archive_name (@config[:app_name] + '.tgz') name of the archive
43
+ # @option config [Array<String>] :files (%w[lib/**/*.rb]) list of globs that will be
44
+ # expanded when including source files in archive. Should be relative from :app_dir.
45
+ # @option config [Array<String>] :executables (%w[bin/*]) list of globs that will be
46
+ # expanded when including executables in archive. Should be relative from :app_dir.
47
+ # @option config [String] :target (linux-x86_64) target platform that the archive will
48
+ # be created for. Should be one of "linux-x86", "linux-x86_64", or "osx".
49
+ # @option config [String] :traveling_ruby_version (20150210) release of Traveling Ruby
50
+ # that should be used.
51
+ # @option config [Array<String>] :without_groups (%w[development test]) list of gem
52
+ # groups to exclude from the archive.
53
+ #
5
54
  def initialize(config={})
6
55
  @config = config
7
56
  @config[:app_dir] ||= Dir.pwd
8
57
  @config[:app_name] ||= File.basename(@config[:app_dir])
9
58
  @config[:build_dir] ||= File.join(@config[:app_dir], 'build')
10
- @config[:target_dir] ||= @config[:build_dir]
11
59
  @config[:download_dir] ||= File.join(@config[:build_dir], 'downloads')
12
60
  @config[:archive_name] ||= @config[:app_name] + '.tgz'
13
61
  @config[:files] ||= %w[lib/**/*.rb]
@@ -17,22 +65,31 @@ module Tara
17
65
  @config[:without_groups] ||= %w[development test]
18
66
  end
19
67
 
68
+ # Short for `Archive.new(config).create`
69
+ #
70
+ # @return [String] Path to the archive
71
+ #
20
72
  def self.create(config={})
21
73
  new(config).create
22
74
  end
23
75
 
76
+
77
+ # Create an archive using the instance's configuration.
78
+ #
79
+ # @return [String] Path to the archive
80
+ #
24
81
  def create
25
82
  Dir.mktmpdir do |tmp_dir|
26
83
  project_dir = Pathname.new(@config[:app_dir])
27
84
  package_dir = Pathname.new(tmp_dir)
28
- target_dir = Pathname.new(@config[:target_dir])
85
+ build_dir = Pathname.new(@config[:build_dir])
29
86
  install_dependencies(package_dir, fetcher)
30
87
  copy_source(project_dir, package_dir)
31
88
  copy_executables(project_dir, package_dir)
32
89
  Dir.chdir(tmp_dir) do
33
- create_archive(target_dir)
90
+ create_archive(build_dir)
34
91
  end
35
- File.join(target_dir, @config[:archive_name])
92
+ File.join(build_dir, @config[:archive_name])
36
93
  end
37
94
  end
38
95
 
@@ -53,15 +110,16 @@ module Tara
53
110
  Pathname.glob(project_dir.join(executable_glob)).each do |executable|
54
111
  copy_file(project_dir, package_dir, executable)
55
112
  FileUtils.chmod(0755, package_dir.join(executable))
56
- create_exec_wrapper(package_dir, executable)
113
+ relative_executable = executable.relative_path_from(project_dir)
114
+ create_exec_wrapper(package_dir, relative_executable)
57
115
  end
58
116
  end
59
117
  end
60
118
 
61
- def create_archive(target_dir)
119
+ def create_archive(build_dir)
62
120
  Shell.exec('tar -czf %s %s' % [@config[:archive_name], Dir['*'].join(' ')])
63
- FileUtils.mkdir_p(target_dir)
64
- FileUtils.cp(@config[:archive_name], target_dir)
121
+ FileUtils.mkdir_p(build_dir)
122
+ FileUtils.cp(@config[:archive_name], build_dir)
65
123
  end
66
124
 
67
125
  def fetcher
@@ -82,7 +140,7 @@ module Tara
82
140
 
83
141
  def create_exec_wrapper(package_dir, executable)
84
142
  wrapper_path = package_dir.join(executable.basename)
85
- ex = Executable.new(executable.basename)
143
+ ex = Executable.new(*executable.split)
86
144
  File.open(wrapper_path, 'w') { |f| ex.write(f) }
87
145
  FileUtils.chmod(0755, wrapper_path)
88
146
  end
data/lib/tara/archiver.rb CHANGED
@@ -1,25 +1,80 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Tara
4
+ # Jara compatible Archiver class that makes it easy to release artiftacts using
5
+ # Tara and Jara.
6
+ #
7
+ # @example Release an artifact from a Rake task
8
+ # task :release do
9
+ # archiver = Tara::Archiver.new
10
+ # releaser = Jara::Releaser.new('production', 'artifact-bucket', archiver: archiver)
11
+ # releaser.release
12
+ # end
13
+ #
4
14
  class Archiver
5
- def initialize(options={})
6
- @options = options
15
+ # Create a new instance of `Archiver` with the specified configuration.
16
+ #
17
+ # The `Archiver` class supports the same configuration as {Archive#initialize}
18
+ # does, with the addition of a `:metadata` option.
19
+ #
20
+ # @param [Hash] config
21
+ # @option config [String] :app_dir (Dir.pwd) absolute path to the application
22
+ # directory.
23
+ # @option config [String] :app_name (File.basename(@config[:app_dir])) name of
24
+ # the application.
25
+ # @option config [String] :build_dir (File.join(@config[:app_dir], 'build'))
26
+ # the directory where the archive will be created.
27
+ # @option config [String] :download_dir (File.join(@config[:build_dir], 'downloads'))
28
+ # the directory where Traveling Ruby artifacts will be downloaded.
29
+ # @option config [String] :archive_name (@config[:app_name] + '.tgz') name of the archive
30
+ # @option config [Array<String>] :files (%w[lib/**/*.rb]) list of globs that will be
31
+ # expanded when including source files in archive. Should be relative from `:app_dir`.
32
+ # @option config [Array<String>] :executables (%w[bin/*]) list of globs that will be
33
+ # expanded when including executables in archive. Should be relative from `:app_dir`.
34
+ # @option config [String] :target (linux-x86_64) target platform that the archive will
35
+ # be created for. Should be one of "linux-x86", "linux-x86_64", or "osx".
36
+ # @option config [String] :traveling_ruby_version (20150210) release of Traveling Ruby
37
+ # that should be used.
38
+ # @option config [Array<String>] :without_groups (%w[development test]) list of gem
39
+ # groups to exclude from the archive.
40
+ # @option config [Hash] :metadata ({}) addidtional metadata that the
41
+ # published artifact will be tagged with.
42
+ #
43
+ def initialize(config={})
44
+ @config = config
45
+ @config[:metadata] ||= {}
7
46
  end
8
47
 
48
+ # Create a new archive
49
+ #
50
+ # @return [String] Path to the created archive
51
+ #
9
52
  def create(options={})
10
- Archive.create(@options.merge(options))
53
+ Archive.create(@config.merge(options))
11
54
  end
12
55
 
56
+ # Extension used by this archiver
57
+ #
58
+ # @return [String] 'tgz'
59
+ #
13
60
  def extension
14
- @options[:extension] || 'tgz'
61
+ 'tgz'
15
62
  end
16
63
 
64
+ # Content type used by this archiver
65
+ #
66
+ # @return [String] 'application/x-gzip'
67
+ #
17
68
  def content_type
18
69
  'application/x-gzip'
19
70
  end
20
71
 
72
+ # Metadata that the published artifact will be tagged with.
73
+ #
74
+ # @return [Hash] Hash of key-value pairs that will be used as tags.
75
+ #
21
76
  def metadata
22
- @options[:metadata] || {}
77
+ @config[:metadata]
23
78
  end
24
79
  end
25
80
  end
data/lib/tara/cli.rb CHANGED
@@ -4,6 +4,7 @@ require 'optparse'
4
4
 
5
5
 
6
6
  module Tara
7
+ # @private
7
8
  class Cli
8
9
  def initialize(argv=ARGV, io=$stderr)
9
10
  @argv = argv
@@ -1,25 +1,27 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Tara
4
+ # @private
4
5
  class Executable
5
- def initialize(name)
6
+ def initialize(dirpath, name)
7
+ @dirpath = dirpath
6
8
  @name = name
7
9
  end
8
10
 
9
11
  def write(io)
10
- io.puts(script(@name))
12
+ io.puts(script_template)
11
13
  end
12
14
 
13
15
  private
14
16
 
15
- def script(name)
17
+ def script_template
16
18
  <<-EOH.gsub(/^\s+/, '')
17
19
  #!/bin/bash
18
20
  set -e
19
21
  SELF_DIR=$(dirname "$0")
20
22
  export BUNDLE_GEMFILE="$SELF_DIR/lib/vendor/Gemfile"
21
23
  unset BUNDLE_IGNORE_CONFIG
22
- exec "$SELF_DIR/lib/ruby/bin/ruby" -rbundler/setup "$SELF_DIR/bin/#{name}" "$@"
24
+ exec "$SELF_DIR/lib/ruby/bin/ruby" -rbundler/setup "$SELF_DIR/#{@dirpath}/#{@name}" "$@"
23
25
  EOH
24
26
  end
25
27
  end
data/lib/tara/fetcher.rb CHANGED
@@ -4,6 +4,7 @@ require 'net/http'
4
4
 
5
5
 
6
6
  module Tara
7
+ # @private
7
8
  class Fetcher
8
9
  def initialize(download_dir, target, tr_version, options={})
9
10
  @download_dir = download_dir
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Tara
4
+ # @private
4
5
  class Installer
5
6
  def initialize(package_dir, fetcher, options={})
6
7
  @package_dir = package_dir
@@ -46,9 +47,9 @@ module Tara
46
47
  Dir['vendor/ruby/*/extensions/*'].each do |ext_file|
47
48
  FileUtils.rm_rf(ext_file)
48
49
  end
49
- @shell.exec('find vendor/ruby/*/gems -name "*.o" -exec rm {} \; 2>&1 || true')
50
- @shell.exec('find vendor/ruby/*/gems -name "*.so" -exec rm {} \; 2>&1 || true')
51
- @shell.exec('find vendor/ruby/*/gems -name "*.bundle" -exec rm {} \; 2>&1 || true')
50
+ @shell.exec('find vendor/ruby/*/gems -name "*.o" -exec rm {} \; 2> /dev/null || true')
51
+ @shell.exec('find vendor/ruby/*/gems -name "*.so" -exec rm {} \; 2> /dev/null || true')
52
+ @shell.exec('find vendor/ruby/*/gems -name "*.bundle" -exec rm {} \; 2> /dev/null || true')
52
53
  FileUtils.cp_r('vendor', lib_path, preserve: true)
53
54
  end
54
55
  end
@@ -65,7 +66,7 @@ module Tara
65
66
  native_gems = find_native_gems
66
67
  native_gems.each do |name, version|
67
68
  gem_archive_path = @fetcher.fetch_native_gem(name, version)
68
- @shell.exec %(tar -xzf #{gem_archive_path} -C #{ruby_vendor_path})
69
+ @shell.exec(%(tar -xzf #{gem_archive_path} -C #{ruby_vendor_path}))
69
70
  end
70
71
  end
71
72
 
@@ -106,20 +107,20 @@ module Tara
106
107
 
107
108
  def strip_leftovers
108
109
  %w[c cpp h rl].each do |ext|
109
- @shell.exec(%(find #{ruby_vendor_path} -name "*.#{ext}" -exec rm {} \\; 2>&1))
110
+ @shell.exec(%(find #{ruby_vendor_path} -name "*.#{ext}" -exec rm {} \\; 2> /dev/null))
110
111
  end
111
- @shell.exec(%(find #{ruby_vendor_path} -name "extconf.rb" -exec rm {} \\;))
112
- @shell.exec(%(find #{vendor_gems_glob.join('*', 'ext')} -name "Makefile" -exec rm {} \\; 2>&1))
113
- @shell.exec(%(find #{vendor_gems_glob.join('*', 'ext')} -name "tmp" -type d 2>&1 | xargs rm -rf))
112
+ @shell.exec(%(find #{ruby_vendor_path} -name "extconf.rb" -exec rm {} \\; 2> /dev/null))
113
+ @shell.exec(%(find #{vendor_gems_glob.join('*', 'ext')} -name "Makefile" -exec rm {} \\; 2> /dev/null))
114
+ @shell.exec(%(find #{vendor_gems_glob.join('*', 'ext')} -name "tmp" -type d 2> /dev/null | xargs rm -rf))
114
115
  end
115
116
 
116
117
  def strip_java_files
117
- @shell.exec(%(find #{vendor_gems_glob} -name "*.java" -exec rm {} \\;))
118
+ @shell.exec(%(find #{vendor_gems_glob} -name "*.java" -exec rm {} \\; 2> /dev/null))
118
119
  end
119
120
 
120
121
  def strip_git_files
121
- @shell.exec(%(find #{vendor_gems_glob} -name ".git" -type d | xargs rm -rf))
122
- @shell.exec(%(find #{bundler_gems_glob} -name ".git" -type d | xargs rm -rf))
122
+ @shell.exec(%(find #{vendor_gems_glob} -name ".git" -type d 2> /dev/null | xargs rm -rf))
123
+ @shell.exec(%(find #{bundler_gems_glob} -name ".git" -type d 2> /dev/null | xargs rm -rf))
123
124
  end
124
125
 
125
126
  def strip_from_gems(things)
data/lib/tara/shell.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Tara
4
+ # @private
4
5
  class Shell
5
6
  def self.exec(command)
6
7
  output = %x(#{command})
data/lib/tara/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Tara
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mathias Söderberg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-20 00:00:00.000000000 Z
11
+ date: 2015-04-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Tara packs your Ruby app into a standalone archive with gems and a Ruby
14
14
  runtime