schild 0.2.1 → 0.3.0

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: 58da522f7ac76065dd156ef7c3aabccc23cb4a62
4
- data.tar.gz: bf4060e1b51867c4babc64a0316f1819bc2dde9f
3
+ metadata.gz: b21d2022cd51b878dbbb820fd9c0460c1472a029
4
+ data.tar.gz: a2ad01fe7917be3b253839d10cb1bb0db21b400e
5
5
  SHA512:
6
- metadata.gz: ec9e4da2d51feea29560a77984ffaaa3553c6f3c925f23167b11ba609a8cb992d5f75cc52322988da1fe66b44c23899a0b58476226247dbb5a32f691c4e20e4b
7
- data.tar.gz: 3a4d06b7d4166c58d96e2861cca741e7fdbf0e99d0329c32972892d14a5de7e637ab2939da1162ec322787b8c8749cd0eaf9d4bb6c3eace8d7994668827a5683
6
+ metadata.gz: 40243e0fb126d4d64e012c7aff45513c1503a58f43205a7ea2a938f1f01d83d8e42e141d6505d61c6eeb010d12d65413df7788ed2f02dabc8a42f0d261af67ba
7
+ data.tar.gz: d6f8d4d87839fc40c768be0767ebfa8a2948e5ffde89d138e4dcf1d60138c2cacefa1a9940ce3cbb86a899ad1f6d24495724af71b0a7aea6364ab0e46d0f6cde
data/README.md CHANGED
@@ -4,6 +4,8 @@
4
4
 
5
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
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).
8
+
7
9
  Um `schild` nutzen zu können muss es zuerst installiert werden:
8
10
 
9
11
  ```sh
@@ -93,6 +95,22 @@ Alle zur Verfügung stehenden Hilfsmethoden werden in den API-Docs erläutert.
93
95
 
94
96
  Ziel von `schild` ist es, möglichst viele Daten aus der Datenbank komfortabel zur Verfügung zu stellen.
95
97
 
98
+ ## Erweiterte Funktionalität
99
+ Der Formulardesigner in Schild ignoriert fehlende Felder. Das kann `schild` auch. Anstelle der in der Datenbank verwendenten Tabellenspalten, die mit Großbuchstaben geschrieben werden, bietet `schild` die Möglichkeit Kleinbuchstaben zu verwenden:
100
+
101
+ ```ruby
102
+ s = Schueler.first
103
+ => #<Schild::Schueler @values={:ID=>1, ........}>
104
+
105
+ s.Bemerkungen
106
+ => nil
107
+
108
+ s.bemerkungen
109
+ => ""
110
+ ```
111
+
112
+ 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.
113
+
96
114
  ## Das sollte beachtet werden
97
115
  `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.
98
116
 
@@ -1,3 +1,3 @@
1
1
  module Schild
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/schild.rb CHANGED
@@ -1,9 +1,48 @@
1
- require "schild/version"
1
+ require 'schild/version'
2
2
  require 'sequel'
3
3
 
4
+ # String und Symbol werden um snake_case ergänzt, das die Schild-Tabellen umbenennt
5
+ module CoreExtensions
6
+ module String
7
+ def snake_case
8
+ return downcase if match(/\A[A-Z]+\z/)
9
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
10
+ gsub(/([a-z])([A-Z])/, '\1_\2').
11
+ downcase
12
+ end
13
+ end
14
+
15
+ module Symbol
16
+ def snake_case
17
+ to_s.snake_case
18
+ end
19
+ end
20
+ end
21
+
22
+ # Schild hat teilweise nil in DB-Feldern. SchildTypeSaver gibt entweder einen
23
+ # "Fehlt"-String zurück oder bei strftime das 1899 Datum zurück.
24
+ module SchildTypeSaver
25
+ Symbol.include CoreExtensions::Symbol
26
+ String.include CoreExtensions::String
27
+
28
+ # bei include wird für jede Spalte in der Schild-Tabelle eine Ersatzmethode
29
+ # erstellt, die bei nil ein Null-Objekt erstellt.
30
+ def self.included(klass)
31
+ klass.columns.each do |column|
32
+ name = column.snake_case
33
+ define_method(name) { public_send(column) || Null.new("")}
34
+ end
35
+ end
36
+
37
+ class Null < String
38
+ def strftime(args)
39
+ Time.new("1899").strftime(args)
40
+ end
41
+ end
42
+ end
43
+
4
44
  # Das Schild Modul, das alle Klassen für die Datenbankanbindung bereitstellt
5
45
  module Schild
6
-
7
46
  # ist die Datenbank-Verbindung. Alle Daten können über diese Konstante abgerufen werden
8
47
  DB = Sequel.connect(:adapter=>ENV['S_ADAPTER'], :host=>ENV['S_HOST'], :user=>ENV['S_USER'], :password=>ENV['S_PASSWORD'], :database=>ENV['S_DB'])
9
48
 
@@ -14,6 +53,8 @@ module Schild
14
53
 
15
54
  # Stellt die Schüler-Tabelle samt Assoziationen bereit.
16
55
  class Schueler < Sequel::Model(:schueler)
56
+ include SchildTypeSaver
57
+
17
58
  many_to_one :fachklasse, :class => :Fachklasse, :key => :Fachklasse_ID
18
59
  one_to_many :abschnitte, :class => :Abschnitt
19
60
 
@@ -60,16 +101,22 @@ module Schild
60
101
 
61
102
  # Dient als Assoziation für Schüler und deren Klassenbezeichnung etc.
62
103
  class Fachklasse < Sequel::Model(:eigeneschule_fachklassen)
104
+ include SchildTypeSaver
105
+
63
106
  one_to_one :schueler
64
107
  end
65
108
 
66
109
  # Assoziation für Lehrer, hauptsächlich für Klassenlehrer
67
110
  class Klassenlehrer < Sequel::Model(:k_lehrer)
111
+ include SchildTypeSaver
112
+
68
113
  one_to_one :abschnitt, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
69
114
  end
70
115
 
71
116
  # Ist die Assoziation, die Halbjahre, sog. Abschnitte zurückgibt.
72
117
  class Abschnitt < Sequel::Model(:schuelerlernabschnittsdaten)
118
+ include SchildTypeSaver
119
+
73
120
  many_to_one :schueler, :class => :Schueler, :key => :Schueler_ID
74
121
  one_to_many :noten, :class => :Noten
75
122
  many_to_one :klassenlehrer, :class => :Klassenlehrer, :primary_key=>:Kuerzel, :key=>:KlassenLehrer
@@ -137,6 +184,8 @@ module Schild
137
184
 
138
185
  # Assoziation für Noten
139
186
  class Noten < Sequel::Model(:schuelerleistungsdaten)
187
+ include SchildTypeSaver
188
+
140
189
  many_to_one :abschnitt, :class => :Abschnitt, :key => :Abschnitt_ID
141
190
  many_to_one :fach, :class => :Faecher, :key => :Fach_ID
142
191
 
@@ -175,11 +224,15 @@ module Schild
175
224
 
176
225
  # Assoziation für Fächer
177
226
  class Faecher < Sequel::Model(:eigeneschule_faecher)
227
+ include SchildTypeSaver
228
+
178
229
  one_to_one :noten
179
230
  end
180
231
 
181
232
  # Schul-Tabelle mit vereinfachtem Zugriff auf Datenfelder.
182
233
  class Schule < Sequel::Model(:eigeneschule)
234
+ include SchildTypeSaver
235
+
183
236
  # gibt die Schulnummer zurück
184
237
  def self.schulnummer
185
238
  self.first.SchulNr
@@ -0,0 +1,31 @@
1
+ require "#{File.dirname(__FILE__)}/spec_helper"
2
+
3
+ describe Schueler do
4
+ describe 'typen sicherheit von objekten' do
5
+ before do
6
+ # lade einen Standardschueler
7
+ @sm = Schueler.where(:Status => 2, :Geloescht => "-", :Gesperrt => "-").first
8
+ end
9
+
10
+ it 'gibt nil zurück, wenn leer' do
11
+ @sm.Bemerkungen.must_equal nil
12
+ end
13
+
14
+ it 'gibt leeren String zurück, wenn leer und typensicher' do
15
+ @sm.bemerkungen.must_equal ""
16
+ end
17
+
18
+ it 'gibt Fehler zurück, wenn Methode nicht existiert' do
19
+ proc {@sm.bemerrrrrrrrrkungen}.must_raise NoMethodError
20
+ end
21
+
22
+ it 'gibt 1899 als Datum zurück, wenn strftime aufgerufen wird' do
23
+ @sm.geburtsdatum.strftime("%Y").must_equal "1899"
24
+ end
25
+
26
+ it 'gibt nil zurück, wenn Geburtsdatum leer ist' do
27
+ @sm.Geburtsdatum.must_equal nil
28
+ end
29
+ end
30
+ end
31
+
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.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HMT
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-11 00:00:00.000000000 Z
11
+ date: 2015-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -127,6 +127,7 @@ files:
127
127
  - specs/schueler_spec.rb
128
128
  - specs/schule_spec.rb
129
129
  - specs/spec_helper.rb
130
+ - specs/type_safe_spec.rb
130
131
  homepage: https://github.com/hmt/schild
131
132
  licenses:
132
133
  - Creative Commons Namensnennung 4.0 International Lizenz.