Smart spreadsheet reading with Ruby

28 01 2013

Ein schönes Beispiel zur Anwendung von Roo: https://gist.github.com/radaniba/4166025





Roo – Beispiele

10 12 2008

Ich habe mal ein bißchen recherchiert, wer und wo roo verwendet wird (als Autor ist man da natürlich schon etwas neugierig).

Zum einen scheint es öfters generell in Rails-Anwendungen verwendet zu werden. Diesen Eindruck habe ich gewonnen anhand der Fragen und Feature-Requests in der roo-Group.

Ein kurzes Tutorial unter http://rubyonwindows.blogspot.com/2008/01/parsing-spreadsheets-with-roo-gem.html.

Ein Beispielprogramm zum Benutzen von Google-Spreadsheets von iamarf unter http://iamarf.wordpress.com/2008/11/19/cck08-a-little-learning-experience/.

Bei koders.com (http://www.koders.com/ruby/fidD47DEFAE86EEF70EE26921E8F46C0A52138EFDFC.aspx?s=proxy) ein paar Beispielprogramme, aber das sind auch nur die Beispielsprogramme innerhalb meines Gems.

Ein italienisches Beispielprogramm: http://www.ruby-forum.com/topic/170477

Oh, roo wird hier sogar aufgeführt als eine der coolsten Tools, die in der letzten Zeit für Rails erschienen sind (roo ist zwar nicht ausschließlich für Rails gedacht, kann aber auch da natürlich benutzt werden):

http://www.ozmox.com/?p=33

Und dann, was ich überhaupt nicht mitbekommen habe, in einem Rails-Podcast aus Amerika wird roo auch kurz erwähnt (http://www.railsenvy.com/2007/12/19/rails-envy-podcast-episode-11)





Warum wir Unit-Tests für Ruby-Programmme schreiben sollten

29 12 2007

Ein schönes Beispiel, wie nützlich Tests für Ruby (und auch für andere Sprachen) Programme sein können, habe ich vorgestern erlebt.

Ich habe ein Gem erstellt, welche Spreadsheet-Dateien verarbeiten kann (http://roo.rubyforge.org).

In einer Newsgroup fragte nun jemand, mit welchem Tool man am besten Excel-Dateien in CSV-Dateien umwandeln kann. Ich habe darauf geanwortet, daß das mit ‚roo‘ gehen würde. Kurz darauf kam die Antwort, daß das nicht funktionieren würde, und daß die Methode ‚to_csv‘ welche in meinem Programm eine CSV-Ausgabe entweder nach stdout oder in eine Datei schreibt, nur für Openoffice- und Google-Spreadsheets, nicht jedoch für Excel-Spreadsheets funktionieren würde.

Ich war ziemlich verblüfft, weil ich sicher war, daß ich dies auf für Excel-Dateien schon implementiert hatte und daß dies auch schon funktioniert hätte.

Ich habe das dann bei mir überprüft – und tatsächlich, bei Excel-Dateien funktionierte es nicht.

Was war passiert? Wie konnte das passieren, wo ich doch speziell für dieses Gem eigentlich alle Funktionen mit Testfällen abgedeckt hatte?

Ich muß einschieben, daß ich generell ein großer Freund von Test Driven Development bin und ich auch für dieses Programm danach vorgegangen bin, was eine große Hilfe bei allen Erweiterungen ist, weil man einfach die vorhandenen Testfälle immer wieder ablaufen lassen kann, um zu testen, ob alles noch wie gewünscht funktioniert.

Die Lösung des Problems war dann relativ simpel: Ich hatte beim ersten Entwurf meines Programms als erstes die Klasse ‚Openoffice‘ (Spreadsheets) geschrieben und später die Klasse ‚Excel‘ welche eine Kind-Klasse von Openoffice war, und deshalb auch deren Methode ‚to_csv‘ für die Ausgabe als CSV-Datei geerbt hatte. So weit, so gut.

Im Lauf der späteren Entwicklung des Programms habe ich entschieden, daß dieses Design für den Benutzer zwar funktioniert hat, im Sinn der reinen OO-Lehre aber nicht ganz korrekt war, weil ein Excel-Objekt natürlich kein Kind-Objekt einer Openoffice-Klasse ist.

Ich habe dann eine generische Klasse ‚GenericSpreadsheet‘ eingeführt, von der sowohl die Openoffice- als auch die Excel-Klasse (und später auch noch die Google-Klasse) erben.

Im OO-Sinn war dieses Design nun wesentlich besser, aber die Methode ‚to_csv‘ war nun nur in der Openoffice-Klasse und nicht in der Excel-Klasse vorhanden. Ich hatte es in Kommentaren zwar schon zum Auslagern in die allgemeine Spreadsheet-Klasse markiert, dies aber noch nicht wirklich getan.

So – die Excel-Klasse war nun ihrer ‚to_csv‘ Methode beraubt, da sie nicht mehr von Openoffice erbt.

Warum haben das die Tests nicht aufgedeckt?

Es gab zwar auch für Excel-Objekt Tests, die die CSV-Ausgabe abgedeckt haben, allerdings habe ich dieses Test nur im Rahmen von Tests für ziemlich große Spreadsheet-Dateien mit mehreren tausend Zeilen verwendet. Da diese Tests aber im Vergleich zu kleineren Spreadsheet-Testdateien relativ lange dauerten, habe ich die lange laufenden Test mit einem speziellen Schalter wahlweise abschaltbar gemacht. Dies führte dazu, daß mir dieser spezielle Fehler durch die Lappen gegangen ist, weil ich diese lang laufenden Test nicht mehr ausgeführt hatte.

Die Lösung wäre natürlich gewesen (und habe ich jetzt auch als Testfälle eingebaut), die CSV-Ausgabe nicht nur im Rahmen von großen Spreadsheets zu testen, sondern generell und auch mit kleineren Test-Spreadsheets.





roo – Version 0.8.0 fertig

16 12 2007

Es ist vollbracht. Heute habe ich die Version 0.8.0 von Roo veröffentlicht. Die größte Neuerung daran ist, daß man mit roo nun auch auf Google Online Spreadsheets lesend und sogar schreibend zugreifen kann.

Desweiteren wurde die innere Strukur der Klassen etwas bereinigt, was für den Anwender jedoch keine Auswirkungen hat – mir hingegen war es wichtig, eine etwas bessere Struktur reinzubringen, was sich auch für die Zukunft bezahlt macht, wenn noch weitere Spreadsheet-Typen aufgenommen werden sollten.

Hiermit kann man jetzt von Ruby Programmen aus die eigenen Spreadsheets bei Google abrufen oder ändern. Außerdem kann man sogar fremde Spreadsheets von anderen Personen bearbeiten – soweit man dafür vom jeweiligen Eigentümer entsprechend authorisiert wurde.





roo – Version 0.8.0 (bald fertig)

9 12 2007

An diesem Wochenende, wenn im Büro sonst niemand anwesend war, habe ich mich hingesetzt und den größten Teil der Version 0.8.0 von roo geschrieben, mit der nun auch Google-Spreadsheets möglich sind.

Im großen und ganzen sieht es gut aus – kleinere Ungereimtheiten müssen noch getestet und korrigiert werden.

Aber es ist schon cool, wenn man von der irb aus auf seine entfernten Spreadsheets auf dem Google-Server zugreifen kann.





roo – Google Spreadsheets in Kürze auch möglich

8 12 2007

Lange aufgeschoben – habe ich mich in den letzten Tagen aufgemacht, jetzt auch den Zugriff auf Google-Spreadsheets von meinem gem „roo“ zu ermöglichen.

Google-Spreadsheets sind wirklich eine coole Sache, zum einen, daß Spreadsheets von jedem Rechner aus aufzurufen sind und zum anderen kann man sich tolle Anwendungen ausdenken, bei denen Daten aus eigenen oder fremden Spreadsheets im Netz gelesen und sogar geschrieben werden können.

Habt noch etwas Geduld – in den nächsten Tagen wird roo auch Google-Spreadsheets bearbeiten können.





roo – Release 0.7.0 veröffentlicht

26 11 2007

Ich habe wieder etwas an roo weiter entwickelt und nach ausführlichen Tests die Version 0.7.0 veröffentlicht.

Die wesentliche Neuerung ist, daß alle Methoden, die bisher mit dem zuvor gesetzten Default-Sheet arbeiten, nun auch mit einem optionalen sheet-Parameter aufgerufen werden können, um ein sheet anzusprechen, das nicht das aktuelle Default-Sheet ist. Dies ist ganz praktisch, wenn man zusätzlich auf Werte eines anderen Sheets zugreifen möchte.

Desweiteren wurden folgenden kleinere Erweiterungen vorgenommen:

  • Excel: CSV-Export optimiert. Dies wirkt sich insbesondere bei etwas größeren Spreadsheets auf die Geschwindigkeit (positiv) aus.
  • column-Methode, um eine gesamte Spalte eines Spreadsheets anzusprechen
  • info-Methode – Liefert allgemeine Informationen über das Spreadsheet als Text zurück
  • find-Methode – eine GANZ SIMPLE Möglichkeit, mit Bedingungen a la Active-Record zu arbeiten. Wie diese anzuwenden ist: Siehe die mitgelieferten Testfälle.