iris-rb 0.1.9 → 0.1.10

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.
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: []