# The Twitter4R API provides a nicer Ruby object API to work with # instead of coding around the REST API. # Module to encapsule the Twitter4R API. module Twitter # Mixin module for classes that need to have a constructor similar to # Rails' models, where a Hash is provided to set attributes # appropriately. # # To define a class that uses this mixin, use the following code: # class FilmActor # include ClassUtilMixin # end module ClassUtilMixin #:nodoc: def self.included(base) #:nodoc: base.send(:include, InstanceMethods) end # Instance methods defined for Twitter::ModelMixin module. module InstanceMethods #:nodoc: # Constructor/initializer that takes a hash of parameters that # will initialize *members* or instance attributes to the # values given. For example, # # class FilmActor # include Twitter::ClassUtilMixin # attr_accessor :name # end # # class Production # include Twitter::ClassUtilMixin # attr_accessor :title, :year, :actors # end # # # Favorite actress... # jodhi = FilmActor.new(:name => "Jodhi May") # jodhi.name # => "Jodhi May" # # # Favorite actor... # robert = FilmActor.new(:name => "Robert Lindsay") # robert.name # => "Robert Lindsay" # # # Jane is also an excellent pick...gotta love her accent! # jane = FilmActor.new(name => "Jane Horrocks") # jane.name # => "Jane Horrocks" # # # Witty BBC series... # mrs_pritchard = Production.new(:title => "The Amazing Mrs. Pritchard", # :year => 2005, # :actors => [jodhi, jane]) # mrs_pritchard.title # => "The Amazing Mrs. Pritchard" # mrs_pritchard.year # => 2005 # mrs_pritchard.actors # => [#, # ] # # Any Ros Pritchard's out there to save us from the Tony Blair # # and Gordon Brown *New Labour* debacle? You've got my vote! # # jericho = Production.new(:title => "Jericho", # :year => 2005, # :actors => [robert]) # jericho.title # => "Jericho" # jericho.year # => 2005 # jericho.actors # => [#] # # Assuming class FilmActor includes # Twitter::ClassUtilMixin in the class definition # and has an attribute of name, then that instance # attribute will be set to "Jodhi May" for the actress # object during object initialization (aka construction for # you Java heads). def initialize(params = {}) params.each do |key,val| self.send("#{key}=", val) if self.respond_to? key end self.send(:init) if self.respond_to? :init end protected # Helper method to provide an easy and terse way to require # a block is provided to a method. def require_block(block_given) raise ArgumentError, "Must provide a block" unless block_given end end end # ClassUtilMixin # Exception subclass raised when there is an error encountered upon # querying or posting to the remote Twitter REST API. # # To consume and query any RESTError raised by Twitter4R: # begin # # Do something with your instance of Twitter::Client. # # Maybe something like: # timeline = twitter.timeline_for(:public) # rescue RESTError => re # puts re.code, re.message, re.uri # end # Which on the code raising a RESTError will output something like: # 404 # Resource Not Found # /i_am_crap.json class RESTError < RuntimeError include ClassUtilMixin @@ATTRIBUTES = [:code, :message, :uri] attr_accessor :code, :message, :uri # Returns string in following format: # "HTTP #{@code}: #{@message} at #{@uri}" # For example, # "HTTP 404: Resource Not Found at /i_am_crap.json" def to_s "HTTP #{@code}: #{@message} at #{@uri}" end end # RESTError # Remote REST API interface representation # class RESTInterfaceSpec include ClassUtilMixin end # Remote REST API method representation # class RESTMethodSpec include ClassUtilMixin attr_accessor :uri, :method, :parameters end # Remote REST API method parameter representation # class RESTParameterSpec include ClassUtilMixin attr_accessor :name, :type, :required def required?; @required; end end end