mangusta 0.4.2 → 0.5.0

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: 282586125997af13e97c9464ebb4c09556f9541f948edea898358cb2619dab49
4
- data.tar.gz: a39f78b1cdc5c9f4b061c90a02a8a8c08e65c66afe784f45d44f1dedc0cbfca8
3
+ metadata.gz: 3025be0dedcde244996c477c8e879032a60a2e872aed4667f0858df3aec06be5
4
+ data.tar.gz: 71c12d3fcd5bb8887527ea04bc6b767fdbcdf94e54a29613a9b4b60df3f2731b
5
5
  SHA512:
6
- metadata.gz: 53b9cb1da2c46e5a578266b392a5b6c31843987ba1661ecf6a5798b614060e1ed627194d838633a86dd2700cbd542fe96ce1518ecdff644cdafc1756d232a5b3
7
- data.tar.gz: cc62330f776e2ad9631abdb2eb16631bddc3037c4568e2345c364dd6e319817936824620b162eddedb46a293aedce6f707e84d685286ba30c49e231e8562c89a
6
+ metadata.gz: da37743a7de44df5814952d6e06df610cecb001b6cd9e989a54c3ca87a4ee99957a2809ee63fd0b3b188dcc94afb169e64361e31d4558a927835ff08078209e3
7
+ data.tar.gz: df54fe5798baedc2a4492dfb5498965d053fd53e2ff380a49eb1c66d193c3f36fce57335a162cd93fa68bae21fa01b37bc58230685437bcada5a42dbdcbfe38b
data/.gitignore CHANGED
@@ -6,6 +6,7 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /.italian-ruby/
9
10
 
10
11
  # rspec failure tracking
11
12
  .rspec_status
data/Gemfile CHANGED
@@ -3,5 +3,5 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in mangusta.gemspec
4
4
  gemspec
5
5
 
6
- gem "rake", "~> 12.0"
6
+ gem "rake", "~> 13.0"
7
7
  gem "rspec", "~> 3.0"
@@ -1,46 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mangusta (0.3.2)
4
+ mangusta (0.4.6)
5
5
  italian-ruby (~> 0.1)
6
6
  mongo (~> 2.11)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- bson (4.8.2)
11
+ bson (4.9.1)
12
12
  diff-lcs (1.3)
13
- italian-ruby (0.2.7)
14
- ruby2ruby (~> 2.4)
15
- mongo (2.12.0)
13
+ italian-ruby (0.8.0)
14
+ mongo (2.12.1)
16
15
  bson (>= 4.8.2, < 5.0.0)
17
- rake (12.3.3)
16
+ rake (13.0.1)
18
17
  rspec (3.9.0)
19
18
  rspec-core (~> 3.9.0)
20
19
  rspec-expectations (~> 3.9.0)
21
20
  rspec-mocks (~> 3.9.0)
22
- rspec-core (3.9.1)
23
- rspec-support (~> 3.9.1)
24
- rspec-expectations (3.9.1)
21
+ rspec-core (3.9.2)
22
+ rspec-support (~> 3.9.3)
23
+ rspec-expectations (3.9.2)
25
24
  diff-lcs (>= 1.2.0, < 2.0)
26
25
  rspec-support (~> 3.9.0)
27
26
  rspec-mocks (3.9.1)
28
27
  diff-lcs (>= 1.2.0, < 2.0)
29
28
  rspec-support (~> 3.9.0)
30
- rspec-support (3.9.2)
31
- ruby2ruby (2.4.4)
32
- ruby_parser (~> 3.1)
33
- sexp_processor (~> 4.6)
34
- ruby_parser (3.14.2)
35
- sexp_processor (~> 4.9)
36
- sexp_processor (4.14.1)
29
+ rspec-support (3.9.3)
37
30
 
38
31
  PLATFORMS
39
32
  ruby
40
33
 
41
34
  DEPENDENCIES
42
35
  mangusta!
43
- rake (~> 12.0)
36
+ rake (~> 13.0)
44
37
  rspec (~> 3.0)
45
38
 
46
39
  BUNDLED WITH
@@ -1,6 +1,7 @@
1
- require "mongo"
2
- require "italian/ruby/core_ext/gems/bson"
3
- require_relative "mangusta/core_ext/mongo"
1
+ richiedi "bson"
2
+ richiedi "mongo"
3
+ richiedi "italian/ruby/core_ext/gems/bson"
4
+ richiedi_relativo "mangusta/core_ext/mongo"
4
5
  richiedi_tutti "mangusta"
5
6
 
6
7
  modulo Mangusta
@@ -19,8 +20,8 @@ modulo Mangusta
19
20
  ritorna connessione se connessione.esiste?
20
21
 
21
22
  se_stessa.connessione = Mongo::Client.nuovo(
22
- [ parametri.ottieni(:indirizzo) ],
23
- database: parametri.ottieni(:base_dati))
23
+ [ parametri.prendi(:indirizzo) ],
24
+ database: parametri.prendi(:base_dati))
24
25
 
25
26
  se_stessa.base_dati = connessione.database
26
27
  se_stessa.collezioni = base_dati.collections
@@ -12,6 +12,7 @@ module Mongo
12
12
  class View
13
13
  alias :primo :first
14
14
  alias :lista :entries
15
+ alias :conteggio :count
15
16
  end
16
17
  end
17
18
  end
@@ -13,7 +13,13 @@ modulo Mangusta
13
13
  # includi Mangusta::Documento
14
14
  #
15
15
  # campo :titolo, valore_iniziale: "Il Signore degli Anelli"
16
- # appartiene_a :autore, classe: "Autore"
16
+ #
17
+ # appartiene_a :autore,
18
+ # ripostiglio: "RipostiglioAutori",
19
+ # nome_campo: :id_autore
20
+ #
21
+ # incorpora_molte :ristampe,
22
+ # nome_classe: "Libro::Ristampa"
17
23
  # fine
18
24
  #
19
25
  # Il metodo di classe `campo` ha come primo argomento obbligatorio il nome del campo,
@@ -23,24 +29,53 @@ modulo Mangusta
23
29
  #
24
30
  # I metodi di classe `appartiene_a`, `ha_molte`, `ha_e_appartiene_a_molte` (gli ultimi
25
31
  # due hanno alias `ha_molti` e `ha_e_appartiene_a_molti`) definiscono delle relazioni.
32
+ #
33
+ # I metodi di classe `incorpora_un` (alias `incorpora_una`) e `incorpora_molti` (alias
34
+ # `incorpora_molte`) definiscono dei documenti incorporati. Un esempio di documento
35
+ # incorporato è questo:
36
+ #
37
+ # classe Libro
38
+ # classe Ristampa
39
+ # includi Mangusta::Documento
40
+ #
41
+ # campo :anno
42
+ #
43
+ # incorporato_in :libro,
44
+ # nome_classe: "Libro"
45
+ # fine
46
+ # fine
26
47
  modulo Documento
27
48
 
28
49
  ##
29
50
  # Inizializzatore di un documento.
30
51
  # Si preoccupa di impostare campi ed eventuali valori iniziali.
31
52
  definisci inizializzatore(**attributi)
32
- ritorna se se_stesso.classe.campi.nullo? o se_stesso.classe.campi.vuoto?
53
+ ritorna se campi.nessuno?
54
+ _assegna_valori_iniziali
55
+ assegna **attributi
56
+ assegna _id: IdOggetto.nuovo se _id.nullo?
57
+ fine
33
58
 
34
- se_stesso.classe.campi.per_ognuno esegui |campo|
35
- _inizializza_campo campo
59
+ ##
60
+ # Assegna dei valori al documento.
61
+ definisci assegna(**attributi)
62
+ attributi.per_ognuno esegui |nome_attributo, valore_attributo|
63
+ metodo_assegnazione = "#{nome_attributo}="
64
+ prossimo se se_stesso.non_risponde_a? metodo_assegnazione
65
+ se_stesso.manda metodo_assegnazione, valore_attributo
36
66
  fine
37
67
 
38
- assegna **attributi
39
- _genera_nuovo_id se ottieni_valore(:_id).nullo?
40
- _genera_documento_padre **attributi se attributi.ha_chiave? :_padre
41
- _memorizza_attributi_originali **attributi
68
+ se_stesso
42
69
  fine
43
70
 
71
+ ##
72
+ # Espone il documento come JSON.
73
+ definisci esponi(*chiavi_richieste, **relazioni_richieste)
74
+ espositore = Mangusta::Documento::Espositore.nuovo se_stesso, *chiavi_richieste, **relazioni_richieste
75
+ espositore.esponi
76
+ fine
77
+ alias :in_mappa :esponi
78
+
44
79
  ##
45
80
  # Recupera i campi definiti.
46
81
  definisci campi
@@ -55,141 +90,29 @@ modulo Mangusta
55
90
 
56
91
  ##
57
92
  # Recupera i documenti incorporati.
58
- definisci documenti_incorporati
59
- se_stesso.classe.documenti_incorporati || []
60
- fine
61
-
62
- ##
63
- # Recupera il valore di un campo del documento.
64
- definisci ottieni_valore(nome_campo)
65
- valore_campo = ottieni_variabile_istanza "@#{nome_campo}"
66
- ritorna valore_campo se valore_campo.non_è_una? Mappa
67
- valore_campo.simbolizza
68
- fine
69
-
70
- ##
71
- # Imposta il valore di un campo del documento.
72
- definisci imposta_valore(nome_campo, valore_campo)
73
- imposta_variabile_istanza "@#{nome_campo}", valore_campo
74
- fine
75
-
76
- ##
77
- # Ottiene la rappresentazione per stampa dell'oggetto.
78
- definisci inspect
79
- "#<#{se_stesso.classe} #{se_stesso.esponi}>"
80
- fine
81
- definisci ai(opzioni = Mappa.nuova)
82
- se definito? AwesomePrint
83
- ap = AwesomePrint::Inspector.nuovo opzioni.fondi(indent: 2, ruby19_syntax: si)
84
- "#<#{se_stesso.classe} #{ap.awesome se_stesso.esponi}>"
85
- altrimenti
86
- inspect
87
- fine
88
- fine
89
-
90
- ##
91
- # Uguaglianza di documenti.
92
- definisci ==(documento)
93
- _id == documento._id
94
- fine
95
- definisci ===(documento)
96
- se_stesso == documento
97
- fine
98
- definisci eql?(documento)
99
- se_stesso == documento
100
- fine
101
-
102
- ##
103
- # Ottiene la rappresentazione in Mappa dei campi del documento.
104
- definisci esponi(*chiavi_richieste, **relazioni_richieste)
105
- Espositore.nuovo(se_stesso, *chiavi_richieste, **relazioni_richieste).esponi
93
+ definisci incorporati
94
+ se_stesso.classe.incorporati || []
106
95
  fine
107
96
 
108
97
  ##
109
- # Assegna i parametri passati al documento. Considera anche gli alias.
110
- definisci assegna(**parametri)
111
- parametri.per_ognuno esegui |nome_parametro, valore_parametro|
112
- nome_metodo_assegnamento = "#{nome_parametro}="
113
- prossimo se se_stesso.non_risponde_a? nome_metodo_assegnamento
114
- se_stesso.manda nome_metodo_assegnamento, _converti_in_id(valore_parametro)
98
+ # Codice da eseguire quando questo modulo verrà incluso.
99
+ definisci se_stesso.quando_incluso(classe_documento)
100
+ classe_documento.apri_classe esegui
101
+ includi Mangusta::Documento::MetodiCondivisi
102
+ estendi Mangusta::Documento::MetodiDiClasse
103
+ _inizializza_documento
115
104
  fine
116
- se_stesso
117
- fine
118
-
119
- ##
120
- # Accede al valore dell'attributo originale del documento,
121
- # passando oltre gli accessori, per accedere a campi non modellati.
122
- definisci [](attributo)
123
- @_attributi_originali.ottieni attributo
124
- fine
125
-
126
- ##
127
- # Accede al documento padre, se presente.
128
- definisci _padre
129
- @_padre
130
105
  fine
131
106
 
132
107
  privati
133
108
 
134
109
  ##
135
- # Imposta il valore iniziale di un campo.
136
- definisci _inizializza_campo(campo)
137
- se campo.ha_valore_iniziale?
138
- imposta_variabile_istanza "@#{campo.nome}", campo.valore_iniziale
139
- altrimenti
140
- imposta_variabile_istanza "@#{campo.nome}", nullo
110
+ # Assegna i valori iniziali ai campi.
111
+ definisci _assegna_valori_iniziali
112
+ campi.seleziona { |campo| campo.ha_valore_iniziale? }.per_ognuno esegui |campo|
113
+ campo.assegna se_stesso, campo.valore_iniziale
141
114
  fine
142
115
  fine
143
116
 
144
- ##
145
- # Genera un nuovo id.
146
- definisci _genera_nuovo_id
147
- imposta_valore :_id, IdOggetto.nuovo
148
- fine
149
-
150
- ##
151
- # Genera il puntatore al documento padre.
152
- definisci _genera_documento_padre(**attributi)
153
- @_padre = attributi.ottieni :_padre
154
- fine
155
-
156
- ##
157
- # Converte in IdOggetto una stringa.
158
- # Se la conversione fallisce, ritorna la stringa iniziale.
159
- definisci _converti_in_id(stringa)
160
- ritorna stringa se stringa.non_è_una? Stringa
161
- IdOggetto.converti(stringa)
162
- recupera
163
- stringa
164
- fine
165
-
166
- ##
167
- # Memorizza gli attiributi originali del documento.
168
- definisci _memorizza_attributi_originali(**attributi)
169
- @_attributi_originali = attributi
170
- fine
171
-
172
- ##
173
- # Codice da eseguire quando questo modulo verrà incluso.
174
- definisci se_stesso.quando_incluso(classe_documento)
175
-
176
- classe_documento.apri_classe esegui
177
- estendi Mangusta::Documento::MetodiDiClasse
178
-
179
- classe << se_stesso
180
- accessore :campi
181
- accessore :relazioni
182
- accessore :documenti_incorporati
183
- fine
184
-
185
- se_stesso.campi = []
186
- se_stesso.relazioni = []
187
- se_stesso.documenti_incorporati = []
188
-
189
- _memorizza_campo :_id
190
- fine
191
-
192
- fine
193
-
194
117
  fine
195
118
  fine
@@ -6,12 +6,16 @@ modulo Mangusta
6
6
 
7
7
  accessore :nome
8
8
  accessore :valore_iniziale
9
+ accessore :per_relazione
10
+ accessore :per_incorporato
9
11
 
10
12
  ##
11
13
  # Imposta nome e valore iniziale.
12
- definisci inizializzatore(nome, **parametri)
13
- se_stesso.nome = nome
14
- se_stesso.valore_iniziale = parametri.ottieni(:valore_iniziale, nullo)
14
+ definisci inizializzatore(nome, **opzioni)
15
+ se_stesso.nome = nome
16
+ se_stesso.valore_iniziale = opzioni.prendi :valore_iniziale, nullo
17
+ se_stesso.per_relazione = opzioni.prendi :per_relazione, no
18
+ se_stesso.per_incorporato = opzioni.prendi :per_incorporato, no
15
19
  fine
16
20
 
17
21
  ##
@@ -20,6 +24,36 @@ modulo Mangusta
20
24
  se_stesso.valore_iniziale.esiste?
21
25
  fine
22
26
 
27
+ ##
28
+ # Determina se il campo è stato creato per una relazione.
29
+ definisci per_relazione?
30
+ se_stesso.per_relazione == si
31
+ fine
32
+
33
+ ##
34
+ # Determina se il campo è stato creato per un documento incorporato.
35
+ definisci per_incorporato?
36
+ se_stesso.per_incorporato == si
37
+ fine
38
+
39
+ ##
40
+ # Ottiene il valore del campo.
41
+ definisci valore(documento)
42
+ valore_campo = documento.ottieni_variabile_istanza "@#{nome}"
43
+
44
+ se valore_campo.risponde_a? :simbolizza
45
+ valore_campo.simbolizza
46
+ altrimenti
47
+ valore_campo
48
+ fine
49
+ fine
50
+
51
+ ##
52
+ # Assegna il valore al campo.
53
+ definisci assegna(documento, valore_da_assegnare)
54
+ documento.imposta_variabile_istanza "@#{nome}", valore_da_assegnare
55
+ fine
56
+
23
57
  fine
24
58
  fine
25
59
  fine
@@ -5,63 +5,139 @@ modulo Mangusta
5
5
  classe Espositore
6
6
 
7
7
  ##
8
- # Imposta campi e relazioni richieste.
9
- definisci inizializzatore(documento, *chiavi_richieste, **relazioni_richieste)
10
- @documento = documento
11
- @campi_richiesti = chiavi_richieste.seleziona { |chiave| chiave.in? documento.campi.mappa(&:nome) }
12
- @relazioni_dirette = chiavi_richieste.seleziona { |chiave| chiave.in? documento.relazioni.mappa(&:nome) }
13
- @relazioni_annidate = relazioni_richieste.chiavi
14
- @relazioni_richieste = relazioni_richieste
8
+ # Inizializza l'espositore.
9
+ definisci inizializzatore(documento, *interi_richiesti, **filtrati_richiesti)
10
+ @documento = documento
11
+ @filtrati_richiesti = filtrati_richiesti
12
+
13
+ alza "campi, relazioni o incorporati da esporre interamente devono essere Simboli" se
14
+ interi_richiesti.almeno_uno? { |intero_richiesto| intero_richiesto.non_è_un? Simbolo }
15
+
16
+ alza "relazioni o incorporati da filtrare deve essere una Mappa con chiave Simbolo e valore Liste di Simboli" se
17
+ filtrati_richiesti.chiavi.almeno_una? { |chiave| chiave.non_è_un? Simbolo } o
18
+ filtrati_richiesti.valori.almeno_uno? { |lista| lista.non_è_una? Lista } o
19
+ filtrati_richiesti.valori.almeno_uno? { |lista| lista.almeno_uno? { |valore| valore.non_è_un? Simbolo } }
20
+
21
+ @campi = documento.campi.seleziona esegui |campo|
22
+ campo.nome.in? interi_richiesti
23
+ fine
24
+ @relazioni_intere = documento.relazioni.seleziona esegui |relazione|
25
+ relazione.nome.in? interi_richiesti
26
+ fine
27
+ @relazioni_filtrate = documento.relazioni.seleziona esegui |relazione|
28
+ relazione.nome.in? filtrati_richiesti.chiavi
29
+ fine
30
+ @incorporati_interi = documento.incorporati.seleziona esegui |incorporato|
31
+ incorporato.nome.in? interi_richiesti
32
+ fine
33
+ @incorporati_filtrati = documento.incorporati.seleziona esegui |incorporato|
34
+ incorporato.nome.in? filtrati_richiesti.chiavi
35
+ fine
36
+
37
+ @campi = @documento.campi se @campi.nessuno?
38
+ @incorporati_interi = @documento.incorporati se @incorporati_interi.nessuno? e @incorporati_filtrati.nessuno?
15
39
  fine
16
40
 
17
41
  ##
18
42
  # Espone il documento.
19
43
  definisci esponi
20
- @documento_convertito = Mangusta::Utilità.converti_in_json @documento,
21
- *(@relazioni_dirette + @relazioni_annidate)
44
+ documento_esposto = Mappa.nuova
22
45
 
23
- se @campi_richiesti.nessuno?
24
- @documento_convertito
25
- altrimenti
26
- filtra_esposizione
27
- fine
46
+ _esponi_campi_su documento_esposto
47
+ _esponi_incorporati_interi_su documento_esposto
48
+ _esponi_incorporati_filtrati_su documento_esposto
49
+ _esponi_relazioni_intere_su documento_esposto
50
+ _esponi_relazioni_filtrate_su documento_esposto
51
+
52
+ documento_esposto
28
53
  fine
29
54
 
30
- ##
31
- # Filtra l'esposizione del documento sui campi o relazioni richieste.
32
- definisci filtra_esposizione
33
- esposizione_filtrata = Mappa.nuova
55
+ privati
56
+
57
+ ##
58
+ # Espone i campi sul documento esposto.
59
+ definisci _esponi_campi_su(documento_esposto)
60
+ @campi.per_ognuno esegui |campo|
61
+ valore_campo = @documento.manda campo.nome
62
+ prossimo se valore_campo.nullo? o campo.nome == :_padre
63
+
64
+ se valore_campo.è_una? Mappa
65
+ valore_campo = valore_campo.simbolizza
66
+ altrimenti_se valore_campo.è_una? Lista
67
+ valore_campo = valore_campo.mappa(&:simbolizza) recupera valore_campo
68
+ fine
34
69
 
35
- @campi_richiesti.per_ognuno esegui |campo_richiesto|
36
- prossimo se campo_richiesto.non_è_un? Simbolo
37
- esposizione_filtrata.deposita campo_richiesto, @documento_convertito.ottieni(campo_richiesto, nullo)
70
+ documento_esposto.deposita campo.nome, valore_campo
71
+ fine
38
72
  fine
39
73
 
40
- @relazioni_dirette.per_ognuna esegui |relazione_richiesta|
41
- alza Relazione::NonInclusa, "per poter esporre la relazione `#{relazione_richiesta}` è necessario prima includerla" se
42
- relazione_richiesta.non_è_un? Simbolo o @documento_convertito.non_ha_chiave? relazione_richiesta
43
- esposizione_filtrata.deposita relazione_richiesta, @documento_convertito.ottieni(relazione_richiesta)
74
+ ##
75
+ # Espone gli incorporati interi.
76
+ definisci _esponi_incorporati_interi_su(documento_esposto)
77
+ @incorporati_interi.per_ognuno esegui |incorporato|
78
+ valore_incorporato = @documento.manda incorporato.nome
79
+ considera incorporato.tipologia
80
+ quando :singolo
81
+ documento_esposto.deposita incorporato.nome, valore_incorporato.esponi
82
+ quando :multiplo
83
+ documento_esposto.deposita incorporato.nome, valore_incorporato.mappa(&:esponi)
84
+ fine
85
+ fine
44
86
  fine
45
87
 
46
- @relazioni_richieste.per_ognuna esegui |nome_relazione, campi_relazione_richiesti|
47
- prossima se campi_relazione_richiesti.non_è_una? Lista
48
- valore_relazione = @documento_convertito.ottieni nome_relazione, nulla
49
- se valore_relazione.è_una? Mappa
50
- esposizione_filtrata.deposita nome_relazione, valore_relazione
51
- .seleziona { |chiave, valore| chiave.in? campi_relazione_richiesti }
52
- altrimenti_se valore_relazione.è_una? Lista
53
- valori_filtrati = valore_relazione.mappa esegui |singolo_valore_relazione|
54
- prossima se singolo_valore_relazione.non_è_una? Mappa
55
- singolo_valore_relazione.seleziona { |chiave, valore| chiave.in? campi_relazione_richiesti }
88
+ ##
89
+ # Espone gli incorporati filtrati.
90
+ definisci _esponi_incorporati_filtrati_su(documento_esposto)
91
+ @incorporati_filtrati.per_ognuno esegui |incorporato|
92
+ valore_incorporato = @documento.manda incorporato.nome
93
+ campi_incorporato_filtrati = @filtrati_richiesti.prendi incorporato.nome
94
+ considera incorporato.tipologia
95
+ quando :singolo
96
+ documento_esposto.deposita incorporato.nome, valore_incorporato.esponi(*campi_incorporato_filtrati)
97
+ quando :multiplo
98
+ documento_esposto.deposita incorporato.nome, valore_incorporato
99
+ .mappa { |documento_incorporato| documento_incorporato.esponi *campi_incorporato_filtrati }
56
100
  fine
57
- esposizione_filtrata.deposita nome_relazione, valori_filtrati.compatta
58
- altrimenti
59
- prossima
60
101
  fine
61
102
  fine
62
103
 
63
- esposizione_filtrata
64
- fine
104
+ ##
105
+ # Espone le relazioni intere.
106
+ definisci _esponi_relazioni_intere_su(documento_esposto)
107
+ @relazioni_intere.per_ognuna esegui |relazione|
108
+ alza Relazione::NonInclusa, "la relazione #{relazione.nome} deve essere inclusa per "\
109
+ "poter essere esposta" se relazione.documenti_in_memoria.nullo?
110
+
111
+ valore_relazione = @documento.manda relazione.nome
112
+ considera relazione.tipologia
113
+ quando :appartiene_a
114
+ documento_esposto.deposita relazione.nome, valore_relazione.esponi
115
+ quando :ha_molti, :ha_e_appartiene_a_molti
116
+ documento_esposto.deposita relazione.nome, valore_relazione.mappa(&:esponi)
117
+ fine
118
+ fine
119
+ fine
120
+
121
+ ##
122
+ # Espone le relazioni filtrate.
123
+ definisci _esponi_relazioni_filtrate_su(documento_esposto)
124
+ @relazioni_filtrate.per_ognuna esegui |relazione|
125
+ alza Relazione::NonInclusa, "la relazione #{relazione.nome} deve essere inclusa per "\
126
+ "poter essere esposta" se relazione.documenti_in_memoria.nullo?
127
+
128
+ valore_relazione = @documento.manda relazione.nome
129
+ prossima se valore_relazione.nulla?
130
+
131
+ campi_relazione_filtrati = @filtrati_richiesti.prendi relazione.nome
132
+ considera relazione.tipologia
133
+ quando :appartiene_a
134
+ documento_esposto.deposita relazione.nome, valore_relazione.esponi(*campi_relazione_filtrati)
135
+ quando :ha_molti, :ha_e_appartiene_a_molti
136
+ documento_esposto.deposita relazione.nome, valore_relazione
137
+ .mappa { |documento_relazionato| documento_relazionato.esponi *campi_relazione_filtrati }
138
+ fine
139
+ fine
140
+ fine
65
141
 
66
142
  fine
67
143
  fine