sprout-as3-bundle 0.2.9 → 1.0.8

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.
@@ -1,9 +1,9 @@
1
1
  module Sprout # :nodoc:
2
2
  class AS3 # :nodoc:
3
3
  module VERSION #:nodoc:
4
- MAJOR = 0
5
- MINOR = 2
6
- TINY = 9
4
+ MAJOR = 1
5
+ MINOR = 0
6
+ TINY = 8
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY].join('.')
9
9
  MAJOR_MINOR = [MAJOR, MINOR].join('.')
@@ -16,3 +16,6 @@ require 'sprout/tasks/mxmlc_deploy'
16
16
  require 'sprout/tasks/mxmlc_document'
17
17
  require 'sprout/tasks/mxmlc_stylesheet'
18
18
  require 'sprout/tasks/mxmlc_swc'
19
+ require 'sprout/tasks/mxmlc_ci'
20
+
21
+ require 'sprout/tasks/fcsh'
@@ -0,0 +1,144 @@
1
+ =begin
2
+ Copyright (c) 2007 Pattern Park
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ =end
23
+
24
+ module Sprout
25
+
26
+ # This class should allow us to parse the stream output that FCSH provides.
27
+ # It was largely inspired by "LittleLexer" (http://rubyforge.org/projects/littlelexer/)
28
+ # which is a beautiful and concise general purpose lexer written by John Carter.
29
+ # Unfortunately, LittleLexer did not support streamed input, which
30
+ # we definitely need.
31
+ class FCSHLexer
32
+ PROMPT = ':prompt'
33
+ WARNING = ':warning'
34
+ ERROR = ':error'
35
+ PRELUDE = ':prelude'
36
+
37
+ PRELUDE_EXPRESSION = /(Adobe Flex Compiler.*\n.*\nCopyright.*\n)/m
38
+
39
+ def initialize(out=nil)
40
+ @out = out || $stdout
41
+ @regex_to_token = [
42
+ [/(.*Warning:.*\^.*)\n/m, WARNING], # Warning encountered
43
+ [/(.*Error:.*\^.*)\n/m, ERROR], # Error encountered
44
+ [PRELUDE_EXPRESSION, PRELUDE],
45
+ [/\n\(fcsh\)/, PROMPT] # Prompt for input
46
+ ]
47
+ end
48
+
49
+ def scan_process(process_runner)
50
+ tokens = [];
51
+ # Collect Errors and Warnings in a way that doesn't
52
+ # Block forever when we have none....
53
+ t = Thread.new {
54
+ scan_stream(process_runner.e) do |token|
55
+ yield token if block_given?
56
+ tokens << token
57
+ end
58
+ }
59
+
60
+ # Collect stdout from the process:
61
+ scan_stream(process_runner.r) do |token|
62
+ yield token if block_given?
63
+ tokens << token
64
+ end
65
+
66
+ process_runner.e.sync = true
67
+
68
+ # GROSS HACK!
69
+ # It seems we need to wait
70
+ # for the fsch $stderr buffer to flush?
71
+ # There must be a better way... Anyone?
72
+ # Should we move to Highline for interactive
73
+ # shell applications?
74
+ # http://rubyforge.org/projects/highline/
75
+ # In fact - this problem actually ruins
76
+ # the entire implementation, the larger/longer
77
+ # it takes for errors to be bufferred, the more
78
+ # likely it is we'll return without displaying them.
79
+ # The only way to overcome this with the current
80
+ # implementation, is to increase the timeout so that
81
+ # FCSH takes a long, long time on every compilation!!!
82
+ sleep(0.2)
83
+
84
+ t.kill
85
+ return tokens
86
+ end
87
+
88
+ # We need to scan the stream as FCSH writes to it. Since FCSH is a
89
+ # persistent CLI application, it never sends an EOF or even a consistent
90
+ # EOL. In order to tokenize the output, we need to attempt to check
91
+ # tokens with each character added.
92
+ # scan_stream will block and read characters from the reader provided until
93
+ # it encounters a PROMPT token, at that time, it will return an array
94
+ # of all tokens found.
95
+ # It will additionally yield each token as it's found if a block is provided.
96
+ def scan_stream(reader)
97
+ tokens = []
98
+ partial = ''
99
+ index = 0
100
+ while(true) do
101
+ code = reader.getc
102
+ return if code.nil?
103
+
104
+ partial << code.chr
105
+ token = next_token(partial)
106
+ if(token)
107
+ tokens << token
108
+ yield token if block_given?
109
+ partial = ''
110
+ break if(token[:name] == PROMPT || token[:name] == ERROR)
111
+ end
112
+ end
113
+
114
+ return tokens
115
+ end
116
+
117
+ private
118
+
119
+ # Retrieve the next token from the string, and
120
+ # return nil if no token is found
121
+ def next_token(string)
122
+ # puts "checking: #{string}"
123
+ @regex_to_token.each do |regex, token_name|
124
+ match = regex.match(string)
125
+ if match
126
+ return {:name => token_name, :match => match, :output => get_output(token_name, match)}
127
+ end
128
+ end
129
+ return nil
130
+ end
131
+
132
+ def get_output(name, match)
133
+ if(name == PROMPT)
134
+ return match.pre_match + "\n"
135
+ else
136
+ return match[0] + "\n"
137
+ end
138
+ end
139
+
140
+ def out
141
+ @out
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,111 @@
1
+ =begin
2
+ Copyright (c) 2007 Pattern Park
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ TODO: Investigate jruby support, especially:
24
+ http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=compilers_123_09.html
25
+ =end
26
+
27
+ require 'sprout/fcsh_lexer'
28
+ require 'digest/md5'
29
+
30
+ module Sprout
31
+ class FCSHError < StandardError #:nodoc:
32
+ end
33
+
34
+ class FCSHService
35
+
36
+ def initialize(out=nil)
37
+ @out = out || $stdout
38
+ @tasks = []
39
+ @lexer = FCSHLexer.new @out
40
+
41
+ # TODO: This should use configurable SDK destinations:
42
+ exe = Sprout.get_executable('sprout-flex3sdk-tool', 'bin/fcsh')
43
+ @process = User.execute_silent(exe)
44
+
45
+ response = ''
46
+ @lexer.scan_process(@process).each do |token|
47
+ response << token[:output]
48
+ end
49
+ out.puts response
50
+ end
51
+
52
+ # Temporarily pulled support for clear -
53
+ # since it's easier to just stop and start the server.
54
+ # The clear feature continues to increment task ids
55
+ # and requires deeper changes for full support...
56
+ # def clear
57
+ # @tasks.each_index do |index|
58
+ # write("clear #{index+1}")
59
+ # end
60
+ # @tasks = []
61
+ # return "[fcsh] All tasks have been cleared"
62
+ # end
63
+
64
+ def execute(request)
65
+ # if(request =~ /^clear/)
66
+ # return clear
67
+ # end
68
+ hashed = Digest::MD5.hexdigest(request)
69
+
70
+ # First, see if we've already received a task with this
71
+ # Exact command:
72
+ @tasks.each_index do |index|
73
+ task = @tasks[index]
74
+ if(task[:hash] == hashed)
75
+ out.puts "[fcsh] #{request})"
76
+ # Compile with an existing task at index+1
77
+ return write("compile #{index+1}")
78
+ end
79
+ end
80
+
81
+ # No existing task found with this hash, create a new
82
+ # task, store it for later, execute and return the result:
83
+ task = {:hash => hashed, :request => request, :executed => false}
84
+ @tasks << task
85
+ return write(task[:request])
86
+ end
87
+
88
+ def close
89
+ write("quit")
90
+ end
91
+
92
+ private
93
+
94
+ def write(message)
95
+ result = ''
96
+ out.puts "[fcsh] #{message}"
97
+ @process.puts "#{message}\n"
98
+ @lexer.scan_process(@process) do |token|
99
+ yield token if block_given?
100
+ result << token[:output]
101
+ end
102
+ out.puts "[fcsh] #{result.strip}\n"
103
+ return result
104
+ end
105
+
106
+ def out
107
+ @out
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,36 @@
1
+ require 'socket'
2
+ require 'sprout/fcsh_service'
3
+
4
+ module Sprout #:nodoc
5
+
6
+ class FCSHSocket
7
+
8
+ def self.server(port=12321, out=nil)
9
+ out = out || $stdout
10
+ server = TCPServer.new(port)
11
+ @fcsh = FCSHService.new(out)
12
+ out.puts ">> fcsh started, waiting for connections on port #{port}"
13
+ while(session = server.accept)
14
+ response = @fcsh.execute(session.gets)
15
+ session.puts(response)
16
+ session.flush
17
+ session.close
18
+ end
19
+ end
20
+
21
+ def self.execute(command, port=12321)
22
+ session = TCPSocket.new('localhost', port)
23
+ session.puts(command)
24
+ response = session.read
25
+
26
+ error = response =~ /(.*Error:.*\^.*)\n/m
27
+ if(error)
28
+ raise FCSHError.new(response)
29
+ end
30
+
31
+ session.close
32
+ return response
33
+ end
34
+
35
+ end
36
+ end
@@ -21,6 +21,7 @@ class ProjectGenerator < Sprout::Generator::NamedBase # :nodoc:
21
21
 
22
22
  m.template 'MainClass.as', File.join(base, 'src', "#{class_name}.as")
23
23
  m.template 'TestRunner.as', File.join(base, 'src', "#{class_name}Runner.as")
24
+ m.template 'XMLRunner.as', File.join(base, 'src', "#{class_name}XMLRunner.as")
24
25
  end
25
26
  end
26
27
 
@@ -1,11 +1,12 @@
1
1
  package {
2
2
  import flash.display.Sprite;
3
+ import flash.display.DisplayObject;
3
4
  import skins.<%= project_name %>Skin;
4
5
 
5
6
  public class <%= project_name %> extends Sprite {
6
7
 
7
8
  public function <%= project_name %>() {
8
- addChild(new <%= project_name %>Skin.ProjectSprouts());
9
+ addChild(new <%= project_name %>Skin.ProjectSprouts() as DisplayObject);
9
10
  trace("<%= project_name %> instantiated!");
10
11
  }
11
12
  }
@@ -0,0 +1,17 @@
1
+ package {
2
+ import asunit.textui.TestRunner;
3
+ import asunit.textui.XMLResultPrinter;
4
+
5
+ public class <%= project_name %>XMLRunner extends TestRunner {
6
+
7
+ public function <%= project_name %>XMLRunner() {
8
+ // start(clazz:Class, methodName:String, showTrace:Boolean)
9
+ // NOTE: sending a particular class and method name will
10
+ // execute setUp(), the method and NOT tearDown.
11
+ // This allows you to get visual confirmation while developing
12
+ // visual entities
13
+ setPrinter(new XMLResultPrinter());
14
+ start(AllTests, null, TestRunner.SHOW_TRACE);
15
+ }
16
+ }
17
+ }
@@ -11,6 +11,7 @@ project_model :model do |m|
11
11
  m.background_color = '#FFFFFF'
12
12
  m.width = 970
13
13
  m.height = 550
14
+ # m.use_fcsh = true
14
15
  # m.src_dir = 'src'
15
16
  # m.lib_dir = 'lib'
16
17
  # m.swc_dir = 'lib'
@@ -40,5 +41,8 @@ document :doc
40
41
  desc 'Compile a SWC file'
41
42
  swc :swc
42
43
 
44
+ desc 'Compile and run the test harness for CI'
45
+ ci :cruise
46
+
43
47
  # set up the default rake task
44
48
  task :default => :debug
@@ -6,7 +6,7 @@ package <%= package_name %> {
6
6
  private var <%= instance_name %>:<%= class_name %>;
7
7
 
8
8
  public function <%= test_case_name %>(methodName:String=null) {
9
- super(methodName)
9
+ super(methodName);
10
10
  }
11
11
 
12
12
  override protected function setUp():void {
@@ -27,4 +27,4 @@ package <%= package_name %> {
27
27
  assertTrue("Failing test", false);
28
28
  }
29
29
  }
30
- }
30
+ }
@@ -1,53 +1,87 @@
1
1
  module Sprout
2
- class ADLTask < ToolTask
3
- # Specifies the directory containing the runtime to use. If not
4
- # specified, the runtime directory in the same SDK as the ADL program
5
- # will be used. If you move ADL out of its SDK folder, then you must
6
- # specify the runtime directory. On Windows, specify the directory
7
- # containing the Adobe AIR directory. On Mac OSX, specify the directory
8
- # containing Adobe AIR.framework.
9
- def runtime=(file)
10
- @runtime = file
11
- end
12
-
13
- # Turns off debugging support. If used, the application process cannot
14
- # connect to the Flash debugger and dialogs for unhandled exceptions are
15
- # suppressed.
16
- #
17
- # Trace statements still print to the console window. Turning off
18
- # debugging allows your application to run a little faster and also
19
- # emulates the execution mode of an installed application more closely.
20
- def nodebug=(boolean)
21
- @nodebug = boolean
22
- end
23
-
24
- # Assigns the specified value as the publisher ID of the AIR application
25
- # for this run. Specifying a temporary publisher ID allows you to test
26
- # features of an AIR application, such as communicating over a local
27
- # connection, that use the publisher ID to help uniquely identify an
28
- # application.
29
- #
30
- # The final publisher ID is determined by the digital certificate used to
31
- # sign the AIR installation file.
32
- def pubid=(string)
33
- @pubid = string
34
- end
35
-
36
- # The application descriptor file.
37
- def application_descriptor=(file)
38
- @application_descriptor = file
2
+ class ADTTask < ToolTask
3
+ # Using -package option as default.
4
+ def package=(boolean)
5
+ @package = boolean
6
+ end
7
+
8
+ # The alias of a key in the keystore. Specifying an alias is not
9
+ # necessary when a keystore only contains a single certificate. If no
10
+ # alias is specified, ADT uses the first key in the keystore.
11
+ def alias=(string)
12
+ @alias = string
13
+ end
14
+
15
+ # The type of keystore, determined by the keystore implementation. The
16
+ # default keystore implementation included with most installations of
17
+ # Java supports the JKS and PKCS12 types. Java 5.0 includes support for
18
+ # the PKCS11 type, for accessing keystores on hardware tokens, and
19
+ # Keychain type, for accessing the Mac OS-X keychain. Java 6.0 includes
20
+ # support for the MSCAPI type (on Windows). If other JCA providers have
21
+ # been installed and configured, additional keystore types might be
22
+ # available. If no keystore type is specified, the default type for the
23
+ # default JCA provider is used.
24
+ def storetype=(string)
25
+ @storetype = string
26
+ end
27
+
28
+ # The JCA provider for the specified keystore type. If not specified,
29
+ # then ADT uses the default provider for that type of keystore.
30
+ def providerName=(string)
31
+ @providerName = string
32
+ end
33
+
34
+ # The path to the keystore file for file-based store types.
35
+ def keystore=(file)
36
+ @keystore = file
39
37
  end
40
38
 
41
- # The root directory of the application to run. If not
42
- # specified, the directory containing the application
43
- # descriptor file is used.
44
- def root_directory=(file)
45
- @root_directory = file
39
+ # The password required to access the keystore. If not specified, ADT
40
+ # prompts for the password.
41
+ def storepass=(string)
42
+ @storepass = string
43
+ end
44
+
45
+ # The password required to access the private key that will be used to
46
+ # sign the AIR application. If not specified, ADT prompts for the password.
47
+ def keypass=(string)
48
+ @keypass = string
49
+ end
50
+
51
+ # Specifies the URL of an RFC3161-compliant time stamp server to time
52
+ # stamp the digital signature. If no URL is specified, a default time
53
+ # stamp server provided by Geotrust is used. When the signature of an AIR
54
+ # application is time stamped, the application can still be installed
55
+ # after the signing certificate expires, because the time stamp verifies
56
+ # that the certificate was valid at the time of signing.
57
+ def tsa=(url)
58
+ @tsa = url
59
+ end
60
+
61
+ # The name of the AIR file to be created.
62
+ def output=(file)
63
+ @output = file
64
+ end
65
+
66
+ # The path to the application descriptor file. The path can be specified
67
+ # relative to the current directory or as an absolute path. (The
68
+ # application descriptor file is renamed as "application.xml" in the AIR
69
+ # file.)
70
+ def application_descriptor=(file)
71
+ @application_descriptor = file
46
72
  end
47
73
 
48
- # Passed to the application as command-line arguments.
49
- def arguments=(string)
50
- @arguments = string
74
+ # The files and directories to package in the AIR file. Any number of
75
+ # files and directories can be specified, delimited by whitespace. If you
76
+ # list a directory, all files and subdirectories within, except hidden
77
+ # files, are added to the package. (In addition, if the application
78
+ # descriptor file is specified, either directly, or through wildcard or
79
+ # directory expansion, it is ignored and not added to the package a
80
+ # second time.) Files and directories specified must be in the current
81
+ # directory or one of its subdirectories. Use the -C option to change the
82
+ # current directory.
83
+ def files=(files)
84
+ @files = files
51
85
  end
52
86
 
53
87
  end
@@ -1,87 +1,53 @@
1
1
  module Sprout
2
- class ADTTask < ToolTask
3
- # Using -package option as default.
4
- def package=(boolean)
5
- @package = boolean
6
- end
7
-
8
- # The alias of a key in the keystore. Specifying an alias is not
9
- # necessary when a keystore only contains a single certificate. If no
10
- # alias is specified, ADT uses the first key in the keystore.
11
- def alias=(string)
12
- @alias = string
13
- end
14
-
15
- # The type of keystore, determined by the keystore implementation. The
16
- # default keystore implementation included with most installations of
17
- # Java supports the JKS and PKCS12 types. Java 5.0 includes support for
18
- # the PKCS11 type, for accessing keystores on hardware tokens, and
19
- # Keychain type, for accessing the Mac OS-X keychain. Java 6.0 includes
20
- # support for the MSCAPI type (on Windows). If other JCA providers have
21
- # been installed and configured, additional keystore types might be
22
- # available. If no keystore type is specified, the default type for the
23
- # default JCA provider is used.
24
- def storetype=(string)
25
- @storetype = string
26
- end
27
-
28
- # The JCA provider for the specified keystore type. If not specified,
29
- # then ADT uses the default provider for that type of keystore.
30
- def providerName=(string)
31
- @providerName = string
32
- end
33
-
34
- # The path to the keystore file for file-based store types.
35
- def keystore=(file)
36
- @keystore = file
37
- end
38
-
39
- # The password required to access the keystore. If not specified, ADT
40
- # prompts for the password.
41
- def storepass=(string)
42
- @storepass = string
43
- end
44
-
45
- # The password required to access the private key that will be used to
46
- # sign the AIR application. If not specified, ADT prompts for the password.
47
- def keypass=(string)
48
- @keypass = string
49
- end
50
-
51
- # Specifies the URL of an RFC3161-compliant time stamp server to time
52
- # stamp the digital signature. If no URL is specified, a default time
53
- # stamp server provided by Geotrust is used. When the signature of an AIR
54
- # application is time stamped, the application can still be installed
55
- # after the signing certificate expires, because the time stamp verifies
56
- # that the certificate was valid at the time of signing.
57
- def tsa=(url)
58
- @tsa = url
59
- end
60
-
61
- # The name of the AIR file to be created.
62
- def output=(file)
63
- @output = file
64
- end
65
-
66
- # The path to the application descriptor file. The path can be specified
67
- # relative to the current directory or as an absolute path. (The
68
- # application descriptor file is renamed as "application.xml" in the AIR
69
- # file.)
2
+ class ADLTask < ToolTask
3
+ # Specifies the directory containing the runtime to use. If not
4
+ # specified, the runtime directory in the same SDK as the ADL program
5
+ # will be used. If you move ADL out of its SDK folder, then you must
6
+ # specify the runtime directory. On Windows, specify the directory
7
+ # containing the Adobe AIR directory. On Mac OSX, specify the directory
8
+ # containing Adobe AIR.framework.
9
+ def runtime=(file)
10
+ @runtime = file
11
+ end
12
+
13
+ # Turns off debugging support. If used, the application process cannot
14
+ # connect to the Flash debugger and dialogs for unhandled exceptions are
15
+ # suppressed.
16
+ #
17
+ # Trace statements still print to the console window. Turning off
18
+ # debugging allows your application to run a little faster and also
19
+ # emulates the execution mode of an installed application more closely.
20
+ def nodebug=(boolean)
21
+ @nodebug = boolean
22
+ end
23
+
24
+ # Assigns the specified value as the publisher ID of the AIR application
25
+ # for this run. Specifying a temporary publisher ID allows you to test
26
+ # features of an AIR application, such as communicating over a local
27
+ # connection, that use the publisher ID to help uniquely identify an
28
+ # application.
29
+ #
30
+ # The final publisher ID is determined by the digital certificate used to
31
+ # sign the AIR installation file.
32
+ def pubid=(string)
33
+ @pubid = string
34
+ end
35
+
36
+ # The application descriptor file.
70
37
  def application_descriptor=(file)
71
38
  @application_descriptor = file
72
39
  end
73
40
 
74
- # The files and directories to package in the AIR file. Any number of
75
- # files and directories can be specified, delimited by whitespace. If you
76
- # list a directory, all files and subdirectories within, except hidden
77
- # files, are added to the package. (In addition, if the application
78
- # descriptor file is specified, either directly, or through wildcard or
79
- # directory expansion, it is ignored and not added to the package a
80
- # second time.) Files and directories specified must be in the current
81
- # directory or one of its subdirectories. Use the -C option to change the
82
- # current directory.
83
- def files=(files)
84
- @files = files
41
+ # The root directory of the application to run. If not
42
+ # specified, the directory containing the application
43
+ # descriptor file is used.
44
+ def root_directory=(file)
45
+ @root_directory = file
46
+ end
47
+
48
+ # Passed to the application as command-line arguments.
49
+ def arguments=(string)
50
+ @arguments = string
85
51
  end
86
52
 
87
53
  end