lib/stale_fish.rb in jsmestad-stale_fish-1.1.1 vs lib/stale_fish.rb in jsmestad-stale_fish-1.1.2

- old
+ new

@@ -1,97 +1,95 @@ require 'singleton' require 'ftools' require 'yaml' require 'rubygems' require 'activesupport' # only used for time helpers -require 'rio' +require 'resourceful' begin require "fakeweb" rescue LoadError end module StaleFish # no one likes stale fish. + class FixtureUpdateFailure < StandardError; end + class MalformedSourceURL < StandardError; end + class << self attr_accessor :use_fakeweb attr_accessor :config_path attr_accessor :yaml attr_accessor :configuration + attr_accessor :http end self.use_fakeweb = false + self.http = Resourceful::HttpAccessor.new def self.valid_path? - return false if config_path.nil? - File.exist?(config_path) + !config_path.nil? ? File.exist?(config_path) : false end def self.update_stale(*args) # check each file for update - load_yaml #if self.yaml.nil? + load_yaml if self.yaml.nil? stale = flag_stale(args) process(stale) write_yaml return stale.size end def self.register_uri(source_uri, response) - if use_fakeweb && !FakeWeb.registered_uri?(source_uri) - FakeWeb.register_uri(:any, source_uri, :body => response) - end + FakeWeb.register_uri(:any, source_uri, :body => response) if use_fakeweb && !FakeWeb.registered_uri?(source_uri) end def self.load_yaml - if valid_path? - self.yaml = YAML.load_file(config_path) - raise YAML::Error, 'missing stale root element' unless self.yaml['stale'] + raise Errno::ENOENT, 'invalid path, please set StaleFish.config_path than ensure StaleFish.valid_path? is true' unless valid_path? - # Grab Configuration from YAML - configuration = self.yaml['stale'].delete('configuration') - use_fakeweb = (@configuration['use_fakeweb'] || false) unless configuration.nil? + self.yaml = YAML.load_file(config_path) + raise YAML::Error, 'missing stale root element' unless self.yaml['stale'] - # Process remaining nodes as items - self.yaml['stale'].each do |key, value| - %w{ filepath frequency source }.each do |field| - raise YAML::Error, "missing #{field} node for #{key}" unless self.yaml['stale'][key][field] - end - end - else - raise Errno::ENOENT, 'invalid path, please set StaleFish.config_path than ensure StaleFish.valid_path? is true' + # Grab Configuration from YAML + self.configuration = self.yaml['stale'].delete('configuration') + use_fakeweb = (configuration['use_fakeweb'] || false) unless configuration.nil? + + # Process remaining nodes as items + self.yaml['stale'].each do |key, value| + %w{ filepath frequency source }.each { |field| raise YAML::Error, "missing #{field} node for #{key}" unless value[field] } end end protected def self.flag_stale(args) force = args.pop[:force] if args.last.is_a?(Hash) stale, scope = {}, self.yaml['stale'] scope.each do |key, value| if args.empty? - if scope[key]['updated'].blank? - stale.merge!({key => scope[key]}) + if value['updated'].blank? + stale.merge!({key => value}) else - last_modified = scope[key]['updated'] - update_on = DateTime.now + eval(scope[key]['frequency']) + last_modified = value['updated'] + update_on = DateTime.now + eval(value['frequency']) if last_modified > update_on - stale.merge!({key => scope[key]}) + stale.merge!({key => value}) else - register_uri(scope[key]['source'], scope[key]['filepath']) + register_uri(value['source'], value['filepath']) end end else - last_modified = scope[key]['updated'] - update_on = DateTime.now + eval(scope[key]['frequency']) + last_modified = value['updated'] + update_on = DateTime.now + eval(value['frequency']) if force == true - stale.merge!({key => scope[key]}) if args.include?(key) + stale.merge!({key => value}) if args.include?(key) else - if args.include?(key) && (scope[key]['updated'].blank? || last_modified > update_on) - stale.merge!({key => scope[key]}) + if args.include?(key) && (value['updated'].blank? || last_modified > update_on) + stale.merge!({key => value}) else - register_uri(scope[key]['source'], scope[key]['filepath']) + register_uri(value['source'], value['filepath']) end end end end return stale @@ -99,12 +97,20 @@ def self.process(fixtures) FakeWeb.allow_net_connect = true if use_fakeweb fixtures.each do |key, value| - rio(fixtures[key]['source']) > rio(fixtures[key]['filepath']) - register_uri(fixtures[key]['source'], fixtures[key]['filepath']) - update_fixture(key) + begin + @response = http.resource(value['source']).get + File.open(value['filepath'], 'w') { |f| f.write @response.body.to_s } + + update_fixture(key) + rescue Resourceful::UnsuccessfulHttpRequestError + raise FixtureUpdateFailure, "#{key}'s source: #{value['source']} returned unsuccessfully." + rescue ArgumentError + raise MalformedSourceURL, "#{key}'s source: #{value['source']} is not a valid URL path. Most likely it's missing a trailing slash." + end + register_uri(value['source'], value['filepath']) end FakeWeb.allow_net_connect = false if use_fakeweb end