Class: Roger::Release

Inherits:
Object
  • Object
show all
Extended by:
Helpers::GetCallable
Includes:
Helpers::GetFiles, 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::GetFiles

#get_files

Methods included from Helpers::Logging

#debug, #log, #warn

Constructor Details

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

Returns a new instance of Release.

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)



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

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.



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

def config
  @config
end

#finalizersObject (readonly)

Returns the value of attribute finalizers.



16
17
18
# File 'lib/roger/release.rb', line 16

def finalizers
  @finalizers
end

#projectObject (readonly)

Returns the value of attribute project.



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

def project
  @project
end

#stackObject (readonly)

Returns the value of attribute stack.



16
17
18
# File 'lib/roger/release.rb', line 16

def stack
  @stack
end

Class Method Details

.default_finalizersObject



25
26
27
# File 'lib/roger/release.rb', line 25

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

.default_stackObject



21
22
23
# File 'lib/roger/release.rb', line 21

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 =

Options Hash (options):

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

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



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

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



70
71
72
# File 'lib/roger/release.rb', line 70

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

#cleanup(pattern) ⇒ Object

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



134
135
136
# File 'lib/roger/release.rb', line 134

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.



175
176
177
178
179
# File 'lib/roger/release.rb', line 175

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



124
125
126
# File 'lib/roger/release.rb', line 124

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

#inject(variables, options) ⇒ Object

Inject variables into files with an optional filter



103
104
105
# File 'lib/roger/release.rb', line 103

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

#run!Object

Actually perform the release



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

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



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

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



78
79
80
# File 'lib/roger/release.rb', line 78

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



62
63
64
# File 'lib/roger/release.rb', line 62

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

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

Use a certain pre-processor



111
112
113
# File 'lib/roger/release.rb', line 111

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