mangusta 0.2.2 → 0.3.0

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: 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