iris-rb 0.1.2
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 +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.ruby-version +1 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +60 -0
- data/README.md +36 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/iris.gemspec +32 -0
- data/lib/iris/applicazione.ir +54 -0
- data/lib/iris/azione/intestazioni.ir +44 -0
- data/lib/iris/azione/parametri.ir +227 -0
- data/lib/iris/azione/registratore.ir +32 -0
- data/lib/iris/azione.ir +127 -0
- data/lib/iris/load.rb +1 -0
- data/lib/iris/versione.ir +3 -0
- data/lib/iris.ir +4 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6be422f8df8357d8d71729ee28dec6559f1dee436a0ddb535cf747346376fd24
|
4
|
+
data.tar.gz: a3b781e3a5ce7bfc19b3a915b0a02818d3853a6d64f9017c0c54733b7c994d5f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 33c0589f46d772a96532ffbd102dfbfcdbb7eb20703a7e29f02e708854657ef5843a4d56ed235766456038af6613a960f70fdc969361a510471c418b13482821
|
7
|
+
data.tar.gz: ed95846c151350e6bcd4bd7cdc42e856c459f9f8736dee925009f6f035abf5d037705d6abcb7133b05f6a9e4e8c2ed28e671a40f21c9c50b98d5e191386bb5c1
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.0
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
iris-rb (0.1.0)
|
5
|
+
hanami-router (~> 1.3)
|
6
|
+
hanami-utils (~> 1.3)
|
7
|
+
italian-ruby (~> 0.1)
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
concurrent-ruby (1.1.6)
|
13
|
+
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.6)
|
25
|
+
ruby2ruby (~> 2.4)
|
26
|
+
rack (2.2.2)
|
27
|
+
rake (12.3.3)
|
28
|
+
rspec (3.9.0)
|
29
|
+
rspec-core (~> 3.9.0)
|
30
|
+
rspec-expectations (~> 3.9.0)
|
31
|
+
rspec-mocks (~> 3.9.0)
|
32
|
+
rspec-core (3.9.1)
|
33
|
+
rspec-support (~> 3.9.1)
|
34
|
+
rspec-expectations (3.9.1)
|
35
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
36
|
+
rspec-support (~> 3.9.0)
|
37
|
+
rspec-mocks (3.9.1)
|
38
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
+
rspec-support (~> 3.9.0)
|
40
|
+
rspec-support (3.9.2)
|
41
|
+
ruby2ruby (2.4.4)
|
42
|
+
ruby_parser (~> 3.1)
|
43
|
+
sexp_processor (~> 4.6)
|
44
|
+
ruby_parser (3.14.2)
|
45
|
+
sexp_processor (~> 4.9)
|
46
|
+
sexp_processor (4.14.1)
|
47
|
+
transproc (1.1.1)
|
48
|
+
url_mount (0.2.1)
|
49
|
+
rack
|
50
|
+
|
51
|
+
PLATFORMS
|
52
|
+
ruby
|
53
|
+
|
54
|
+
DEPENDENCIES
|
55
|
+
iris-rb!
|
56
|
+
rake (~> 12.0)
|
57
|
+
rspec (~> 3.0)
|
58
|
+
|
59
|
+
BUNDLED WITH
|
60
|
+
2.1.4
|
data/README.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Iris
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/iris`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'iris'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle install
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install iris
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/iris.
|
36
|
+
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
richiedi "iris"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/iris.gemspec
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "italian/ruby"
|
2
|
+
richiedi_relativo "lib/iris/versione"
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "iris-rb"
|
6
|
+
spec.version = Iris::VERSIONE
|
7
|
+
spec.authors = ["Francesco Ballardin"]
|
8
|
+
spec.email = ["francesco.ballardin@develonproject.com"]
|
9
|
+
|
10
|
+
spec.summary = %q{Iris.}
|
11
|
+
spec.description = %q{Iris. Ruby.}
|
12
|
+
spec.homepage = "https://github.com/Pluvie/ruby-iris"
|
13
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
14
|
+
|
15
|
+
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
16
|
+
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
18
|
+
spec.metadata["source_code_uri"] = "https://github.com/Pluvie/ruby-iris"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
23
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
+
end
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
|
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
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require "hanami/router"
|
2
|
+
|
3
|
+
##
|
4
|
+
# Descrive un'applicazione di Iris.
|
5
|
+
# Un'applicazione Iris è compatibile con Rack, quindi è un
|
6
|
+
# oggetto che risponde al metodo `call` (alias `chiama` per Italian Ruby)
|
7
|
+
# e ritorna una risposta in forma di array con stato, intestazioni e corpo.
|
8
|
+
#
|
9
|
+
# Un'esempio di applicazione Iris può essere il seguente:
|
10
|
+
#
|
11
|
+
# classe Libreria
|
12
|
+
# includi Iris::Applicazione
|
13
|
+
#
|
14
|
+
# definisci inizializzatore
|
15
|
+
# @app = _router
|
16
|
+
# fine
|
17
|
+
#
|
18
|
+
# privati
|
19
|
+
#
|
20
|
+
# definisci _router
|
21
|
+
# Hanami::Router.nuovo esegui
|
22
|
+
# get "/", to: Libreria::Azioni::Lista
|
23
|
+
# post "/crea", to: Libreria::Azioni::Crea
|
24
|
+
# fine
|
25
|
+
# fine
|
26
|
+
#
|
27
|
+
# fine
|
28
|
+
#
|
29
|
+
# Quest'applicazione d'esempio `Libreria` definisce due rotte, "/" e "/crea"
|
30
|
+
# che fanno capo a due rispettive azioni. Per dettagli su come definire le
|
31
|
+
# azioni, fare riferimento al modulo `Iris::Azioni` nel file lib/iris/azione.ir.
|
32
|
+
# Per dettagli su come costruire le rotte, fare riferimento al modulo Hanami::Router
|
33
|
+
# disponibile all'indirizzo https://github.com/hanami/router.
|
34
|
+
modulo Iris
|
35
|
+
modulo Applicazione
|
36
|
+
|
37
|
+
##
|
38
|
+
# Inizializza l'applicazione. Questo metodo è da implementare
|
39
|
+
# nella classe in cui si include questo modulo, e dovrà
|
40
|
+
# creare una variabile d'istanza @app che sia compatibile con Rack.
|
41
|
+
# La variabile @app può essere un router che reindirizza la richiesta
|
42
|
+
# ad azioni interne.
|
43
|
+
definisci inizializzatore
|
44
|
+
fine
|
45
|
+
|
46
|
+
##
|
47
|
+
# Questo metodo rende Iris::Applicazione compatibile con Rack.
|
48
|
+
definisci chiama(env)
|
49
|
+
@app.call env
|
50
|
+
fine
|
51
|
+
alias :call :chiama
|
52
|
+
|
53
|
+
fine
|
54
|
+
fine
|
@@ -0,0 +1,44 @@
|
|
1
|
+
modulo Iris
|
2
|
+
modulo Azione
|
3
|
+
##
|
4
|
+
# Definisce costanti per le intestazioni.
|
5
|
+
modulo Intestazioni
|
6
|
+
|
7
|
+
##
|
8
|
+
# Politica di sicurezza sorgenti.
|
9
|
+
POLITICA_SICUREZZA_SORGENTI =
|
10
|
+
"form-action 'self'; frame-ancestors 'self'; base-uri 'self'; default-src 'none'; "\
|
11
|
+
"script-src 'self'; connect-src 'self'; img-src 'self' https: data:; "\
|
12
|
+
"style-src 'self' 'unsafe-inline' https:; font-src 'self'; object-src 'none'; "\
|
13
|
+
"plugin-types application/pdf; child-src 'self'; frame-src 'self'; media-src 'self'".congela
|
14
|
+
|
15
|
+
##
|
16
|
+
# Connessione.
|
17
|
+
CONNESSIONE = "keep-alive".congela
|
18
|
+
|
19
|
+
##
|
20
|
+
# Controllo accessi.
|
21
|
+
CONTROLLO_ACCESSI = Mappa[
|
22
|
+
intestazioni: "Content-Type,Accept,Authorization,Session-Id".congela,
|
23
|
+
metodi: "GET,POST,PUT,PATCH,OPTIONS,DELETE".congela,
|
24
|
+
origini: "*".congela]
|
25
|
+
|
26
|
+
##
|
27
|
+
# Tipo contenuto.
|
28
|
+
TIPO_CONTENUTO = "application/json; charset=utf-8".congela
|
29
|
+
|
30
|
+
##
|
31
|
+
# Opzioni Tipo Contenuto.
|
32
|
+
OPZIONI_TIPO_CONTENUTO = "nosniff".congela
|
33
|
+
|
34
|
+
##
|
35
|
+
# Opzioni Frame
|
36
|
+
OPZIONI_FRAME = "DENY".congela
|
37
|
+
|
38
|
+
##
|
39
|
+
# Protezione Cross-site scripting (XSS).
|
40
|
+
PROTEZIONE_CROSS_SITE_SCRIPTING = "1; mode=block".congela
|
41
|
+
|
42
|
+
fine
|
43
|
+
fine
|
44
|
+
fine
|
@@ -0,0 +1,227 @@
|
|
1
|
+
modulo Iris
|
2
|
+
modulo Azione
|
3
|
+
##
|
4
|
+
# Definisci i parametri di un'azione.
|
5
|
+
# I parametro possono essere controllati implementando il metodo `valida_parametri`.
|
6
|
+
# Un esempio di implementazione può essere il seguente:
|
7
|
+
#
|
8
|
+
# classe CreaLibro
|
9
|
+
# includi Iris::Azione
|
10
|
+
#
|
11
|
+
# definisci valida_parametri
|
12
|
+
# parametri.obbligatorio :nome, :stringa
|
13
|
+
# parametri.obbligatorio :autore esegui |autore|
|
14
|
+
# autore.obbligatorio :nome, :stringa
|
15
|
+
# autore.opzionale :età, :intero, :annullabile
|
16
|
+
# fine
|
17
|
+
# fine
|
18
|
+
#
|
19
|
+
# definisci chiama
|
20
|
+
# fine
|
21
|
+
#
|
22
|
+
# fine
|
23
|
+
#
|
24
|
+
# In questo esempio si richiede un parametro `nome` non annullabile e obbligatorio
|
25
|
+
# per definire il nome del libro, e poi un parametro obbligatorio `autore` che
|
26
|
+
# è annidato e rappresenta l'autore del libro, a sua volta contenente altre validazioni.
|
27
|
+
# Non c'è limite al numero di annidamenti possibili.
|
28
|
+
classe Parametri
|
29
|
+
|
30
|
+
##
|
31
|
+
# Inizializza l'oggetto Parametri.
|
32
|
+
definisci inizializzatore(parametri_originali)
|
33
|
+
@parametri_originali = parametri_originali
|
34
|
+
@parametri_processati = Mappa.nuova
|
35
|
+
@errori = Mappa.nuova
|
36
|
+
@validi = si
|
37
|
+
fine
|
38
|
+
|
39
|
+
##
|
40
|
+
# Determina se i parametri sono validi.
|
41
|
+
definisci validi?
|
42
|
+
@validi
|
43
|
+
fine
|
44
|
+
|
45
|
+
##
|
46
|
+
# Determina se i parametri sono errati.
|
47
|
+
definisci errati?
|
48
|
+
!@validi
|
49
|
+
fine
|
50
|
+
|
51
|
+
##
|
52
|
+
# Ritorna eventuali errori nei parametri.
|
53
|
+
definisci errori
|
54
|
+
@errori
|
55
|
+
fine
|
56
|
+
|
57
|
+
##
|
58
|
+
# Ritorna i parametri processati.
|
59
|
+
definisci ottieni(*argomenti)
|
60
|
+
se argomenti.almeno_uno?
|
61
|
+
@parametri_processati.scava *argomenti
|
62
|
+
altrimenti
|
63
|
+
@parametri_processati
|
64
|
+
fine
|
65
|
+
fine
|
66
|
+
|
67
|
+
##
|
68
|
+
# Esegue un controllo su un parametro obbligatoriol
|
69
|
+
definisci obbligatorio(parametro, *opzioni, &blocco)
|
70
|
+
_controlla parametro, _opzioni_parametro(*opzioni, &blocco).fondi(obbligatorio: si), &blocco
|
71
|
+
fine
|
72
|
+
|
73
|
+
##
|
74
|
+
# Esegue un controllo su un parametro opzionale.
|
75
|
+
definisci opzionale(parametro, *opzioni, &blocco)
|
76
|
+
_controlla parametro, _opzioni_parametro(*opzioni, &blocco).fondi(obbligatorio: no), &blocco
|
77
|
+
fine
|
78
|
+
|
79
|
+
##
|
80
|
+
# Definisce una regola personalizzata sui parametri.
|
81
|
+
# Un'esempio di regola potrebbe essere il seguente:
|
82
|
+
#
|
83
|
+
# classe AggiornaLibro
|
84
|
+
# includi Iris::Azione
|
85
|
+
#
|
86
|
+
# definisci valida_parametri
|
87
|
+
# parametri.regola "il prezzo deve essere maggiore di zero" esegui
|
88
|
+
# parametri.ottieni(:prezzo) > 0.0
|
89
|
+
# fine
|
90
|
+
# fine
|
91
|
+
# fine
|
92
|
+
#
|
93
|
+
# Il valore di ritorno della regola verrà valutato come booleano.
|
94
|
+
# In questo modo verrà aggiunto il messaggio di errore specificato
|
95
|
+
# alle regole, se la regola risulta falsa. Qualsiasi altro
|
96
|
+
# valore di ritorno verrà considerato come valido.
|
97
|
+
definisci regola(messaggio, &blocco)
|
98
|
+
ritorna se @validi == no
|
99
|
+
|
100
|
+
regola_rispettata = si
|
101
|
+
regola_rispettata = blocco.chiama se blocco.esiste?
|
102
|
+
se regola_rispettata == no
|
103
|
+
@validi = no
|
104
|
+
@errori.deposita :regole, [] se @errori.non_ha_chiave? :regole
|
105
|
+
@errori[:regole] << messaggio
|
106
|
+
fine
|
107
|
+
fine
|
108
|
+
|
109
|
+
privati
|
110
|
+
|
111
|
+
##
|
112
|
+
# Recupera le opzioni del parametro, ovvero tipo e annullabilità.
|
113
|
+
definisci _opzioni_parametro(*opzioni, &blocco)
|
114
|
+
mappa_opzioni = Mappa[annullabile: no, tipo_desiderato: :stringa]
|
115
|
+
mappa_opzioni.deposita :annullabile, si se opzioni.include? :annullabile
|
116
|
+
considera
|
117
|
+
quando opzioni.include?(:booleano)
|
118
|
+
mappa_opzioni.deposita :tipo_desiderato, :booleano
|
119
|
+
quando opzioni.include?(:data)
|
120
|
+
mappa_opzioni.deposita :tipo_desiderato, :data
|
121
|
+
quando opzioni.include?(:stringa)
|
122
|
+
mappa_opzioni.deposita :tipo_desiderato, :stringa
|
123
|
+
quando opzioni.include?(:intero)
|
124
|
+
mappa_opzioni.deposita :tipo_desiderato, :intero
|
125
|
+
quando opzioni.include?(:decimale)
|
126
|
+
mappa_opzioni.deposita :tipo_desiderato, :decimale
|
127
|
+
quando opzioni.include?(:lista)
|
128
|
+
mappa_opzioni.deposita :tipo_desiderato, :lista
|
129
|
+
quando opzioni.include?(:mappa)
|
130
|
+
mappa_opzioni.deposita :tipo_desiderato, :mappa
|
131
|
+
fine
|
132
|
+
mappa_opzioni.deposita :tipo_desiderato, :mappa se blocco.esiste?
|
133
|
+
mappa_opzioni
|
134
|
+
fine
|
135
|
+
|
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_desiderato != _tipo_del(valore_parametro)
|
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
|
+
##
|
165
|
+
# Segnala che un parametro deve per forza essere passato.
|
166
|
+
definisci _segnala_presenza_obbligatoria_su(parametro)
|
167
|
+
@validi = no
|
168
|
+
@errori.deposita parametro, "è obbligatorio."
|
169
|
+
lancia :controllo_terminato
|
170
|
+
fine
|
171
|
+
|
172
|
+
##
|
173
|
+
# Segnala che un parametro non può essere nullo.
|
174
|
+
definisci _segnala_non_annullabile_su(parametro)
|
175
|
+
@validi = no
|
176
|
+
@errori.deposita parametro, "non deve essere nullo."
|
177
|
+
lancia :controllo_terminato
|
178
|
+
fine
|
179
|
+
|
180
|
+
##
|
181
|
+
# Segnala che un parametro deve essere una Mappa innestata.
|
182
|
+
definisci _segnala_annidamento_richiesto_su(parametro)
|
183
|
+
@validi = no
|
184
|
+
@errori.deposita parametro, "deve essere un oggetto."
|
185
|
+
lancia :controllo_terminato
|
186
|
+
fine
|
187
|
+
|
188
|
+
##
|
189
|
+
# Segnala che un parametro deve essere del tipo specificato.
|
190
|
+
definisci _segnala_tipo_non_valido_su(parametro, tipo_desiderato)
|
191
|
+
@validi = no
|
192
|
+
@errori.deposita parametro, "deve essere #{_messaggio_per tipo_desiderato}."
|
193
|
+
lancia :controllo_terminato
|
194
|
+
fine
|
195
|
+
|
196
|
+
##
|
197
|
+
# Ottiene il tipo del valore di un parametro.
|
198
|
+
definisci _tipo_del(valore_parametro)
|
199
|
+
considera
|
200
|
+
quando valore_parametro.è_un?(TrueClass) allora :booleano
|
201
|
+
quando valore_parametro.è_un?(FalseClass) allora :booleano
|
202
|
+
quando valore_parametro.è_una?(Data) allora :data
|
203
|
+
quando valore_parametro.è_una?(Stringa) allora :stringa
|
204
|
+
quando valore_parametro.è_un?(Intero) allora :intero
|
205
|
+
quando valore_parametro.è_un?(Decimale) allora :decimale
|
206
|
+
quando valore_parametro.è_una?(Lista) allora :lista
|
207
|
+
quando valore_parametro.è_una?(Mappa) allora :mappa
|
208
|
+
altrimenti nullo fine
|
209
|
+
fine
|
210
|
+
|
211
|
+
##
|
212
|
+
# Messaggio per il tipo parametro.
|
213
|
+
definisci _messaggio_per(tipo_parametro)
|
214
|
+
considera tipo_parametro
|
215
|
+
quando :booleano allora "o vero o falso"
|
216
|
+
quando :data allora "una data"
|
217
|
+
quando :stringa allora "una stringa"
|
218
|
+
quando :intero allora "un numero intero"
|
219
|
+
quando :decimale allora "un numero decimale"
|
220
|
+
quando :lista allora "una lista"
|
221
|
+
quando :mappa allora "un oggetto"
|
222
|
+
altrimenti nullo fine
|
223
|
+
fine
|
224
|
+
|
225
|
+
fine
|
226
|
+
fine
|
227
|
+
fine
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "hanami/logger"
|
2
|
+
|
3
|
+
modulo Iris
|
4
|
+
modulo Azione
|
5
|
+
classe Registratore
|
6
|
+
|
7
|
+
definisci inizializzatore
|
8
|
+
se ENV.esiste? e ENV["APPLICAZIONE"].specificato?
|
9
|
+
@nome_applicazione = ENV["APPLICAZIONE"]
|
10
|
+
altrimenti
|
11
|
+
@nome_applicazione = "app"
|
12
|
+
fine
|
13
|
+
@registratore = Hanami::Logger.nuovo @nome_applicazione
|
14
|
+
fine
|
15
|
+
|
16
|
+
definisci chiama(stato, env)
|
17
|
+
metodo_richiesta = env["REQUEST_METHOD"]
|
18
|
+
percorso_richiesta = env["REQUEST_PATH"]
|
19
|
+
parametri = env["router.params"]
|
20
|
+
messaggio = "#{stato} [#{metodo_richiesta}] #{percorso_richiesta} => #{parametri}".congela
|
21
|
+
|
22
|
+
considera
|
23
|
+
quando stato < 400
|
24
|
+
@registratore.info messaggio
|
25
|
+
quando stato >= 400
|
26
|
+
@registratore.error messaggio
|
27
|
+
fine
|
28
|
+
fine
|
29
|
+
|
30
|
+
fine
|
31
|
+
fine
|
32
|
+
fine
|
data/lib/iris/azione.ir
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
richiedi_relativo "azione/intestazioni"
|
2
|
+
richiedi_relativo "azione/parametri"
|
3
|
+
richiedi_relativo "azione/registratore"
|
4
|
+
|
5
|
+
##
|
6
|
+
# Questo modulo permette di definire un'azione di un'applicazione.
|
7
|
+
# Con azione si intende una specifica procedura da eseguire, di solito
|
8
|
+
# associata ad una rotta. Ad esempio, data un'applicazione `Libreria`
|
9
|
+
# definita in questo modo:
|
10
|
+
#
|
11
|
+
# classe Libreria
|
12
|
+
# includi Iris::Applicazione
|
13
|
+
#
|
14
|
+
# definisci inizializzatore
|
15
|
+
# @app = Hanami::Router.nuovo esegui
|
16
|
+
# get "/", to: Libreria::Azioni::ListaLibri
|
17
|
+
# fine
|
18
|
+
# fine
|
19
|
+
#
|
20
|
+
# fine
|
21
|
+
#
|
22
|
+
# L'azione `ListaLibri` associata potrà essere definita come segue:
|
23
|
+
#
|
24
|
+
# classe Libreria
|
25
|
+
# modulo Azioni
|
26
|
+
# classe ListaLibri
|
27
|
+
# includi Iris::Azione
|
28
|
+
#
|
29
|
+
# definisci chiama
|
30
|
+
# [ 200, {}, [ "Libri" ] ]
|
31
|
+
# fine
|
32
|
+
#
|
33
|
+
# fine
|
34
|
+
# fine
|
35
|
+
# fine
|
36
|
+
#
|
37
|
+
# L'azione `ListaLibri` deve implementare il metodo chiama, che permette
|
38
|
+
# di eseguire la procedura desiderata, e fornire la risposta utilizzando
|
39
|
+
# le variabili d'istanza `@stato`, `@intestazioni` e `@corpo`.
|
40
|
+
modulo Iris
|
41
|
+
modulo Azione
|
42
|
+
|
43
|
+
##
|
44
|
+
# Intestazioni predefinite.
|
45
|
+
INTESTAZIONI_PREDEFINITE = Mappa[
|
46
|
+
"Access-Control-Allow-Headers" => Intestazioni::CONTROLLO_ACCESSI[:intestazioni],
|
47
|
+
"Access-Control-Allow-Methods" => Intestazioni::CONTROLLO_ACCESSI[:metodi],
|
48
|
+
"Access-Control-Allow-Origin" => Intestazioni::CONTROLLO_ACCESSI[:origini],
|
49
|
+
"Connection" => Intestazioni::CONNESSIONE,
|
50
|
+
"Content-Security-Policy" => Intestazioni::POLITICA_SICUREZZA_SORGENTI,
|
51
|
+
"Content-Type" => Intestazioni::TIPO_CONTENUTO,
|
52
|
+
"X-Content-Type-Options" => Intestazioni::OPZIONI_TIPO_CONTENUTO,
|
53
|
+
"X-Frame-Options" => Intestazioni::OPZIONI_FRAME,
|
54
|
+
"X-XSS-Protection" => Intestazioni::PROTEZIONE_CROSS_SITE_SCRIPTING]
|
55
|
+
|
56
|
+
##
|
57
|
+
# Metodo principale eseguito per risolvere l'azione.
|
58
|
+
definisci call(env)
|
59
|
+
_imposta_variabili_istanza env
|
60
|
+
|
61
|
+
cattura :arresta esegui
|
62
|
+
prima
|
63
|
+
valida_parametri
|
64
|
+
chiama
|
65
|
+
fine
|
66
|
+
|
67
|
+
registra @stato, env
|
68
|
+
@corpo = @corpo.to_json se @corpo.risponde_a? :to_json
|
69
|
+
@intestazioni.deposita "Content-Length", @corpo.bytesize.to_s
|
70
|
+
|
71
|
+
[ @stato, @intestazioni, [ @corpo ] ]
|
72
|
+
fine
|
73
|
+
alias :avvia :call
|
74
|
+
|
75
|
+
##
|
76
|
+
# Aggiunge un aggancio per eseguire codice prima
|
77
|
+
# dell'azione effettiva. Può essere utile per definire
|
78
|
+
# controlli sull'utente o altre cose distribuite su azioni
|
79
|
+
# multiple.
|
80
|
+
definisci prima
|
81
|
+
rilascia se blocco_dato?
|
82
|
+
fine
|
83
|
+
|
84
|
+
##
|
85
|
+
# Controlla la validità dei parametri. Questo metodo va implementato
|
86
|
+
# con i controlli desiderati.
|
87
|
+
definisci valida_parametri
|
88
|
+
fine
|
89
|
+
|
90
|
+
##
|
91
|
+
# Registra la richiesta e la risposta.
|
92
|
+
definisci registra(stato, env)
|
93
|
+
@registratore.chiama stato, env
|
94
|
+
fine
|
95
|
+
|
96
|
+
privati
|
97
|
+
|
98
|
+
##
|
99
|
+
# Imposta le variabili d'istanza iniziali.
|
100
|
+
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
|
108
|
+
fine
|
109
|
+
|
110
|
+
##
|
111
|
+
# Metodo di utilità per accedere ai parametri della richiesta.
|
112
|
+
definisci parametri
|
113
|
+
@parametri
|
114
|
+
fine
|
115
|
+
|
116
|
+
##
|
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
|
123
|
+
fine
|
124
|
+
alias :stato :arresta
|
125
|
+
|
126
|
+
fine
|
127
|
+
fine
|
data/lib/iris/load.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
richiedi_relativo "../iris"
|
data/lib/iris.ir
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iris-rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Francesco Ballardin
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-04-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: italian-ruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
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
|
+
description: Iris. Ruby.
|
56
|
+
email:
|
57
|
+
- francesco.ballardin@develonproject.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".ruby-version"
|
65
|
+
- Gemfile
|
66
|
+
- Gemfile.lock
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- bin/console
|
70
|
+
- bin/setup
|
71
|
+
- iris.gemspec
|
72
|
+
- lib/iris.ir
|
73
|
+
- lib/iris/applicazione.ir
|
74
|
+
- lib/iris/azione.ir
|
75
|
+
- lib/iris/azione/intestazioni.ir
|
76
|
+
- lib/iris/azione/parametri.ir
|
77
|
+
- lib/iris/azione/registratore.ir
|
78
|
+
- lib/iris/load.rb
|
79
|
+
- lib/iris/versione.ir
|
80
|
+
homepage: https://github.com/Pluvie/ruby-iris
|
81
|
+
licenses: []
|
82
|
+
metadata:
|
83
|
+
allowed_push_host: https://rubygems.org
|
84
|
+
homepage_uri: https://github.com/Pluvie/ruby-iris
|
85
|
+
source_code_uri: https://github.com/Pluvie/ruby-iris
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 2.3.0
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubygems_version: 3.1.2
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: Iris.
|
105
|
+
test_files: []
|