fox 0.0.2
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.
- checksums.yaml +7 -0
- data/.project.yaml +8 -0
- data/AUTHORS.md +22 -0
- data/CHANGELOG.md +0 -0
- data/COPYING.md +11 -0
- data/FAQ.md +7 -0
- data/Gemfile +105 -0
- data/LICENSE.md +11 -0
- data/MAINTAINERS.md +40 -0
- data/README.md +80 -0
- data/Rakefile +29 -0
- data/bin/fox +22 -0
- data/fox.gemspec +132 -0
- data/lib/fox.rb +25 -0
- data/lib/fox/interface/rake/cucumber.rb +36 -0
- data/lib/fox/interface/rake/default.rb +28 -0
- data/lib/fox/interface/rake/documentation.rb +46 -0
- data/lib/fox/interface/rake/guard.rb +13 -0
- data/lib/fox/interface/rake/helpers.rb +27 -0
- data/lib/fox/interface/rake/library.rb +126 -0
- data/lib/fox/interface/rake/metric.rb +13 -0
- data/lib/fox/interface/rake/rspec.rb +31 -0
- data/lib/fox/interface/thor/info.thor +291 -0
- data/lib/fox/interface/thor/mixin/config_choice.rb +27 -0
- data/lib/fox/interface/thor/mixin/configuration.rb +28 -0
- data/lib/fox/interface/thor/mixin/default.rb +30 -0
- data/lib/fox/interface/thor/mixin/default_config.rb +31 -0
- data/lib/fox/interface/thor/mixin/guess.rb +57 -0
- data/lib/fox/interface/thor/mixin/logger.rb +43 -0
- data/lib/fox/interface/thor/mixin/shell.rb +225 -0
- data/lib/fox/interface/thor/version.thor +33 -0
- data/lib/fox/version.rb +13 -0
- data/spec/fox_spec.rb +10 -0
- data/spec/spec_helper.rb +55 -0
- metadata +159 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# @module module Mixin
|
4
|
+
# @brief Mixin module contains various functions to be used in other components
|
5
|
+
module Mixin
|
6
|
+
|
7
|
+
# @module ConfigChoice Module
|
8
|
+
# @brief Module wrapper around ConfigChoice tasks
|
9
|
+
module ConfigChoice
|
10
|
+
|
11
|
+
def config_choice
|
12
|
+
defaults = YAML.load_file(File.expand_path( File.dirname( __FILE__ ) + '/../../../template/default_values.yml'))
|
13
|
+
defaults['jason'].each_key { |key| choice_option(defaults['jason'], key) }
|
14
|
+
defaults
|
15
|
+
end
|
16
|
+
|
17
|
+
private def choice_option(defaults, option)
|
18
|
+
print ("%s (%s): " % [option, defaults[option]])
|
19
|
+
value = STDIN.gets.chomp
|
20
|
+
defaults[option] = value unless value.empty?
|
21
|
+
end
|
22
|
+
end # of module ConfigChoice
|
23
|
+
|
24
|
+
end # of module Mixin
|
25
|
+
|
26
|
+
|
27
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
# @module module Mixin
|
5
|
+
# @brief Mixin module contains various functions to be used in other components
|
6
|
+
module Mixin
|
7
|
+
|
8
|
+
# @module Configuration Module
|
9
|
+
# @brief Module wrapper around tasks which demands config file
|
10
|
+
module Configuration
|
11
|
+
|
12
|
+
# @fn def initialize *args {{{
|
13
|
+
# @brief Default constructor
|
14
|
+
#
|
15
|
+
# @param [Array] args Argument array
|
16
|
+
def initialize *args
|
17
|
+
super
|
18
|
+
unless File.exist?("~/.fox/config.yaml")
|
19
|
+
abort("Could not find configuration file in ~/fox/config.yaml. Please run 'fox config:generate' to generate it.")
|
20
|
+
end
|
21
|
+
end # }}}
|
22
|
+
|
23
|
+
end # of module Configuration
|
24
|
+
|
25
|
+
end # of module Mixin
|
26
|
+
|
27
|
+
|
28
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
# System includes
|
5
|
+
require 'thor'
|
6
|
+
require 'andand'
|
7
|
+
|
8
|
+
|
9
|
+
# @module module Mixin
|
10
|
+
# @brief Mixin module contains various functions to be used in other components
|
11
|
+
module Mixin
|
12
|
+
|
13
|
+
# @module Default Module
|
14
|
+
# @brief Module wrapper around default tasks
|
15
|
+
module Default
|
16
|
+
|
17
|
+
# @fn def initialize *args {{{
|
18
|
+
# @brief Default constructor
|
19
|
+
#
|
20
|
+
# @param [Array] args Argument array
|
21
|
+
def initialize *args
|
22
|
+
super
|
23
|
+
end # }}}
|
24
|
+
|
25
|
+
end # of module Default
|
26
|
+
|
27
|
+
end # of module Mixin
|
28
|
+
|
29
|
+
|
30
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Custom includes
|
4
|
+
require File.expand_path( File.dirname( __FILE__ ) + '/config_choice' )
|
5
|
+
|
6
|
+
# @module module Mixin
|
7
|
+
# @brief Mixin module contains various functions to be used in other components
|
8
|
+
module Mixin
|
9
|
+
|
10
|
+
# @module DefaultConfig Module
|
11
|
+
# @brief Module wrapper around default tasks
|
12
|
+
module DefaultConfig
|
13
|
+
|
14
|
+
# Include various partials
|
15
|
+
include ::Mixin::ConfigChoice
|
16
|
+
|
17
|
+
def defaults
|
18
|
+
config_path = File.expand_path( '~/.fox/config.yml' )
|
19
|
+
if File.exists?(config_path)
|
20
|
+
YAML.load_file(config_path)
|
21
|
+
else
|
22
|
+
FileUtils.mkdir_p( File.expand_path( '~/.fox' ) )
|
23
|
+
config_choice
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end # of module DefaultConfig
|
27
|
+
|
28
|
+
end # of module Mixin
|
29
|
+
|
30
|
+
|
31
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|
@@ -0,0 +1,57 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
# System includes
|
5
|
+
require 'andand'
|
6
|
+
|
7
|
+
|
8
|
+
# @module module Mixin
|
9
|
+
# @brief Mixin module contains various functions to be used in other components
|
10
|
+
module Mixin
|
11
|
+
|
12
|
+
# @module Guess Module
|
13
|
+
# @brief Module wrapper around guess tasks to extract version numbers etc
|
14
|
+
module Guess
|
15
|
+
|
16
|
+
# @fn def initialize *args {{{
|
17
|
+
# @brief Default constructor
|
18
|
+
#
|
19
|
+
# @param [Array] args Argument array
|
20
|
+
def initialize *args
|
21
|
+
super
|
22
|
+
end # }}}
|
23
|
+
|
24
|
+
# @fn def guess_version string {{{
|
25
|
+
# @brief Guess version from full version string
|
26
|
+
#
|
27
|
+
# @example e.g. "ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux]"
|
28
|
+
# -> 2.1.1
|
29
|
+
#
|
30
|
+
# "rake, version 10.1.1"
|
31
|
+
# -> 10.1.1
|
32
|
+
def guess_version string
|
33
|
+
|
34
|
+
result = ""
|
35
|
+
|
36
|
+
begin
|
37
|
+
|
38
|
+
# Sanity
|
39
|
+
raise ArgumentError, "Version has to be of type string" unless( string.is_a?( String ) )
|
40
|
+
raise ArgumentError, "Version can't be empty" if( string.empty? )
|
41
|
+
|
42
|
+
result = string.match( /\d+\.\d+\.\d+/ ).to_s # matches first only
|
43
|
+
|
44
|
+
rescue Exception => e
|
45
|
+
say "(EE) " + e.message, :red
|
46
|
+
result = ""
|
47
|
+
end
|
48
|
+
|
49
|
+
return result
|
50
|
+
end # }}}
|
51
|
+
|
52
|
+
end # of Module Guess
|
53
|
+
|
54
|
+
end # of module Mixin
|
55
|
+
|
56
|
+
|
57
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
# System includes
|
5
|
+
require 'thor'
|
6
|
+
require 'andand'
|
7
|
+
|
8
|
+
# Custom includes
|
9
|
+
# require File.expand_path( File.dirname( __FILE__ ) + '/../../../library/logger' )
|
10
|
+
|
11
|
+
|
12
|
+
# @module module Mixin
|
13
|
+
# @brief Mixin module contains various functions to be used in other components
|
14
|
+
module Mixin
|
15
|
+
|
16
|
+
# @module Logger Module
|
17
|
+
# @brief Module wrapper around logger tasks
|
18
|
+
module Logger
|
19
|
+
|
20
|
+
# @fn def initialize *args {{{
|
21
|
+
# @brief Default constructor
|
22
|
+
#
|
23
|
+
# @param [Array] args Argument array
|
24
|
+
def initialize *args
|
25
|
+
super
|
26
|
+
|
27
|
+
@logger = ::Fox::Logger.instance
|
28
|
+
|
29
|
+
@logger.color = options[ :colorize ]
|
30
|
+
@logger.silent = options[ :silent ]
|
31
|
+
|
32
|
+
end # }}}
|
33
|
+
|
34
|
+
Thor::class_option :colorize, :type => :boolean, :required => false, :default => true, :desc => 'Colorize the output for easier reading'
|
35
|
+
Thor::class_option :logger, :type => :boolean, :required => false, :default => true, :desc => 'Use default project logger'
|
36
|
+
Thor::class_option :silent, :type => :boolean, :required => false, :default => false, :desc => 'Turn off all logging'
|
37
|
+
|
38
|
+
end # of module Logger
|
39
|
+
|
40
|
+
end # of module Mixin
|
41
|
+
|
42
|
+
|
43
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|
@@ -0,0 +1,225 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
|
4
|
+
# System includes
|
5
|
+
require 'andand'
|
6
|
+
require 'ptools'
|
7
|
+
require 'tempfile'
|
8
|
+
|
9
|
+
# Custom includes
|
10
|
+
require File.expand_path( File.dirname( __FILE__ ) + '/guess' )
|
11
|
+
|
12
|
+
|
13
|
+
# @module module Mixin
|
14
|
+
# @brief Mixin module contains various functions to be used in other components
|
15
|
+
module Mixin
|
16
|
+
|
17
|
+
# @module Shell Module
|
18
|
+
# @brief Module wrapper around shell commands
|
19
|
+
module Shell
|
20
|
+
|
21
|
+
include ::Mixin::Guess
|
22
|
+
|
23
|
+
# @fn def initialize *args {{{
|
24
|
+
# @brief Default constructor
|
25
|
+
#
|
26
|
+
# @param [Array] args Argument array
|
27
|
+
def initialize *args
|
28
|
+
super
|
29
|
+
end # }}}
|
30
|
+
|
31
|
+
## Actions
|
32
|
+
|
33
|
+
# @fn def run command {{{
|
34
|
+
# @brief Run the given command gracefully (without throwing exceptions)
|
35
|
+
#
|
36
|
+
# @param [String] command The command to run
|
37
|
+
# @param [RegExp] regexp Optional regular expression used for matching output
|
38
|
+
#
|
39
|
+
# @return [String] Returns empty string if command not found or other problem,
|
40
|
+
# otherwise result of command.
|
41
|
+
def run command, regexp = nil
|
42
|
+
|
43
|
+
result = ''
|
44
|
+
|
45
|
+
begin
|
46
|
+
if( regexp.nil? )
|
47
|
+
result = execute( command ).strip
|
48
|
+
else
|
49
|
+
raise ArgumentError, 'Regular Expression input needs to be of type Regexp' unless( regexp.is_a?( Regexp ) )
|
50
|
+
|
51
|
+
result = execute( command ).andand.send( :match, regexp ).andand.send( :to_s ).strip
|
52
|
+
end
|
53
|
+
|
54
|
+
rescue Exception => e
|
55
|
+
say '(EE) ' + e.message, :red
|
56
|
+
result = ''
|
57
|
+
end
|
58
|
+
|
59
|
+
return result
|
60
|
+
end # }}}
|
61
|
+
|
62
|
+
# @fn def execute command {{{
|
63
|
+
# @brief Execute single shell command
|
64
|
+
#
|
65
|
+
# @param [String] command Shell command string with arguments
|
66
|
+
#
|
67
|
+
# @return [String] Returns result of command
|
68
|
+
#
|
69
|
+
# @throws [ArgumentError] Throws exception if command not found
|
70
|
+
def execute command
|
71
|
+
|
72
|
+
exists = which( command )
|
73
|
+
raise ArgumentError, "Command not found" unless( exists )
|
74
|
+
result = `#{command}`
|
75
|
+
|
76
|
+
return result
|
77
|
+
end # }}}
|
78
|
+
|
79
|
+
# @fn def which command {{{
|
80
|
+
# @brief Checks if command is available
|
81
|
+
#
|
82
|
+
# @param [String] command Shell command string with or without arguments.
|
83
|
+
# If arguments are given, they are split on first
|
84
|
+
# whitespace and discarded
|
85
|
+
#
|
86
|
+
# @return [Boolean] Returns boolean true if command is available, false if not
|
87
|
+
#
|
88
|
+
#
|
89
|
+
# @info Crude alternative: `#{command} 2>/dev/null`.strip.empty?
|
90
|
+
def which command
|
91
|
+
result = false
|
92
|
+
|
93
|
+
begin
|
94
|
+
partial = command.to_s
|
95
|
+
partial = partial.split(' ').first.to_s if( partial =~ %r{ }i )
|
96
|
+
path = File.which( partial )
|
97
|
+
|
98
|
+
result = true unless( path.nil? )
|
99
|
+
rescue Exception => e
|
100
|
+
say "(EE) " + e.message, :red
|
101
|
+
result = false
|
102
|
+
end
|
103
|
+
|
104
|
+
return result
|
105
|
+
end # }}}
|
106
|
+
|
107
|
+
# @fn def version command {{{
|
108
|
+
# @brief Prints the version of given command, if command exists
|
109
|
+
#
|
110
|
+
# @param [String] command Command string to probe version for, e.g. ruby
|
111
|
+
#
|
112
|
+
# @return [String] Returns version string or empty if command not found / error
|
113
|
+
def version command
|
114
|
+
|
115
|
+
result = ""
|
116
|
+
|
117
|
+
begin
|
118
|
+
|
119
|
+
# Sanity
|
120
|
+
raise ArgumentError, "Command not found" unless( which( command ) )
|
121
|
+
|
122
|
+
# Get usage help screen for command
|
123
|
+
help = usage( command )
|
124
|
+
|
125
|
+
# Get version flag from help screen
|
126
|
+
flag = version_flag( help )
|
127
|
+
|
128
|
+
return result if( flag.empty? ) # some stupid commands don't follow standard rules, e.g. bundle
|
129
|
+
|
130
|
+
# Get actual version string
|
131
|
+
banner = run( command + " " + flag )
|
132
|
+
|
133
|
+
# Guess way to extract and extract semver
|
134
|
+
result = guess_version( banner.to_s )
|
135
|
+
|
136
|
+
rescue Exception => e
|
137
|
+
say "(EE) " + e.message, :red
|
138
|
+
result = ""
|
139
|
+
end
|
140
|
+
|
141
|
+
return result
|
142
|
+
end # }}}
|
143
|
+
|
144
|
+
|
145
|
+
alias_method :exists?, :which
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
# @fn def usage command {{{
|
150
|
+
# @brief Extracts help/usage screen from command
|
151
|
+
#
|
152
|
+
# @param [String] command Command string
|
153
|
+
#
|
154
|
+
# @return [String Result screen output string
|
155
|
+
def usage command
|
156
|
+
|
157
|
+
result = ""
|
158
|
+
|
159
|
+
begin
|
160
|
+
|
161
|
+
# Some commands misbehave when using wrong arguments
|
162
|
+
# e.g. java
|
163
|
+
help = []
|
164
|
+
|
165
|
+
# Collect all possible outputs
|
166
|
+
%w(--help -h -help).each do |argument|
|
167
|
+
tempfile = Tempfile.new( "fox-" )
|
168
|
+
`#{command} #{argument} > #{tempfile.path.to_s} 2>&1`
|
169
|
+
help << File.read( tempfile.path )
|
170
|
+
end
|
171
|
+
|
172
|
+
# Prune to relevent one
|
173
|
+
help.each do |h|
|
174
|
+
|
175
|
+
# Sanity
|
176
|
+
next if( h.strip.empty? )
|
177
|
+
next if( h.split( "\n" ).length < 4 )
|
178
|
+
next unless( h.match( /unknown/i ).to_s.empty? ) # does it contain unknown? (argument)
|
179
|
+
next unless( h.match( /unrecognized/i ).to_s.empty? ) # does it contain unrecognized? (argument)
|
180
|
+
next unless( h.match( /error/i ).to_s.empty? ) # does it contain error
|
181
|
+
next unless( h.match( /does not exist/i ).to_s.empty? ) # does not exist error
|
182
|
+
next unless( result.empty? )
|
183
|
+
|
184
|
+
result = h
|
185
|
+
|
186
|
+
end # of help.each
|
187
|
+
|
188
|
+
|
189
|
+
rescue Exception => e
|
190
|
+
say "(EE) " + e.message, :red
|
191
|
+
result = ""
|
192
|
+
end
|
193
|
+
|
194
|
+
return result
|
195
|
+
end # }}}
|
196
|
+
|
197
|
+
# @fn def version_flag usage {{{
|
198
|
+
# @brief Extracts version flag from usage help screen of command
|
199
|
+
#
|
200
|
+
# @param [String] usage Usage help screen output (string), e.g. ruby --help
|
201
|
+
#
|
202
|
+
# @return [String] Returns the string which according to help screen will print version
|
203
|
+
# e.g. -version for java
|
204
|
+
def version_flag usage
|
205
|
+
|
206
|
+
result = ""
|
207
|
+
|
208
|
+
begin
|
209
|
+
result = usage.match( /--version/i ).to_s
|
210
|
+
result = usage.match( /-version/i ).to_s if( result.empty? )
|
211
|
+
rescue Exception => e
|
212
|
+
say "(EE) " + e.message, :red
|
213
|
+
result = ""
|
214
|
+
end
|
215
|
+
|
216
|
+
return result
|
217
|
+
end # }}}
|
218
|
+
|
219
|
+
end # of Module Shell
|
220
|
+
|
221
|
+
end # of module Mixin
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
# vim:ts=2:tw=100:wm=100:syntax=ruby
|