flak 0.0.1

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.
data/lib/flak.rb ADDED
@@ -0,0 +1,357 @@
1
+ require 'flak/version'
2
+
3
+ require 'yaml'
4
+ require 'rake/clean'
5
+ require 'find'
6
+ require 'fileutils'
7
+ require 'erb'
8
+ require "thor"
9
+ require "thor/group"
10
+ require "ap"
11
+
12
+ require 'core_ext/string'
13
+
14
+ require 'flak/cpp'
15
+ require 'flak/delight'
16
+ require 'flak/doc'
17
+ require 'flak/gl'
18
+ require 'flak/mac'
19
+ require 'flak/max'
20
+ require 'flak/maya'
21
+ require 'flak/maya_app'
22
+ require 'flak/maya_plugin'
23
+ require 'flak/nuke'
24
+ require 'flak/target'
25
+ require 'flak/version'
26
+ require 'flak/thor/generate'
27
+ require 'flak/thor/cli'
28
+
29
+
30
+
31
+ module Flak
32
+
33
+ # return a slightly nicer OS string than the
34
+ # RUBY_PLATFORM variable
35
+ def self.os
36
+ case RUBY_PLATFORM
37
+ when /64-linux/
38
+ 'linux_64'
39
+ when /i686_linux/
40
+ 'linux_32'
41
+ when /darwin/
42
+ 'darwin'
43
+ when /i386-cygwin/
44
+ 'win_64'
45
+ end
46
+ end
47
+
48
+
49
+
50
+ # merge_setting TODO - move to a Hash#merge block
51
+ # if the same key is being offered and the value is an array, then we merge the arrays.
52
+ # otherwise it is a string, so the new one overrides the existing one.
53
+ def self.merge_setting(hash, setting_key, setting_value)
54
+ if hash.has_key?(setting_key)
55
+ if setting_value.kind_of?(Array)
56
+ hash[setting_key.to_sym] |= setting_value
57
+ else
58
+ hash[(setting_key.to_sym)] = setting_value
59
+ end
60
+ else
61
+ hash[(setting_key.to_sym)] = setting_value
62
+ end
63
+ hash
64
+ end
65
+
66
+
67
+ # given a yml settings file, resolve the configuration and OS
68
+ # and return the new flattened hash
69
+ def self.merge_settings(hash1,hash2)
70
+ hash2.each do |k,v|
71
+ merge_setting(hash1,k,v)
72
+ end
73
+ hash1
74
+ end
75
+
76
+ # given a yml settings file, resolve the configuration and OS
77
+ # and return the new flattened hash
78
+ def self.flatten_settings(yml,configuration, os)
79
+
80
+ h = Hash.new
81
+ y_hash = YAML::load_file( yml) || {}
82
+ y_hash.each do |k,v|
83
+
84
+ # root level settings
85
+ ################
86
+ if ( ! ((k =~/^os_.*/) || (k =~/^configuration_.*/)) )
87
+ h =Flak.merge_setting(h,k.to_sym, v)
88
+ else
89
+
90
+ # os specific settings
91
+ ################
92
+ if (k == "os_#{os}" )
93
+ # puts "OS => #{os}"
94
+ v.each do |k1,v1|
95
+ if (k1 =~ /^configuration_.*/ )
96
+ if (k1 == "configuration_#{configuration}" )
97
+ v1.each do |k2,v2|
98
+ h =Flak.merge_setting(h,k2.to_sym, v2)
99
+ end
100
+ end
101
+ else
102
+ h=Flak.merge_setting(h,k1.to_sym, v1)
103
+ end
104
+ end
105
+ else
106
+ # configuration settings (not os specific)
107
+ ################
108
+ if (k == "configuration_#{configuration}" )
109
+ v.each do |k1,v1|
110
+ h=Flak.merge_setting(h,k1.to_sym, v1)
111
+ end
112
+ end
113
+ ################
114
+ end
115
+
116
+ end
117
+ ################
118
+ end
119
+ # ap h
120
+ h
121
+ end
122
+
123
+
124
+ # method responsible for returning a flat and comprehensive
125
+ # settings hash by gathering all the base config settings from
126
+ # yaml and generating others programatically.
127
+ # This settings hash will be used by targets, and by the
128
+ # release mechanism.
129
+ def self.resolve_settings( existing_settings )
130
+
131
+ # bootstrap to get the configuration and the os up front because these are needed to
132
+ # handle the logic to extract the right configuration and os settings from this and
133
+ # all subsequent yml files
134
+ # f = File.dirname(File.dirname(__FILE__)) + '/config/base.yml'
135
+ # tmp = YAML::load_file( base_file )
136
+
137
+ f = existing_settings[:root] + '/config/env.yml'
138
+ h =Flak.flatten_settings(f, existing_settings[:configuration], existing_settings[:os] )
139
+ h[:root] = existing_settings[:root]
140
+ h[:os] = Flak.os
141
+
142
+ # after this point we get values from the hash (h) wherever possible -
143
+ # Why? - because h is the flattened hash - meaning that configuration and OS specific
144
+ # settings will be correct. For example, product_revision may be different for debug and release
145
+ # sr = File.dirname(File.dirname(File.dirname(__FILE__)))
146
+ # sr = File.join("/cygdrive/c/cygwin",sr) if (Flak.os == 'win_64')
147
+
148
+ #h.merge!({:os => Flak.os})
149
+
150
+ h[:build_dir] = File.join("build", h[:product_revision] , h[:os])
151
+ h[:release_root] = File.join(h[:target_release_path], h[:product_name])
152
+
153
+
154
+ h[:versioned_os_release_path] = File.join( h[:release_root] , "#{h[:product_revision]}-#{h[:os]}" )
155
+ h[:doc_dirname] = "#{h[:product_revision]}-doc"
156
+ h[:doc_release_root] = File.join( h[:release_root] , h[:doc_dirname] )
157
+
158
+ # ap h
159
+
160
+
161
+ h
162
+ end
163
+
164
+ # in order to make a symlink, we need to remove it
165
+ # if it already exists
166
+ def self.rebuild_symlink(target_file,new_file)
167
+ if File.symlink?(new_file)
168
+ File.unlink(new_file)
169
+ end
170
+ File.symlink(target_file, new_file)
171
+ end
172
+
173
+ # if we just copy src to dest and dest exists and is a directory,
174
+ # then the src is put in the dest, as opposed to overwriting it. For
175
+ # this reason, we delete dest first.
176
+ def self.copy_over(src,dest)
177
+ remove_file(dest, true)
178
+ cp_r src, dest
179
+ end
180
+
181
+
182
+ # make a directory for a file
183
+ def self.make_dir_for(file)
184
+ FileUtils.mkdir_p file.pathmap('%d')
185
+ end
186
+
187
+
188
+ ####################################################################################
189
+ ######################### I N S T A N C E M E T H O D S ##########################
190
+ ####################################################################################
191
+ def filename
192
+ f = @settings[:name]
193
+ f = f.ext(@settings[:target_extension] ) unless @settings[:target_extension].nil?
194
+ f = File.join(@settings[:build_dir],f)
195
+ end
196
+
197
+
198
+ def shell_script_release_path(file)
199
+ File.join(@settings[:versioned_os_release_path], 'bin', file.pathmap('%f'))
200
+ end
201
+
202
+
203
+ def write_erb_template(erb_file,released_file, opts={})
204
+ if (!(opts[:no_force] && File.exists?(released_file) ))
205
+ product_name = @settings[:product_name]
206
+ template = ERB.new( File.read(erb_file) , 0, "%<>")
207
+ File.open(released_file, 'w') do |f|
208
+ f.puts(template.result(binding))
209
+ f.chmod(opts[:chmod].to_i) if opts[:chmod]
210
+ end
211
+ end
212
+ end
213
+
214
+
215
+
216
+ def base_instance_tasks
217
+
218
+ namespace @settings[:name].to_sym do
219
+
220
+ if @settings[:name] == 'jRelease'
221
+ desc "Build everything"
222
+ task :build
223
+
224
+ clobber_list = [File.dirname(@settings[:build_dir]) , @settings[:versioned_os_release_path]]
225
+ CLOBBER.include( clobber_list )
226
+ end
227
+
228
+
229
+
230
+ # We want to release erb files by binding them using ERB. To help identify erb files we define them in
231
+ # yaml files under the key <type>_erb_files e.g. shell_erb_files or maya_script_erb_files for example
232
+
233
+ ##############################################
234
+ erb_keys = @settings.keys.find_all {|el| ( el.to_s =~ /^.*_erb_files$/)}
235
+
236
+ erb_keys.each do |k|
237
+ type = k.to_s.gsub("_erb_files", "") # shell or mel
238
+ files_key = type.to_sym # :shell or :mel
239
+
240
+ release_path_proc = "#{type}_release_path".to_sym
241
+
242
+ # ap [type, files_key, release_path_proc]
243
+
244
+ files = @settings[k]
245
+ unless files.nil?
246
+
247
+ files.each do |f|
248
+
249
+ # if a filename is a key in the settings hash
250
+ # and that key is a string, replace the filename with the
251
+ # value. Also, get rid of the erb extension
252
+ # For example, if @settings[:product_name] is 'jtools' then
253
+ # product_name.csh.erb becomes jtools.csh
254
+ filename_key = f.pathmap('%f').gsub(/\..*/,'').to_sym
255
+
256
+
257
+ # hack chmod for INSTALL - really must find a better way soon
258
+ write_erb_opts = (filename_key == :INSTALL) ? {:chmod => 0755} : {}
259
+
260
+
261
+
262
+ f_resolved = f.pathmap('%f').pathmap('%n')
263
+ #ap filename_key
264
+ if @settings.has_key?(filename_key)
265
+
266
+ #if @settings[filename_key].kind_of?(Symbol)
267
+ f_resolved = "#{@settings[filename_key]}#{f_resolved.pathmap('%x')}"
268
+ # puts f_resolved
269
+ #end
270
+ end
271
+
272
+ released_file = self.send release_path_proc, f_resolved
273
+
274
+
275
+ file released_file => f do
276
+
277
+ Flak.make_dir_for(released_file)
278
+ write_erb_template(f,released_file,write_erb_opts)
279
+ end
280
+
281
+ desc "bind and release ERB #{released_file.pathmap('%f')}"
282
+ task released_file.pathmap('%f') => released_file
283
+
284
+ task :release => released_file.pathmap('%f')
285
+ end
286
+ end
287
+ end
288
+ ##############################################
289
+
290
+
291
+
292
+ # @settings[:copy_only] is an array of file types that should be copied
293
+ # for example ruby files.
294
+ # If so, there should be a proc called ruby_release_path which responsible for generating the release path
295
+ # this smells a bit - not sure if it can be fixed - we will see
296
+ ##############################################
297
+ copy_keys = @settings.keys.find_all {|el| ( el.to_s =~ /^.*_copy_files$/)}
298
+
299
+ copy_keys.each do |k|
300
+ type = k.to_s.gsub("_copy_files", "")
301
+
302
+ #@settings[:copy_only].each do |type|
303
+ #files_key = "#{type}_files".to_sym
304
+ release_path_proc = "#{type}_release_path".to_sym
305
+ files = @settings[k]
306
+
307
+ ap files if release_path_proc == "shell_script_release_path"
308
+
309
+ #files = @settings[files_key]
310
+ unless files.nil?
311
+
312
+ files.each do |f|
313
+ released_file = self.send release_path_proc, f
314
+ file released_file => f do
315
+ Flak.make_dir_for(released_file)
316
+ sh "cp -r #{f} #{released_file}"
317
+ File.chmod 0755, released_file if (type == 'shell' )
318
+ end
319
+ task :release => released_file
320
+ end
321
+ end
322
+ end
323
+ ##############################################
324
+
325
+ desc "See resolved configuration settings for #{@settings[:name].to_sym}"
326
+ task :inspect do
327
+ ap @settings
328
+ end
329
+
330
+ desc "Release #{@settings[:name].to_sym}"
331
+ task :release # => [:rebuild_label_link ]
332
+
333
+
334
+ # every target needs the ability to initialize a doc hierarchy
335
+ # so this is where it goes
336
+ namespace :doc do
337
+
338
+
339
+
340
+ end # namespace doc
341
+
342
+ end # namespace name
343
+
344
+ task :release => "#{@settings[:name].to_sym}:release"
345
+
346
+ task :default => ["release"]
347
+
348
+ task :inspect do
349
+ ap @settings
350
+ end
351
+
352
+ end
353
+
354
+
355
+
356
+
357
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flak
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Julian Mann
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2012-02-20 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: thor
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: awesome_print
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: nanoc
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ type: :runtime
47
+ version_requirements: *id003
48
+ description: VFX tool build and documentation framework based on rake with thor generators
49
+ email:
50
+ - julian.mann@gmail.com
51
+ executables:
52
+ - flak
53
+ extensions: []
54
+
55
+ extra_rdoc_files: []
56
+
57
+ files:
58
+ - .gitignore
59
+ - Gemfile
60
+ - Rakefile
61
+ - bin/flak
62
+ - flak.gemspec
63
+ - lib/core_ext/string.rb
64
+ - lib/flak.rb
65
+ - lib/flak/cpp.rb
66
+ - lib/flak/delight.rb
67
+ - lib/flak/doc.rb
68
+ - lib/flak/gl.rb
69
+ - lib/flak/mac.rb
70
+ - lib/flak/max.rb
71
+ - lib/flak/maya.rb
72
+ - lib/flak/maya_app.rb
73
+ - lib/flak/maya_plugin.rb
74
+ - lib/flak/nuke.rb
75
+ - lib/flak/target.rb
76
+ - lib/flak/thor/cli.rb
77
+ - lib/flak/thor/generate.rb
78
+ - lib/flak/thor/junk/junk.rb
79
+ - lib/flak/thor/templates/INSTALL.tt
80
+ - lib/flak/thor/templates/Rakefile.tt
81
+ - lib/flak/thor/templates/cpp.tt
82
+ - lib/flak/thor/templates/delight.tt
83
+ - lib/flak/thor/templates/env.tt
84
+ - lib/flak/thor/templates/gl.tt
85
+ - lib/flak/thor/templates/mac.tt
86
+ - lib/flak/thor/templates/max.tt
87
+ - lib/flak/thor/templates/maya.tt
88
+ - lib/flak/thor/templates/maya_app.tt
89
+ - lib/flak/thor/templates/maya_plugin.tt
90
+ - lib/flak/thor/templates/nuke.tt
91
+ - lib/flak/thor/templates/product.mel.tt
92
+ - lib/flak/thor/templates/product.sh.tt
93
+ - lib/flak/version.rb
94
+ homepage: ""
95
+ licenses: []
96
+
97
+ post_install_message:
98
+ rdoc_options: []
99
+
100
+ require_paths:
101
+ - lib
102
+ required_ruby_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: "0"
108
+ required_rubygems_version: !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: "0"
114
+ requirements: []
115
+
116
+ rubyforge_project: flak
117
+ rubygems_version: 1.8.15
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: build system for VFX tools
121
+ test_files: []
122
+