[#154598] implementing the "each" method for own classes — Philipp Huber <huber.philipp@...>

hello!

12 messages 2005/09/01

[#154620] Word Chains (#44) — Ruby Quiz <james@...>

Gavin Kistner asked that I try timing the quiz solutions this week. I did

13 messages 2005/09/01

[#154733] Ruby-specific performance heuristics? — Hugh Sasse <hgs@...>

I've been doing some stuff with CSV recently, having data in one

15 messages 2005/09/02

[#154775] Idiomatic conversion of yielding block to array — David Brady <ruby_talk@...>

So I have a function that generates like 300 lines of text and I want to

23 messages 2005/09/02
[#154776] Re: Idiomatic conversion of yielding block to array — Levin Alexander <levin.alexander@...> 2005/09/02

David Brady <ruby_talk@shinybit.com> wrote:

[#154779] Re: Idiomatic conversion of yielding block to array — Simon Krer <SimonKroeger@...> 2005/09/02

Levin Alexander wrote:

[#154785] Re: Idiomatic conversion of yielding block to array — Simon Krer <SimonKroeger@...> 2005/09/02

Simon Krer wrote:

[#154789] Re: Idiomatic conversion of yielding block to array — Jacob Fugal <lukfugl@...> 2005/09/02

Good heavens, no! Neither of those are thread safe. Criminy!

[#154872] windows shell — Gaston Garcia <gaston.garcia@...>

Is there anyone here that uses Windows XP and uses a windows shell

28 messages 2005/09/04
[#154876] Re: windows shell — "Robert Klemme" <bob.news@...> 2005/09/04

Gaston Garcia <gaston.garcia@gmail.com> wrote:

[#154917] Re: windows shell — Austin Ziegler <halostatue@...> 2005/09/05

On 9/4/05, Robert Klemme <bob.news@gmx.net> wrote:

[#154874] params v.s. @params in rails? — "Barry" <rubyrails@...>

Both work in my controller class, so I am wondering what's the

11 messages 2005/09/04

[#154920] Help me clean up this method — "Vincent Foley" <vfoley@...>

Hello guys,

32 messages 2005/09/05

[#155018] Rake 0.6.0 Released — Jim Weirich <jim@...>

= Rake 0.6.0 Released

20 messages 2005/09/06

[#155064] Sorted arrays — <ruby@...64.com>

I'm a relative newcomer to Ruby. Most of my experience is in Delphi. And in Delphi one of the most commonly-used classes is TStringList, which is sort of analogous to ruby's Array (Delphi also has dynamic arrays and static arrays). TStringList has a property called Sorted, which if set to True makes it possible to insert strings into the list and have it maintain them as a sorted list (without having to re-sort it each time). Then you can use the IndexOf method (or the Find method) to do a binary search on the list, so you can quickly find the element you're looking for. My question is whether Ruby has anything like this. It seems like one could create a descendant of Array that does this.

18 messages 2005/09/06
[#155067] Re: Sorted arrays — "Robert Klemme" <bob.news@...> 2005/09/06

ruby@danb64.com wrote:

[#155120] Units for Ruby — "Lucas Carlson" <lucas@...>

I have also created a new library to add units to numbers in Ruby:

14 messages 2005/09/06

[#155127] Rio 0.3.4 — "rio4ruby" <rio4ruby@...>

New and Improved -- Rio 0.3.4

24 messages 2005/09/07

[#155181] Need help finding decent IDE/development environment for Windows — "Paul Dix" <paulcdix@...>

I've just started playing around with ruby on rails and by association,

41 messages 2005/09/07
[#155218] Re: Need help finding decent IDE/development environment for Windows — graham <fghfghfh@...> 2005/09/07

Paul Dix wrote:

[#155220] Re: Need help finding decent IDE/development environment for Windows — Joe Van Dyk <joevandyk@...> 2005/09/07

On 9/7/05, graham <fghfghfh@homr.vom> wrote:

[#155221] Re: Need help finding decent IDE/development environment for Windows — graham <fghfghfh@...> 2005/09/07

> You could ask them why they need all that IDE stuff for developing in Ruby.

[#155225] Re: Need help finding decent IDE/development environment for Windows — Edward Faulkner <ef@...> 2005/09/07

On Thu, Sep 08, 2005 at 02:36:29AM +0900, graham wrote:

[#155264] Re: Need help finding decent IDE/development environment for Windows — graham <fghfghfh@...> 2005/09/07

Edward Faulkner wrote:

[#155280] Re: Need help finding decent IDE/development environment for Windows — James Edward Gray II <james@...> 2005/09/08

On Sep 7, 2005, at 6:56 PM, graham wrote:

[#155327] general performance question — Brian Le Roy <brian@...>

I'm running top and when I run my app - I see the user CPU utilitization

15 messages 2005/09/08

[#155364] KirbyBase — rubyhacker@...

I'm posting from work, but will try to follow up in more

57 messages 2005/09/08
[#155795] Re: KirbyBase — rubyhacker@... 2005/09/12

Jamey Cribbs wrote:

[#155801] Re: KirbyBase — Jamey Cribbs <cribbsj@...> 2005/09/12

rubyhacker@gmail.com wrote:

[#155818] Re: KirbyBase — Randy Kramer <rhkramer@...> 2005/09/12

On Monday 12 September 2005 04:11 pm, Jamey Cribbs wrote:

[#155833] Re: KirbyBase — rubyhacker@... 2005/09/12

Randy Kramer wrote:

[#155836] Re: KirbyBase — Kevin Brown <blargity@...> 2005/09/12

On Monday 12 September 2005 17:06, rubyhacker@gmail.com wrote:

[#155861] Re: KirbyBase — Hal Fulton <hal9000@...> 2005/09/13

Kevin Brown wrote:

[#155873] Re: KirbyBase — Ezra Zygmuntowicz <ezra@...> 2005/09/13

[#155976] Re: KirbyBase — rubyhacker@... 2005/09/13

[#155986] Re: KirbyBase — Jamey Cribbs <cribbsj@...> 2005/09/13

rubyhacker@gmail.com wrote:

[#156005] Re: KirbyBase — Logan Capaldo <logancapaldo@...> 2005/09/13

[#156029] Re: KirbyBase [ANN (sort-of)] proof-of-concept KirbyBase ORM — Logan Capaldo <logancapaldo@...> 2005/09/14

[#155369] compiling ruby on red hat linux — "Philip J. Mikal" <philip_mikal@...>

Hi,

15 messages 2005/09/08

[#155411] Optimizing a single slow method — "Glenn M. Lewis" <noSpam@...>

Hi!

34 messages 2005/09/09
[#155474] Re: Optimizing a single slow method — Eric Hodel <drbrain@...7.net> 2005/09/09

On 08 Sep 2005, at 20:46, Glenn M. Lewis wrote:

[#155464] quick print type debugging — Eric Mahurin <eric_mahurin@...>

Anybody think something like this would be useful?

12 messages 2005/09/09

[#155507] Using Ruby as a preprocessor for another language — debbie@...

I have the misfortune of being stuck programming in a very bad

11 messages 2005/09/10

[#155530] Win32 gem for RMagick 1.9.1 — Timothy Hunter <cyclists@...>

Hot on the heels of the latest RMagick update, Kaspar Schiess has

15 messages 2005/09/10

[#155537] RCR to modify #puts and #print inside ERB — Gavin Kistner <gavin@...>

Proposed RCR:

26 messages 2005/09/10

[#155601] r4 - the simplest ruby pre-processor — "Ara.T.Howard" <Ara.T.Howard@...>

18 messages 2005/09/11

[#155638] The Early Demise of Myriad (Thanks To Ruby Threads) — "Zed A. Shaw" <zedshaw@...>

Hi Everyone,

17 messages 2005/09/11

[#155708] how to well-qualify the 2-inherited methods at their collision point — "SHIGETOMI, Takuhiko" <tshiget1@...>

dear guys,

10 messages 2005/09/12

[#155828] Adventures in html decoding. — Morgan <taria@...>

From the "If you want it done right, do it yourself... maybe"

16 messages 2005/09/12

[#155847] Choosing an open source license — "debbie@..." <debbie@...>

I'm working on a server program and I'm trying to decide which open

22 messages 2005/09/13

[#155941] yet another simple command-line option parser — Eric Mahurin <eric_mahurin@...>

I just put in a good example for:

11 messages 2005/09/13
[#155946] Re: yet another simple command-line option parser — Jim Freeze <jim@...> 2005/09/13

That's pretty interesting Eric, to grab the type off the default.

[#155949] Sets, uniqueness not unique. — Hugh Sasse <hgs@...>

I have been splitting a comma separated values file, and putting

29 messages 2005/09/13

[#155970] Surprising Regexp Behavior — James Edward Gray II <james@...>

I keep running into some surprising points with Ruby's Regexp engine

13 messages 2005/09/13

[#155992] Launch directory in Rake — Jim Freeze <jim@...>

Hi

15 messages 2005/09/13

[#156053] ruby and aop — Alexandru Popescu <the.mindstorm.mailinglist@...>

Hi!

12 messages 2005/09/14

[#156189] Get to the Point: Ruby and Rails Presentation Slides — "John W. Long" <ng@...>

Hi,

20 messages 2005/09/15

[#156230] you can't get in trouble with your boss for picking C# — "Phlip" <phlipcpp@...>

Rubies:

69 messages 2005/09/15
[#156549] Re: you can't get in trouble with your boss for picking C# — "ToRA" <tristan.allwood@...> 2005/09/17

Hey all,

[#156582] Re: you can't get in trouble with your boss for picking C# — Florian Gro<florgro@...> 2005/09/18

ToRA wrote:

[#156297] Re: you can't get in trouble with your boss for picking C# — "Phlip" <phlipcpp@...> 2005/09/15

klancaster1957 wrote:

[#156308] Re: you can't get in trouble with your boss for picking C# — Josh Charles <josh.charles@...> 2005/09/15

On 9/15/05, Phlip <phlipcpp@yahoo.com> wrote:

[#156248] Math: sum and faculty — Daniel Schierbeck <daniel.schierbeck@...>

I hereby propose two additions to Ruby. Please come with some comments

13 messages 2005/09/15

[#156299] MS Access — "Steve" <sdouglas949@...>

I'm considering learning Ruby. I have no programming experience yet. I was

23 messages 2005/09/15
[#156303] Re: MS Access — "Phlip" <phlipcpp@...> 2005/09/15

Steve wrote:

[#156335] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/15

On 9/15/05, Phlip <phlipcpp@yahoo.com> wrote:

[#156336] Re: MS Access — Sascha Ebach <se@...> 2005/09/15

Sean Armstrong wrote:

[#156347] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/15

Does anyone know how to install the Ruby MySQL module on a Windows platform.

[#156352] Re: MS Access — Jacob Quinn Shenker <jqshenker@...> 2005/09/15

Sean,I needed to compile/install mysql (running ./configure--without-server) from source to get the required developmentlibraries under Cygwin. (then I moved the newly-created clientbinaries out of the way so I could use the Win32-native mysqlbinaries.) After that, it worked like a charm. *Do not compile theCygwin-ized mysql client with "--with-openssl"* I don't know why, butthe gem refused to install if I did. Good luck, and let me know if yourun into any issues. Overall, developing on Cygwin for Ruby/Rails isquite nice.

[#156353] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/15

Let me make sure I got this right:

[#156461] Re: MS Access — Sean Armstrong <phinsxiii@...> 2005/09/16

It still refuses to find the lib and include directories even if I use the

[#156506] Re: MS Access — Jacob Quinn Shenker <jqshenker@...> 2005/09/16

Sean,I'm going to try to explain *exactly* what I did, and hopefully you'llsee something you forgot to do.1. Download mysql-essential-4.1.14-win32.msi from mysql.org and install it.2. Download mysql-4.1.13.tar.gz from mysql.org3. Extract the above, and run "./configure -C --without-server" (the-C enables config caching, I use it because the ./configure scriptruns very slowly under Cygwin. Optional, of course)4. Run "make && make install"5. Run "gem install mysql"6. Go make cool rails apps!

[#156444] Hash table questions — EdUarDo <eduardo.yanezNOSPAM@...>

Hi all,

14 messages 2005/09/16

[#156480] Some interesting criticisms of rails — David Balick <davidbalick@...>

may be found in the podcast

24 messages 2005/09/16
[#156530] Re: Some interesting criticisms of rails — "Robert Klemme" <bob.news@...> 2005/09/17

Zed A. Shaw <zedshaw@zedshaw.com> wrote:

[#156624] Language recommendations from ruby persons.... — "Greg Lorriman" <bogus@...>

Dear sirs and madames,

36 messages 2005/09/18

[#156662] Capcha in ruby — Federico <pix@...>

Hello,

23 messages 2005/09/19

[#156708] help with tricky proc/binding issue — "Ara.T.Howard" <Ara.T.Howard@...>

14 messages 2005/09/19

[#156743] The Ruby troll [was: Looking for...] — Gunnar Hjalmarsson <noreply@...>

David H. Adler wrote:

22 messages 2005/09/19

[#156749] ruby idiom for python's for/else while/else — Gergely Kontra <kgergely@...>

Hi!

18 messages 2005/09/19

[#156796] Dissident 0.1, a Ruby dependency injection container — Christian Neukirchen <chneukirchen@...>

Hello,

13 messages 2005/09/20
[#156797] Re: [ANN] Dissident 0.1, a Ruby dependency injection container — "Jason Voegele" <jason@...> 2005/09/20

On Tue, September 20, 2005 8:22 am, Christian Neukirchen said:

[#156801] Re: [ANN] Dissident 0.1, a Ruby dependency injection container — Christian Neukirchen <chneukirchen@...> 2005/09/20

"Jason Voegele" <jason@jvoegele.com> writes:

[#156966] Re: [ANN] Dissident 0.1, a Ruby dependency injection container — Logan Capaldo <logancapaldo@...> 2005/09/21

This is a little OT, but every-time dependency injection comes up I

[#156866] Places for a programmer to live? — Devin Mullins <twifkak@...>

While we seem to be rife with OT threads, I thought I'd throw in an OT

37 messages 2005/09/20

[#156933] Hello, I am a newbie to ruby. — could ildg <could.net@...>

I want learn a script language.

11 messages 2005/09/21

[#157005] Large Ruby Apps ? — "Warren Seltzer" <warrens@...>

I am coming to Ruby having used the usual list of scripting and C* languages. Since Ruby

30 messages 2005/09/21
[#158399] Re: Large Ruby Apps ? — <slonik.az@...> 2005/09/30

Very useful discussion that highlights quite few misconceptions.

[#157007] Re: Large Ruby Apps ? — "Berger, Daniel" <Daniel.Berger@...>

> -----Original Message-----

27 messages 2005/09/21

[#157051] hi, i'm new. plus one question — travis laduke <wrong@...>

I've been forced to work on some php lately and found myself

13 messages 2005/09/22

[#157063] Visual IDEs?? — "Erland" <Erland.Erikson@...>

HI,

24 messages 2005/09/22

[#157080] A question about Intelligent Systems and using Ruby — Daniel Lewis <danieljohnlewis@...>

Yesterday (21/09/2005) I sent an email to Dave Thomas (author of

16 messages 2005/09/22

[#157101] Instantiating a subclass of NilClass. — "Trans" <transfire@...>

I've subclasses NilClass, but don't know how to instantiate it. Any

16 messages 2005/09/22

[#157189] "The class that it is mixed in to..." — John Carter <john.carter@...>

Ok, so I'm documenting a Mixin.

20 messages 2005/09/23
[#157193] Re: "The class that it is mixed in to..." — William Morgan <wmorgan-ruby-talk@...> 2005/09/23

Excerpts from John Carter's mail of 22 Sep 2005 (CDT):

[#157271] Re: "The class that it is mixed in to..." — "David A. Black" <dblack@...> 2005/09/23

Hi --

[#157222] RDE 1.0.0 released — sakazuki <qzs01353@...>

Hi.

16 messages 2005/09/23

[#157299] On accidental unsubscribe messages — "Berger, Daniel" <Daniel.Berger@...>

Hi all,

15 messages 2005/09/23

[#157520] Relative speed of Ruby vs Java for a large compiled app like Freenet — seekingleverage@...

I'm wondering if anyone could shed some light on whether or not it

45 messages 2005/09/25
[#157716] Re: Relative speed of Ruby vs Java for a large compiled app like Freenet — "Isaac Gouy" <igouy@...> 2005/09/26

Martin, perhaps you could collect this stuff and put it into your wiki

[#157540] String#ggsub — Gavin Kistner <gavin@...>

I occasionally find myself with gsub regexp that either eat too much,

21 messages 2005/09/25

[#157565] Rinda frustration — Mark Volkmann <r.mark.volkmann@...>

I'm trying to determine what the methods "move" and "notify" do in the

12 messages 2005/09/26

[#157623] A big thank you to Robby Russell... — Tom Copeland <tom@...>

...for providing another RubyForge mirror via his company, PlanetArgon.

18 messages 2005/09/26
[#157770] Re: A big thank you to Robby Russell... — Gavin Kistner <gavin@...> 2005/09/27

On Sep 26, 2005, at 7:25 AM, Tom Copeland wrote:

[#157826] Re: A big thank you to Robby Russell... — Tom Copeland <tom@...> 2005/09/27

On Tue, 2005-09-27 at 12:43 +0900, Gavin Kistner wrote:

[#157864] Re: A big thank you to Robby Russell... — Sam Mayes <codeslave@...> 2005/09/27

whats the process for becomming a mirror?

[#157871] Re: A big thank you to Robby Russell... — Kirk Haines <khaines@...> 2005/09/27

On Tuesday 27 September 2005 10:24 am, Sam Mayes wrote:

[#157875] Re: A big thank you to Robby Russell... — Tom Copeland <tom@...> 2005/09/27

On Wed, 2005-09-28 at 01:38 +0900, Kirk Haines wrote:

[#157648] Rapid GUI Development with QtRuby — Dave Thomas <dave@...>

I hope y'all don't mind a short announcement, but it seemed relevant.

22 messages 2005/09/26

[#157654] Ruby Threads 101 — Ben <benbelly@...>

I am leading a peer-learning group that is using "Programming Ruby" to

13 messages 2005/09/26

[#157658] Time interval — Daniel Berger <Daniel.Berger@...>

Hi all,

20 messages 2005/09/26

[#157697] Embedded Ruby and Tag Libs — Adam Van Den Hoven <mail@...>

Hey guys,

16 messages 2005/09/26

[#157732] ShortURL 0.7.0 — "Vincent Foley" <vfoley@...>

After a lot of procrastination, I have released ShortURL 0.7.0. I

14 messages 2005/09/26

[#157746] Fwd: Lisp macros — Joe Van Dyk <joevandyk@...>

Whoops, this belongs on ruby-talk... Sorry.

47 messages 2005/09/27
[#157751] Re: Fwd: Lisp macros — James Britt <james_b@...> 2005/09/27

Joe Van Dyk wrote:

[#157779] Re: Fwd: Lisp macros — Jim Freeze <jim@...> 2005/09/27

On 9/26/05, James Britt <james_b@neurogami.com> wrote:

[#157813] Re: Fwd: Lisp macros — Ben <benbelly@...> 2005/09/27

On 9/27/05, Jim Freeze <jim@freeze.org> wrote:

[#157807] How do I (really) encrypt a string in ruby? — Michal Suchanek <hramrach@...>

Hello

10 messages 2005/09/27

[#157854] Class and Iterator Design Question — Jim Freeze <jim@...>

This may be a silly design question, but I always balk at

26 messages 2005/09/27
[#157866] Re: Class and Iterator Design Question — Bob Hutchison <hutch@...> 2005/09/27

[#157889] Re: Class and Iterator Design Question — Jim Freeze <jim@...> 2005/09/27

Wow, thanks for all the responses.

[#157893] Re: Class and Iterator Design Question — "David A. Black" <dblack@...> 2005/09/27

Hi --

[#157896] Re: Class and Iterator Design Question — Jim Freeze <jim@...> 2005/09/27

On 9/27/05, David A. Black <dblack@wobblini.net> wrote:

[#157947] Dynamically generating classes? — Jonas Galvez <jonasgalvez@...>

Hi,

15 messages 2005/09/27

[#158051] Re: creating independent lambdas in loops — "Kroeger Simon (ext)" <simon.kroeger.ext@...>

24 messages 2005/09/28
[#158057] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- "Kroeger Simon (ext)" <simon.kroeger.ext@siemens.com>

[#158074] Re: creating independent lambdas in loops — Gavin Kistner <gavin@...> 2005/09/28

On Sep 28, 2005, at 7:47 AM, Eric Mahurin wrote:

[#158081] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- Gavin Kistner <gavin@refinery.com> wrote:

[#158093] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- Eric Mahurin <eric_mahurin@yahoo.com> wrote:

[#158094] Re: creating independent lambdas in loops — "David A. Black" <dblack@...> 2005/09/28

Hi --

[#158096] Re: creating independent lambdas in loops — Eric Mahurin <eric_mahurin@...> 2005/09/28

--- "David A. Black" <dblack@wobblini.net> wrote:

[#158121] Python to Ruby: Two puzzlements... — "Elf M. Sternberg" <elf@...>

I'm afraid that I'm coming from Python, a B&D language where I'm used to

22 messages 2005/09/28

[#158157] IBM vs. Microsoft vs. ... Ruby? — "itsme213" <itsme213@...>

More "Enterprise Scale" talk over here, with a strong leaning towards

29 messages 2005/09/28
[#158330] Re: IBM vs. Microsoft vs. ... Ruby? — "bonefry" <bellarchitects@...> 2005/09/29

Hi,

[#158258] In your opinion.... — Daniel Lewis <danieljohnlewis@...>

In your opinion(s)....

51 messages 2005/09/29
[#158263] Re: In your opinion.... — Gennady Bystritksy <gfb@...> 2005/09/29

Daniel Lewis wrote:

[#158265] Re: In your opinion.... — Daniel Lewis <danieljohnlewis@...> 2005/09/29

> Too lazy to do your own research? It happens ;-). For a starter, check

[#158311] rush 0.1.bandicoot: object-oriented shell goodness (rationed for your health)! — The rush folks <rush-ruby-ml@...>

= rush-0.1.bandicoot

10 messages 2005/09/29

[#158327] Operator Overloading << — "matt.hulse@..." <matt.hulse@...>

Is there a way to overload '<<' in the Array class?

19 messages 2005/09/29

[#158460] Ruby licence... — netspam@...

I understand that the distribution of Ruby is under the GPL.

25 messages 2005/09/30
[#158600] Re: Ruby licence... — "Gregory Brown" <gregory.t.brown@...> 2005/10/02

The Ruby License and the License of Ruby are two different things.

[#158620] Re: Ruby licence... — Kevin Brown <blargity@...> 2005/10/02

On Saturday 01 October 2005 20:51, Gregory Brown wrote:

[#158659] Re: Ruby licence... — Christian Neukirchen <chneukirchen@...> 2005/10/02

Kevin Brown <blargity@gmail.com> writes:

[#158663] Re: Ruby licence... — Kevin Brown <blargity@...> 2005/10/02

On Sunday 02 October 2005 10:56, Christian Neukirchen wrote:

[#158690] Re: Ruby licence... — Christian Neukirchen <chneukirchen@...> 2005/10/02

Kevin Brown <blargity@gmail.com> writes:

[#158692] Re: Ruby licence... — Kevin Brown <blargity@...> 2005/10/02

On Sunday 02 October 2005 12:45, Christian Neukirchen wrote:

[#158497] Interest in Boost::Ruby — Alan Gutierrez <alan-ruby-talk@...>

I'd like to build a CSS renderer in modern C++ as an enthusist's

24 messages 2005/09/30

[ANN] KirbyRecord 0.0.0

From: Logan Capaldo <logancapaldo@...>
Date: 2005-09-15 22:52:18 UTC
List: ruby-talk #156350
I am proud(?) to announce the first actual release of KirbyRecord.  
KirbyRecord is an ORM layer for the very cool pure ruby database,  
KirbyBase. KirbyRecord was initialized inspired in design by  
ActiveRecord, but as you can see I've stolen ideas from Og as well now.
Here are its features:

1) Like KirbyBase, its written in pure ruby, and fits in a single file.
2) You can let it be run by the database, or you can define the  
database with it
3) I wrote lots of comments that look ok after running rdoc

Lets do some examples, I don't think this whole writting a feature  
list will work

class Author < KirbyRecord::Base
             has_many :books
end

Just like ActiveRecord you say? Well you'd be wrong, for behold!

a  = Author.find(:first) { |r| r.name == "Stephen King" }
b = Book.new( :title => "The Shining" ) # pretending I wrote the  
boilerplate for Book
a.books << b # Egads! What madness is this?

Incidently as you may have noticed it now does plurals, sort of  
(tacks an s on the end) and you don;t have to use those silly get_  
and set_ prefixes like in the proof-of-concept


Maybe you don't want to make the database before hand with calls to  
KirbyBase#create_table and such. Well have no fear, KirbyRecord now  
knows how to make a database from your class definitions. Its a  
little more typing than with the KirbyBase interface, but you can  
almost pretend that you now have magical objects that persist from  
session to session, and all you had to do was write column instead of  
attr_accessor

class Author < KirbyRecord::Base
       column :name, :String
       col_belongs_to :publisher
       has_many :books
end

class Publisher < KirbyRecord::Base
     column :name, :String
     has_many :books
end

class Book < KirbyRecord::Base
     column :title, :String
     column :author_id, :Integer
     belongs_to :author   # just to demonstrate the utility of  
col_belongs_to
     column :isbn, :Integer, 0 # Look ma, defaults! I could have also  
done default :isbn => 0 to set
                                                # a default for a  
field that wasn't  declared with column or didn't have
                                                # a default yet
end

This column stuff is cool but one warning, KirbyRecord always gets  
its methods from the db, if theres already a table with the name of  
your class it doesn't even look at the columns you declared (except  
for the default values). On the other hand if the table doesn't  
exist, KirbyRecord will create it for you after you use an object for  
the first time.

There are more examples of all this stuff in the comments (which you  
can run rdoc on in the file). I hope someone finds a use for this  
stuff, and gets back with feedback.

Attachments (1)

kirbyrecord.rb (10.8 KB, text/x-ruby-script)
# This code was written by Logan Capaldo. It is licensed under the same license as ruby

require 'kirbybase'

module KirbyRecord
	# KirbyRecord::Base is the most used (perhaps only) class in KirbyRecord
	# It acts as an abstraction for the rows in a KirbyBase database table
	# eg:
	# 	class Author < KirbyRecord::Base
	# 	end
	# 	KirbyRecord::Base.open_database( )
	# 	authors = Author.find(:all) 
	class Base
		# The following are utility methods for the actual KirbyBase database

		# Get a new instance of KirbyBase
		# It accepts the same arguments as KirbyBase::new
		# 	KirbyRecord::Base.open_database( )
		# or perhaps 	
		#	KirbyRecord::Base.open_database(:local, nil, nil, './data')
		def self.open_database( *kirby_base_new_args )
			@@db = KirbyBase.new( *kirby_base_new_args )
		end

		# Retrieve the KirbyBase instance being used by KirbyRecord
		def self.get_database( )
			@@db
		end

		# The following methods are involved with "reflection" on the database

		# Add appropiate accessors for database fields
		# You rarely will need to call this directly (I assume), but if for instance, the schema of a table changes
		# during the run of a program you can call this method with an argument of true to update your Class 
		def self.inform_about_table( force = false )
			
			
			unless force
				return self if fields( )
			end
			
			db = get_database( )
			unless db.table_exists?(table_name.to_sym)
				create_table_for_cols
			end

			@fields =  {}
			table = db.get_table(table_name.to_sym)

			table.field_names.zip( table.field_types ) do |fname, ftype|
				@fields[fname] = ftype
			end

			# The next step is to define the getters and setters
			f = @fields.dup
			f.delete(:recno)
			f.each do |fname, ftype|
				getter_name = fname.to_sym
				setter_name = "#{fname}=".to_sym
				
				define_method(getter_name) do | | 
					@state[getter_name]
				end

				define_method(setter_name) do |value|
					cast_value = 
						case ftype 
							when :Integer
								value.to_i
							when :String
								value.to_s
							when :Float
								value.to_f
							when :Boolean
								if value then true else false end
							when :Date
								value
							when :DateTime
								value
						end
					@state[getter_name] = cast_value

				end
				
			end
			
		end
		
		# Returns a hash containing the names and types of columns for the table associated with this child of KirbyRecord::Base
		def self.fields( ) 
			@fields
		end

		# adds methods automatically for a table kind (use the plurarl, which is to say, tack an 's' on the end) when many of them references table self
		# 	example:
		#	class Book < KirbyRecord::Base
		#	end
		#
		# 	class Author < KirbyRecord::Base
		#   		has_many :books
		# 	end
		def self.has_many(kind)
			table_name = Util.singularize( kind.to_s ).to_sym
			class_name = Util.us_case_to_class_case( table_name.to_s )
			col = Util.col_name_for_class(self.to_s)	
			define_method(kind.to_sym) do
				klass = Object.const_get(class_name)
				HasManyResultSet.new(self, klass.find(:all) { |r| r.send(col) == self.instance_eval { @state[:recno] } })
			end
		end

		# adds methods automatically for a table kind when one of them references self's table
		# if has_many is analogous to Table.find(:all), than has_one is analogous to Table.find(:first) 
		def self.has_one(kind)
			table_name = kind.to_sym
			class_name = Util.us_case_to_class_case( table_name.to_s ) 
			col = Util.col_name_for_class(self.to_s)
			define_method(kind.to_sym) do
				klass = Object.const_get(class_name)
				klass.find(:first) { |r| r.send(col) == self.instance_eval { @state[:recno] } }
			end
		end

		# adds methods automatically for a table table_name when self's table references it
		# 	example:
		# 	db.create_table(:bio, :age, :Integer, :home, :String)
		# 	db.create_table(:author, :name, :String, :bio_id, :Integer)
		#	class Bio < KirbyRecord::Base
		#	end
		# 	class Author < KirbyRecord::Base
		#   		belongs_to :bio
		# 	end
		def self.belongs_to(kind)
			class_name = Util.us_case_to_class_case(  kind.to_sym )
			define_method(kind) do
				klass = Object.const_get(class_name.to_s)
				klass.find(@state["#{kind}_id".to_sym])
			end

			define_method("#{kind}=".to_sym) do |other|
				@state[("#{kind}_id".to_sym)] = (other.save.instance_eval { @state[:recno] })
				save
			end
				
		end

		# The previous methods  decribend relations in the database. The following methods allow one to automatically create database 
		# with ruby classes and objects. Just think of the class being the table, and the instance being the row
		
		# Creates a column in the table with the associated name, and KirbyBase type (:String, :Boolean, etc.)
		# You may optionally provide a default value to be inserted for this column
		#	example:
		#	class Student < KirbyRecord::Base
		#		column :name, :String
		#		column :age, :Integer
		#		column :major, :String, "Computer Science"
		#		column :student_id_num, :Integer
		#	end
		def self.column(name, type, default_value = nil)
			@columns ||= []
			@columns << [ name, type ]
			if default_value
				default(name => default_value)
			end
			self
		end

		# Set a default value to insert for a column in the absence of a value
		# Only works for KirbyBase primitive types, using KirbyRecord::Base children could have confusing semantics
		# 	class Author < KirbyRecord::Base
		#		default :publisher => 'Pragmatic Press'
		#	end
		def self.default(args)
			@defaults ||= {}
			@defaults = @defaults.merge( args )
		end
		
		# get the default values for columns for this class
		# 	class FirstGrader < KirbyRecord::Base
		#		default :age => 7
		#	end
		#	
		#	FirstGrader.defaults #=> { :age => 7 }
		def self.defaults
			@defaults ||= {}
		end
		# Combine column and belongs_to
		#
		#	col_belongs_to :book
		# is equivalent to: 
		#	column :book_id, :Integer
		#	belongs_to :book
		def self.col_belongs_to(name)
			column(Util.col_name_for_class(Util.us_case_to_class_case(name)).to_sym, :Integer)
			belongs_to(name)
		end

		# The following methods are meant to be used by classes inheriting from KirbyRecord::Base

		# Finds rows in self's table and maps them to instances of self.
		# You may pass in one record number, in which case it returns that specific row, multiple record numbers in which case it returns an array of those rows.
		# You can also call .find with one of :all or :first and an associated block. The block is used with a KirbyBase select statement so you can search by
		# any criteria.
		# .find(:all) returns an array of results and .find(:first) returns the first result
		#	example:
		#	authors = Author.find(:all) { |r| r.name =~ "Stephen" }
		#	stephen_king = Author.find(:first) { |r| r.name == "Stephen King" }
		#	john_dow = Author.find(3)
		def self.find(*args) # :yields: record
			inform_about_table
			
			if args.length == 1
				if (args[0].respond_to?(:to_sym))
					case args[0]
					when :first
						if block_given?
							(self.find(:all) { |r| yield(r) }).first
						else
							self.find(:all).first
						end
					when :all
						if block_given?
							get_table.select { |r| yield(r) }
						else
							get_table.select
						end.map do |struct|
							obj = self.new
							keys = fields.keys
							keys.each do |key|
								obj.instance_eval { @state[key] = struct.send(key) }
							end
							obj
						end
					end
				else
					self.find(:first) { |r| r.recno == args[0] }
				end
			else
				self.find(:all) { |r| args.include?(r.recno) }
			end
		end

		# Returns the name of the table associated with this class
		# Overriding this currently will wreak havoc, so for now please leave it alone
		# Eventually it will do the right thing
		def self.table_name
			Util.class_case_to_us_case(self.to_s.split(/::/).last)
		end
		
		# Get a reference to the classes table object
		def self.get_table
			get_database.get_table(table_name.to_sym)
		end
		
		# geta  reference to the classes table object
		def get_table
			self.class.get_table
		end
		
		# calls pack on the table
		def self.pack
			inform_about_table
			get_table.pack
		end
		
		# Creates a new instance of the object, optionally taking a hash speficing values ie
		# 	mike = Author.new
		#	stephen = Author.new( :name => "Stephen King" )
		def initialize(vals = {})
			self.class.inform_about_table
			@state = self.class.defaults( ).merge( vals )
			self
		end

		# Inserts or updates to the database
		def save
			table = get_table
			if @state[:recno].nil?
				@state[:recno] = table.insert(self.class.defaults.merge(@state))
			else
				vals = @state.dup
				vals.delete(:recno)
				table[@state[:recno]] = vals
			end
			self
		end

		# returns true if the record has not been inserted into the db
		def new_record?
			@state[:recno].nil?
		end
		
		# removes the record from the database
		def delete 
			table = get_table
			table.delete { |r| r.recno == @state[:recno] }
			@state[:recno] = nil
		end
		
		# protected singleton class methods
		class << self
			def create_table_for_cols
				db = get_database( )
				if @columns.length > 0 
					db.create_table(table_name, *( @columns.flatten ) )
				else
					raise RuntimeError, "Did you forget to create your database?"
				end
				self	
			end
			protected :create_table_for_cols
		end

	end
	
	# This is what you get back if  you call a method generated by has_many, it supports all the methods of Enumerable
	# It also has methods #<< and #append which are equivalent
	#	example:
	#	class Book < KirbyRecord::Base
	#		belongs_to :author	
	#	end
	#	class Author < KirbyRecord::Base
	#		has_many :books
	#	end
	#	author = Author.find(:first) { |r| r.name == "Joe" }
	#	author.books << Book.new( :title => "Happy Days Are Here, Again" )
	#	
	# << and append both perform an implicit save on the argument
	class HasManyResultSet
		include Enumerable
		
		def initialize(owner = nil, results = [])
			@owner = owner
			@results = []
		end
		
		def each()
			results.each { |item| yield(item) }
		end

		def <<(other)
			field_name = (@owner.class.table_name.to_s + "_id").to_sym
			other.send("#{field_name}=".to_sym, @owner.instance_eval { @state[:recno] })
			other.save
		end

		def append(other)
			self << other
		end
	end
	
	# Contains some helper functions
	module Util
		# converts from things like user_name to things like UserName
		def self.us_case_to_class_case(name)
			name.to_s.split(/_/).map do |word|
				word.capitalize
			end.join
		end

		# converts from things like UserName to things like user_name
		def self.class_case_to_us_case(name)
			decapitalized = name.to_s.sub(/^./) { |match| match.downcase }
			decapitalized.gsub(/[A-Z]/) { |match| "_" + match.downcase }
		end

		# Adds an s
		def self.pluralize(name)
			name.to_s + 's'
		end

		# chops an s
		def self.singularize(name)
			if md = name.to_s.match(/^(.+?)s\z/)
				md[1]
			else
				raise RuntimeError, "#{name} is not plural"
			end
		end

		def self.col_name_for_class(name)
			class_case_to_us_case(name) + "_id"
		end

		def self.class_name_for_col(name)
			us_case_to_class_case(name.sub(/_id\z/, ''))
		end
		
	end
end

In This Thread

Prev Next