propane 2.4.0.pre-java → 2.5.0-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8d391a15e09ca2b691a60bcecc25bba260b042b1
4
- data.tar.gz: ff9d833f87f800233987500f346c0543c8e7c1d8
3
+ metadata.gz: 9533ddd2e6f1573ce40817c97356676069e9e2a4
4
+ data.tar.gz: 7b2b891d044c4f98c85b5b1f286a60d1b77f5281
5
5
  SHA512:
6
- metadata.gz: 64c1e084f36d389e446b1462a486d235960a25b27b8c73680f97ce496e657a5f83ec767ed84728143b5ac739b72ec2bb0fc534a1669f0b1f0a42564be2368580
7
- data.tar.gz: dd553b625a79b380f17627fb123e311b4476323731bcf001b2a88dbbb68b7143bc36591f372877fef4f0628b3d09a48e133564461fd485dd3e392653cfd121f6
6
+ metadata.gz: 7e9fec391db8b365247028e0a298329342e39fa716027a031402768cecb33c5e764fcd0fae5d96ed31dafa578bdbfa9d762cf1c6cb8549baeae01a345a7db623
7
+ data.tar.gz: 0d251e46ec1a06f2bed2357a2ae178c6af0a67efe0cd5f869aea38287e9bc7232585018dd553a4041b971ee82e3e76b8299598c509a936d726bf04e61fda03d3
data/.travis.yml CHANGED
@@ -1,10 +1,10 @@
1
1
  language: ruby
2
2
  sudo: false
3
+ dist: trusty
3
4
 
4
- rvm:
5
- - jruby-9.1.6.0
5
+ rvm:
6
+ - jruby-9.1.12.0
6
7
  jdk:
7
8
  - oraclejdk8
8
9
  os:
9
10
  - linux
10
-
data/CHANGELOG.md CHANGED
@@ -1,4 +1,14 @@
1
- **v2.4.0.pre** Completely re-factored library_loader please test.
1
+ **v2.5.0** No need for `$app` we can replace with `Propane.app`
2
+
3
+ **v2.4.1** Add post_initialize hoop to app.rb.
4
+
5
+ **v2.4.0** Extend LibraryProxy to include mouseEvent and keyEvent.
6
+
7
+ **v2.3.4** Simplify control_panel library (replacing `c.title = 'PaneTitle'` with `c.title('PaneTitle')`) also enable use of `block` with `button's`.
8
+
9
+ **v2.3.3** Update to processing-3.3.4, and upgrade jruby-9.1.12.0 last in 9.1 series?
10
+
11
+ **v2.3.3** Update to processing-3.3.2
2
12
 
3
13
  **v2.3.1** Update to processing-3.3.1, Update samples which now include `#!/usr/bin/env jruby` to assist running sketches from atom, add Rakefile for automatic sketch running for many samples, expected upgrade to final jruby-9.1.x.x
4
14
 
data/Gemfile CHANGED
@@ -1,2 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gemspec
data/README.md CHANGED
@@ -1,14 +1,21 @@
1
1
  # Propane
2
- [![Gem Version](https://badge.fury.io/rb/propane.svg)](https://badge.fury.io/rb/propane)
2
+ [![Gem Version](https://badge.fury.io/rb/propane.svg)](https://badge.fury.io/rb/propane) [![Travis CI](https://travis-ci.org/ruby-processing/propane.svg)](https://travis-ci.org/ruby-processing/propane)
3
3
 
4
- A slim layer to communicate with Processing from JRuby, features a polyglot maven build. We have created a configuration free version of ruby processing, for processing-3.3.1, where we include processing core (from a local maven repository and opengl etc from maven central). These jars are small enough to include in a gem distribution, and hence we do not require configuration. This has created a scriptable version, ie files get run direct from jruby, but you could use jruby-complete if you used the propane script (avoids need to give the absolute data path for the data folder, but would also be needed for a watch mode). See guide to [building ruby-processing projects][building].
4
+ A slim layer to communicate with Processing from JRuby, features a polyglot maven build. We have created a configuration free version of ruby processing, for processing-3.3.5, where we include processing core (from a local maven repository and opengl etc from maven central). These jars are small enough to include in a gem distribution, and hence we do not require configuration. This has created a scriptable version, ie files get run direct from jruby, but you could use jruby-complete if you used the propane script (avoids need to give the absolute data path for the data folder, but would also be needed for a watch mode). See guide to [building ruby-processing projects][building].
5
+
6
+ NB: The main reason for build failing is when the `core.jar` is not available from maven central, to install a local jar (_example for linux mint_):-
7
+ ```bash
8
+
9
+ mvn install:install-file /home/tux/processing-3.3.5/core/library/core.jar -DgroupId=org.processing -DartifactId=core -Dversion=3.3.5
10
+ ```
11
+ adjust above for your OS/distro setup.
5
12
 
6
13
  ## Requirements
7
14
 
8
15
  - jdk8+
9
- - jruby-9.1.8.0+
10
- - mvn-3.3.1+ (development only)
11
- - core.jar processing-3.3.1 (development only until processing.org is available at maven central)
16
+ - jruby-9.1.12.0
17
+ - mvn-3.5.0+
18
+ - core.jar processing-3.3.5 (_build only_)
12
19
 
13
20
  ## Building and testing
14
21
 
@@ -21,7 +28,7 @@ rake javadoc
21
28
  ## Installation
22
29
  ```bash
23
30
  jgem install propane # from rubygems
24
- jgem install propane-2.3.1-java.gem # for local install
31
+ jgem install propane-2.5.0-java.gem # for local install
25
32
  ```
26
33
 
27
34
  ## Usage
@@ -70,4 +77,7 @@ propane --install video
70
77
  ```
71
78
  Other java libraries can be manually installed to the same folder (no need for processing ide)
72
79
 
80
+ See [gh-pages][gh-pages] for more detailed instructions and much more.
81
+
73
82
  [building]:http://ruby-processing.github.io/building/building/
83
+ [gh-pages]:https://ruby-processing.github.io/propane/
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ def create_manifest
7
7
  File.open('MANIFEST.MF', 'w') do |f|
8
8
  f.puts(title)
9
9
  f.puts(version)
10
- f.puts('Class-Path: core-3.3.1.jar gluegen-rt-2.3.2.jar jog-all-2.3.2.jar')
10
+ f.puts('Class-Path: core-3.3.5.jar gluegen-rt-2.3.2.jar jog-all-2.3.2.jar')
11
11
  end
12
12
  end
13
13
 
@@ -47,7 +47,7 @@ end
47
47
  desc 'Test'
48
48
  task :test do
49
49
  sh 'jruby test/helper_methods_test.rb'
50
- sh 'jruby test/respond_to_test.rb'
50
+ # sh 'jruby test/respond_to_test.rb' Skip test on Travis to avoid Headless fail
51
51
  sh 'jruby test/create_test.rb'
52
52
  sh 'jruby test/math_tool_test.rb'
53
53
  sh 'jruby test/deglut_spec_test.rb'
data/lib/propane.rb CHANGED
@@ -1,8 +1,8 @@
1
- # frozen_string_literal: true
1
+ # frozen_string_literal: false
2
2
  require 'java'
3
3
  unless defined? PROPANE_ROOT
4
4
  $LOAD_PATH << File.expand_path(File.dirname(__FILE__))
5
- PROPANE_ROOT = File.absolute_path(File.dirname(__dir__))
5
+ PROPANE_ROOT = File.expand_path(File.dirname(__FILE__) + '/../')
6
6
  end
7
7
  Dir["#{PROPANE_ROOT}/lib/*.jar"].each do |jar|
8
8
  require jar
data/lib/propane/app.rb CHANGED
@@ -43,6 +43,10 @@ module Propane
43
43
  key_typed: :keyTyped
44
44
  }.freeze
45
45
 
46
+ class << self
47
+ attr_accessor :app
48
+ end
49
+
46
50
  # All sketches extend this class
47
51
  class App < PApplet
48
52
  include Math, MathTool, HelperMethods, Render
@@ -110,7 +114,8 @@ module Propane
110
114
  raise TypeError unless arguments.is_a? Array
111
115
  # Set up the sketch.
112
116
  super()
113
- $app = self
117
+ post_initialize(options)
118
+ Propane.app = self
114
119
  @arguments = arguments
115
120
  @options = options
116
121
  run_sketch
@@ -125,6 +130,9 @@ module Propane
125
130
  super(*args)
126
131
  end
127
132
 
133
+ def post_initialize(_args)
134
+ end
135
+
128
136
  def sketch_title(title)
129
137
  surface.set_title(title)
130
138
  end
@@ -139,15 +147,15 @@ module Propane
139
147
 
140
148
  def import_opengl
141
149
  # Include processing opengl classes that we'd like to use:
142
- %w(FontTexture FrameBuffer LinePath LineStroker PGL
150
+ %w[FontTexture FrameBuffer LinePath LineStroker PGL
143
151
  PGraphics2D PGraphics3D PGraphicsOpenGL PShader
144
- PShapeOpenGL Texture).each do |klass|
152
+ PShapeOpenGL Texture].each do |klass|
145
153
  java_import "processing.opengl.#{klass}"
146
154
  end
147
155
  end
148
156
 
149
157
  def proxy_java_fields
150
- fields = %w(sketchPath key frameRate mousePressed keyPressed)
158
+ fields = %w[sketchPath key frameRate mousePressed keyPressed]
151
159
  methods = fields.map { |field| java_class.declared_field(field) }
152
160
  @declared_fields = Hash[fields.zip(methods)]
153
161
  end
@@ -160,22 +168,20 @@ module Propane
160
168
  end
161
169
  end
162
170
 
163
- # Importing PConstants to access processing constants, we also need to
164
- # 'include PConstants' to avoid requiring the `PConstants::` prefix
165
- # `include Math etc because we expect to use them`
166
- # Using :method_missing to mimic inner class methods
167
- # @HACK you should consider using 'forwardable' to avoid this
168
- # egregious hack...
171
+ # @HACK purists may prefer 'forwardable' to the use of Proxy
172
+ # Importing PConstants here to access the processing constants
169
173
  module Proxy
170
- java_import 'processing.core.PConstants'
171
- include Math, MathTool, HelperMethods, PConstants
172
- def respond_to_missing?(name, include_private = false)
173
- $app.respond_to?(name) || super
174
+ include Math
175
+ include HelperMethods
176
+ include Java::ProcessingCore::PConstants
177
+
178
+ def respond_to_missing?(symbol, include_priv = false)
179
+ Propane.app.respond_to?(symbol, include_priv) || super
174
180
  end
175
181
 
176
- def method_missing(name, *args)
177
- return $app.send(name, *args) if $app && $app.respond_to?(name)
182
+ def method_missing(name, *args, &block)
183
+ return Propane.app.send(name, *args) if Propane.app.respond_to? name
178
184
  super
179
185
  end
180
- end
181
- end
186
+ end # Processing::Proxy
187
+ end # Propane
@@ -1,4 +1,5 @@
1
- #frozen_string_literal: false
1
+ # frozen_string_literal: false
2
+
2
3
  # the sketch class
3
4
  class SketchClass
4
5
  attr_reader :name, :width, :height, :mode
@@ -24,7 +25,7 @@ class SketchClass
24
25
  end
25
26
 
26
27
  def size
27
- return format(' size %d, %d', width.to_i, height.to_i) if mode.nil?
28
+ return format(' size %d, %d', width.to_i, height.to_i) unless mode
28
29
  format(' size %d, %d, %s', width.to_i, height.to_i, mode.upcase)
29
30
  end
30
31
 
@@ -33,8 +34,8 @@ class SketchClass
33
34
  format(" sketch_title '%s'", human)
34
35
  end
35
36
 
36
- def method_lines(name, content = '')
37
- return [format(' def %s', name), content, ' end'] if content.empty?
37
+ def method_lines(name, content = nil)
38
+ return [format(' def %s', name), '', ' end'] unless content
38
39
  [format(' def %s', name), content, ' end', '']
39
40
  end
40
41
 
@@ -50,6 +51,7 @@ class SketchClass
50
51
  lines.concat method_lines('setup', sketch_title)
51
52
  lines.concat method_lines('draw')
52
53
  lines << 'end'
54
+ lines << ''
53
55
  lines << sketch_new
54
56
  end
55
57
  end
@@ -1,13 +1,8 @@
1
1
  # frozen_string_literal: false
2
2
  # The processing wrapper module
3
3
  module Propane
4
- require_relative 'ruby_library'
5
- require_relative 'java_library'
6
-
7
4
  # Encapsulate library loader functionality as a class
8
5
  class LibraryLoader
9
- attr_reader :library
10
-
11
6
  def initialize
12
7
  @loaded_libraries = Hash.new(false)
13
8
  end
@@ -18,43 +13,103 @@ module Propane
18
13
  end
19
14
 
20
15
  # Load a list of Ruby or Java libraries (in that order)
21
- # Usage: load_libraries :video, :video_event
16
+ # Usage: load_libraries :opengl, :boids
22
17
  #
23
18
  # If a library is put into a 'library' folder next to the sketch it will
24
19
  # be used instead of the library that ships with Propane.
25
20
  def load_libraries(*args)
26
21
  message = 'no such file to load -- %s'
27
22
  args.each do |lib|
28
- loaded = loader(lib)
29
- raise(LoadError.new, format(message, lib)) unless loaded
23
+ loaded = load_ruby_library(lib) || load_java_library(lib)
24
+ fail(LoadError.new, format(message, lib)) unless loaded
30
25
  end
31
26
  end
32
- alias load_library load_libraries
27
+ alias_method :load_library, :load_libraries
28
+
29
+ # For pure ruby libraries.
30
+ # The library should have an initialization ruby file
31
+ # of the same name as the library folder.
32
+ def load_ruby_library(library_name)
33
+ library_name = library_name.to_sym
34
+ return true if @loaded_libraries.include?(library_name)
35
+ path = get_library_paths(library_name, 'rb').first
36
+ return false unless path
37
+ @loaded_libraries[library_name] = (require path)
38
+ end
33
39
 
34
- def loader(name)
35
- return true if @loaded_libraries.include?(name)
36
- fname = name.to_s
37
- if (@library = LocalRubyLibrary.new(fname)).exist?
38
- return require_library(library)
40
+ # HACK: For pure java libraries, such as the ones that are available
41
+ # on this page: http://processing.org/reference/libraries/index.html
42
+ # that include native code, we mess with the 'Java ClassLoader', so that
43
+ # you don't have to futz with your PATH. But it's probably bad juju.
44
+ def load_java_library(library_name)
45
+ library_name = library_name.to_sym
46
+ return true if @loaded_libraries.include?(library_name)
47
+ jpath = get_library_directory_path(library_name, 'jar')
48
+ jars = get_library_paths(library_name, 'jar')
49
+ return false if jars.empty?
50
+ jars.each { |jar| require jar }
51
+ platform_specific_library_paths = get_platform_specific_library_paths(jpath)
52
+ platform_specific_library_paths = platform_specific_library_paths.select do |ppath|
53
+ FileTest.directory?(ppath) && !Dir.glob(File.join(ppath, '*.{so,dll,jnilib}')).empty?
39
54
  end
40
- if (@library = InstalledRubyLibrary.new(fname)).exist?
41
- return require_library(library)
55
+ unless platform_specific_library_paths.empty?
56
+ platform_specific_library_paths << java.lang.System.getProperty('java.library.path')
57
+ new_library_path = platform_specific_library_paths.join(java.io.File.pathSeparator)
58
+ java.lang.System.setProperty('java.library.path', new_library_path)
59
+ field = java.lang.Class.for_name('java.lang.ClassLoader').get_declared_field('sys_paths')
60
+ if field
61
+ field.accessible = true
62
+ field.set(java.lang.Class.for_name('java.lang.System').get_class_loader, nil)
63
+ end
42
64
  end
43
- if (@library = LocalJavaLibrary.new(fname)).exist?
44
- library.load_jars
45
- library.add_binaries_to_classpath if library.native_binaries?
46
- return @loaded_libraries[name] = true
65
+ @loaded_libraries[library_name] = true
66
+ end
67
+
68
+ def platform
69
+ match = %w(mac linux windows).find do |os|
70
+ java.lang.System.getProperty('os.name').downcase.index(os)
47
71
  end
48
- if (@library = InstalledJavaLibrary.new(fname)).exist?
49
- library.load_jars
50
- library.add_binaries_to_classpath if library.native_binaries?
51
- return @loaded_libraries[name] = true
72
+ return 'other' unless match
73
+ return match unless match =~ /mac/
74
+ 'macosx'
75
+ end
76
+
77
+ def get_platform_specific_library_paths(basename)
78
+ # for MacOSX, but does this even work, or does Mac return '64'?
79
+ bits = 'universal'
80
+ if java.lang.System.getProperty('sun.arch.data.model') == '32' ||
81
+ java.lang.System.getProperty('java.vm.name').index('32')
82
+ bits = '32'
83
+ elsif java.lang.System.getProperty('sun.arch.data.model') == '64' ||
84
+ java.lang.System.getProperty('java.vm.name').index('64')
85
+ bits = '64' unless platform =~ /macosx/
52
86
  end
53
- false
87
+ [platform, platform + bits].map { |p| File.join(basename, p) }
88
+ end
89
+
90
+ def get_library_paths(library_name, extension = nil)
91
+ dir = get_library_directory_path(library_name, extension)
92
+ Dir.glob("#{dir}/*.{rb,jar}")
54
93
  end
55
94
 
56
- def require_library(lib)
57
- @loaded_libraries[lib.name.to_sym] = require lib.path
95
+ protected
96
+
97
+ def get_library_directory_path(library_name, extension = nil)
98
+ extensions = extension ? [extension] : %w(jar rb)
99
+ extensions.each do |ext|
100
+ [
101
+ "#{SKETCH_ROOT}/library/#{library_name}",
102
+ "#{PROPANE_ROOT}/library/#{library_name}",
103
+ "#{PROPANE_ROOT}/library/#{library_name}/library",
104
+ "#{PROPANE_ROOT}/library/#{library_name}",
105
+ "#{ENV['HOME']}/.propane/libraries/#{library_name}/library"
106
+ ].each do |jpath|
107
+ if File.exist?(jpath) && !Dir.glob(format('%s/*.%s', jpath, ext)).empty?
108
+ return jpath
109
+ end
110
+ end
111
+ end
112
+ nil
58
113
  end
59
114
  end
60
115
  end
@@ -50,6 +50,11 @@ module Propane
50
50
  options[:create] = true
51
51
  end
52
52
 
53
+ options[:example] = false
54
+ opts.on('-e', '--example', 'Create new sketch outline') do
55
+ options[:example] = true
56
+ end
57
+
53
58
  # This displays the help screen, all programs are
54
59
  # assumed to have this option.
55
60
  opts.on('-h', '--help', 'Display this screen') do
@@ -63,6 +68,11 @@ module Propane
63
68
 
64
69
  def create
65
70
  require_relative 'creators/sketch_writer'
71
+ SketchFactory.new(argc).write
72
+ end
73
+
74
+ def examples
75
+ require_relative 'creators/sketch_factory'
66
76
  SketchWriter.new(File.basename(filename, '.rb'), argc).write
67
77
  end
68
78
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Propane
3
- VERSION = '2.4.0.pre'.freeze
3
+ VERSION = '2.5.0'.freeze
4
4
  end
@@ -21,7 +21,7 @@ module ControlPanel
21
21
  label = control_panel.add_element(self, name)
22
22
  add_change_listener do
23
23
  update_label(label, name, value)
24
- $app.instance_variable_set("@#{name}", value) unless value.nil?
24
+ Propane.app.instance_variable_set("@#{name}", value) unless value.nil?
25
25
  proc.call(value) if proc
26
26
  end
27
27
  set_value(initial_value ? initial_value * 100 : min)
@@ -46,7 +46,7 @@ module ControlPanel
46
46
  set_preferred_size(java.awt.Dimension.new(190, 30))
47
47
  control_panel.add_element(self, name)
48
48
  add_action_listener do
49
- $app.instance_variable_set("@#{name}", value) unless value.nil?
49
+ Propane.app.instance_variable_set("@#{name}", value) unless value.nil?
50
50
  proc.call(value) if proc
51
51
  end
52
52
  set_selected_index(initial_value ? elements.index(initial_value) : 0)
@@ -66,11 +66,11 @@ module ControlPanel
66
66
  set_horizontal_alignment javax.swing.SwingConstants::CENTER
67
67
  control_panel.add_element(self, name, false)
68
68
  add_action_listener do
69
- $app.instance_variable_set("@#{name}", value) unless value.nil?
69
+ Propane.app.instance_variable_set("@#{name}", value)
70
70
  proc.call(value) if proc
71
71
  end
72
72
  end
73
-
73
+ # define value as checkbox state
74
74
  def value
75
75
  is_selected
76
76
  end
@@ -83,7 +83,7 @@ module ControlPanel
83
83
  set_preferred_size(java.awt.Dimension.new(170, 64))
84
84
  control_panel.add_element(self, name, false, true)
85
85
  add_action_listener do
86
- $app.send(name.to_s)
86
+ Propane.app.send(name)
87
87
  proc.call(value) if proc
88
88
  end
89
89
  end
@@ -107,7 +107,7 @@ module ControlPanel
107
107
  set_size 200, 30 + (64 * elements.size)
108
108
  set_default_close_operation javax.swing.JFrame::HIDE_ON_CLOSE
109
109
  set_resizable false
110
- set_location($app.width + 10, 0) unless $app.width + 10 > $app.displayWidth
110
+ set_location(Propane.app.width + 10, 0) unless Propane.app.width + 10 > Propane.app.displayWidth
111
111
  panel.visible = true
112
112
  end
113
113
 
@@ -126,6 +126,10 @@ module ControlPanel
126
126
  dispose
127
127
  end
128
128
 
129
+ def title(name)
130
+ set_title(name)
131
+ end
132
+
129
133
  def slider(name, range = 0..100, initial_value = nil, &block)
130
134
  Slider.new(self, name, range, initial_value, block || nil)
131
135
  end
@@ -134,7 +138,7 @@ module ControlPanel
134
138
  Menu.new(self, name, elements, initial_value, block || nil)
135
139
  end
136
140
 
137
- def checkbox(name, initial_value = nil, &block)
141
+ def checkbox(name, initial_value = false, &block)
138
142
  checkbox = Checkbox.new(self, name, block || nil)
139
143
  checkbox.do_click if initial_value == true
140
144
  end
@@ -151,10 +155,10 @@ module ControlPanel
151
155
 
152
156
  def set_feel(lf = 'metal')
153
157
  lafinfo = javax.swing.UIManager.getInstalledLookAndFeels
154
- laf = lafinfo.select do |info|
155
- info.getName.eql? lf.capitalize
158
+ laf = lafinfo.to_ary.select do |info|
159
+ info.name =~ Regexp.new(Regexp.escape(lf), Regexp::IGNORECASE)
156
160
  end
157
- javax.swing.UIManager.setLookAndFeel(laf[0].getClassName)
161
+ javax.swing.UIManager.setLookAndFeel(laf[0].class_name)
158
162
  end
159
163
  end
160
164
 
@@ -169,4 +173,4 @@ module ControlPanel
169
173
  end
170
174
  end
171
175
 
172
- Propane::App.send :include, ControlPanel::InstanceMethods
176
+ Propane::App.include(ControlPanel::InstanceMethods)
@@ -1,8 +1,8 @@
1
1
  ### Using the LibraryProxy in your sketches
2
2
  LibraryProxy is a [abstract java class](https://github.com/ruby-processing/JRubyArt/blob/master/src/monkstone/core/LibraryProxy.java) so that you can acccess vanilla processing library reflection methods in your sketches using ruby.
3
3
 
4
- In the sketch you should `load_library :library_proxy` and your library class should inherit
5
- from LibraryProxy and implement pre(), draw() and post() methods (can be empty method if not
4
+ In the sketch you should `load_library :library_proxy` and your library class should inherit
5
+ from LibraryProxy and implement the draw() method (can be empty method if not
6
6
  required). For simplicity initialize your `processing library` in the sketch `setup`.
7
7
 
8
8
  ### Example library
@@ -1,12 +1,14 @@
1
1
  java_import Java::MonkstoneCore::LibraryProxy
2
+ java_import Java::ProcessingEvent::KeyEvent
3
+ java_import Java::ProcessingEvent::MouseEvent
2
4
 
3
-
4
- # classes that inherit from Library are expected to implement
5
- # the abstract methods of monkstone.core.LibraryProxy
6
- # def pre...
7
- # def draw...
8
- # def post...
9
- # def keyPressed...
10
- # def mousePressed...
11
- # NOOP is fine...
5
+ # classes that inherit from LibraryProxy are expected to implement
6
+ # the abstract draw method of monkstone.core.LibraryProxy the other methods are
7
+ # registered with PApplet instance in constructor ImplementingClass.new(app)
8
+ #
9
+ # def pre... NOOP can be overridden
10
+ # def draw... Abstract Method should be implemented NOOP is OK
11
+ # def post... NOOP can be overridden
12
+ # def keyEvent(e)... NOOP can be overridden
13
+ # def mouseEvent(e)... NOOP can be overridden
12
14
  # `app` can be called to get PApplet instance
data/pom.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'fileutils'
2
2
  project 'rp5extras', 'https://github.com/monkstone/propane' do
3
3
  model_version '4.0.0'
4
- id 'propane:propane', '2.4.0.pre'
4
+ id 'propane:propane', '2.5.0'
5
5
  packaging 'jar'
6
6
  description 'rp5extras for propane'
7
7
  organization 'ruby-processing', 'https://ruby-processing.github.io'
@@ -32,8 +32,8 @@ project 'rp5extras', 'https://github.com/monkstone/propane' do
32
32
  'jogl.version' => '2.3.2'
33
33
  )
34
34
 
35
- pom 'org.jruby:jruby:9.1.8.0'
36
- jar 'org.processing:core:3.3.2'
35
+ pom 'org.jruby:jruby:9.1.12.0'
36
+ jar 'org.processing:core:3.3.5'
37
37
  jar 'org.processing:video:3.0.2'
38
38
  jar('org.jogamp.jogl:jogl-all:${jogl.version}')
39
39
  jar('org.jogamp.gluegen:gluegen-rt-main:${jogl.version}')
@@ -44,7 +44,7 @@ project 'rp5extras', 'https://github.com/monkstone/propane' do
44
44
  execute_goals( id: 'default-cli',
45
45
  artifactItems: [ { groupId: 'org.processing',
46
46
  artifactId: 'core',
47
- version: '3.3.2',
47
+ version: '3.3.5',
48
48
  type: 'jar',
49
49
  outputDirectory: '${propane.basedir}/lib'
50
50
  },
data/pom.xml CHANGED
@@ -11,7 +11,7 @@ DO NOT MODIFIY - GENERATED CODE
11
11
  <modelVersion>4.0.0</modelVersion>
12
12
  <groupId>propane</groupId>
13
13
  <artifactId>propane</artifactId>
14
- <version>2.4.0.pre</version>
14
+ <version>2.5.0</version>
15
15
  <name>rp5extras</name>
16
16
  <description>rp5extras for propane</description>
17
17
  <url>https://github.com/monkstone/propane</url>
@@ -58,13 +58,13 @@ DO NOT MODIFIY - GENERATED CODE
58
58
  <dependency>
59
59
  <groupId>org.jruby</groupId>
60
60
  <artifactId>jruby</artifactId>
61
- <version>9.1.8.0</version>
61
+ <version>9.1.12.0</version>
62
62
  <type>pom</type>
63
63
  </dependency>
64
64
  <dependency>
65
65
  <groupId>org.processing</groupId>
66
66
  <artifactId>core</artifactId>
67
- <version>3.3.2</version>
67
+ <version>3.3.5</version>
68
68
  </dependency>
69
69
  <dependency>
70
70
  <groupId>org.processing</groupId>
@@ -103,7 +103,7 @@ DO NOT MODIFIY - GENERATED CODE
103
103
  <artifactItem>
104
104
  <groupId>org.processing</groupId>
105
105
  <artifactId>core</artifactId>
106
- <version>3.3.2</version>
106
+ <version>3.3.5</version>
107
107
  <type>jar</type>
108
108
  <outputDirectory>${propane.basedir}/lib</outputDirectory>
109
109
  </artifactItem>
data/propane.gemspec CHANGED
@@ -10,11 +10,11 @@ Gem::Specification.new do |gem|
10
10
  gem.email = ['mamba2928@yahoo.co.uk']
11
11
  gem.licenses = %w(GPL-3.0 LGPL-2.0)
12
12
  gem.description = %q{A batteries included version of processing in ruby, MacOS and linux64}
13
- gem.summary = %q{ruby wrapper for processing-3.3.1 on MacOS and linux64 bit only for opengl}
13
+ gem.summary = %q{ruby wrapper for processing-3.3.5 on MacOS and linux64 bit only for opengl}
14
14
  gem.homepage = 'https://ruby-processing.github.io/propane/'
15
15
  gem.files = `git ls-files`.split($/)
16
16
  gem.files << 'lib/propane.jar'
17
- gem.files << 'lib/core-3.3.2.jar'
17
+ gem.files << 'lib/core-3.3.5.jar'
18
18
  gem.files << 'lib/gluegen-rt-2.3.2.jar'
19
19
  gem.files << 'lib/jogl-all-2.3.2.jar'
20
20
  gem.files << 'lib/gluegen-rt-2.3.2-natives-linux-amd64.jar'
@@ -23,7 +23,9 @@ Gem::Specification.new do |gem|
23
23
  gem.files << 'lib/jogl-all-2.3.2-natives-macosx-universal.jar'
24
24
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
25
25
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
26
- gem.add_runtime_dependency 'arcball', '~> 1.0', '>= 1.0.0'
26
+ gem.add_development_dependency 'rake', '~> 12'
27
+ gem.add_development_dependency 'minitest', '~> 5.10'
28
+ gem.add_runtime_dependency 'arcball', '~> 1.0', '>= 1.0.0'
27
29
  gem.require_paths = ['lib']
28
30
  gem.platform = 'java'
29
31
  end
@@ -2,106 +2,124 @@ package monkstone.core;
2
2
 
3
3
  import processing.core.PApplet;
4
4
  import static processing.core.PConstants.*;
5
+ import processing.event.MouseEvent;
6
+ import processing.event.KeyEvent;
5
7
 
6
8
  /**
7
- * The purpose of this class is to enable
8
- * access to processing pre, draw and post loops in
9
- * ruby-processing as a regular java library class.
10
- * Also included background, fill and stroke methods.
11
- * PConstants should also be available from static import
12
- * @author Martin Prout
13
- */
9
+ * The purpose of this class is to enable
10
+ * access to processing pre, draw and post loops in
11
+ * ruby-processing as a regular java library class.
12
+ * Also included background, fill and stroke methods.
13
+ * PConstants should also be available from static import
14
+ * @author Martin Prout
15
+ */
14
16
  public abstract class LibraryProxy {
15
17
 
16
- private final PApplet app;
17
-
18
- /**
19
- * Useful accessors
20
- */
21
- public int width, height;
22
-
23
- /**
24
- *
25
- * @param app PApplet
26
- */
27
- public LibraryProxy(PApplet app) {
28
- this.app = app;
29
- this.width = app.width;
30
- this.height = app.height;
31
- setActive(true);
32
- }
18
+ private final PApplet app;
33
19
 
34
- /**
35
- * Extending classes must implement this gives access to, by reflection,
36
- * processing PApplet pre loop (called before draw)
37
- */
38
- public abstract void pre();
39
-
40
- /**
41
- * Extending classes must implement this gives access to processing PApplet
42
- * draw loop
43
- */
44
- public abstract void draw();
45
-
46
- /**
47
- * Extending classes must implement this gives access to, by reflection,
48
- * processing PApplet post loop (called after draw)
49
- */
50
- public abstract void post();
51
-
52
- /**
53
- * Register or unregister reflection methods
54
- * @param active
55
- */
56
- final void setActive(boolean active) {
57
- if (active) {
58
- this.app.registerMethod("pre", this);
59
- this.app.registerMethod("draw", this);
60
- this.app.registerMethod("post", this);
61
- this.app.registerMethod("dispose", this);
62
- } else {
63
- this.app.unregisterMethod("pre", this);
64
- this.app.unregisterMethod("draw", this);
65
- this.app.unregisterMethod("post", this);
66
- }
67
- }
20
+ /**
21
+ * Useful accessors
22
+ */
23
+ public int width, height;
68
24
 
69
- /**
70
- * Simple signature for background hides need to call app
71
- * @param col int
72
- */
73
- public void background(int col) {
74
- this.app.background(col);
75
- }
25
+ /**
26
+ *
27
+ * @param app PApplet
28
+ */
29
+ public LibraryProxy(PApplet app) {
30
+ this.app = app;
31
+ this.width = app.width;
32
+ this.height = app.height;
33
+ setActive(true);
34
+ }
76
35
 
77
- /**
78
- * Simple signature for fill hides need to call app
79
- * @param col int
80
- */
81
- public void fill(int col) {
82
- this.app.fill(col);
83
- }
36
+ /**
37
+ * Extending classes can override this, gives access to, by reflection,
38
+ * processing PApplet pre loop (called before draw)
39
+ */
40
+ public void pre(){}
84
41
 
85
- /**
86
- * Simple signature for stroke hides need to call app
87
- * @param col int
88
- */
89
- public void stroke(int col) {
90
- this.app.stroke(col);
91
- }
42
+ /**
43
+ * Extending classes must implement this gives access to processing PApplet
44
+ * draw loop
45
+ */
46
+ public abstract void draw();
92
47
 
93
- /**
94
- * Access applet if we must
95
- * @return applet PApplet
96
- */
97
- public PApplet app() {
98
- return this.app;
99
- }
48
+ /**
49
+ * Extending classes can override this, gives access to, by reflection,
50
+ * processing PApplet post loop (called after draw)
51
+ */
52
+ public void post(){}
53
+
54
+ /**
55
+ * Extending classes can override this, gives access to, by reflection,
56
+ * processing PApplet post loop (called after draw)
57
+ */
58
+ public void keyEvent(KeyEvent e){}
100
59
 
101
- /**
102
- * required for processing
103
- */
104
- public void dispose() {
105
- setActive(false);
60
+ /**
61
+ * Extending classes can override this, gives access to, by reflection,
62
+ * processing PApplet post loop (called after draw)
63
+ */
64
+ public void mouseEvent(MouseEvent e){}
65
+
66
+ /**
67
+ * Register or unregister reflection methods
68
+ * @param active
69
+ */
70
+ final void setActive(boolean active) {
71
+ if (active) {
72
+ this.app.registerMethod("pre", this);
73
+ this.app.registerMethod("draw", this);
74
+ this.app.registerMethod("post", this);
75
+ this.app.registerMethod("mouseEvent", this);
76
+ this.app.registerMethod("keyEvent", this);
77
+ this.app.registerMethod("dispose", this);
78
+ } else {
79
+ this.app.unregisterMethod("pre", this);
80
+ this.app.unregisterMethod("draw", this);
81
+ this.app.unregisterMethod("post", this);
82
+ this.app.unregisterMethod("mouseEvent", this);
83
+ this.app.unregisterMethod("keyEvent", this);
106
84
  }
85
+ }
86
+
87
+ /**
88
+ * Simple signature for background hides need to call app
89
+ * @param col int
90
+ */
91
+ public void background(int col) {
92
+ this.app.background(col);
93
+ }
94
+
95
+ /**
96
+ * Simple signature for fill hides need to call app
97
+ * @param col int
98
+ */
99
+ public void fill(int col) {
100
+ this.app.fill(col);
101
+ }
102
+
103
+ /**
104
+ * Simple signature for stroke hides need to call app
105
+ * @param col int
106
+ */
107
+ public void stroke(int col) {
108
+ this.app.stroke(col);
109
+ }
110
+
111
+ /**
112
+ * Access applet if we must
113
+ * @return applet PApplet
114
+ */
115
+ public PApplet app() {
116
+ return this.app;
117
+ }
118
+
119
+ /**
120
+ * required for processing
121
+ */
122
+ public void dispose() {
123
+ setActive(false);
124
+ }
107
125
  }
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env jruby
2
+ require 'propane'
3
+
4
+
5
+ class CustomProxySketch < Propane::App
6
+
7
+ # A simple demonstration of vanilla processing 'reflection' methods using
8
+ # propane :library_proxy. See my_library.rb code for the guts.
9
+ load_libraries :library_proxy, :my_library
10
+
11
+ attr_reader :visible
12
+
13
+ def settings
14
+ size 300, 200
15
+ @visible = false
16
+ end
17
+
18
+ def setup
19
+ sketch_title 'Reflection Voodoo Proxy'
20
+ MyLibrary.new self
21
+ end
22
+
23
+ def hide(val)
24
+ @visible = !val
25
+ end
26
+
27
+ def draw
28
+ if visible
29
+ fill(0, 0, 200)
30
+ ellipse(170, 115, 70, 100)
31
+ else
32
+ background 0
33
+ end
34
+ end
35
+ end
36
+
37
+ CustomProxySketch.new
@@ -0,0 +1,32 @@
1
+ # This class demonstrates how by inheriting from the abstract class LibraryProxy
2
+ # we can access 'keyEvent' and 'draw' (Note we need a draw method even
3
+ # though can be empty)
4
+ class MyLibrary < LibraryProxy
5
+ java_import 'processing.event.KeyEvent'
6
+
7
+ attr_reader :app
8
+
9
+ def initialize(parent)
10
+ @app = parent
11
+ end
12
+
13
+ def draw # optional
14
+ fill app.color(200, 0, 0, 100)
15
+ app.rect 100, 100, 60, 90
16
+ end
17
+
18
+ # favor guard clause no_op unless key pressed
19
+ # and no_op unless ascii key
20
+ def keyEvent(e) # NB: need camel case for reflection to work
21
+ return unless e.get_action == KeyEvent::PRESS
22
+ return if e.get_key > 122 # else we can't use :chr
23
+ case e.get_key.chr.upcase
24
+ when 'S'
25
+ app.send :hide, false
26
+ when 'H'
27
+ app.send :hide, true
28
+ else
29
+ puts e.get_key.chr
30
+ end
31
+ end
32
+ end
data/vendors/Rakefile CHANGED
@@ -9,7 +9,7 @@ SOUND = 'sound.zip'.freeze
9
9
  SOUND_VERSION = 'v1.3.2' # version 1.3.2
10
10
  VIDEO = 'video-2.zip'
11
11
  VIDEO_VERSION = '2' # version 1.0.1
12
- EXAMPLES = '1.0'.freeze
12
+ EXAMPLES = '1.5'.freeze
13
13
  HOME_DIR = ENV['HOME']
14
14
  MAC_OR_LINUX = /linux|mac|darwin/ =~ RbConfig::CONFIG['host_os']
15
15
 
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: propane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0.pre
4
+ version: 2.5.0
5
5
  platform: java
6
6
  authors:
7
7
  - monkstone
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-04 00:00:00.000000000 Z
11
+ date: 2017-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.10'
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: arcball
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -51,7 +79,7 @@ files:
51
79
  - Rakefile
52
80
  - bin/propane
53
81
  - lib/PROCESSING_LICENSE.txt
54
- - lib/core-3.3.2.jar
82
+ - lib/core-3.3.5.jar
55
83
  - lib/export.txt
56
84
  - lib/gluegen-rt-2.3.2-natives-linux-amd64.jar
57
85
  - lib/gluegen-rt-2.3.2-natives-macosx-universal.jar
@@ -66,11 +94,7 @@ files:
66
94
  - lib/propane/creators/sketch_writer.rb
67
95
  - lib/propane/helper_methods.rb
68
96
  - lib/propane/helpers/numeric.rb
69
- - lib/propane/java_library.rb
70
97
  - lib/propane/library_loader.rb
71
- - lib/propane/native_folder.rb
72
- - lib/propane/native_loader.rb
73
- - lib/propane/ruby_library.rb
74
98
  - lib/propane/runner.rb
75
99
  - lib/propane/version.rb
76
100
  - library/boids/boids.rb
@@ -117,6 +141,8 @@ files:
117
141
  - test/helper_methods_test.rb
118
142
  - test/math_tool_test.rb
119
143
  - test/respond_to_test.rb
144
+ - test/sketches/key_event.rb
145
+ - test/sketches/library/my_library/my_library.rb
120
146
  - test/test_helper.rb
121
147
  - test/vecmath_spec_test.rb
122
148
  - vendors/Rakefile
@@ -136,20 +162,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
136
162
  version: '0'
137
163
  required_rubygems_version: !ruby/object:Gem::Requirement
138
164
  requirements:
139
- - - ">"
165
+ - - ">="
140
166
  - !ruby/object:Gem::Version
141
- version: 1.3.1
167
+ version: '0'
142
168
  requirements: []
143
169
  rubyforge_project:
144
- rubygems_version: 2.6.11
170
+ rubygems_version: 2.5.1
145
171
  signing_key:
146
172
  specification_version: 4
147
- summary: ruby wrapper for processing-3.3.1 on MacOS and linux64 bit only for opengl
173
+ summary: ruby wrapper for processing-3.3.5 on MacOS and linux64 bit only for opengl
148
174
  test_files:
149
175
  - test/create_test.rb
150
176
  - test/deglut_spec_test.rb
151
177
  - test/helper_methods_test.rb
152
178
  - test/math_tool_test.rb
153
179
  - test/respond_to_test.rb
180
+ - test/sketches/key_event.rb
181
+ - test/sketches/library/my_library/my_library.rb
154
182
  - test/test_helper.rb
155
183
  - test/vecmath_spec_test.rb
@@ -1,54 +0,0 @@
1
- require_relative 'native_folder'
2
- require_relative 'native_loader'
3
-
4
- # The JavaLibrary class
5
- class JavaLibrary
6
- attr_reader :dir, :path, :name, :ppath
7
-
8
- def initialize(name)
9
- @name = name
10
- @dir = '.'
11
- @path = File.join(dir, "#{name}.jar")
12
- end
13
-
14
- def exist?
15
- File.exist? path
16
- end
17
-
18
- def load_jars
19
- Dir["#{dir}/*.jar"].each do |jar|
20
- require jar
21
- end
22
- end
23
-
24
- def native_binaries?
25
- native_folder = NativeFolder.new
26
- native = native_folder.name
27
- @ppath = File.join(dir, native)
28
- File.directory?(ppath) &&
29
- !Dir.glob(File.join(ppath, native_folder.extension)).empty?
30
- end
31
-
32
- def add_binaries_to_classpath
33
- native_loader = NativeLoader.new
34
- native_loader.add_native_path(ppath)
35
- end
36
- end
37
-
38
- # The LocalJavaLibrary class
39
- class LocalJavaLibrary < JavaLibrary
40
- def initialize(name)
41
- super
42
- @dir = File.join(Propane::SKETCH_ROOT, 'library', name)
43
- @path = File.join(dir, "#{name}.jar")
44
- end
45
- end
46
-
47
- # The InstalledJavaLibrary class
48
- class InstalledJavaLibrary < JavaLibrary
49
- def initialize(name)
50
- super
51
- @dir = File.join(ENV['HOME'], '.propane', 'libraries', name, 'library')
52
- @path = File.join(dir, "#{name}.jar")
53
- end
54
- end
@@ -1,33 +0,0 @@
1
- require 'rbconfig'
2
-
3
- # Utility to load native binaries on Java CLASSPATH
4
- class NativeFolder
5
- attr_reader :os, :bit
6
-
7
- WIN_FORMAT = 'windows%d'
8
- LINUX_FORMAT = 'linux%d'
9
- # WIN_PATTERNS = [
10
- # /bccwin/i,
11
- # /cygwin/i,
12
- # /djgpp/i,
13
- # /ming/i,
14
- # /mswin/i,
15
- # /wince/i
16
- # ].freeze
17
-
18
- def initialize
19
- @os = RbConfig::CONFIG['host_os'].downcase
20
- @bit = java.lang.System.get_property('os.arch') =~ /64/ ? 64 : 32
21
- end
22
-
23
- def name
24
- return 'macosx' if os =~ /darwin/ || os =~ /mac/
25
- # return format(WIN_FORMAT, bit) if WIN_PATTERNS.include? os
26
- return format(LINUX_FORMAT, bit) if os =~ /linux/
27
- end
28
-
29
- def extension
30
- return '*.so' if os =~ /linux/
31
- '*.dylib' # MacOS
32
- end
33
- end
@@ -1,26 +0,0 @@
1
- # This class knows how to dynamically set the 'java' native library path
2
- # It might not work with java 9?
3
- class NativeLoader
4
- attr_reader :separator, :current_path
5
-
6
- module JC
7
- java_import 'java.lang.Class'
8
- java_import 'java.lang.System'
9
- java_import 'java.io.File'
10
- end
11
-
12
- def initialize
13
- @separator = JC::File.pathSeparatorChar
14
- @current_path = JC::System.getProperty('java.library.path')
15
- end
16
-
17
- def add_native_path(pth)
18
- current_path << separator << pth
19
- JC::System.setProperty('java.library.path', current_path)
20
- field = JC::Class.for_name('java.lang.ClassLoader')
21
- .get_declared_field('sys_paths')
22
- return unless field
23
- field.accessible = true # some jruby magic
24
- field.set(JC::Class.for_name('java.lang.System').get_class_loader, nil)
25
- end
26
- end
@@ -1,31 +0,0 @@
1
- # The abstract RubyLibrary class
2
- class RubyLibrary
3
- attr_reader :path, :name
4
-
5
- def initialize(name)
6
- @name = name
7
- @path = nil
8
- end
9
-
10
- def exist?
11
- File.exist? path
12
- end
13
- end
14
-
15
- # The LocalRubyLibrary class
16
- class LocalRubyLibrary < RubyLibrary
17
- def initialize(name)
18
- super
19
- @path = File.absolute_path(
20
- File.join(Propane::SKETCH_ROOT, 'library', name, "#{name}.rb")
21
- )
22
- end
23
- end
24
-
25
- # The InstalledLibraryLoader class
26
- class InstalledRubyLibrary < RubyLibrary
27
- def initialize(name)
28
- super
29
- @path = File.join(PROPANE_ROOT, 'library', name, "#{name}.rb")
30
- end
31
- end