schild 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/schild/version.rb +1 -1
- data/lib/schild.rb +91 -54
- data/specs/schueler_spec.rb +57 -27
- data/specs/type_safe_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7188395c3591fa7a646c4dd4e653144124bf978e
|
4
|
+
data.tar.gz: aa08080c0aecca22f6b2bdb0e96f35c89f81c1de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddaddbd639bccf00b6d5705c35c836e8080b09ff8471e6674045543947620298df280fd229217094c82e7ea12d9f8096b7e2cc522aa9c229ef34bc08dc426765
|
7
|
+
data.tar.gz: f25838637bdd24dde2f745dd09de5b4535b2a7c4b5eb4584e01a28955c1acf29652263affeb31ed9a6c48413201ffa5f5d821a324fcb44e92e140c5e7b573357
|
data/README.md
CHANGED
@@ -47,7 +47,7 @@ Die oben angegebene Datei wird nun verwendet, um auf die `schild-test`-Datenbank
|
|
47
47
|
|
48
48
|
```ruby
|
49
49
|
require 'envyable'
|
50
|
-
Envyable.load('./config/env.yml', '
|
50
|
+
Envyable.load('./config/env.yml', 'testing')
|
51
51
|
require 'schild'
|
52
52
|
```
|
53
53
|
|
@@ -57,7 +57,7 @@ Nun sollte noch das `Schild`-Modul geladen werden, das die Verwendung von `schi
|
|
57
57
|
|
58
58
|
```ruby
|
59
59
|
require 'envyable'
|
60
|
-
Envyable.load('./config/env.yml', '
|
60
|
+
Envyable.load('./config/env.yml', 'testing')
|
61
61
|
require 'schild'
|
62
62
|
include Schild
|
63
63
|
```
|
data/lib/schild/version.rb
CHANGED
data/lib/schild.rb
CHANGED
@@ -55,6 +55,35 @@ module SchildTypeSaver
|
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
+
# Mixin für Notenbezeichnungen
|
59
|
+
module NotenHelfer
|
60
|
+
# Notenbezeichnung als String
|
61
|
+
def note_s(ziffer)
|
62
|
+
case ziffer
|
63
|
+
when "1", "1+", "1-"
|
64
|
+
"sehr gut"
|
65
|
+
when "2", "2+", "2-"
|
66
|
+
"gut"
|
67
|
+
when "3", "3+", "3-"
|
68
|
+
"befriedigend"
|
69
|
+
when "4", "4+", "4-"
|
70
|
+
"ausreichend"
|
71
|
+
when "5", "5+", "5-"
|
72
|
+
"mangelhaft"
|
73
|
+
when "6"
|
74
|
+
"ungenügend"
|
75
|
+
when 'NB'
|
76
|
+
"––––––"
|
77
|
+
when "E1"
|
78
|
+
"mit besonderem Erfolg teilgenommen"
|
79
|
+
when "E2"
|
80
|
+
"mit Erfolg teilgenommen"
|
81
|
+
when 'E3'
|
82
|
+
"teilgenommen"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
58
87
|
# Das Schild Modul, das alle Klassen für die Datenbankanbindung bereitstellt
|
59
88
|
module Schild
|
60
89
|
# ist die Datenbank-Verbindung. Alle Daten können über diese Konstante abgerufen werden
|
@@ -71,6 +100,9 @@ module Schild
|
|
71
100
|
one_to_many :abschnitte, :class => :Abschnitt
|
72
101
|
one_to_one :bk_abschluss, :class => :BKAbschluss
|
73
102
|
one_to_many :bk_abschluss_leistungen, :class => :BKAbschlussFaecher
|
103
|
+
one_to_one :abi_abschluss, :class => :AbiAbschluss
|
104
|
+
one_to_many :abi_abschluss_leistungen, :class => :AbiAbschlussFaecher
|
105
|
+
one_to_many :vermerke, :class => :Vermerke
|
74
106
|
end
|
75
107
|
|
76
108
|
# Dient als Assoziation für Schüler und deren Klassenbezeichnung etc.
|
@@ -98,7 +130,10 @@ module Schild
|
|
98
130
|
|
99
131
|
# Assoziation für Fächer
|
100
132
|
class Faecher < Sequel::Model(:eigeneschule_faecher)
|
133
|
+
#siehe abi_...
|
101
134
|
one_to_one :noten
|
135
|
+
one_to_many :abi_abschluss_leistungen
|
136
|
+
one_to_one :sprachenfolge, :class => :Sprachenfolge, :key => :Fach_ID
|
102
137
|
end
|
103
138
|
|
104
139
|
# Assoziation für BK-Abschluss des Schülers
|
@@ -111,6 +146,27 @@ module Schild
|
|
111
146
|
many_to_one :schueler
|
112
147
|
end
|
113
148
|
|
149
|
+
# Assoziation für Abi-Abschluss des Schülers
|
150
|
+
class AbiAbschluss < Sequel::Model(:schuelerabitur)
|
151
|
+
one_to_one :schueler
|
152
|
+
end
|
153
|
+
|
154
|
+
# Assoziation für die Abifächer des Schülers
|
155
|
+
class AbiAbschlussFaecher < Sequel::Model(:schuelerabifaecher)
|
156
|
+
many_to_one :schueler
|
157
|
+
many_to_one :fach, :class => :Faecher, :key => :Fach_ID
|
158
|
+
end
|
159
|
+
|
160
|
+
# Assoziation für die bisher erreichten Sprachniveaus
|
161
|
+
class Sprachenfolge < Sequel::Model(:schuelersprachenfolge)
|
162
|
+
one_to_one :Faecher
|
163
|
+
end
|
164
|
+
|
165
|
+
# Vermerke von Schülern
|
166
|
+
class Vermerke < Sequel::Model(:schuelervermerke)
|
167
|
+
many_to_one :Schueler
|
168
|
+
end
|
169
|
+
|
114
170
|
# Schul-Tabelle
|
115
171
|
class Schule < Sequel::Model(:eigeneschule)
|
116
172
|
end
|
@@ -131,16 +187,6 @@ module SchildErweitert
|
|
131
187
|
abschnitte.last
|
132
188
|
end
|
133
189
|
|
134
|
-
# gibt das erste Halbjahr von +jahr+ zurück.
|
135
|
-
def erstes_halbjahr(jahr)
|
136
|
-
halbjahr(jahr, 1)
|
137
|
-
end
|
138
|
-
|
139
|
-
# gibt das zweite Halbjahr von +jahr+ zurück.
|
140
|
-
def zweites_halbjahr(jahr)
|
141
|
-
halbjahr(jahr, 2)
|
142
|
-
end
|
143
|
-
|
144
190
|
# gibt aus +jahr+ das Halbjahr +1+ oder +2+ zurück.
|
145
191
|
def halbjahr(jahr, abschnitt)
|
146
192
|
abschnitte_dataset.where(:jahr => jahr, :abschnitt => abschnitt).first
|
@@ -171,10 +217,8 @@ module SchildErweitert
|
|
171
217
|
self.volljaehrig == "+"
|
172
218
|
end
|
173
219
|
|
174
|
-
|
175
|
-
|
176
|
-
jahr = self.akt_schuljahr
|
177
|
-
"#{jahr}/#{jahr-1999}"
|
220
|
+
def foto_vorhanden?
|
221
|
+
self.foto_vorhanden == "+"
|
178
222
|
end
|
179
223
|
end
|
180
224
|
|
@@ -211,7 +255,7 @@ module SchildErweitert
|
|
211
255
|
|
212
256
|
# Hilfsmethode für die folgenden Methoden
|
213
257
|
def faecher_nach_id(id)
|
214
|
-
noten.
|
258
|
+
noten.select{ |n| n.fach.Fachgruppe_ID == id && n.AufZeugnis == '+' }.sort_by{ |n| n.fach.SortierungS2 }
|
215
259
|
end
|
216
260
|
|
217
261
|
# wählt alle berufsübergreifenden Fächer des gewählten Schülers in angegeben Halbjahr.
|
@@ -256,31 +300,11 @@ module SchildErweitert
|
|
256
300
|
# Assoziation für Noten
|
257
301
|
class Noten < Schild::Noten
|
258
302
|
include SchildTypeSaver
|
303
|
+
include NotenHelfer
|
259
304
|
|
260
|
-
#
|
305
|
+
# note in String umwandeln
|
261
306
|
def note
|
262
|
-
|
263
|
-
when "1", "1+", "1-"
|
264
|
-
"sehr gut"
|
265
|
-
when "2", "2+", "2-"
|
266
|
-
"gut"
|
267
|
-
when "3", "3+", "3-"
|
268
|
-
"befriedigend"
|
269
|
-
when "4", "4+", "4-"
|
270
|
-
"ausreichend"
|
271
|
-
when "5", "5+", "5-"
|
272
|
-
"mangelhaft"
|
273
|
-
when "6"
|
274
|
-
"ungenügend"
|
275
|
-
when 'NB'
|
276
|
-
"----------"
|
277
|
-
when "E1"
|
278
|
-
"mit besonderem Erfolg teilgenommen"
|
279
|
-
when "E2"
|
280
|
-
"mit Erfolg teilgenommen"
|
281
|
-
when 'E3'
|
282
|
-
"teilgenommen"
|
283
|
-
end
|
307
|
+
note_s self.noten_krz
|
284
308
|
end
|
285
309
|
|
286
310
|
# Bezeichnung des Fachs
|
@@ -322,11 +346,7 @@ module SchildErweitert
|
|
322
346
|
# Assoziation für die jeweiligen BK-Prüfungsfächer
|
323
347
|
class BKAbschlussFaecher < Schild::BKAbschlussFaecher
|
324
348
|
include SchildTypeSaver
|
325
|
-
|
326
|
-
# Vornote des Prüfungsfachs
|
327
|
-
def vornote
|
328
|
-
self.Vornote.to_i
|
329
|
-
end
|
349
|
+
include NotenHelfer
|
330
350
|
|
331
351
|
# Wurde das Fach schriftlich geprüft?
|
332
352
|
def fach_schriftlich?
|
@@ -338,22 +358,34 @@ module SchildErweitert
|
|
338
358
|
self.MdlPruefung == "+"
|
339
359
|
end
|
340
360
|
|
341
|
-
|
342
|
-
|
343
|
-
self.NoteSchriftlich.to_i
|
361
|
+
def note(notenart=:note_abschluss_ba)
|
362
|
+
note_s send(notenart)
|
344
363
|
end
|
364
|
+
end
|
345
365
|
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
366
|
+
# Assoziation für Abi-Abschlussdaten
|
367
|
+
class AbiAbschluss < Schild::AbiAbschluss
|
368
|
+
include SchildTypeSaver
|
369
|
+
end
|
370
|
+
|
371
|
+
# Assoziation für die jeweiligen Abi-Prüfungsfächer
|
372
|
+
class AbiAbschlussFaecher < Schild::AbiAbschlussFaecher
|
373
|
+
include SchildTypeSaver
|
374
|
+
include NotenHelfer
|
350
375
|
|
351
|
-
|
352
|
-
|
353
|
-
self.NoteAbschluss.to_i
|
376
|
+
def note(notenart)
|
377
|
+
note_s send(notenart)
|
354
378
|
end
|
355
379
|
end
|
356
380
|
|
381
|
+
class Sprachenfolge < Schild::Sprachenfolge
|
382
|
+
include SchildTypeSaver
|
383
|
+
end
|
384
|
+
|
385
|
+
class Vermerke < Schild::Vermerke
|
386
|
+
include SchildTypeSaver
|
387
|
+
end
|
388
|
+
|
357
389
|
# Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder.
|
358
390
|
class Schule < Schild::Schule
|
359
391
|
include SchildTypeSaver
|
@@ -394,8 +426,13 @@ module SchildErweitert
|
|
394
426
|
alias :password :passwort
|
395
427
|
|
396
428
|
def passwort?(passwort='')
|
397
|
-
passwort
|
429
|
+
crypt(passwort) == self.passwort
|
398
430
|
end
|
399
431
|
alias :password? :passwort?
|
432
|
+
|
433
|
+
def crypt(passwort)
|
434
|
+
passwort.codepoints.map{|c| ((c/16)*32+15-c).chr}.join('')
|
435
|
+
end
|
400
436
|
end
|
401
437
|
end
|
438
|
+
|
data/specs/schueler_spec.rb
CHANGED
@@ -18,30 +18,30 @@ describe Schueler do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'geben Noten aus dem angegebenen Halbjahr und Jahr zurück (via Lernabschnitte und Leistungen)' do
|
21
|
-
@sm.
|
21
|
+
@sm.halbjahr(2013,1).noten.first.ID.must_equal 163701
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'gibt Konferenzdatum zurück (Lernabschnitte)' do
|
25
25
|
# offenbar keine in der Testdatenbank eingetragen
|
26
26
|
# deshalb Default-Objekt anfordern
|
27
|
-
@sm.
|
27
|
+
@sm.halbjahr(2013,1).konferenzdatum.must_be_instance_of DateTime
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'gibt berufsbezogene Fächer aus den angegebenen Lernabschnitten zurück' do
|
31
|
-
@sm.
|
31
|
+
@sm.halbjahr(2013,2).berufsbezogen.map{|n|n.fach.FachKrz}.must_include 'FF'
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'gibt berufsübergreifende Fächer aus den angegebenen Lernabschnitten zurück' do
|
35
|
-
@sm.
|
35
|
+
@sm.halbjahr(2013,2).berufsuebergreifend.map{|n|n.fach.FachKrz}.must_include 'D'
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'gibt Fächer aus dem Differenzierungsbereich zurück über angegebenen Lernabschnitt' do
|
39
|
-
Schueler[394].
|
39
|
+
Schueler[394].halbjahr(2007,1).differenzierungsbereich.map{|n|n.fach.FachKrz}.must_include 'CHDIFF'
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'gibt Fächer aus allen Fächergruppen zurück' do
|
43
|
-
fg = @sm.
|
44
|
-
fg.must_equal (@sm.
|
43
|
+
fg = @sm.halbjahr(2013,2).faechergruppen.flatten.count
|
44
|
+
fg.must_equal (@sm.halbjahr(2013,2).noten.select{|n|n.AufZeugnis == '+'}).count
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'gibt Zulassung zurück' do
|
@@ -70,23 +70,53 @@ describe Schueler do
|
|
70
70
|
end
|
71
71
|
|
72
72
|
it 'gibt Note schriftlich zurück' do
|
73
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSTE"}.note_schriftlich.must_equal 3
|
74
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSFK"}.note_schriftlich.must_equal
|
73
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSTE"}.note_schriftlich.must_equal '3'
|
74
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSFK"}.note_schriftlich.must_equal ''
|
75
75
|
end
|
76
76
|
|
77
77
|
it 'gibt Note mündlich zurück' do
|
78
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "M"}.note_muendlich.must_equal 6
|
79
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSFK"}.note_muendlich.must_equal
|
78
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "M"}.note_muendlich.must_equal '6'
|
79
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSFK"}.note_muendlich.must_equal ''
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'gibt Abschlussnote zurück' do
|
83
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "M"}.note_abschluss.must_equal 5
|
84
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSFK"}.note_abschluss.must_equal 3
|
83
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "M"}.note_abschluss.must_equal '5'
|
84
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSFK"}.note_abschluss.must_equal '3'
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'gibt Abschlussfächer zurück' do
|
88
|
-
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSTE"}.vornote.must_equal 4
|
88
|
+
Schueler[145].bk_abschluss_leistungen.find{|l|l.fach_krz == "GSTE"}.vornote.must_equal '4'
|
89
89
|
end
|
90
|
+
|
91
|
+
it 'gibt Abschlussnote als String zurück' do
|
92
|
+
# note als Symbol
|
93
|
+
Schueler[373].bk_abschluss_leistungen.find{|l|l.fach_krz == "M"}.note(:vornote).must_equal 'gut'
|
94
|
+
# Note als String
|
95
|
+
Schueler[381].bk_abschluss_leistungen.find{|l|l.fach_krz == "PB"}.note('note_abschluss_ba').must_equal 'mangelhaft'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'gibt Abschlussnote-BA zurück, wenn Abschlussnoten ohne Argumente angegeben wird' do
|
99
|
+
Schueler[5346].bk_abschluss_leistungen.find{|l|l.fach_krz == "E"}.note(:vornote).must_equal 'ausreichend'
|
100
|
+
Schueler[5346].bk_abschluss_leistungen.find{|l|l.fach_krz == "E"}.note.must_equal 'mangelhaft'
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'gibt die Sprachfolge als Niveau zurück' do
|
104
|
+
skip
|
105
|
+
# in der Test-Datenbank sind keine Sprachenfolgen eingetragen, daher ist das RN ""
|
106
|
+
Schueler[2072].halbjahr(2013,2).noten.find{|l|l.fach_id == 18}.fach.sprachenfolge.referenzniveau.must_equal ''
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'gibt Vermerke für Schüler als Array zurück' do
|
110
|
+
@sm.vermerke.must_be_instance_of Array
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'gibt Vermerk als String zurück' do
|
114
|
+
skip
|
115
|
+
# Leider keine Vermerke in der Testdatenbank eingetragen
|
116
|
+
@sm.vermerke.first.must_be_instance_of String
|
117
|
+
end
|
118
|
+
|
119
|
+
#schuelerabifaecher kann wegen mangelnder daten nicht getestet werden
|
90
120
|
end
|
91
121
|
|
92
122
|
describe 'gibt die korrekte Anzahl von Schülern über Klasse zurück' do
|
@@ -108,8 +138,8 @@ describe Schueler do
|
|
108
138
|
@sm.volljaehrig?.must_equal true
|
109
139
|
end
|
110
140
|
|
111
|
-
it 'gibt
|
112
|
-
@sm.
|
141
|
+
it 'gibt zurück, ob ein Foto vorhanden ist' do
|
142
|
+
@sm.foto_vorhanden?.must_equal false
|
113
143
|
end
|
114
144
|
|
115
145
|
it 'gibt passende Bezeichnung Schüler oder Schülerin zurück' do
|
@@ -123,38 +153,38 @@ describe Schueler do
|
|
123
153
|
end
|
124
154
|
|
125
155
|
it 'gibt die Textbezeichnung für eine Note zurück' do
|
126
|
-
@sm.
|
156
|
+
@sm.halbjahr(2013,2).noten[5].note.must_equal "gut"
|
127
157
|
end
|
128
158
|
|
129
159
|
it 'gibt die Textbezeichnung auch bei ungeraden Noten zurück' do
|
130
|
-
Schueler[178].
|
131
|
-
Schueler[178].
|
160
|
+
Schueler[178].halbjahr(2010,1).noten[0].note.must_equal "mangelhaft"
|
161
|
+
Schueler[178].halbjahr(2010,1).noten[0].NotenKrz.must_equal "5-"
|
132
162
|
end
|
133
163
|
|
134
164
|
it 'gibt die volle Fachbezeichnung zurück' do
|
135
|
-
@sm.
|
165
|
+
@sm.halbjahr(2013,2).noten[5].bezeichnung.must_equal "Farb- und Formveränderung"
|
136
166
|
end
|
137
167
|
|
138
168
|
it 'gibt die korrekte Fachgruppen_ID zurück' do
|
139
|
-
@sm.
|
169
|
+
@sm.halbjahr(2013,2).noten[5].fachgruppe_ID.must_equal 20
|
140
170
|
end
|
141
171
|
|
142
172
|
it 'gibt den Namen des Klassenlehrers zurück' do
|
143
|
-
@sm.
|
173
|
+
@sm.halbjahr(2013,2).v_name_klassenlehrer.must_equal "P. Ronnewinkel"
|
144
174
|
end
|
145
175
|
|
146
176
|
it 'gibt an, ob Klassenlehrer/in' do
|
147
|
-
@sm.
|
177
|
+
@sm.halbjahr(2013,2).klassenlehrer_in.must_equal "Klassenlehrer"
|
148
178
|
end
|
149
179
|
|
150
180
|
it 'gibt das zweite Halbjahr zurück' do
|
151
|
-
@sm.
|
152
|
-
@sm.
|
181
|
+
@sm.halbjahr(2013,2).Abschnitt.must_equal 2
|
182
|
+
@sm.halbjahr(2013,2).Jahr.must_equal 2013
|
153
183
|
end
|
154
184
|
|
155
185
|
it 'gibt das erste Halbjahr zurück' do
|
156
|
-
@sm.
|
157
|
-
@sm.
|
186
|
+
@sm.halbjahr(2014,1).Abschnitt.must_equal 1
|
187
|
+
@sm.halbjahr(2014,1).Jahr.must_equal 2014
|
158
188
|
end
|
159
189
|
|
160
190
|
it 'gibt das aktuelle Halbjahr zurück' do
|
data/specs/type_safe_spec.rb
CHANGED
@@ -16,8 +16,8 @@ describe Schueler do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'gibt 0 bei fehlendem Integer zurück' do
|
19
|
-
Schueler[6176].
|
20
|
-
Schueler[6176].
|
19
|
+
Schueler[6176].halbjahr(2014,1).sum_fehl_std.must_equal 0
|
20
|
+
Schueler[6176].halbjahr(2014,1).SumFehlStd.must_equal nil
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schild
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- HMT
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|