commands-lite 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +1 -0
- data/lib/commands-lite.rb +16 -0
- data/lib/commands-lite/base.rb +129 -0
- data/lib/commands-lite/version.rb +17 -2
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 693a3892801a9f29d308e2bbd6886525d9303b51
|
4
|
+
data.tar.gz: acfebd670a7edd788d13be8793e1a1cb555bb399
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2f82d4b9e01c7277c354d1d6f574934bede60a868f17c44b2c77a6fa434187a606e3703115347b31f7df2643d8ba1ba8a20461c3e10a9e2931462049e57dfa8
|
7
|
+
data.tar.gz: e57c909ce8dd6c7f302023cbd4f981d006f3ce0021c074d974a064637fbec43b7c7766b3f6c55f4c1be1cd2d9c2006276ed9c354d6dde187106c2d9b03794fb0
|
data/Manifest.txt
CHANGED
data/lib/commands-lite.rb
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
require 'pp'
|
2
|
+
require 'time'
|
3
|
+
require 'date' ## e.g. Date.today etc.
|
4
|
+
require 'yaml'
|
5
|
+
require 'json'
|
6
|
+
require 'fileutils' ## e.g. FileUtils.mkdir_p etc.
|
7
|
+
require 'optparse'
|
8
|
+
|
9
|
+
|
10
|
+
|
1
11
|
#####################
|
2
12
|
# our own code
|
3
13
|
require 'commands-lite/version' # note: let version always go first
|
14
|
+
require 'commands-lite/base'
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
# say hello
|
19
|
+
puts CommandsLite.banner
|
@@ -0,0 +1,129 @@
|
|
1
|
+
class Command
|
2
|
+
|
3
|
+
def self.option_defs
|
4
|
+
@option_defs ||= {}
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.option( key, *args )
|
8
|
+
option_defs[ key ] = args
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
def options
|
14
|
+
@options ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse!( args )
|
18
|
+
### todo/check - cache option parser!!!! - why? why not?
|
19
|
+
OptionParser.new do |parser|
|
20
|
+
## add default banner - overwrite if needed/to customize
|
21
|
+
parser.banner = <<TXT
|
22
|
+
|
23
|
+
Usage: #{name} [OPTIONS] ARGUMENTS
|
24
|
+
|
25
|
+
TXT
|
26
|
+
|
27
|
+
self.class.option_defs.each do | key, on_args|
|
28
|
+
parser.on( *on_args ) do |value|
|
29
|
+
options[ key ] = value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end.parse!( args )
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
def self.run( args=[] )
|
38
|
+
command = new
|
39
|
+
|
40
|
+
puts "--> (#{command.name}) #{args.join('·')}"
|
41
|
+
|
42
|
+
## check for options
|
43
|
+
command.parse!( args )
|
44
|
+
|
45
|
+
puts " #{command.options.size} opt(s): #{command.options.pretty_inspect}"
|
46
|
+
puts " #{args.size} arg(s):"
|
47
|
+
args.each_with_index do |arg,i|
|
48
|
+
puts " #{[i]} >#{arg}<"
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
if args.size > 0
|
53
|
+
## todo/check: check/verify arity of run - why? why not?
|
54
|
+
command.call( *args ) ## use run - why? why not?
|
55
|
+
else
|
56
|
+
command.call
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def self.command_name
|
62
|
+
## note: cut-off leading Yorobot:: for now in class name!!!
|
63
|
+
## note: always remove _ for now too!!!
|
64
|
+
## note: do NOT use @@name!!! - one instance variable per class needed!!
|
65
|
+
@name ||= self.name.downcase
|
66
|
+
.sub( /^yorobot::/, '' ) ## todo/fix: make "exclude" list configure-able why? why not?
|
67
|
+
.gsub( /[_-]/, '' )
|
68
|
+
@name
|
69
|
+
end
|
70
|
+
|
71
|
+
def name() self.class.command_name; end
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
def self.inherited( klass )
|
78
|
+
# puts klass.class.name #=> Class
|
79
|
+
## auto-register commands for now - why? why not?
|
80
|
+
Commands.register( klass )
|
81
|
+
end
|
82
|
+
|
83
|
+
end # class Command
|
84
|
+
|
85
|
+
|
86
|
+
############################
|
87
|
+
# Commands/Commander registry
|
88
|
+
class Commands ## todo/check: use Commander/Command{Index,Registry,...} or such - why? why not?
|
89
|
+
|
90
|
+
def self.commands ## todo/check: change to registry or such - why? why not?
|
91
|
+
@@register ||= {}
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.register( klass )
|
95
|
+
raise ArgumentError, "class MUST be a Command" unless klass.ancestors.include?( Command )
|
96
|
+
|
97
|
+
h = commands
|
98
|
+
h[ klass.command_name] = klass
|
99
|
+
h
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
def self.run( args=[] )
|
104
|
+
command_name = args.shift
|
105
|
+
|
106
|
+
## 1) downcase e.g. GithubStats
|
107
|
+
## 2) remove - to _ ## treat them the same e.g. github-stats => github_stats
|
108
|
+
command_name = command_name
|
109
|
+
.gsub( /[_-]/, '' )
|
110
|
+
.downcase
|
111
|
+
|
112
|
+
command = commands[ command_name ]
|
113
|
+
if command.nil?
|
114
|
+
puts "!! ERROR: no command definition found for >#{command_name}<; known commands include:"
|
115
|
+
pp commands
|
116
|
+
exit 1
|
117
|
+
end
|
118
|
+
|
119
|
+
command.run( args )
|
120
|
+
end
|
121
|
+
|
122
|
+
end # class Commands
|
123
|
+
|
124
|
+
|
125
|
+
###########################
|
126
|
+
## add a alias / alternative name - why? why not
|
127
|
+
Commander = Commands
|
128
|
+
|
129
|
+
|
@@ -1,5 +1,20 @@
|
|
1
1
|
module CommandsLite
|
2
|
-
VERSION='0.0.1'
|
3
|
-
end
|
4
2
|
|
3
|
+
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
4
|
+
MINOR = 1
|
5
|
+
PATCH = 0
|
6
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
5
7
|
|
8
|
+
def self.version
|
9
|
+
VERSION
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.banner
|
13
|
+
"commands-lite/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.root
|
17
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
|
18
|
+
end
|
19
|
+
|
20
|
+
end # module CommandsLite
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: commands-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- README.md
|
60
60
|
- Rakefile
|
61
61
|
- lib/commands-lite.rb
|
62
|
+
- lib/commands-lite/base.rb
|
62
63
|
- lib/commands-lite/version.rb
|
63
64
|
homepage: https://github.com/rubycoco/git
|
64
65
|
licenses:
|