lib/active_scraper.rb in active_scraper-0.0.1 vs lib/active_scraper.rb in active_scraper-0.0.2

- old
+ new

@@ -1,5 +1,86 @@ +# encoding: UTF-8 + require "active_scraper/engine" -require "active_scraper/fetcher" +require 'active_scraper/fake_http_party_response' +require 'active_scraper/response_object' module ActiveScraper + + + # returns a ActiveScraper::CachedResponse + def self.get(uri, options={}) + o = create_request_and_fetch_response(uri, options) + + return o.response + end + + + + # delegates to CachedRequest::find_or_build_from_uri + # req (URI or String). If CachedRequest, is idempotent + # + # returns a new or existing CachedRequest + def self.find_or_build_request(req, opts={}) + CachedRequest.find_or_build_from_uri(req, opts) + end + + ## cached_request (CachedRequest) => the request to find a response for + ## + ## returns a new or existing CachedResponse + + def self.find_or_build_response(cached_request, opts={}) + raise ArgumentError, "Only accepted CachedRequest, but was passed in a #{cached_request.class}" unless cached_request.is_a?(CachedRequest) + opts = normalize_hash(opts) + + response = CachedResponse.find_cache_for_cached_request(cached_request, opts) + + if response.blank? + fetched_obj = fetch_fresh(cached_request.uri, opts) + response = CachedResponse.build_from_response_object(fetched_obj) + end + + return response + end + + + def self.create_request_and_fetch_response(uri, opts={}) + opts = normalize_hash(opts) + # first, find or build the request + request = find_or_build_request(uri, opts) + # then find or build a matching response + response = find_or_build_response(request, opts) + # associate and save the two + request.responses << response + request.save + + obj = Hashie::Mash.new(request: request, response: response) + + return obj + end + + # Returns an object compatible with HTTParty, i.e. an ActiveScraper::FakeHTTPartyResponse + # to be deprecated + def self.build_usable_response(request, response) + ActiveScraper::FakeHTTPartyResponse.new(request, response) + end + + + + def self.fetch_fresh(url, opts={}) + resp = HTTParty.get(url, opts) + + return ActiveScraper::ResponseObject.factory(resp) + end + + + + + def self.normalize_hash(hsh) + unless hsh.is_a?(HashWithIndifferentAccess) + hsh = HashWithIndifferentAccess.new(hsh) + end + + return hsh + end + end