rubyjs-vite 1.1.3 → 2.0.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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rjsv +6 -2
  3. data/lib/option_parser.rb +6 -2
  4. data/lib/rjsv/cli/arguments.rb +77 -0
  5. data/lib/rjsv/cli/plugins.rb +71 -0
  6. data/lib/rjsv/cli/signals.rb +15 -0
  7. data/lib/rjsv/constants.rb +8 -0
  8. data/lib/rjsv/core/constants.rb +31 -0
  9. data/lib/rjsv/core/event.rb +24 -0
  10. data/lib/rjsv/core/files.rb +96 -0
  11. data/lib/rjsv/plugin.rb +55 -0
  12. data/lib/rjsv/translate.rb +40 -0
  13. data/lib/rjsv/version.rb +3 -0
  14. data/lib/rjsv/watch.rb +35 -0
  15. data/lib/rjsv.rb +105 -0
  16. data/plugins/scaffold/lib/init.rb +31 -0
  17. data/plugins/scaffold/lib/scaffold/cli/arguments.rb +43 -0
  18. data/plugins/scaffold/lib/scaffold/create.rb +64 -0
  19. data/plugins/scaffold/lib/scaffold/states.rb +40 -0
  20. data/plugins/scaffold/lib/scaffold/vite.rb +13 -0
  21. data/share/scaffold/element/element.js.rb +20 -0
  22. data/share/scaffold/element/init.js.rb +3 -0
  23. data/share/{template → scaffold/web}/.gitignore +2 -0
  24. data/share/{template → scaffold/web}/bin/server +1 -1
  25. data/share/scaffold/web/config/ruby2js.rb +10 -0
  26. data/share/{template → scaffold/web}/index.html +1 -1
  27. data/share/{template → scaffold/web}/package.json +6 -3
  28. data/share/scaffold/web/src/css/style.css +0 -0
  29. data/share/scaffold/web/src/js/env.js +1 -0
  30. metadata +42 -30
  31. data/app/arguments.rb +0 -67
  32. data/app/config.rb +0 -11
  33. data/app/main.rb +0 -75
  34. data/app/signals.rb +0 -4
  35. data/lib/description.rb +0 -10
  36. data/lib/ruby_js/code_join.rb +0 -153
  37. data/lib/ruby_js/constants.rb +0 -7
  38. data/lib/ruby_js/helper.rb +0 -50
  39. data/lib/ruby_js/scaffold.rb +0 -52
  40. data/lib/ruby_js/version.rb +0 -3
  41. data/lib/ruby_js.rb +0 -74
  42. data/share/template/.codejoin +0 -8
  43. data/share/template/bin/generate +0 -3
  44. data/share/template/bin/watch +0 -3
  45. /data/share/{template/src/css/style.css → scaffold/web/.env} +0 -0
  46. /data/share/{template → scaffold/web}/public/vite.svg +0 -0
  47. /data/share/{template/src/rjs/main.rjs → scaffold/web/src/rb/main.js.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 576fb17b237ee647e5d9f84e0ff5cbc365f79e982586ff2e8fa84830e66dbea3
4
- data.tar.gz: 260eefacab7d61466718240bd85c3c3363b469e9b75966a2af746f3790e4f552
3
+ metadata.gz: be5d3678617c35c3ed3a02eb1e9822bb725055fed392f18742262757f0ce9064
4
+ data.tar.gz: 3e0e450c8464c82f8b4795e39c85ee92a3f5c25316ee1a0d63dd3703061e3e1c
5
5
  SHA512:
6
- metadata.gz: d1885cc6c4d236704619bb3493e47e831a1221c187f0cbf4b5c08ab031ef8c359466a54cf3a0b92ee909cc8c0509cfa01f080239929e26107a44a3fb499a891d
7
- data.tar.gz: ba9cbe7ef7845fcaef87f8b2bf2b2a16f79733415b8fdf933715075b5a614acb046359b969a45941d63d0094ad4bb3304f6eaa66d43a83ff314da32a43115de9
6
+ metadata.gz: fa91c0766b29943444a4c872f59306c527b4b27f60fdc4c17793469a6e2ae9cf404a76c9d0a503b150002664279810516befc50bafa13277d567d4a5aee5bbf8
7
+ data.tar.gz: d88354c19f850192b3b77cf6fa80dcafe2401795bc2eeabc9c34bb3cdfbbbd16f6c43ea70f2559032fdaa717a210f292288cf853faf6bec6a5d2beea3a882582
data/bin/rjsv CHANGED
@@ -1,5 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
- $: << File.expand_path("../lib", __dir__)
3
2
 
3
+ APP_NAME = File.basename($0)
4
4
  ROOT = File.expand_path("..", __dir__)
5
- require_relative "../app/main"
5
+ $: << File.join(ROOT, 'lib')
6
+
7
+ require 'rjsv'
8
+
9
+ RJSV.main()
data/lib/option_parser.rb CHANGED
@@ -62,8 +62,12 @@ class OptionParser
62
62
  end
63
63
  end
64
64
  else
65
- flag = @flags[0]
66
- flag[:block].call
65
+ @flags.each do |flag|
66
+ if flag[:short_flag] == '-h' or flag[:long_flag] == '--help'
67
+ flag[:block].call
68
+ break
69
+ end
70
+ end
67
71
  end
68
72
  end
69
73
 
@@ -0,0 +1,77 @@
1
+ module RJSV
2
+ module CLI
3
+ ##
4
+ # Module for all arguments to the CLI application.
5
+ # The argument initializes the OptionParser,
6
+ # which defines the arguments in detail.
7
+ # It is also nested with a function that adds
8
+ # all arguments from modules.
9
+
10
+ module Arguments
11
+ @options = {
12
+ translate: false,
13
+ watch: false,
14
+ source: Dir.pwd,
15
+ output: Dir.pwd,
16
+ }
17
+
18
+ OptionParser.parse do |parser|
19
+ parser.banner(
20
+ "A transpiler tool that translates code\n" +
21
+ "from Ruby to JS language and transforms it into\n" +
22
+ "files that are readable by browsers.\n\n" +
23
+ "Usage: #{APP_NAME} [options]\n" +
24
+ "\nOptions:"
25
+ )
26
+
27
+ Plugins.add_arguments(parser)
28
+
29
+ parser.on( "-w", "--watch", "Monitors all RB files in real time\n" +
30
+ "to see if they have been modified." ) do
31
+ @options[:watch] = true
32
+ end
33
+ parser.on( "-t", "--translate", "It translates all loaded RB files\n" +
34
+ "into JavaScript code and stores them\n" +
35
+ "in certain type files." ) do
36
+ @options[:translate] = true
37
+ end
38
+ parser.on("-s DIR", "--source DIR", "The path of the source folder where\n" +
39
+ "all RB files are found (example of\n" +
40
+ "ending file type *.js.#{RJSV::Constants::SUFFIX_RB}).\n") do |dir|
41
+ @options[:source] = dir
42
+ end
43
+ parser.on("-o DIR", "--output DIR", "The path of the output folder where\n" +
44
+ "all Ruby codes will be translated into\n" +
45
+ "JavaScript with the prepared file type." ) do |dir|
46
+ @options[:output] = dir
47
+ end
48
+
49
+ parser.on( "-h", "--help", "Show help" ) do
50
+ puts parser
51
+ exit
52
+ end
53
+ parser.on( "-v", "--version", "Show version" ) do
54
+ puts "Version is #{RJSV::VERSION}"
55
+ exit
56
+ end
57
+ end
58
+
59
+ ##
60
+ # Options is a get method and gets
61
+ # all options from arguments.
62
+
63
+ def self.options
64
+ @options
65
+ end
66
+
67
+ ##
68
+ # It finds out if the plugin is written in the argument.
69
+
70
+ def self.active_plugin?
71
+ unless ARGV.empty?
72
+ return ARGV[0].index(/^-/) == nil
73
+ end
74
+ end
75
+ end#Arguments
76
+ end
77
+ end
@@ -0,0 +1,71 @@
1
+ module RJSV
2
+ module CLI
3
+ ##
4
+ # This is the module that handles plugins so
5
+ # that they are found, imported and inizialized.
6
+
7
+ module Plugins
8
+ PLUGIN_INFO = "(this is a plugin)"
9
+
10
+ module_function
11
+
12
+ ##
13
+ # Finds all init.rb files in the plugins folder.
14
+ # Otherwise, the absolute path is determined
15
+ # by the Dir.pwd() method.
16
+
17
+ def find_all_init(path = Dir.pwd)
18
+ l_path = lambda { |p| File.join(p, 'plugins', '**', 'init.rb') }
19
+ Dir.glob [
20
+ l_path.call(path),
21
+ l_path.call(ROOT)
22
+ ]
23
+ end
24
+
25
+ ##
26
+ # Imports all found init.rb files into Ruby script.
27
+ #
28
+ # Returns the classes that are imported,
29
+ # otherwise returns an empty array.
30
+
31
+ def require_all_init()
32
+ find_all_init().each do |plugin_index_path|
33
+ require plugin_index_path
34
+ end
35
+
36
+ if defined?(RJSV::Plugins)
37
+ return Core::Constants.get_classes(RJSV::Plugins)
38
+ end
39
+
40
+ return []
41
+ end
42
+
43
+ ##
44
+ # Adds a plugin argument and initializes its nested arguments.
45
+ #
46
+ # It chooses the name and description of the argument
47
+ # to be the one written on behalf of the plugin,
48
+ # which is found from the RJSV::Plugin class.
49
+
50
+ def add_arguments(parser)
51
+ @classes.each_with_index do |plugin_class, i|
52
+ begin
53
+ if plugin_class
54
+ plugin = plugin_class.new
55
+ parser.on(plugin.name, "", "#{plugin.description}\n" +
56
+ "#{PLUGIN_INFO}#{"\n" if @classes.length == i+1}" ) do
57
+ plugin.arguments()
58
+ plugin.init()
59
+ end
60
+ end
61
+ rescue => exception
62
+ Core::Event.print('class', "The program found the '#{plugin_class.name}' class, " +
63
+ "but its arguments cannot be created.\n\n")
64
+ end
65
+ end
66
+ end#add_arguments
67
+
68
+ @classes = require_all_init()
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,15 @@
1
+ module RJSV
2
+ module CLI
3
+ ##
4
+ # Dedicated to all signals for Unix system.
5
+ # Here we find the signal for INT.
6
+
7
+ module Signals
8
+ Signal.trap("INT") do
9
+ puts
10
+ Core::Event.print("exiting")
11
+ exit
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module RJSV
2
+ ##
3
+ # All constant variables.
4
+
5
+ module Constants
6
+ SUFFIX_RB = 'rb'
7
+ end
8
+ end
@@ -0,0 +1,31 @@
1
+ module RJSV
2
+ module Core
3
+ ##
4
+ # The module is reserved for handling classes and modules.
5
+ # Thus, it is a manipulation of constant keywords.
6
+
7
+ module Constants
8
+ module_function
9
+
10
+ ##
11
+ # This method tries to find already initialized
12
+ # classes from the mod (module) using the abstract
13
+ # class RJSV::Plugin. It returns an array of classes.
14
+
15
+ def get_classes(mod)
16
+ mod.constants.map do |c|
17
+ const = mod.const_get(c)
18
+
19
+ if const.is_a?(Class) &&
20
+ const.superclass.name == 'RJSV::Plugin'
21
+ const
22
+ elsif const.is_a? Module
23
+ get_classes(const)
24
+ else
25
+ next
26
+ end
27
+ end.flatten.compact
28
+ end#get_classes
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ module RJSV
2
+ module Core
3
+ ##
4
+ # Event module for handling fifo events. This is
5
+ # so far a module for just the basic event
6
+ # printing element.
7
+
8
+ module Event
9
+ module_function
10
+
11
+ ##
12
+ # Prints an event type using the puts() method
13
+ # that shows the time, cli application name,
14
+ # event and event message.
15
+
16
+ def print(event, message = "")
17
+ supplement = message.empty? ? message : " | #{message}"
18
+
19
+ puts "#{Time.now.strftime("%l:%M:%S %p").lstrip} " +
20
+ "[#{APP_NAME}] #{event.upcase}#{supplement}"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,96 @@
1
+ module RJSV
2
+ module Core
3
+ ##
4
+ # The file module ensures safe handling of files.
5
+ # It always checks if a file really exists on
6
+ # the input path or if a certain folder exists
7
+ # on the output path. It can also change
8
+ # the absolute path or find all necessary files
9
+ # for further manipulation.
10
+
11
+ module Files
12
+ require 'fileutils'
13
+
14
+ module_function
15
+
16
+ ##
17
+ # Opens the file securely and returns the content
18
+ # from the file. If the file does not exist,
19
+ # it returns nil.
20
+
21
+ def open(path)
22
+ if File.exist? path
23
+ File.open path do |f|
24
+ return f.read
25
+ end
26
+ end
27
+
28
+ return nil
29
+ end
30
+
31
+ ##
32
+ # Stores the file with the assigned container
33
+ # by safely discovering its folder and, if necessary,
34
+ # creating it when it does not exist in the path.
35
+ # It can also be assigned a file write mode.
36
+
37
+ def write_with_dir(content, path, mode = 'w+')
38
+ unless Dir.exist? File.dirname(path)
39
+ FileUtils.mkdir_p File.dirname(path)
40
+ end
41
+
42
+ File.open path, mode do |f|
43
+ f.write(content)
44
+ end
45
+ end
46
+
47
+ ##
48
+ # Safely removes the file from the path.
49
+ # If the file is the last one in the folder,
50
+ # the folder is also deleted with the file.
51
+
52
+ def remove(path)
53
+ File.delete(path) if File.exist?(path)
54
+ path_dir = File.dirname(path)
55
+ Dir.delete(path_dir) if Dir.empty?(path_dir)
56
+ end
57
+
58
+ ##
59
+ # The method is special in that it examines arguments
60
+ # from the CLI and modifies the definition
61
+ # path for the output path.
62
+
63
+ def change_path_to_output(path, options_cli)
64
+ path.sub(File.join(Dir.pwd, ''), '')
65
+ .sub(options_cli[:source], '')
66
+ .sub(/\.#{RJSV::Constants::SUFFIX_RB}$/, '')
67
+ .prepend(options_cli[:output])
68
+ end
69
+
70
+ ##
71
+ # Finds all files with the extension '.*.rb'
72
+ # from the defined path.
73
+
74
+ def find_all(path)
75
+ path_all = File.join(path, '**', '*')
76
+ Dir.glob("#{path_all}.*.#{RJSV::Constants::SUFFIX_RB}")
77
+ end
78
+
79
+ ##
80
+ # Copies all files from the input path to the
81
+ # output path. This is a method that copies all
82
+ # files even those that are invisible to the
83
+ # UNIX system (dot file).
84
+
85
+ def copy(path_input, path_output)
86
+ files = Dir.glob("#{path_input}/**/*", File::FNM_DOTMATCH)
87
+ .select { |f| File.file?(f) }
88
+ files.each do |path_file|
89
+ path_cp = path_file.sub(path_input, path_output)
90
+ FileUtils.mkdir_p File.dirname(path_cp)
91
+ FileUtils.cp(path_file, path_cp)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,55 @@
1
+ module RJSV
2
+ ##
3
+ # Abstract 'class' for creating initialization plagins.
4
+ # They are teachable for defining basic information
5
+ # and is the starting point for triggering functions
6
+ # using the init() function. If we are creating
7
+ # a custom plugin, we need to inherit this 'class'
8
+ # into its own 'class'.
9
+
10
+ class Plugin
11
+ ##
12
+ # Description of the plugin that is printed to the CLI during help.
13
+
14
+ def description
15
+ abstract_error('description()')
16
+ end
17
+
18
+ ##
19
+ # This function is not mandatory and automatically
20
+ # defines the 'module' name according to
21
+ # the plugin 'module'.
22
+
23
+ def name
24
+ self.class.name.split('::')[-2].downcase
25
+ end
26
+
27
+ ##
28
+ # The method should pass an initialization
29
+ # method for all arguments of this plugin.
30
+
31
+ def arguments
32
+ abstract_error('arguments()')
33
+ end
34
+
35
+ ##
36
+ # The method that is the main initialization
37
+ # block for the code that the plugin
38
+ # should execute.
39
+
40
+ def init
41
+ abstract_error('init()')
42
+ end
43
+
44
+ private
45
+ ##
46
+ # A private method that raises an error
47
+ # message about an abstract class with
48
+ # a function name.
49
+
50
+ def abstract_error(fn_name)
51
+ raise "The '#{fn_name}' method is abstract, " +
52
+ "it needs to be implemented in a nested '#{self.class.name}' class."
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,40 @@
1
+ module RJSV
2
+ ##
3
+ # Here we can load everything necessary for
4
+ # the transpilation process of Ruby script into JavaScript.
5
+ # The transpilation process uses the Ruby2JS library.
6
+ # The transpilation is safe and catches error messages
7
+ # if the Ruby script has been written incorrectly.
8
+
9
+ module Translate
10
+ require 'ruby2js'
11
+
12
+ module_function
13
+
14
+ ##
15
+ # Converts Ruby script to JavaScript using Ruby2JS library.
16
+ # If an error occurs during transpilation, the error
17
+ # message is raised in the next nested code block.
18
+
19
+ def ruby_to_js(content_ruby, &block)
20
+ begin
21
+ return Ruby2JS.convert(content_ruby)
22
+ rescue => exception
23
+ block.call(exception) if block
24
+ return nil
25
+ end
26
+ end
27
+
28
+ ##
29
+ # Converts Ruby script to JavaScript using Ruby2JS library.
30
+ # The final transpilation is followed by saving it to
31
+ # a file with a predefined path.
32
+
33
+ def ruby_to_js_with_write(content_ruby, path, &block)
34
+ content_js = ruby_to_js(content_ruby) do |err|
35
+ block.call(err) if block
36
+ end
37
+ Core::Files.write_with_dir(content_js, path) if content_js
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,3 @@
1
+ module RJSV
2
+ VERSION = '2.0.0'
3
+ end
data/lib/rjsv/watch.rb ADDED
@@ -0,0 +1,35 @@
1
+ module RJSV
2
+ ##
3
+ # Module for real-time monitoring of files on
4
+ # the local disk. It uses the 'listen' library
5
+ # for this function. There is only one method
6
+ # that can be loaded here which triggers everything.
7
+
8
+ module Watch
9
+ require "listen"
10
+
11
+ module_function
12
+
13
+ ##
14
+ # Tracks modified files in the path that is
15
+ # defined as the source directory. When this
16
+ # function is called, the event listener is triggered
17
+ # for events such as modified, added, and deleted
18
+ # file events. Therefore, the method can put
19
+ # the application to sleep and silently monitor
20
+ # the event process. It watches all files with
21
+ # extension '.*.rb', which asterisk means
22
+ # any sub extension such as '.js'.
23
+
24
+ def modified_files(path, &block)
25
+ listener = Listen.to(path,
26
+ only: /\..*\.#{Constants::SUFFIX_RB}$/
27
+ ) do |m, a, r|
28
+
29
+ block.call(m, a, r) if block
30
+ end
31
+ listener.start
32
+ sleep
33
+ end
34
+ end
35
+ end
data/lib/rjsv.rb ADDED
@@ -0,0 +1,105 @@
1
+ require 'option_parser'
2
+ require 'json_parser'
3
+
4
+ require 'rjsv/version'
5
+ require 'rjsv/constants'
6
+ require 'rjsv/plugin'
7
+
8
+ require 'rjsv/core/event'
9
+ require 'rjsv/core/files'
10
+ require 'rjsv/core/constants'
11
+
12
+ require 'rjsv/cli/signals'
13
+ require 'rjsv/cli/plugins'
14
+ require 'rjsv/cli/arguments'
15
+
16
+ require 'rjsv/translate'
17
+ require 'rjsv/watch'
18
+
19
+ ##
20
+ # This is the main initialization module of
21
+ # all modules that are needed for the functionality
22
+ # of this RubyJS-Vite transpiler. The methods that
23
+ # shape the direction of the application are
24
+ # also written here.
25
+
26
+ module RJSV
27
+ @options_cli = CLI::Arguments.options
28
+
29
+ module_function
30
+
31
+ ##
32
+ # Block of code that handles the transpilation of script.
33
+ # This is opening a Ruby script container file,
34
+ # which is then converted into a JavaScript file.
35
+ # The file is saved to the output path.
36
+
37
+ def translate_state(path)
38
+ if @options_cli[:translate]
39
+ content_ruby = Core::Files.open(path)
40
+ if content_ruby && path
41
+ path_output = Core::Files.change_path_to_output(path, @options_cli)
42
+ Translate.ruby_to_js_with_write(content_ruby, path_output) do |err|
43
+ Core::Event.print('error', "#{path.sub(File.join(Dir.pwd, ''), '')} #{err}")
44
+ return
45
+ end
46
+ Core::Event.print('translated', path_output)
47
+ end
48
+ end
49
+ end
50
+
51
+ ##
52
+ # Block of code that tracks files under the input path.
53
+ # If a file has been logged, several events are performed
54
+ # such as to add, modify and remove logged files.
55
+ # These then trigger procedural methods to process the requests.
56
+
57
+ def watch_state()
58
+ if @options_cli[:watch]
59
+ Core::Event.print('message', 'There is now a watch for edited files.')
60
+ Watch.modified_files(@options_cli[:source]) do |modified, added, removed|
61
+ unless added.empty?
62
+ added.each do |path|
63
+ translate_state(path)
64
+ end
65
+ end
66
+
67
+ unless modified.empty?
68
+ modified.each do |path|
69
+ translate_state(path)
70
+ end
71
+ end
72
+
73
+ unless removed.empty?
74
+ removed.each do |path|
75
+ path_output = Core::Files.change_path_to_output(path, @options_cli)
76
+ Core::Files.remove(path_output)
77
+ Core::Event.print('deleted', path_output)
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end#watch_state
83
+
84
+ ##
85
+ # This is the main function to run the desired
86
+ # block function scenarios. In order to arm itself
87
+ # regarding plugins and directly Arguments,
88
+ # this method checks the accessibility of the plugin
89
+ # by checking if it is active or attached in
90
+ # the argument given by the confirmed command
91
+ # from the terminal.
92
+
93
+ def main()
94
+ unless CLI::Arguments.active_plugin?
95
+ if @options_cli[:translate]
96
+ files_rb = Core::Files.find_all(@options_cli[:source])
97
+ files_rb.each do |path|
98
+ translate_state(path)
99
+ end
100
+ end
101
+
102
+ watch_state()
103
+ end
104
+ end#main
105
+ end
@@ -0,0 +1,31 @@
1
+ module RJSV
2
+ module Plugins
3
+ module Scaffold
4
+ require_relative './scaffold/cli/arguments'
5
+
6
+ require_relative './scaffold/vite'
7
+ require_relative './scaffold/states'
8
+ require_relative './scaffold/create'
9
+
10
+ class Init < RJSV::Plugin
11
+ def initialize
12
+ @arguments_cli = RJSV::Plugins::Scaffold::CLI::Arguments
13
+ end
14
+
15
+ def description
16
+ "Scaffolding can create new\n" +
17
+ "projects or create new elements."
18
+ end
19
+
20
+ def arguments
21
+ @arguments_cli.init(self)
22
+ end
23
+
24
+ def init()
25
+ Scaffold::States.create_web_state(@arguments_cli.options)
26
+ Scaffold::States.create_element_state(@arguments_cli.options)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,43 @@
1
+ module RJSV
2
+ module Plugins
3
+ module Scaffold
4
+ module CLI
5
+ module Arguments
6
+ @options = {
7
+ create_web: nil,
8
+ element: nil,
9
+ }
10
+
11
+ module_function
12
+
13
+ def init(scaffold)
14
+ OptionParser.parse do |parser|
15
+ parser.banner(
16
+ "#{scaffold.description()}\n\n" +
17
+ "Usage: #{APP_NAME} #{scaffold.name()} [options]\n" +
18
+ "\nOptions:"
19
+ )
20
+
21
+ parser.on( "web NAME", "", "Creates a new web project with\n" +
22
+ "a basic code architecture." ) do |name|
23
+ @options[:create_web] = name
24
+ end
25
+ parser.on( "element NAME", "", "Creates scaffolding for the new element.\n" ) do |name|
26
+ @options[:element] = name
27
+ end
28
+
29
+ parser.on( "-h", "--help", "Show help" ) do
30
+ puts parser
31
+ exit
32
+ end
33
+ end
34
+ end
35
+
36
+ def options
37
+ @options
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end