flex-compiler 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/flex-compiler.rb +326 -0
- data/lib/flex-compiler/compiler_options.rb +47 -0
- data/lib/flex-compiler/version.rb +4 -0
- metadata +70 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
require "flex-compiler/version"
|
|
2
|
+
require "flex-compiler/compiler_options"
|
|
3
|
+
require "yaml"
|
|
4
|
+
|
|
5
|
+
module FlexCompiler
|
|
6
|
+
|
|
7
|
+
# generates a compc command and execute it.
|
|
8
|
+
#
|
|
9
|
+
# The options argument can be a hash or a yaml file
|
|
10
|
+
# containing the following values:
|
|
11
|
+
# required
|
|
12
|
+
# - flex_home: the folder that contains the flex sdk
|
|
13
|
+
# optional
|
|
14
|
+
# - output_folder: (default: "bin")
|
|
15
|
+
# - output_name: (default: the name of the folder that contains the project)
|
|
16
|
+
# - src_dir: (default: "src")
|
|
17
|
+
# - locale_dir: (default: "locale")
|
|
18
|
+
# - libs: (no default TODO: add default)
|
|
19
|
+
#
|
|
20
|
+
# * *Args* :
|
|
21
|
+
# - +options+ -> either a hash or a string pointing to a yml file.
|
|
22
|
+
# * *Returns* :
|
|
23
|
+
# - the output from compc
|
|
24
|
+
# * *Raises* :
|
|
25
|
+
# - +ArgumentError+ -> if any value is nil or negative
|
|
26
|
+
#
|
|
27
|
+
def self.compile(options = nil)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if( options.nil? )
|
|
31
|
+
options = "flex-compiler-config.yml"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if( options.class == "Hash")
|
|
35
|
+
opts = options
|
|
36
|
+
elsif( options.class.to_s == "String" )
|
|
37
|
+
yml = YAML.load_file( options )
|
|
38
|
+
opts = Hash.new
|
|
39
|
+
opts[:flex_home] = yml["flex_home"] unless yml["flex_home"].nil?
|
|
40
|
+
opts[:src_dir] = yml["src_dir"] unless yml["src_dir"].nil?
|
|
41
|
+
opts[:locale_dir] = yml["locale_dir"] unless yml["locale_dir"].nil?
|
|
42
|
+
opts[:output_name] = yml["output_name"] unless yml["output_name"].nil?
|
|
43
|
+
opts[:output_folder] = yml["output_folder"] unless yml["output_folder"].nil?
|
|
44
|
+
opts[:libs] = yml["libs"] unless yml["libs"].nil?
|
|
45
|
+
opts[:test_mode] = yml["test_mode"] unless yml["test_mode"].nil?
|
|
46
|
+
opts[:application] = yml["application"] unless yml["application"].nil?
|
|
47
|
+
opts[:ignore_files] = yml["ignore_files"] unless yml["ignore_files"].nil?
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
generator = CommandGenerator.new( CompilerOptions.new opts )
|
|
51
|
+
command = generator.command
|
|
52
|
+
|
|
53
|
+
puts "-- command --"
|
|
54
|
+
puts command
|
|
55
|
+
puts "-- end command --"
|
|
56
|
+
|
|
57
|
+
if( opts[:test_mode] )
|
|
58
|
+
return
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
result = `#{command}`
|
|
62
|
+
puts result
|
|
63
|
+
|
|
64
|
+
raise "errror executing process" unless $?.to_i == 0
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class CommandGenerator
|
|
71
|
+
|
|
72
|
+
PLAYER_GLOBAL = "playerglobal"
|
|
73
|
+
|
|
74
|
+
def initialize(options)
|
|
75
|
+
@options = options
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def command
|
|
79
|
+
|
|
80
|
+
bin = "#{@options.flex_home}\\bin\\"
|
|
81
|
+
|
|
82
|
+
if( application.nil? )
|
|
83
|
+
exe = "#{bin}compc.exe"
|
|
84
|
+
else
|
|
85
|
+
exe = "#{bin}mxmlc.exe"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
sources = "-source-path #{src_dir}"
|
|
89
|
+
if( File.exists? locale_dir )
|
|
90
|
+
locale_string = "-locale #{discover_locale}"
|
|
91
|
+
include_bundles = "-include-resource-bundles #{discover_rb}"
|
|
92
|
+
sources += " #{locale_dir}/{locale}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
args = [
|
|
96
|
+
source_path_overlap,
|
|
97
|
+
locale_string,
|
|
98
|
+
include_bundles,
|
|
99
|
+
framework_library_paths,
|
|
100
|
+
lib_paths,
|
|
101
|
+
sources,
|
|
102
|
+
dump_config,
|
|
103
|
+
output
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
if( compc? )
|
|
107
|
+
#the ordering is important here:
|
|
108
|
+
args = [include_stylesheets, include_assets, classes ] + args
|
|
109
|
+
else
|
|
110
|
+
args << "#{src_dir}/#{application}.mxml"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
add_output_folder
|
|
114
|
+
|
|
115
|
+
command = "\"#{exe}\" #{args.join(' ')}"
|
|
116
|
+
command
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
private
|
|
120
|
+
|
|
121
|
+
def add_output_folder
|
|
122
|
+
FileUtils.mkdir_p output_folder unless File.exists? output_folder
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def source_path_overlap
|
|
127
|
+
"-allow-source-path-overlap=true"
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def compc?; application.nil?; end
|
|
131
|
+
|
|
132
|
+
def application; @options.application; end
|
|
133
|
+
|
|
134
|
+
def output
|
|
135
|
+
type = compc? ? "swc" : "swf"
|
|
136
|
+
"-output=\"#{output_folder}/#{output_name}.#{type}\""
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def output_folder
|
|
140
|
+
@options.output_folder
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def output_name
|
|
144
|
+
@options.output_name
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def src_dir
|
|
148
|
+
@options.src_dir
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def locale_dir
|
|
152
|
+
@options.locale_dir
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def libs; @options.libs; end
|
|
156
|
+
|
|
157
|
+
def dump_config
|
|
158
|
+
"-dump-config \"#{output_folder}/#{output_name}-config.xml\""
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def classes
|
|
162
|
+
files = Dir["#{src_dir}/**/*.{as,mxml}"]
|
|
163
|
+
|
|
164
|
+
if files.nil? || files.empty?
|
|
165
|
+
return ""
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
out = "-include-classes "
|
|
169
|
+
|
|
170
|
+
class_array = []
|
|
171
|
+
|
|
172
|
+
files.each{ |f|
|
|
173
|
+
if( !is_ignore_file(f) )
|
|
174
|
+
f.gsub!("src/", "")
|
|
175
|
+
f.gsub!("/", ".")
|
|
176
|
+
f.gsub!(".as", "")
|
|
177
|
+
f.gsub!(".mxml", "")
|
|
178
|
+
class_array << f
|
|
179
|
+
end
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
"#{out} #{class_array.join ' '}"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def is_ignore_file( file )
|
|
186
|
+
|
|
187
|
+
ignore_files.each{ |ignore|
|
|
188
|
+
if( file.include? ignore )
|
|
189
|
+
return true
|
|
190
|
+
end
|
|
191
|
+
}
|
|
192
|
+
false
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def ignore_files; @options.ignore_files; end
|
|
196
|
+
|
|
197
|
+
# create the locale argument by inspecting the contents of the locale folder.
|
|
198
|
+
# @return a locale string - eg: "en_US,de_DE"
|
|
199
|
+
def discover_locale
|
|
200
|
+
locales = Dir["#{locale_dir}/*"]
|
|
201
|
+
locales.map! { |e| File.basename(e) }
|
|
202
|
+
locales.join(" ")
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def discover_rb
|
|
206
|
+
locales = Dir["#{locale_dir}/*"]
|
|
207
|
+
raise "can't find locales folders" if locales.nil? || locales.length == 0
|
|
208
|
+
props = Dir["#{locales[0]}/*.properties"]
|
|
209
|
+
props.map! { |e| File.basename(e, ".*")}
|
|
210
|
+
props.join(' ')
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
def add_locale_to_source_path
|
|
214
|
+
locales = Dir["#{locale_dir}/*"]
|
|
215
|
+
locales.join(" ")
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def include_stylesheets
|
|
219
|
+
name_paths = get_name_paths "css", "-include-file"
|
|
220
|
+
if( name_paths.empty? )
|
|
221
|
+
return ""
|
|
222
|
+
end
|
|
223
|
+
name_paths
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def include_assets
|
|
227
|
+
name_paths = get_name_paths "jpg,jpeg,png,gif", "-include-file"
|
|
228
|
+
if( name_paths.empty? )
|
|
229
|
+
return ""
|
|
230
|
+
end
|
|
231
|
+
name_paths
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def get_name_paths( types, directive )
|
|
235
|
+
|
|
236
|
+
assets = Dir["#{src_dir}/**/*.{#{types}}"]
|
|
237
|
+
|
|
238
|
+
if assets.nil? || assets.empty?
|
|
239
|
+
return ""
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
name_paths = assets.map{ |e| NamePath.new(src_dir, e)}
|
|
243
|
+
|
|
244
|
+
output = ""
|
|
245
|
+
name_paths.each{ |np| output << "#{directive} #{np.name_path} " }
|
|
246
|
+
output
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def framework_library_paths
|
|
250
|
+
home = @options.flex_home.gsub("\\", "/")
|
|
251
|
+
frameworks_swcs = Dir["#{home}/frameworks/libs/**/*.swc"]
|
|
252
|
+
|
|
253
|
+
if frameworks_swcs.nil? || frameworks_swcs.empty?
|
|
254
|
+
raise "Error: can't find framework swcs"
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
directive = compc? ? "-external-library-path+=" : "-library-path+="
|
|
258
|
+
output = ""
|
|
259
|
+
frameworks_swcs.each{ |swc|
|
|
260
|
+
if( swc.include? "#{PLAYER_GLOBAL}.swc")
|
|
261
|
+
output << "-external-library-path+=\"#{swc}\" "
|
|
262
|
+
else
|
|
263
|
+
output << "#{directive}\"#{swc}\" "
|
|
264
|
+
end
|
|
265
|
+
}
|
|
266
|
+
output
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def lib_paths
|
|
270
|
+
|
|
271
|
+
if( libs.nil? || libs.empty? )
|
|
272
|
+
return ""
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
output = ""
|
|
276
|
+
libs.each{ |l|
|
|
277
|
+
if( l.end_with? "swc")
|
|
278
|
+
f = File.open(l)
|
|
279
|
+
|
|
280
|
+
#its a swc add it directly
|
|
281
|
+
output << "-library-path+=\"#{l}\" "
|
|
282
|
+
else
|
|
283
|
+
#its a folder add all the swcs in the folder
|
|
284
|
+
swcs = Dir["#{l}/**/*.swc"]
|
|
285
|
+
swcs.each{ |swc|
|
|
286
|
+
f = File.open(swc)
|
|
287
|
+
output << "-library-path+=\"#{File.expand_path(f)}\" "
|
|
288
|
+
}
|
|
289
|
+
end
|
|
290
|
+
}
|
|
291
|
+
output
|
|
292
|
+
end
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
class NamePath
|
|
296
|
+
|
|
297
|
+
attr_reader :path
|
|
298
|
+
|
|
299
|
+
def initialize(src_dir, path)
|
|
300
|
+
@path = path
|
|
301
|
+
@src_dir = src_dir
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def name
|
|
305
|
+
|
|
306
|
+
src = starts_with?("/", @src_dir) ? @src_dir[1, @src_dir.length] : @src_dir
|
|
307
|
+
out = path.gsub( "#{src}", "")
|
|
308
|
+
puts "NamePath:name: #{out}, #{path}"
|
|
309
|
+
out
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
def name_path
|
|
313
|
+
"#{name} #{path}"
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
private
|
|
317
|
+
def starts_with?(prefix, str)
|
|
318
|
+
prefix = prefix.to_s
|
|
319
|
+
str[0, prefix.length] == prefix
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
class CompilerOptions
|
|
2
|
+
# provides a set of defaults
|
|
3
|
+
# a hash of options
|
|
4
|
+
def initialize( options )
|
|
5
|
+
@options = options
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
# required
|
|
10
|
+
def flex_home
|
|
11
|
+
@options[:flex_home]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def output_folder
|
|
15
|
+
@options[:output_folder] || "bin"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def output_name
|
|
19
|
+
@options[:output_name] || File.basename(Dir.pwd)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def src_dir
|
|
23
|
+
@options[:src_dir] || "src"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def locale_dir
|
|
27
|
+
@options[:locale_dir] || "locale"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_mode
|
|
31
|
+
@options[:test_mode] || false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def libs
|
|
35
|
+
@options[:libs] || ["libs"]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def application
|
|
39
|
+
@options[:application] || nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def ignore_files
|
|
43
|
+
@options[:ignore_files] || []
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: flex-compiler
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- ed eustace
|
|
9
|
+
autorequire:
|
|
10
|
+
bindir: bin
|
|
11
|
+
cert_chain: []
|
|
12
|
+
date: 2012-02-08 00:00:00.000000000Z
|
|
13
|
+
dependencies:
|
|
14
|
+
- !ruby/object:Gem::Dependency
|
|
15
|
+
name: thor
|
|
16
|
+
requirement: &23823288 !ruby/object:Gem::Requirement
|
|
17
|
+
none: false
|
|
18
|
+
requirements:
|
|
19
|
+
- - ! '>='
|
|
20
|
+
- !ruby/object:Gem::Version
|
|
21
|
+
version: '0'
|
|
22
|
+
type: :runtime
|
|
23
|
+
prerelease: false
|
|
24
|
+
version_requirements: *23823288
|
|
25
|
+
- !ruby/object:Gem::Dependency
|
|
26
|
+
name: rspec
|
|
27
|
+
requirement: &23822952 !ruby/object:Gem::Requirement
|
|
28
|
+
none: false
|
|
29
|
+
requirements:
|
|
30
|
+
- - ~>
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.6'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: *23822952
|
|
36
|
+
description: ..
|
|
37
|
+
email:
|
|
38
|
+
- ed.eustace@gmail.com
|
|
39
|
+
executables: []
|
|
40
|
+
extensions: []
|
|
41
|
+
extra_rdoc_files: []
|
|
42
|
+
files:
|
|
43
|
+
- lib/flex-compiler/compiler_options.rb
|
|
44
|
+
- lib/flex-compiler/version.rb
|
|
45
|
+
- lib/flex-compiler.rb
|
|
46
|
+
homepage: ''
|
|
47
|
+
licenses: []
|
|
48
|
+
post_install_message:
|
|
49
|
+
rdoc_options: []
|
|
50
|
+
require_paths:
|
|
51
|
+
- lib
|
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
53
|
+
none: false
|
|
54
|
+
requirements:
|
|
55
|
+
- - ! '>='
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
version: '0'
|
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
|
+
none: false
|
|
60
|
+
requirements:
|
|
61
|
+
- - ! '>='
|
|
62
|
+
- !ruby/object:Gem::Version
|
|
63
|
+
version: '0'
|
|
64
|
+
requirements: []
|
|
65
|
+
rubyforge_project: flex-compiler
|
|
66
|
+
rubygems_version: 1.7.2
|
|
67
|
+
signing_key:
|
|
68
|
+
specification_version: 3
|
|
69
|
+
summary: A simple api for using flex sdk command line tools
|
|
70
|
+
test_files: []
|