iris-rb 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 64693e9acfbb6ec7f28cb5c9f6a74fc27151537c33e6e9d00006edcb8bc5c434
4
- data.tar.gz: 42622184cbe0b927c506eb55af7069f5cd78c95163e6754cc8a64b511c0aca1f
3
+ metadata.gz: 6586cd7083bf70634286b8bb7731b91266a324f0b6ceb39bae430a540b394fc7
4
+ data.tar.gz: e23cf1a70868a73adb81ac86a1b773d743a3eb0c123abd361eda1a2da8fe7a2a
5
5
  SHA512:
6
- metadata.gz: f5d8bcc9db21d6287b5015639f9da8753fc4448cb6b302276bf1b7623b0810dfa48051341f17d788cc85adf0fa92a4f3a538fd352ae46cc8ec020760a7a06942
7
- data.tar.gz: 4e27a7ba7776baedea97497947a2ceb6874f5d24af252c7f28dd8035d370b2d87852e0bea04a65ff2ec59076ababd0c889e2b276012cee420c51b1a6cca52a9e
6
+ metadata.gz: '0329abffd9cbfc8e741918348d770478ce5cb5f5f35d6282cd5a1891a47373b76f35974ffa311c2c1f5e9663174126facd170298d93e58ac8c2a8d699183a66b'
7
+ data.tar.gz: 65b178497909977691b415f71f1d9d948a69e989504162c24588c1094d261f745656de9852ceff212f22fe46b2fa2286835f950ea9d4e05365a0d68f78bac574
data/Gemfile CHANGED
@@ -3,5 +3,5 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in iris.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
7
- gem "rspec", "~> 3.0"
6
+ gem "rake", "~> 12.0"
7
+ gem "rspec", "~> 3.0"
data/Gemfile.lock CHANGED
@@ -1,29 +1,15 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- iris-rb (0.1.3)
5
- hanami-router (~> 1.3)
6
- hanami-utils (~> 1.3)
4
+ iris-rb (0.1.10)
7
5
  italian-ruby (~> 0.1)
8
6
 
9
7
  GEM
10
8
  remote: https://rubygems.org/
11
9
  specs:
12
- concurrent-ruby (1.1.6)
13
10
  diff-lcs (1.3)
14
- hanami-router (1.3.2)
15
- hanami-utils (~> 1.3)
16
- http_router (= 0.11.2)
17
- rack (~> 2.0)
18
- hanami-utils (1.3.6)
19
- concurrent-ruby (~> 1.0)
20
- transproc (~> 1.0)
21
- http_router (0.11.2)
22
- rack (>= 1.0.0)
23
- url_mount (~> 0.2.1)
24
- italian-ruby (0.1.10)
11
+ italian-ruby (0.1.13)
25
12
  ruby2ruby (~> 2.4)
26
- rack (2.2.2)
27
13
  rake (12.3.3)
28
14
  rspec (3.9.0)
29
15
  rspec-core (~> 3.9.0)
@@ -44,9 +30,6 @@ GEM
44
30
  ruby_parser (3.14.2)
45
31
  sexp_processor (~> 4.9)
46
32
  sexp_processor (4.14.1)
47
- transproc (1.1.1)
48
- url_mount (0.2.1)
49
- rack
50
33
 
51
34
  PLATFORMS
52
35
  ruby
data/iris.gemspec CHANGED
@@ -27,6 +27,4 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.add_dependency "italian-ruby", "~> 0.1"
30
- spec.add_dependency "hanami-router", "~> 1.3"
31
- spec.add_dependency "hanami-utils", "~> 1.3"
32
30
  end
@@ -108,6 +108,39 @@ modulo Iris
108
108
 
109
109
  privati
110
110
 
111
+ ##
112
+ # Esegue il controllo sul parametro.
113
+ definisci _controlla(parametro, obbligatorio: si, annullabile: si, tipo_desiderato: :stringa, &blocco)
114
+ valore_parametro = @parametri_originali.ottieni parametro, nullo
115
+ valore_parametro = Data.strptime(valore_parametro, "%Y-%m-%d") recupera valore_parametro
116
+
117
+ cattura :controllo_terminato esegui
118
+ _segnala_presenza_obbligatoria_su parametro se obbligatorio == si e @parametri_originali.non_ha_chiave? parametro
119
+
120
+ se @parametri_originali.ha_chiave? parametro
121
+ _segnala_non_annullabile_su parametro se annullabile == no e valore_parametro.non_specificato?
122
+ _segnala_tipo_non_valido_su parametro, tipo_desiderato se tipo_non_corrispondente?(valore_parametro, tipo_desiderato)
123
+ valore_parametro = nullo se valore_parametro.non_specificato?
124
+ @parametri_processati.deposita parametro, valore_parametro
125
+ fine
126
+
127
+ _controlla_annidato parametro, valore_parametro, obbligatorio, &blocco se blocco.esiste?
128
+ fine
129
+ fine
130
+
131
+ ##
132
+ # Esegue il controllo annidato sul parametro.
133
+ definisci _controlla_annidato(parametro, valore_parametro, obbligatorio, &blocco)
134
+ _segnala_annidamento_richiesto_su parametro se obbligatorio == si e valore_parametro.non_è_una? Mappa
135
+ lancia :controllo_terminato se valore_parametro.nullo?
136
+
137
+ parametri_annidati = Parametri.nuovo valore_parametro
138
+ blocco.chiama parametri_annidati
139
+ @validi = (@validi e parametri_annidati.validi?)
140
+ @parametri_processati.deposita parametro, parametri_annidati.ottieni se @validi == si
141
+ @errori.deposita parametro, parametri_annidati.errori se parametri_annidati.errati?
142
+ fine
143
+
111
144
  ##
112
145
  # Recupera le opzioni del parametro, ovvero tipo e annullabilità.
113
146
  definisci _opzioni_parametro(*opzioni, &blocco)
@@ -133,34 +166,6 @@ modulo Iris
133
166
  mappa_opzioni
134
167
  fine
135
168
 
136
- ##
137
- # Esegue il controllo sul parametro.
138
- definisci _controlla(parametro, obbligatorio: si, annullabile: si, tipo_desiderato: :stringa, &blocco)
139
- valore_parametro = @parametri_originali.ottieni parametro, nullo
140
- valore_parametro = Data.strptime(valore_parametro, "%Y-%m-%d") recupera valore_parametro
141
-
142
- cattura :controllo_terminato esegui
143
- _segnala_presenza_obbligatoria_su parametro se obbligatorio == si e @parametri_originali.non_ha_chiave? parametro
144
-
145
- se @parametri_originali.ha_chiave? parametro
146
- _segnala_non_annullabile_su parametro se annullabile == no e valore_parametro.nullo?
147
- _segnala_tipo_non_valido_su parametro, tipo_desiderato se _tipo_non_corrispondente(valore_parametro, tipo_desiderato)
148
- @parametri_processati.deposita parametro, valore_parametro
149
- fine
150
-
151
- se blocco.esiste?
152
- _segnala_annidamento_richiesto_su parametro se obbligatorio == si e valore_parametro.non_è_una? Mappa
153
- lancia :controllo_terminato se valore_parametro.nullo?
154
-
155
- parametri_annidati = Parametri.nuovo valore_parametro
156
- blocco.chiama parametri_annidati
157
- @validi = (@validi e parametri_annidati.validi?)
158
- @parametri_processati.deposita parametro, parametri_annidati.ottieni se @validi == si
159
- @errori.deposita parametro, parametri_annidati.errori se parametri_annidati.errati?
160
- fine
161
- fine
162
- fine
163
-
164
169
  ##
165
170
  # Segnala che un parametro deve per forza essere passato.
166
171
  definisci _segnala_presenza_obbligatoria_su(parametro)
@@ -196,7 +201,7 @@ modulo Iris
196
201
  ##
197
202
  # Determina se il tipo del valore di un parametro è corrispondente
198
203
  # a quello desiderato.
199
- definisci _tipo_non_corrispondente(valore_parametro, tipo_desiderato)
204
+ definisci tipo_non_corrispondente?(valore_parametro, tipo_desiderato)
200
205
  ritorna no se valore_parametro.non_specificato?
201
206
 
202
207
  considera tipo_desiderato
@@ -221,7 +226,7 @@ modulo Iris
221
226
  # Messaggio per il tipo parametro.
222
227
  definisci _messaggio_per(tipo_parametro)
223
228
  considera tipo_parametro
224
- quando :booleano allora "o vero o falso"
229
+ quando :booleano allora "un booleano"
225
230
  quando :data allora "una data"
226
231
  quando :stringa allora "una stringa"
227
232
  quando :intero allora "un numero intero"
@@ -16,7 +16,7 @@ modulo Iris
16
16
  definisci chiama(stato, env)
17
17
  metodo_richiesta = env["REQUEST_METHOD"]
18
18
  percorso_richiesta = env["REQUEST_PATH"]
19
- parametri = env["router.params"]
19
+ parametri = env["iris.parametri"]
20
20
  messaggio = "#{stato} [#{metodo_richiesta}] #{percorso_richiesta} => #{parametri}".congela
21
21
 
22
22
  considera
data/lib/iris/azione.ir CHANGED
@@ -1,6 +1,6 @@
1
+ require "rack/request"
1
2
  richiedi_relativo "azione/intestazioni"
2
3
  richiedi_relativo "azione/parametri"
3
- richiedi_relativo "azione/registratore"
4
4
 
5
5
  ##
6
6
  # Questo modulo permette di definire un'azione di un'applicazione.
@@ -57,6 +57,9 @@ modulo Iris
57
57
  # Metodo principale eseguito per risolvere l'azione.
58
58
  definisci call(env)
59
59
  _imposta_variabili_istanza env
60
+ _converti_parametri_interrogazione
61
+ _converti_corpo_in_json
62
+ _inizializza_parametri
60
63
 
61
64
  cattura :arresta esegui
62
65
  prima
@@ -64,14 +67,22 @@ modulo Iris
64
67
  chiama
65
68
  fine
66
69
 
67
- registra @stato, env
68
- @corpo = @corpo.to_json se @corpo.risponde_a? :to_json
70
+ @corpo = @corpo.in_json se @corpo.risponde_a? :in_json
69
71
  @intestazioni.deposita "Content-Length", @corpo.bytesize.to_s
70
72
 
71
73
  [ @stato, @intestazioni, [ @corpo ] ]
72
74
  fine
73
75
  alias :avvia :call
74
76
 
77
+ ##
78
+ # Metodo per risolvere l'azione in modo personalizzato.
79
+ # In questo metodo è possibile impostare lo stato, le intestazioni
80
+ # o il corpo della risposta. È inoltre possibile utilizzare
81
+ # i metodi `arresta` e `stato` per interrompere il flusso dell'azione
82
+ # e ritornare immediatamente i valori passati.
83
+ definisci chiama
84
+ fine
85
+
75
86
  ##
76
87
  # Aggiunge un aggancio per eseguire codice prima
77
88
  # dell'azione effettiva. Può essere utile per definire
@@ -81,6 +92,12 @@ modulo Iris
81
92
  rilascia se blocco_dato?
82
93
  fine
83
94
 
95
+ ##
96
+ # Metodo di utilità per accedere ai parametri della richiesta.
97
+ definisci parametri
98
+ @parametri
99
+ fine
100
+
84
101
  ##
85
102
  # Controlla la validità dei parametri. Questo metodo va implementato
86
103
  # con i controlli desiderati.
@@ -88,40 +105,57 @@ modulo Iris
88
105
  fine
89
106
 
90
107
  ##
91
- # Registra la richiesta e la risposta.
92
- definisci registra(stato, env)
93
- @registratore.chiama stato, env
108
+ # Metodo per terminare subito un'azione, fornendo
109
+ # stato e corpo risposta.
110
+ definisci arresta(stato, corpo)
111
+ @stato = stato
112
+ @corpo = corpo
113
+ lancia :arresta
94
114
  fine
115
+ alias :stato :arresta
95
116
 
96
117
  privati
97
118
 
98
119
  ##
99
120
  # Imposta le variabili d'istanza iniziali.
100
121
  definisci _imposta_variabili_istanza(env)
101
- @env = env
102
- @stato = 200
103
- @intestazioni = INTESTAZIONI_PREDEFINITE
104
- @corpo = nullo
105
- @parametri = Parametri.nuovo @env["router.params"] || Mappa.nuova
106
- @utente_corrente = @env["utente_corrente"]
107
- @registratore = Iris::Azione::Registratore.nuovo
122
+ @env = env
123
+ @stato = 200
124
+ @intestazioni = INTESTAZIONI_PREDEFINITE
125
+ @corpo = nullo
126
+ @env["iris.parametri"] ||= Mappa.nuova
108
127
  fine
109
128
 
110
129
  ##
111
- # Metodo di utilità per accedere ai parametri della richiesta.
112
- definisci parametri
113
- @parametri
130
+ # Inizializza i parametri.
131
+ definisci _inizializza_parametri
132
+ @parametri = Parametri.nuovo @env["iris.parametri"]
133
+ fine
134
+
135
+ ##
136
+ # Converte il corpo della richiesta in JSON.
137
+ definisci _converti_corpo_in_json
138
+ ritorna se @env["rack.input"].nullo?
139
+ corpo = @env["rack.input"].read
140
+ ritorna se corpo.non_specificato?
141
+
142
+ inizia
143
+ corpo_convertito = (JSON.processa corpo).simbolizza
144
+ @env["iris.parametri"].fondi! corpo_convertito se corpo_convertito.è_una? Mappa
145
+ @env["iris.corpo"] = corpo_convertito
146
+ recupera JSON::ParserError => errore
147
+ arresta 400, errore: "Il corpo fornito non è un JSON valido."
148
+ fine
149
+ @env["rack.input"].rewind
114
150
  fine
115
151
 
116
152
  ##
117
- # Metodo per terminare subito un'azione, fornendo
118
- # stato e corpo risposta.
119
- definisci arresta(stato, corpo)
120
- @stato = stato
121
- @corpo = corpo
122
- lancia :arresta
153
+ # Converte i parametri della richiesta.
154
+ definisci _converti_parametri_interrogazione
155
+ ritorna a_meno_che @env["REQUEST_URI"].specificato? e @env["REQUEST_URI"].include?("?")
156
+ parametri_stringa_interrogazione = @env["REQUEST_URI"].partiziona("?").ultimo
157
+ @env["iris.parametri"].fondi! Rack::Utils.parse_nested_query(parametri_stringa_interrogazione).simbolizza
123
158
  fine
124
- alias :stato :arresta
125
159
 
126
160
  fine
127
161
  fine
@@ -0,0 +1,6 @@
1
+ modulo Iris
2
+ classe Navigatore
3
+ classe Percorso
4
+ fine
5
+ fine
6
+ fine
@@ -0,0 +1,51 @@
1
+ modulo Iris
2
+ classe Navigatore
3
+ classe Rotta
4
+
5
+ definisci inizializzatore(metodo, percorso, azione)
6
+ @metodo = metodo.in_stringa.maiuscolo
7
+ @percorso = percorso
8
+ @passi_definiti = percorso.dividi("/").seleziona(&:specificato?)
9
+ @azione = azione
10
+ @parametri = Mappa.nuova
11
+ fine
12
+
13
+ definisci raggiungi(env)
14
+ env["iris.parametri"] ||= Mappa.nuova
15
+ env["iris.parametri"].fondi! @parametri se @parametri.esiste?
16
+
17
+ se @azione.risponde_a? :chiama
18
+ @azione.chiama env
19
+ altrimenti
20
+ @azione.nuova.avvia env
21
+ fine
22
+ fine
23
+
24
+ definisci raggiungibile_per?(metodo, percorso_richiesta)
25
+ ritorna no se metodo != @metodo
26
+ ritorna si se @passi_definiti.ultimo == "*"
27
+
28
+ passi_richiesta = percorso_richiesta.dividi("/").seleziona(&:specificato?)
29
+ ritorna no se passi_richiesta.conteggio > @passi_definiti.conteggio
30
+
31
+ percorsi_affiancati = @passi_definiti.cerniera passi_richiesta
32
+ percorsi_affiancati.tutti? esegui |passo_definito, passo_richiesto|
33
+ ritorna no se passo_definito.nullo? o passo_richiesto.nullo?
34
+ prossima _memorizza_parametro(passo_definito, passo_richiesto) se passo_definito.inizia_con? ":"
35
+ passo_definito == passo_richiesto
36
+ fine
37
+ fine
38
+
39
+ privati
40
+
41
+ ##
42
+ # Memorizza il parametro trovato durante il percorso.
43
+ definisci _memorizza_parametro(chiave, valore)
44
+ ritorna se chiave == ":"
45
+ @parametri.deposita chiave[1..].in_simbolo, valore
46
+ si
47
+ fine
48
+
49
+ fine
50
+ fine
51
+ fine
@@ -0,0 +1,99 @@
1
+ richiedi_relativo "azione"
2
+
3
+ modulo Iris
4
+ classe Navigatore
5
+
6
+ ##
7
+ # Metodi supportati.
8
+ METODI_SUPPORTATI = [ :get, :post, :patch, :put, :delete, :options ]
9
+
10
+ definisci inizializzatore(azione: nulla, percorso_padre: nullo, &blocco)
11
+ @rotte = []
12
+ @percorso_padre = percorso_padre
13
+ @azione_rotta_non_raggiungibile = RottaNonRaggiungibile
14
+
15
+ se azione.esiste?
16
+ @azione = azione
17
+ altrimenti
18
+ esegui_in_istanza &blocco se blocco.esiste?
19
+ fine
20
+ fine
21
+
22
+ definisci risolvi(env)
23
+ se @azione.esiste?
24
+ @azione.avvia env
25
+ altrimenti
26
+ rotta_raggiungibile = cerca_rotta_raggiungibile_per env
27
+ se rotta_raggiungibile.esiste?
28
+ rotta_raggiungibile.raggiungi env
29
+ altrimenti
30
+ @azione_rotta_non_raggiungibile.nuova.avvia env
31
+ fine
32
+ fine
33
+ fine
34
+ alias :call :risolvi
35
+
36
+ ##
37
+ # Cerca la rotta raggiungibile per la richiesta.
38
+ definisci cerca_rotta_raggiungibile_per(env)
39
+ rotta_raggiungibile = nulla
40
+ metodo = env["REQUEST_METHOD"]
41
+ percorso_richiesta = env["REQUEST_PATH"] || env["PATH_INFO"]
42
+
43
+ cattura :rotta_trovata esegui
44
+ @rotte.per_ognuna esegui |rotta_definita|
45
+ se rotta_definita.è_una? Iris::Navigatore::Rotta
46
+ se rotta_definita.raggiungibile_per? metodo, percorso_richiesta
47
+ rotta_raggiungibile = rotta_definita
48
+ lancia :rotta_trovata
49
+ fine
50
+ altrimenti_se rotta_definita.è_un? Iris::Navigatore
51
+ rotta_raggiungibile = rotta_definita.cerca_rotta_raggiungibile_per env
52
+ lancia :rotta_trovata se rotta_raggiungibile.esiste?
53
+ fine
54
+ fine
55
+ fine
56
+ rotta_raggiungibile
57
+ fine
58
+
59
+ privati
60
+
61
+ ##
62
+ # Definisce una rotta.
63
+ definisci rotta(percorso_rotta, **opzioni)
64
+ azione = opzioni.ottieni :verso
65
+ nome_metodo = __callee__
66
+ percorso_completo = [ @percorso_padre, percorso_rotta ].unisci
67
+ alza "Metodo `#{nome_metodo}` non supportato. I metodi supportati per le rotte "\
68
+ "sono #{METODI_SUPPORTATI.unisci(",")}" se nome_metodo.non_in? METODI_SUPPORTATI
69
+
70
+ @rotte << Iris::Navigatore::Rotta.nuova(nome_metodo, percorso_completo, azione)
71
+ fine
72
+ alias :get :rotta
73
+ alias :post :rotta
74
+ alias :patch :rotta
75
+ alias :put :rotta
76
+ alias :delete :rotta
77
+ alias :options :rotta
78
+
79
+ ##
80
+ # Definisce una percorso annidata.
81
+ definisci percorso(percorso_rotta, &blocco)
82
+ alza "Definire un percorso valido, non può essere nullo né vuoto." se percorso_rotta.non_specificato?
83
+ percorso_completo = [ @percorso_padre, percorso_rotta ].unisci
84
+ @rotte << Iris::Navigatore.nuovo(azione: nulla, percorso_padre: percorso_completo, &blocco)
85
+ fine
86
+
87
+ ##
88
+ # L'azione predefinita con cui rispondere se non vengono
89
+ # trovate rotte raggiungibili per il metodo e il percorso richiesto.
90
+ classe RottaNonRaggiungibile
91
+ includi Iris::Azione
92
+
93
+ definisci chiama
94
+ arresta 405, errore: "Nessuna rotta trovata per questo percorso."
95
+ fine
96
+ fine
97
+
98
+ fine
99
+ fine
data/lib/iris/versione.ir CHANGED
@@ -1,3 +1,3 @@
1
1
  modulo Iris
2
- VERSIONE = "0.1.9"
2
+ VERSIONE = "0.1.10"
3
3
  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.1.9
4
+ version: 0.1.10
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-03 00:00:00.000000000 Z
11
+ date: 2020-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: italian-ruby
@@ -24,34 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.1'
27
- - !ruby/object:Gem::Dependency
28
- name: hanami-router
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.3'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.3'
41
- - !ruby/object:Gem::Dependency
42
- name: hanami-utils
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '1.3'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '1.3'
55
27
  description: Iris. Ruby.
56
28
  email:
57
29
  - francesco.ballardin@develonproject.com
@@ -76,6 +48,9 @@ files:
76
48
  - lib/iris/azione/parametri.ir
77
49
  - lib/iris/azione/registratore.ir
78
50
  - lib/iris/load.rb
51
+ - lib/iris/navigatore.ir
52
+ - lib/iris/navigatore/percorso.ir
53
+ - lib/iris/navigatore/rotta.ir
79
54
  - lib/iris/versione.ir
80
55
  homepage: https://github.com/Pluvie/ruby-iris
81
56
  licenses: []