ruby-processing 1.0.10.1 → 1.0.11
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/CHANGELOG +5 -0
- data/lib/core/jruby-complete.jar +0 -0
- data/lib/ruby-processing.rb +1 -1
- data/lib/ruby-processing/app.rb +35 -32
- data/lib/ruby-processing/exporters/applet_exporter.rb +4 -4
- data/lib/ruby-processing/exporters/base_exporter.rb +16 -18
- data/lib/ruby-processing/helper_methods.rb +21 -2
- data/lib/ruby-processing/library_loader.rb +26 -14
- data/lib/ruby-processing/runners/base.rb +3 -4
- data/lib/templates/applet/index.html.erb +2 -2
- metadata +9 -10
data/CHANGELOG
CHANGED
data/lib/core/jruby-complete.jar
CHANGED
Binary file
|
data/lib/ruby-processing.rb
CHANGED
@@ -14,7 +14,7 @@ require 'ruby-processing/helpers/numeric'
|
|
14
14
|
|
15
15
|
# The top-level namespace, a home for all Ruby-Processing classes.
|
16
16
|
module Processing
|
17
|
-
VERSION = "1.0.
|
17
|
+
VERSION = "1.0.11" unless defined? Processing::VERSION
|
18
18
|
|
19
19
|
# Are we online -- inside an applet?
|
20
20
|
def self.online?
|
data/lib/ruby-processing/app.rb
CHANGED
@@ -126,12 +126,14 @@ module Processing
|
|
126
126
|
set_sketch_path unless Processing.online?
|
127
127
|
mix_proxy_into_inner_classes
|
128
128
|
@started = false
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
129
|
+
|
130
|
+
unless Processing.online?
|
131
|
+
java.lang.Thread.default_uncaught_exception_handler = proc do |thread, exception|
|
132
|
+
puts(exception.class.to_s)
|
133
|
+
puts(exception.message)
|
134
|
+
puts(exception.backtrace.collect { |trace| "\t" + trace })
|
135
|
+
close
|
136
|
+
end
|
135
137
|
end
|
136
138
|
|
137
139
|
# for the list of all available args, see
|
@@ -147,13 +149,24 @@ module Processing
|
|
147
149
|
|
148
150
|
@render_mode ||= JAVA2D
|
149
151
|
|
150
|
-
|
151
|
-
|
152
|
-
|
152
|
+
if Processing.online?
|
153
|
+
JRUBY_APPLET.background_color = nil
|
154
|
+
JRUBY_APPLET.double_buffered = false
|
155
|
+
JRUBY_APPLET.add self
|
156
|
+
JRUBY_APPLET.validate
|
157
|
+
# Add the callbacks to peacefully expire.
|
158
|
+
JRUBY_APPLET.on_stop { self.stop }
|
159
|
+
JRUBY_APPLET.on_destroy { self.destroy }
|
160
|
+
init
|
161
|
+
else
|
162
|
+
x = options[:x] || 0
|
163
|
+
y = options[:y] || 0
|
164
|
+
args << "--location=#{x},#{y}"
|
153
165
|
|
154
|
-
|
155
|
-
|
156
|
-
|
166
|
+
title = options[:title] || File.basename(SKETCH_PATH).sub(/(\.rb|\.pde)$/, '').titleize
|
167
|
+
args << title
|
168
|
+
PApplet.run_sketch(args, self)
|
169
|
+
end
|
157
170
|
end
|
158
171
|
|
159
172
|
def started?
|
@@ -235,15 +248,6 @@ module Processing
|
|
235
248
|
end
|
236
249
|
end
|
237
250
|
|
238
|
-
def display_in_an_applet
|
239
|
-
JRUBY_APPLET.background_color = nil
|
240
|
-
JRUBY_APPLET.double_buffered = false
|
241
|
-
JRUBY_APPLET.add self
|
242
|
-
JRUBY_APPLET.validate
|
243
|
-
# Add the callbacks to peacefully expire.
|
244
|
-
JRUBY_APPLET.on_stop { self.stop }
|
245
|
-
JRUBY_APPLET.on_destroy { self.destroy }
|
246
|
-
end
|
247
251
|
end # Processing::App
|
248
252
|
|
249
253
|
|
@@ -255,18 +259,18 @@ module Processing
|
|
255
259
|
|
256
260
|
# Generate the list of method names that we'd like to proxy for inner classes.
|
257
261
|
# Nothing camelCased, nothing __internal__, just the Processing API.
|
258
|
-
def self.desired_method_names
|
262
|
+
def self.desired_method_names(inner_class)
|
259
263
|
bad_method = /__/ # Internal JRuby methods.
|
260
264
|
unwanted = PApplet.superclass.instance_methods + Object.instance_methods
|
261
265
|
unwanted -= ['width', 'height', 'cursor', 'create_image', 'background', 'size', 'resize']
|
262
266
|
methods = Processing::App.public_instance_methods
|
263
|
-
methods.reject {|m| unwanted.include?(m) || bad_method.match(m) }
|
267
|
+
methods.reject {|m| unwanted.include?(m) || bad_method.match(m) || inner_class.method_defined?(m) }
|
264
268
|
end
|
265
269
|
|
266
270
|
|
267
271
|
# Proxy methods through to the sketch.
|
268
|
-
def self.proxy_methods
|
269
|
-
code = desired_method_names.inject('') do |code, method|
|
272
|
+
def self.proxy_methods(inner_class)
|
273
|
+
code = desired_method_names(inner_class).inject('') do |code, method|
|
270
274
|
code << <<-EOS
|
271
275
|
def #{method}(*args, &block) # def rect(*args, &block)
|
272
276
|
if block_given? # if block_given?
|
@@ -277,24 +281,23 @@ module Processing
|
|
277
281
|
end # end
|
278
282
|
EOS
|
279
283
|
end
|
280
|
-
|
284
|
+
inner_class.class_eval(code)
|
281
285
|
end
|
282
286
|
|
283
287
|
|
284
288
|
# Proxy the sketch's constants on to the inner classes.
|
285
|
-
def self.proxy_constants
|
289
|
+
def self.proxy_constants(inner_class)
|
286
290
|
Processing::App.constants.each do |name|
|
287
|
-
|
291
|
+
next if inner_class.const_defined?(name)
|
292
|
+
inner_class.const_set(name, Processing::App.const_get(name))
|
288
293
|
end
|
289
294
|
end
|
290
295
|
|
291
296
|
|
292
297
|
# Don't do all of the work unless we have an inner class that needs it.
|
293
298
|
def self.included(inner_class)
|
294
|
-
|
295
|
-
|
296
|
-
proxy_constants
|
297
|
-
@already_defined = true
|
299
|
+
proxy_methods(inner_class)
|
300
|
+
proxy_constants(inner_class)
|
298
301
|
end
|
299
302
|
|
300
303
|
end # Processing::Proxy
|
@@ -7,8 +7,8 @@ module Processing
|
|
7
7
|
USAGE = <<-EOS
|
8
8
|
|
9
9
|
The applet generator will generate a web-ready applet for you.
|
10
|
-
Usage:
|
11
|
-
Example:
|
10
|
+
Usage: rp5 applet <path_to_sketch>
|
11
|
+
Example: rp5 applet samples/jwishy.rb
|
12
12
|
|
13
13
|
EOS
|
14
14
|
|
@@ -33,7 +33,7 @@ module Processing
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def compute_destination_name
|
36
|
-
@dest = "#{@main_file.sub(".rb", "")}"
|
36
|
+
@dest = "#{@main_file.sub(".rb", "")}_applet"
|
37
37
|
end
|
38
38
|
|
39
39
|
def copy_over_necessary_files
|
@@ -75,4 +75,4 @@ module Processing
|
|
75
75
|
end
|
76
76
|
|
77
77
|
end
|
78
|
-
end
|
78
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'erb'
|
3
|
+
require 'ruby-processing/library_loader'
|
3
4
|
|
4
5
|
module Processing
|
5
6
|
|
@@ -53,6 +54,7 @@ module Processing
|
|
53
54
|
size_match = source.match(/^[^#]*size\(?\s*(\d+)\s*,\s*(\d+)\s*\)?/)
|
54
55
|
return match[1] if match
|
55
56
|
return (dimension == 'width' ? size_match[1] : size_match[2]) if size_match
|
57
|
+
warn "using default dimensions for export, please use constants integer values in size() call instead of computed ones"
|
56
58
|
DEFAULT_DIMENSIONS[dimension]
|
57
59
|
end
|
58
60
|
|
@@ -64,22 +66,14 @@ module Processing
|
|
64
66
|
|
65
67
|
# Searches the source for any libraries that have been loaded.
|
66
68
|
def extract_libraries(source)
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
break unless matchdata
|
72
|
-
candidates = matchdata[2].gsub(/[:"'\s]/, '').split(/,/)
|
73
|
-
candidates.each do |cand|
|
74
|
-
@opengl = true if cand.match(/opengl/i)
|
75
|
-
local_path = "#{local_dir}/library/#{cand}"
|
76
|
-
rp5_path = "#{RP5_ROOT}/library/#{cand}"
|
77
|
-
libs << rp5_path if File.exists?(rp5_path)
|
78
|
-
libs << local_path if File.exists?(local_path)
|
69
|
+
lines = source.split("\n")
|
70
|
+
libs = lines.grep(/^[^#]*load_(?:java_|ruby_)?librar(?:y|ies)\s+(.+)/) do
|
71
|
+
$1.split(/\s*,\s*/).collect do |raw_library_name|
|
72
|
+
raw_library_name.tr("\"':\r\n", '')
|
79
73
|
end
|
80
|
-
|
81
|
-
|
82
|
-
libs
|
74
|
+
end.flatten
|
75
|
+
lib_loader = LibraryLoader.new
|
76
|
+
libs.map { |lib| lib_loader.get_library_paths(lib) }.flatten.compact
|
83
77
|
end
|
84
78
|
|
85
79
|
# Looks for all of the codes require or load commands, checks
|
@@ -95,10 +89,14 @@ module Processing
|
|
95
89
|
line = matchdata[0].gsub('__FILE__', "'#{@main_file_path}'")
|
96
90
|
line = line.gsub(/\b(require|load)\b/, 'partial_paths << ')
|
97
91
|
eval(line)
|
98
|
-
|
92
|
+
where = "{#{local_dir}/,}{#{partial_paths.join(',')}}"
|
93
|
+
unless line =~ /\.[^.]+$/
|
94
|
+
where += ".{rb,jar}"
|
95
|
+
end
|
96
|
+
requirements += Dir[where]
|
99
97
|
code = matchdata.post_match
|
100
98
|
end
|
101
|
-
|
99
|
+
requirements
|
102
100
|
end
|
103
101
|
|
104
102
|
|
@@ -136,4 +134,4 @@ module Processing
|
|
136
134
|
end
|
137
135
|
|
138
136
|
end
|
139
|
-
end
|
137
|
+
end
|
@@ -31,12 +31,31 @@ module Processing
|
|
31
31
|
def color(*args)
|
32
32
|
a = args[0]
|
33
33
|
# convert to signed int
|
34
|
-
if args.length == 1
|
35
|
-
|
34
|
+
if args.length == 1
|
35
|
+
if a.is_a?(Fixnum) && a >= 2**31
|
36
|
+
args = [ a - 2**32 ]
|
37
|
+
elsif a.is_a?(String) && a[0] == ?#
|
38
|
+
h = a[1..-1]
|
39
|
+
# add opaque alpha channel
|
40
|
+
if h.size <= 6
|
41
|
+
h = "ff" + "0"*(6-h.size) + h
|
42
|
+
end
|
43
|
+
return color(h.hex)
|
44
|
+
end
|
36
45
|
end
|
37
46
|
super(*args)
|
38
47
|
end
|
39
48
|
|
49
|
+
def loop(&block)
|
50
|
+
if block_given?
|
51
|
+
while true do
|
52
|
+
yield
|
53
|
+
end
|
54
|
+
else
|
55
|
+
super
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
40
59
|
# There's just so many functions in Processing,
|
41
60
|
# Here's a convenient way to look for them.
|
42
61
|
def find_method(method_name)
|
@@ -38,9 +38,9 @@ module Processing
|
|
38
38
|
return false
|
39
39
|
end
|
40
40
|
else
|
41
|
-
path =
|
41
|
+
path = get_library_paths(library_name, "rb").first
|
42
42
|
return false unless path
|
43
|
-
return @loaded_libraries[library_name] = (require
|
43
|
+
return @loaded_libraries[library_name] = (require path)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -57,8 +57,8 @@ module Processing
|
|
57
57
|
if Processing.online?
|
58
58
|
return @loaded_libraries[library_name] = !!(JRUBY_APPLET.get_parameter("archive").match(%r(#{library_name})))
|
59
59
|
end
|
60
|
-
path =
|
61
|
-
jars =
|
60
|
+
path = get_library_directory_path(library_name, "jar")
|
61
|
+
jars = get_library_paths(library_name, "jar")
|
62
62
|
return false if jars.empty?
|
63
63
|
jars.each {|jar| require jar }
|
64
64
|
|
@@ -96,8 +96,30 @@ module Processing
|
|
96
96
|
[ platform, platform+bits ].collect { |p| File.join(basename, p) }
|
97
97
|
end
|
98
98
|
|
99
|
+
def get_library_paths(library_name, extension = nil)
|
100
|
+
dir = get_library_directory_path(library_name, extension)
|
101
|
+
Dir.glob("#{dir}/*.{rb,jar}")
|
102
|
+
end
|
103
|
+
|
99
104
|
protected
|
100
105
|
|
106
|
+
def get_library_directory_path(library_name, extension = nil)
|
107
|
+
extensions = extension ? [extension] : %w{jar rb}
|
108
|
+
extensions.each do |ext|
|
109
|
+
[ "#{SKETCH_ROOT}/library/#{library_name}",
|
110
|
+
"#{RP5_ROOT}/library/#{library_name}/library",
|
111
|
+
"#{RP5_ROOT}/library/#{library_name}",
|
112
|
+
"#{@sketchbook_library_path}/#{library_name}/library",
|
113
|
+
"#{@sketchbook_library_path}/#{library_name}"
|
114
|
+
].each do |path|
|
115
|
+
if File.exists?(path) && !Dir.glob(path + "/*.#{ext}").empty?
|
116
|
+
return path
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
101
123
|
def find_sketchbook_path
|
102
124
|
preferences_paths = []
|
103
125
|
sketchbook_paths = []
|
@@ -126,15 +148,5 @@ module Processing
|
|
126
148
|
end
|
127
149
|
end
|
128
150
|
|
129
|
-
def get_library_path(library_name, extension)
|
130
|
-
[ "#{SKETCH_ROOT}/library/#{library_name}",
|
131
|
-
"#{RP5_ROOT}/library/#{library_name}/library",
|
132
|
-
"#{RP5_ROOT}/library/#{library_name}",
|
133
|
-
"#{@sketchbook_library_path}/#{library_name}/library",
|
134
|
-
"#{@sketchbook_library_path}/#{library_name}"
|
135
|
-
].detect do |path|
|
136
|
-
File.exists?("#{path}/#{library_name}.#{extension}")
|
137
|
-
end
|
138
|
-
end
|
139
151
|
end
|
140
152
|
end
|
@@ -5,7 +5,6 @@ SKETCH_ROOT = File.dirname(SKETCH_PATH) unless defined? SKETCH_ROOT
|
|
5
5
|
require 'ruby-processing'
|
6
6
|
require 'ruby-processing/app'
|
7
7
|
|
8
|
-
|
9
8
|
module Processing
|
10
9
|
|
11
10
|
# For use with "bare" sketches that don't want to define a class or methods
|
@@ -46,9 +45,9 @@ module Processing
|
|
46
45
|
if Processing.online?
|
47
46
|
# Fuck the following lines. Fucking Java can go sit on broken glass.
|
48
47
|
source = ''
|
49
|
-
url = java.net.URL.new(JRUBY_APPLET.
|
50
|
-
input = java.io.BufferedReader.new(java.io.InputStreamReader.new(url.
|
51
|
-
while line = input.
|
48
|
+
url = java.net.URL.new(JRUBY_APPLET.java_send(:getCodeBase), SKETCH_PATH)
|
49
|
+
input = java.io.BufferedReader.new(java.io.InputStreamReader.new(url.java_send(:openStream)))
|
50
|
+
while line = input.java_send(:readLine) do
|
52
51
|
source << (line + "\n") if line
|
53
52
|
end
|
54
53
|
input.close
|
@@ -97,7 +97,7 @@
|
|
97
97
|
<a href="http://wiki.github.com/jashkenas/ruby-processing">
|
98
98
|
<img src="images/built_with.jpg" alt="Ruby-Processing" />
|
99
99
|
</a>
|
100
|
-
Via <a href="http://jruby.
|
100
|
+
Via <a href="http://jruby.org/">JRuby</a> and <a href="http://processing.org/">Processing</a><br />
|
101
101
|
Source: <a href="<%= @main_file %>"><%= @main_file %></a>
|
102
102
|
</div>
|
103
103
|
|
@@ -110,4 +110,4 @@
|
|
110
110
|
|
111
111
|
</div>
|
112
112
|
</body>
|
113
|
-
</html>
|
113
|
+
</html>
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-processing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 1
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
|
11
|
-
version: 1.0.10.1
|
9
|
+
- 11
|
10
|
+
version: 1.0.11
|
12
11
|
platform: ruby
|
13
12
|
authors:
|
14
13
|
- Jeremy Ashkenas
|
@@ -62,21 +61,21 @@ extra_rdoc_files:
|
|
62
61
|
- LICENSE
|
63
62
|
files:
|
64
63
|
- bin/rp5
|
65
|
-
- lib/ruby-processing/exporters/applet_exporter.rb
|
66
64
|
- lib/ruby-processing/exporters/application_exporter.rb
|
67
|
-
- lib/ruby-processing/exporters/base_exporter.rb
|
68
65
|
- lib/ruby-processing/exporters/creator.rb
|
66
|
+
- lib/ruby-processing/exporters/applet_exporter.rb
|
67
|
+
- lib/ruby-processing/exporters/base_exporter.rb
|
69
68
|
- lib/ruby-processing/helpers/numeric.rb
|
70
69
|
- lib/ruby-processing/helpers/string.rb
|
71
|
-
- lib/ruby-processing/runners/base.rb
|
72
70
|
- lib/ruby-processing/runners/live.rb
|
73
71
|
- lib/ruby-processing/runners/run.rb
|
74
72
|
- lib/ruby-processing/runners/watch.rb
|
73
|
+
- lib/ruby-processing/runners/base.rb
|
75
74
|
- lib/ruby-processing/helper_methods.rb
|
76
|
-
- lib/ruby-processing/app.rb
|
77
75
|
- lib/ruby-processing/config.rb
|
78
|
-
- lib/ruby-processing/library_loader.rb
|
79
76
|
- lib/ruby-processing/runner.rb
|
77
|
+
- lib/ruby-processing/app.rb
|
78
|
+
- lib/ruby-processing/library_loader.rb
|
80
79
|
- lib/templates/applet/images/built_with.jpg
|
81
80
|
- lib/templates/applet/images/top.png
|
82
81
|
- lib/templates/applet/images/ruby.jpg
|
@@ -93,9 +92,9 @@ files:
|
|
93
92
|
- lib/templates/application/run.exe
|
94
93
|
- lib/templates/create/bare_sketch.rb.erb
|
95
94
|
- lib/templates/create/blank_sketch.rb.erb
|
96
|
-
- lib/ruby-processing.rb
|
97
95
|
- lib/core/jruby-complete.jar
|
98
96
|
- lib/core/core.jar
|
97
|
+
- lib/ruby-processing.rb
|
99
98
|
- library/boids/boids.rb
|
100
99
|
- library/control_panel/control_panel.rb
|
101
100
|
- library/dxf/library/dxf.jar
|