processing.rb 1.1.1

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.
@@ -0,0 +1,57 @@
1
+ # Provides the classes and methods for a Processing sketch
2
+ module Processing
3
+ def self.load_library(name)
4
+ if load_jars(File.join(SketchRunner::SKETCH_LIBS_DIR, name, 'library')) ||
5
+ load_jars(File.join(SketchRunner::PROCESSING_DIR, name, 'library'))
6
+ else
7
+ fail "library not found -- #{name}"
8
+ end
9
+ end
10
+
11
+ def self.load_jars(dir)
12
+ is_success = false
13
+
14
+ if File.directory?(dir)
15
+ Dir.glob(File.join(dir, '*.jar')).each do |jar|
16
+ require jar
17
+ is_success = true
18
+ puts "jar file loaded -- #{File.basename(jar)}"
19
+ end
20
+
21
+ return true if is_success
22
+ end
23
+
24
+ false
25
+ end
26
+
27
+ def self.import_package(package, module_name)
28
+ code = "module #{module_name}; include_package '#{package}'; end"
29
+ Object::TOPLEVEL_BINDING.eval(code)
30
+ end
31
+
32
+ def self.sketch_path(path)
33
+ File.join(SketchRunner::SKETCH_DIR, path)
34
+ end
35
+
36
+ def self.start(sketch, opts = {})
37
+ title = opts[:title] || SketchRunner::SKETCH_NAME
38
+ topmost = opts[:topmost]
39
+ pos = opts[:pos]
40
+
41
+ PApplet.run_sketch([title], sketch)
42
+
43
+ if topmost
44
+ request = { command: :topmost, sketch: sketch }
45
+ SketchRunner.system_requests << request
46
+ end
47
+
48
+ if pos
49
+ request = { command: :pos, sketch: sketch, pos: pos }
50
+ SketchRunner.system_requests << request
51
+ end
52
+ end
53
+
54
+ def self.reload
55
+ SketchRunner.system_requests << { command: :reload }
56
+ end
57
+ end
@@ -0,0 +1,64 @@
1
+ # Runs a sketch and reloads it when related files change
2
+ module SketchRunner
3
+ VERSION = '1.1.1'
4
+
5
+ CONFIG_MTIME = File.stat(__FILE__).mtime
6
+
7
+ PACKAGE_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '../..'))
8
+
9
+ APPDATA_ROOT = File.expand_path('~/.processing.rb')
10
+ APPDATA_CHECK_FILE = File.join(APPDATA_ROOT, '.complete')
11
+
12
+ JRUBY_URL = 'https://s3.amazonaws.com/jruby.org/downloads/9.0.0.0.pre1/jruby-complete-9.0.0.0.pre1.jar'
13
+ JRUBY_FILE = File.join(APPDATA_ROOT, 'jruby/jruby.jar')
14
+
15
+ if RUBY_PLATFORM == 'java'
16
+ BIT_SIZE = java.lang.System.getProperty('sun.arch.data.model') == '64' ?
17
+ 64 : 32
18
+ else
19
+ require 'open3'
20
+ BIT_SIZE = Open3.capture3('java -version')[1].include?('64-Bit') ? 64 : 32
21
+ end
22
+
23
+ if RUBY_PLATFORM == 'java'
24
+ PLATFORM = :JAVA
25
+ elsif /darwin/ =~ RUBY_PLATFORM
26
+ PLATFORM = :MACOSX
27
+ elsif /cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM
28
+ PLATFORM = BIT_SIZE == 32 ? :WIN32 : :WIN64
29
+ else
30
+ PLATFORM = BIT_SIZE == 32 ? :LINUX32 : :LINUX64
31
+ end
32
+
33
+ PROCESSING_URL = {
34
+ MACOSX: 'http://download.processing.org/processing-2.2.1-macosx.zip',
35
+ WIN32: 'http://download.processing.org/processing-2.2.1-windows32.zip',
36
+ WIN64: 'http://download.processing.org/processing-2.2.1-windows64.zip',
37
+ LINUX32: 'http://download.processing.org/processing-2.2.1-linux32.tgz',
38
+ LINUX64: 'http://download.processing.org/processing-2.2.1-linux64.tgz'
39
+ }[PLATFORM]
40
+
41
+ if PLATFORM == :MACOSX
42
+ PROCESSING_CORE_PATH = 'Processing.app/Contents/Java/core'
43
+ PROCESSING_LIBS_PATH = 'Processing.app/Contents/Java/modes/java/libraries'
44
+ else
45
+ PROCESSING_CORE_PATH = 'processing-2.2.1/core'
46
+ PROCESSING_LIBS_PATH = 'processing-2.2.1/modes/java/libraries'
47
+ end
48
+
49
+ PROCESSING_DIR = File.join(APPDATA_ROOT, 'processing')
50
+ PROCESSING_ZIP_DIR = File.join(APPDATA_ROOT, 'processing-zip')
51
+ PROCESSING_ZIP_FILE = File.join(PROCESSING_ZIP_DIR, 'processing.zip')
52
+
53
+ EXAMPLES_SRC_DIR = File.join(PACKAGE_ROOT, 'examples')
54
+ EXAMPLES_DEST_DIR = File.expand_path('~/processingrb_examples')
55
+
56
+ LOAD_PATH = File.join(PACKAGE_ROOT, 'lib')
57
+ STARTUP_FILE = File.join(PACKAGE_ROOT, 'lib/sketch_runner/runner.rb')
58
+
59
+ SKETCH_FILE = File.expand_path(ARGV.length > 0 ? ARGV[0] : '')
60
+ SKETCH_DIR, SKETCH_NAME = File.split(SKETCH_FILE)
61
+ SKETCH_LIBS_DIR = File.join(SKETCH_DIR, 'libraries')
62
+
63
+ WATCH_INTERVAL = 0.1
64
+ end
@@ -0,0 +1,11 @@
1
+ # Runs a sketch and reloads it when related files change
2
+ module SketchRunner
3
+ def self.launch
4
+ jruby_opts = "-I#{LOAD_PATH}"
5
+ jruby_args = "#{STARTUP_FILE} #{$PROGRAM_NAME} #{ARGV.join(' ')}"
6
+ exec("java -jar #{JRUBY_FILE} #{jruby_opts} #{jruby_args}")
7
+ end
8
+ private_class_method :launch
9
+
10
+ launch
11
+ end
@@ -0,0 +1,108 @@
1
+ require 'find'
2
+ require_relative 'config'
3
+
4
+ # Runs a sketch and reloads it when related files change
5
+ module SketchRunner
6
+ class << self
7
+ def system_requests
8
+ @system_requests ||= []
9
+ end
10
+
11
+ def sketch_instances
12
+ @sketch_instances ||= []
13
+ end
14
+ end
15
+
16
+ def self.start
17
+ $PROGRAM_NAME = ARGV.shift
18
+
19
+ jars = File.join(PROCESSING_DIR, 'core/library/*.jar')
20
+ Dir.glob(jars).each { |jar| require jar }
21
+
22
+ initial_constants = Object.constants
23
+ initial_features = $LOADED_FEATURES.dup
24
+
25
+ loop do
26
+ puts '****** START SKETCH ******'
27
+
28
+ run_sketch
29
+ watch_file_changes
30
+ restore_environment(initial_constants, initial_features)
31
+ end
32
+ end
33
+ private_class_method :start
34
+
35
+ def self.run_sketch
36
+ Thread.new do
37
+ begin
38
+ Object::TOPLEVEL_BINDING.eval(File.read(SKETCH_FILE), SKETCH_FILE)
39
+ rescue Exception => e
40
+ puts e
41
+ end
42
+ end
43
+ end
44
+ private_class_method :run_sketch
45
+
46
+ def self.watch_file_changes
47
+ execute_time = Time.now
48
+
49
+ catch :break_loop do
50
+ loop do
51
+ system_requests.each do |request|
52
+ system_requests.delete(request) if respond_to_request(request)
53
+ end
54
+
55
+ Find.find(SKETCH_DIR) do |file|
56
+ is_ruby = FileTest.file?(file) && File.extname(file) == '.rb'
57
+ throw :break_loop if is_ruby && File.mtime(file) > execute_time
58
+ end
59
+
60
+ sleep(WATCH_INTERVAL)
61
+ end
62
+ end
63
+ end
64
+ private_class_method :watch_file_changes
65
+
66
+ def self.respond_to_request(request)
67
+ case request[:command]
68
+ when :topmost
69
+ sketch = request[:sketch]
70
+ sketch.frame.set_always_on_top(true)
71
+
72
+ return sketch.frame.is_always_on_top
73
+ when :pos
74
+ sketch = request[:sketch]
75
+ pos_x, pos_y = request[:pos]
76
+ sketch.frame.set_location(pos_x, pos_y)
77
+
78
+ cur_pos = sketch.frame.get_location
79
+ return cur_pos.x == pos_x && cur_pos.y == pos_y
80
+ when :reload
81
+ throw :break_loop
82
+ end
83
+ end
84
+ private_class_method :respond_to_request
85
+
86
+ def self.restore_environment(initial_constants, initial_features)
87
+ sketch_instances.each do |sketch|
88
+ sketch.frame.dispose
89
+ sketch.dispose
90
+ end
91
+
92
+ sketch_instances.clear
93
+ system_requests.clear
94
+
95
+ added_constants = Object.constants - initial_constants
96
+ added_constants.each do |constant|
97
+ Object.class_eval { remove_const constant }
98
+ end
99
+
100
+ added_features = $LOADED_FEATURES - initial_features
101
+ added_features.each { |feature| $LOADED_FEATURES.delete(feature) }
102
+
103
+ java.lang.System.gc
104
+ end
105
+ private_class_method :restore_environment
106
+
107
+ start
108
+ end
@@ -0,0 +1,85 @@
1
+ require 'fileutils'
2
+ require 'open_uri_redirections'
3
+ require 'openssl'
4
+ require 'zip'
5
+
6
+ # Runs a sketch and reloads it when related files change
7
+ module SketchRunner
8
+ def self.setup
9
+ puts "Processing.rb #{VERSION}"
10
+
11
+ return if File.exist?(APPDATA_CHECK_FILE) &&
12
+ File.stat(APPDATA_CHECK_FILE).mtime > CONFIG_MTIME
13
+
14
+ FileUtils.remove_dir(APPDATA_ROOT, true)
15
+
16
+ puts 'JRuby and Processing will be downloaded just one time.'
17
+ puts 'Please input a proxy if necessary, otherwise just press Enter.'
18
+ print '(e.g. http://proxy.hostname:port): '
19
+ proxy = $stdin.gets.chomp
20
+ proxy = nil if proxy == ''
21
+
22
+ download(JRUBY_URL, JRUBY_FILE, proxy)
23
+
24
+ download(PROCESSING_URL, PROCESSING_ZIP_FILE, proxy)
25
+ unzip(PROCESSING_ZIP_FILE, PROCESSING_ZIP_DIR)
26
+
27
+ FileUtils.mkdir_p(PROCESSING_DIR)
28
+ processing_core_dir = File.join(PROCESSING_ZIP_DIR, PROCESSING_CORE_PATH)
29
+ FileUtils.cp_r(processing_core_dir, PROCESSING_DIR)
30
+
31
+ processing_libs_dir = File.join(PROCESSING_ZIP_DIR, PROCESSING_LIBS_PATH)
32
+ Dir.glob(File.join(processing_libs_dir, '*')).each do |dir|
33
+ FileUtils.cp_r(dir, PROCESSING_DIR)
34
+ end
35
+
36
+ FileUtils.remove_dir(PROCESSING_ZIP_DIR, true)
37
+
38
+ FileUtils.touch(APPDATA_CHECK_FILE)
39
+ end
40
+ private_class_method :setup
41
+
42
+ def self.download(url, file, proxy)
43
+ print "download #{File.basename(url)} ... "
44
+
45
+ FileUtils.mkdir_p(File.dirname(file))
46
+
47
+ open(file, 'wb') do |output|
48
+ begin
49
+ open(
50
+ url,
51
+ proxy: proxy,
52
+ allow_redirections: :safe,
53
+ ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE
54
+ ) do |data|
55
+ output.write(data.read)
56
+ end
57
+ rescue StandardError
58
+ puts "\nunable to download file -- #{url}"
59
+ exit false
60
+ end
61
+ end
62
+
63
+ puts 'done'
64
+ end
65
+ private_class_method :download
66
+
67
+ def self.unzip(file, dest_dir)
68
+ print "unzip #{File.basename(file)} ... "
69
+
70
+ Zip::File.open(file) do |zip|
71
+ zip.each do |entry|
72
+ dest_file = File.join(dest_dir, entry.name)
73
+
74
+ unless File.basename(dest_file).start_with?('._')
75
+ entry.extract(dest_file)
76
+ end
77
+ end
78
+ end
79
+
80
+ puts 'done'
81
+ end
82
+ private_class_method :unzip
83
+
84
+ setup
85
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'lib/sketch_runner/config'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'processing.rb'
5
+ spec.version = SketchRunner::VERSION
6
+ spec.author = 'Takashi Kitao'
7
+ spec.email = 'takashi.kitao@gmail.com'
8
+ spec.summary = 'A simple Processing sketch runner for Ruby'
9
+ spec.description =
10
+ 'Processing.rb runs a Processing sketch written in Ruby, ' \
11
+ 'and reloads it automatically when files in the same directory change.'
12
+ spec.homepage = 'https://github.com/kitao/processing.rb'
13
+ spec.license = 'MIT'
14
+ spec.files = `git ls-files -z`.split("\x0")
15
+ spec.executables = ['setup_processingrb_examples']
16
+ spec.requirements = ['java >= 1.8.0_40']
17
+ spec.add_runtime_dependency 'open_uri_redirections', '~> 0.2.1'
18
+ spec.add_runtime_dependency 'rubyzip', '~> 1.1.7'
19
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: processing.rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Takashi Kitao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: open_uri_redirections
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.2.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.2.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.7
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.7
41
+ description: Processing.rb runs a Processing sketch written in Ruby, and reloads it
42
+ automatically when files in the same directory change.
43
+ email: takashi.kitao@gmail.com
44
+ executables:
45
+ - setup_processingrb_examples
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - ".gitignore"
50
+ - ".rubocop.yml"
51
+ - CHANGELOG.md
52
+ - LICENSE
53
+ - README.ja.md
54
+ - README.md
55
+ - bin/setup_processingrb_examples
56
+ - examples/01_simple_sketch.rb
57
+ - examples/02_input_handling.rb
58
+ - examples/03_multi_file.rb
59
+ - examples/04_builtin_library.rb
60
+ - examples/05_external_library.rb
61
+ - examples/data/cat.mov
62
+ - examples/data/dog.mov
63
+ - examples/libraries/handy/library.properties
64
+ - examples/libraries/handy/library/handy.jar
65
+ - examples/modules/moving_box.rb
66
+ - examples/modules/textured_cube.rb
67
+ - examples/screenshots/01_simple_sketch.png
68
+ - examples/screenshots/02_input_handling.png
69
+ - examples/screenshots/03_multi_file.png
70
+ - examples/screenshots/04_builtin_library.png
71
+ - examples/screenshots/05_external_library.png
72
+ - lib/processing.rb
73
+ - lib/processing/sketch_base.rb
74
+ - lib/processing/system.rb
75
+ - lib/sketch_runner/config.rb
76
+ - lib/sketch_runner/launch.rb
77
+ - lib/sketch_runner/runner.rb
78
+ - lib/sketch_runner/setup.rb
79
+ - processing.rb.gemspec
80
+ homepage: https://github.com/kitao/processing.rb
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements:
99
+ - java >= 1.8.0_40
100
+ rubyforge_project:
101
+ rubygems_version: 2.0.14
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: A simple Processing sketch runner for Ruby
105
+ test_files: []