iris-rb 0.1.17 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/lib/iris/applicazione.ir +3 -3
- data/lib/iris/azione/parametri.ir +3 -3
- data/lib/iris/azione/registratore.ir +4 -4
- data/lib/iris/azione.ir +55 -35
- data/lib/iris/navigatore/rotta.ir +12 -7
- data/lib/iris/navigatore.ir +57 -23
- data/lib/iris/versione.ir +1 -1
- data/lib/iris.ir +3 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 342f7b6e458a03751e4cc02ea3ea1d1136facb8ba2f1c9b3e6ed2618356009b6
|
4
|
+
data.tar.gz: 23dd8f9356408ff363e1d9c248a37510ea2b91eb91068abcb4347c452c7410bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a06570fcdf74938281327bbded5e1742bdbcf81a5454907454b55aed8359e939158578f68bf856331c432b52a0112ddbfb51251afd59946d65f741d046eec956
|
7
|
+
data.tar.gz: 9a92fa07eebcbc5130d9cdb174b67a8ff3ec38c5675894b864a918f4e6348886e8e2c3d66ffbded6dc41890557a26aba8d1b19fee5a6008667616bef9ca56819
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
iris-rb (0.1.
|
4
|
+
iris-rb (0.1.17)
|
5
5
|
italian-ruby (~> 0.1)
|
6
6
|
rack (~> 2.2)
|
7
7
|
|
@@ -9,7 +9,7 @@ GEM
|
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
11
|
diff-lcs (1.3)
|
12
|
-
italian-ruby (0.1.
|
12
|
+
italian-ruby (0.1.17)
|
13
13
|
ruby2ruby (~> 2.4)
|
14
14
|
rack (2.2.2)
|
15
15
|
rake (12.3.3)
|
data/lib/iris/applicazione.ir
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
##
|
2
2
|
# Descrive un'applicazione di Iris.
|
3
3
|
# Un'applicazione Iris è compatibile con Rack, quindi è un
|
4
|
-
# oggetto che risponde al metodo `call` (alias `
|
4
|
+
# oggetto che risponde al metodo `call` (alias `avvia` per Italian Ruby)
|
5
5
|
# e ritorna una risposta in forma di array con stato, intestazioni e corpo.
|
6
6
|
#
|
7
7
|
# Un'esempio di applicazione Iris può essere il seguente:
|
@@ -43,10 +43,10 @@ modulo Iris
|
|
43
43
|
|
44
44
|
##
|
45
45
|
# Questo metodo rende Iris::Applicazione compatibile con Rack.
|
46
|
-
definisci
|
46
|
+
definisci avvia(env)
|
47
47
|
@app.call env
|
48
48
|
fine
|
49
|
-
alias :call :
|
49
|
+
alias :call :avvia
|
50
50
|
|
51
51
|
fine
|
52
52
|
fine
|
@@ -16,7 +16,7 @@ modulo Iris
|
|
16
16
|
# fine
|
17
17
|
# fine
|
18
18
|
#
|
19
|
-
# definisci
|
19
|
+
# definisci avvia
|
20
20
|
# fine
|
21
21
|
#
|
22
22
|
# fine
|
@@ -98,7 +98,7 @@ modulo Iris
|
|
98
98
|
ritorna se @validi == no
|
99
99
|
|
100
100
|
regola_rispettata = si
|
101
|
-
regola_rispettata = blocco.
|
101
|
+
regola_rispettata = blocco.avvia se blocco.esiste?
|
102
102
|
se regola_rispettata == no
|
103
103
|
@validi = no
|
104
104
|
@errori.deposita :regole, [] se @errori.non_ha_chiave? :regole
|
@@ -135,7 +135,7 @@ modulo Iris
|
|
135
135
|
lancia :controllo_terminato se valore_parametro.nullo?
|
136
136
|
|
137
137
|
parametri_annidati = Parametri.nuovo valore_parametro
|
138
|
-
blocco.
|
138
|
+
blocco.avvia parametri_annidati
|
139
139
|
@validi = (@validi e parametri_annidati.validi?)
|
140
140
|
@parametri_processati.deposita parametro, parametri_annidati.ottieni se @validi == si
|
141
141
|
@errori.deposita parametro, parametri_annidati.errori se parametri_annidati.errati?
|
@@ -13,10 +13,10 @@ modulo Iris
|
|
13
13
|
applicazione = "IRIS"
|
14
14
|
fine
|
15
15
|
|
16
|
-
metodo_richiesta = @
|
17
|
-
percorso_richiesta = @
|
18
|
-
parametri = @
|
19
|
-
inizio_richiesta = @
|
16
|
+
metodo_richiesta = @richiesta["REQUEST_METHOD"]
|
17
|
+
percorso_richiesta = @richiesta["REQUEST_PATH"]
|
18
|
+
parametri = @richiesta["iris.parametri"]
|
19
|
+
inizio_richiesta = @richiesta["timer.start"]
|
20
20
|
se inizio_richiesta.specificato?
|
21
21
|
tempo_richiesta = "#{((Tempo.adesso - inizio_richiesta) * 1000).arrotonda}ms"
|
22
22
|
altrimenti
|
data/lib/iris/azione.ir
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "json"
|
1
2
|
richiedi_relativo "azione/intestazioni"
|
2
3
|
richiedi_relativo "azione/parametri"
|
3
4
|
richiedi_relativo "azione/registratore"
|
@@ -26,7 +27,7 @@ richiedi_relativo "azione/registratore"
|
|
26
27
|
# classe ListaLibri
|
27
28
|
# includi Iris::Azione
|
28
29
|
#
|
29
|
-
# definisci
|
30
|
+
# definisci avvia
|
30
31
|
# [ 200, {}, [ "Libri" ] ]
|
31
32
|
# fine
|
32
33
|
#
|
@@ -34,7 +35,7 @@ richiedi_relativo "azione/registratore"
|
|
34
35
|
# fine
|
35
36
|
# fine
|
36
37
|
#
|
37
|
-
# L'azione `ListaLibri` deve implementare il metodo
|
38
|
+
# L'azione `ListaLibri` deve implementare il metodo avvia, che permette
|
38
39
|
# di eseguire la procedura desiderata, e fornire la risposta utilizzando
|
39
40
|
# le variabili d'istanza `@stato`, `@intestazioni` e `@corpo`.
|
40
41
|
modulo Iris
|
@@ -56,8 +57,8 @@ modulo Iris
|
|
56
57
|
|
57
58
|
##
|
58
59
|
# Metodo principale eseguito per risolvere l'azione.
|
59
|
-
definisci
|
60
|
-
_imposta_variabili_istanza
|
60
|
+
definisci _avvia(richiesta)
|
61
|
+
_imposta_variabili_istanza richiesta
|
61
62
|
_converti_parametri_interrogazione
|
62
63
|
_converti_corpo_in_json
|
63
64
|
_inizializza_parametri
|
@@ -66,13 +67,14 @@ modulo Iris
|
|
66
67
|
inizia
|
67
68
|
prima
|
68
69
|
valida_parametri
|
69
|
-
|
70
|
+
rilascia se blocco_dato?
|
70
71
|
recupera StandardError => errore
|
71
|
-
|
72
|
+
alza errore a_meno_che Iris.configurazione.cattura_errori
|
73
|
+
|
72
74
|
se Iris.configurazione.blocco_recupero_errori.esiste?
|
73
|
-
esegui_in_istanza &Iris.configurazione.blocco_recupero_errori
|
75
|
+
esegui_in_istanza errore, &Iris.configurazione.blocco_recupero_errori
|
74
76
|
altrimenti
|
75
|
-
arresta 500, errore:
|
77
|
+
arresta 500, errore: errore
|
76
78
|
fine
|
77
79
|
fine
|
78
80
|
fine
|
@@ -84,16 +86,7 @@ modulo Iris
|
|
84
86
|
|
85
87
|
[ @stato, @intestazioni, [ @corpo ] ]
|
86
88
|
fine
|
87
|
-
alias :
|
88
|
-
|
89
|
-
##
|
90
|
-
# Metodo per risolvere l'azione in modo personalizzato.
|
91
|
-
# In questo metodo è possibile impostare lo stato, le intestazioni
|
92
|
-
# o il corpo della risposta. È inoltre possibile utilizzare
|
93
|
-
# i metodi `arresta` e `stato` per interrompere il flusso dell'azione
|
94
|
-
# e ritornare immediatamente i valori passati.
|
95
|
-
definisci chiama
|
96
|
-
fine
|
89
|
+
alias :call :_avvia
|
97
90
|
|
98
91
|
##
|
99
92
|
# Aggiunge un aggancio per eseguire codice prima
|
@@ -101,7 +94,6 @@ modulo Iris
|
|
101
94
|
# controlli sull'utente o altre cose distribuite su azioni
|
102
95
|
# multiple.
|
103
96
|
definisci prima
|
104
|
-
rilascia se blocco_dato?
|
105
97
|
fine
|
106
98
|
|
107
99
|
##
|
@@ -109,7 +101,6 @@ modulo Iris
|
|
109
101
|
# dell'azione effettiva. A questo punto sono già definiti
|
110
102
|
# stato, intestazioni e corpo della risposta.
|
111
103
|
definisci dopo
|
112
|
-
rilascia se blocco_dato?
|
113
104
|
fine
|
114
105
|
|
115
106
|
##
|
@@ -134,48 +125,77 @@ modulo Iris
|
|
134
125
|
fine
|
135
126
|
alias :stato :arresta
|
136
127
|
|
128
|
+
##
|
129
|
+
# Codice da eseguire all'inclusione del modulo.
|
130
|
+
definisci se_stesso.included(azione)
|
131
|
+
azione.class_eval esegui
|
132
|
+
preponi Iris::Azione::InterfacciaAvvio
|
133
|
+
fine
|
134
|
+
fine
|
135
|
+
|
137
136
|
privati
|
138
137
|
|
139
138
|
##
|
140
139
|
# Imposta le variabili d'istanza iniziali.
|
141
|
-
definisci _imposta_variabili_istanza(
|
142
|
-
@
|
143
|
-
@stato
|
144
|
-
@intestazioni
|
145
|
-
@corpo
|
146
|
-
@
|
140
|
+
definisci _imposta_variabili_istanza(richiesta)
|
141
|
+
@richiesta = richiesta
|
142
|
+
@stato = 200
|
143
|
+
@intestazioni = INTESTAZIONI_PREDEFINITE
|
144
|
+
@corpo = nullo
|
145
|
+
@richiesta["iris.parametri"] ||= Mappa.nuova
|
147
146
|
fine
|
148
147
|
|
149
148
|
##
|
150
149
|
# Inizializza i parametri.
|
151
150
|
definisci _inizializza_parametri
|
152
|
-
@parametri = Parametri.nuovo @
|
151
|
+
@parametri = Parametri.nuovo @richiesta["iris.parametri"]
|
153
152
|
fine
|
154
153
|
|
155
154
|
##
|
156
155
|
# Converte il corpo della richiesta in JSON.
|
157
156
|
definisci _converti_corpo_in_json
|
158
|
-
ritorna se @
|
159
|
-
corpo = @
|
157
|
+
ritorna se @richiesta["rack.input"].nullo?
|
158
|
+
corpo = @richiesta["rack.input"].read
|
160
159
|
ritorna se corpo.non_specificato?
|
161
160
|
|
162
161
|
inizia
|
163
162
|
corpo_convertito = (JSON.processa corpo).simbolizza
|
164
|
-
@
|
165
|
-
@
|
163
|
+
@richiesta["iris.parametri"].fondi! corpo_convertito se corpo_convertito.è_una? Mappa
|
164
|
+
@richiesta["iris.corpo"] = corpo_convertito
|
166
165
|
recupera JSON::ParserError => errore
|
167
166
|
arresta 400, errore: "Il corpo fornito non è un JSON valido."
|
168
167
|
fine
|
169
|
-
@
|
168
|
+
@richiesta["rack.input"].rewind
|
170
169
|
fine
|
171
170
|
|
172
171
|
##
|
173
172
|
# Converte i parametri della richiesta.
|
174
173
|
definisci _converti_parametri_interrogazione
|
175
|
-
ritorna a_meno_che @
|
176
|
-
parametri_stringa_interrogazione = @
|
177
|
-
@
|
174
|
+
ritorna a_meno_che @richiesta["REQUEST_URI"].specificato? e @richiesta["REQUEST_URI"].include?("?")
|
175
|
+
parametri_stringa_interrogazione = @richiesta["REQUEST_URI"].partiziona("?").ultimo
|
176
|
+
@richiesta["iris.parametri"].fondi! Rack::Utils.parse_nested_query(parametri_stringa_interrogazione).simbolizza
|
178
177
|
fine
|
179
178
|
|
179
|
+
##
|
180
|
+
# Questo modulo serve per eseguire il codice del metodo `_avvia`
|
181
|
+
# anche quando viene ridefinito nella classe includente.
|
182
|
+
modulo InterfacciaAvvio
|
183
|
+
|
184
|
+
##
|
185
|
+
# Metodo per risolvere l'azione in modo personalizzato.
|
186
|
+
# In questo metodo è possibile impostare lo stato, le intestazioni
|
187
|
+
# o il corpo della risposta. È inoltre possibile utilizzare
|
188
|
+
# i metodi `arresta` e `stato` per interrompere il flusso dell'azione
|
189
|
+
# e ritornare immediatamente i valori passati.
|
190
|
+
definisci avvia(richiesta)
|
191
|
+
_avvia(richiesta) esegui
|
192
|
+
se definito? super
|
193
|
+
super
|
194
|
+
fine
|
195
|
+
fine
|
196
|
+
fine
|
197
|
+
|
198
|
+
fine
|
199
|
+
|
180
200
|
fine
|
181
201
|
fine
|
@@ -10,17 +10,22 @@ modulo Iris
|
|
10
10
|
@parametri = Mappa.nuova
|
11
11
|
fine
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
se @
|
18
|
-
|
13
|
+
##
|
14
|
+
# Avvia l'azione corrispondente alla rotta.
|
15
|
+
definisci avvia_azione(richiesta)
|
16
|
+
richiesta["iris.parametri"] ||= Mappa.nuova
|
17
|
+
richiesta["iris.parametri"].fondi! @parametri se @parametri.esiste?
|
18
|
+
|
19
|
+
se @azione.risponde_a? :avvia
|
20
|
+
@azione.avvia richiesta
|
19
21
|
altrimenti
|
20
|
-
@azione.nuova.avvia
|
22
|
+
@azione.nuova.avvia richiesta
|
21
23
|
fine
|
22
24
|
fine
|
23
25
|
|
26
|
+
##
|
27
|
+
# Determina se la rotta è raggiungibile per il metodo
|
28
|
+
# e il percorso della richiesta.
|
24
29
|
definisci raggiungibile_per?(metodo, percorso_richiesta)
|
25
30
|
ritorna no se metodo != @metodo
|
26
31
|
ritorna si se @passi_definiti.ultimo == "*"
|
data/lib/iris/navigatore.ir
CHANGED
@@ -9,8 +9,9 @@ modulo Iris
|
|
9
9
|
|
10
10
|
definisci inizializzatore(azione: nulla, percorso_padre: nullo, &blocco)
|
11
11
|
@rotte = []
|
12
|
+
@montaggi = []
|
12
13
|
@percorso_padre = percorso_padre
|
13
|
-
@azione_rotta_non_raggiungibile = RottaNonRaggiungibile
|
14
|
+
@azione_rotta_non_raggiungibile = RottaNonRaggiungibile.nuova
|
14
15
|
|
15
16
|
se azione.esiste?
|
16
17
|
@azione = azione
|
@@ -19,15 +20,19 @@ modulo Iris
|
|
19
20
|
fine
|
20
21
|
fine
|
21
22
|
|
22
|
-
definisci risolvi(
|
23
|
+
definisci risolvi(richiesta)
|
23
24
|
se @azione.esiste?
|
24
|
-
@azione.avvia
|
25
|
+
@azione.avvia richiesta
|
25
26
|
altrimenti
|
26
|
-
|
27
|
-
|
28
|
-
|
27
|
+
cerca_rotta_raggiungibile_per richiesta
|
28
|
+
|
29
|
+
ritorna @azione_rotta_non_raggiungibile.avvia(richiesta) se @rotta_raggiungibile.non_esiste?
|
30
|
+
ritorna @rotta_raggiungibile.avvia_azione(richiesta) se @rotta_raggiungibile.è_una? Iris::Navigatore::Rotta
|
31
|
+
|
32
|
+
se @rotta_raggiungibile.risponde_a? :avvia
|
33
|
+
@rotta_raggiungibile.avvia richiesta
|
29
34
|
altrimenti
|
30
|
-
@
|
35
|
+
@rotta_raggiungibile.nuova.avvia richiesta
|
31
36
|
fine
|
32
37
|
fine
|
33
38
|
fine
|
@@ -35,25 +40,47 @@ modulo Iris
|
|
35
40
|
|
36
41
|
##
|
37
42
|
# Cerca la rotta raggiungibile per la richiesta.
|
38
|
-
definisci cerca_rotta_raggiungibile_per(
|
39
|
-
rotta_raggiungibile
|
40
|
-
metodo
|
41
|
-
percorso_richiesta
|
43
|
+
definisci cerca_rotta_raggiungibile_per(richiesta)
|
44
|
+
@rotta_raggiungibile = nulla
|
45
|
+
@metodo = richiesta["REQUEST_METHOD"]
|
46
|
+
@percorso_richiesta = richiesta["iris.percorso"] || richiesta["REQUEST_PATH"] || richiesta["PATH_INFO"]
|
42
47
|
|
43
48
|
cattura :rotta_trovata esegui
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
cerca_fra_i_montaggi richiesta
|
50
|
+
cerca_fra_le_rotte richiesta
|
51
|
+
fine
|
52
|
+
|
53
|
+
@rotta_raggiungibile
|
54
|
+
fine
|
55
|
+
|
56
|
+
##
|
57
|
+
# Cerca se fra i montaggi c'è una rotta raggiungibile
|
58
|
+
# per la richiesta.
|
59
|
+
definisci cerca_fra_i_montaggi(richiesta)
|
60
|
+
@montaggi.per_ognuno esegui |montaggio|
|
61
|
+
se @percorso_richiesta.inizia_con? montaggio[:su]
|
62
|
+
@rotta_raggiungibile = montaggio[:applicazione]
|
63
|
+
richiesta["iris.percorso"] = @percorso_richiesta.rimpiazza montaggio[:su], ""
|
64
|
+
lancia :rotta_trovata
|
65
|
+
fine
|
66
|
+
fine
|
67
|
+
fine
|
68
|
+
|
69
|
+
##
|
70
|
+
# Cerca se fra le rotte definite ce n'è una raggiungibile
|
71
|
+
# per la richiesta.
|
72
|
+
definisci cerca_fra_le_rotte(richiesta)
|
73
|
+
@rotte.per_ognuna esegui |rotta_definita|
|
74
|
+
se rotta_definita.è_una? Iris::Navigatore::Rotta
|
75
|
+
se rotta_definita.raggiungibile_per? @metodo, @percorso_richiesta
|
76
|
+
@rotta_raggiungibile = rotta_definita
|
77
|
+
lancia :rotta_trovata
|
53
78
|
fine
|
79
|
+
altrimenti_se rotta_definita.è_un? Iris::Navigatore
|
80
|
+
@rotta_raggiungibile = rotta_definita.cerca_rotta_raggiungibile_per richiesta
|
81
|
+
lancia :rotta_trovata se @rotta_raggiungibile.esiste?
|
54
82
|
fine
|
55
83
|
fine
|
56
|
-
rotta_raggiungibile
|
57
84
|
fine
|
58
85
|
|
59
86
|
privati
|
@@ -77,20 +104,27 @@ modulo Iris
|
|
77
104
|
alias :options :rotta
|
78
105
|
|
79
106
|
##
|
80
|
-
# Definisce una percorso
|
107
|
+
# Definisce una percorso annidato.
|
81
108
|
definisci percorso(percorso_rotta, &blocco)
|
82
109
|
alza "Definire un percorso valido, non può essere nullo né vuoto." se percorso_rotta.non_specificato?
|
83
110
|
percorso_completo = [ @percorso_padre, percorso_rotta ].unisci
|
84
111
|
@rotte << Iris::Navigatore.nuovo(azione: nulla, percorso_padre: percorso_completo, &blocco)
|
85
112
|
fine
|
86
113
|
|
114
|
+
##
|
115
|
+
# Monta un'altra applicazione.
|
116
|
+
definisci monta(applicazione, su: nullo)
|
117
|
+
alza "Definire un percorso valido, non può essere nullo né vuoto." se su.non_specificato?
|
118
|
+
@montaggi << Mappa[applicazione: applicazione, su: su]
|
119
|
+
fine
|
120
|
+
|
87
121
|
##
|
88
122
|
# L'azione predefinita con cui rispondere se non vengono
|
89
123
|
# trovate rotte raggiungibili per il metodo e il percorso richiesto.
|
90
124
|
classe RottaNonRaggiungibile
|
91
125
|
includi Iris::Azione
|
92
126
|
|
93
|
-
definisci
|
127
|
+
definisci avvia(richiesta)
|
94
128
|
arresta 405, errore: "Nessuna rotta trovata per questo percorso."
|
95
129
|
fine
|
96
130
|
fine
|
data/lib/iris/versione.ir
CHANGED
data/lib/iris.ir
CHANGED
@@ -10,10 +10,12 @@ modulo Iris
|
|
10
10
|
|
11
11
|
classe Configurazione
|
12
12
|
accessore :registra_azioni
|
13
|
+
accessore :cattura_errori
|
13
14
|
accessore :blocco_recupero_errori
|
14
15
|
|
15
16
|
definisci inizializzatore
|
16
|
-
@registra_azioni
|
17
|
+
@registra_azioni = si
|
18
|
+
@cattura_errori = no
|
17
19
|
@blocco_recupero_errori = nullo
|
18
20
|
fine
|
19
21
|
fine
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iris-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francesco Ballardin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: italian-ruby
|