lazy-check 1.0.0

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.
@@ -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
@@ -0,0 +1,5 @@
1
+ module Lazy
2
+ module Check
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
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: []