sqt 1.0.1
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/bin/sqt +74 -0
- data/lib/sqt.rb +81 -0
- metadata +80 -0
data/bin/sqt
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#!/usr/bin/env ruby
|
3
|
+
|
4
|
+
require 'sqt'
|
5
|
+
|
6
|
+
options = {}
|
7
|
+
paths = []
|
8
|
+
filesProperties = []
|
9
|
+
|
10
|
+
# Définition des options du script
|
11
|
+
OptionParser.new do |opts|
|
12
|
+
opts.banner = "Sarbotte Quality Tool"
|
13
|
+
opts.separator "Utilisation : rb [options]"
|
14
|
+
|
15
|
+
opts.on("-f", "--file FILE", "Fichier à sarbottiser.") do |f|
|
16
|
+
options[:file] = f || ""
|
17
|
+
end
|
18
|
+
|
19
|
+
opts.on("-p", "--path [PATH]", "Répertoire à sarbottiser.") do |p|
|
20
|
+
options[:path] = p || "."
|
21
|
+
end
|
22
|
+
|
23
|
+
opts.on("-e", "--extension [EXTENSION]", "Extension recherchée.") do |e|
|
24
|
+
options[:extension] = e || ""
|
25
|
+
end
|
26
|
+
|
27
|
+
opts.on("-c", "--curl [URL]", "Curl.") do |u|
|
28
|
+
options[:url] = u || ""
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-w", "--write [FILENAME]", "Écrit les résultats dans un fichier.") do |w|
|
32
|
+
options[:fileName] = w || "Sarbotte Quality.txt"
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("-h", "--help", "Affiche l'aide.") do
|
36
|
+
puts opts
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
end.parse!
|
40
|
+
|
41
|
+
# Si le chemin d'un répertoire est donné en option
|
42
|
+
if options[:path]
|
43
|
+
paths = findFiles(options[:path], options[:extension])
|
44
|
+
end
|
45
|
+
|
46
|
+
# Si le chemin vers un fichier est donné en option
|
47
|
+
if options[:file]
|
48
|
+
paths << options[:file]
|
49
|
+
end
|
50
|
+
|
51
|
+
# Si on a pu trouver des chemins de fichiers
|
52
|
+
unless paths.empty?
|
53
|
+
paths.each do |path|
|
54
|
+
file = File.read path
|
55
|
+
filesProperties << buildResult(path, file)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Si une url est donnée en option
|
60
|
+
if options[:url]
|
61
|
+
require 'curb'
|
62
|
+
http = Curl.get(options[:url])
|
63
|
+
file = http.body_str
|
64
|
+
filesProperties << buildResult(options[:url], file)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Si on a pu calculer le sqi d'un ou plusieurs fichiers
|
68
|
+
unless filesProperties.empty?
|
69
|
+
filesProperties.sort_by! { |a| a[:sqi]}
|
70
|
+
printResults(filesProperties, options)
|
71
|
+
if options[:fileName]
|
72
|
+
writeResults(filesProperties, options)
|
73
|
+
end
|
74
|
+
end
|
data/lib/sqt.rb
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# Sarbotte Quality Tool v1.0
|
4
|
+
# Sarbotte Designs
|
5
|
+
# Open Sarbotte License
|
6
|
+
|
7
|
+
require 'optparse'
|
8
|
+
require 'nokogiri'
|
9
|
+
|
10
|
+
require 'colorize'
|
11
|
+
require 'win32console'
|
12
|
+
|
13
|
+
# Trouver des fichiers en fonction d'un chemin et d'une extension
|
14
|
+
def findFiles(path, extension)
|
15
|
+
path.gsub!('\\', File::SEPARATOR)
|
16
|
+
Dir["#{path}/**/*\.#{extension}"]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Récupère le nombre de caractères dans les balises script et style d'un fichier
|
20
|
+
def getJsAndCssLength(file)
|
21
|
+
xmlFile = Nokogiri::HTML(file)
|
22
|
+
jsLength = xmlFile.search('//script').reduce(0) { |total, script| total + script.text.bytesize }
|
23
|
+
jsAndCssLength = xmlFile.search('//style').reduce(jsLength) { |total, style| total + style.text.bytesize }
|
24
|
+
end
|
25
|
+
|
26
|
+
# Définit le Sarbotte Quality Index d'un fichier
|
27
|
+
def sarbotteQuality(jsAndCss, total)
|
28
|
+
(1 - jsAndCss.to_f/total.to_f) * 100
|
29
|
+
end
|
30
|
+
|
31
|
+
# Affiche en console les résultats
|
32
|
+
def printResults(filesProperties, options)
|
33
|
+
system ("cls")
|
34
|
+
puts "\nSarbotte Quality Tool\n".colorize( :cyan )
|
35
|
+
if options[:path] then
|
36
|
+
puts "Chemin : " + options[:path] + "\n\n"
|
37
|
+
end
|
38
|
+
if filesProperties.size > 1 then
|
39
|
+
average = filesProperties.reduce(0) { |total, fP| total + fP[:sqi] }.to_f / filesProperties.size
|
40
|
+
print "Moyenne : "
|
41
|
+
puts "#{'%.2f' % average}".colorize( average < 0.5 ? :red : average < 0.8 ? :yellow : :green )
|
42
|
+
puts ""
|
43
|
+
end
|
44
|
+
puts "Fichiers : "
|
45
|
+
filesProperties.each do |fP|
|
46
|
+
sqi = fP[:sqi]
|
47
|
+
print " #{fP[:uri].gsub(options[:path] && options[:path] != "." ? options[:path] : "", "")} : "
|
48
|
+
print "#{'%.2f' % fP[:sqi]}".colorize( sqi < 50 ? :red : sqi < 80 ? :yellow : :green )
|
49
|
+
puts " (#{fP[:jsAndCssLength]}/#{fP[:totalLength]})"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Écrit dans un fichier les résultats
|
54
|
+
def writeResults(filesProperties, options)
|
55
|
+
result = "Sarbotte Quality Tool\n\n"
|
56
|
+
if options[:path] then
|
57
|
+
result += "Chemin : " + options[:path] + "\n\n"
|
58
|
+
end
|
59
|
+
if filesProperties.size > 1 then
|
60
|
+
average = filesProperties.reduce(0) { |total, fP| total + fP[:sqi] }.to_f / filesProperties.size
|
61
|
+
result += "Moyenne : #{'%.2f' % average}\n\n"
|
62
|
+
end
|
63
|
+
result += "Fichiers : \n"
|
64
|
+
filesProperties.each do |fP|
|
65
|
+
sqi = fP[:sqi]
|
66
|
+
result += " #{fP[:uri].gsub(options[:path] && options[:path] != "." ? options[:path] : "", "")} : #{'%.2f' % fP[:sqi]} (#{fP[:jsAndCssLength]}/#{fP[:totalLength]})\n"
|
67
|
+
end
|
68
|
+
File.open(options[:fileName], 'w') {|f| f.write(result) }
|
69
|
+
end
|
70
|
+
|
71
|
+
# Construit l'objet qui sera affiché, en fonction de son uri et de son contenu
|
72
|
+
def buildResult(uri, file)
|
73
|
+
fileProperties = {}
|
74
|
+
fileProperties[:uri] = uri
|
75
|
+
fileProperties[:totalLength] = file.bytesize
|
76
|
+
fileProperties[:jsAndCssLength] = getJsAndCssLength file
|
77
|
+
fileProperties[:sqi] = sarbotteQuality(fileProperties[:jsAndCssLength], fileProperties[:totalLength])
|
78
|
+
fileProperties
|
79
|
+
end
|
80
|
+
|
81
|
+
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sqt
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Nicolas Barbotte
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-01-22 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: &21882804 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.5.6
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *21882804
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: colorize
|
27
|
+
requirement: &21882504 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.5.8
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *21882504
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: win32console
|
38
|
+
requirement: &21882216 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.3.2
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *21882216
|
47
|
+
description: Client side quality validator
|
48
|
+
email: n.barbotte@gmail.com
|
49
|
+
executables:
|
50
|
+
- sqt
|
51
|
+
extensions: []
|
52
|
+
extra_rdoc_files: []
|
53
|
+
files:
|
54
|
+
- lib/sqt.rb
|
55
|
+
- bin/sqt
|
56
|
+
homepage: https://github.com/SarbotteDesigns/sqt
|
57
|
+
licenses: []
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
requirements: []
|
75
|
+
rubyforge_project:
|
76
|
+
rubygems_version: 1.8.11
|
77
|
+
signing_key:
|
78
|
+
specification_version: 3
|
79
|
+
summary: Sarbotte Quality Tool
|
80
|
+
test_files: []
|