lib/beatport/item.rb in beatport-0.2.0 vs lib/beatport/item.rb in beatport-0.2.1

- old
+ new

@@ -1,23 +1,23 @@ module Beatport - + class Item < OpenStruct class << self def associations @associations ||= {} end - + def has_one(var, klass) lazy_accessor(var) self.associations[var] = {:list => false, :klass => klass} end - + def has_many(var, klass) lazy_accessor(var) self.associations[var] = {:list => true, :klass => klass} end - + def lazy_accessor(var) return if respond_to?(var) class_eval "def #{var}; @#{var}; end" end @@ -37,63 +37,63 @@ else raise "find_by_name returned multiple results" end end end - + def initialize(data = {}) raise ArgumentError, "Invalid data passed to Item.new: #{data.inspect}" unless data.is_a?(Hash) - + # OpenStruct doesn't like id or type, so we store them after the call to super id = data.delete('id') type = data.delete('type') - + self.class.associations.each do |k, v| associate(data, k, v[:list], v[:klass]) end - + super(data) data.each do |k, v| @table[k.to_sym] = Date.parse(v) if k =~ /_date$/ @table[k.to_sym] = Regexp.new(v.to_s) if k =~ /_regex$/ end - + @table['id'] = id if id @table['type'] = type if type end def id @table['id'] end - + def type @table['type'] end - + # Allow treating the item as a hash def [](key) send(key) if respond_to?(key) end - + def associate(data, var, collection = false, klass = Item) a = data.delete(var.to_s) - + return unless a - + if collection && a.is_a?(Array) a = a.compact.map { |g| klass.new(g) } elsif !collection && a.is_a?(Hash) a = klass.new(a) elsif a == [] # || !a # In some cases, when there's no data returned for an association it'll be an empty array instead of a hash a = nil else raise ArgumentError, "Invalid data for association: '#{var}' = #{a.inspect}" end - + instance_variable_set(:"@#{var}", a) end - - + + end -end \ No newline at end of file +end