lazy-check 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +48 -0
- data/Notes-developper.md +39 -0
- data/README.md +148 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lazy-check.gemspec +34 -0
- data/lib/lazy/check/Nokogiri_extension.rb +147 -0
- data/lib/lazy/check/checked_tag.rb +337 -0
- data/lib/lazy/check/checked_url.rb +81 -0
- data/lib/lazy/check/checker.rb +82 -0
- data/lib/lazy/check/checker_case.rb +111 -0
- data/lib/lazy/check/checker_code.rb +108 -0
- data/lib/lazy/check/checker_test.rb +137 -0
- data/lib/lazy/check/checker_url.rb +117 -0
- data/lib/lazy/check/constants.rb +17 -0
- data/lib/lazy/check/locales/en/errors.yaml +13 -0
- data/lib/lazy/check/locales/fr/errors.yaml +142 -0
- data/lib/lazy/check/locales/fr/messages.yaml +18 -0
- data/lib/lazy/check/reporter.rb +84 -0
- data/lib/lazy/check/version.rb +5 -0
- data/lib/lazy/check.rb +18 -0
- data/recipe.yaml +1 -0
- metadata +130 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
module Lazy
|
2
|
+
class Checker
|
3
|
+
class Test
|
4
|
+
|
5
|
+
# Instance Lazy::Checker principale qui lance les tests
|
6
|
+
#
|
7
|
+
attr_reader :checker
|
8
|
+
|
9
|
+
# Données du test
|
10
|
+
#
|
11
|
+
# Doit contenir :
|
12
|
+
# - :url [String] Adresse à visiter
|
13
|
+
# - :checks [Array] Liste des checks à faire
|
14
|
+
#
|
15
|
+
attr_reader :data
|
16
|
+
|
17
|
+
# Instanciation d'un test
|
18
|
+
#
|
19
|
+
# @param data [Hash] Table de données du test
|
20
|
+
#
|
21
|
+
def initialize(checker, data)
|
22
|
+
@checker = checker
|
23
|
+
@data = data
|
24
|
+
check_data
|
25
|
+
end
|
26
|
+
|
27
|
+
# On procède à ce test qui doit réussir
|
28
|
+
# Ça consiste à :
|
29
|
+
# - si :checks est défini : boucler sur tous les :checks pour
|
30
|
+
# ce test dans la recette.
|
31
|
+
# - si :redirect_to est défini : vérifier qu'on obtient bien une
|
32
|
+
# redirection.
|
33
|
+
# - si :response est défini : vérifier que c'est bien la réponse
|
34
|
+
#
|
35
|
+
# Cf. checker_url.rb pour le détail
|
36
|
+
#
|
37
|
+
def check(**options)
|
38
|
+
if data.key?(:checks)
|
39
|
+
check_with_checks(**options)
|
40
|
+
else
|
41
|
+
check_autre(**options)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def check_with_checks(**options)
|
46
|
+
data[:checks].each do |dcheck|
|
47
|
+
check_case = CheckCase.new(urler, dcheck, checker.reporter)
|
48
|
+
result = check_case.check
|
49
|
+
if result === true
|
50
|
+
# Success
|
51
|
+
elsif result === false
|
52
|
+
# Failure
|
53
|
+
else
|
54
|
+
# Unknown result — Résultat inconnu
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Pour checker la redirection ou l'http response
|
60
|
+
def check_autre(**options)
|
61
|
+
churl = CheckedUrl.new(data.merge(urler: urler, reporter: reporter))
|
62
|
+
churl.check(**options)
|
63
|
+
end
|
64
|
+
|
65
|
+
def urler
|
66
|
+
@urler ||= begin
|
67
|
+
full_url = checker.base ? File.join(checker.base, url) : url
|
68
|
+
Url.new(full_url)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def url
|
73
|
+
@url ||= data[:url]
|
74
|
+
end
|
75
|
+
|
76
|
+
# raccourci
|
77
|
+
def reporter
|
78
|
+
checker.reporter
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
|
84
|
+
def check_data
|
85
|
+
# -- Pour simplifier l'écriture des erreurs --
|
86
|
+
data_keys = data.keys.pretty_join
|
87
|
+
data_class = data.class.name
|
88
|
+
# -- Tests de validité --
|
89
|
+
data.is_a?(Hash) || raise(ERRORS[300] % {c: data_class})
|
90
|
+
data.key?(:url) || raise(ERRORS[300] % {ks: data_keys})
|
91
|
+
err = check_url(data[:url])
|
92
|
+
err.nil? || raise(ERRORS[302] % {e: err, u: data[:url]})
|
93
|
+
data.key?(:name) || raise(ERRORS[307] % {ks: data_keys})
|
94
|
+
if data.key?(:checks)
|
95
|
+
data[:checks].is_a?(Array) || raise(ERRORS[309] % {c: data_class})
|
96
|
+
elsif data.key?(:redirect_to)
|
97
|
+
data[:redirect_to].is_a?(String) || raise(ERRORS[310] % {a: data[:redirect_to].inspect, c: data[:redirect_to].class.name})
|
98
|
+
data[:redirect_to].start_with?('http') || raise(ERRORS[311] % {a: data[:redirect_to].inspect})
|
99
|
+
elsif data.key?(:response)
|
100
|
+
data[:response].is_a?(Integer) || raise(ERRORS[312] % {a:data[:response].inspect, c: data[:response].class.name})
|
101
|
+
else
|
102
|
+
raise(ERRORS[308] % {ks: data_keys})
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# S'assure que +url+ est une url valide. @return nil si c'est le
|
107
|
+
# cas où l'erreur dans le cas contraire.
|
108
|
+
#
|
109
|
+
# @note
|
110
|
+
#
|
111
|
+
# Ce qu'on appelle une +url+ ici peut être un URI (https://...)
|
112
|
+
# ou le code résultant du chargement de cette URI, qui sera
|
113
|
+
# reconnaissable parce qu'il commence par "<" et finit par ">"
|
114
|
+
# (oui, c'est de la reconnaissance paresseuse…)
|
115
|
+
#
|
116
|
+
def check_url(url)
|
117
|
+
url || raise(ERRORS[303])
|
118
|
+
url.is_a?(String) || raise(ERRORS[304] % {c: url.class.name})
|
119
|
+
if url.match?(/^<.+>$/.freeze)
|
120
|
+
# Du code HTML/XML
|
121
|
+
else
|
122
|
+
if checker.base?
|
123
|
+
# Pas à tester le début
|
124
|
+
else
|
125
|
+
url.start_with?('http') || raise(ERRORS[305])
|
126
|
+
end
|
127
|
+
not(url.match?(/ /)) || raise(ERRORS[306])
|
128
|
+
end
|
129
|
+
rescue Exception => e
|
130
|
+
return e.message
|
131
|
+
else
|
132
|
+
return nil
|
133
|
+
end
|
134
|
+
|
135
|
+
end #/class Test
|
136
|
+
end #/class Checker
|
137
|
+
end #/module Lazy
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'nokogiri'
|
3
|
+
|
4
|
+
module Lazy
|
5
|
+
class Checker
|
6
|
+
class Url
|
7
|
+
|
8
|
+
attr_reader :uri_string
|
9
|
+
|
10
|
+
# Instanciation d'un test
|
11
|
+
#
|
12
|
+
# @param uri [String] URL ou code
|
13
|
+
#
|
14
|
+
def initialize(uri)
|
15
|
+
@uri_string = uri.strip
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return Nokogiri Document
|
19
|
+
def nokogiri
|
20
|
+
@nokogiri ||= Nokogiri::XML(code_html)#.tap { |n| dbg("Classe : #{n.class}".bleu)}
|
21
|
+
end
|
22
|
+
|
23
|
+
# -- Predicate Methods --
|
24
|
+
|
25
|
+
# @return true si la page a pu être chargée correctement
|
26
|
+
def ok?
|
27
|
+
not(code_html.nil?)
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return true si la page est une redirection
|
31
|
+
# @note la redirection se trouve dans @redirect_to
|
32
|
+
def redirection?
|
33
|
+
code_html.nil? && not(@redirect_to.nil?)
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return la redirection
|
37
|
+
#
|
38
|
+
# @note Il faut avoir appelé #code_html ou #read avant de
|
39
|
+
# pouvoir l'utiliser.
|
40
|
+
def redirect_to
|
41
|
+
@redirect_to
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return la response.value
|
45
|
+
# @note Il faut que #code_html ou #read ait été appelé avant
|
46
|
+
def rvalue
|
47
|
+
@rvalue
|
48
|
+
end
|
49
|
+
|
50
|
+
def code_html
|
51
|
+
@code_html ||= readit
|
52
|
+
end
|
53
|
+
|
54
|
+
def readit
|
55
|
+
if uri_string.start_with?('http')
|
56
|
+
uri = URI(uri_string)
|
57
|
+
begin
|
58
|
+
response = Net::HTTP.get_response(uri)
|
59
|
+
rescue SocketError => e
|
60
|
+
@rvalue = e.message.match(/([4][0-9][0-9])/).to_a[1].to_i
|
61
|
+
return
|
62
|
+
rescue Net::HTTPServerException => e
|
63
|
+
@rvalue = e.message.match(/([4][0-9][0-9])/).to_a[1].to_i
|
64
|
+
return
|
65
|
+
rescue Net::HTTPClientException => e
|
66
|
+
@rvalue = e.message.match(/([4][0-9][0-9])/).to_a[1].to_i
|
67
|
+
return
|
68
|
+
end
|
69
|
+
begin
|
70
|
+
@rvalue = response.value
|
71
|
+
# rescue Net::HTTPServerException => e
|
72
|
+
# @rvalue = e.message.match(/([4][0-9][0-9])/).to_a[1].to_i
|
73
|
+
# puts "rvalue: #{@rvalue.inspect}".jaune
|
74
|
+
# exit
|
75
|
+
# return
|
76
|
+
rescue Net::HTTPClientException => e
|
77
|
+
@rvalue = e.message.match(/([4][0-9][0-9])/).to_a[1].to_i
|
78
|
+
return
|
79
|
+
end
|
80
|
+
case response
|
81
|
+
when Net::HTTPSuccess
|
82
|
+
body = response.body # toute la page html
|
83
|
+
@rvalue = response.code.to_i
|
84
|
+
# dbg("response.value = #{response.methods.inspect}".bleu)
|
85
|
+
# dbg("response.code = #{response.code.inspect}".bleu)
|
86
|
+
if body.match?(REG_REDIRECTION)
|
87
|
+
#
|
88
|
+
# -- la page html définit une redirection par
|
89
|
+
# balise meta --
|
90
|
+
#
|
91
|
+
@redirect_to = body.match(REG_REDIRECTION).to_a[1].strip
|
92
|
+
return nil
|
93
|
+
else
|
94
|
+
#
|
95
|
+
# Un corps de page normal (note : <html>...</html>)
|
96
|
+
#
|
97
|
+
return body
|
98
|
+
end
|
99
|
+
when Net::HTTPRedirect
|
100
|
+
@redirect_to = response['location']
|
101
|
+
return nil
|
102
|
+
else
|
103
|
+
return nil
|
104
|
+
end
|
105
|
+
elsif uri_string.start_with?('<') and uri_string.end_with?('>')
|
106
|
+
uri_string
|
107
|
+
else
|
108
|
+
raise ArgumentError.new(ERRORS[201] % {a:uri_string.inspect})
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
REG_REDIRECTION = /<meta.+http-equiv="refresh".+content="[0-9]+;(.+)">/.freeze
|
113
|
+
|
114
|
+
|
115
|
+
end #/class Url
|
116
|
+
end #/class Checker
|
117
|
+
end #/module Lazy
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Lazy
|
2
|
+
|
3
|
+
KNOWN_LANGS = ['fr','en']
|
4
|
+
|
5
|
+
lang = ENV['LANG'][0..1] || 'en'
|
6
|
+
# lang = 'en' # pour tester
|
7
|
+
lang = 'en' unless KNOWN_LANGS.include?(lang)
|
8
|
+
LANG = lang
|
9
|
+
|
10
|
+
APP_FOLDER = File.dirname(File.dirname(File.dirname(__dir__)))
|
11
|
+
|
12
|
+
YAML_OPTIONS = {symbolize_names:true, aliases:true, permitted_classes:[Date,Integer,Float]}
|
13
|
+
|
14
|
+
ERRORS = YAML.safe_load(File.read(File.join(__dir__,'locales',LANG,'errors.yaml')), **YAML_OPTIONS)
|
15
|
+
MESSAGES = YAML.safe_load(File.read(File.join(__dir__,'locales',LANG,'messages.yaml')), **YAML_OPTIONS)
|
16
|
+
|
17
|
+
end #/module Lazy
|
@@ -0,0 +1,13 @@
|
|
1
|
+
---
|
2
|
+
1000: |
|
3
|
+
Lazy::Checker::CheckCase instanciation requires a Lazy::Checker::Url (first argument).
|
4
|
+
Actual value is %{a}::%{c}.
|
5
|
+
1001: |
|
6
|
+
Lazy::Checker::CheckCase instanciation requires a Hash (second argument).
|
7
|
+
Actual value is %{a}::%{c}.
|
8
|
+
1002: |
|
9
|
+
CheckCase data should define :tag value (tag name with at least id or css class).
|
10
|
+
They only define : %{ks}.
|
11
|
+
1003: |
|
12
|
+
:tag value of the CheckCase data should define at least a id (tagName#id) or a css
|
13
|
+
class (tagName.css_class). '%{a}' defines neither.
|
@@ -0,0 +1,142 @@
|
|
1
|
+
---
|
2
|
+
# -- Erreurs de recette --
|
3
|
+
200: |
|
4
|
+
Le fichier recette '%{path}' est introuvable.
|
5
|
+
201: |
|
6
|
+
La donnée %{a} n'est pas valide, pour instancier un Checker::Url. Il faudrait soit
|
7
|
+
une URL (conforme) soit un code HTML (valide).
|
8
|
+
202: |
|
9
|
+
Le fichier recette ne contient aucune donnée.
|
10
|
+
203: |
|
11
|
+
Les données de la recette devraient être une table (Hash) pas un %{c}.
|
12
|
+
204: |
|
13
|
+
La recette devrait définir la clé :tests. Elle ne définit que les clés %{ks}.
|
14
|
+
205: |
|
15
|
+
Les données :tests devraient être un Array, pas un %{c}.
|
16
|
+
206: |
|
17
|
+
La recette doit définir son nom avec la clé :name.
|
18
|
+
|
19
|
+
# -- Erreurs de la définition d'un test --
|
20
|
+
|
21
|
+
300: |
|
22
|
+
Les données du test devraient être une table Hash, pas un %{c}.
|
23
|
+
301: |
|
24
|
+
La table du test devrait définir la propriété :url, qui est la page à atteindre.
|
25
|
+
Je ne trouve que les propriétés %{ks}.
|
26
|
+
302: |
|
27
|
+
L'URL fournie (%{u}) n'est pas valide : %{e}.
|
28
|
+
303: |
|
29
|
+
elle doit être définie, pas nil.
|
30
|
+
304: |
|
31
|
+
elle doit être un string, pas un %{c}.
|
32
|
+
305: |
|
33
|
+
elle doit obligatoirement commencer par 'http' ou 'https'.
|
34
|
+
306: |
|
35
|
+
elle ne devrait contenir aucune espace…
|
36
|
+
307: |
|
37
|
+
Un test doit définir son nom (dans :name), il ne définit que les clés
|
38
|
+
%{ks}.
|
39
|
+
308: |
|
40
|
+
Un test doit définir les checks à faire dans une propriété qui s'appelle
|
41
|
+
justement :checks. Le test ne définit que les propriétés %{ks}…
|
42
|
+
309: |
|
43
|
+
Les checks à faire pour le test (:checks) devraient être une liste
|
44
|
+
Array, par un %{c}.
|
45
|
+
310: |
|
46
|
+
La redirection %{a} devrait être une chaine de caractères, pas un %{c}.
|
47
|
+
311: |
|
48
|
+
La redirection %{a} devrait commencer par 'http[s]'…
|
49
|
+
312: |
|
50
|
+
Pour tester la réponse HTTP, il faut donner le nombre attendu, donc il
|
51
|
+
faut donner un Integer, or %{a} est un %{c}.
|
52
|
+
Par exemple : 404.
|
53
|
+
800: |
|
54
|
+
-- INUTILISÉ --
|
55
|
+
1000: |
|
56
|
+
L'instanciation de Lazy::Checker::CheckCase nécessite un Lazy::Checker::Url
|
57
|
+
en premier argument. La valeur est %{a}::%{c}.
|
58
|
+
1001: |
|
59
|
+
L'instanciation de Lazy::Checker::CheckCase nécessite un Hash en second
|
60
|
+
argument, une table définissant ce cas de test. La valeur est %{a}::%{c}…
|
61
|
+
1002: |
|
62
|
+
Les données du CheckCase devraient définir :tag, la balise avec son
|
63
|
+
identifiant et ses classes CSS. Elles ne définissent que :
|
64
|
+
%{ks}.
|
65
|
+
1003: |
|
66
|
+
La donnée :tag du check case devrait au moins définir un identifiant (tag#id)
|
67
|
+
ou une classe CSS (tag.css). '%{a}' ne définit ni l'un ni l'autre.
|
68
|
+
1004: |
|
69
|
+
Dans la donnée :tag, :count (%{a}) devrait être un nombre, pas un %{c}…
|
70
|
+
2000: |
|
71
|
+
Définition de :contains erroné. Doit être une table (définissant au moins
|
72
|
+
:tag), un string (un texte à contenir ou une balise avec identifiant et/ou
|
73
|
+
class CSS) ou une liste de ces éléments. La classe de l'élément, quoi qu'il
|
74
|
+
en soit, ne peut être %{c}.
|
75
|
+
|
76
|
+
# --- Les erreurs de check de la page ---
|
77
|
+
|
78
|
+
4999: |
|
79
|
+
Aucun élément %{tag} n'a été trouvé alors qu'on en
|
80
|
+
attendait %{e}.
|
81
|
+
5000: |
|
82
|
+
Mauvais compte. On attend %{e} éléments %{tag}. On en a trouvé
|
83
|
+
%{a} dans la page.
|
84
|
+
5001: |
|
85
|
+
Le contenu de %{tag} devrait être vide. Mais il contient le texte "%{a}".
|
86
|
+
5002: |
|
87
|
+
Le contenu de %{tag} ne devrait pas être vide. Or il l'est.
|
88
|
+
5003: |
|
89
|
+
Le contenu de %{tag} ne devrait comporter aucun texte, or
|
90
|
+
il contient %{a}.
|
91
|
+
5004: |
|
92
|
+
Le contenu de %{tag} devrait comporter du texte, or il n'en affiche
|
93
|
+
aucun.
|
94
|
+
5010: |
|
95
|
+
On devrait trouver %{tag} contenant %{e}. Les problèmes suivants ont été
|
96
|
+
rencontrés : %{a}.
|
97
|
+
5011: |
|
98
|
+
On devrait trouver %{tag} contenant le texte %{e}.
|
99
|
+
5020: |
|
100
|
+
devrait contenir la chaine %{e}
|
101
|
+
5021: |
|
102
|
+
devrait contenir la tag définie par %{e}
|
103
|
+
5030: |
|
104
|
+
devrait définir les attributs
|
105
|
+
5031: |
|
106
|
+
attributs manquants ou inégaux : %{e}.
|
107
|
+
5032: |
|
108
|
+
le contenu n'est pas assez long. Il devrait faire au moins %{e} caractères,
|
109
|
+
il en fait %{a}.
|
110
|
+
5033: |
|
111
|
+
le contenu est trop long. Il devrait faire moins de %{e} caractères, or il
|
112
|
+
en fait %{a}.
|
113
|
+
|
114
|
+
5500: |
|
115
|
+
L'URL n'est pas redirigée. Elle aurait dû être redirigée vers
|
116
|
+
%{e}
|
117
|
+
5501: |
|
118
|
+
L'URL est redirigée vers la mauvaise adresse. Elle aurait dû être redirigée
|
119
|
+
vers : %{e}
|
120
|
+
Elle est redirigée vers : %{a}.
|
121
|
+
5502: |
|
122
|
+
L'HTTP Response attendue n'est pas la bonne…
|
123
|
+
On attendait la réponse : %{e}
|
124
|
+
On a reçu la réponse : %{a}
|
125
|
+
5503: |
|
126
|
+
Erreur 404. La page %{e} est introuvable.
|
127
|
+
6000: |
|
128
|
+
Le premier argument de Lazy::Checker.check doit être du code XML valide.
|
129
|
+
Or, %{se}.
|
130
|
+
6001: |
|
131
|
+
%{a} n'est pas un String, c'est un %{c}.
|
132
|
+
6002: |
|
133
|
+
un code XML valide se trouve enroulé dans un nœud racine. Ce n'est pas le
|
134
|
+
cas pour %{a}…
|
135
|
+
6003: |
|
136
|
+
la donnée est nulle (nil).
|
137
|
+
6010: |
|
138
|
+
Le second argument de Lazy::Checker.check doit être une table Hash valide
|
139
|
+
donc un Hash contenant les bonnes clés : %{se}
|
140
|
+
6011: |
|
141
|
+
%{a} n'est pas un Hash, c'est un %{c}…
|
142
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
# -- Termes de messages --
|
3
|
+
10: 'nombre '
|
4
|
+
11: 'longueur '
|
5
|
+
12: 'longueur min '
|
6
|
+
13: 'longueur max '
|
7
|
+
14: 'vide'
|
8
|
+
15: 'non vide'
|
9
|
+
16: 'contenant'
|
10
|
+
17: 'contenant le texte'
|
11
|
+
20: 'seulement parmi les enfants directs'
|
12
|
+
21: 'avec les attributs'
|
13
|
+
|
14
|
+
# -- Les messages de retour des checks --
|
15
|
+
|
16
|
+
4999: |
|
17
|
+
La balise %{tag} a été trouvée avec les données attendues :
|
18
|
+
%{f_data}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#
|
2
|
+
# Class Lazy::Checker::Reporter
|
3
|
+
#
|
4
|
+
# Pour établie le rapport de fin.
|
5
|
+
#
|
6
|
+
module Lazy
|
7
|
+
class Checker
|
8
|
+
class Reporter
|
9
|
+
|
10
|
+
attr_reader :checker
|
11
|
+
|
12
|
+
def initialize(checker)
|
13
|
+
@checker = checker
|
14
|
+
end
|
15
|
+
|
16
|
+
#
|
17
|
+
# Affichage du rapport
|
18
|
+
#
|
19
|
+
def display
|
20
|
+
puts "\n\n"
|
21
|
+
puts "#{checker.name}".jaune
|
22
|
+
puts "-"* checker.name.length
|
23
|
+
nombre_erreurs = @failures.count
|
24
|
+
if true #verbose? # TODO À RÉGLER
|
25
|
+
display_list_resultats(success = true)
|
26
|
+
end
|
27
|
+
if nombre_erreurs > 0
|
28
|
+
display_list_resultats(success = false)
|
29
|
+
end
|
30
|
+
color = nombre_erreurs > 0 ? :red : :vert
|
31
|
+
msg = "Success #{@successs.count} Failures #{@failures.count} Temps #{formated_duree}"
|
32
|
+
puts "-" * msg.length
|
33
|
+
puts msg.send(color)
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_success(check_case)
|
37
|
+
@successs << check_case
|
38
|
+
end
|
39
|
+
def add_failure(check_case)
|
40
|
+
@failures << check_case
|
41
|
+
end
|
42
|
+
|
43
|
+
# Pour afficher la liste de succès ou de failures
|
44
|
+
def display_list_resultats(success)
|
45
|
+
methode = success ? :message : :errors
|
46
|
+
color = success ? :vert : :red
|
47
|
+
liste = success ? @successs : @failures
|
48
|
+
prefix = success ? 'SUCCESS' : 'FAILURE'
|
49
|
+
|
50
|
+
max_index = liste.count + 1
|
51
|
+
max_len_index = "[#{prefix} #{max_index}] ".length
|
52
|
+
indent = ' ' * max_len_index
|
53
|
+
liste.each_with_index do |checkedthing, idx|
|
54
|
+
index_str = "[#{prefix} #{idx + 1}]".ljust(max_len_index)
|
55
|
+
puts "#{index_str}#{checkedthing.send(methode).split("\n").join("\n#{indent}")}".send(color)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def start
|
60
|
+
@start_time = Time.now
|
61
|
+
@successs = []
|
62
|
+
@failures = []
|
63
|
+
end
|
64
|
+
|
65
|
+
def end
|
66
|
+
@end_time = Time.now
|
67
|
+
end
|
68
|
+
|
69
|
+
def formated_duree
|
70
|
+
@formated_duree ||= begin
|
71
|
+
if duree < 0.10
|
72
|
+
"#{(duree.to_f * 1000).round(4)} ms"
|
73
|
+
else
|
74
|
+
"#{duree.round(4)} s"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
def duree
|
79
|
+
@duree ||= @end_time - @start_time
|
80
|
+
end
|
81
|
+
|
82
|
+
end #/class Reporter
|
83
|
+
end #/class Checker
|
84
|
+
end #/module Lazy
|
data/lib/lazy/check.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'clir'
|
2
|
+
require 'yaml'
|
3
|
+
require 'nokogiri'
|
4
|
+
require "lazy/check/version"
|
5
|
+
require 'lazy/check/constants'
|
6
|
+
require "lazy/check/checker"
|
7
|
+
require "lazy/check/checker_test"
|
8
|
+
require "lazy/check/checker_url"
|
9
|
+
require "lazy/check/checked_tag"
|
10
|
+
require "lazy/check/checked_url"
|
11
|
+
require 'lazy/check/Nokogiri_extension'
|
12
|
+
require "lazy/check/checker_case"
|
13
|
+
require "lazy/check/checker_code"
|
14
|
+
require "lazy/check/reporter"
|
15
|
+
|
16
|
+
def dbg(msg)
|
17
|
+
STDOUT.write "\n#{msg}"
|
18
|
+
end
|
data/recipe.yaml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
---
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lazy-check
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- PhilippePerret
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-09-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: minitest
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest-color
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: clir
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: nokogiri
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Ce gem permet de façon paresseuse mais néanmoins sérieuse de tester qu'un
|
70
|
+
site web est valide au niveau de ses pages et de son contenu.
|
71
|
+
email:
|
72
|
+
- philippe.perret@yahoo.fr
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- ".gitignore"
|
78
|
+
- ".travis.yml"
|
79
|
+
- CHANGELOG.md
|
80
|
+
- Gemfile
|
81
|
+
- Gemfile.lock
|
82
|
+
- Notes-developper.md
|
83
|
+
- README.md
|
84
|
+
- Rakefile
|
85
|
+
- bin/console
|
86
|
+
- bin/setup
|
87
|
+
- lazy-check.gemspec
|
88
|
+
- lib/lazy/check.rb
|
89
|
+
- lib/lazy/check/Nokogiri_extension.rb
|
90
|
+
- lib/lazy/check/checked_tag.rb
|
91
|
+
- lib/lazy/check/checked_url.rb
|
92
|
+
- lib/lazy/check/checker.rb
|
93
|
+
- lib/lazy/check/checker_case.rb
|
94
|
+
- lib/lazy/check/checker_code.rb
|
95
|
+
- lib/lazy/check/checker_test.rb
|
96
|
+
- lib/lazy/check/checker_url.rb
|
97
|
+
- lib/lazy/check/constants.rb
|
98
|
+
- lib/lazy/check/locales/en/errors.yaml
|
99
|
+
- lib/lazy/check/locales/fr/errors.yaml
|
100
|
+
- lib/lazy/check/locales/fr/messages.yaml
|
101
|
+
- lib/lazy/check/reporter.rb
|
102
|
+
- lib/lazy/check/version.rb
|
103
|
+
- recipe.yaml
|
104
|
+
homepage: https://rubygems.org/gems/lazy-check
|
105
|
+
licenses: []
|
106
|
+
metadata:
|
107
|
+
allowed_push_host: https://rubygems.org
|
108
|
+
homepage_uri: https://rubygems.org/gems/lazy-check
|
109
|
+
source_code_uri: https://github.com/PhilippePerret/gem-lazy-check
|
110
|
+
changelog_uri: https://github.com/PhilippePerret/gem-lazy-check/CHANGELOG.md
|
111
|
+
post_install_message:
|
112
|
+
rdoc_options: []
|
113
|
+
require_paths:
|
114
|
+
- lib
|
115
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 2.3.0
|
120
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
requirements: []
|
126
|
+
rubygems_version: 3.1.6
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Vérification paresseuse d'un site web
|
130
|
+
test_files: []
|