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

- old
+ new

@@ -1,5 +1,150 @@ -require "kth_omniauth/version" +require 'rack' +require 'singleton' +require 'logger' -module KthOmniauth - # Your code goes here... +module OmniAuth + class Error < StandardError; end + + module Strategies + autoload :Developer, 'kth_omniauth/strategies/developer' + end + + autoload :Builder, 'kth_omniauth/builder' + autoload :Strategy, 'kth_omniauth/strategy' + autoload :Test, 'kth_omniauth/test' + autoload :Form, 'kth_omniauth/form' + autoload :AuthHash, 'kth_omniauth/auth_hash' + autoload :FailureEndpoint, 'kth_omniauth/failure_endpoint' + + def self.strategies + @@strategies ||= [] + end + + class Configuration + include Singleton + + def self.default_logger + logger = Logger.new(STDOUT) + logger.progname = "omniauth" + logger + end + + @@defaults = { + :camelizations => {}, + :path_prefix => '/auth', + :on_failure => OmniAuth::FailureEndpoint, + :form_css => Form::DEFAULT_CSS, + :test_mode => false, + :logger => default_logger, + :allowed_request_methods => [:get, :post], + :mock_auth => { + :default => AuthHash.new( + 'provider' => 'default', + 'uid' => '1234', + 'info' => { + 'name' => 'Bob Example' + } + ) + } + } + + def self.defaults + @@defaults + end + + def initialize + @@defaults.each_pair{|k,v| self.send("#{k}=",v)} + end + + def on_failure(&block) + if block_given? + @on_failure = block + else + @on_failure + end + end + + def add_mock(provider, mock={}) + # Stringify keys recursively one level. + mock.keys.each do |key| + mock[key.to_s] = mock.delete(key) + end + mock.each_pair do |key, val| + if val.is_a? Hash + val.keys.each do |subkey| + val[subkey.to_s] = val.delete(subkey) + end + end + end + + # Merge with the default mock and ensure provider is correct. + mock = self.mock_auth[:default].dup.merge(mock) + mock["provider"] = provider.to_s + + # Add it to the mocks. + self.mock_auth[provider.to_sym] = mock + end + + # This is a convenience method to be used by strategy authors + # so that they can add special cases to the camelization utility + # method that allows OmniAuth::Builder to work. + # + # @param name [String] The underscored name, e.g. `oauth` + # @param camelized [String] The properly camelized name, e.g. 'OAuth' + def add_camelization(name, camelized) + self.camelizations[name.to_s] = camelized.to_s + end + + attr_writer :on_failure + attr_accessor :path_prefix, :allowed_request_methods, :form_css, :test_mode, :mock_auth, :full_host, :camelizations, :logger + end + + def self.config + Configuration.instance + end + + def self.configure + yield config + end + + def self.logger + config.logger + end + + def self.mock_auth_for(provider) + config.mock_auth[provider.to_sym] || config.mock_auth[:default] + end + + module Utils + module_function + + def form_css + "<style type='text/css'>#{OmniAuth.config.form_css}</style>" + end + + def deep_merge(hash, other_hash) + target = hash.dup + + other_hash.keys.each do |key| + if other_hash[key].is_a? ::Hash and hash[key].is_a? ::Hash + target[key] = deep_merge(target[key],other_hash[key]) + next + end + + target[key] = other_hash[key] + end + + target + end + + def camelize(word, first_letter_in_uppercase = true) + return OmniAuth.config.camelizations[word.to_s] if OmniAuth.config.camelizations[word.to_s] + + if first_letter_in_uppercase + word.to_s.gsub(/\/(.?)/) { "::" + $1.upcase }.gsub(/(^|_)(.)/) { $2.upcase } + else + word.first + camelize(word)[1..-1] + end + end + end end