specs 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.
- data/LICENSE.md +23 -0
- data/bin/specs +10 -0
- data/lib/aspects/as.rb +15 -0
- data/lib/aspects/bios.rb +7 -0
- data/lib/aspects/chocolatey.rb +7 -0
- data/lib/aspects/chrome.rb +19 -0
- data/lib/aspects/cpu.rb +14 -0
- data/lib/aspects/firefox.rb +13 -0
- data/lib/aspects/hardware.rb +19 -0
- data/lib/aspects/inkscape.rb +19 -0
- data/lib/aspects/latex.rb +7 -0
- data/lib/aspects/ld.rb +5 -0
- data/lib/aspects/lua.rb +5 -0
- data/lib/aspects/net.rb +5 -0
- data/lib/aspects/node.rb +13 -0
- data/lib/aspects/opera.rb +14 -0
- data/lib/aspects/perl.rb +17 -0
- data/lib/aspects/powershell.rb +7 -0
- data/lib/aspects/ram.rb +11 -0
- data/lib/aspects/ruby.rb +13 -0
- data/lib/aspects/shell.rb +9 -0
- data/lib/aspects/virtualbox.rb +17 -0
- data/lib/aspects/xcode.rb +7 -0
- data/lib/specs.rb +266 -0
- metadata +69 -0
data/LICENSE.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# FreeBSD License
|
2
|
+
|
3
|
+
# Copyright 2012 Andrew Pennebaker. All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
9
|
+
list of conditions and the following disclaimer.
|
10
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation and/or
|
12
|
+
other materials provided with the distribution.
|
13
|
+
|
14
|
+
THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
15
|
+
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
16
|
+
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
17
|
+
SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
18
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
19
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
20
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
21
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
22
|
+
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
23
|
+
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/bin/specs
ADDED
data/lib/aspects/as.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.as
|
3
|
+
# Windows
|
4
|
+
if Os.windows?
|
5
|
+
"as -version"
|
6
|
+
# Assume OS is a Unix variant.
|
7
|
+
# as hangs by default, waiting for stdin to end;
|
8
|
+
# Send EOF via /dev/null.
|
9
|
+
#
|
10
|
+
# Don't create spurious a.out file.
|
11
|
+
else
|
12
|
+
"as -o /dev/null -version < /dev/null"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/aspects/bios.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.chrome
|
3
|
+
# Assumes Chrome installed in default directory.
|
4
|
+
if Os.mac?
|
5
|
+
"/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --version 2>&1 | grep -v Unsure" # Redirect stderr to stdout
|
6
|
+
elsif Os.windows?
|
7
|
+
if Os.x86_64?
|
8
|
+
"%UserProfile%\\AppData\\Local\\Google\\Chrome\\Application\\chrome --version"
|
9
|
+
else
|
10
|
+
"\"C:\\Program Files\\Google\\Chrome\\Application\\chrome\" --version"
|
11
|
+
end
|
12
|
+
# Assumes
|
13
|
+
# * binary is google-chrome.
|
14
|
+
# * binary is in PATH.
|
15
|
+
else
|
16
|
+
"google-chrome --version"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/aspects/cpu.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.cpu
|
3
|
+
if Os.windows?
|
4
|
+
"wmic cpu get NumberOfCores, NumberOfLogicalProcessors"
|
5
|
+
elsif Os.mac?
|
6
|
+
[
|
7
|
+
"system_profiler | grep Cores: ",
|
8
|
+
"system_profiler | grep Processors:"
|
9
|
+
]
|
10
|
+
else
|
11
|
+
"cat /proc/cpuinfo | grep processor | wc -l"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.firefox
|
3
|
+
# Assumes Firefox is installed in the default directory.
|
4
|
+
if Os.windows?
|
5
|
+
"C:\\Program Files (x86)\\Mozilla Firefox\\firefox --version"
|
6
|
+
elsif Os.mac?
|
7
|
+
"/Applications/Firefox.app/Contents/MacOS/firefox --version"
|
8
|
+
# Assumes firefox in PATH.
|
9
|
+
else
|
10
|
+
"firefox --version"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Module name must be filename, minus .rb, in CamelCase.
|
2
|
+
module Recipe
|
3
|
+
# ModuleName.command returns the appropriate command line instruction for returning the relevant specifications.
|
4
|
+
# OS-contextual instructions can be modulated by querying the Os module (see the root specs Ruby code).
|
5
|
+
def self.hardware
|
6
|
+
# Use environment variable.
|
7
|
+
if Os.windows?
|
8
|
+
"systeminfo | findstr /B /C:\"System Manufacturer\" /C:\"System Model\""
|
9
|
+
# Produces a noticeable delay.
|
10
|
+
elsif Os.mac?
|
11
|
+
"system_profiler | grep 'Model Identifier'"
|
12
|
+
# Assume:
|
13
|
+
# * OS is a Unix variant.
|
14
|
+
# * dmidecode is installed.
|
15
|
+
else
|
16
|
+
"sudo dmidecode -t system | grep Manufacturer|Product"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.inkscape
|
3
|
+
# Assumes Inkscape is installed in default directory.
|
4
|
+
if Os.windows?
|
5
|
+
if Os.x86_64?
|
6
|
+
"C:\\Program Files (x86)\\Inkscape\\inkscape --version"
|
7
|
+
elsif Os.x86?
|
8
|
+
"\"C:\\Program Files\\Inkscape\\inkscape\" --version"
|
9
|
+
end
|
10
|
+
elsif Os.mac?
|
11
|
+
"/Applications/Inkscape.app/Contents/Resources/bin/inkscape --version"
|
12
|
+
# Assumes:
|
13
|
+
# * OS is a Unix variant.
|
14
|
+
# * inkscape is in PATH.
|
15
|
+
else
|
16
|
+
"inkscape --version"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/aspects/ld.rb
ADDED
data/lib/aspects/lua.rb
ADDED
data/lib/aspects/net.rb
ADDED
data/lib/aspects/node.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.opera
|
3
|
+
# Assumes opera in PATH.
|
4
|
+
if Os.unix? and not Os.mac?
|
5
|
+
"opera -version"
|
6
|
+
# Opera for Mac/Windows does not support the -version command line option.
|
7
|
+
# # Assumes Opera is installed in the default directory.
|
8
|
+
# elsif Os.mac?
|
9
|
+
# "/Applications/Opera.app/Contents/MacOS/Opera -version"
|
10
|
+
# elsif Os.windows?
|
11
|
+
# "C:\\Program Files (x86)\\Opera\\opera -version"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/aspects/perl.rb
ADDED
data/lib/aspects/ram.rb
ADDED
data/lib/aspects/ruby.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Recipe
|
2
|
+
def self.virtualbox
|
3
|
+
# Assumes Firefox is installed in the default directory.
|
4
|
+
if Os.windows?
|
5
|
+
if Os.x86?
|
6
|
+
"\"C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage\" --version"
|
7
|
+
elsif Os.x86_64?
|
8
|
+
"C:\\Program Files (x86)\\Oracle\\VirtualBox\\VBoxManage --version"
|
9
|
+
end
|
10
|
+
elsif Os.mac?
|
11
|
+
"/Applications/Firefox.app/Contents/MacOS/firefox --version"
|
12
|
+
# Assumes firefox in PATH.
|
13
|
+
else
|
14
|
+
"firefox --version"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/specs.rb
ADDED
@@ -0,0 +1,266 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Author:: Andrew Pennebaker
|
4
|
+
#
|
5
|
+
# Copyright:: Copyright 2012 Andrew Pennebaker
|
6
|
+
#
|
7
|
+
# == Synopsis
|
8
|
+
#
|
9
|
+
# specs - Get system specs easily
|
10
|
+
#
|
11
|
+
# == Usage
|
12
|
+
#
|
13
|
+
# specs [aspects]
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
#
|
17
|
+
# specs ruby os hardware
|
18
|
+
#
|
19
|
+
# By default, aspects are os and hardware.
|
20
|
+
#
|
21
|
+
# If an aspect is not installed, its output may be omitted.
|
22
|
+
#
|
23
|
+
# --help, -h:
|
24
|
+
# show usage info for specs
|
25
|
+
#
|
26
|
+
# --version, -v:
|
27
|
+
# print specs' own version
|
28
|
+
|
29
|
+
require "getoptlong"
|
30
|
+
|
31
|
+
require "pathname"
|
32
|
+
|
33
|
+
SPECS_VERSION = "0.2"
|
34
|
+
SPECS_VERSION_STRING = "specs #{SPECS_VERSION}"
|
35
|
+
SPECS_HOME_PAGE = "https://github.com/mcandre/specs#readme"
|
36
|
+
|
37
|
+
SPECS_DIR = Pathname.new(File.dirname(__FILE__))
|
38
|
+
|
39
|
+
# Get the basic operating system name reliably, even in JRuby
|
40
|
+
# Useful for OS-contextual command line instructions.
|
41
|
+
#
|
42
|
+
# E.g., "C:\Program Files (x86)\Mozilla Firefox\firefox --version" in Windows vs
|
43
|
+
# "/Applications/Firefox.app/Contents/MacOS/firefox --version" in Mac vs
|
44
|
+
# "firefox --version" in Unix
|
45
|
+
#
|
46
|
+
module Os
|
47
|
+
def self.raw
|
48
|
+
# Config deprecated in Ruby 1.9
|
49
|
+
RbConfig::CONFIG["host_os"]
|
50
|
+
end
|
51
|
+
|
52
|
+
# A series of OS descriptions.
|
53
|
+
# Not all of these are mutually exclusive.
|
54
|
+
|
55
|
+
def self.windows?
|
56
|
+
self.raw =~ /cygwin|mswin|mingw|bccwin|wince|emx/
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.mingw?
|
60
|
+
self.raw =~ /cygwin|mingw/
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.mac?
|
64
|
+
self.raw =~ /darwin/
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.unix?
|
68
|
+
not self.windows?
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.haiku?
|
72
|
+
self.raw =~ /haiku/
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.linux?
|
76
|
+
self.unix? and not self.mac? and not self.haiku?
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.x86_64?
|
80
|
+
RbConfig::CONFIG["arch"] =~ /64/
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.x86?
|
84
|
+
!self.x86_64?
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
module Recipe
|
89
|
+
def self.command_not_found
|
90
|
+
# Windows but not MinGW
|
91
|
+
if Os.windows? and !Os.mingw?
|
92
|
+
"not recognized as an internal or external command"
|
93
|
+
# MinGW or other Unix variant.
|
94
|
+
else
|
95
|
+
"command not found"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.os
|
100
|
+
if Os.windows?
|
101
|
+
"systeminfo | findstr /B /C:\"OS Name\" /C:\"OS Version\""
|
102
|
+
elsif Os.mac?
|
103
|
+
"system_profiler SPSoftwareDataType | grep 'System Version'"
|
104
|
+
elsif Os.linux?
|
105
|
+
"lsb_release -a"
|
106
|
+
# Unix
|
107
|
+
else
|
108
|
+
"uname -a"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def self.arch
|
113
|
+
"ruby -rrbconfig -e 'puts RbConfig::CONFIG[\"arch\"]'"
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.specs
|
117
|
+
SPECS_VERSION_STRING
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.ruby_v
|
121
|
+
RUBY_VERSION
|
122
|
+
end
|
123
|
+
|
124
|
+
def self.ruby1_8?
|
125
|
+
RUBY_VERSION =~ /^1\.8/
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.ruby1_9?
|
129
|
+
RUBY_VERSION =~ /^1\.9/
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.rubygems
|
133
|
+
"gem --version"
|
134
|
+
end
|
135
|
+
|
136
|
+
def self.rb
|
137
|
+
"ruby --version"
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.ruby
|
141
|
+
[rubygems, rb]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
BUILTINS = ["specs", "os", "arch", "ruby"]
|
146
|
+
|
147
|
+
SEP = File::SEPARATOR
|
148
|
+
|
149
|
+
# .../specs/aspects
|
150
|
+
RECIPE_DIR = [SPECS_DIR, "aspects"].join(SEP)
|
151
|
+
|
152
|
+
# For a given spec, return the command line instruction(s)
|
153
|
+
# that will get the spec's version information.
|
154
|
+
def command(aspect)
|
155
|
+
# Custom aspect?
|
156
|
+
if !BUILTINS.include?(aspect)
|
157
|
+
require_path = "#{RECIPE_DIR}#{SEP}#{aspect}.rb"
|
158
|
+
|
159
|
+
# Attempt to load custom aspect recipe.
|
160
|
+
if File.exist?(require_path)
|
161
|
+
require require_path
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Ruby methods can't use hypens (-),
|
166
|
+
# So translate to underscores (_)
|
167
|
+
# When looking up known aspects.
|
168
|
+
method = aspect.gsub("-", "_").to_sym
|
169
|
+
|
170
|
+
# Known aspect.
|
171
|
+
if Recipe.methods.include?(method)
|
172
|
+
Recipe.send(method)
|
173
|
+
# Unknown aspect.
|
174
|
+
# Default to --version flag.
|
175
|
+
else
|
176
|
+
"#{aspect} --version"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Print a command line instruction and its output,
|
181
|
+
# Emulating a user manually entering the instruction.
|
182
|
+
def run(cmd, aspect)
|
183
|
+
# Newline to visually separate multiple aspect commands.
|
184
|
+
puts ""
|
185
|
+
|
186
|
+
if cmd.nil?
|
187
|
+
puts "#{aspect} aspect not implemented for this system"
|
188
|
+
|
189
|
+
elsif cmd == SPECS_VERSION_STRING
|
190
|
+
puts "specs --version"
|
191
|
+
puts SPECS_VERSION_STRING
|
192
|
+
else
|
193
|
+
puts cmd
|
194
|
+
|
195
|
+
output = `#{cmd} 2>&1`
|
196
|
+
|
197
|
+
if output.include?(Recipe.command_not_found)
|
198
|
+
puts "#{cmd.split.first} not found"
|
199
|
+
else
|
200
|
+
puts output
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def usage
|
206
|
+
system "more specs.rb"
|
207
|
+
exit
|
208
|
+
end
|
209
|
+
|
210
|
+
def print_specs_own_version
|
211
|
+
puts SPECS_VERSION_STRING
|
212
|
+
puts SPECS_HOME_PAGE
|
213
|
+
end
|
214
|
+
|
215
|
+
def check_ruby_version
|
216
|
+
if RUBY_VERSION =~ /^1\.8/
|
217
|
+
puts "Requires Ruby 1.9+"
|
218
|
+
puts "http://www.ruby-lang.org/"
|
219
|
+
exit
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def main
|
224
|
+
check_ruby_version
|
225
|
+
|
226
|
+
opts = GetoptLong.new(
|
227
|
+
["--help", "-h", GetoptLong::NO_ARGUMENT],
|
228
|
+
["--version", "-v", GetoptLong::NO_ARGUMENT]
|
229
|
+
)
|
230
|
+
|
231
|
+
begin
|
232
|
+
opts.each { |option, value|
|
233
|
+
case option
|
234
|
+
when "--help"
|
235
|
+
usage
|
236
|
+
when "--version"
|
237
|
+
print_specs_own_version
|
238
|
+
end
|
239
|
+
}
|
240
|
+
rescue GetoptLong::InvalidOption
|
241
|
+
usage
|
242
|
+
end
|
243
|
+
|
244
|
+
# Default aspects
|
245
|
+
aspects = ["specs", "os", "hardware"]
|
246
|
+
if !ARGV.empty?
|
247
|
+
aspects = ARGV
|
248
|
+
end
|
249
|
+
|
250
|
+
aspects = aspects - ["specs"]
|
251
|
+
puts "Specs:\n\n"
|
252
|
+
print_specs_own_version
|
253
|
+
|
254
|
+
aspects.each { |aspect|
|
255
|
+
# What does the aspect module say to run
|
256
|
+
# in order to retrieve the aspect information?
|
257
|
+
cmds = command(aspect)
|
258
|
+
|
259
|
+
if cmds.nil? or cmds.instance_of?(String)
|
260
|
+
run(cmds, aspect)
|
261
|
+
# Module returns an array of command strings.
|
262
|
+
elsif cmds.instance_of?(Array)
|
263
|
+
cmds.each { |cmd| run(cmd, aspect) }
|
264
|
+
end
|
265
|
+
}
|
266
|
+
end
|
metadata
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: specs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Pennebaker
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-15 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: See README.md for example usage
|
15
|
+
email: andrew.pennebaker@gmail.com
|
16
|
+
executables:
|
17
|
+
- specs
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/specs.rb
|
22
|
+
- lib/aspects/as.rb
|
23
|
+
- lib/aspects/bios.rb
|
24
|
+
- lib/aspects/chocolatey.rb
|
25
|
+
- lib/aspects/chrome.rb
|
26
|
+
- lib/aspects/cpu.rb
|
27
|
+
- lib/aspects/firefox.rb
|
28
|
+
- lib/aspects/hardware.rb
|
29
|
+
- lib/aspects/inkscape.rb
|
30
|
+
- lib/aspects/latex.rb
|
31
|
+
- lib/aspects/ld.rb
|
32
|
+
- lib/aspects/lua.rb
|
33
|
+
- lib/aspects/net.rb
|
34
|
+
- lib/aspects/node.rb
|
35
|
+
- lib/aspects/opera.rb
|
36
|
+
- lib/aspects/perl.rb
|
37
|
+
- lib/aspects/powershell.rb
|
38
|
+
- lib/aspects/ram.rb
|
39
|
+
- lib/aspects/ruby.rb
|
40
|
+
- lib/aspects/shell.rb
|
41
|
+
- lib/aspects/virtualbox.rb
|
42
|
+
- lib/aspects/xcode.rb
|
43
|
+
- LICENSE.md
|
44
|
+
- bin/specs
|
45
|
+
homepage: https://github.com/mcandre/specs
|
46
|
+
licenses: []
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options: []
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.8.24
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: Software version information at your fingertips
|
69
|
+
test_files: []
|