mangusta 0.2.2 → 0.3.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: 3ee95909c98b1608b6fa9d93c138f00330275ddb0a3ebc34348552b0de514500
4
- data.tar.gz: c436453dc1ef4990e92c01f8bd96c9b6554a355f2169495e61846f3bcb561760
3
+ metadata.gz: 389949238c8259b0673f09e72b0c5bd46681d7e7ef2f6336d5713db03e15bcda
4
+ data.tar.gz: 52739e88619c9a0b0036857421d4e6648c3fd18b107eabb5cf36261b310c6006
5
5
  SHA512:
6
- metadata.gz: 8622487602a774da378be2e5141130d79b3e3e8ec063d5b77315542c10d3be3f270af2477a7bd0b6b85f268d9ea8b1a30e6f4883975d67e87b9bacffb5940a0e
7
- data.tar.gz: 3716536c0423a9ee466d656e3bba3d6a4d0b92245aa3ae39660aa53fe3e0466fd80a04b3bd93484e54095043355769c54d6e692b0cfdb470af553a26594345ea
6
+ metadata.gz: dbe833890db5b169fe0a98739b8a72332beee5e11c9ce7c6565bc2def76267b377d2e74922280c9cbf3f804606f37d547c459ba5c460a221f2475deb07351b9c
7
+ data.tar.gz: 28f8d3da01384ea4cedba6f8df6b17703bcffaa5a24cfd7b95433ba3f800db2406b423c14b9725487864b19d0a3eb5d5a139ad12a02dcae8ee83fbc89b0f50ce
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mangusta (0.2.1)
4
+ mangusta (0.2.2)
5
5
  italian-ruby (~> 0.1)
6
6
  mongo (~> 2.11)
7
7
 
@@ -10,7 +10,7 @@ GEM
10
10
  specs:
11
11
  bson (4.8.2)
12
12
  diff-lcs (1.3)
13
- italian-ruby (0.2.5)
13
+ italian-ruby (0.2.6)
14
14
  ruby2ruby (~> 2.4)
15
15
  mongo (2.11.4)
16
16
  bson (>= 4.4.2, < 5.0.0)
@@ -86,8 +86,23 @@ modulo Mangusta
86
86
  fine
87
87
 
88
88
  definisci_metodo nome esegui
89
+ valore_relazione = ottieni_valore relazione.nome
90
+ ritorna valore_relazione se valore_relazione.esiste?
89
91
  relazione.risolvi se_stesso
90
92
  fine
93
+
94
+ definisci_metodo "#{nome}=" esegui |valore|
95
+ imposta_valore relazione.nome, valore
96
+ considera relazione.tipologia
97
+ quando :appartiene_a
98
+ ritorna a_meno_che valore.risponde_a? :_id
99
+ imposta_valore relazione.nome_campo, valore._id
100
+ quando :ha_e_appartiene_a_molti
101
+ ritorna a_meno_che valore.è_una? Lista
102
+ ritorna a_meno_che valore.tutti? { |singolo_valore| singolo_valore.risponde_a? :_id }
103
+ imposta_valore relazione.nome_campo, valore.mappa(&:_id)
104
+ fine
105
+ fine
91
106
  fine
92
107
 
93
108
  ##
@@ -7,6 +7,7 @@ modulo Mangusta
7
7
  accessore :nome_campo
8
8
  accessore :nome_campo_relazionato
9
9
  accessore :nome_ripostiglio
10
+ accessore :lista_documenti
10
11
 
11
12
  definisci inizializzatore(tipologia, nome, **parametri)
12
13
  se_stessa.nome = nome
@@ -15,11 +16,11 @@ modulo Mangusta
15
16
  se_stessa.nome_campo = parametri.ottieni(:nome_campo, nullo)
16
17
  se_stessa.nome_campo_relazionato = parametri.ottieni(:nome_campo_relazionato, nullo)
17
18
 
18
- alza "È necessario specificare una chiave :ripostiglio per la relazione" se
19
+ alza NonValida, "È necessario specificare una chiave :ripostiglio per la relazione" se
19
20
  nome_ripostiglio.nullo?
20
- alza "È necessario specificare una chiave :nome_campo per la relazione" se
21
+ alza NonValida, "È necessario specificare una chiave :nome_campo per la relazione" se
21
22
  nome_campo.nullo? e tipologia.in? [ :appartiene_a, :ha_e_appartiene_a_molti ]
22
- alza "È necessario specificare una chiave :nome_campo_relazionato per la relazione" se
23
+ alza NonValida, "È necessario specificare una chiave :nome_campo_relazionato per la relazione" se
23
24
  nome_campo_relazionato.nullo? e tipologia.in? [ :ha_molti, :ha_e_appartiene_a_molti ]
24
25
  fine
25
26
 
@@ -31,7 +32,7 @@ modulo Mangusta
31
32
  quando :appartiene_a allora _risolvi_appartiene_a(documento)
32
33
  quando :ha_e_appartiene_a_molti allora _risolvi_ha_e_appartiene_a_molti(documento)
33
34
  altrimenti
34
- alza "La relazione `#{tipologia}` non è supportata"
35
+ alza NonValida, "La relazione `#{tipologia}` non è supportata"
35
36
  fine
36
37
  fine
37
38
 
@@ -43,10 +44,16 @@ modulo Mangusta
43
44
  quando :appartiene_a allora ritorna
44
45
  quando :ha_e_appartiene_a_molti allora _propaga_ha_e_appartiene_a_molti(documento, valore)
45
46
  altrimenti
46
- alza "La relazione `#{tipologia}` non è supportata"
47
+ alza NonValida, "La relazione `#{tipologia}` non è supportata"
47
48
  fine
48
49
  fine
49
50
 
51
+ ##
52
+ # Carica tutti i documenti in memoria.
53
+ definisci carica_documenti
54
+ @documenti_in_memoria = _ripostiglio.prendi_tutti.lista
55
+ fine
56
+
50
57
  privati
51
58
 
52
59
  ##
@@ -58,7 +65,13 @@ modulo Mangusta
58
65
  ##
59
66
  # Risolve la relazione di `ha molti`.
60
67
  definisci _risolvi_ha_molti(documento)
61
- _ripostiglio.cerca(nome_campo_relazionato => documento._id)
68
+ se @documenti_in_memoria.esiste?
69
+ @documenti_in_memoria.seleziona esegui |documento_relazionato|
70
+ documento_relazionato.nome_campo_relazionato == documento._id
71
+ fine
72
+ altrimenti
73
+ _ripostiglio.cerca(nome_campo_relazionato => documento._id).lista
74
+ fine
62
75
  fine
63
76
 
64
77
  ##
@@ -66,21 +79,38 @@ modulo Mangusta
66
79
  definisci _risolvi_appartiene_a(documento)
67
80
  id_documento_relazionato = documento.manda nome_campo
68
81
  ritorna nullo se id_documento_relazionato.nullo?
69
- _ripostiglio.cerca_per_id id_documento_relazionato
82
+
83
+ se @documenti_in_memoria.esiste?
84
+ @documenti_in_memoria.trova esegui |documento_relazionato|
85
+ documento_relazionato._id == id_documento_relazionato
86
+ fine
87
+ altrimenti
88
+ _ripostiglio.cerca_per_id id_documento_relazionato
89
+ fine
70
90
  fine
71
91
 
72
92
  ##
73
93
  # Risolve la relazione di `ha e appartiene a molti`.
74
94
  definisci _risolvi_ha_e_appartiene_a_molti(documento)
75
- _ripostiglio.cerca _id: Mappa["$in": documento.manda(nome_campo) || []]
95
+ id_documenti_relazionati = documento.manda(nome_campo) || []
96
+
97
+ se @lista_documento.esiste?
98
+ ritorna [] se id_documenti_relazionati.vuoto?
99
+ @documenti_in_memoria.seleziona esegui |documento_relazionato|
100
+ documento_relazionato._id.in? id_documenti_relazionati
101
+ fine
102
+ altrimenti
103
+ _ripostiglio.cerca(_id: Mappa["$in": id_documenti_relazionati]).lista
104
+ fine
76
105
  fine
77
106
 
78
107
  ##
79
108
  # Aggiorna la relazione `ha e appartiene a molti`.
80
109
  definisci _propaga_ha_e_appartiene_a_molti(documento, documenti_relazionati)
81
- se documenti_relazionati.non_è_una? Lista o documenti_relazionati.alcuni? { |doc| doc.non_è_un? BSON::ObjectId }
82
- alza "Per propagare la relazione `ha e appartiene a molti` è necessario passare una lista"\
83
- "di elementi di tipo BSON::ObjectId"
110
+ se documenti_relazionati.non_è_una? Lista o
111
+ documenti_relazionati.alcuni? { |documento_relazionato| documento_relazionato.non_è_un? BSON::ObjectId }
112
+ alza ErrorePropagazione, "Per propagare la relazione `ha_e_appartiene_a_molti` "\
113
+ "è necessario passare una Lista di elementi di classe BSON::ObjectId"
84
114
  fine
85
115
 
86
116
  collezione_relazionata = Mangusta.connessione[_ripostiglio._nome_collezione]
@@ -95,6 +125,12 @@ modulo Mangusta
95
125
  fine
96
126
  fine
97
127
 
128
+ ##
129
+ # Errori per relazioni.
130
+ classe NonValida < Errore; fine
131
+ classe NonInclusa < Errore; fine
132
+ classe ErrorePropagazione < Errore; fine
133
+
98
134
  fine
99
135
  fine
100
136
  fine
@@ -74,12 +74,12 @@ modulo Mangusta
74
74
  ##
75
75
  # Ottiene la rappresentazione per stampa dell'oggetto.
76
76
  definisci inspect
77
- "#<#{se_stesso.classe} #{Mangusta::Utilità.converti_in_json(se_stesso)}>"
77
+ "#<#{se_stesso.classe} #{se_stesso.esponi}>"
78
78
  fine
79
79
  definisci ai(opzioni = Mappa.nuova)
80
80
  se definito? AwesomePrint
81
- ap = AwesomePrint::Inspector.nuovo opzioni
82
- ap.awesome Mangusta::Utilità.converti_in_json(se_stesso)
81
+ ap = AwesomePrint::Inspector.nuovo opzioni.fondi(indent: 2, ruby19_syntax: si)
82
+ "#<#{se_stesso.classe} #{ap.awesome se_stesso.esponi}>"
83
83
  altrimenti
84
84
  inspect
85
85
  fine
@@ -87,20 +87,46 @@ modulo Mangusta
87
87
 
88
88
  ##
89
89
  # Ottiene la rappresentazione in Mappa dei campi del documento.
90
- definisci esponi(*campi_richiesti)
91
- risultato = Mappa.nuova
92
- se campi_richiesti.nullo? o campi_richiesti.vuoto?
93
- campi_da_esporre = campi
94
- altrimenti
95
- campi_da_esporre = campi.seleziona { |campo| campo.nome.in? campi_richiesti }
90
+ definisci esponi(*chiavi_richieste, **relazioni_richieste)
91
+ campi_richiesti = chiavi_richieste
92
+ .seleziona { |chiave| chiave.in? campi.mappa(&:nome) }
93
+ relazioni_dirette = chiavi_richieste
94
+ .seleziona { |chiave| chiave.in? relazioni.mappa(&:nome) }
95
+ relazioni_annidate = relazioni_richieste.chiavi
96
+ relazioni_da_convertire = relazioni_dirette + relazioni_annidate
97
+
98
+ risultato_conversione = Mangusta::Utilità.converti_in_json se_stesso, *relazioni_da_convertire
99
+ ritorna risultato_conversione se campi_richiesti.nessuno?
100
+ conversione_filtrata = Mappa.nuova
101
+
102
+ campi_richiesti.per_ognuno esegui |campo_richiesto|
103
+ prossimo se campo_richiesto.non_è_un? Simbolo
104
+ conversione_filtrata.deposita campo_richiesto, risultato_conversione.ottieni(campo_richiesto, nullo)
105
+ fine
106
+
107
+ relazioni_dirette.per_ognuna esegui |relazione_richiesta|
108
+ alza Relazione::NonInclusa, "per poter esporre la relazione `#{relazione_richiesta}` è necessario prima includerla" se
109
+ relazione_richiesta.non_è_un? Simbolo o risultato_conversione.non_ha_chiave? relazione_richiesta
110
+ conversione_filtrata.deposita relazione_richiesta, risultato_conversione.ottieni(relazione_richiesta)
96
111
  fine
97
112
 
98
- campi_da_esporre.per_ognuno esegui |campo|
99
- valore_campo = ottieni_valore(campo.nome)
100
- valore_campo = valore_campo.to_s se valore_campo.è_un? BSON::ObjectId
101
- risultato.deposita campo.nome, valore_campo
113
+ relazioni_richieste.per_ognuna esegui |nome_relazione, campi_relazione_richiesti|
114
+ prossima se campi_relazione_richiesti.non_è_una? Lista
115
+ valore_relazione = risultato_conversione.ottieni nome_relazione, nulla
116
+ se valore_relazione.è_una? Mappa
117
+ conversione_filtrata.deposita nome_relazione, valore_relazione
118
+ .seleziona { |chiave, valore| chiave.in? campi_relazione_richiesti }
119
+ altrimenti_se valore_relazione.è_una? Lista
120
+ valori_filtrati = valore_relazione.mappa esegui |singolo_valore_relazione|
121
+ prossima se singolo_valore_relazione.non_è_una? Mappa
122
+ singolo_valore_relazione.seleziona { |chiave, valore| chiave.in? campi_relazione_richiesti }
123
+ fine
124
+ conversione_filtrata.deposita nome_relazione, valori_filtrati.compatta
125
+ altrimenti
126
+ prossima
127
+ fine
102
128
  fine
103
- risultato
129
+ conversione_filtrata
104
130
  fine
105
131
 
106
132
  ##
@@ -10,11 +10,13 @@ modulo Mangusta
10
10
  @classe_documento = classe_documento
11
11
  @parametri_ricerca = parametri
12
12
  @ordinamento_ricerca = ordinamento
13
+ @relazioni_incluse = []
13
14
  fine
14
15
 
15
16
  ##
16
17
  # Prende il primo elemento trovato.
17
18
  definisci primo
19
+ _carica_relazioni_incluse
18
20
  documento_in_json = @collezione.cerca(@parametri_ricerca, @ordinamento_ricerca).primo
19
21
  _converti documento_in_json
20
22
  fine
@@ -23,13 +25,16 @@ modulo Mangusta
23
25
  ##
24
26
  # Prende l'ultimo elemento trovato.
25
27
  definisci ultimo
26
- documento_in_json = @collezione.cerca(@parametri_ricerca, @ordinamento_ricerca).lista.ultimo
28
+ _carica_relazioni_incluse
29
+ ordinamento_inverso = @ordinamento_ricerca.fondi _id: -1
30
+ documento_in_json = @collezione.cerca(@parametri_ricerca, ordinamento_inverso).primo
27
31
  fine
28
32
  alias :ultima :ultimo
29
33
 
30
34
  ##
31
35
  # Ritorna l'oggetto ricerca come Lista documenti.
32
36
  definisci lista
37
+ _carica_relazioni_incluse
33
38
  @collezione.cerca(@parametri_ricerca, @ordinamento_ricerca).lista.mappa esegui |documento_in_json|
34
39
  _converti documento_in_json
35
40
  fine
@@ -67,7 +72,21 @@ modulo Mangusta
67
72
  ##
68
73
  # Converte in documento.
69
74
  definisci _converti(mappa)
70
- Mangusta::Utilità.converti_in_documento mappa, @classe_documento
75
+ documento = Mangusta::Utilità.converti_in_documento mappa, @classe_documento
76
+
77
+ @relazioni_incluse.per_ognuna esegui |relazione_inclusa|
78
+ documento.manda "#{relazione_inclusa.nome}=", relazione_inclusa.risolvi(documento)
79
+ fine
80
+
81
+ documento
82
+ fine
83
+
84
+ ##
85
+ # Carica relazioni incluse in memoria, se presenti.
86
+ definisci _carica_relazioni_incluse
87
+ @relazioni_incluse.per_ognuna esegui |relazione_inclusa|
88
+ relazione_inclusa.carica_documenti
89
+ fine
71
90
  fine
72
91
 
73
92
  fine
@@ -71,6 +71,15 @@ modulo Mangusta
71
71
  alias :primo_per :primo
72
72
  alias :prima_per :primo
73
73
 
74
+ ##
75
+ # Ritorna l'ultimo documento del ripostiglio.
76
+ definisci ultimo(parametri = Mappa.nuova, ordinamento = Mappa.nuova)
77
+ _risultato_ricerca(parametri, ordinamento).primo
78
+ fine
79
+ alias :ultima :ultimo
80
+ alias :ultimo_per :ultimo
81
+ alias :ultima_per :ultimo
82
+
74
83
  ##
75
84
  # Cerca senza filtri, su tutti i documenti della collezione.
76
85
  definisci prendi_tutti
@@ -3,7 +3,7 @@ modulo Mangusta
3
3
 
4
4
  ##
5
5
  # Converte un documento in json.
6
- definisci se_stessa.converti_in_json(documento)
6
+ definisci se_stessa.converti_in_json(documento, *relazioni_richieste)
7
7
  ritorna documento se documento.è_una? Mappa
8
8
  alza "L'oggetto passato non include Mangusta::Documento" a_meno_che
9
9
  documento.classe.moduli_inclusi.include? Mangusta::Documento
@@ -13,21 +13,32 @@ modulo Mangusta
13
13
  documento.campi.per_ognuno esegui |campo|
14
14
  valore_campo = documento.ottieni_valore campo.nome
15
15
  prossimo se valore_campo.nullo?
16
+ se campo.nome.in? documento.relazioni.mappa(&:nome_campo)
17
+ inizia
18
+ valore_campo = BSON::ObjectId valore_campo se valore_campo.è_una? Stringa
19
+ valore_campo = valore_campo.mappa { |singolo_valore| BSON::ObjectId singolo_valore } se valore_campo.è_una? Lista
20
+ recupera BSON::ObjectId::Invalid
21
+ fine
22
+ fine
16
23
  documento_convertito.deposita campo.nome, valore_campo
17
24
  fine
18
25
 
19
- documento.relazioni.per_ognuna esegui |relazione|
20
- relazione_convertita = converti_documento_relazionato_in_json documento, relazione
21
- prossimo se relazione_convertita.nulla?
22
- documento_convertito.deposita relazione.nome, relazione_convertita
23
- fine
24
-
25
26
  documento.documenti_incorporati.per_ognuno esegui |documento_incorporato|
26
27
  documento_incorporato_convertito = converti_documento_incorporato_in_json documento, documento_incorporato
27
28
  prossimo se documento_incorporato_convertito.nullo?
28
29
  documento_convertito.deposita documento_incorporato.nome, documento_incorporato_convertito
29
30
  fine
30
31
 
32
+ se relazioni_richieste.almeno_una?
33
+ relazioni_richieste.per_ognuna esegui |nome_relazione, campi_richiesti|
34
+ relazione = documento.relazioni.trova { |relazione| relazione.nome == nome_relazione }
35
+ prossima se relazione.nulla?
36
+ relazione_convertita = converti_documento_relazionato_in_json documento, relazione
37
+ prossimo se relazione_convertita.nulla?
38
+ documento_convertito.deposita relazione.nome, relazione_convertita
39
+ fine
40
+ fine
41
+
31
42
  documento_convertito
32
43
  fine
33
44
 
@@ -1,3 +1,3 @@
1
1
  modulo Mangusta
2
- VERSIONE = "0.2.2"
2
+ VERSIONE = "0.3.0"
3
3
  fine
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mangusta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.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-21 00:00:00.000000000 Z
11
+ date: 2020-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: italian-ruby