ropenlaszlo 0.2.0 → 0.3.0

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/doc/CHANGES CHANGED
@@ -1,5 +1,14 @@
1
1
  = Change Log
2
2
 
3
+ == Version 0.3.0 (2006/01/16)
4
+ * compilation errors and warnings
5
+ * refactored test case setup
6
+ * fixed test case directory
7
+ * added rdoc task
8
+ * --output doesn't exist; --dir does
9
+ * Updated installation instructions
10
+ * Fixed rdoc formatting errors
11
+
3
12
  == Version 0.2.0 (2006/01/11)
4
13
  * Released as gem
5
14
  * Published to rubyforge
data/doc/README CHANGED
@@ -15,20 +15,23 @@ then the following Ruby code can be used to create a file 'hello.swf' which can
15
15
 
16
16
  == Requirements
17
17
 
18
- * {OpenLaszlo 3.1}[http://openlaszlo.org]
18
+ * {OpenLaszlo 3.1 or later}[http://openlaszlo.org]
19
19
  * Ruby -v 1.8.2 or later (untested in earlier versions)
20
+ * RubyGems[http://rubygems.rubyforge.org]
20
21
 
21
- == Downloading and Installation
22
+ == Installation
22
23
 
23
- ROpenLaszlo is distributed as a RubyGem. You may download it from ROpenLaszlo's {RubyForge project}[http://rubyforge.org/projects/ropenlaszlo].
24
+ 0:: Download and install {OpenLaszlo}[http://openlaszlo.org]
24
25
 
25
- Installation of ROpenLaszlo requires that you have RubyGems[http://rubygems.rubyforge.org] installed. In that case, you can download the ROpenLaszlo .gem to your local file system, and execute:
26
+ 1: Install this gem
27
+ > gem install ropenlaszlo
26
28
 
27
- gem install ropenlaszlo
29
+ 2:: Set your +OPENLASZLO_HOME+ environment variable to the directory that contains the {OpenLaszlo SDK}[http://openlaszlo.org]. If the following prints something, you've got it right:
30
+ > grep Laszlo "$OPENLASZLO_HOME/README.txt"
28
31
 
29
32
  == Documentation
30
33
 
31
- {This OpenLaszlo Blog entry}[http://weblog.openlaszlo.org/archives/2006/01/deploying-openlaszlo-applications-with-rake/] has additional information and some examples of using ROpenLaszlo in a Rakefile. Where that entry says to download +openlaszlo.rb+ and require +openlaszlo+, you should instead install this ropenlaszlo gem and require +ropenlaszlo+.)
34
+ {This OpenLaszlo Blog entry}[http://weblog.openlaszlo.org/archives/2006/01/deploying-openlaszlo-applications-with-rake/] has additional information and some examples of using ROpenLaszlo in a Rakefile.
32
35
 
33
36
  == License
34
37
 
data/doc/TODO CHANGED
@@ -2,17 +2,16 @@
2
2
 
3
3
  == Compiler
4
4
  * Dependency tracking
5
- * Detect when file is not present
6
- * Class for compiler configuration errors
5
+ * Compile server: allow use of proxy
6
+ * Compile server: temporarily copy files into webapp directory
7
+ * Command line: detect compilation warnings
7
8
 
8
9
  == Unit Tests
9
10
  * Compiler parameters
10
11
  * Missing source file
11
- * Syntax error
12
12
  * Unreachable server
13
13
  * Invalid OPENLASZLO_HOME
14
14
 
15
15
  == Packaging
16
16
  * Add rake task file
17
17
  * Add unit testing, doc generation to rakefile
18
-
data/lib/compiler.rb CHANGED
@@ -42,6 +42,8 @@
42
42
  # See OpenLaszlo.compile for additional documentation.
43
43
  #
44
44
  module OpenLaszlo
45
+ class CompilationError < StandardError; end
46
+
45
47
  # This class implements a bridge to the compile server.
46
48
  #
47
49
  # If you don't need multiple compilers, you can use the methods in
@@ -65,6 +67,35 @@ module OpenLaszlo
65
67
  # Additional options:
66
68
  # * <tt>:format</tt> - request type (default 'swf')
67
69
  def compile source_file, params={}
70
+ mtime = File.mtime source_file
71
+ output = params[:output] || "#{File.basename source_file, '.lzx'}.swf"
72
+ compile_object source_file, output, params
73
+ results = request_metadata_for source_file, params
74
+ raise "Race condition: #{source_file} was modified during compilation" if mtime != File.mtime(source_file)
75
+ results[:output] = output
76
+ raise CompilationError.new(results[:error]) if results[:error]
77
+ return results
78
+ end
79
+
80
+ private
81
+ def compile_object source_file, object, params={}
82
+ params = {}.update(params).update(:output => object)
83
+ request source_file, params
84
+ end
85
+
86
+ def request_metadata_for source_file, params={}
87
+ results = {}
88
+ params = {}.update(params).update(:format => 'canvas-xml', :output => nil)
89
+ text = request source_file, params
90
+ if text =~ %r{<warnings>(.*?)</warnings>}m
91
+ results[:warnings] = $1.scan(%r{<error>\s*(.*?)\s*</error>}m).map{|w|w.first}
92
+ elsif text !~ %r{<canvas>} && text =~ %r{<pre>Error:\s*(.*?)\s*</pre>}m
93
+ results[:error] = $1
94
+ end
95
+ return results
96
+ end
97
+
98
+ def request source_file, params={}
68
99
  require 'net/http'
69
100
  require 'uri'
70
101
  # assert that pathname is relative to LPS home:
@@ -74,7 +105,7 @@ module OpenLaszlo
74
105
  # FIXME: this doesn't handle quoting; use recursive File.split instead
75
106
  # FIXME: should encode the url, for filenames that include '/'
76
107
  server_relative_path.gsub(File::Separator, '/')
77
- output = params[:output] || "#{File.basename source_file, '.lzx'}.swf"
108
+ output = params[:output]
78
109
  options = {
79
110
  :lzr => params[:runtime],
80
111
  :debug => params[:debug],
@@ -86,16 +117,19 @@ module OpenLaszlo
86
117
  Net::HTTP.get_response URI.parse(url) do |response|
87
118
  case response
88
119
  when Net::HTTPOK
89
- File.open(output, 'w') do |f|
90
- response.read_body do |segment|
91
- f << segment
120
+ if output
121
+ File.open(output, 'w') do |f|
122
+ response.read_body do |segment|
123
+ f << segment
124
+ end
92
125
  end
126
+ else
127
+ return response.body
93
128
  end
94
129
  else
95
130
  response.value # raises error
96
131
  end
97
132
  end
98
- return output
99
133
  end
100
134
  end
101
135
 
@@ -142,8 +176,18 @@ module OpenLaszlo
142
176
  args << '--runtime=#{params[:runtime]}' if params[:runtime]
143
177
  args << '--debug' if params[:debug]
144
178
  args << '--profile' if params[:profile]
145
- args << "--output '#{File.basename output}'" unless File.dirname(source_file) == File.dirname(output)
146
- `#{@lzc} #{args.join(' ')} '#{source_file}'`
179
+ args << "--dir '#{File.dirname output}'" unless File.dirname(source_file) == File.dirname(output)
180
+ args << source_file
181
+ text = `#{@lzc} #{args.join(' ')}`
182
+ text.gsub!(/^\d+\s+/, '') # work around a bug in OpenLaszlo 3.1
183
+ results = {:output => output}
184
+ if text =~ /^Compilation errors occurred:\n/
185
+ raise CompilationError.new($'.strip)
186
+ else
187
+ # FIXME: doesn't work because lzc prints errors to stderr
188
+ results[:warnings] = text.split("\n")
189
+ end
190
+ return results
147
191
  end
148
192
 
149
193
  private
@@ -169,7 +213,7 @@ module OpenLaszlo
169
213
  return @compiler = CompileServer.new if ENV['OPENLASZLO_URL'] and ENV['OPENLASZLO_HOME']
170
214
  return @compiler = CommandLineCompiler.new if ENV['OPENLASZLO_HOME']
171
215
  raise <<EOF
172
- Couldn't find an OpenLaszlo compiler.
216
+ Couldn\'t find an OpenLaszlo compiler.
173
217
 
174
218
  To use the compile server (recommended), set ENV['OPENLASZLO_URL'] and ENV['OPENLASZLO_HOME'].
175
219
 
@@ -0,0 +1,2 @@
1
+ <!-- This doesn't have a close tag, so it will fail compilation. -->
2
+ <canvas
@@ -0,0 +1 @@
1
+ <canvas unknown-attribute="value"/>
@@ -37,19 +37,26 @@ class << ENV
37
37
  end
38
38
  end
39
39
 
40
+ # FIXME: should be able to put the test methods in here too
40
41
  module CompilerTestHelper
41
42
  def super_setup
42
43
  OpenLaszlo::compiler = nil
43
- cd File.dirname(__FILE__)
44
+ #cd File.expand_path(File.dirname(__FILE__))
44
45
  end
45
46
 
46
47
  private
48
+ def testfile_pathname file
49
+ File.expand_path file, File.dirname(__FILE__)
50
+ end
51
+
47
52
  def compile file, output=nil, options={}
53
+ file = testfile_pathname file
48
54
  output = File.basename(file, '.lzx')+'.swf'
49
55
  rm_f output
50
56
  begin
51
- OpenLaszlo::compile file, *options
57
+ result = OpenLaszlo::compile file, *options
52
58
  assert File.exists?(output), "#{output} does not exist"
59
+ return result
53
60
  ensure
54
61
  rm_f output
55
62
  end
@@ -70,13 +77,30 @@ class CompileServerTest < Test::Unit::TestCase
70
77
  end
71
78
 
72
79
  def test_compilation
73
- compile 'test.lzx'
80
+ result = compile 'test.lzx'
81
+ assert_equal 'test.swf', result[:output]
82
+ end
83
+
84
+ def test_compilation_error
85
+ #assert_raise(OpenLaszlo::CompilationError) {compile 'compilation-error.lzx'}
86
+ ex = (compile 'compilation-error.lzx' rescue $!)
87
+ assert_instance_of OpenLaszlo::CompilationError, ex
88
+ assert_match /^compilation-error.lzx:3:1: XML document structures must start and end within the same entity./, ex.message
89
+ end
90
+
91
+ def test_compilation_warning
92
+ result = compile 'compilation-warning.lzx'
93
+ assert_equal 'compilation-warning.swf', result[:output]
94
+ assert_instance_of Array, result[:warnings]
95
+ assert_equal 2, result[:warnings].length
96
+ assert_match /^compilation-warning.lzx:1:36/, result[:warnings].first
74
97
  end
75
98
 
76
99
  private
77
100
  alias :saved_compile :compile
78
101
 
79
102
  def compile file, output=nil, options={}
103
+ file = testfile_pathname file
80
104
  server_local_file = File.join @test_dir, File.basename(file)
81
105
  cp file, server_local_file
82
106
  begin
@@ -91,18 +115,32 @@ class CommandLineCompilerTest < Test::Unit::TestCase
91
115
  include CompilerTestHelper
92
116
 
93
117
  def setup
94
- bindings = {'OPENLASZLO_URL' => nil}
95
- @saved_bindings = Hash[*bindings.keys.map{|k|[k,ENV[k]]}.flatten]
96
- ENV.update bindings
97
118
  super_setup
119
+ callcc do |exit|
120
+ resume = nil
121
+ ENV.with_bindings 'OPENLASZLO_URL' => nil do
122
+ resume = callcc do |continue|
123
+ @teardown = continue
124
+ exit.call
125
+ end
126
+ end
127
+ resume.call
128
+ end
98
129
  end
99
130
 
100
131
  def teardown
101
- ENV.update @saved_bindings
132
+ callcc do |continue| @teardown.call(continue) end
102
133
  end
103
134
 
104
135
  def test_compilation
105
- compile 'test.lzx'
136
+ result = compile 'test.lzx'
137
+ assert_equal 'test.swf', result[:output]
138
+ end
139
+
140
+ def test_compilation_error
141
+ ex = (compile 'compilation-error.lzx' rescue $!)
142
+ assert_instance_of OpenLaszlo::CompilationError, ex
143
+ assert_match /^compilation-error.lzx:3:1: XML document structures must start and end within the same entity./, ex.message
106
144
  end
107
145
  end
108
146
 
data/test/utils.rb ADDED
@@ -0,0 +1,22 @@
1
+ class << ENV
2
+ # Execute a block, restoring the bindings for +keys+ at the end.
3
+ # NOT thread-safe!
4
+ def with_saved_bindings keys, &block
5
+ saved_bindings = Hash[*keys.map {|k| [k, ENV[k]]}.flatten]
6
+ begin
7
+ block.call
8
+ ensure
9
+ ENV.update saved_bindings
10
+ end
11
+ end
12
+
13
+ # Execute a block with the temporary bindings in +bindings+.
14
+ # Doesn't remove keys; simply sets them to nil.
15
+ def with_bindings bindings, &block
16
+ with_saved_bindings bindings.keys do
17
+ ENV.update bindings
18
+ return block.call
19
+ end
20
+ end
21
+ end
22
+
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: ropenlaszlo
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.0
7
- date: 2006-01-11 00:00:00 -05:00
6
+ version: 0.3.0
7
+ date: 2006-01-16 00:00:00 -05:00
8
8
  summary: Ruby interface to OpenLaszlo.
9
9
  require_paths:
10
10
  - lib
@@ -34,13 +34,16 @@ files:
34
34
  - doc/MIT-LICENSE
35
35
  - doc/README
36
36
  - doc/TODO
37
+ - test/compilation-error.lzx
38
+ - test/compilation-warning.lzx
37
39
  - test/compiler_test.rb
38
40
  - test/test.lzx
41
+ - test/utils.rb
39
42
  test_files: []
40
43
 
41
44
  rdoc_options:
42
45
  - --title
43
- - ROpenLaszlo -- Ruby interface to OpenLaszlo
46
+ - "ROpenLaszlo: Ruby interface to OpenLaszlo."
44
47
  - --main
45
48
  - doc/README
46
49
  extra_rdoc_files: