schild 0.6.4 → 0.7.0b
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.md +25 -0
- data/README.md +64 -13
- data/lib/schild.rb +163 -168
- data/lib/schild/version.rb +1 -1
- data/schild.gemspec +2 -2
- data/specs/fachklasse_spec.rb +11 -2
- data/specs/schueler_spec.rb +6 -2
- metadata +26 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2878f6313d32ac0d7102d5a1edb25fb9589c30be
|
4
|
+
data.tar.gz: 78ae6702626dd3493ca58e1190fbb593cc03e6d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9df5d21bb1cdcd674eee65f3336b6a143ec46005aebd81b4817d4e38f58b71ae36a0167c10364f0e6fa1158cb8e167d3d8e918a92b2586ccd4f3075ebe21cf1
|
7
|
+
data.tar.gz: 53cacfb468aefdfd487a030e9fc28f389208ce335dc49258cee98760b6032b1fe6c73ac386944618b29e1587faf86b674231095fcd14403fa1f12c6e9715c747
|
data/LICENSE.md
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
## The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2015 HMT
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
|
23
|
+
|
24
|
+
## Oder
|
25
|
+
|
1
26
|
## creative commons
|
2
27
|
|
3
28
|
# Attribution 4.0 International
|
data/README.md
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
[Schild-NRW](http://www.svws.nrw.de/index.php?id=schildnrw) ist die offizielle Schulverwaltungssoftware in NRW, `schild` ein Ruby-Gem, das als API zwischen der Schild-NRW-Datenbank und eigenen Skripten fungieren kann. `schild` ermöglicht es, direkt und ohne die Schild-Oberfläche auf Daten zuzugreifen und für eigene Zwecke weiterzuverarbeiten, z.B. um eigene Dokumente (Reports/Berichte in Schild-Sprech genannt) zu erstellen.
|
4
4
|
|
5
|
-
Mit `schild` kann man
|
6
|
-
|
7
|
-
Auch möglich ist die Nutzung von HTML und CSS zur Erzeugung von Dokumenten. Dazu eigenet sich bespielsweise [slim](http://slim-lang.com).
|
5
|
+
Mit `schild` kann man eigene Skripte schreiben und komfortabel auf die Datenbank zugreifen. Kenntnisse in der Programmiersprache Ruby sind allerdings notwendig.
|
8
6
|
|
9
7
|
Um `schild` nutzen zu können muss es zuerst installiert werden:
|
10
8
|
|
@@ -18,12 +16,14 @@ Dazu muss ein Datenbankadapter installiert werden. Da in den meisten Fällen MyS
|
|
18
16
|
gem install mysql2
|
19
17
|
```
|
20
18
|
|
19
|
+
Falls es nicht klappt und Fehlermeldungen auftauchen. liegt es meist daran, dass neben dem Server auch die Entwicklerbibliotheken isntalliert sein müssen. `mysql-dev` oder ähnlich genannt. Das hängt vom jeweils verwendeten Betriebssystem ab.
|
20
|
+
|
21
21
|
Jetzt kann `schild` in einem Skript aufgerufen werden:
|
22
22
|
|
23
23
|
```ruby
|
24
24
|
require 'schild'
|
25
25
|
```
|
26
|
-
Da `schild` eine Datenbankverbindung zur Schild-Datenbank herstellen muss, werden noch ein paar Angaben gebraucht. `schild`verwendet dafür sog. Environment-Variablen. Unter Linux sehen die so aus:
|
26
|
+
Da `schild` eine Datenbankverbindung zur Schild-Datenbank herstellen muss, werden noch ein paar Angaben gebraucht. `schild` verwendet dafür sog. Environment-Variablen. Unter Linux sehen die so aus:
|
27
27
|
|
28
28
|
```sh
|
29
29
|
export S_USER=schild
|
@@ -52,9 +52,9 @@ require 'schild'
|
|
52
52
|
```
|
53
53
|
|
54
54
|
Hier ist es wichtig, dass zuerst die Variablen geladen werden und erst im Anschluss daran `schild`, denn `schild` versucht direkt beim ersten Laden die Verbindung zur Datenbank herzustellen.
|
55
|
-
|
55
|
+
|
56
56
|
Nun sollte noch das `Schild`-Modul geladen werden, das die Verwendung von `schild` vereinfacht:
|
57
|
-
|
57
|
+
|
58
58
|
```ruby
|
59
59
|
require 'envyable'
|
60
60
|
Envyable.load('./config/env.yml', 'testing')
|
@@ -63,8 +63,7 @@ include Schild
|
|
63
63
|
```
|
64
64
|
|
65
65
|
Um jedoch alle Hilfsmethoden nutzen zu können, die das `schild`-Gem zur
|
66
|
-
Verfügung stellt, noch besser
|
67
|
-
Version 0.4.0 zur Verfügung steht:
|
66
|
+
Verfügung stellt, noch besser folgender Befehl verwenden:
|
68
67
|
|
69
68
|
```ruby
|
70
69
|
include SchildErweitert
|
@@ -88,7 +87,7 @@ oder:
|
|
88
87
|
```ruby
|
89
88
|
s = Schueler.where(:Klasse => 'B13B').first
|
90
89
|
s.skt_halbjahr.noten.map{ |n| "#{n.fach.Bezeichnung}: #{n.NotenKrz}"}
|
91
|
-
=> ["Deutsch/ Kommunikation: 3", "Englisch: 3", "Religionslehre: ", "Mathematik: 4-", "Sport/ Gesundheitsförderung: 2", "Wirtschafts- und Betriebslehre: 3", "Datenverarbeitung: ", "Fachpraxis Textil/ Bekleidung: 2", "Gestaltungslehre: 3", "Politik/ Gesellschaftslehre: 2", "Technologie Bekleidung: 5", "Technisches Zeichnen Bekleidung: 4"]
|
90
|
+
=> ["Deutsch/ Kommunikation: 3", "Englisch: 3", "Religionslehre: ", "Mathematik: 4-", "Sport/ Gesundheitsförderung: 2", "Wirtschafts- und Betriebslehre: 3", "Datenverarbeitung: ", "Fachpraxis Textil/ Bekleidung: 2", "Gestaltungslehre: 3", "Politik/ Gesellschaftslehre: 2", "Technologie Bekleidung: 5", "Technisches Zeichnen Bekleidung: 4"]
|
92
91
|
```
|
93
92
|
|
94
93
|
In diesem Beispiel wurde der erste Schüler der klasse B13B aus dem Datensatz `Schueler` gewählt und Daten aus verschiedenen Tabellen abgerufen:
|
@@ -97,7 +96,7 @@ In diesem Beispiel wurde der erste Schüler der klasse B13B aus dem Datensatz `S
|
|
97
96
|
* Die Notenliste aus Noten
|
98
97
|
* Die Fachbezeichnung aus Faecher
|
99
98
|
|
100
|
-
`schild` vereinfacht an dieser Stelle einige Probleme von Schild. So sind z.B. Daten zur Schule unter `Schule` erreichbar, während die Tabelle unter Schild direkt nur über DB[:eigeneschule] anzusteuern wäre. Da viele Namen im Schema der Schild-Datenbank uneinheitlich sind, versucht `schild
|
99
|
+
`schild` vereinfacht an dieser Stelle einige Probleme von Schild. So sind z.B. Daten zur Schule unter `Schule` erreichbar, während die Tabelle unter Schild direkt nur über DB[:eigeneschule] anzusteuern wäre. Da viele Namen im Schema der Schild-Datenbank uneinheitlich sind, versucht `schild`, soweit es geht, eine einheitliche Form zu verwenden.
|
101
100
|
|
102
101
|
Alle zur Verfügung stehenden Hilfsmethoden werden in den API-Docs erläutert.
|
103
102
|
|
@@ -119,15 +118,47 @@ s.bemerkungen
|
|
119
118
|
|
120
119
|
Mit Hilfe dieser zusätzlichen Methoden können Fehlermeldungen in den erstellten Berichten komfortabel umgangen werden. Je nach Bedarf kann auf Typensicherheit gesetzt werden oder etwas mehr Freiheit.
|
121
120
|
|
121
|
+
Zum Abfragen der Tabellen stehen also die Methoden entsprechend der Tabellen zur Verfügung:
|
122
|
+
|
123
|
+
```ruby
|
124
|
+
s = Schueler.first
|
125
|
+
s.Geburtsdatum
|
126
|
+
=> nil
|
127
|
+
s.Vorname
|
128
|
+
=> "Stefan"
|
129
|
+
```
|
130
|
+
|
131
|
+
Dazu die erweiterte Methode
|
132
|
+
```ruby
|
133
|
+
s = Schueler.first
|
134
|
+
s.geburtsdatum
|
135
|
+
=> 1899-01-01 00:00:00 +0100
|
136
|
+
s.geburtsland_mutter
|
137
|
+
=> ""
|
138
|
+
```
|
139
|
+
|
140
|
+
Und es gibt noch die Unterstrichmethoden, die beides verbinden: Ruby-style und frei von nil:
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
s = Schueler.first
|
144
|
+
s._geburtsdatum
|
145
|
+
=> nil0
|
146
|
+
s._geburtsland_mutter
|
147
|
+
=> nil
|
148
|
+
```
|
122
149
|
## Das sollte beachtet werden
|
123
|
-
`schild` läuft nur unter Ruby. Es
|
150
|
+
`schild` läuft nur unter Ruby. Es läuft auch unter JRuby und kann dementsprechend in alle auf der JVM laufenden Sprachen eingesetzt werden.
|
124
151
|
|
125
152
|
Die Schild-Datenbank muss einigermaßen aktuell sein, ältere Datenbanken haben offensichtlich noch Großbuchstaben in den Tabellennamen verwendet. Das bereitet `schild` Schwierigkeiten. Bei neueren Versionen von Schild (2015) werden Kleinbuchstaben verwendet.
|
126
153
|
|
127
|
-
Es kann nicht garantiert werden, dass `schild` mit jeder Version von Schild funktioniert. `schild` hat keinerlei Einfluß auf die Entwicklung von Schild und kann bei jeder Änderung am Schema der Datenbank zu fehlerhaftem Verhalten veranlasst werden.
|
154
|
+
Es kann nicht garantiert werden, dass `schild` mit jeder Version von Schild funktioniert. `schild` hat keinerlei Einfluß auf die Entwicklung von Schild und kann bei jeder Änderung am Schema der Datenbank zu fehlerhaftem Verhalten veranlasst werden. Soweit möglich, werden Legacy-Methoden geschrieben, die trotz namensänderung auf alte Werte zugreifen können. Ebenso werden Warnungen geschrieben, wenn `schild` Methoden kennt, die Schild in alten Versionen noch nicht verwendet hat.
|
128
155
|
|
129
156
|
`schild` verändert keine Daten an der Schild-Datenbank. Es ist aber möglich, dass mit Hilfe von `schild` auf Daten zugegriffen und verändert wird. `schild` verwendet zum Ansteuern der Datenbank `sequel`, ein weiterer Gem zum komfortablen Bearbeiten von relationalen Datenbanken. Um sicherzugehen, dass keine Schreibzugriffe auf die Schild-Datenbank vorgenommen werden, muss der Datenbankbenutzer auf Lesezugriff beschränkt werden.
|
130
157
|
|
158
|
+
Abschließend sollte noch erwähnt werden, dass `schild` naturgemäß auf nicht besonders vielen Datenbanken getestet werden konnte. Es wir zur Zeit an einem Berufskolleg verwendet und funktioniert einwandfrei. Nicht alle Tabellen werden derzeit verwendet, können aber bei Bedarf relativ schnell eingebunden werden.
|
159
|
+
|
160
|
+
`schild` wird zur Zeit als Bibliothek für [Sahib](https://github.com/hmt/sahib) eingesetzt. Sahib ist eine komfortable Oberfläche zum Suchen von Schülern und Klassen und der Erstellung von Dokumenten mit Hilfe von HTML und CSS, die als PDF ausgegben werden. Zeugnisse und andere Dokumente können innerhalb von wenigen Minuten erstellt und ausgegeben werden.
|
161
|
+
|
131
162
|
## Tests
|
132
163
|
`schild` verwendet Tests, um sicherzustellen, dass alle Funktionen über den gesamten Entwicklungsprozess reibungslos funktionieren. Dazu wird die Testdatenbank verwendet, die von der ribeka GmbH auf ihrer Dropbox zur Verfügung gestellt wurde. Leider ist dies eine ältere Version, die an die neue Schild-Version angepasst werden musste. Die neue Version steht als [Download](https://www.dropbox.com/s/tyswqh1burf4ijo/schild-test.sql.gz?dl=0) zur Verfügung und kann in MySQL importiert werden.
|
133
164
|
|
@@ -138,7 +169,7 @@ git clone git@github.com:hmt/schild.git
|
|
138
169
|
cd schild
|
139
170
|
```
|
140
171
|
|
141
|
-
Um die Tests bei installierter Datenbank durchführen zu können müssen die nötigen Abhängigkeiten installiert sein. Dies wird über `bundler` organisiert:
|
172
|
+
Um die Tests bei installierter Datenbank durchführen zu können, müssen die nötigen Abhängigkeiten installiert sein. Dies wird über `bundler` organisiert:
|
142
173
|
|
143
174
|
```sh
|
144
175
|
bundle install
|
@@ -150,6 +181,8 @@ Die Tests können nun mit `rake` gestartet werden:
|
|
150
181
|
rake
|
151
182
|
```
|
152
183
|
|
184
|
+
`rake` greift automatisch auf die `config/env.yml` zu, um Environment-Variablen einzulesen, die voreingestellt sind. Damit die Tests funktionieren, müssen diese Variablen evtl. an die jeweilige Datenbankanbindung angepasst werden.
|
185
|
+
|
153
186
|
## Mitmachen
|
154
187
|
Hilfe bei der Mitarbeit von `schild` wird gerne angenommen. Bitte Pull Requests und Issues bei Github nutzen. Alle Änderungen sollten mit Tests eingereicht werden.
|
155
188
|
|
@@ -157,7 +190,25 @@ Hilfe bei der Mitarbeit von `schild` wird gerne angenommen. Bitte Pull Requests
|
|
157
190
|
[![Creative Commons Lizenzvertrag](https://i.creativecommons.org/l/by/4.0/88x31.png)]("http://creativecommons.org/licenses/by/4.0/")
|
158
191
|
[schild](https://github.com/hmt/schild) von [HMT](https://github.com/hmt) ist lizenziert unter einer [Creative Commons Namensnennung 4.0 International Lizenz](http://creativecommons.org/licenses/by/4.0/).
|
159
192
|
|
193
|
+
Oder:
|
194
|
+
The MIT License (MIT)
|
160
195
|
|
196
|
+
Copyright (c) 2015 HMT
|
161
197
|
|
198
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
199
|
+
of this software and associated documentation files (the "Software"), to deal
|
200
|
+
in the Software without restriction, including without limitation the rights
|
201
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
202
|
+
copies of the Software, and to permit persons to whom the Software is
|
203
|
+
furnished to do so, subject to the following conditions:
|
162
204
|
|
205
|
+
The above copyright notice and this permission notice shall be included in all
|
206
|
+
copies or substantial portions of the Software.
|
163
207
|
|
208
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
209
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
210
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
211
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
212
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
213
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
214
|
+
SOFTWARE.
|
data/lib/schild.rb
CHANGED
@@ -1,120 +1,6 @@
|
|
1
1
|
require 'schild/version'
|
2
2
|
require 'sequel'
|
3
3
|
|
4
|
-
# erst Ruby 2.1.0 macht include zu einer public-Methode
|
5
|
-
if Module.private_method_defined? :include
|
6
|
-
class Module
|
7
|
-
public :include
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
# String und Symbol werden um snake_case ergänzt, das die Schild-Tabellen umbenennt
|
12
|
-
module CoreExtensions
|
13
|
-
module String
|
14
|
-
def snake_case
|
15
|
-
return downcase if match(/\A[A-Z]+\z/)
|
16
|
-
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
17
|
-
gsub(/([a-z])([A-Z])/, '\1_\2').
|
18
|
-
downcase
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
module Symbol
|
23
|
-
def snake_case
|
24
|
-
to_s.snake_case
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
# Halten wir Protokoll zu den erstellten Methoden
|
30
|
-
# Ist brauchbar, wenn man z.B. noch extremer als der SchildTypeSaver arbeiten möchte
|
31
|
-
module MethodLogger
|
32
|
-
class Methods
|
33
|
-
@@accessor_methods = {}
|
34
|
-
|
35
|
-
def self.add(klass, meth)
|
36
|
-
@@accessor_methods[klass] ||= []
|
37
|
-
@@accessor_methods[klass] << meth
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.list(klass)
|
41
|
-
@@accessor_methods[klass]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Schild hat teilweise nil in DB-Feldern. SchildTypeSaver gibt entweder einen
|
47
|
-
# Leer-String zurück ("") oder bei strftime das 1899 Datum zurück.
|
48
|
-
module SchildTypeSaver
|
49
|
-
Symbol.include CoreExtensions::Symbol
|
50
|
-
String.include CoreExtensions::String
|
51
|
-
|
52
|
-
# bei include wird für jede Spalte in der Schild-Tabelle eine Ersatzmethode
|
53
|
-
# erstellt, die bei nil ein Null-Objekt erstellt.
|
54
|
-
def self.included(klass)
|
55
|
-
klass.columns.each do |column|
|
56
|
-
name = column.snake_case
|
57
|
-
MethodLogger::Methods.add(klass, name)
|
58
|
-
# allow_nil ist als Argument optional und lässt bei +true+ alle Ergebnisse durch
|
59
|
-
define_method(("_"+name.to_s).to_sym) {public_send(column)}
|
60
|
-
define_method(name) do |allow_nil=false|
|
61
|
-
ret = public_send(column)
|
62
|
-
if allow_nil || ret
|
63
|
-
ret = ret.strip if ret.class == String
|
64
|
-
ret
|
65
|
-
else
|
66
|
-
create_null_object(klass, column)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
def create_null_object(klass, column)
|
73
|
-
k = DB.schema_type_class(klass.db_schema[column][:type])
|
74
|
-
if k.class == Array
|
75
|
-
# Sequel stellt :datetime als [Time, DateTime] dar, deswegen die Abfrage nach Array
|
76
|
-
# Schild verwendet Time Objekte, wir machen das auch
|
77
|
-
Time.new(1899)
|
78
|
-
elsif k == Integer
|
79
|
-
0
|
80
|
-
elsif k == Float
|
81
|
-
0.0
|
82
|
-
else
|
83
|
-
# alle anderen types werden als Klasse zurückgegeben
|
84
|
-
k.new
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# Mixin für Notenbezeichnungen
|
90
|
-
module NotenHelfer
|
91
|
-
# Notenbezeichnung als String
|
92
|
-
def note_s(ziffer)
|
93
|
-
case ziffer
|
94
|
-
when "1", "1+", "1-"
|
95
|
-
"sehr gut"
|
96
|
-
when "2", "2+", "2-"
|
97
|
-
"gut"
|
98
|
-
when "3", "3+", "3-"
|
99
|
-
"befriedigend"
|
100
|
-
when "4", "4+", "4-"
|
101
|
-
"ausreichend"
|
102
|
-
when "5", "5+", "5-"
|
103
|
-
"mangelhaft"
|
104
|
-
when "6"
|
105
|
-
"ungenügend"
|
106
|
-
when 'NB'
|
107
|
-
"––––––"
|
108
|
-
when "E1"
|
109
|
-
"mit besonderem Erfolg teilgenommen"
|
110
|
-
when "E2"
|
111
|
-
"mit Erfolg teilgenommen"
|
112
|
-
when 'E3'
|
113
|
-
"teilgenommen"
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
4
|
# Das Schild Modul, das alle Klassen für die Datenbankanbindung bereitstellt
|
119
5
|
module Schild
|
120
6
|
# ist die Datenbank-Verbindung. Alle Daten können über diese Konstante abgerufen werden
|
@@ -209,11 +95,154 @@ module Schild
|
|
209
95
|
end
|
210
96
|
|
211
97
|
module SchildErweitert
|
212
|
-
include
|
213
|
-
|
214
|
-
|
215
|
-
|
98
|
+
# erst Ruby 2.1.0 macht include zu einer public-Methode
|
99
|
+
if Module.private_method_defined? :include
|
100
|
+
class Module
|
101
|
+
public :include
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
# String und Symbol werden um snake_case ergänzt, das die Schild-Tabellen umbenennt
|
106
|
+
# Legacy-Methoden aus alten Schild-Versionen wird teilweise auch unterstützt.
|
107
|
+
module CoreExtensions
|
108
|
+
module String
|
109
|
+
def snake_case
|
110
|
+
return downcase if match(/\A[A-Z]+\z/)
|
111
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
112
|
+
gsub(/([a-z])([A-Z])/, '\1_\2').
|
113
|
+
downcase
|
114
|
+
end
|
115
|
+
end
|
216
116
|
|
117
|
+
module Symbol
|
118
|
+
def snake_case
|
119
|
+
to_s.snake_case
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
module Schueler
|
124
|
+
def entlassart
|
125
|
+
return self.entlass_art if self.respond_to?(:entlass_art)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
module Fachklasse
|
130
|
+
def dqr_niveau
|
131
|
+
return self.DQR_Niveau if self.respond_to?(:DQR_Niveau)
|
132
|
+
"Alte Schild-Version ohne DQR-Niveau"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Schild hat teilweise nil in DB-Feldern. SchildTypeSaver gibt entweder einen
|
138
|
+
# Leer-String zurück ("") oder bei strftime das 1899 Datum zurück.
|
139
|
+
module SchildTypeSaver
|
140
|
+
Symbol.include SchildErweitert::CoreExtensions::Symbol
|
141
|
+
String.include CoreExtensions::String
|
142
|
+
|
143
|
+
# bei include wird für jede Spalte in der Schild-Tabelle eine Ersatzmethode
|
144
|
+
# erstellt, die bei nil ein Null-Objekt erstellt.
|
145
|
+
def self.included(klass)
|
146
|
+
klass.columns.each do |column|
|
147
|
+
name = column.snake_case
|
148
|
+
MethodLogger::Methods.add(klass, name)
|
149
|
+
# allow_nil ist als Argument optional und lässt bei +true+ alle Ergebnisse durch
|
150
|
+
define_method(("_"+name.to_s).to_sym) {public_send(column)}
|
151
|
+
define_method(name) do |allow_nil=false|
|
152
|
+
ret = public_send(column)
|
153
|
+
if allow_nil || ret
|
154
|
+
ret = ret.strip if ret.class == String
|
155
|
+
ret
|
156
|
+
else
|
157
|
+
create_null_object(klass, column)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
def create_null_object(klass, column)
|
164
|
+
k = Schild::DB.schema_type_class(klass.db_schema[column][:type])
|
165
|
+
if k.class == Array
|
166
|
+
# Sequel stellt :datetime als [Time, DateTime] dar, deswegen die Abfrage nach Array
|
167
|
+
# Schild verwendet Time Objekte, wir machen das auch
|
168
|
+
Time.new(1899)
|
169
|
+
elsif k == Integer
|
170
|
+
0
|
171
|
+
elsif k == Float
|
172
|
+
0.0
|
173
|
+
else
|
174
|
+
# alle anderen types werden als Klasse zurückgegeben
|
175
|
+
k.new
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# Halten wir Protokoll zu den erstellten Methoden
|
181
|
+
# Ist brauchbar, wenn man z.B. noch extremer als der SchildTypeSaver arbeiten möchte
|
182
|
+
module MethodLogger
|
183
|
+
class Methods
|
184
|
+
@@accessor_methods = {}
|
185
|
+
|
186
|
+
def self.add(klass, meth)
|
187
|
+
@@accessor_methods[klass] ||= []
|
188
|
+
@@accessor_methods[klass] << meth
|
189
|
+
end
|
190
|
+
|
191
|
+
def self.list(klass)
|
192
|
+
@@accessor_methods[klass]
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
# Mixin für Notenbezeichnungen
|
198
|
+
module NotenHelfer
|
199
|
+
# Notenbezeichnung als String
|
200
|
+
def note_s(ziffer)
|
201
|
+
case ziffer
|
202
|
+
when "1", "1+", "1-"
|
203
|
+
"sehr gut"
|
204
|
+
when "2", "2+", "2-"
|
205
|
+
"gut"
|
206
|
+
when "3", "3+", "3-"
|
207
|
+
"befriedigend"
|
208
|
+
when "4", "4+", "4-"
|
209
|
+
"ausreichend"
|
210
|
+
when "5", "5+", "5-"
|
211
|
+
"mangelhaft"
|
212
|
+
when "6"
|
213
|
+
"ungenügend"
|
214
|
+
when 'NB'
|
215
|
+
"––––––"
|
216
|
+
when "E1"
|
217
|
+
"mit besonderem Erfolg teilgenommen"
|
218
|
+
when "E2"
|
219
|
+
"mit Erfolg teilgenommen"
|
220
|
+
when 'E3'
|
221
|
+
"teilgenommen"
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
# Klassen sind Konstanten. Deswegen alle auslesen, die Klassen behalten und
|
227
|
+
# dynamisch neue Klassen mit gleichem Namen erstellen.
|
228
|
+
# Automatisch SchildTypeSaver einbinden.
|
229
|
+
#
|
230
|
+
# Sollen zusätzliche Methoden eingebunden werden, muss - wie unten Schueler
|
231
|
+
# und andere Klassen - die neu erstelle Klasse gepatcht werden.
|
232
|
+
# Die alten Methoden bleiben erhalten, d.h. auch die TypeSaver-Methoden.
|
233
|
+
Schild.constants.map {|name| Schild.const_get(name)}.select {|o| o.is_a?(Class)}.each do |klass|
|
234
|
+
name = Schild.const_get(klass.to_s).name.split("::").last
|
235
|
+
klass = Class.new(klass) do
|
236
|
+
include SchildTypeSaver
|
237
|
+
end
|
238
|
+
name = const_set(name, klass)
|
239
|
+
end
|
240
|
+
|
241
|
+
Fachklasse.include CoreExtensions::Fachklasse
|
242
|
+
Schueler.include CoreExtensions::Schueler
|
243
|
+
|
244
|
+
# Stellt die Schüler-Tabelle samt Assoziationen bereit.
|
245
|
+
class Schueler
|
217
246
|
# gibt das z.Zt. aktuelle Halbjahr zurück.
|
218
247
|
def akt_halbjahr
|
219
248
|
abschnitte.last
|
@@ -268,20 +297,8 @@ module SchildErweitert
|
|
268
297
|
end
|
269
298
|
end
|
270
299
|
|
271
|
-
# Dient als Assoziation für Schüler und deren Klassenbezeichnung etc.
|
272
|
-
class Fachklasse < Schild::Fachklasse
|
273
|
-
include SchildTypeSaver
|
274
|
-
end
|
275
|
-
|
276
|
-
# Assoziation für Lehrer, hauptsächlich für Klassenlehrer
|
277
|
-
class Klassenlehrer < Schild::Klassenlehrer
|
278
|
-
include SchildTypeSaver
|
279
|
-
end
|
280
|
-
|
281
300
|
# Ist die Assoziation, die Halbjahre, sog. Abschnitte zurückgibt.
|
282
|
-
class Abschnitt
|
283
|
-
include SchildTypeSaver
|
284
|
-
|
301
|
+
class Abschnitt
|
285
302
|
dataset_module do
|
286
303
|
# filtert den Datensatz nach Jahr
|
287
304
|
def jahr(i)
|
@@ -346,8 +363,7 @@ module SchildErweitert
|
|
346
363
|
end
|
347
364
|
|
348
365
|
# Assoziation für Noten
|
349
|
-
class Noten
|
350
|
-
include SchildTypeSaver
|
366
|
+
class Noten
|
351
367
|
include NotenHelfer
|
352
368
|
|
353
369
|
# note in String umwandeln
|
@@ -366,15 +382,9 @@ module SchildErweitert
|
|
366
382
|
end
|
367
383
|
end
|
368
384
|
|
369
|
-
# Assoziation für Fächer
|
370
|
-
class Faecher < Schild::Faecher
|
371
|
-
include SchildTypeSaver
|
372
|
-
end
|
373
385
|
|
374
386
|
# Assoziation für BK-Abschlussdaten
|
375
|
-
class BKAbschluss
|
376
|
-
include SchildTypeSaver
|
377
|
-
|
387
|
+
class BKAbschluss
|
378
388
|
# Ist der Schüler zugelassen?
|
379
389
|
def zulassung?
|
380
390
|
self.Zulassung == "+"
|
@@ -392,8 +402,7 @@ module SchildErweitert
|
|
392
402
|
end
|
393
403
|
|
394
404
|
# Assoziation für die jeweiligen BK-Prüfungsfächer
|
395
|
-
class BKAbschlussFaecher
|
396
|
-
include SchildTypeSaver
|
405
|
+
class BKAbschlussFaecher
|
397
406
|
include NotenHelfer
|
398
407
|
|
399
408
|
# Wurde das Fach schriftlich geprüft?
|
@@ -411,14 +420,8 @@ module SchildErweitert
|
|
411
420
|
end
|
412
421
|
end
|
413
422
|
|
414
|
-
# Assoziation für Abi-Abschlussdaten
|
415
|
-
class AbiAbschluss < Schild::AbiAbschluss
|
416
|
-
include SchildTypeSaver
|
417
|
-
end
|
418
|
-
|
419
423
|
# Assoziation für die jeweiligen Abi-Prüfungsfächer
|
420
|
-
class AbiAbschlussFaecher
|
421
|
-
include SchildTypeSaver
|
424
|
+
class AbiAbschlussFaecher
|
422
425
|
include NotenHelfer
|
423
426
|
|
424
427
|
def note(notenart)
|
@@ -426,65 +429,57 @@ module SchildErweitert
|
|
426
429
|
end
|
427
430
|
end
|
428
431
|
|
429
|
-
|
430
|
-
|
431
|
-
end
|
432
|
-
|
433
|
-
class Vermerke < Schild::Vermerke
|
434
|
-
include SchildTypeSaver
|
435
|
-
end
|
436
|
-
|
437
|
-
class Schuelerfotos < Schild::Schuelerfotos
|
438
|
-
include SchildTypeSaver
|
439
|
-
end
|
440
|
-
|
441
|
-
# Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder.
|
442
|
-
class Schule < Schild::Schule
|
443
|
-
include SchildTypeSaver
|
444
|
-
|
432
|
+
# Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder mittel class-Methoden
|
433
|
+
class Schule
|
445
434
|
# gibt die Schulnummer zurück
|
446
435
|
def self.schulnummer
|
447
436
|
self.first.schul_nr
|
448
437
|
end
|
449
438
|
|
439
|
+
# gibt den Namen des Schulleiters als V. Name zurück
|
450
440
|
def self.v_name_schulleiter
|
451
441
|
"#{self.first.schulleiter_vorname[0]}. #{self.first.schulleiter_name}"
|
452
442
|
end
|
453
443
|
|
444
|
+
# gibt die männliche bzw. weibliche Form des Schulleiters zurück
|
454
445
|
def self.schulleiter_in
|
455
446
|
self.first.schulleiter_geschlecht == 3 ? "Schulleiter" : "Schulleiterin"
|
456
447
|
end
|
457
448
|
|
449
|
+
# gibt den Ort der Schule zurück
|
458
450
|
def self.ort
|
459
451
|
self.first.ort
|
460
452
|
end
|
461
453
|
end
|
462
454
|
|
463
455
|
# Tabelle der Schuld-Benutzer zum Abgleichen der Daten
|
464
|
-
class Nutzer
|
465
|
-
include SchildTypeSaver
|
456
|
+
class Nutzer
|
466
457
|
|
458
|
+
# der Nutzername
|
467
459
|
def name
|
468
460
|
self.us_name
|
469
461
|
end
|
470
462
|
|
463
|
+
# der Login-Name des Nutzers
|
471
464
|
def login
|
472
465
|
self.us_login_name
|
473
466
|
end
|
474
467
|
|
468
|
+
# das Passwort des Nutzers
|
475
469
|
def passwort
|
476
470
|
self.us_password
|
477
471
|
end
|
478
472
|
alias :password :passwort
|
479
473
|
|
474
|
+
# prüft, ob das angegebene Passwort mit dem gespeicherten Passwort übereinstimmt
|
480
475
|
def passwort?(passwort='')
|
481
476
|
crypt(passwort) == self.passwort
|
482
477
|
end
|
483
478
|
alias :password? :passwort?
|
484
479
|
|
480
|
+
# ver- bzw. entschlüsselt einen String mit dem Schild-Passwortalgorithmus
|
485
481
|
def crypt(passwort)
|
486
482
|
passwort.codepoints.map{|c| ((c/16)*32+15-c).chr}.join('')
|
487
483
|
end
|
488
484
|
end
|
489
485
|
end
|
490
|
-
|
data/lib/schild/version.rb
CHANGED
data/schild.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.summary = %q{Schild-API}
|
12
12
|
spec.description = %q{schild bietet eine Ruby-Schnittstelle zu SchilD-NRW-Datenbanken.}
|
13
13
|
spec.homepage = "https://github.com/hmt/schild"
|
14
|
-
spec.
|
14
|
+
spec.licenses = ["Creative Commons Namensnennung 4.0 International Lizenz.", "MIT License"]
|
15
15
|
spec.required_ruby_version = ">= 2.0"
|
16
16
|
|
17
17
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency "minitest", "~> 5"
|
25
25
|
spec.add_development_dependency "minitest-rg", "~> 5"
|
26
26
|
spec.add_development_dependency "mysql2", "~> 0.4"
|
27
|
+
spec.add_development_dependency "envyable", "~> 0"
|
27
28
|
|
28
29
|
spec.add_runtime_dependency "sequel", "~> 4"
|
29
|
-
spec.add_runtime_dependency "envyable", "~> 0"
|
30
30
|
end
|
data/specs/fachklasse_spec.rb
CHANGED
@@ -1,10 +1,19 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/spec_helper"
|
2
2
|
|
3
3
|
describe Fachklasse do
|
4
|
+
before do
|
5
|
+
@f = Fachklasse.first
|
6
|
+
end
|
4
7
|
describe 'Assoziation' do
|
5
8
|
it 'gibt ein Array von Schülern zurück' do
|
6
|
-
|
9
|
+
@f.schueler.must_be_instance_of Array
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'Legacy-Methoden funktionieren' do
|
14
|
+
it 'kennt dqr_niveau' do
|
15
|
+
@f.dqr_niveau.must_equal "Alte Schild-Version ohne DQR-Niveau"
|
7
16
|
end
|
8
17
|
end
|
9
|
-
end
|
10
18
|
|
19
|
+
end
|
data/specs/schueler_spec.rb
CHANGED
@@ -12,6 +12,12 @@ describe Schueler do
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
describe 'Legacy-Methoden funktionieren' do
|
16
|
+
it 'kennt entlass_art' do
|
17
|
+
@sm.entlassart.must_equal @sm.entlass_art
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
15
21
|
describe 'Associations funktionieren Erwartungsgemäß' do
|
16
22
|
it 'geben Fachklassenbezeichnung zurück (eigeneschule_fachklassen:Fachklassen)' do
|
17
23
|
@sm.fachklasse.Bezeichnung.must_equal "Friseur"
|
@@ -116,8 +122,6 @@ describe Schueler do
|
|
116
122
|
@sm.vermerke.first.must_be_instance_of String
|
117
123
|
end
|
118
124
|
|
119
|
-
#schuelerabifaecher kann wegen mangelnder daten nicht getestet werden
|
120
|
-
|
121
125
|
# in der Testdatenbank sind leider keine Schülerfotos
|
122
126
|
it 'gibt das Schülerfoto als jpg zurück' do
|
123
127
|
skip
|
metadata
CHANGED
@@ -1,113 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schild
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0b
|
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-
|
11
|
+
date: 2015-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
type: :development
|
15
14
|
name: bundler
|
16
|
-
prerelease: false
|
17
15
|
requirement: !ruby/object:Gem::Requirement
|
18
16
|
requirements:
|
19
17
|
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '1'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
type: :development
|
29
28
|
name: rake
|
30
|
-
prerelease: false
|
31
29
|
requirement: !ruby/object:Gem::Requirement
|
32
30
|
requirements:
|
33
31
|
- - "~>"
|
34
32
|
- !ruby/object:Gem::Version
|
35
33
|
version: '10'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
type: :development
|
43
42
|
name: minitest
|
44
|
-
prerelease: false
|
45
43
|
requirement: !ruby/object:Gem::Requirement
|
46
44
|
requirements:
|
47
45
|
- - "~>"
|
48
46
|
- !ruby/object:Gem::Version
|
49
47
|
version: '5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
type: :development
|
57
56
|
name: minitest-rg
|
58
|
-
prerelease: false
|
59
57
|
requirement: !ruby/object:Gem::Requirement
|
60
58
|
requirements:
|
61
59
|
- - "~>"
|
62
60
|
- !ruby/object:Gem::Version
|
63
61
|
version: '5'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '5'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
type: :development
|
71
70
|
name: mysql2
|
72
|
-
prerelease: false
|
73
71
|
requirement: !ruby/object:Gem::Requirement
|
74
72
|
requirements:
|
75
73
|
- - "~>"
|
76
74
|
- !ruby/object:Gem::Version
|
77
75
|
version: '0.4'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.4'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
|
85
|
-
name: sequel
|
86
|
-
prerelease: false
|
84
|
+
name: envyable
|
87
85
|
requirement: !ruby/object:Gem::Requirement
|
88
86
|
requirements:
|
89
87
|
- - "~>"
|
90
88
|
- !ruby/object:Gem::Version
|
91
|
-
version: '
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
|
99
|
-
name: envyable
|
100
|
-
prerelease: false
|
98
|
+
name: sequel
|
101
99
|
requirement: !ruby/object:Gem::Requirement
|
102
100
|
requirements:
|
103
101
|
- - "~>"
|
104
102
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
103
|
+
version: '4'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '4'
|
111
111
|
description: schild bietet eine Ruby-Schnittstelle zu SchilD-NRW-Datenbanken.
|
112
112
|
email:
|
113
113
|
- dev@hmt.im
|
@@ -132,6 +132,7 @@ files:
|
|
132
132
|
homepage: https://github.com/hmt/schild
|
133
133
|
licenses:
|
134
134
|
- Creative Commons Namensnennung 4.0 International Lizenz.
|
135
|
+
- MIT License
|
135
136
|
metadata: {}
|
136
137
|
post_install_message:
|
137
138
|
rdoc_options: []
|
@@ -144,12 +145,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
145
|
version: '2.0'
|
145
146
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
147
|
requirements:
|
147
|
-
- - "
|
148
|
+
- - ">"
|
148
149
|
- !ruby/object:Gem::Version
|
149
|
-
version:
|
150
|
+
version: 1.3.1
|
150
151
|
requirements: []
|
151
152
|
rubyforge_project:
|
152
|
-
rubygems_version: 2.4.
|
153
|
+
rubygems_version: 2.4.6
|
153
154
|
signing_key:
|
154
155
|
specification_version: 4
|
155
156
|
summary: Schild-API
|