jruby_art 0.2.6.pre → 0.3.0.pre

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/bin/k9 +2 -2
  3. data/lib/jruby_art.rb +18 -23
  4. data/lib/jruby_art/app.rb +118 -130
  5. data/lib/jruby_art/config.rb +7 -9
  6. data/lib/jruby_art/creators/creator.rb +189 -0
  7. data/lib/jruby_art/helper_methods.rb +41 -31
  8. data/lib/jruby_art/helpers/camel_string.rb +2 -1
  9. data/lib/jruby_art/helpers/numeric.rb +1 -2
  10. data/lib/jruby_art/helpers/range.rb +3 -7
  11. data/lib/jruby_art/helpers/string_extra.rb +1 -1
  12. data/lib/jruby_art/library_loader.rb +127 -96
  13. data/lib/jruby_art/runner.rb +208 -63
  14. data/lib/jruby_art/runners/base.rb +51 -0
  15. data/lib/jruby_art/runners/run.rb +6 -0
  16. data/lib/jruby_art/runners/watch.rb +59 -0
  17. data/lib/jruby_art/version.rb +1 -2
  18. data/lib/rpextras.jar +0 -0
  19. data/library/library_proxy/README.md +97 -0
  20. data/library/library_proxy/library_proxy.rb +8 -1
  21. data/library/video_event/video_event.rb +4 -0
  22. data/vendors/Rakefile +33 -78
  23. metadata +54 -60
  24. data/CHANGELOG.md +0 -60
  25. data/LICENSE.md +0 -39
  26. data/README.md +0 -91
  27. data/Rakefile +0 -85
  28. data/lib/core.jar +0 -0
  29. data/lib/gluegen-rt-natives-linux-amd64.jar +0 -0
  30. data/lib/gluegen-rt-natives-linux-armv6hf.jar +0 -0
  31. data/lib/gluegen-rt-natives-linux-i586.jar +0 -0
  32. data/lib/gluegen-rt-natives-macosx-universal.jar +0 -0
  33. data/lib/gluegen-rt-natives-windows-amd64.jar +0 -0
  34. data/lib/gluegen-rt-natives-windows-i586.jar +0 -0
  35. data/lib/gluegen-rt.jar +0 -0
  36. data/lib/jogl-all-natives-linux-amd64.jar +0 -0
  37. data/lib/jogl-all-natives-linux-armv6hf.jar +0 -0
  38. data/lib/jogl-all-natives-linux-i586.jar +0 -0
  39. data/lib/jogl-all-natives-macosx-universal.jar +0 -0
  40. data/lib/jogl-all-natives-windows-amd64.jar +0 -0
  41. data/lib/jogl-all-natives-windows-i586.jar +0 -0
  42. data/lib/jogl-all.jar +0 -0
  43. data/lib/jruby_art/creator.rb +0 -100
  44. data/lib/jruby_art/parse.rb +0 -59
  45. data/lib/jruby_art/writer.rb +0 -40
  46. data/library/file_chooser/file_chooser.rb +0 -82
  47. data/library/grammar/grammar.rb +0 -31
  48. data/library/video/lib/export.txt +0 -1
  49. data/library/video/lib/macosx64.txt +0 -1
  50. data/library/video/lib/windows.txt +0 -3
  51. data/library/video/video.rb +0 -12
  52. data/spec/app_spec.rb +0 -208
  53. data/spec/deglut_spec.rb +0 -25
  54. data/spec/library_loader_spec.rb +0 -23
  55. data/spec/spec_helper.rb +0 -96
  56. data/spec/vecmath_spec.rb +0 -483
  57. data/vendors/config.tar.gz +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 186cf1166260ed477d29a53e4d6af5982ec61320
4
- data.tar.gz: 778ff0c076f4fc7a5cae5e297713ee2154eadafd
3
+ metadata.gz: e2f18112ba5aae2c2dfdd271945d91c157242dce
4
+ data.tar.gz: c917b6420da85b1e4c45b71de2a84b57dbc2712b
5
5
  SHA512:
6
- metadata.gz: 5501b44349aefdbedd0531db69d1e539e85f2da546a0777da584b159540b03909e960ae6b433bbf5639dc3ba2795b9ac173837657a8f25b685af4735dfd0dcf0
7
- data.tar.gz: 6a331e4710e2f8185e2cc535959e033b14906e35561d4625040fd43ab01523bdd5f84a0db04cd4f9bc39b1e4980ce65b2e69ac21ac78da1d721e313c9d43acd0
6
+ metadata.gz: 094e0e81bc65c61753fd6fb6b2c5bb2260496effb480670e6d8c75d818f36e0410abdba62899e7dcbc85f7d460cedd82e2696ac708c15a47450dc161aaddc430
7
+ data.tar.gz: 5c673af5d1e65b84327be0fc5983cfea3d4ce4a0963e0082230b8755bb12aa4caf1fae516f4e6f01dc2bdf84f4c7f5df71d5d6789890334079cfd15c004379ca
data/bin/k9 CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  file = __FILE__
4
4
  if test(?l, file)
5
- require 'pathname'
5
+ require "pathname"
6
6
  file = Pathname.new(file).realpath
7
7
  end
8
8
 
9
- require File.expand_path(File.dirname(file) + '/../lib/jruby_art')
9
+ require File.expand_path(File.dirname(file) + "/../lib/jruby_art")
10
10
  Processing::Runner.execute
data/lib/jruby_art.rb CHANGED
@@ -1,30 +1,25 @@
1
- require 'rbconfig'
2
-
3
- VERBOSE = true
4
-
5
- unless defined? K9_ROOT
1
+ # Ruby-Processing is for Code Art.
2
+ # Send suggestions, ideas, and hate-mail to mamba2928 [at] gmail.com
3
+ # Also, send samples and libraries.
4
+ unless defined? RP5_ROOT
6
5
  $LOAD_PATH << File.expand_path(File.dirname(__FILE__))
7
- K9_ROOT = File.expand_path(File.dirname(__FILE__) + '/../')
6
+ RP5_ROOT = File.expand_path(File.dirname(__FILE__) + '/../')
8
7
  end
9
8
 
10
- # guard prevents issues with mri ruby when using creator
11
- if RUBY_PLATFORM == 'java'
12
- working_directory = File.join(File.dirname(__FILE__))
13
- $LOAD_PATH << working_directory unless $LOAD_PATH.include?(working_directory)
14
- Dir[File.join(working_directory, '*.jar')].each do |jar|
15
- # require_relative jar unless jar =~ /native/ (breaks netbeans)
16
- require jar unless jar =~ /native/
17
- end
18
- Java::ProcessingFastmath::DeglutLibrary.new.load(JRuby.runtime, false)
19
- Java::ProcessingVecmathVec2::Vec2Library.new.load(JRuby.runtime, false)
20
- Java::ProcessingVecmathVec3::Vec3Library.new.load(JRuby.runtime, false)
21
- AppRender = Java::ProcessingVecmath::AppRender
22
- ShapeRender = Java::ProcessingVecmath::ShapeRender
23
- require 'jruby_art/app'
24
- require 'jruby_art/helper_methods'
25
- end
9
+ SKETCH_ROOT ||= Dir.pwd
26
10
 
27
11
  require 'jruby_art/version'
28
12
  require 'jruby_art/helpers/numeric'
29
13
  require 'jruby_art/helpers/range'
30
- require 'jruby_art/runner'
14
+
15
+ # The top-level namespace, a home for all Ruby-Processing classes.
16
+ module Processing
17
+
18
+ # Autoload a number of path/constants that we may end up using.
19
+ # mri ruby does not understand ** require 'java' ** and we may otherwise call
20
+ # it from mri ruby without lazy path loading of autoload
21
+ # NB: autoload was slated for possible removal by ruby-2.2 never happened
22
+ autoload :App, 'jruby_art/app'
23
+ autoload :Runner, 'jruby_art/runner'
24
+ autoload :Watcher, 'jruby_art/runners/watch'
25
+ end
data/lib/jruby_art/app.rb CHANGED
@@ -1,69 +1,25 @@
1
- require_relative 'helper_methods'
2
- require_relative 'library_loader'
3
-
4
- # The Processing module is a wrapper for JRubyArt
5
- # Author:: Martin Prout (extends / re-implements ruby-processing)
1
+ require 'java'
2
+ require_relative '../rpextras'
3
+ require_relative '../jruby_art/helper_methods'
4
+ require_relative '../jruby_art/helpers/string_extra'
5
+ require_relative '../jruby_art/library_loader'
6
+ require_relative '../jruby_art/config'
7
+
8
+ # A wrapper module for the processing App
6
9
  module Processing
7
- include_package 'processing.core' # imports the processing.core package.
8
- include_package 'processing.event'
9
- # This class is the base class the user should inherit from when making
10
- # their own sketch.
11
- #
12
- # i.e.
13
- #
14
- # class MySketch < Processing::App
15
- #
16
- # def draw
17
- # background rand(255)
18
- # end
19
- #
20
- # end
21
- #
22
- module Common
23
- # This method provides the possibility of adding and using
24
- # new runtime options in sketches no need to re-define initialize
25
- #
26
- def post_initialize(_opts = {})
27
- nil
28
- end
29
-
30
- # This method configures the sketch title and and presentation mode.
31
- #
32
- def configure_sketch
33
- presentation_mode
34
- sketch_title
35
- end
36
-
37
- # This method sets the sketch presentation mode.
38
- #
39
- def presentation_mode
40
- return unless opts[:fullscreen]
41
- args << '--full-screen'
42
- args << "--bgcolor=#{opts[:bgcolor]}" if opts[:bgcolor]
43
- end
10
+ # Include some core processing classes that we'd like to use:
11
+ include_package 'processing.core'
12
+ # Load vecmath and fastmath modules
13
+ Java::ProcessingVecmathArcball::ArcballLibrary.new.load(JRuby.runtime, false)
14
+ Java::ProcessingVecmathVec2::Vec2Library.new.load(JRuby.runtime, false)
15
+ Java::ProcessingVecmathVec3::Vec3Library.new.load(JRuby.runtime, false)
16
+ Java::ProcessingFastmath::DeglutLibrary.new.load(JRuby.runtime, false)
17
+ AppRender ||= Java::ProcessingVecmath::AppRender
18
+ ShapeRender ||= Java::ProcessingVecmath::ShapeRender
44
19
 
45
- # This method is the main draw loop of the sketch. This is usually
46
- # overridden by the user.
47
- #
48
- def draw
49
- nil
50
- end
51
-
52
- # This method runs the processing sketch.
53
- #
54
- def run_sketch
55
- PApplet.run_sketch(args.to_java(:string), self)
56
- end
57
-
58
- # This method sets the sketch title.
59
- #
60
- def sketch_title
61
- args << opts.fetch(:title, 'Sketch')
62
- end
63
- end
64
20
  # Watch the definition of these methods, to make sure
65
21
  # that Processing is able to call them during events.
66
- METHODS_TO_ALIAS = {
22
+ METHODS_TO_ALIAS ||= {
67
23
  mouse_pressed: :mousePressed,
68
24
  mouse_dragged: :mouseDragged,
69
25
  mouse_clicked: :mouseClicked,
@@ -73,11 +29,28 @@ module Processing
73
29
  key_released: :keyReleased,
74
30
  key_typed: :keyTyped
75
31
  }
76
-
77
- # This class is for default (Java2D) sketches only
32
+ # All sketches extend this class
78
33
  class App < PApplet
79
- include Math, Common, HelperMethods
80
- attr_reader :title, :args, :opts
34
+ include Math
35
+ include HelperMethods
36
+ # Alias some methods for familiarity for Shoes coders.
37
+ # surface replaces :frame, but needs field_reader for access
38
+ alias_method :oval, :ellipse
39
+ alias_method :stroke_width, :stroke_weight
40
+ alias_method :rgb, :color
41
+ alias_method :gray, :color
42
+ field_reader :surface
43
+
44
+ def sketch_class
45
+ self.class.sketch_class
46
+ end
47
+
48
+ # Keep track of what inherits from the Processing::App, because we're
49
+ # going to want to instantiate one.
50
+ def self.inherited(subclass)
51
+ super(subclass)
52
+ @sketch_class = subclass
53
+ end
81
54
 
82
55
  class << self
83
56
  # Handy getters and setters on the class go here:
@@ -85,10 +58,22 @@ module Processing
85
58
 
86
59
  def load_libraries(*args)
87
60
  library_loader ||= LibraryLoader.new
88
- library_loader.load_libraries(*args)
61
+ library_loader.load_library(*args)
89
62
  end
90
63
  alias_method :load_library, :load_libraries
91
64
 
65
+ def library_loaded?(library_name)
66
+ library_loader.library_loaded?(library_name)
67
+ end
68
+
69
+ def load_ruby_library(*args)
70
+ library_loader.load_ruby_library(*args)
71
+ end
72
+
73
+ def load_java_library(*args)
74
+ library_loader.load_java_library(*args)
75
+ end
76
+
92
77
  # When certain special methods get added to the sketch, we need to let
93
78
  # Processing call them by their expected Java names.
94
79
  def method_added(method_name) #:nodoc:
@@ -97,84 +82,86 @@ module Processing
97
82
  end
98
83
  end
99
84
 
100
- def sketch_class
101
- self.class.sketch_class
85
+ def library_loaded?(library_name)
86
+ self.class.library_loaded?(library_name)
102
87
  end
103
88
 
104
- # App should be instantiated with an optional list of opts
105
- # and array of args.
106
- #
107
- # App.new(title: 'My Simple App', fullscreen: true)
108
- #
109
- def initialize(opts = {}, args = [])
89
+ # Since processing-3.0 you should prefer setting the sketch width and
90
+ # height and renderer using the size method in the settings loop of the
91
+ # sketch (as with vanilla processing) but is hidden see created java.
92
+ # Options are no longer relevant, define post_initialize method to use
93
+ # custom options (see Sandi Metz POODR)
94
+
95
+ def initialize(options = {})
110
96
  super()
111
- proxy_java_fields
112
- post_initialize(opts)
113
- @args = args
114
- @opts = opts
97
+ post_initialize(options) # for anyone wishing to pass options
115
98
  $app = self
116
- configure_sketch
99
+ proxy_java_fields
100
+ mix_proxy_into_inner_classes
101
+ java.lang.Thread.default_uncaught_exception_handler = proc do |_thread_, exception|
102
+ puts(exception.class.to_s)
103
+ puts(exception.message)
104
+ puts(exception.backtrace.map { |trace| "\t#{trace}" })
105
+ close
106
+ end
107
+ # NB: this is the processing runSketch() method as used by processing.py
117
108
  run_sketch
118
109
  end
119
110
 
120
- # This method provides the default setup for the sketch. It can
121
- # be overridden by the user for finer grained control.
122
- #
123
- def setup
124
- size(width, height)
111
+ def size(*args)
112
+ w, h, mode = *args
113
+ @width ||= w
114
+ @height ||= h
115
+ @render_mode ||= mode
116
+ import_opengl if /opengl/ =~ mode
117
+ super(*args)
125
118
  end
126
- end
127
119
 
128
- # This class is for opengl sketches (P2D and P3D)
129
- class AppGL < PApplet
130
- include Math, Processing, Common
131
- include_package 'processing.opengl' # imports the processing.opengl package.
132
- include HelperMethods
133
- Java::ProcessingVecmathArcball::ArcballLibrary.new.load(JRuby.runtime, false)
134
- attr_reader :title, :args, :opts
135
-
136
- # App should be instantiated with an optional list of opts
137
- # and array of args.
138
- #
139
- # App.new(title: 'My Simple App', fullscreen: true)
140
- #
141
- def initialize(opts = {}, args = [])
142
- super()
143
- proxy_java_fields
144
- post_initialize(opts)
145
- @args = args
146
- @opts = opts
147
- $app = self
148
- configure_sketch
149
- run_sketch
120
+ def sketch_title(title)
121
+ surface.setTitle(title)
150
122
  end
151
123
 
152
- # This method provides the default setup for the sketch. It can
153
- # be overridden by the user for finer grained control.
154
- #
155
- def setup
156
- size(width, height, mode = P3D)
157
- fail unless /opengl/ =~ mode
124
+ def post_initialize(_args)
125
+ nil
158
126
  end
159
127
 
160
- class << self
161
- # Handy getters and setters on the class go here:
162
- attr_accessor :sketch_class, :library_loader
128
+ # Close and shutter a running sketch. But don't exit.
129
+ # @HACK seems to work with watch until we find a better
130
+ # way of disposing of sketch window...
131
+ def close
132
+ control_panel.remove if respond_to?(:control_panel)
133
+ surface.stopThread
134
+ surface.setVisible(false) if surface.isStopped()
135
+ dispose
136
+ end
163
137
 
164
- def load_libraries(*args)
165
- library_loader ||= LibraryLoader.new
166
- library_loader.load_libraries(*args)
138
+ def exit
139
+ control_panel.remove if respond_to?(:control_panel)
140
+ super()
141
+ end
142
+
143
+ private
144
+
145
+ # Mix the Processing::Proxy into any inner classes defined for the
146
+ # sketch, attempting to mimic the behavior of Java's inner classes.
147
+ def mix_proxy_into_inner_classes
148
+ klass = Processing::App.sketch_class
149
+ klass.constants.each do |name|
150
+ const = klass.const_get name
151
+ next if const.class != Class || const.to_s.match(/^Java::/)
152
+ const.class_eval 'include Processing::Proxy'
167
153
  end
168
- alias_method :load_library, :load_libraries
154
+ end
169
155
 
170
- # When certain special methods get added to the sketch, we need to let
171
- # Processing call them by their expected Java names.
172
- def method_added(method_name) #:nodoc:
173
- return unless METHODS_TO_ALIAS.key?(method_name)
174
- alias_method METHODS_TO_ALIAS[method_name], method_name
156
+ def import_opengl
157
+ # Include processing opengl classes that we'd like to use:
158
+ %w(FontTexture FrameBuffer LinePath LineStroker PGL
159
+ PGraphics2D PGraphics3D PGraphicsOpenGL PShader
160
+ PShapeOpenGL Texture).each do |klass|
161
+ java_import format('processing.opengl.%s', klass)
175
162
  end
176
163
  end
177
- end
164
+ end # Processing::App
178
165
 
179
166
  # Importing PConstants to access to processing constants,
180
167
  # to keep namespace clean use PConstants::TRIANGLE (for example)
@@ -183,11 +170,12 @@ module Processing
183
170
  # @HACK you should consider using 'forwardable' to avoid this
184
171
  # egregious hack...
185
172
  module Proxy
173
+ include Math
186
174
  java_import 'processing.core.PConstants'
187
-
175
+
188
176
  def method_missing(name, *args)
189
177
  return $app.send(name, *args) if $app && $app.respond_to?(name)
190
178
  super
191
179
  end
192
- end
193
- end
180
+ end # Processing::Proxy
181
+ end # Processing
@@ -1,16 +1,14 @@
1
- require 'yaml'
2
- # The Processing module is a wrapper for JRubyArt
3
- # Author:: Martin Prout (extends / re-implements ruby-processing)
1
+ require 'psych'
2
+
3
+ # The wrapper module
4
4
  module Processing
5
5
  unless defined? RP_CONFIG
6
+ config_path = '~/.jruby_art/config.yml'
6
7
  begin
7
- CONFIG_FILE_PATH = File.expand_path('~/.jruby_art/config.yml')
8
- RP_CONFIG = YAML.load_file(CONFIG_FILE_PATH)
8
+ CONFIG_FILE_PATH = File.expand_path(config_path)
9
+ RP_CONFIG = (Psych.load_file(CONFIG_FILE_PATH))
9
10
  rescue
10
- warn('WARNING: you need to set PROCESSING_ROOT in ~/.jruby_art/config.yml')
11
+ warn(format('WARN: you need to set PROCESSING_ROOT in %s', config_path))
11
12
  end
12
13
  end
13
14
  end
14
-
15
-
16
-
@@ -0,0 +1,189 @@
1
+ BASIC = <<-CODE
2
+ def setup
3
+ sketch_title '%s'
4
+ end
5
+
6
+ def draw
7
+
8
+ end
9
+
10
+ def settings
11
+ size %s, %s, FX2D
12
+ # smooth # here
13
+ end
14
+
15
+ CODE
16
+
17
+ BASIC_MODE = <<-CODE
18
+ def setup
19
+ sketch_title '%s'
20
+ end
21
+
22
+ def draw
23
+
24
+ end
25
+
26
+ def settings
27
+ size %s, %s, %s
28
+ # smooth # here
29
+ end
30
+
31
+ CODE
32
+
33
+ CLASS_BASIC = <<-CODE
34
+ class %s < Processing::App
35
+ def setup
36
+ sketch_title '%s'
37
+ end
38
+
39
+ def draw
40
+
41
+ end
42
+
43
+ def settings
44
+ size %s, %s, FX2D
45
+ # smooth # here
46
+ end
47
+ end
48
+ CODE
49
+
50
+ CLASS_MODE = <<-CODE
51
+ class %s < Processing::App
52
+ def setup
53
+ sketch_title '%s'
54
+ end
55
+
56
+ def draw
57
+
58
+ end
59
+
60
+ def settings
61
+ size %s, %s, %s
62
+ # smooth # here
63
+ end
64
+ end
65
+ CODE
66
+
67
+ INNER = <<-CODE
68
+ class %s
69
+ include Processing::Proxy
70
+
71
+ end
72
+ CODE
73
+
74
+ # processing wrapper module
75
+ module Processing
76
+ require_relative '../helpers/string_extra'
77
+ require_relative '../helpers/camel_string'
78
+ # Write file to disk
79
+ class SketchWriter
80
+ attr_reader :file
81
+ def initialize(path)
82
+ underscore = StringExtra.new(path).underscore
83
+ @file = "#{File.dirname(path)}/#{underscore}.rb"
84
+ end
85
+
86
+ def save(template)
87
+ File.open(file, 'w+') do |f|
88
+ f.write(template)
89
+ end
90
+ end
91
+ end
92
+
93
+ # An abstract class providing common methods for real creators
94
+ class Creator
95
+ ALL_DIGITS = /\A\d+\Z/
96
+
97
+ def already_exist(path)
98
+ underscore = StringExtra.new(path).underscore
99
+ new_file = "#{File.dirname(path)}/#{underscore}.rb"
100
+ return if !FileTest.exist?(path) && !FileTest.exist?(new_file)
101
+ puts 'That file already exists!'
102
+ exit
103
+ end
104
+
105
+ # Show the help/usage message for create.
106
+ def usage
107
+ puts <<-USAGE
108
+
109
+ Usage: k9 create <sketch_to_generate> <width> <height> <mode>
110
+ mode can be P2D / P3D.
111
+ Use --wrap for a sketch wrapped as a class
112
+ Use --inner to generated a ruby version of 'java' Inner class
113
+ Examples: k9 create app 800 600
114
+ k9 create app 800 600 p3d --wrap
115
+ k9 create inner_class --inner
116
+
117
+ USAGE
118
+ end
119
+ end
120
+
121
+ # This class creates bare sketches, with an optional render mode
122
+ class BasicSketch < Creator
123
+ # Create a blank sketch, given a path.
124
+ def basic_template
125
+ format(BASIC, @title, @width, @height)
126
+ end
127
+
128
+ def basic_template_mode
129
+ format(BASIC_MODE, @title, @width, @height, @mode)
130
+ end
131
+
132
+ def create!(path, args)
133
+ return usage if /\?/ =~ path || /--help/ =~ path
134
+ # Check to make sure that the main file doesn't exist already
135
+ already_exist(path)
136
+ main_file = File.basename(path, '.rb') # allow uneeded extension input
137
+ writer = SketchWriter.new(main_file)
138
+ @title = StringExtra.new(main_file).titleize
139
+ @width = args[0]
140
+ @height = args[1]
141
+ @mode = args[2].upcase unless args[2].nil?
142
+ template = @mode.nil? ? basic_template : basic_template_mode
143
+ writer.save(template)
144
+ end
145
+ end
146
+
147
+ # This class creates class wrapped sketches, with an optional render mode
148
+ class ClassSketch < Creator
149
+ def class_template
150
+ format(CLASS_BASIC, @name, @title, @width, @height)
151
+ end
152
+
153
+ def class_template_mode
154
+ format(CLASS_MODE, @name, @title, @width, @height, @mode)
155
+ end
156
+ # Create a class wrapped sketch, given a path.
157
+ def create!(path, args)
158
+ return usage if /\?/ =~ path || /--help/ =~ path
159
+ main_file = File.basename(path, '.rb') # allow uneeded extension input
160
+ # Check to make sure that the main file doesn't exist already
161
+ already_exist(path)
162
+ @name = CamelString.new(main_file).camelize
163
+ writer = SketchWriter.new(main_file)
164
+ @title = StringExtra.new(main_file).titleize
165
+ @width, @height = args[0], args[1]
166
+ @mode = args[2].upcase unless args[2].nil?
167
+ template = @mode.nil? ? class_template : class_template_mode
168
+ writer.save(template)
169
+ end
170
+ end
171
+
172
+ # This class creates a pseudo 'java inner class' of the sketch
173
+ class Inner < Creator
174
+ def inner_class_template
175
+ format(INNER, @name)
176
+ end
177
+ # Create a pseudo inner class, given a path.
178
+ def create!(path, _args_)
179
+ return usage if /\?/ =~ path || /--help/ =~ path
180
+ main_file = File.basename(path, '.rb') # allow uneeded extension input
181
+ # Check to make sure that the main file doesn't exist already
182
+ already_exist(path)
183
+ @name = main_file.camelize
184
+ writer = SketchWriter.new(main_file)
185
+ template = inner_class_template
186
+ writer.save(template)
187
+ end
188
+ end
189
+ end