Class: Roger::Release

Inherits:
Object
  • Object
show all
Extended by:
Helpers::GetCallable
Includes:
Helpers::Logging
Defined in:
lib/roger/release.rb,
lib/roger/release/scm.rb,
lib/roger/release/scm/git.rb,
lib/roger/release/scm/fixed.rb,
lib/roger/release/processors.rb

Overview

The release runner

Direct Known Subclasses

Testing::MockRelease

Defined Under Namespace

Modules: Finalizers, Processors, Scm Classes: Cleaner, Injector

Constant Summary

Constants included from Helpers::Logging

Helpers::Logging::GRAY, Helpers::Logging::RED

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers::GetCallable

get_callable

Methods included from Helpers::Logging

#debug, #log, #warn

Constructor Details

#initialize(project, config = {}) ⇒ Release

Returns a new instance of Release.

Parameters:

  • config (Hash) (defaults to: {})

    a customizable set of options

Options Hash (config):

  • :scm (:git, :fixed)

    The SCM to use (default = :git)

  • :target_path (String, Pathname)

    The path/directory to put the release into

  • :build_path (String, Pathname)

    Temporary path used to build the release

  • :cleanup_build (Boolean)

    Wether or not to remove the build_path after we’re done (default = true)

  • :cp (Array, String, nil)

    CP command to use; Array will be escaped with Shellwords. Pass nil to get native Ruby CP. (default = [“cp”, “-RL”])

  • :blank (Boolean)

    Keeps the release clean, don’t automatically add any processors or finalizers (default = false)



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/roger/release.rb', line 37

def initialize(project, config = {})
  real_project_path = project.path.realpath
  defaults = {
    scm: :git,
    source_path: real_project_path + "html",
    target_path: real_project_path + "releases",
    build_path: real_project_path + "build",
    cp: ["cp", "-RL"],
    blank: false,
    cleanup_build: true
  }

  @config = {}.update(defaults).update(config)

  @project = project
  @stack = []
  @finalizers = []
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



12
13
14
# File 'lib/roger/release.rb', line 12

def config
  @config
end

#finalizersObject (readonly)

Returns the value of attribute finalizers.



14
15
16
# File 'lib/roger/release.rb', line 14

def finalizers
  @finalizers
end

#projectObject (readonly)

Returns the value of attribute project.



12
13
14
# File 'lib/roger/release.rb', line 12

def project
  @project
end

#stackObject (readonly)

Returns the value of attribute stack.



14
15
16
# File 'lib/roger/release.rb', line 14

def stack
  @stack
end

Class Method Details

.default_finalizersObject



23
24
25
# File 'lib/roger/release.rb', line 23

def default_finalizers
  [[get_callable(:dir, Roger::Release::Finalizers.map), {}]]
end

.default_stackObject



19
20
21
# File 'lib/roger/release.rb', line 19

def default_stack
  []
end

Instance Method Details

Generates a banner if a block is given, or returns the currently set banner. It automatically takes care of adding comment marks around the banner.

The default banner looks like this:

Version : v1.0.0 =

Date : 2012-06-20 =

Parameters:

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :comment (:css, :js, :html, false)

    Wether or not to comment the output and in what style. (default=js)



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/roger/release.rb', line 149

def banner(options = {}, &_block)
  options = {
    comment: :js
  }.update(options)

  if block_given?
    @_banner = yield.to_s
  elsif !@_banner
    @_banner = default_banner.join("\n")
  end

  if options[:comment]
    comment(@_banner, style: options[:comment])
  else
    @_banner
  end
end

#build_pathObject

Accessor for build_path The build_path is a temporary directory where the release will be built

Returns:

  • Pathname the build_path



68
69
70
# File 'lib/roger/release.rb', line 68

def build_path
  Pathname.new(config[:build_path])
end

#cleanup(pattern) ⇒ Object

Files to clean up in the build directory just before finalization happens

Parameters:

  • Pattern (String)

    to glob within build directory



132
133
134
# File 'lib/roger/release.rb', line 132

def cleanup(pattern)
  @stack << Cleaner.new(pattern)
end

#extract(options = {}) ⇒ Object

Deprecated.

Don’t use the extractor anymore, use release.use(:mockup, options) processor

Extract the mockup, this will happen anyway, and will always happen first This method gives you a way to pass options to the extractor.

Parameters:

  • Hash

    options Options hash passed to extractor



173
174
175
176
177
# File 'lib/roger/release.rb', line 173

def extract(options = {})
  warn(self, "Don't use the extractor anymore, use release.use(:mockup, options)
    and release.use(:url_relativizer, options) processors")
  @extractor_options = options
end

#finalize(finalizer, options = {}) ⇒ Object

Write out the whole release into a directory, zip file or anything you can imagine #finalize can be called multiple times, it just will run all of them.

The default finalizer is :dir

Parameters:

  • Finalizer (Symbol, Proc)

    to use



122
123
124
# File 'lib/roger/release.rb', line 122

def finalize(finalizer, options = {})
  @finalizers << [self.class.get_callable(finalizer, Roger::Release::Finalizers.map), options]
end

#get_files(globs, excludes = []) ⇒ Object

Parameters:

  • globs (Array)

    an array of file path globs that will be globbed against the build_path

  • excludes (Array) (defaults to: [])

    an array of regexps that will be excluded from the result



205
206
207
208
209
210
211
212
# File 'lib/roger/release.rb', line 205

def get_files(globs, excludes = [])
  files = globs.map { |g| Dir.glob(build_path + g) }.flatten
  if excludes.any?
    files.reject { |c| excludes.detect { |e| e.match(c) } }
  else
    files
  end
end

#inject(variables, options) ⇒ Object

Inject variables into files with an optional filter



101
102
103
# File 'lib/roger/release.rb', line 101

def inject(variables, options)
  @stack << Injector.new(variables, options)
end

#run!Object

Actually perform the release



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/roger/release.rb', line 180

def run!
  project.mode = :release

  # Validate paths
  validate_paths!

  # Extract mockup
  copy_source_path_to_build_path!

  validate_stack!

  # Run stack
  run_stack!

  # Run finalizers
  run_finalizers!

  # Cleanup
  cleanup! if config[:cleanup_build]
ensure
  project.mode = nil
end

#scm(force = false) ⇒ Object

Get the current SCM object



81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/roger/release.rb', line 81

def scm(force = false)
  return @_scm if @_scm && !force

  case config[:scm]
  when :git
    @_scm = Release::Scm::Git.new(path: source_path)
  when :fixed
    @_scm = Release::Scm::Fixed.new
  else
    fail "Unknown SCM #{options[:scm].inspect}"
  end
end

#source_pathObject

Accessor for source_path The source path is the root of the mockup

Returns:

  • Pathanem the source_path



76
77
78
# File 'lib/roger/release.rb', line 76

def source_path
  Pathname.new(config[:source_path])
end

#target_pathObject

Accessor for target_path The target_path is the path where the finalizers will put the release

Returns:

  • Pathname the target_path



60
61
62
# File 'lib/roger/release.rb', line 60

def target_path
  Pathname.new(config[:target_path])
end

#use(processor, options = {}) ⇒ Object

Use a certain pre-processor



109
110
111
# File 'lib/roger/release.rb', line 109

def use(processor, options = {})
  @stack << [self.class.get_callable(processor, Roger::Release::Processors.map), options]
end