gunnertechnology 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/README +0 -0
  4. data/Rakefile +2 -0
  5. data/gunnertechnology.gemspec +28 -0
  6. data/lib/generators/project/USAGE +8 -0
  7. data/lib/generators/project/project_generator.rb +61 -0
  8. data/lib/generators/project/templates/app/controllers/authentications_controller.rb +85 -0
  9. data/lib/generators/project/templates/app/models/authentication.rb +17 -0
  10. data/lib/generators/project/templates/app/views/layouts/application.html.erb +77 -0
  11. data/lib/generators/project/templates/app/views/shared/_facebook_init.html.erb +12 -0
  12. data/lib/generators/project/templates/app/views/shared/_flash_messages.html.erb +7 -0
  13. data/lib/generators/project/templates/app/views/shared/_footer.html.erb +15 -0
  14. data/lib/generators/project/templates/app/views/shared/_google_analytics.html.erb +11 -0
  15. data/lib/generators/project/templates/app/views/shared/_header.html.erb +23 -0
  16. data/lib/generators/project/templates/config/facebook_config.yml +29 -0
  17. data/lib/generators/project/templates/config/google_analytics_config.yml +8 -0
  18. data/lib/generators/project/templates/config/initializers/load_facebook_config.rb +2 -0
  19. data/lib/generators/project/templates/config/initializers/load_google_analytics_config.rb +2 -0
  20. data/lib/generators/project/templates/config/initializers/load_seo_config.rb +2 -0
  21. data/lib/generators/project/templates/config/initializers/omniauth.rb +91 -0
  22. data/lib/generators/project/templates/config/providers.yml +27 -0
  23. data/lib/generators/project/templates/config/seo_config.yml +8 -0
  24. data/lib/generators/project/templates/db/create_authentications.rb +21 -0
  25. data/lib/generators/project/templates/public/javascripts/libs/PIE.htc +73 -0
  26. data/lib/generators/project/templates/public/javascripts/libs/colorpicker.js +484 -0
  27. data/lib/generators/project/templates/public/javascripts/libs/dd_belatedpng.js +13 -0
  28. data/lib/generators/project/templates/public/javascripts/libs/eye.js +34 -0
  29. data/lib/generators/project/templates/public/javascripts/libs/head.js +8 -0
  30. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine-en.js +130 -0
  31. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine-es.js +124 -0
  32. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine-fr.js +119 -0
  33. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine-it.js +103 -0
  34. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine-pt.js +125 -0
  35. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine-ro.js +126 -0
  36. data/lib/generators/project/templates/public/javascripts/libs/jquery.validationEngine.js +1137 -0
  37. data/lib/generators/project/templates/public/javascripts/libs/layout.js +67 -0
  38. data/lib/generators/project/templates/public/javascripts/libs/modernizr-1.6.min.js +30 -0
  39. data/lib/generators/project/templates/public/javascripts/libs/utils.js +252 -0
  40. data/lib/generators/project/templates/public/javascripts/mylibs/.gitignore +3 -0
  41. data/lib/generators/project/templates/public/javascripts/plugins.js +38 -0
  42. data/lib/generators/project/templates/public/javascripts/profiling/config.js +59 -0
  43. data/lib/generators/project/templates/public/javascripts/profiling/yahoo-profiling.min.js +39 -0
  44. data/lib/generators/project/templates/public/javascripts/script.js +46 -0
  45. data/lib/generators/project/templates/public/stylesheets/grids/1008_24_10_10.css +201 -0
  46. data/lib/generators/project/templates/public/stylesheets/grids/fluid.css +320 -0
  47. data/lib/generators/project/templates/public/stylesheets/handheld.css +8 -0
  48. data/lib/generators/project/templates/public/stylesheets/profiling/yahoo-profiling.css +7 -0
  49. data/lib/generators/project/templates/public/stylesheets/reset.css +53 -0
  50. data/lib/generators/project/templates/public/stylesheets/text.css +84 -0
  51. data/lib/generators/project/templates/public/stylesheets/validationEngine.jquery.css +142 -0
  52. data/lib/generators/project/templates/public/swfs/charts.swf +0 -0
  53. data/lib/gunnertechnology/version.rb +3 -0
  54. data/lib/gunnertechnology.rb +47 -0
  55. metadata +206 -0
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in gunnertechnology.gemspec
4
+ gemspec
data/README ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "gunnertechnology/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "gunnertechnology"
7
+ s.version = Gunnertechnology::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Cody Swann"]
10
+ s.email = ["developers@gunnertech.com"]
11
+ s.homepage = ""
12
+ s.summary = %q{GT Functionality Packaged as a Gem for Easy Reuse}
13
+ s.description = %q{The Gunner Technology gem contains much of the functionality we use from Rails project to Rails Project}
14
+
15
+ s.rubyforge_project = "gunnertechnology"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency('rails', '~>3.0')
23
+ s.add_dependency("jquery-rails", "~>0.2.6")
24
+ s.add_dependency("devise", "~>1.1.5")
25
+ s.add_dependency("omniauth", "~>0.1.6")
26
+ s.add_dependency("simple_form", "~>1.3.0")
27
+ s.add_development_dependency("nifty-generators", "~>0.4.2")
28
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Explain the generator
3
+
4
+ Example:
5
+ rails generate project Thing
6
+
7
+ This will create:
8
+ what/will/it/create
@@ -0,0 +1,61 @@
1
+ class ProjectGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('../templates', __FILE__)
3
+ argument :layout_name, :type => :string, :default => "application"
4
+ argument :devise_model_name, :type => :string, :default => "User"
5
+
6
+ def generate_layout
7
+ template "app/views/layouts/application.html.erb", "app/views/layouts/#{file_name}.html.erb"
8
+ directory "public/javascripts", "public/javascripts"
9
+ directory "public/stylesheets", "public/stylesheets"
10
+ directory "public/swfs", "public/swfs"
11
+ end
12
+
13
+ def generate_facebook_config
14
+ copy_file "config/facebook_config.yml", "config/facebook_config.yml"
15
+ copy_file "config/initializers/load_facebook_config.rb", "config/initializers/facebook_config.rb"
16
+ end
17
+
18
+ def generate_google_analytics_config
19
+ copy_file "config/google_analytics_config.yml", "config/facebook_config.yml"
20
+ copy_file "config/initializers/load_google_analytics_config.rb", "config/initializers/load_google_analytics_config.rb"
21
+ end
22
+
23
+ def generate_seo_config
24
+ copy_file "config/seo_config.yml", "config/seo_config.yml"
25
+ copy_file "config/initializers/load_seo.rb", "config/initializers/load_seo_config.rb"
26
+ end
27
+
28
+ def generate_providers_config
29
+ copy_file "config/providers.yml", "config/providers.yml"
30
+ copy_file "config/initializers/omniauth.rb", "config/initializers/omniauth.rb"
31
+ end
32
+
33
+ def generate_jquery
34
+ generate("jquery:install")
35
+ end
36
+
37
+ def generate_simple_form
38
+ generate("simple_form:install")
39
+ end
40
+
41
+ def generate_devise
42
+ generate("devise:install")
43
+ generate("devise",devise_model_name)
44
+ end
45
+
46
+ def generate_authentication
47
+ # model
48
+ template "app/models/authentication.rb", "app/models/authentication.rb"
49
+ # controller
50
+ template "app/controllers/authentications_controller.rb", "app/controllers/authentications_controller.rb"
51
+ # migration
52
+ migration_template "create_authentications.rb", "db/migrate/add_foo_to_bar.rb"
53
+ # route
54
+ route("match '/auth/:provider/callback' => 'authentications#create'")
55
+ end
56
+
57
+ private
58
+ def file_name
59
+ layout_name.underscore
60
+ end
61
+ end
@@ -0,0 +1,85 @@
1
+ class AuthenticationsController < ApplicationController
2
+
3
+ def index
4
+ @authentications = current_user.authentications if current_user
5
+ end
6
+
7
+ def build_omniauth(faux_ominauth)
8
+ pieces = faux_ominauth.split("~~~")
9
+ {
10
+ 'provider' => pieces[0],
11
+ 'uid' => pieces[1],
12
+ 'credentials' => {
13
+ 'token' => pieces[2],
14
+ 'secret' => pieces[3],
15
+ },
16
+ 'user_info' => {
17
+ 'nickname' => pieces[4]
18
+ }
19
+ }
20
+ end
21
+
22
+ def create
23
+ omniauth = params[:faux_ominauth].nil? ? request.env["omniauth.auth"] : build_omniauth(params[:faux_ominauth])
24
+ if omniauth
25
+ # THIS IS A MESS. WE CAN'T CARRY PARAMETERS THROUGH TO THE NETWORK, SO WE HAVE TO SET A SESSION VARIABLE. BUT, WE HAVE TO IGNORE THAT SESSION VARIABLE IF THE USER
26
+ # IS TRYING TO CONNECT FACEBOOOK FROM THEIR RETAILER PAGE. BUT IF ARE TRYING TO CONNECT TO A FACEBOOK PAGE, WE NEED TO HONOR THE SESSION VARIABLE
27
+ type = omniauth['provider'] == 'facebook' && params[:faux_ominauth].nil? ? 'User' : (params[:auth_type] || session[:auth_type] || 'User')
28
+ uid = (omniauth['uid']||omniauth['extra']['access_token'].params['member_id'])
29
+ authentication = Authentication.find_by_provider_and_authenticationable_type_and_uid(omniauth['provider'], type, uid)
30
+
31
+ if type == 'Retailer'
32
+ retailer_id = params[:auth_type_id] || session[:retailer_id]
33
+ session[:auth_type] = nil
34
+ session[:retailer_id] = nil
35
+ if !retailer_id
36
+ redirect_to root_url
37
+ end
38
+
39
+ retailer = Retailer.find(retailer_id)
40
+ if authentication
41
+ flash[:notice] = "You already added that account"
42
+ else
43
+ retailer.authentications.create!(:nickname => omniauth['user_info']['nickname'], :provider => omniauth['provider'], :uid => uid, :token => omniauth['credentials']['token'], :secret => omniauth['credentials']['secret'])
44
+ end
45
+ redirect_to edit_retailer_url(retailer)
46
+ else
47
+ if authentication
48
+ flash[:notice] = "Signed in successfully."
49
+ sign_in_and_redirect(:user, authentication.authenticationable)
50
+ elsif current_user
51
+ current_user.authentications.create!(:nickname => omniauth['user_info']['nickname'], :provider => omniauth['provider'], :uid => uid, :token => omniauth['credentials']['token'], :secret => omniauth['credentials']['secret'])
52
+ flash[:notice] = "Authentication successful."
53
+
54
+ if retailer_id = session[:retailer_id]
55
+ session[:auth_type] = nil
56
+ session[:retailer_id] = nil
57
+
58
+ redirect_to edit_retailer_url(retailer_id)
59
+ else
60
+ redirect_to authentications_url
61
+ end
62
+ else
63
+ user = User.new
64
+ user.apply_omniauth(omniauth,params[:user])
65
+ if user.save
66
+ flash[:notice] = "Signed in successfully."
67
+ sign_in_and_redirect(:user, user)
68
+ else
69
+ session[:omniauth] = omniauth.except('extra')
70
+ redirect_to new_user_registration_url
71
+ end
72
+ end
73
+ end
74
+ else
75
+ redirect_to root_url
76
+ end
77
+ end
78
+
79
+ def destroy
80
+ @authentication = current_user.authentications.find(params[:id])
81
+ @authentication.destroy
82
+ flash[:notice] = "Successfully destroyed authentication."
83
+ redirect_to authentications_url
84
+ end
85
+ end
@@ -0,0 +1,17 @@
1
+ class Authentication < ActiveRecord::Base
2
+ PROVIDER_CONFIG = YAML.load_file("#{::Rails.root.to_s}/config/providers.yml")[::Rails.env]
3
+
4
+ belongs_to :authenticationable, :polymorphic => true
5
+
6
+ validates :provider, :presence => true, :length => 1..64
7
+ validates :nickname, :presence => true, :length => 1..64
8
+ validates :uid, :presence => true, :length => 1..128
9
+ validates :token, :length => 0..128, :allow_blank => true
10
+ validates :secret, :length => 0..128, :allow_blank => true
11
+
12
+ for p in PROVIDER_CONFIG['providers']
13
+ scope p['name'].to_sym, where(:provider => p['name'])
14
+ end
15
+
16
+ attr_accessible :authenticationable_id, :authenticationable_type, :provider, :uid, :token, :secret, :nickname
17
+ end
@@ -0,0 +1,77 @@
1
+ <!doctype html>
2
+ <!--[if lt IE 7 ]> <html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en" class="no-js ie6<%%= use_fluid_layout? ? ' fluid' : '' %%> "> <![endif]-->
3
+ <!--[if IE 7 ]> <html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en" class="no-js ie7<%%= use_fluid_layout? ? ' fluid' : '' %%>"> <![endif]-->
4
+ <!--[if IE 8 ]> <html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en" class="no-js ie8<%%= use_fluid_layout? ? ' fluid' : '' %%>"> <![endif]-->
5
+ <!--[if IE 9 ]> <html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en" class="no-js ie9<%%= use_fluid_layout? ? ' fluid' : '' %%>"> <![endif]-->
6
+ <!--[if (gt IE 9)|!(IE)]><!--> <html xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml" lang="en" class="no-js<%%= use_fluid_layout? ? ' fluid' : '' %%>"> <!--<![endif]-->
7
+ <head>
8
+ <title><%%= content_for?(:title) ? "#{content_for(:title)} - #{SEO_CONFIG[:title]}" : t(:site_title) %%></title>
9
+ <%%= stylesheet_link_tag :defaults %%>
10
+ <%%= javascript_include_tag "libs/head.js" %%>
11
+ <script>
12
+ head.js(<%%= raw (javascript_include_tag(:defaults)+content_for(:javascripts)).scan(/<script .*src=(['"][^'"]+['"]).*> *<\/script>/).join(",") %%>);
13
+ </script>
14
+ <%%= csrf_meta_tag %%>
15
+
16
+ <%%= favicon_link_tag %%>
17
+ <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
18
+
19
+ <meta charset="utf-8" />
20
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
21
+ <%%= yield(:meta) %%>
22
+ <script>
23
+ head.ready(function() {
24
+ (function($){
25
+ $(function(){
26
+ <%%= content_for(:javascripts).gsub(/<script[^>]*>/,"").gsub(/<\/script>/,"") %%>
27
+ });
28
+ }(jQuery));
29
+ });
30
+ </script>
31
+ <style>
32
+ html.fluid .container_24 {
33
+ max-width:<%%= content_for?(:max_width) ? content_for(:max_width) : '1300' %%>px;
34
+ min-width:<%%= content_for?(:min_width) ? content_for(:min_width) : '1008' %%>px;
35
+ }
36
+ </style>
37
+ <%%= yield(:stylesheets) %%>
38
+ <%%= yield(:head) %%>
39
+ <%% if content_for?(:opengraph) %%>
40
+ <%%= yield(:opengraph) %%>
41
+ <%% else %%>
42
+ <meta property="og:title" content="<%%= FACEBOOK_CONFIG[:opengraph]['title'] %%>"/>
43
+ <meta property="og:type" content="<%%= FACEBOOK_CONFIG[:opengraph]['type'] %%>"/>
44
+ <meta property="og:url" content="<%%= FACEBOOK_CONFIG[:opengraph]['url'] %%>"/>
45
+ <meta property="og:image" content="<%%= FACEBOOK_CONFIG[:opengraph]['image'] %%>"/>
46
+ <meta property="og:site_name" content="<%%= FACEBOOK_CONFIG[:opengraph]['site_name'] %%>"/>
47
+ <meta property="fb:admins" content="<%%= FACEBOOK_CONFIG[:admins].join(",") %%>"/>
48
+ <meta property="og:description" content="<%%= FACEBOOK_CONFIG[:opengraph]['description'] %%>"/>
49
+ <%% end %%>
50
+ <%%= render :partial => "shared/google_analytics" %%>
51
+ </head>
52
+ <body class="<%%= controller.controller_name %%> <%%= "#{controller.controller_name}-#{controller.action_name}" %%> <%%= content_for(:body_classes) %%>">
53
+ <%%= render :partial => "shared/facebook_init" %%>
54
+ <div id="container" class="container_24">
55
+ <%%= render :partial => "shared/header" %%>
56
+
57
+ <section id="main" class="grid_24 clearfix">
58
+ <%%= render :partial => "shared/flash_messages" %%>
59
+ <%% if content_for?(:complex_page_title) %%>
60
+ <%%= yield :complex_page_title %%>
61
+ <%% elsif content_for?(:page_title) %%>
62
+ <h1>
63
+ <%%= yield :page_title %%>
64
+ </h1>
65
+ <%% end %%>
66
+ <article class="<%%= content_for?(:article_classes) ? content_for(:article_classes) : 'grid_23 alpha omega' %%>">
67
+ <%%= yield %%>
68
+ </article>
69
+ <%%= yield :sidebar %%>
70
+ </section>
71
+
72
+ <%%= render :partial => "shared/footer" %%>
73
+ </div>
74
+
75
+ <%%= yield :bottom %%>
76
+ </body>
77
+ </html>
@@ -0,0 +1,12 @@
1
+ <div id="fb-root"></div>
2
+ <script>
3
+ window.fbAsyncInit = function() {
4
+ FB.init({appId: '<%= FACEBOOK_CONFIG[:app_id] %>', status: true, cookie: true, xfbml: true});
5
+ };
6
+ (function() {
7
+ var e = document.createElement('script'); e.async = true;
8
+ e.src = document.location.protocol +
9
+ '//connect.facebook.net/en_US/all.js';
10
+ document.getElementById('fb-root').appendChild(e);
11
+ }());
12
+ </script>
@@ -0,0 +1,7 @@
1
+ <% unless flash[:notice].nil? %>
2
+ <%= flash[:notice] %>
3
+ <% end %>
4
+
5
+ <% unless flash[:error].nil? %>
6
+ <%= flash[:error] %>
7
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <footer class="clearfix grid_24">
2
+ <small>
3
+ <%= t(:copyright) %> &#169; <%= t(:company_name) %> <%= t(:all_rights_reserved)%>.
4
+ </small>
5
+
6
+ <nav>
7
+ <ul>
8
+ <li><%= link_to(t(:about_us) ,page_path(:about)) %> <span class="separator"> | </span></li>
9
+ <li><%= link_to(t(:contact_us) ,page_path(:contact)) %> <span class="separator"> | </span></li>
10
+ <li><%= link_to(t(:privacy_policy) ,page_path(:privacy)) %> <span class="separator"> | </span></li>
11
+ <li><%= link_to(t(:terms_of_service) ,page_path(:tos)) %></li>
12
+ </ul>
13
+ </nav>
14
+
15
+ </footer>
@@ -0,0 +1,11 @@
1
+ <script>
2
+ var _gaq = _gaq || [];
3
+ _gaq.push(['_setAccount', '<%= GOOGLE_ANALYTICS_CONFIG[:profile_id] %>']);
4
+ _gaq.push(['_trackPageview']);
5
+
6
+ (function() {
7
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
8
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
9
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
10
+ })();
11
+ </script>
@@ -0,0 +1,23 @@
1
+ <div class="spacer"></div>
2
+ <div class="spacer"></div>
3
+ <header class="clearfix grid_24">
4
+ <%= link_to("Home", root_url, :id => 'masthead', :class => 'ir') %>
5
+
6
+ <nav class="clearfix">
7
+ <ul>
8
+ <% if user_signed_in? %>
9
+ <li>Welcome <%= current_user.login %><span class="separator"></span></li>
10
+ <li><%= link_to t(:support), page_path('support') %><span class="separator"> | </span></li>
11
+ <li><%= link_to t(:profile), "" %><span class="separator"> | </span></li>
12
+ <li><%= link_to t(:settings), "" %><span class="separator"> | </span></li>
13
+ <li><%= link_to t(:sign_out), destroy_user_session_path %></li>
14
+ <% else %>
15
+ <li><%= link_to t(:about_us), page_path('about') %><span class="separator"> | </span></li>
16
+ <li><%= link_to t(:sign_in), new_user_session_path %><span class="separator"> | </span></li>
17
+ <li><%= link_to t(:contact_us), page_path('contact') %></li>
18
+ <% end %>
19
+ </ul>
20
+ </nav>
21
+
22
+ <%= link_to t(:consumer_app_teaser), page_path('consumer'), :class => "teaser" %>
23
+ </header>
@@ -0,0 +1,29 @@
1
+ development:
2
+ appId: 6d3de4638a3339264d30c11f4bb9f173
3
+ admins:
4
+ - 2020864
5
+ opengraph:
6
+ title: Circle Street
7
+ type: company
8
+ url: http://dev.circlestreet.com
9
+ image: http://ia.media-imdb.com/rock.jpg
10
+ site_name: Circle Street
11
+ description: Promotions are the hottest content on the web. Circle Street's mission is to provide a better set of tools for merchants to easily publish promotions to larger and more targeted audiences. Circle Street's smart publishing platform allows merchants to powerfully and efficiently distribute their promotions
12
+
13
+ test:
14
+ appId: 6d3de4638a3339264d30c11f4bb9f173
15
+ admins:
16
+ - 2020864
17
+ opengraph:
18
+ title: Circle Street
19
+ type: company
20
+ url: http://dev.circlestreet.com
21
+
22
+ production:
23
+ appId: 6d3de4638a3339264d30c11f4bb9f173
24
+ admins:
25
+ - 2020864
26
+ opengraph:
27
+ title: Circle Street
28
+ type: company
29
+ url: http://dev.circlestreet.com
@@ -0,0 +1,8 @@
1
+ development:
2
+ profile_id: UA-11631477-12
3
+
4
+ test:
5
+ profile_id: UA-11631477-12
6
+
7
+ production:
8
+ profile_id: UA-11631477-12
@@ -0,0 +1,2 @@
1
+ raw_config = File.read("#{Rails.root}/config/facebook_config.yml")
2
+ FACEBOOK_CONFIG = YAML.load(raw_config)[Rails.env].symbolize_keys
@@ -0,0 +1,2 @@
1
+ raw_config = File.read("#{Rails.root}/config/google_analytics_config.yml")
2
+ GOOGLE_ANALYTICS_CONFIG = YAML.load(raw_config)[Rails.env].symbolize_keys
@@ -0,0 +1,2 @@
1
+ raw_config = File.read("#{Rails.root}/config/seo_config.yml")
2
+ SEO_CONFIG = YAML.load(raw_config)[Rails.env].symbolize_keys
@@ -0,0 +1,91 @@
1
+ module OmniAuth
2
+ module Strategies
3
+ #
4
+ # Authenticate to Flickr
5
+ #
6
+ # @example Basic Usage
7
+ #
8
+ # use OmniAuth::Strategies::Flickr, 'API Key', 'Secret Key', :scope => 'read'
9
+ class Flickr
10
+ include OmniAuth::Strategy
11
+ attr_accessor :api_key, :secret_key, :options
12
+
13
+ # error catching, based on OAuth2 callback
14
+ class CallbackError < StandardError
15
+ attr_accessor :error, :error_reason
16
+ def initialize(error, error_reason)
17
+ self.error = error
18
+ self.error_reason = error_reason
19
+ end
20
+ end
21
+
22
+ # @param [Rack Application] app standard middleware application parameter
23
+ # @param [String] api_key the application id as [registered on Flickr](http://www.flickr.com/services/apps/)
24
+ # @param [String] secret_key the application secret as [registered on Flickr](http://www.flickr.com/services/apps/)
25
+ # @option options ['read','write','delete] :scope ('read') the scope of your authorization request; must be `read` or 'write' or 'delete'
26
+ def initialize(app, api_key, secret_key, options = {})
27
+ super(app, :flickr)
28
+ @api_key = api_key
29
+ @secret_key = secret_key
30
+ @options = {:scope => 'read'}.merge(options)
31
+ end
32
+
33
+ protected
34
+
35
+ def request_phase
36
+ params = { :api_key => api_key, :perms => options[:scope] }
37
+ params[:api_sig] = flickr_sign(params)
38
+ query_string = params.collect{ |key,value| "#{key}=#{Rack::Utils.escape(value)}" }.join('&')
39
+ redirect "http://flickr.com/services/auth/?#{query_string}"
40
+ end
41
+
42
+ def callback_phase
43
+ params = { :api_key => api_key, :method => 'flickr.auth.getToken', :frob => request.params['frob'], :format => 'json', :nojsoncallback => '1' }
44
+ params[:api_sig] = flickr_sign(params)
45
+
46
+ response = RestClient.get('http://api.flickr.com/services/rest/', { :params => params })
47
+ auth = MultiJson.decode(response.to_s)
48
+ raise CallbackError.new(auth['code'],auth['message']) if auth['stat'] == 'fail'
49
+
50
+ @user = auth['auth']['user']
51
+ @access_token = auth['auth']['token']['_content']
52
+
53
+ super
54
+ rescue CallbackError => e
55
+ fail!(:invalid_response, e)
56
+ end
57
+
58
+ def auth_hash
59
+ OmniAuth::Utils.deep_merge(super, {
60
+ 'uid' => @user['nsid'],
61
+ 'credentials' => { 'token' => @access_token },
62
+ 'user_info' => @user,
63
+ 'extra' => { 'user_hash' => @user }
64
+ })
65
+ end
66
+
67
+ def flickr_sign(params)
68
+ Digest::MD5.hexdigest(secret_key + params.sort{|a,b| a[0].to_s <=> b[0].to_s }.flatten.join)
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+
75
+ module ProvidersConfig
76
+ end
77
+
78
+ Rails.application.config.middleware.use OmniAuth::Builder do
79
+ PROVIDER_CONFIG = YAML.load_file("#{::Rails.root.to_s}/config/providers.yml")[::Rails.env]
80
+ for p in PROVIDER_CONFIG['providers']
81
+ if p['options']
82
+ provider p['name'], p['key'], p['secret'], :scope => p['options']
83
+ else
84
+ provider p['name'], p['key'], p['secret']
85
+ end
86
+ ProvidersConfig.const_set(p['name'].classify.upcase,{
87
+ :key => p['key'],
88
+ :secret => p['secret']
89
+ })
90
+ end
91
+ end
@@ -0,0 +1,27 @@
1
+ defaults: &defaults
2
+ providers:
3
+ - name: twitter
4
+ key: qLDNyJWYR4uwgVlQ1Z3A
5
+ secret: EZlvNgye1feUDvF9Mn6XyNgYfILBEfIe17K5xKZyBs
6
+ - name: facebook
7
+ key: 180930071946269 #aka app_id
8
+ secret: bb7ba4d6aca52226489e1e1a18d8904c
9
+ options: 'email,offline_access,manage_pages'
10
+ - name: foursquare
11
+ key: DCHFL0OJXFAGNMFX4Q0LT0P55K4E4L41EOTKESLVJS5SC1GT
12
+ secret: 0ELT3AJYEXKEV1TEZSNRV4M4KDMUTDVUMMD5UJPM2QD1WK1B
13
+ - name: flickr
14
+ key: 598bcfd26c5091db5b68713f5126dc26
15
+ secret: 7cc1ace805d88475
16
+ - name: meetup
17
+ key: 776E306E6B28327449134646BBF89807
18
+ secret: 4CB887C5918F48F3ADE8E0E931F74B70
19
+
20
+ development:
21
+ <<: *defaults
22
+
23
+ test:
24
+ <<: *defaults
25
+
26
+ production:
27
+ <<: *defaults
@@ -0,0 +1,8 @@
1
+ development:
2
+ domain: localhost:3000
3
+
4
+ test:
5
+ domain: test.host
6
+
7
+ production:
8
+ domain: example.com
@@ -0,0 +1,21 @@
1
+ class CreateAuthentications < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :authentications do |t|
4
+ t.references :authenticationable, :polymorphic => true
5
+ t.string :provider, :null => false, :limit => 64
6
+ t.string :uid, :null => false, :limit => 128
7
+ t.string :nickname, :limit => 64, :null => false
8
+ t.string :token, :limit => 128
9
+ t.string :secret, :limit => 128
10
+ t.timestamps
11
+ end
12
+
13
+ add_index :authentications, [:authenticationable_id, :authenticationable_type], :name => "index_authentications_on_a_id_a_type"
14
+ add_index :authentications, :provider
15
+ add_index :authentications, [:provider, :authenticationable_type, :uid], :name => "index_authentications_on_p_a_type_uid"
16
+ end
17
+
18
+ def self.down
19
+ drop_table :authentications
20
+ end
21
+ end