flashsdk 1.0.1.pre

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.
Files changed (43) hide show
  1. data/Gemfile +9 -0
  2. data/README.textile +0 -0
  3. data/VERSION +1 -0
  4. data/bin/sprout-as3 +9 -0
  5. data/flashsdk.gemspec +23 -0
  6. data/lib/flashplayer/clix_flash_player.rb +91 -0
  7. data/lib/flashplayer/clix_wrapper.rb +22 -0
  8. data/lib/flashplayer/errors.rb +12 -0
  9. data/lib/flashplayer/log_file.rb +95 -0
  10. data/lib/flashplayer/mm_config.rb +96 -0
  11. data/lib/flashplayer/module.rb +50 -0
  12. data/lib/flashplayer/specification.rb +32 -0
  13. data/lib/flashplayer/task.legacy.rb +293 -0
  14. data/lib/flashplayer/task.rb +137 -0
  15. data/lib/flashplayer/trust.rb +45 -0
  16. data/lib/flashplayer.rb +8 -0
  17. data/lib/flashsdk/generators/class_generator.rb +43 -0
  18. data/lib/flashsdk/generators/flash_helper.rb +48 -0
  19. data/lib/flashsdk/generators/project_generator.rb +53 -0
  20. data/lib/flashsdk/generators/templates/ActionScript3Class.as +9 -0
  21. data/lib/flashsdk/generators/templates/ActionScript3MainClass.as +11 -0
  22. data/lib/flashsdk/generators/templates/DefaultProjectImage.png +0 -0
  23. data/lib/flashsdk/generators/templates/Gemfile +6 -0
  24. data/lib/flashsdk/generators/templates/rakefile.rb +17 -0
  25. data/lib/flashsdk/module.rb +9 -0
  26. data/lib/flashsdk/tasks/mxmlc.rb +687 -0
  27. data/lib/flashsdk/tasks/mxmlc_legacy.rb +135 -0
  28. data/lib/flashsdk.rb +12 -0
  29. data/lib/flex3.rb +53 -0
  30. data/lib/flex4.rb +58 -0
  31. data/rakefile.rb +20 -0
  32. data/test/fixtures/mxmlc/simple/SomeFile.as +11 -0
  33. data/test/unit/class_generator_test.rb +50 -0
  34. data/test/unit/flash_helper_test.rb +27 -0
  35. data/test/unit/flashplayer_test.rb +56 -0
  36. data/test/unit/log_file_test.rb +47 -0
  37. data/test/unit/mm_config_test.rb +74 -0
  38. data/test/unit/mxmlc_test.rb +45 -0
  39. data/test/unit/project_generator_test.rb +53 -0
  40. data/test/unit/task_test.rb +93 -0
  41. data/test/unit/test_helper.rb +16 -0
  42. data/test/unit/trust_test.rb +30 -0
  43. metadata +145 -0
@@ -0,0 +1,293 @@
1
+
2
+ =begin
3
+
4
+ class FlashPlayerTask < Rake::Task
5
+ # This is the opening prelude to a collection of test results. When the
6
+ # task encounters this string in the trace output log file, it will begin
7
+ # collecting trace statements with the expectation that the following
8
+ # strings will be well-formatted XML data matching what JUnit emits for
9
+ # Cruise Control.
10
+ #
11
+ # See the lib/asunit3/asunit.framework.XMLResultPrinter for more information.
12
+ @@test_result_pre_delimiter = '<XMLResultPrinter>'
13
+
14
+ # This is the closing string that will indicate the end of test result XML data
15
+ @@test_result_post_delimiter = '</XMLResultPrinter>'
16
+
17
+ @@home = nil
18
+ @@trust = nil
19
+
20
+ def initialize(task_name, app)
21
+ super(task_name, app)
22
+ @default_gem_name = 'sprout-flashplayer-tool'
23
+ @default_gem_version = '10.22.0'
24
+ @default_result_file = 'AsUnitResults.xml'
25
+ @inside_test_result = false
26
+ end
27
+
28
+ def self.define_task(args, &block)
29
+ t = super
30
+ yield t if block_given?
31
+ t.define
32
+ end
33
+
34
+ # Local system path to the Flash Player Trust file
35
+ def FlashPlayerTask.trust
36
+ if(@@trust)
37
+ return @@trust
38
+ end
39
+ @@trust = File.join(FlashPlayerTask.home, '#Security', 'FlashPlayerTrust', 'sprout.cfg')
40
+ return @@trust
41
+ end
42
+
43
+ # Local system path to where the Flash Player stores trace output logs and trust files
44
+ def FlashPlayerTask.home
45
+ if(@@home)
46
+ return @@home
47
+ end
48
+
49
+ FlashPlayerTask.home_paths.each do |path|
50
+ if(File.exists?(path))
51
+ return @@home = path
52
+ end
53
+ end
54
+
55
+ if(@@home.nil?)
56
+ raise FlashPlayerError.new('FlashPlayer unable to find home folder for your platform')
57
+ end
58
+ return @@home
59
+ end
60
+
61
+ # Collection of the potential locations of the Flash Player Home
62
+ # For each supported Platform, the first existing location
63
+ # will be used.
64
+ def FlashPlayerTask.home_paths
65
+ return [File.join(User.library, 'Preferences', 'Macromedia', 'Flash Player'),
66
+ File.join(User.library, 'Application Support', 'Macromedia'),
67
+ File.join(User.home, 'Application Data', 'Macromedia', 'Flash Player'),
68
+ File.join(User.home, 'AppData', 'Roaming', 'Macromedia', 'Flash Player'),
69
+ File.join(User.home, '.macromedia', 'Flash_Player')]
70
+ end
71
+
72
+ # The swf parameter can be set explicitly in the block sent to this task as in:
73
+ #
74
+ # flashplayer :run do |t|
75
+ # t.swf = 'bin/SomeProject.swf'
76
+ # end
77
+ #
78
+ # Or it can be set implicitly as a rake prerequisite as follows:
79
+ #
80
+ # flashplayer :run => 'bin/SomeProject' do |t|
81
+ # end
82
+ #
83
+ def swf=(swf)
84
+ @swf = swf
85
+ end
86
+
87
+ def swf
88
+ @swf ||= nil
89
+ if(@swf.nil?)
90
+ prerequisites.each do |req|
91
+ if(req.index('.swf'))
92
+ @swf = req.to_s
93
+ break
94
+ end
95
+ end
96
+ end
97
+ return @swf
98
+ end
99
+
100
+ def gem_version=(version)
101
+ @gem_version = version
102
+ end
103
+
104
+ def gem_version
105
+ return @gem_version ||= nil
106
+ end
107
+
108
+ # Full name of the sprout tool gem that this tool task will use.
109
+ # This defaults to sprout-flashplayer-tool
110
+ def gem_name=(name)
111
+ @gem_name = name
112
+ end
113
+
114
+ def gem_name
115
+ return @gem_name ||= @default_gem_name
116
+ end
117
+
118
+ # The File where JUnit test results should be written. This value
119
+ # defaults to 'AsUnitResults.xml'
120
+ #
121
+ def test_result_file=(file)
122
+ @test_result_file = file
123
+ end
124
+
125
+ def test_result_file
126
+ @test_result_file ||= @default_result_file
127
+ end
128
+
129
+ def test_result
130
+ @test_result ||= ''
131
+ end
132
+
133
+ def define # :nodoc:
134
+ CLEAN.add(test_result_file)
135
+ end
136
+
137
+ def execute(*args)
138
+ super
139
+ raise FlashPlayerError.new("FlashPlayer task #{name} required field swf is nil") unless swf
140
+
141
+ log_file = nil
142
+
143
+ # Don't let trust or log file failures break other features...
144
+ begin
145
+ config = FlashPlayerConfig.new
146
+ log_file = config.log_file
147
+ FlashPlayerTrust.new(File.expand_path(File.dirname(swf)))
148
+
149
+ if(File.exists?(log_file))
150
+ File.open(log_file, 'w') do |f|
151
+ f.write('')
152
+ end
153
+ else
154
+ FileUtils.makedirs(File.dirname(log_file))
155
+ FileUtils.touch(log_file)
156
+ end
157
+ rescue StandardError => e
158
+ logger.puts '[WARNING] FlashPlayer encountered an error working with the mm.cfg log and/or editing the Trust file'
159
+ end
160
+
161
+ @running_process = nil
162
+ @thread = run(gem_name, gem_version, swf)
163
+ read_log(@thread, log_file) unless log_file.nil?
164
+ @thread.join
165
+ end
166
+
167
+ def run(tool, gem_version, swf)
168
+ path_to_exe = Sprout.get_executable(tool, nil, gem_version)
169
+ target = User.clean_path(path_to_exe)
170
+ @player_pid = nil
171
+
172
+ thread_out = $stdout
173
+ command = "#{target} #{User.clean_path(swf)}"
174
+
175
+ usr = User.new()
176
+ if(usr.is_a?(WinUser) && !usr.is_a?(CygwinUser))
177
+ return Thread.new {
178
+ system command
179
+ }
180
+ elsif usr.is_a?(OSXUser)
181
+ require 'clix_flash_player'
182
+ @clix_player = CLIXFlashPlayer.new
183
+ @clix_player.execute(target, swf)
184
+ return @clix_player
185
+ else
186
+ return Thread.new {
187
+ require 'open4'
188
+ @player_pid, stdin, stdout, stderr = Open4.popen4(command)
189
+ stdout.read
190
+ }
191
+ end
192
+ end
193
+
194
+ def close
195
+ usr = User.new
196
+ if(usr.is_a?(WinUser))
197
+ Thread.kill(@thread)
198
+ elsif(usr.is_a?(OSXUser))
199
+ @clix_player.kill unless @clix_player.nil?
200
+ else
201
+ Process.kill("SIGALRM", @player_pid)
202
+ end
203
+ end
204
+
205
+ def read_log(thread, log_file)
206
+ lines_put = 0
207
+
208
+ if(log_file.nil?)
209
+ raise FlashPlayerError.new('[ERROR] Unable to find the trace output log file because the expected location was nil')
210
+ end
211
+
212
+ if(!File.exists?(log_file))
213
+ raise FlashPlayerError.new('[ERROR] Unable to find the trace output log file in the expected location: ' + log_file)
214
+ end
215
+
216
+ while(thread.alive?)
217
+ sleep(0.2)
218
+ lines_read = 0
219
+
220
+ File.open(log_file, 'r') do |file|
221
+ file.readlines.each do |line|
222
+ lines_read = lines_read + 1
223
+ if(lines_read > lines_put)
224
+ if(!parse_test_result(line, thread))
225
+ logger.puts "[trace] #{line}"
226
+ end
227
+ $stdout.flush
228
+ lines_put = lines_put + 1
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
234
+
235
+ # Returns true if inside of a test result
236
+ def parse_test_result(line, thread)
237
+ if(@inside_test_result)
238
+ if(line.index(@@test_result_post_delimiter))
239
+ @inside_test_result = false
240
+ write_test_result(test_result)
241
+ close
242
+ examine_test_result test_result
243
+ return true
244
+ else
245
+ test_result << line
246
+ end
247
+ end
248
+
249
+ if(line.index(@@test_result_pre_delimiter))
250
+ @inside_test_result = true
251
+ end
252
+
253
+ return @inside_test_result
254
+ end
255
+
256
+ def write_test_result(result)
257
+ FileUtils.makedirs(File.dirname(test_result_file))
258
+ File.open(test_result_file, File::CREAT|File::TRUNC|File::RDWR) do |f|
259
+ f.puts(result)
260
+ end
261
+ end
262
+
263
+ def examine_test_result(result)
264
+ require 'rexml/document'
265
+ doc = nil
266
+ begin
267
+ doc = REXML::Document.new(result)
268
+ rescue REXML::ParseException => e
269
+ puts "[WARNING] Invalid test results encountered"
270
+ return
271
+ end
272
+
273
+ # Handle JUnit Failures
274
+ failures = []
275
+
276
+ doc.elements.each('/testsuites/testsuite/testsuite/testcase/error') do |element|
277
+ failures << element.text
278
+ end
279
+
280
+ doc.elements.each("/testsuites/testsuite/testsuite/testcase/failure") do |element|
281
+ failures << element.text
282
+ end
283
+
284
+ if(failures.size > 0)
285
+ raise AssertionFailure.new("[ERROR] Test Failures Encountered \n#{failures.join("\n")}")
286
+ end
287
+ end
288
+
289
+ end
290
+
291
+ =end
292
+
293
+
@@ -0,0 +1,137 @@
1
+
2
+ module FlashPlayer
3
+
4
+ class Task < Rake::Task
5
+
6
+ attr_accessor :input
7
+ attr_accessor :pkg_name
8
+ attr_accessor :pkg_version
9
+
10
+ ##
11
+ # This is the Rake::Task constructor
12
+ # signature...
13
+ def initialize task_name, rake_application
14
+ super
15
+ @logger = $stdout
16
+ @mm_config = MMConfig.new
17
+ @reader = LogFile.new
18
+ @trust_config = Trust.new
19
+ @process = nil
20
+ @input = task_name
21
+
22
+ @pkg_name = FlashPlayer::NAME
23
+ @pkg_version = FlashSDK::VERSION
24
+ end
25
+
26
+ def execute *args
27
+ super
28
+ #puts ">> invoke with: #{args} and input: #{input}"
29
+ update_input_if_necessary
30
+ execute_safely do
31
+ update_mm_config
32
+ update_trust_config_with input
33
+ end
34
+ player_thread = launch_player_with input
35
+ tail_flashlog player_thread
36
+ end
37
+
38
+ def logger=(logger)
39
+ @logger = logger
40
+ @mm_config.logger = logger
41
+ @reader.logger = logger
42
+ @trust_config.logger = logger
43
+ end
44
+
45
+ def logger
46
+ @logger
47
+ end
48
+
49
+ private
50
+
51
+ def execute_safely
52
+ begin
53
+ yield if block_given?
54
+ rescue FlashPlayer::PathError => e
55
+ logger.puts ">> [WARNING] It seems this was the first time FlashPlayer was launched on this system and as a result, the expected folders were not found. Please close the Player and run again - this message should only ever be displayed once."
56
+ end
57
+ end
58
+
59
+ def update_input_if_necessary
60
+ return if input.match(/\.swf$/)
61
+ prerequisites.each do |prereq|
62
+ if(prereq.match(/\.swf$/))
63
+ self.input = prereq
64
+ return
65
+ end
66
+ end
67
+ end
68
+
69
+ def update_mm_config
70
+ @mm_config.create
71
+ end
72
+
73
+ def update_trust_config_with swf
74
+ @trust_config.add File.dirname(swf)
75
+ end
76
+
77
+ def clean_path path
78
+ current_system.clean_path path
79
+ end
80
+
81
+ def current_system
82
+ @current_system ||= Sprout.current_system
83
+ end
84
+
85
+ def launch_player_with swf
86
+ player = Sprout::Executable.load(:flashplayer, pkg_name, pkg_version).path
87
+ swf = clean_path swf
88
+ current_system.open_flashplayer_with player, swf
89
+ end
90
+
91
+ def tail_flashlog player_thread
92
+ @reader.tail player_thread
93
+ end
94
+ end
95
+ end
96
+
97
+ ##
98
+ # Update the native System instances
99
+ # to handle FlashPlayer launching in
100
+ # order to overcome non-cli limitations.
101
+ #
102
+ module Sprout
103
+ module System
104
+
105
+ class WinSystem
106
+ def open_flashplayer_with exe, swf
107
+ return Thread.new {
108
+ system command
109
+ }
110
+ end
111
+ end
112
+
113
+ class OSXSystem
114
+ def open_flashplayer_with exe, swf
115
+ require 'flashplayer/clix_flash_player'
116
+ @clix_player = CLIXFlashPlayer.new
117
+ @clix_player.execute(exe, swf)
118
+ return @clix_player
119
+ end
120
+ end
121
+
122
+ class UnixSystem
123
+ def open_flashplayer_with exe, swf
124
+ return Thread.new {
125
+ require 'open4'
126
+ @player_pid, stdin, stdout, stderr = Open4.popen4(command)
127
+ stdout.read
128
+ }
129
+ end
130
+ end
131
+ end
132
+ end
133
+
134
+ def flashplayer *args, &block
135
+ FlashPlayer::Task.define_task *args, &block
136
+ end
137
+
@@ -0,0 +1,45 @@
1
+
2
+ module FlashPlayer
3
+
4
+ class Trust
5
+
6
+ attr_accessor :logger
7
+
8
+ def initialize
9
+ @logger = $stdout
10
+ end
11
+
12
+ def add path
13
+ file = trust_file
14
+ create(file) unless File.exists?(file)
15
+ update_if_necessary file, path
16
+ end
17
+
18
+ private
19
+
20
+ def create file
21
+ dir = File.dirname file
22
+ FileUtils.makedirs(dir) unless File.exists?(dir)
23
+ FileUtils.touch file
24
+ end
25
+
26
+ def update_if_necessary file, path
27
+ path = File.expand_path path
28
+ if(!has_path?(file, path))
29
+ File.open(file, 'a') do |f|
30
+ f.puts path
31
+ end
32
+ logger.puts ">> Added #{path} to Flash Player Trust file at: #{file}"
33
+ end
34
+ end
35
+
36
+ def has_path? file, path
37
+ !File.read(file).index(path).nil?
38
+ end
39
+
40
+ def trust_file
41
+ FlashPlayer.trust
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,8 @@
1
+ require 'flashplayer/errors'
2
+ require 'flashplayer/module'
3
+ require 'flashplayer/mm_config'
4
+ require 'flashplayer/trust'
5
+ require 'flashplayer/log_file'
6
+ require 'flashplayer/task'
7
+ require 'flashplayer/specification'
8
+
@@ -0,0 +1,43 @@
1
+ module FlashSDK
2
+ class ClassGenerator < Sprout::Generator::Base
3
+ include FlashHelper
4
+
5
+ ##
6
+ # The path where source files should be created.
7
+ add_param :src, String, { :default => 'src' }
8
+
9
+ def manifest
10
+ directory class_directory do
11
+ template "#{class_name}.as", 'ActionScript3Class.as'
12
+ end
13
+
14
+ generator :test_class, :input => "#{fully_qualified_class_name}Test"
15
+ generator :suite_class
16
+ end
17
+
18
+ end
19
+
20
+ end
21
+
22
+ ##
23
+ # This is a null Generator, if you add a test library
24
+ # to your Gemfile, it should have it's own TestClassGenerator
25
+ # that supercedes this one.
26
+ module FlashSDK
27
+ class TestClassGenerator < Sprout::Generator::Base
28
+ def manifest
29
+ end
30
+ end
31
+ end
32
+
33
+ ##
34
+ # This is a null Generator, if you add a test library
35
+ # to your Gemfile, it should have it's own TestClassGenerator
36
+ # that supercedes this one.
37
+ module FlashSDK
38
+ class SuiteClassGenerator < Sprout::Generator::Base
39
+ def manifest
40
+ end
41
+ end
42
+ end
43
+
@@ -0,0 +1,48 @@
1
+
2
+ module FlashSDK
3
+
4
+ module FlashHelper
5
+
6
+ def class_directory
7
+ parts = input_in_parts
8
+ if parts.size > 1
9
+ parts.pop
10
+ return File.join src, *parts
11
+ end
12
+ return src
13
+ end
14
+
15
+ def package_name
16
+ parts = input_in_parts
17
+ if parts.size > 1
18
+ parts.pop
19
+ return "#{parts.join('.')} "
20
+ end
21
+ return ""
22
+ end
23
+
24
+ def class_name
25
+ parts = input_in_parts
26
+ parts.pop.camel_case
27
+ end
28
+
29
+ def input_in_parts
30
+ provided_input = input
31
+ if provided_input.include?('/')
32
+ provided_input.gsub! /^#{src}\//, ''
33
+ provided_input = provided_input.split('/').join('.')
34
+ end
35
+
36
+ provided_input.gsub!(/\.as$/, '')
37
+ provided_input.gsub!(/\.mxml$/, '')
38
+ provided_input.gsub!(/\.xml$/, '')
39
+
40
+ provided_input.split('.')
41
+ end
42
+
43
+ def fully_qualified_class_name
44
+ input
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,53 @@
1
+ module FlashSDK
2
+ class ProjectGenerator < ClassGenerator
3
+
4
+ ##
5
+ # The path where assets will be created.
6
+ add_param :assets, String, { :default => 'assets' }
7
+
8
+ ##
9
+ # The path where skins will be created.
10
+ add_param :skins, String, { :default => 'skins' }
11
+
12
+ ##
13
+ # The path where test cases should be created.
14
+ add_param :test, String, { :default => 'test' }
15
+
16
+ ##
17
+ # The path where libraries should be added.
18
+ add_param :lib, String, { :default => 'lib' }
19
+
20
+ ##
21
+ # The path where binaries should be created.
22
+ add_param :bin, String, { :default => 'bin' }
23
+
24
+ def manifest
25
+ directory input do
26
+ template 'rakefile.rb'
27
+ template 'Gemfile'
28
+
29
+ directory src do
30
+ template "#{input}.as", 'ActionScript3MainClass.as'
31
+ end
32
+
33
+ directory assets do
34
+ directory skins do
35
+ file 'DefaultProjectImage.png'
36
+ end
37
+ end
38
+
39
+ # Create empty directories:
40
+ directory lib
41
+ directory bin
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ def debug_swf_name
48
+ "#{class_name}-debug.swf"
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,9 @@
1
+ package <%= package_name %>{
2
+
3
+ public class <%= class_name %> {
4
+
5
+ public function <%= class_name %>() {
6
+ }
7
+ }
8
+ }
9
+
@@ -0,0 +1,11 @@
1
+ package <%= package_name %>{
2
+ import flash.display.Sprite;
3
+
4
+ public class <%= class_name %> extends Sprite {
5
+
6
+ public function <%= class_name %>() {
7
+ trace(">> <%= class_name %> Instantiated!");
8
+ }
9
+ }
10
+ }
11
+
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "flashsdk", ">= 1.0.0.pre"
4
+ gem "asunit4", ">= 4.2.pre"
5
+ gem "flashplayer", ">= 10.1.2.pre"
6
+
@@ -0,0 +1,17 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.require
4
+
5
+ library :asunit4
6
+
7
+ desc "Compile the debug swf"
8
+ mxmlc "<%= bin %>/<%= debug_swf_name %>" => :asunit4 do |t|
9
+ t.input = "<%= src %>/<%= class_name %>.as"
10
+ t.debug = true
11
+ end
12
+
13
+ desc "Compile and run the debug swf"
14
+ flashplayer :debug => "<%= bin %>/<%= debug_swf_name %>"
15
+
16
+ task :default => :debug
17
+
@@ -0,0 +1,9 @@
1
+
2
+ module FlashSDK
3
+ # Do this craptastic, otherwise we get a carriage return
4
+ # after our version, and that poops on our archive folder
5
+ # after downloading...
6
+ version_file = File.join(File.dirname(__FILE__), '..', '..', 'VERSION')
7
+ VERSION = File.read(version_file).gsub("\n", '')
8
+ end
9
+