mangusta 0.1.3 → 0.1.4

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: '09d564450907b6774ea0b1fda744c47ea00659f10a0d471784d004aad1a9c311'
4
- data.tar.gz: ea402f39d8f41120c2624bfefbe3e62a944bfedf623c72d1ba18872916fc8f7f
3
+ metadata.gz: defaeaa7bbc87855a9dd60cd900a75bbe9096d04e213ec946aedc180178dc1d4
4
+ data.tar.gz: 8c5368a5e8329580a0e30fce688168d753cab531e2f1d6d7a7716e6d1f11d1a0
5
5
  SHA512:
6
- metadata.gz: da20cb51a9d1867aeaff19b8a616da0f54a1e83a91296dd4bc55e60b880a4b065b118f9fc4240e78588a59eb4de6f592dba39ff5d9ae5818f7742b901c717f0e
7
- data.tar.gz: ff2ed81f3dd89a05d99ef28c35d780c590d99a7ebec5b6a56adca0a69d6a6f7dfc48b849045a5fb166fb3dfd68e576ac4af6706d0ef0970099e1b775ec9c9bf5
6
+ metadata.gz: ec38f6a15fc834029dbd17d2b6f8a5aca1e9a1ff93b65a2bfdf0f4c433f4159e067a8b68bbe058d64019ff09bc93a68d0d99f9f114dbb7dffa346651025cc50f
7
+ data.tar.gz: e1777bbd9c0880f6636a41ff58966181e4cf71ff8017832857f62107f28931611990ad0558a975097b097c3ea352678f5096350432eb3e148eebc099d38172f3
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mangusta (0.1.1)
5
- italian-ruby (~> 0.1.3)
4
+ mangusta (0.1.3)
5
+ italian-ruby (~> 0.1)
6
6
  mongo (~> 2.11)
7
7
 
8
8
  GEM
@@ -10,7 +10,7 @@ GEM
10
10
  specs:
11
11
  bson (4.8.2)
12
12
  diff-lcs (1.3)
13
- italian-ruby (0.1.4)
13
+ italian-ruby (0.1.6)
14
14
  ruby2ruby (~> 2.4)
15
15
  mongo (2.11.4)
16
16
  bson (>= 4.4.2, < 5.0.0)
@@ -4,24 +4,44 @@ modulo Mangusta
4
4
 
5
5
  accessore :nome
6
6
  accessore :tipologia
7
- accessore :nome_chiave
7
+ accessore :nome_campo
8
+ accessore :nome_campo_relazionato
8
9
  accessore :nome_ripostiglio
9
10
 
10
11
  definisci inizializzatore(tipologia, nome, **parametri)
11
- alza "È necessario specificare una chiave :ripostiglio per la relazione" se
12
- parametri.ottieni(:ripostiglio, nullo).nullo?
12
+ se_stessa.nome = nome
13
+ se_stessa.tipologia = tipologia
14
+ se_stessa.nome_ripostiglio = parametri.ottieni(:ripostiglio, nullo)
15
+ se_stessa.nome_campo = parametri.ottieni(:nome_campo, nullo)
16
+ se_stessa.nome_campo_relazionato = parametri.ottieni(:nome_campo_relazionato, nullo)
13
17
 
14
- se_stesso.nome = nome
15
- se_stesso.tipologia = tipologia
16
- se_stesso.nome_ripostiglio = parametri.ottieni(:ripostiglio)
17
- se_stesso.nome_chiave = parametri.ottieni(:nome_chiave) || "id_#{nome}".in_simbolo
18
+ alza "È necessario specificare una chiave :ripostiglio per la relazione" se
19
+ nome_ripostiglio.nullo?
20
+ alza "È necessario specificare una chiave :nome_campo per la relazione" se
21
+ 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
+ nome_campo_relazionato.nullo? e tipologia.in? [ :ha_molti, :ha_e_appartiene_a_molti ]
18
24
  fine
19
25
 
20
26
  ##
21
27
  # Risolve il documento o i documenti relazionati.
22
28
  definisci risolvi(documento)
23
29
  considera tipologia
24
- quando :appartiene_a allora _risolvi_appartiene_a(documento)
30
+ quando :ha_molti allora _risolvi_ha_molti(documento)
31
+ quando :appartiene_a allora _risolvi_appartiene_a(documento)
32
+ quando :ha_e_appartiene_a_molti allora _risolvi_ha_e_appartiene_a_molti(documento)
33
+ altrimenti
34
+ alza "La relazione `#{tipologia}` non è supportata"
35
+ fine
36
+ fine
37
+
38
+ ##
39
+ # Propaga la relazione con il valore passato.
40
+ definisci propaga(documento, valore)
41
+ considera tipologia
42
+ quando :ha_molti allora ritorna
43
+ quando :appartiene_a allora ritorna
44
+ quando :ha_e_appartiene_a_molti allora _propaga_ha_e_appartiene_a_molti(documento, valore)
25
45
  altrimenti
26
46
  alza "La relazione `#{tipologia}` non è supportata"
27
47
  fine
@@ -30,19 +50,51 @@ modulo Mangusta
30
50
  privati
31
51
 
32
52
  ##
33
- # Puntatore al ripostiglio dove risolvere la relazione.
53
+ # Puntatore al ripostiglio dove risolvere o propagare la relazione.
34
54
  definisci _ripostiglio
35
- Oggetto.ottieni_costante(se_stesso.nome_ripostiglio)
55
+ Oggetto.ottieni_costante nome_ripostiglio
56
+ fine
57
+
58
+ ##
59
+ # Risolve la relazione di `ha molti`.
60
+ definisci _risolvi_ha_molti(documento)
61
+ _ripostiglio.cerca("#{nome_campo}" => documento._id)
36
62
  fine
37
63
 
38
64
  ##
39
- # Risolve la relazione di appartenenza.
65
+ # Risolve la relazione di `appartiene a`.
40
66
  definisci _risolvi_appartiene_a(documento)
41
- id_documento_relazionato = documento.manda se_stesso.nome_chiave
67
+ id_documento_relazionato = documento.manda nome_campo
42
68
  ritorna nullo se id_documento_relazionato.nullo?
43
69
  _ripostiglio.cerca_per_id id_documento_relazionato
44
70
  fine
45
71
 
72
+ ##
73
+ # Risolve la relazione di `ha e appartiene a molti`.
74
+ definisci _risolvi_ha_e_appartiene_a_molti(documento)
75
+ _ripostiglio.cerca _id: Mappa["$in": documento.manda(nome_campo) || []]
76
+ fine
77
+
78
+ ##
79
+ # Aggiorna la relazione `ha e appartiene a molti`.
80
+ 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"
84
+ fine
85
+
86
+ collezione_relazionata = Mangusta.connessione[_ripostiglio._nome_collezione]
87
+ ricerca_documenti_relazionati = Mappa[_id: Mappa["$in": documenti_relazionati]]
88
+
89
+ se documenti_relazionati.almeno_uno?
90
+ collezione_relazionata.aggiorna_molti ricerca_documenti_relazionati,
91
+ "$addToSet" => Mappa[nome_campo_relazionato => documento._id]
92
+ altrimenti
93
+ collezione_relazionata.aggiorna_molti Mappa.nuova,
94
+ "$pullAll" => Mappa[nome_campo_relazionato => [ documento._id ]]
95
+ fine
96
+ fine
97
+
46
98
  fine
47
99
  fine
48
100
  fine
@@ -23,7 +23,6 @@ modulo Mangusta
23
23
  #
24
24
  # I metodi di classe `appartiene_a`, `ha_molte`, `ha_e_appartiene_a_molte` (gli ultimi
25
25
  # due hanno alias `ha_molti` e `ha_e_appartiene_a_molti`) definiscono delle relazioni.
26
- #
27
26
  modulo Documento
28
27
 
29
28
  ##
@@ -50,6 +49,12 @@ modulo Mangusta
50
49
  se_stesso.classe.campi || []
51
50
  fine
52
51
 
52
+ ##
53
+ # Recupera le relazioni definite.
54
+ definisci relazioni
55
+ se_stesso.classe.relazioni || []
56
+ fine
57
+
53
58
  ##
54
59
  # Recupera il valore di un campo del documento.
55
60
  definisci ottieni_valore_campo(nome_campo)
@@ -62,6 +67,18 @@ modulo Mangusta
62
67
  imposta_variabile_istanza "@#{nome_campo}", valore_campo
63
68
  fine
64
69
 
70
+ ##
71
+ # Ottiene la rappresentazione in Mappa dei campi del documento.
72
+ definisci in_mappa
73
+ risultato = Mappa.nuova
74
+ campi.per_ognuno esegui |campo|
75
+ valore_campo = ottieni_valore_campo(campo.nome)
76
+ valore_campo = valore_campo.to_s se campo.nome == :_id
77
+ risultato.deposita campo.nome, valore_campo
78
+ fine
79
+ risultato
80
+ fine
81
+
65
82
  ##
66
83
  # Accede al valore dell'attributo originale del documento,
67
84
  # passando oltre gli accessori, per accedere a campi non modellati.
@@ -109,6 +126,13 @@ modulo Mangusta
109
126
  _memorizza_campo nome, **parametri
110
127
  fine
111
128
 
129
+ ##
130
+ # Aggiunge un metodo di classe `ha_molti` per generare relazioni
131
+ # di possedimento.
132
+ definisci ha_molti(nome, **parametri)
133
+ _memorizza_relazione :ha_molti, nome, **parametri
134
+ fine
135
+
112
136
  ##
113
137
  # Aggiunge un metodo di classe `appartiene_a` per generare relazioni
114
138
  # di appartenenza.
@@ -116,6 +140,13 @@ modulo Mangusta
116
140
  _memorizza_relazione :appartiene_a, nome, **parametri
117
141
  fine
118
142
 
143
+ ##
144
+ # Aggiunge un metodo di classe `ha_e_appartiene_a_molti` per generare relazioni
145
+ # di possedimento e appartenenza.
146
+ definisci ha_e_appartiene_a_molti(nome, **parametri)
147
+ _memorizza_relazione :ha_e_appartiene_a_molti, nome, **parametri
148
+ fine
149
+
119
150
  privati
120
151
 
121
152
  ##
@@ -139,17 +170,13 @@ modulo Mangusta
139
170
  se_stesso.relazioni << nuova_relazione
140
171
 
141
172
  considera tipologia
142
- quando :appartiene_a
143
- _memorizza_campo nuova_relazione.nome_chiave
173
+ quando :appartiene_a, :ha_e_appartiene_a_molti
174
+ _memorizza_campo nuova_relazione.nome_campo
144
175
  fine
145
176
 
146
177
  definisci_metodo nome esegui
147
178
  nuova_relazione.risolvi se_stesso
148
179
  fine
149
-
150
- definisci_metodo "#{nome}=" esegui |valore|
151
- nuova_relazione.aggiorna se_stesso
152
- fine
153
180
  fine
154
181
 
155
182
  fine
@@ -62,7 +62,7 @@ modulo Mangusta
62
62
 
63
63
  ##
64
64
  # Ritorna il primo documento del ripostiglio.
65
- def primo
65
+ definisci primo
66
66
  _risultato_ricerca.primo
67
67
  fine
68
68
 
@@ -77,7 +77,10 @@ modulo Mangusta
77
77
  # Deposita un documento.
78
78
  definisci inserisci(documento)
79
79
  documento_in_json = Mangusta::Utilità.converti_in_json(documento)
80
+ documento_in_json.deposita :_id, BSON::ObjectId.new se documento_in_json.non_ha_chiave? :_id
80
81
  _collezione.inserisci_uno documento_in_json
82
+ documento = Mangusta::Utilità.converti_in_documento documento, _classe_documento
83
+ _propaga_relazioni documento, documento_in_json
81
84
  documento
82
85
  fine
83
86
 
@@ -106,6 +109,8 @@ modulo Mangusta
106
109
  ##
107
110
  # Aggiorna molti documenti.
108
111
  definisci aggiorna_molti(ricerca = Mappa.nuova, **valori_da_aggiornare)
112
+ stampa "AGG MOLTI ---> RICERCA", ricerca
113
+ stampa "VALORI", valori_da_aggiornare, "^^^^^^^^^^^^"
109
114
  alza "Il primo argomento deve essere una Mappa o una Lista di documenti" a_meno_che
110
115
  ricerca.classe == Mappa o ricerca.risponde_a? :tutti?
111
116
 
@@ -126,9 +131,17 @@ modulo Mangusta
126
131
  fine
127
132
  alias :aggiorna_molte :aggiorna_molti
128
133
 
134
+ ##
135
+ # Aggiorna tutti i documenti.
136
+ definisci aggiorna_tutti(**valori_da_aggiornare)
137
+ risultato_aggiornamento = _collezione.aggiorna_molti Mappa.nuova, Mappa["$set": valori_da_aggiornare]
138
+ risultato_aggiornamento.modified_count
139
+ fine
140
+ alias :aggiorna_tutte :aggiorna_tutti
141
+
129
142
  ##
130
143
  # Cancella un documento.
131
- def cancella(documento)
144
+ definisci cancella(documento)
132
145
  alza "Il primo argomento deve essere una stringa o un documento" a_meno_che
133
146
  documento.classe == Stringa o documento.risponde_a? :_id
134
147
 
@@ -140,7 +153,7 @@ modulo Mangusta
140
153
 
141
154
  ##
142
155
  # Cancella molti documenti.
143
- def cancella_molti(documenti)
156
+ definisci cancella_molti(documenti)
144
157
  risultato_cancellazione = _collezione.cancella_uno Mappa[_id: id_documento]
145
158
  risultato_cancellazione.deleted_count
146
159
  fine
@@ -159,14 +172,23 @@ modulo Mangusta
159
172
  # Connette alla collezione.
160
173
  definisci _collezione
161
174
  alza "Mangusta non è ancora stato connesso ad una base dati" se Mangusta.connessione.nulla?
162
- Mangusta.connessione[se_stesso._nome_collezione]
175
+ Mangusta.connessione[_nome_collezione]
163
176
  fine
164
177
 
165
178
  ##
166
179
  # Ritorna un risultato ricerca.
167
180
  definisci _risultato_ricerca(**parametri)
168
- Mangusta::Ripostiglio::RisultatoRicerca.nuovo(
169
- se_stesso._collezione, se_stesso._classe_documento, **parametri)
181
+ Mangusta::Ripostiglio::RisultatoRicerca.nuovo(_collezione, _classe_documento, **parametri)
182
+ fine
183
+
184
+ ##
185
+ # Propaga tutte le relazioni del documento.
186
+ definisci _propaga_relazioni(documento, documento_in_json)
187
+ Oggetto.ottieni_costante(_classe_documento).relazioni.per_ognuna esegui |relazione|
188
+ se documento_in_json.ha_chiave? relazione.nome_campo
189
+ relazione.propaga documento, documento_in_json.ottieni(relazione.nome_campo)
190
+ fine
191
+ fine
170
192
  fine
171
193
 
172
194
  fine
@@ -2,7 +2,7 @@ modulo Mangusta
2
2
  modulo Utilità
3
3
 
4
4
  definisci se_stessa.converti_in_json(documento)
5
- ritorna documento se documento.classe == Mappa
5
+ ritorna documento se documento.è_una? Mappa
6
6
  alza "L'oggetto passato non include Mangusta::Documento" a_meno_che documento.risponde_a? :campi
7
7
 
8
8
  documento_convertito = Mappa.nuova
@@ -15,7 +15,7 @@ modulo Mangusta
15
15
  fine
16
16
 
17
17
  definisci se_stessa.converti_in_documento(documento_in_json, classe_documento)
18
- ritorna nullo se documento_in_json.nullo?
18
+ ritorna documento_in_json se documento_in_json.non_è_una? Mappa
19
19
  classe_documento ||= "Oggetto"
20
20
 
21
21
  Oggetto.ottieni_costante(classe_documento).nuovo **documento_in_json
@@ -1,3 +1,3 @@
1
1
  modulo Mangusta
2
- VERSIONE = "0.1.3"
2
+ VERSIONE = "0.1.4"
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.1.3
4
+ version: 0.1.4
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-03-31 00:00:00.000000000 Z
11
+ date: 2020-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: italian-ruby