module Hoboken module AddOns class OmniAuth < ::Hoboken::Group attr_reader :provider def add_gem @provider = ask("Specify a provider (i.e. twitter, facebook. etc.): ").downcase provider_version = ask("Specify provider version: ") gem gem_name, version: provider_version end def setup_middleware insert_into_file("app.rb", after: /require "sinatra("|\/base")/) do "\nrequire \"#{gem_name}\"" end snippet = <<-CODE use OmniAuth::Builder do provider :#{provider}, ENV["#{provider.upcase}_KEY"], ENV["#{provider.upcase}_SECRET"] end CODE text = modular? ? indent(snippet, 4) : snippet insert_into_file("app.rb", after: /use Rack::Session::Cookie.+\n/) { text } end def add_routes routes = <<-CODE get "/login" do 'Login' end get "/auth/:provider/callback" do # TODO: Insert real authentication logic... MultiJson.encode(request.env['omniauth.auth']) end get "/auth/failure" do # TODO: Insert real error handling logic... halt 401, params[:message] end CODE if modular? insert_into_file("app.rb", after: /get.+?end$/m) { indent(routes, 4) } else append_file("app.rb", routes) end end def add_tests inject_into_class("test/unit/app_test.rb", "AppTest") do <<-CODE setup do OmniAuth.config.test_mode = true end test "GET /login" do get "/login" assert_equal('Login', last_response.body) end test "GET /auth/#{provider}/callback" do auth_hash = { "provider" => "#{provider}", "uid" => "123545", "info" => { "name" => "John Doe" } } OmniAuth.config.mock_auth[:#{provider}] = auth_hash get "/auth/fitbit/callback" assert_equal(MultiJson.encode(auth_hash), last_response.body) end test "GET /auth/failure" do OmniAuth.config.mock_auth[:#{provider}] = :invalid_credentials get "/auth/failure" assert_response :not_authorized end CODE end end def reminders say "\nGemfile updated... don't forget to 'bundle install'" end private def gem_name "omniauth-#{provider}" end def modular? @modular ||= File.readlines("app.rb").grep(/Sinatra::Base/).any? end end end end