Class: Sega::RakeTask

Inherits:
Rake::TaskLib
  • Object
show all
Defined in:
lib/sega/rake_task.rb

Overview

Provides a custom rake task.

require ‘sega/rake_task’ Sega::RakeTask.new

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args, &task_block) ⇒ RakeTask

Returns a new instance of RakeTask.



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/sega/rake_task.rb', line 18

def initialize(*args, &task_block)
  @ruby_version ||= '>= 2.3.0'
  @bundler_version ||= '= 1.10.6'

  namespace 'sega' do
    desc 'Run Sega Packager' unless ::Rake.application.last_description
    task(:package, *args) do |_, task_args|
      yield(*[self, task_args].slice(0, task_block.arity)) if block_given?

      package
    end
  end
end

Instance Attribute Details

#bundler_versionObject

Returns the value of attribute bundler_version.



16
17
18
# File 'lib/sega/rake_task.rb', line 16

def bundler_version
  @bundler_version
end

#ruby_versionObject

Returns the value of attribute ruby_version.



15
16
17
# File 'lib/sega/rake_task.rb', line 15

def ruby_version
  @ruby_version
end

Instance Method Details

#debug(msg) ⇒ Object



84
85
86
# File 'lib/sega/rake_task.rb', line 84

def debug(msg)
  puts "[DEBUG] #{msg}" if ENV['DEBUG']
end

#installer_fileObject



88
89
90
91
# File 'lib/sega/rake_task.rb', line 88

def installer_file
  template = File.read(installer_filename)
  ERB.new(template).result(binding)
end

#installer_filenameObject



93
94
95
# File 'lib/sega/rake_task.rb', line 93

def installer_filename
  File.join(File.dirname(__FILE__), INSTALLER_TEMPL)
end

#packageObject

rubocop:disable Metrics/MethodLength, Metrics/AbcSize



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/sega/rake_task.rb', line 32

def package # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  require 'yaml'
  require 'pathname'
  require 'bundler/cli'
  require 'rubygems/specification'
  require 'rubygems/package'

  Bundler::CLI.start(%w(package --all), debug: true)

  gemspec_filename = "#{proj_name}.gemspec"
  spec = Gem::Specification.load(gemspec_filename)

  gems = Dir['vendor/cache/**/*']
  bundle_dir = Dir['.bundle/*']

  exec_tgz = "#{proj_name}.run"
  # step 1 - add the ruby installer script
  File.open(exec_tgz, 'wb') do |file|
    file.write(installer_file)
  end

  File.open(exec_tgz, 'a+') do |file|
    Zlib::GzipWriter.wrap(file) do |gz|
      Gem::Package::TarWriter.new(gz) do |tar|
        (spec.files + gems + bundle_dir).each do |f|
          unless File.directory?(f)
            size = File.size(f)
            mode = File.stat(f).mode & 07777
            debug "adding: #{f} size: #{size} mode: #{mode.to_s(8)}"

            input = ''
            if f == gemspec_filename # add the gemspec (post processing)
              input = spec.to_ruby
              size = input.size
            else
              input = File.read(f)
            end

            tar.add_file_simple(f, mode, size) do |io|
              io.write(input)
            end
          end
        end
      end
    end
  end

  File.chmod(0755, exec_tgz)
  puts "Created Self-Extracting Gem Archive: #{exec_tgz}"
  exec_tgz
end

#proj_nameObject



97
98
99
100
# File 'lib/sega/rake_task.rb', line 97

def proj_name
  _, location = Rake.application.find_rakefile_location
  @proj_name ||= File.basename(Dir[File.join(location, '*.gemspec')].first, '.gemspec')
end