getversion 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/getversion/executable.rb +10 -11
- data/lib/getversion/executable_path_finder.rb +43 -0
- data/lib/getversion/executable_store.rb +2 -22
- data/lib/getversion/execution_context.rb +7 -19
- data/lib/getversion/platform_versions.rb +22 -0
- data/lib/getversion/version_finder.rb +53 -0
- data/lib/getversion.rb +9 -4
- metadata +5 -7
- data/lib/getversion/path.rb +0 -28
- data/lib/getversion/path_finder.rb +0 -17
- data/lib/getversion/path_finders/unix_path_finder.rb +0 -10
- data/lib/getversion/path_finders/windows_path_finder.rb +0 -11
- data/lib/getversion/version.rb +0 -43
@@ -1,6 +1,5 @@
|
|
1
|
+
require_relative 'executable_path_finder'
|
1
2
|
require_relative 'execution_context'
|
2
|
-
require_relative 'path_finder'
|
3
|
-
require_relative 'path'
|
4
3
|
|
5
4
|
module GetVersion
|
6
5
|
class Executable
|
@@ -13,20 +12,20 @@ module GetVersion
|
|
13
12
|
@block = block
|
14
13
|
end
|
15
14
|
|
16
|
-
def version
|
17
|
-
|
18
|
-
c.execute &@block if @block
|
19
|
-
end
|
20
|
-
|
21
|
-
def path
|
22
|
-
dir = PathFinder.find_path @name
|
23
|
-
dir = nil if dir == '.'
|
24
|
-
dir ? Path.new(dir, name).evaluated_path : @name
|
15
|
+
def version(dir=nil)
|
16
|
+
ExecutionContext.execute path(dir), &@block
|
25
17
|
end
|
26
18
|
|
27
19
|
def self.version(name, &block)
|
28
20
|
Executable.new(name, nil, &block).version
|
29
21
|
end
|
30
22
|
|
23
|
+
def path(dir=nil)
|
24
|
+
dir ||= ExecutablePathFinder.find_dir @name
|
25
|
+
dir = nil if dir == '.'
|
26
|
+
return @name unless dir
|
27
|
+
File.join dir, @name
|
28
|
+
end
|
29
|
+
|
31
30
|
end
|
32
31
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module GetVersion
|
2
|
+
class ExecutablePathFinder
|
3
|
+
|
4
|
+
def initialize(name)
|
5
|
+
@name = name
|
6
|
+
end
|
7
|
+
|
8
|
+
def find_dir
|
9
|
+
path = find_path
|
10
|
+
File.dirname path if path
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_path
|
14
|
+
is_windows? ? find_path_on_windows : find_path_on_unix
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.find_dir(name)
|
18
|
+
ExecutablePathFinder.new(name).find_dir
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def is_windows?
|
24
|
+
!ENV['WINDIR'].nil?
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_path_on_unix
|
28
|
+
path = `which #{@name}`.strip
|
29
|
+
return if path.empty?
|
30
|
+
real_path = `readlink #{path}`.strip
|
31
|
+
real_path = nil if real_path.empty?
|
32
|
+
real_path || path
|
33
|
+
end
|
34
|
+
|
35
|
+
def find_path_on_windows
|
36
|
+
paths = ENV['PATH'].split ';'
|
37
|
+
extensions = ENV['PATHEXT'].split ';'
|
38
|
+
possibilities = paths.map { |path| extensions.map { |ext| File.join(path, @name + ext.downcase).gsub('/', '\\') } }.flatten
|
39
|
+
possibilities.find { |f| File.exist? f }
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -7,36 +7,16 @@ module GetVersion
|
|
7
7
|
@executables = []
|
8
8
|
end
|
9
9
|
|
10
|
-
def get_version(name)
|
11
|
-
executable = find_executable(name) || null_executable(name)
|
12
|
-
executable.version
|
13
|
-
end
|
14
|
-
|
15
|
-
def guess_version(name)
|
16
|
-
executable = find_executable(name) || executable_for_guessing(name)
|
17
|
-
executable.version
|
18
|
-
end
|
19
|
-
|
20
10
|
def add_executable(name, namespace, &block)
|
21
11
|
@executables << Executable.new(name, namespace, &block)
|
22
12
|
end
|
23
13
|
|
24
|
-
|
25
|
-
|
26
|
-
def find_executable(name)
|
14
|
+
def get_executable(name)
|
27
15
|
@executables.find { |e| e.name == name }
|
28
16
|
end
|
29
17
|
|
30
|
-
def
|
31
|
-
Executable.new name, nil
|
32
|
-
end
|
18
|
+
def get_version(path)
|
33
19
|
|
34
|
-
def executable_for_guessing(name)
|
35
|
-
Executable.new name, nil do
|
36
|
-
args = %w(--version -version /version version --help -help /help help) << nil
|
37
|
-
versions = args.map { |arg| find_version_in_output arg }.compact.uniq
|
38
|
-
versions[0] if versions.length == 1
|
39
|
-
end
|
40
20
|
end
|
41
21
|
|
42
22
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
|
2
|
-
require_relative 'executable'
|
3
|
-
require_relative 'version'
|
1
|
+
require_relative 'platform_versions'
|
4
2
|
|
5
3
|
module GetVersion
|
6
4
|
class ExecutionContext
|
7
5
|
|
6
|
+
include PlatformVersions
|
7
|
+
|
8
8
|
def initialize(path)
|
9
9
|
@path = path
|
10
10
|
end
|
@@ -13,24 +13,12 @@ module GetVersion
|
|
13
13
|
instance_eval &block
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
18
|
-
v = Version.match output
|
19
|
-
v ? v.version : nil
|
20
|
-
end
|
21
|
-
|
22
|
-
def google_appengine_version
|
23
|
-
path = File.dirname @path
|
24
|
-
version_file = File.join path, 'VERSION'
|
25
|
-
YAML::load_file(version_file)['release']
|
16
|
+
def self.execute(path, &block)
|
17
|
+
ExecutionContext.new(path).execute(&block)
|
26
18
|
end
|
27
19
|
|
28
|
-
def
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def windows_version
|
33
|
-
Executable.version('ver') { find_version_in_output }
|
20
|
+
def find_version_in_output(arg=nil)
|
21
|
+
`"#{@path}" #{arg} 2>&1`[/(\d+\.)+\d+/]
|
34
22
|
end
|
35
23
|
|
36
24
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require_relative 'executable'
|
3
|
+
|
4
|
+
module GetVersion
|
5
|
+
module PlatformVersions
|
6
|
+
|
7
|
+
def google_appengine_version
|
8
|
+
dir = File.dirname @path
|
9
|
+
version_file = File.join dir, 'VERSION'
|
10
|
+
YAML::load_file(version_file)['release']
|
11
|
+
end
|
12
|
+
|
13
|
+
def osx_version
|
14
|
+
Executable.version('sw_vers') { find_version_in_output '-productVersion' }
|
15
|
+
end
|
16
|
+
|
17
|
+
def windows_version
|
18
|
+
Executable.version('ver') { find_version_in_output }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'executable'
|
2
|
+
|
3
|
+
module GetVersion
|
4
|
+
class VersionFinder
|
5
|
+
|
6
|
+
def initialize(executable_path, executable_store)
|
7
|
+
@path = executable_path
|
8
|
+
@executable_store = executable_store
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_version
|
12
|
+
get null_executable
|
13
|
+
end
|
14
|
+
|
15
|
+
def guess_version
|
16
|
+
get executable_for_guessing
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def get(executable_if_nil)
|
22
|
+
executable = @executable_store.get_executable(name) || executable_if_nil
|
23
|
+
executable.version dir
|
24
|
+
end
|
25
|
+
|
26
|
+
def path
|
27
|
+
@path
|
28
|
+
end
|
29
|
+
|
30
|
+
def name
|
31
|
+
File.basename path
|
32
|
+
end
|
33
|
+
|
34
|
+
def dir
|
35
|
+
dir = File.dirname path
|
36
|
+
dir = nil if dir == '.'
|
37
|
+
dir
|
38
|
+
end
|
39
|
+
|
40
|
+
def null_executable
|
41
|
+
Executable.new name, nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def executable_for_guessing
|
45
|
+
Executable.new name, nil do
|
46
|
+
args = %w(--version -version /version version --help -help /help help) << nil
|
47
|
+
versions = args.map { |arg| find_version_in_output arg }.compact.uniq
|
48
|
+
versions[0] if versions.length == 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/lib/getversion.rb
CHANGED
@@ -1,19 +1,24 @@
|
|
1
1
|
require_relative 'getversion/executable_store'
|
2
|
+
require_relative 'getversion/version_finder'
|
2
3
|
|
3
4
|
module GetVersion
|
4
5
|
|
5
6
|
@executable_store = ExecutableStore.new
|
6
7
|
|
7
|
-
def self.[](
|
8
|
-
|
8
|
+
def self.[](path)
|
9
|
+
version_finder(path).get_version
|
9
10
|
end
|
10
11
|
|
11
|
-
def self.guess(
|
12
|
-
|
12
|
+
def self.guess(path)
|
13
|
+
version_finder(path).guess_version
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
17
|
|
18
|
+
def self.version_finder(path)
|
19
|
+
VersionFinder.new(path, @executable_store)
|
20
|
+
end
|
21
|
+
|
17
22
|
def self.namespace(namespace)
|
18
23
|
@namespace = namespace
|
19
24
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: getversion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-22 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Provides a standard interface for obtaining CLI application version numbers.
|
15
15
|
email: matthew@matthewriley.name
|
@@ -26,13 +26,11 @@ files:
|
|
26
26
|
- lib/getversion/detectors/uncategorised.rb
|
27
27
|
- lib/getversion/detectors.rb
|
28
28
|
- lib/getversion/executable.rb
|
29
|
+
- lib/getversion/executable_path_finder.rb
|
29
30
|
- lib/getversion/executable_store.rb
|
30
31
|
- lib/getversion/execution_context.rb
|
31
|
-
- lib/getversion/
|
32
|
-
- lib/getversion/
|
33
|
-
- lib/getversion/path_finders/unix_path_finder.rb
|
34
|
-
- lib/getversion/path_finders/windows_path_finder.rb
|
35
|
-
- lib/getversion/version.rb
|
32
|
+
- lib/getversion/platform_versions.rb
|
33
|
+
- lib/getversion/version_finder.rb
|
36
34
|
- lib/getversion.rb
|
37
35
|
- !binary |-
|
38
36
|
YmluL2dldHZlcnNpb24ucmI=
|
data/lib/getversion/path.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
class Path
|
2
|
-
|
3
|
-
def initialize(*path)
|
4
|
-
path.select! { |p| p unless p.empty? }
|
5
|
-
@path = File.join path
|
6
|
-
end
|
7
|
-
|
8
|
-
def evaluated_path
|
9
|
-
return unless @path
|
10
|
-
`echo #{normalised_path}`.strip
|
11
|
-
end
|
12
|
-
|
13
|
-
def normalised_path
|
14
|
-
return unless @path
|
15
|
-
is_windows ? @path.gsub('/', '\\') : @path.gsub('\\', '/')
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_s
|
19
|
-
evaluated_path
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def is_windows
|
25
|
-
!ENV['WINDIR'].nil?
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require_relative 'path_finders/unix_path_finder'
|
2
|
-
require_relative 'path_finders/windows_path_finder'
|
3
|
-
|
4
|
-
class PathFinder
|
5
|
-
|
6
|
-
def self.find_path(executable_name)
|
7
|
-
path_finder = is_windows? ? WindowsPathFinder.new : UnixPathFinder.new
|
8
|
-
path_finder.find_path executable_name
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def self.is_windows?
|
14
|
-
!ENV['WINDIR'].nil?
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class WindowsPathFinder
|
2
|
-
|
3
|
-
def find_path(executable_name)
|
4
|
-
paths = ENV['PATH'].split ';'
|
5
|
-
extensions = ENV['PATHEXT'].split ';'
|
6
|
-
possibilities = paths.map { |path| extensions.map { |ext| File.join(path, executable_name + ext.downcase).gsub('/', '\\') } }.flatten
|
7
|
-
executable = possibilities.select { |exe| File.exist? exe }.first
|
8
|
-
executable ? File.dirname(executable) : nil
|
9
|
-
end
|
10
|
-
|
11
|
-
end
|
data/lib/getversion/version.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
class Version
|
2
|
-
|
3
|
-
VERSION_REGEX = '(?:\d+\.)+(?:\d+)'
|
4
|
-
DELIMITER = '.'
|
5
|
-
|
6
|
-
attr_accessor :version
|
7
|
-
|
8
|
-
def initialize(version)
|
9
|
-
raise "#{version} is not a valid version." unless Version.is_valid? version
|
10
|
-
@version = version
|
11
|
-
end
|
12
|
-
|
13
|
-
def compact
|
14
|
-
first 2, ''
|
15
|
-
end
|
16
|
-
|
17
|
-
def first(count, delimiter=DELIMITER)
|
18
|
-
to_a.first(count).join(delimiter)
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
@version
|
23
|
-
end
|
24
|
-
|
25
|
-
def to_a
|
26
|
-
@version.split DELIMITER
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.match(value)
|
30
|
-
exp = Regexp.new VERSION_REGEX
|
31
|
-
version = value.scan(exp)[0]
|
32
|
-
return unless version
|
33
|
-
Version.new(version)
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def self.is_valid?(version)
|
39
|
-
exp = Regexp.new "^#{VERSION_REGEX}$"
|
40
|
-
version.scan(exp)[0] != nil
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|