data == code | lrug april 2008
DESCRIPTION
Morph and Pottery rubygem utilities for screen scrapers.TRANSCRIPT
![Page 1: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/1.jpg)
code == data
![Page 2: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/2.jpg)
data == code
![Page 3: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/3.jpg)
OpenStruct
Photo: Salt Fired http://www.flickr.com/photos/saltfired/201994906/
![Page 4: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/4.jpg)
require 'ostruct'
![Page 5: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/5.jpg)
o = OpenStruct.new
![Page 6: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/6.jpg)
o.name = 'el rug'
![Page 7: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/7.jpg)
o.name
![Page 8: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/8.jpg)
=> "el rug"
![Page 9: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/9.jpg)
o.inspect
![Page 10: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/10.jpg)
=> <OpenStruct name=\"el rug\">
![Page 11: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/11.jpg)
# not very classy
![Page 12: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/12.jpg)
o.class
![Page 13: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/13.jpg)
=> OpenStruct
![Page 14: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/14.jpg)
class Fund < OpenStruct
def your_logicend
end
![Page 15: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/15.jpg)
![Page 16: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/16.jpg)
public class Fundextends HashMap {
}
![Page 17: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/17.jpg)
public class Fundextends HashMap {
/* bad code smell */
}
![Page 18: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/18.jpg)
public class Fundextends HashMap<String,
Object> {
}
![Page 19: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/19.jpg)
public class Fundextends HashMap<String,
Object> {
/* this stinks! */
}
![Page 20: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/20.jpg)
![Page 21: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/21.jpg)
![Page 22: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/22.jpg)
Morph
Photo: Salt Firedhttp://www.flickr.com/photos/saltfired/201998836/
![Page 23: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/23.jpg)
gem install morph
![Page 24: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/24.jpg)
require 'morph'
![Page 25: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/25.jpg)
require 'hpricot'
require 'open-uri'
![Page 26: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/26.jpg)
![Page 27: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/27.jpg)
![Page 28: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/28.jpg)
![Page 29: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/29.jpg)
class Hubbit
include Morph
![Page 30: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/30.jpg)
def initialize name
doc = Hpricot open"http://github.com/#{name}"
![Page 31: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/31.jpg)
(doc/'label').collect do |l|
![Page 32: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/32.jpg)
label = l.inner_text
![Page 33: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/33.jpg)
value = l.next_sibling.inner_text.strip
![Page 34: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/34.jpg)
morph(label, value)
![Page 35: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/35.jpg)
class Hubbit
include Morph
def initialize name begin doc = Hpricot open("http://github.com/#{name}")
(doc/'label').collect do |node| label = node.inner_text value = node.next_sibling.inner_text.strip
morph(label, value)
end rescue raise "Couldn't find hubbit with name: #{name}" end endend
![Page 36: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/36.jpg)
Hubbit.morph_methods
![Page 37: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/37.jpg)
=> []
![Page 38: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/38.jpg)
why = Hubbit.new 'why'
![Page 39: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/39.jpg)
=> #<Hubbit @name="why the lucky
stiff", @email="why@why...">
![Page 40: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/40.jpg)
Hubbit.morph_methods
![Page 41: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/41.jpg)
=>["email", "email=","name", "name="]
![Page 42: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/42.jpg)
why.name
![Page 43: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/43.jpg)
=> "why the lucky stiff"
![Page 44: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/44.jpg)
why. 年龄 = 21
![Page 45: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/45.jpg)
why. 年龄
![Page 46: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/46.jpg)
=> 21
![Page 47: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/47.jpg)
why.company
![Page 48: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/48.jpg)
NoMethodError: undefined method
'company'
![Page 49: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/49.jpg)
# maybe should have
![Page 50: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/50.jpg)
why.company?
![Page 51: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/51.jpg)
# but that's not there yet
![Page 52: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/52.jpg)
![Page 53: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/53.jpg)
dhh = Hubbit.new 'dhh'
![Page 54: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/54.jpg)
Hubbit.morph_methods
![Page 55: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/55.jpg)
=> ["blog", "blog=", "company", "company=",
"email", "email=", "location", "location=",
"name", "name=","年龄 ", "年龄 ="]
![Page 56: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/56.jpg)
dhh.company
![Page 57: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/57.jpg)
=> "37signals"
![Page 58: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/58.jpg)
why.company
![Page 59: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/59.jpg)
=> nil
![Page 60: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/60.jpg)
implementation
![Page 61: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/61.jpg)
def method_missing sym, *argsis_writer = sym.to_s =~ /=$/
is_writer? morph_method_missing(sym, *args): super
end
![Page 62: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/62.jpg)
def morph_method_missing symbol, *args attribute = symbol.to_s.chomp '=' # ... if block_given? yield self.class, attribute else self.class.class_eval
"attr_accessor :#{attribute}" send(symbol, *args) end # ...end
![Page 63: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/63.jpg)
Soup
Photo: Chrissy Wainwrighthttp://www.flickr.com/photos/wainwright/380578681/
![Page 64: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/64.jpg)
gem install soup
![Page 65: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/65.jpg)
require 'soup'
![Page 66: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/66.jpg)
Soup.prepare
![Page 67: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/67.jpg)
s = Snip.new
![Page 68: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/68.jpg)
s.name = 'el rug'
![Page 69: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/69.jpg)
s.inspect
![Page 70: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/70.jpg)
=> "<Snip id:unset name:el rug>"
![Page 71: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/71.jpg)
s.save
![Page 72: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/72.jpg)
=> "<Snip id:1 name:el rug>"
![Page 73: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/73.jpg)
s = Snip['el rug']
![Page 74: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/74.jpg)
=> "<Snip id:1 name:el rug>"
![Page 75: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/75.jpg)
# has no class
![Page 76: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/76.jpg)
s.class
![Page 77: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/77.jpg)
=> nil
![Page 78: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/78.jpg)
BlankSlate
![Page 79: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/79.jpg)
class EmptyClass
instance_methods.each { |m| undef_method(m) unless m =~ /^(__|instance_eval|respond_to\?)/ }
end
class Snip < EmptyClass; end
![Page 80: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/80.jpg)
Pottery
Photo: zhaoshourenhttp://www.flickr.com/photos/ajanhelendam/2326369128/
![Page 81: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/81.jpg)
gem install pottery
![Page 82: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/82.jpg)
![Page 83: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/83.jpg)
![Page 84: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/84.jpg)
![Page 85: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/85.jpg)
def get_price_rows doc rows = rows_starting 'Bid(GBX)', doc
@bid_offer = rows.size > 0
![Page 86: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/86.jpg)
![Page 87: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/87.jpg)
![Page 88: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/88.jpg)
rows = rows_starting 'Nav(GBX)', doc unless @bid_offer
rows end
![Page 89: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/89.jpg)
def rows_starting label, doc
(doc/"table/tr/td/[text()='#{label}']/../../../tr")
end
![Page 90: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/90.jpg)
def each_entry doc
get_price_rows(doc).each do |row|
cells = (row/'td').collect(&:inner_text). collect(&:strip).delete_if(&:blank?)
cells.in_groups_of(2) do |entry| yield entry[0], entry[1] end
end
end
![Page 91: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/91.jpg)
doc = open_doc url
each_entry doc do |label, value| morph(label, value) end
time = Time.now.utc.to_s self.time = time.match(/\d\d:\d\d:\d\d/)[0] self.name = doc.at('.FundNameHeader').inner_text self.url = url self.date = Date.today.to_s self.id_name = "#{url}##{date}"
![Page 92: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/92.jpg)
require 'pottery'
![Page 93: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/93.jpg)
class Fund
include Pottery
![Page 94: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/94.jpg)
def initialize fund=nil if fund url = "http://funds.ft.com/funds/#{fund}" doc = open_doc url
each_entry doc do |label, value| morph(label, value) end
time = Time.now.utc.to_s self.time = time.match(/\d\d:\d\d:\d\d/)[0] self.name = doc.at('.FundNameHeader').inner_text self.url = url self.date = Date.today.to_s self.id_name = "#{url}##{date}" end end
def bid_price @bid_offer ? bid_gbx : nav_gbx end
def offer_price @bid_offer ? offer_gbx : '' end
private
def each_entry doc get_price_rows(doc).each do |row| cells = (row/'td').collect(&:inner_text).collect(&:strip).delete_if(&:blank?) cells.in_groups_of(2) do |entry| yield entry[0], entry[1] end end end
def get_price_rows doc rows = rows_starting 'Bid(GBX)', doc @bid_offer = rows.size > 0 rows = rows_starting 'Nav(GBX)', doc unless @bid_offer rows end
def rows_starting label, doc (doc/"table/tr/td/[text()='#{label}']/../../../tr") end
![Page 95: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/95.jpg)
end # of Fund
![Page 96: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/96.jpg)
![Page 97: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/97.jpg)
fund = Fund.new 'rufferllp/ruffer/RZBST'
![Page 98: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/98.jpg)
Fund.morph_methods
![Page 99: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/99.jpg)
["_52w_high", "_52w_high=", "_52w_low", "_52w_low=",
"change", "change=","date", "date=",
"gross_yield", "gross_yield=", "id_name", "id_name=",
"listed_yield", "listed_yield=", "name", "name=",
"nav_gbx", "nav_gbx=", "net_yield", "net_yield=",
"percentage_change", "percentage_change=", "time",
"time=", "url", "url="]
![Page 100: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/100.jpg)
fund.save
![Page 101: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/101.jpg)
Fund.restore 'rufferllp/ruffer/RZBST#2008-04-14'
![Page 102: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/102.jpg)
#<Fund:0x1857414 @percentage_change="+0.96",
@gross_yield="-", @id_name="rufferllp/ruffer/RZBST#2008-04-14", @net_yield="-", @bid_offer=false, @date="2008-04-14", @_52w_low="142.38", @listed_yield="-", @time="23:00:14",
@name="Ruffer CF Baker Steel Gold O Acc NAV", @nav_gbx="183.90",
@url="rufferllp/ruffer/RZBST", @change="+1.74", @_52w_high="209.88">
![Page 103: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/103.jpg)
![Page 104: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/104.jpg)
Future features?
![Page 105: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/105.jpg)
identifydata types
e.g. integer, date, string
![Page 106: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/106.jpg)
generate Rails generator line
e.g. script/generate model x:string
y:integer
![Page 107: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/107.jpg)
generate doodle definition!
![Page 108: data == code | LRUG April 2008](https://reader033.vdocuments.net/reader033/viewer/2022060107/554a0e24b4c90507558b4a0c/html5/thumbnails/108.jpg)
data == code
http://code.whytheluckystiff.net/hpricot
http://github.com/lazyatom/soup
http://github.com/robmckinnon/morph
http://github.com/robmckinnon/pottery