dailycred 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. data/.gitignore +3 -0
  2. data/Rakefile +10 -0
  3. data/dailycred.gemspec +1 -1
  4. data/lib/dailycred.rb +14 -13
  5. data/lib/generators/dailycred_generator.rb +12 -1
  6. data/lib/generators/templates/login.html.erb +13 -0
  7. data/lib/generators/templates/migration_create_user.rb +5 -1
  8. data/lib/generators/templates/omniauth.rb +5 -1
  9. data/lib/generators/templates/sessions_controller.rb +5 -3
  10. data/lib/generators/templates/user.rb +8 -19
  11. data/lib/middleware/middleware.rb +18 -7
  12. data/lib/omniauth/strategies/dailycred.rb +26 -14
  13. data/lib/user/user.rb +63 -0
  14. data/localtest/.gitignore +15 -0
  15. data/localtest/Gemfile +39 -0
  16. data/localtest/README.rdoc +261 -0
  17. data/localtest/Rakefile +7 -0
  18. data/localtest/app/assets/images/rails.png +0 -0
  19. data/localtest/app/assets/javascripts/application.js +15 -0
  20. data/localtest/app/assets/stylesheets/application.css +13 -0
  21. data/localtest/app/controllers/application_controller.rb +42 -0
  22. data/localtest/app/controllers/sessions_controller.rb +27 -0
  23. data/localtest/app/helpers/application_helper.rb +2 -0
  24. data/localtest/app/mailers/.gitkeep +0 -0
  25. data/localtest/app/models/.gitkeep +0 -0
  26. data/localtest/app/models/user.rb +14 -0
  27. data/localtest/app/views/layouts/application.html.erb +14 -0
  28. data/localtest/app/views/sessions/info +9 -0
  29. data/localtest/config/application.rb +62 -0
  30. data/localtest/config/boot.rb +6 -0
  31. data/localtest/config/database.yml +25 -0
  32. data/localtest/config/environment.rb +5 -0
  33. data/localtest/config/environments/development.rb +37 -0
  34. data/localtest/config/environments/production.rb +67 -0
  35. data/localtest/config/environments/test.rb +37 -0
  36. data/localtest/config/initializers/backtrace_silencers.rb +7 -0
  37. data/localtest/config/initializers/inflections.rb +15 -0
  38. data/localtest/config/initializers/mime_types.rb +5 -0
  39. data/localtest/config/initializers/omniauth.rb +20 -0
  40. data/localtest/config/initializers/secret_token.rb +7 -0
  41. data/localtest/config/initializers/session_store.rb +8 -0
  42. data/localtest/config/initializers/wrap_parameters.rb +14 -0
  43. data/localtest/config/locales/en.yml +5 -0
  44. data/localtest/config/routes.rb +61 -0
  45. data/localtest/config.ru +4 -0
  46. data/localtest/db/migrate/20120906153457_create_users.rb +21 -0
  47. data/localtest/db/migrate/20120906234358_alter_column_from_users.rb +6 -0
  48. data/localtest/db/migrate/20120907004912_add_column_to_users.rb +5 -0
  49. data/localtest/db/migrate/20120907014514_add_tags_to_users.rb +6 -0
  50. data/localtest/db/schema.rb +33 -0
  51. data/localtest/db/seeds.rb +7 -0
  52. data/localtest/lib/assets/.gitkeep +0 -0
  53. data/localtest/lib/tasks/.gitkeep +0 -0
  54. data/localtest/log/.gitkeep +0 -0
  55. data/localtest/public/404.html +26 -0
  56. data/localtest/public/422.html +26 -0
  57. data/localtest/public/500.html +25 -0
  58. data/localtest/public/favicon.ico +0 -0
  59. data/localtest/public/robots.txt +5 -0
  60. data/localtest/script/rails +6 -0
  61. data/localtest/test/fixtures/.gitkeep +0 -0
  62. data/localtest/test/functional/.gitkeep +0 -0
  63. data/localtest/test/integration/.gitkeep +0 -0
  64. data/localtest/test/performance/browsing_test.rb +12 -0
  65. data/localtest/test/test_helper.rb +13 -0
  66. data/localtest/test/unit/.gitkeep +0 -0
  67. data/localtest/vendor/assets/javascripts/.gitkeep +0 -0
  68. data/localtest/vendor/assets/stylesheets/.gitkeep +0 -0
  69. data/localtest/vendor/plugins/.gitkeep +0 -0
  70. data/spec/{spec_helper.rb → helper_spec.rb} +2 -0
  71. data/spec/omniauth/strategies/dailycred_spec.rb +50 -10
  72. data/spec/support/dailycred_spec.rb +58 -0
  73. data/spec/support/shared_examples.rb +40 -0
  74. metadata +66 -4
data/.gitignore CHANGED
@@ -15,3 +15,6 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
+ localtest/
19
+ twooter/
20
+ examples/tester/
data/Rakefile CHANGED
@@ -1,2 +1,12 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+
5
+ desc 'Default: run specs.'
6
+ task :default => :spec
7
+
8
+ desc "Run specs"
9
+ RSpec::Core::RakeTask.new do |t|
10
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
11
+ # Put spec opts in a file named .rspec in root
12
+ end
data/dailycred.gemspec CHANGED
@@ -14,5 +14,5 @@ Gem::Specification.new do |gem|
14
14
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
15
  gem.name = "dailycred"
16
16
  gem.require_paths = ["lib"]
17
- gem.version = "0.1.21"
17
+ gem.version = "0.1.22"
18
18
  end
data/lib/dailycred.rb CHANGED
@@ -4,7 +4,14 @@ require "middleware/middleware"
4
4
 
5
5
  class Dailycred
6
6
 
7
- attr_accessor :client_id, :secret_key, :options
7
+ attr_accessor :client_id, :secret_key, :options, :url
8
+
9
+ URL = "https://www.dailycred.com"
10
+
11
+ ROUTES = {
12
+ :signup => "/user/api/signup.json",
13
+ :login => "/user/api/signin.json"
14
+ }
8
15
 
9
16
  # Initializes a dailycred object
10
17
  # @param [String] client_id the client's daiycred client id
@@ -14,10 +21,10 @@ class Dailycred
14
21
  @client_id = client_id
15
22
  @secret_key = secret_key
16
23
  @options = opts
24
+ opts[:client_options] ||= {}
25
+ @url = opts[:client_options][:site] || Dailycred::URL
17
26
  end
18
27
 
19
- URL = "https://www.dailycred.com"
20
-
21
28
  # Generates a Dailycred event
22
29
  # @param [String] user_id the user's dailycred user id
23
30
  # @param [String] key the name of the event type
@@ -42,7 +49,7 @@ class Dailycred
42
49
  post "/admin/api/user/tag.json", opts
43
50
  end
44
51
 
45
- # Untag a user in dailycred
52
+ # Untag a user in dailycred
46
53
  # (see #tag)
47
54
  def untag(user_id, tag)
48
55
  opts = {
@@ -52,23 +59,18 @@ class Dailycred
52
59
  post "/admin/api/user/untag.json", opts
53
60
  end
54
61
 
55
- private
56
-
57
62
  def post(url, opts)
58
63
  opts.merge! base_opts
59
- p opts
60
64
  response = get_conn.post url, opts
61
- p response.body
62
65
  end
63
66
 
67
+ private
68
+
64
69
  def ssl_opts
65
70
  opts = {}
66
- p @options
67
- p " ^^^^ @options "
68
71
  if @options[:client_options] && @options[:client_options][:ssl]
69
72
  opts[:ssl] = @options[:client_options][:ssl]
70
73
  end
71
- p opts
72
74
  opts
73
75
  end
74
76
 
@@ -80,7 +82,6 @@ class Dailycred
80
82
  end
81
83
 
82
84
  def get_conn
83
- p ssl_opts
84
- Faraday::Connection.new Dailycred::URL, ssl_opts
85
+ Faraday::Connection.new @url, ssl_opts
85
86
  end
86
87
  end
@@ -17,6 +17,7 @@ class DailycredGenerator < Rails::Generators::Base
17
17
 
18
18
  private
19
19
 
20
+ # helper method for getting the current signed in user
20
21
  def current_user
21
22
  begin
22
23
  @current_user || User.find(session[:user_id]) if session[:user_id]
@@ -25,21 +26,31 @@ class DailycredGenerator < Rails::Generators::Base
25
26
  end
26
27
  end
27
28
 
29
+ # use as a before_filter to only allow signed in users
30
+ # example:
31
+ # before_filter :authenticate
28
32
  def authenticate
29
33
  redirect_to auth_path unless current_user
30
34
  end
31
35
 
36
+ # link to sign up
32
37
  def signup_path
33
38
  "/auth/dailycred"
34
39
  end
35
40
 
41
+ # link to login
36
42
  def login_path
37
43
  "/auth/dailycred?action=signin"
38
44
  end
39
45
 
46
+ # helper method for getting an instance of dailycred
47
+ # example:
48
+ # dailycred.tagUser "user_id", "tag"
49
+ #
50
+ # for more documentation, visit https://www.dailycred.com/api/ruby
40
51
  def dailycred
41
52
  config = Rails.configuration
42
- @dailycred ||= Dailycred.new(config.DAILYCRED_CLIENT_ID, config.DAILYCRED_SECRET_KEY, config.dc_client_opts)
53
+ @dailycred ||= Dailycred.new(config.DAILYCRED_CLIENT_ID, config.DAILYCRED_SECRET_KEY, config.dc_options)
43
54
  end
44
55
  EOS
45
56
 
@@ -0,0 +1,13 @@
1
+ <%= form_for(@user) do |f| %>
2
+ <p>
3
+ <%= f.label :email %>
4
+ <%= f.text_field :email%>
5
+ </p>
6
+ <p>
7
+ <%= f.label :password %>
8
+ <%= f.password_field :password %>
9
+ </p>
10
+ <p>
11
+ <%= f.submit "Log in" %>
12
+ </p>
13
+ <% end %>
@@ -3,12 +3,16 @@ class CreateUsers < ActiveRecord::Migration
3
3
  create_table :users do |t|
4
4
  t.string :provider, null: false
5
5
  t.string :uid, null: false
6
- t.string :email, null: false, uniq: true
6
+ t.string :email
7
7
  t.integer :created, :limit => 8
8
8
  t.string :username
9
9
  t.boolean :verified
10
10
  t.boolean :admin
11
11
  t.string :referred_by
12
+ t.string :token
13
+ t.text :facebook
14
+ t.text :tags
15
+ t.text :referred
12
16
 
13
17
  t.timestamps
14
18
  end
@@ -4,7 +4,11 @@ Rails.configuration.DAILYCRED_SECRET_KEY = "<%= secret_key %>"
4
4
  dc_id = Rails.configuration.DAILYCRED_CLIENT_ID
5
5
  dc_secret = Rails.configuration.DAILYCRED_SECRET_KEY
6
6
 
7
- dc_options = { :client_options => {} }
7
+ dc_options = { :client_options => {
8
+ :site => "http://localhost:9000",
9
+ :authorize_url => '/oauth/authorize',
10
+ :token_url => '/oauth/access_token'
11
+ } }
8
12
 
9
13
  if File.exists?('/etc/ssl/certs')
10
14
  dc_options[:client_options][:ssl] = { :ca_path => '/etc/ssl/certs'}
@@ -2,22 +2,24 @@ class SessionsController < ApplicationController
2
2
  before_filter :authenticate, :only => [:destroy]
3
3
  before_filter :current_user
4
4
 
5
+ # Callback Route for OAuth flow
5
6
  def create
6
- @user = User.find_by_provider_and_uid(auth_hash['provider'], auth_hash['uid']) || User.create_with_omniauth(auth_hash)
7
+ @user = User.find_or_create_with_omniauth auth_hash
7
8
  session[:user_id] = @user.id
8
- redirect_to auth_path
9
+ redirect_to "/auth"
9
10
  end
10
11
 
12
+ #GET /logout
11
13
  def destroy
12
14
  session[:user_id] = nil
13
15
  redirect_to auth_path
14
16
  end
15
17
 
16
18
  def info
17
-
18
19
  end
19
20
 
20
21
  private
22
+
21
23
  def auth_hash
22
24
  request.env['omniauth.auth']
23
25
  end
@@ -1,25 +1,14 @@
1
1
  class User < ActiveRecord::Base
2
+ serialize :facebook, Hash
3
+ serialize :tags, Array
4
+ serialize :referred, Array
2
5
 
3
- def self.create_with_omniauth(model)
4
- if model[:provider] == "dailycred"
5
- create_with_dailycred model
6
- end
7
- end
8
-
9
- private
6
+ attr_accessible :email, :id, :username, :created, :verified, :admin, :referred_by, :referred, :facebook, :tags, :provider, :uid, :token
10
7
 
11
- def self.create_with_dailycred(model)
12
- info = model[:info]
13
- create! do |user|
14
- user.provider = model[:provider]
15
- user.uid = model[:uid]
16
- user.email =info[:email]
17
- user.username = info[:username]
18
- user.created = info[:created]
19
- user.verified = info[:verified]
20
- user.admin = info[:admin]
21
- user.referred_by = info[:referred_by]
22
- end
8
+ def self.find_or_create_with_omniauth(model)
9
+ @user = User.find_by_provider_and_uid(model[:provider], model[:uid]) || User.new
10
+ @user.update_attributes model[:info]
11
+ @user
23
12
  end
24
13
 
25
14
  end
@@ -2,8 +2,12 @@ class Dailycred
2
2
  class Middleware
3
3
  attr_accessor :client_id
4
4
 
5
- def initialize(app, client_id)
6
- @app = app
5
+ def initialize(app, client_id, opts={})
6
+ @opts = opts
7
+ @opts[:url] ||= "https://www.dailycred.com"
8
+ @opts[:modal] ||= false
9
+ @opts[:triggers] ||= []
10
+ @app = app
7
11
  @client_id = client_id
8
12
  end
9
13
 
@@ -35,20 +39,27 @@ class Dailycred
35
39
  var dc, dlh, home, id, page, referrer, title, url;
36
40
  window.dc_opts = {
37
41
  clientId: "#{@client_id}",
38
- home: "https://www.dailycred.com"
42
+ home: "#{@opts[:url]}"
39
43
  };
40
44
  id = dc_opts.clientId;
41
- home = "https://www.dailycred.com";
45
+ home = window.dc_opts.home || "https://www.dailycred.com";
42
46
  dlh = document.location.href;
43
- page = dlh.indexOf('#') > -1 ? dlh.substring(0, dlh.indexOf("#")) : dlh;
47
+ page = encodeURIComponent(dlh);
44
48
  title = document.title ? document.title : "";
45
- referrer = document.referrer ? document.referrer : "";
49
+ referrer = document.referrer ? encodeURIComponent(document.referrer) : "";
46
50
  dc = document.createElement("img");
47
- url = "" + home + "/dc.gif?page=" + page + "&title=" + title + "&client_id=" + window.dc_opts.clientId + "&referrer=" + referrer;
51
+ url = "" + home + "/dc.gif?url=" + page + "&title=" + title + "&client_id=" + window.dc_opts.clientId + "&referrer=" + referrer;
48
52
  dc.src = url;
49
53
  document.body.appendChild(dc);
50
54
  }).call(this);
51
55
  </script>
56
+ <script src="#{@opts[:url]}/public/js/dailycred.coffee"></script>
57
+ <script>
58
+ DC.init({
59
+ "showModal" : #{@opts[:modal]},
60
+ "triggers" : #{@opts[:triggers].to_s}
61
+ });
62
+ </script>
52
63
  <!-- end dailycred -->
53
64
  EOT
54
65
  end
@@ -2,34 +2,39 @@ require 'omniauth-oauth2'
2
2
  require 'faraday'
3
3
  require 'net/https'
4
4
  require 'json'
5
+ require 'pp'
5
6
 
6
7
  module OmniAuth
7
8
  module Strategies
8
9
  class Dailycred < OmniAuth::Strategies::OAuth2
10
+
9
11
  option :client_options, {
10
- :site => 'https://www.dailycred.com',
12
+ :site => "https://www.dailycred.com",
11
13
  :authorize_url => '/oauth/authorize',
12
14
  :token_url => '/oauth/access_token'
13
15
  }
14
16
 
15
- ATTRIBUTES = ["email", "id", "username", "created", "verified", "admin", "referred_by", "tags", "referred"]
17
+ ATTRIBUTES = ["email", "username", "created", "verified", "admin", "referred_by", "tags", "referred"]
16
18
  AUTH_PARAMS = ["action"]
17
19
 
18
20
  option :authorize_options, OmniAuth::Strategies::Dailycred::AUTH_PARAMS
19
-
21
+
20
22
  uid { user['id'] }
21
-
23
+
22
24
  info do
23
- infos = {}
24
- OmniAuth::Strategies::Dailycred::ATTRIBUTES.each do |attribute|
25
- infos[attribute] = user[attribute]
26
- end
27
- infos
25
+ user
28
26
  end
29
-
27
+
30
28
  alias :old_request_phase :request_phase
31
29
 
32
- def request_phase
30
+
31
+ def authorize_params
32
+ super.tap do |params|
33
+ params[:state] ||= {}
34
+ end
35
+ end
36
+
37
+ def request_phase
33
38
  OmniAuth::Strategies::Dailycred::AUTH_PARAMS.each do |param|
34
39
  val = session['omniauth.params'][param]
35
40
  if val && !val.empty?
@@ -44,19 +49,26 @@ module OmniAuth
44
49
 
45
50
  def user
46
51
  return @duser if !@duser.nil?
47
- connection = Faraday::Connection.new 'https://www.dailycred.com', :ssl => {
52
+ connection = Faraday::Connection.new options.client_options[:site], :ssl => {
48
53
  :ca_file => "/opt/local/share/curl/curl-ca-bundle.crt"
49
54
  }
50
55
  response = connection.get("/graph/me.json?access_token=#{access_token.token}")
51
56
  json = JSON.parse(response.body)
52
- @duser = {}
57
+ pp json
58
+ @duser = {'token' => access_token.token}
59
+ @duser['provider'] = 'dailycred'
60
+ @duser['uid'] = json['id'] || json['user_id']
53
61
  OmniAuth::Strategies::Dailycred::ATTRIBUTES.each do |attr|
54
62
  @duser[attr] = json[attr]
55
63
  end
64
+ if !json["FACEBOOK"].nil?
65
+ @duser['facebook'] = json["FACEBOOK"]["members"]
66
+ end
67
+ pp @duser
56
68
 
57
69
  @duser
58
70
  end
59
-
71
+
60
72
  end
61
73
  end
62
74
  end
data/lib/user/user.rb ADDED
@@ -0,0 +1,63 @@
1
+ class Dailycred
2
+ class Auth
3
+ include ActiveModel::Validations
4
+ include ActiveModel::Serialization
5
+
6
+ validates_presence_of :email, :pass
7
+
8
+ attr_accessor :client, :email, :pass, :authorized
9
+
10
+ def initialize client, user = {}
11
+ self.client = client
12
+ self.authorized = false
13
+ user.each do |k,v|
14
+ self[k] = v if self.respond_to(k)
15
+ end
16
+ end
17
+
18
+ def login
19
+ if !self.valid?
20
+ #it didn't work already, return false
21
+ return false
22
+ end
23
+
24
+ response = JSON.parse client.login(self.to_hash)
25
+ err_parser response
26
+
27
+ return false if !self.valid?
28
+ true
29
+ end
30
+
31
+ def to_hash
32
+ {
33
+ :email => self.email,
34
+ :pass => self.pass
35
+ }
36
+ end
37
+
38
+ private
39
+
40
+ #response is a hash, which is
41
+ #a json-parsed http response body
42
+ def err_parser response
43
+ if !response["worked"]
44
+ self.authorized = false
45
+ response["errors"].each do |err|
46
+ attrib = err["attribute"]
47
+ message = err["message"]
48
+ if attrib == "form"
49
+ self.errors.add_to_base message
50
+ else
51
+ if attrib == "user"
52
+ self.errors.add :email, message
53
+ elsif self.respond_to attrib
54
+ self.errors.add attrib, message
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ end
@@ -0,0 +1,15 @@
1
+ # See http://help.github.com/ignore-files/ for more about ignoring files.
2
+ #
3
+ # If you find yourself ignoring temporary files generated by your text editor
4
+ # or operating system, you probably want to add a global ignore instead:
5
+ # git config --global core.excludesfile ~/.gitignore_global
6
+
7
+ # Ignore bundler config
8
+ /.bundle
9
+
10
+ # Ignore the default SQLite database.
11
+ /db/*.sqlite3
12
+
13
+ # Ignore all logfiles and tempfiles.
14
+ /log/*.log
15
+ /tmp
data/localtest/Gemfile ADDED
@@ -0,0 +1,39 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'rails', '3.2.8'
4
+
5
+ # Bundle edge Rails instead:
6
+ # gem 'rails', :git => 'git://github.com/rails/rails.git'
7
+
8
+ gem 'sqlite3'
9
+ gem 'dailycred', :path => "../"
10
+
11
+
12
+ # Gems used only for assets and not required
13
+ # in production environments by default.
14
+ group :assets do
15
+ gem 'sass-rails', '~> 3.2.3'
16
+ gem 'coffee-rails', '~> 3.2.1'
17
+
18
+ # See https://github.com/sstephenson/execjs#readme for more supported runtimes
19
+ # gem 'therubyracer', :platforms => :ruby
20
+
21
+ gem 'uglifier', '>= 1.0.3'
22
+ end
23
+
24
+ gem 'jquery-rails'
25
+
26
+ # To use ActiveModel has_secure_password
27
+ # gem 'bcrypt-ruby', '~> 3.0.0'
28
+
29
+ # To use Jbuilder templates for JSON
30
+ # gem 'jbuilder'
31
+
32
+ # Use unicorn as the app server
33
+ # gem 'unicorn'
34
+
35
+ # Deploy with Capistrano
36
+ # gem 'capistrano'
37
+
38
+ # To use debugger
39
+ # gem 'debugger'