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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 985daa649779c23a1ce26eb12afc3c80f6c5307d
4
- data.tar.gz: 425dd7ec9f81953c115de2f3b9f3f2d5633bca54
3
+ metadata.gz: 2878f6313d32ac0d7102d5a1edb25fb9589c30be
4
+ data.tar.gz: 78ae6702626dd3493ca58e1190fbb593cc03e6d2
5
5
  SHA512:
6
- metadata.gz: cf56c050c36c715ad8b3835039b11c4f30f5bb712c183be54f34d1edf74026fa883ccbb22c46b0fc8ffb5accb93c787c6782fa6912b32c41544517f668ee91bb
7
- data.tar.gz: f2a09b463538e158c48197df3cd82c59c143d04ae9bef16a9ab6a0acc4cf5c74a992e9f13c1253bc5f559a58d8b6be99abb31492519fb252d0bd7fcc9a7138ad
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 eigenen Skripte schreiben und komfortabel auf die Datenbank zugreifen. Lediglich ein paar Kenntnisse in der Programmiersprache Ruby werden erwartet. Mit Hilfe der [Prawn-Bibliothek](http://prawnpdf.org/) lassen sich sehr schöne und v.a. genau beschriebene PDF-Dokumente erstellen, die ganz ohne grafische Oberfläche auskommen und vollständig programmiert werden.
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 folgenden Befehl verwenden, der seit
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` soweit es geht, eine einheitliche Form zu verwenden.
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 ist wahrscheinlich möglich auch über JRuby andere Sprachen zu verwenden, die auf der JVM laufen. Also Java zum Beispiel. Gleiches gilt für Python. Leider nicht getestet.
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 Schild
213
- # Stellt die Schüler-Tabelle samt Assoziationen bereit.
214
- class Schueler < Schild::Schueler
215
- include SchildTypeSaver
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 < Schild::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 < Schild::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 < Schild::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 < Schild::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 < Schild::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
- class Sprachenfolge < Schild::Sprachenfolge
430
- include SchildTypeSaver
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 < Schild::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
-
@@ -1,3 +1,3 @@
1
1
  module Schild
2
- VERSION = "0.6.4"
2
+ VERSION = "0.7.0b"
3
3
  end
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.license = "Creative Commons Namensnennung 4.0 International Lizenz."
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
@@ -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
- Fachklasse.first.schueler.must_be_instance_of Array
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
@@ -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.6.4
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-09 00:00:00.000000000 Z
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
- type: :runtime
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: '4'
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: '4'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- type: :runtime
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: '0'
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: '0'
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: '0'
150
+ version: 1.3.1
150
151
  requirements: []
151
152
  rubyforge_project:
152
- rubygems_version: 2.4.8
153
+ rubygems_version: 2.4.6
153
154
  signing_key:
154
155
  specification_version: 4
155
156
  summary: Schild-API