sprout-as3-bundle 0.2.9 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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