terrun 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/terrun.rb +129 -0
  2. metadata +45 -0
data/lib/terrun.rb ADDED
@@ -0,0 +1,129 @@
1
+ class TerminalOption
2
+ attr_accessor :name, :arg_num, :help, :aliases, :usage
3
+
4
+ def initialize(name, arg_num, help, usage)
5
+ @name = name
6
+ @arg_num = arg_num
7
+ @help = help
8
+ @usage = usage
9
+ @aliases = []
10
+ end
11
+
12
+ def add_alias(alias_name)
13
+ @aliases << alias_name
14
+ end
15
+
16
+ def has_alias?(alias_name)
17
+ @name == alias_name || @aliases.include?(alias_name)
18
+ end
19
+
20
+ def to_s
21
+ result = name
22
+ aliases.each { |a| result << " " + a }
23
+ result << " " + usage
24
+ result << "\n\t" + help
25
+ end
26
+ end
27
+
28
+ class TerminalParam
29
+ attr_accessor :name, :help, :value
30
+
31
+ def initialize(name, help)
32
+ @name = name
33
+ @help = help
34
+ end
35
+ end
36
+
37
+ class TerminalRunner
38
+ @@avail_options = []
39
+ @@avail_params = []
40
+ @@name = ""
41
+
42
+ def self.start(args)
43
+ @@params = {}
44
+ @@options = {}
45
+
46
+ @@avail_params.each do |param|
47
+ param.value = args.shift
48
+ @@params[param.name] = param.value
49
+ if param.value.nil?
50
+ puts "** Missing value for #{param.name} **"
51
+ show_usage
52
+ exit
53
+ end
54
+ end
55
+
56
+ until args.empty?
57
+ option = []
58
+ option_name = get_next_arg(args)
59
+ unless option_details = find_option(option_name)
60
+ puts "Unknown option: '#{option_name}'."
61
+ exit
62
+ end
63
+ (0..option_details.arg_num).each do |i|
64
+ option[i] = args.shift
65
+ if option[i].nil?
66
+ puts "Missing argument for option '#{option_name}'"
67
+ exit
68
+ end
69
+ end
70
+ @@options[option_name] = option
71
+ end
72
+
73
+ self.run
74
+ end
75
+
76
+ def self.run
77
+ puts "Override self.run to start."
78
+ end
79
+
80
+ protected
81
+
82
+ def self.name(name)
83
+ @@name = name
84
+ end
85
+
86
+ def self.option(name, arg_num, usage, help)
87
+ @@avail_options << TerminalOption.new(name, arg_num-1, help, usage)
88
+ end
89
+
90
+ def self.option_alias(name, alias_name)
91
+ return nil unless option = self.find_option(name)
92
+ option.add_alias alias_name
93
+ end
94
+
95
+ def self.help(message)
96
+ @@help = message
97
+ end
98
+
99
+ def self.show_usage
100
+ usage = "Usage: #{@@name}"
101
+ param_help = ""
102
+ @@avail_params.each do |param|
103
+ usage += " <#{param.name}>"
104
+ param_help += "\t#{param.name}\n\t\t#{param.help}\n"
105
+ end
106
+ puts usage + " [options]"
107
+ puts param_help
108
+ puts "Options:"
109
+ @@avail_options.each { |o| puts "\t" + o.to_s.gsub(/\t/, "\t\t") }
110
+ puts "\n#{@@help}"
111
+ end
112
+
113
+ def self.param(name, help)
114
+ @@avail_params << TerminalParam.new(name, help)
115
+ end
116
+
117
+ private
118
+
119
+ def self.get_next_arg(args)
120
+ arg = args.shift
121
+ avail_option = self.find_option arg
122
+ return avail_option.name if avail_option
123
+ arg
124
+ end
125
+
126
+ def self.find_option(name)
127
+ (@@avail_options.select { |o| o.has_alias? name })[0]
128
+ end
129
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: terrun
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Caleb Simpson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-02-25 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Easily create terminal applications.
15
+ email: the.foner@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/terrun.rb
21
+ homepage: http://www.pac.lifemakesuslaugh.com
22
+ licenses: []
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 1.8.24
42
+ signing_key:
43
+ specification_version: 3
44
+ summary: Easily create terminal applications.
45
+ test_files: []