rpx_now 0.6.24 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
+ require 'rpx_now/version'
1
2
  require 'rpx_now/api'
2
3
  require 'rpx_now/contacts_collection'
3
4
  require 'cgi'
@@ -8,11 +9,9 @@ module RPXNow
8
9
  attr_accessor :api_key
9
10
  attr_accessor :api_version
10
11
  attr_accessor :domain
11
-
12
+
12
13
  self.api_version = 2
13
14
  self.domain = 'rpxnow.com'
14
-
15
- VERSION = File.read( File.join(File.dirname(__FILE__),'..','VERSION') ).strip
16
15
 
17
16
  # retrieve the users data
18
17
  # - cleaned Hash
@@ -101,7 +100,8 @@ module RPXNow
101
100
  # popup window for rpx login
102
101
  # options: :language, :flags, :unobtrusive, :api_version, :default_provider, :html
103
102
  def popup_code(text, subdomain, url, options = {})
104
- if options[:unobtrusive]
103
+ options = options.dup
104
+ if options.delete(:unobtrusive)
105
105
  unobtrusive_popup_code(text, subdomain, url, options)
106
106
  else
107
107
  obtrusive_popup_code(text, subdomain, url, options)
@@ -129,7 +129,14 @@ module RPXNow
129
129
  # url for unobtrusive popup window
130
130
  # options: :language, :flags, :api_version, :default_provider
131
131
  def popup_url(subdomain, url, options={})
132
- "#{Api.host(subdomain)}/openid/v#{extract_version(options)}/signin?#{embed_params(url, options)}"
132
+ case options.delete(:fallback_url)
133
+ when :legacy
134
+ "#{Api.host(subdomain)}/openid/v#{extract_version(options)}/signin?#{embed_params(url, options)}"
135
+ when :disable
136
+ "javacsript:void(0)"
137
+ else
138
+ "#{Api.host(subdomain)}/openid/embed?#{embed_params(url, options)}"
139
+ end
133
140
  end
134
141
 
135
142
  def extract_version(options)
@@ -175,7 +182,6 @@ module RPXNow
175
182
  end
176
183
 
177
184
  def unobtrusive_popup_code(text, subdomain, url, options={})
178
- options = options.dup
179
185
  html_options = options.delete(:html) || {}
180
186
  html_options[:class] = "rpxnow #{html_options[:class]}".strip
181
187
  html_options[:href] ||= popup_url(subdomain, url, options)
@@ -196,4 +202,4 @@ module RPXNow
196
202
  class ServerError < RuntimeError; end #backwards compatibility / catch all
197
203
  class ApiError < ServerError; end
198
204
  class ServiceUnavailableError < ServerError; end
199
- end
205
+ end
@@ -0,0 +1,3 @@
1
+ module RPXNow
2
+ VERSION = "0.7.0"
3
+ end
metadata CHANGED
@@ -1,106 +1,70 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rpx_now
3
- version: !ruby/object:Gem::Version
4
- hash: 55
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 6
9
- - 24
10
- version: 0.6.24
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Michael Grosser
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-02-21 00:00:00 +01:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
22
- requirement: &id001 !ruby/object:Gem::Requirement
12
+ date: 2013-06-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: json_pure
16
+ requirement: !ruby/object:Gem::Requirement
23
17
  none: false
24
- requirements:
25
- - - ">="
26
- - !ruby/object:Gem::Version
27
- hash: 3
28
- segments:
29
- - 0
30
- version: "0"
31
- prerelease: false
32
- version_requirements: *id001
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :runtime
34
- name: json_pure
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
35
30
  description:
36
31
  email: grosser.michael@gmail.com
37
32
  executables: []
38
-
39
33
  extensions: []
40
-
41
34
  extra_rdoc_files: []
42
-
43
- files:
44
- - CHANGELOG
45
- - Gemfile
46
- - Gemfile.lock
47
- - MIGRATION
48
- - Rakefile
49
- - Readme.md
50
- - VERSION
35
+ files:
51
36
  - certs/ssl_cert.pem
52
- - init.rb
53
37
  - lib/rpx_now.rb
54
38
  - lib/rpx_now/api.rb
55
39
  - lib/rpx_now/contacts_collection.rb
56
40
  - lib/rpx_now/user_integration.rb
57
41
  - lib/rpx_now/user_proxy.rb
58
- - rpx_now.gemspec
59
- - spec/fixtures/get_contacts_response.json
60
- - spec/integration/mapping_spec.rb
61
- - spec/rpx_now/api_spec.rb
62
- - spec/rpx_now/contacts_collection_spec.rb
63
- - spec/rpx_now/user_proxy_spec.rb
64
- - spec/rpx_now_spec.rb
65
- - spec/spec_helper.rb
66
- has_rdoc: true
67
- homepage: http://github.com/grosser/rpx_now
42
+ - lib/rpx_now/version.rb
43
+ homepage: https://github.com/grosser/rpx_now
68
44
  licenses: []
69
-
70
45
  post_install_message:
71
46
  rdoc_options: []
72
-
73
- require_paths:
47
+ require_paths:
74
48
  - lib
75
- required_ruby_version: !ruby/object:Gem::Requirement
49
+ required_ruby_version: !ruby/object:Gem::Requirement
76
50
  none: false
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- hash: 3
81
- segments:
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ segments:
82
56
  - 0
83
- version: "0"
84
- required_rubygems_version: !ruby/object:Gem::Requirement
57
+ hash: -2533672090780588692
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
59
  none: false
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- hash: 3
90
- segments:
91
- - 0
92
- version: "0"
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
93
64
  requirements: []
94
-
95
65
  rubyforge_project:
96
- rubygems_version: 1.4.2
66
+ rubygems_version: 1.8.25
97
67
  signing_key:
98
68
  specification_version: 3
99
69
  summary: Helper to simplify RPX Now user login/creation
100
- test_files:
101
- - spec/integration/mapping_spec.rb
102
- - spec/rpx_now/api_spec.rb
103
- - spec/rpx_now/contacts_collection_spec.rb
104
- - spec/rpx_now/user_proxy_spec.rb
105
- - spec/rpx_now_spec.rb
106
- - spec/spec_helper.rb
70
+ test_files: []
data/CHANGELOG DELETED
@@ -1,38 +0,0 @@
1
- 0.6.13
2
- ------
3
- * return an indifferent hash from user_data when possible
4
-
5
- 0.6.12
6
- -----
7
- * url encode obstrusive popup code token-url
8
- 0.6.0
9
- -----
10
- * removed optional api key as parameter: RPXNow.user_data(token, api_key, options) --> RPXNow.user_data(token, options), you may use :apiKey=>... instead
11
-
12
- 0.5.9
13
- -----
14
- * Switched from Get to Post requests
15
-
16
- 0.5.0
17
- ----
18
- * ApiError is raised when API KEY was invalid (before did only return nil)
19
- * ServerError is now seperated into ApiError and ServiceUnavailableError
20
-
21
- 0.4.2
22
- ----
23
- * default IDs are strings, not integers, since RPX supports both
24
- * Added username field to standart parameters
25
-
26
- 0.4
27
- ----
28
- * The RPXNow.api_version= can be set globally
29
- * Most methods now support :api_version=>'123', so you can specify the api_version on each call
30
- * Added support for unobtrusive code generation. This will make the gem play nicely with developers creating unobtrusive pages with frameworks such as jQuery;
31
- * The RPXNOW JSON responses are now parsed by Florian Frank JSON gem (http://json.rubyforge.org/);
32
- * Removed the dependency of ActiveSupport. However, if present, ActiveSupport will be used due to its convenience methods Array#to_query and Hash#to_query.
33
- * Added support for multiple versions of the widget. By default, everything will point to version 2;
34
- * The specs have been updated.
35
-
36
- 0.3
37
- ----
38
- * RPXNow::ServerError will be thrown when something is invalid/goes wrong, so watch out (not for invalid tokens in user_data)...
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- # not used, just for hardcore-bundlers
2
- source :rubygems
3
-
4
- group :dev do
5
- gem "rake"
6
- gem "json"
7
- gem "jeweler"
8
- end
9
-
10
- group :test do
11
- gem "rspec", "~>2"
12
- end
@@ -1,28 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- diff-lcs (1.1.2)
5
- git (1.2.5)
6
- jeweler (1.5.2)
7
- bundler (~> 1.0.0)
8
- git (>= 1.2.5)
9
- rake
10
- json (1.4.6)
11
- rake (0.8.7)
12
- rspec (2.5.0)
13
- rspec-core (~> 2.5.0)
14
- rspec-expectations (~> 2.5.0)
15
- rspec-mocks (~> 2.5.0)
16
- rspec-core (2.5.1)
17
- rspec-expectations (2.5.0)
18
- diff-lcs (~> 1.1.2)
19
- rspec-mocks (2.5.0)
20
-
21
- PLATFORMS
22
- ruby
23
-
24
- DEPENDENCIES
25
- jeweler
26
- json
27
- rake
28
- rspec (~> 2)
data/MIGRATION DELETED
@@ -1,9 +0,0 @@
1
- class AddIdentifierToUsers < ActiveRecord::Migration
2
- def self.up
3
- add_column :users, :identifier, :string
4
- end
5
-
6
- def self.down
7
- remove_column :users, :identifier
8
- end
9
- end
data/Rakefile DELETED
@@ -1,22 +0,0 @@
1
- task :default => :spec
2
- require "rspec/core/rake_task"
3
- RSpec::Core::RakeTask.new(:spec) do |t|
4
- t.rspec_opts = '--backtrace --color'
5
- end
6
-
7
- begin
8
- require 'jeweler'
9
-
10
- Jeweler::Tasks.new do |gem|
11
- gem.name = 'rpx_now'
12
- gem.summary = "Helper to simplify RPX Now user login/creation"
13
- gem.email = "grosser.michael@gmail.com"
14
- gem.homepage = "http://github.com/grosser/#{gem.name}"
15
- gem.authors = ["Michael Grosser"]
16
- gem.add_dependency ['json_pure']
17
- end
18
-
19
- Jeweler::GemcutterTasks.new
20
- rescue LoadError
21
- puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
22
- end
data/Readme.md DELETED
@@ -1,166 +0,0 @@
1
- [RPX](http://rpxnow.com) allows users to login to your page through Facebook / Twitter / Myspace / Google / OpenId / MS-LiveId / AOL / ...
2
-
3
- - Simpler then OpenId/OAuth/xxx for developers AND users
4
- - Publish user activity to facebook/twitter/myspace/.../-stream
5
- - Returning users are greeted by their provider
6
-
7
- ![Single Interface for all providers](https://s3.amazonaws.com/static.rpxnow.com/rel/img/a481ed2afccd255350cccd738050f873.png)
8
- ![Share comments and activities](https://s3.amazonaws.com/static.rpxnow.com/rel/img/50bdccdb32b6ae68d46908a531492b28.png)
9
- ![Visitors choose from providers they already have](https://s3.amazonaws.com/static.rpxnow.com/rel/img/f4a6e65808eefcf8754588c71f84c142.png)
10
-
11
- Usage
12
- =====
13
- - Get an API key @ [RPX](http://rpxnow.com)
14
- - run [MIGRATION](http://github.com/grosser/rpx_now/raw/master/MIGRATION)
15
- - Build login view
16
- - Receive user-data from RPX to create or login User
17
- - for more advanced features have a look at the [RPX API Docs](https://rpxnow.com/docs)
18
-
19
- Install
20
- =======
21
- - As Rails plugin: `script/plugin install git://github.com/grosser/rpx_now.git `
22
- - As gem: `sudo gem install rpx_now`
23
-
24
- Examples
25
- ========
26
-
27
- [Example application](http://github.com/grosser/rpx_now_example), go play around!
28
-
29
- environment.rb
30
- --------------
31
- Rails::Initializer.run do |config|
32
- config.gem "rpx_now"
33
- ...
34
-
35
- config.after_initialize do # so rake gems:install works
36
- RPXNow.api_key = "YOU RPX API KEY"
37
- end
38
- end
39
-
40
- Controller
41
- ----------
42
- This example uses the SessionsController, if you dont have one built it and add routes(rpx_token is a post request)
43
-
44
- skip_before_filter :verify_authenticity_token, :only => [:rpx_token] # RPX does not pass Rails form tokens...
45
-
46
- # user_data
47
- # found: {:name=>'John Doe', :username => 'john', :email=>'john@doe.com', :identifier=>'blug.google.com/openid/dsdfsdfs3f3'}
48
- # not found: nil (can happen with e.g. invalid tokens)
49
- def rpx_token
50
- raise "hackers?" unless data = RPXNow.user_data(params[:token])
51
- self.current_user = User.find_by_identifier(data[:identifier]) || User.create!(data)
52
- redirect_to '/'
53
- end
54
-
55
- # getting additional profile fields (these fields are rarely filled)
56
- # all possibilities: https://rpxnow.com/docs#profile_data
57
- data = RPXNow.user_data(params[:token], :additional => [:gender, :birthday, :photo, :providerName, ...])
58
-
59
- # normal + raw data
60
- RPXNow.user_data(params[:token], :additional => [:raw_response])[:raw_response]['profile]['verifiedEmail']
61
-
62
- # only raw data
63
- email = RPXNow.user_data(params[:token], :raw_response => true)['profile']['verifiedEmail']
64
-
65
- # with extended info like friends, accessCredentials, portable contacts. (most Providers do not supply them)
66
- RPXNow.user_data(params[:token], :extended => true)[:extended]['friends'][...have a look at the RPX API DOCS...]
67
-
68
- View
69
- ----
70
-
71
- <%=RPXNow.embed_code('My-Rpx-Domain', url_for(:controller=>:session, :action=>:rpx_token, :only_path => false))%>
72
- OR
73
- <%=RPXNow.popup_code('Login here...', 'My-Rpx-Domain', url_for(:controller=>:session, :action=>:rpx_token, :only_path => false), options)%>
74
-
75
- ###Options
76
- `:language=>'en'` rpx tries to detect the users language, but you may overwrite it [possible languages](https://rpxnow.com/docs#sign-in_localization)
77
- `:default_provider=>'google'` [possible default providers](https://rpxnow.com/docs#sign-in_default_provider)
78
- `:flags=>'show_provider_list'` [possible flags](https://rpxnow.com/docs#sign-in_interface)
79
- `:html => {:id => 'xxx'}` is added to the popup link (popup_code only)
80
-
81
- ###Unobtrusive / JS-last
82
- `popup_code` can also be called with `:unobtrusive=>true` ( --> just link without javascript include).
83
- To still get the normal popup add `RPXNow.popup_source('My-Rpx-Domain', url_for(:controller=>:session, :action=>:rpx_token, :only_path => false), [options])`.
84
- Options like :language / :flags should be given for both.
85
-
86
- Advanced
87
- --------
88
- ### Versions
89
- RPXNow.api_version = 2
90
-
91
- ### Custom domain (PRX Plus/Pro)
92
- RPXNow.domain = 'other-domain.com'
93
-
94
- ### Mappings (PRX Plus/Pro)
95
- You can map your primary keys (e.g. user.id) to identifiers, so that<br/>
96
- users can login to the same account with multiple identifiers.
97
- RPXNow.map(identifier, primary_key) #add a mapping
98
- RPXNow.unmap(identifier, primary_key) #remove a mapping
99
- RPXNow.mappings(primary_key) # [identifier1,identifier2,...]
100
- RPXNow.all_mappings # [["1",['google.com/dsdas','yahoo.com/asdas']], ["2",[...]], ... ]
101
-
102
- After a primary key is mapped to an identifier, when a user logs in with this identifier,
103
- `RPXNow.user_data` will contain his `primaryKey` as `:id`.
104
- A identifyer can only belong to one user (in doubt the last one it was mapped to)
105
-
106
- ### User integration (e.g. ActiveRecord)
107
- class User < ActiveRecord::Base
108
- include RPXNow::UserIntegration
109
- end
110
-
111
- user.rpx.identifiers == RPXNow.mappings(user.id)
112
- user.rpx.map(identifier) == RPXNow.map(identifier, user.id)
113
- user.rpx.unmap(identifier) == RPXNow.unmap(identifier, user.id)
114
-
115
- ### Contacts (PRX Pro)
116
- Retrieve all contacts for a given user:
117
- RPXNow.contacts(identifier).each {|c| puts "#{c['displayName']}: #{c['emails']}}
118
-
119
- ### Status updates (PRX Plus/Pro)
120
- Send a status update to provider (a tweet/facebook-status/...) :
121
- RPXNow.set_status(identifier, "I just registered at yourdomain.com ...")
122
-
123
- ### Activity (RPX Plus/Pro)
124
- Post a users activity, on their e.g. Facebook profile, complete with images, titels, rating, additional media, customized links and so on ...
125
- RPXNow.activity( identifier,
126
- :url=>href, :action=>'Im loving my new', :user_generated_content=>'Im loving my new ... ',
127
- :title=>product.title, :description=>product.description,
128
- :action_links=>[{:text=>'view >>', :href=>product_url(product, :only_path => false)}],
129
- :media=>[{:type=>:image, :src=>product.image_url, :href=>product_url(product, :only_path => false)}]
130
- }
131
-
132
- ### Offline user data access (RPX Plus/Pro)
133
- Same response as auth_info but can be called with a identifier at any time.<br/>
134
- Offline Profile Access must be enabled.
135
- RPXNow.get_user_data(identifier, :extended => true)
136
-
137
- ### Auth info
138
- Same response as user_data with :raw_response, but without any kind of failure detection or post processing.
139
- RPXNow.auth_info(params[:token])
140
-
141
- Author
142
- ======
143
-
144
- __[rpx_now_gem mailing list](http://groups.google.com/group/rpx_now_gem)__
145
-
146
-
147
- ### [Contributors](http://github.com/grosser/rpx_now/contributors)
148
- - [Amunds](http://github.com/Amunds)
149
- - [Bob Groeneveld](http://metathoughtfacility.blogspot.com)
150
- - [DBA](http://github.com/DBA)
151
- - [dbalatero](http://github.com/dbalatero)
152
- - [Paul Gallagher](http://tardate.blogspot.com/)
153
- - [jackdempsey](http://jackndempsey.blogspot.com)
154
- - [Patrick Reagan (reagent)](http://sneaq.net)
155
- - [Joris Trooster (trooster)](http://www.interstroom.nl)
156
- - [Mick Staugaard (staugaard)](http://mick.staugaard.com/)
157
- - [Kasper Weibel](http://github.com/weibel)
158
- - [Nicolas Alpi](http://www.notgeeklycorrect.com)
159
- - [Ladislav Martincik](http://martincik.com)
160
- - [Ben Aldred](http://github.com/benaldred)
161
- - [Casper Fabricius](http://casperfabricius.com)
162
- - [Avi Flombaum](http://www.aviflombaum.com)
163
-
164
- [Michael Grosser](http://grosser.it)<br/>
165
- michael@grosser.it<br/>
166
- Hereby placed under public domain, do what you want, just do not hold me accountable...
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 0.6.24
data/init.rb DELETED
@@ -1,2 +0,0 @@
1
- #Needed to load rpx_now when used as Rails plugin
2
- require 'rpx_now'
@@ -1,63 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = %q{rpx_now}
8
- s.version = "0.6.24"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Michael Grosser"]
12
- s.date = %q{2011-02-21}
13
- s.email = %q{grosser.michael@gmail.com}
14
- s.files = [
15
- "CHANGELOG",
16
- "Gemfile",
17
- "Gemfile.lock",
18
- "MIGRATION",
19
- "Rakefile",
20
- "Readme.md",
21
- "VERSION",
22
- "certs/ssl_cert.pem",
23
- "init.rb",
24
- "lib/rpx_now.rb",
25
- "lib/rpx_now/api.rb",
26
- "lib/rpx_now/contacts_collection.rb",
27
- "lib/rpx_now/user_integration.rb",
28
- "lib/rpx_now/user_proxy.rb",
29
- "rpx_now.gemspec",
30
- "spec/fixtures/get_contacts_response.json",
31
- "spec/integration/mapping_spec.rb",
32
- "spec/rpx_now/api_spec.rb",
33
- "spec/rpx_now/contacts_collection_spec.rb",
34
- "spec/rpx_now/user_proxy_spec.rb",
35
- "spec/rpx_now_spec.rb",
36
- "spec/spec_helper.rb"
37
- ]
38
- s.homepage = %q{http://github.com/grosser/rpx_now}
39
- s.require_paths = ["lib"]
40
- s.rubygems_version = %q{1.4.2}
41
- s.summary = %q{Helper to simplify RPX Now user login/creation}
42
- s.test_files = [
43
- "spec/integration/mapping_spec.rb",
44
- "spec/rpx_now/api_spec.rb",
45
- "spec/rpx_now/contacts_collection_spec.rb",
46
- "spec/rpx_now/user_proxy_spec.rb",
47
- "spec/rpx_now_spec.rb",
48
- "spec/spec_helper.rb"
49
- ]
50
-
51
- if s.respond_to? :specification_version then
52
- s.specification_version = 3
53
-
54
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
55
- s.add_runtime_dependency(%q<json_pure>, [">= 0"])
56
- else
57
- s.add_dependency(%q<json_pure>, [">= 0"])
58
- end
59
- else
60
- s.add_dependency(%q<json_pure>, [">= 0"])
61
- end
62
- end
63
-
@@ -1,58 +0,0 @@
1
- {
2
- "response": {
3
- "itemsPerPage": 5,
4
- "totalResults": 5,
5
- "entry": [
6
- {
7
- "displayName": "Bob Johnson",
8
- "emails": [
9
- {
10
- "type": "other",
11
- "value": "bob@example.com"
12
- }
13
- ]
14
- },
15
- {
16
- "displayName": "Cindy Smith",
17
- "emails": [
18
- {
19
- "type": "other",
20
- "value": "cindy.smith@example.com"
21
- }
22
- ]
23
- },
24
- {
25
- "displayName": "Fred Williams",
26
- "emails": [
27
- {
28
- "type": "other",
29
- "value": "fred.williams@example.com"
30
- },
31
- {
32
- "type": "other",
33
- "value": "fred@example.com"
34
- }
35
- ]
36
- },
37
- {
38
- "emails": [
39
- {
40
- "type": "other",
41
- "value": "j.lewis@example.com"
42
- }
43
- ]
44
- },
45
- {
46
- "displayName": "Mary Jones",
47
- "emails": [
48
- {
49
- "type": "other",
50
- "value": "mary.jones@example.com"
51
- }
52
- ]
53
- }
54
- ],
55
- "startIndex": 1
56
- },
57
- "stat": "ok"
58
- }
@@ -1,40 +0,0 @@
1
- require 'spec/spec_helper'
2
-
3
- describe RPXNow do
4
- describe :mapping_integration do
5
- before do
6
- @k1 = 'http://test.myopenid.com'
7
- RPXNow.unmap(@k1, 1)
8
- @k2 = 'http://test-2.myopenid.com'
9
- RPXNow.unmap(@k2, 1)
10
- end
11
-
12
- it "has no mappings when nothing was mapped" do
13
- RPXNow.mappings(1).should == []
14
- end
15
-
16
- it "unmaps mapped keys" do
17
- RPXNow.map(@k2, 1)
18
- RPXNow.unmap(@k2, 1)
19
- RPXNow.mappings(1).should == []
20
- end
21
-
22
- it "maps keys to a primary key and then retrieves them" do
23
- RPXNow.map(@k1, 1)
24
- RPXNow.map(@k2, 1)
25
- RPXNow.mappings(1).sort.should == [@k2,@k1]
26
- end
27
-
28
- it "does not add duplicate mappings" do
29
- RPXNow.map(@k1, 1)
30
- RPXNow.map(@k1, 1)
31
- RPXNow.mappings(1).should == [@k1]
32
- end
33
-
34
- it "finds all mappings" do
35
- RPXNow.map(@k1, 1)
36
- RPXNow.map(@k2, 2)
37
- RPXNow.all_mappings.sort.should == [["1", ["http://test.myopenid.com"]], ["2", ["http://test-2.myopenid.com"]]]
38
- end
39
- end
40
- end
@@ -1,50 +0,0 @@
1
- require 'spec/spec_helper'
2
-
3
- describe RPXNow::Api do
4
- describe 'ssl cert' do
5
- it "has an absolute path" do
6
- RPXNow::Api::SSL_CERT[0..0].should == File.expand_path( RPXNow::Api::SSL_CERT )[0..0] # start with '/' on *nix, drive letter on win
7
- end
8
-
9
- it "exists" do
10
- File.read(RPXNow::Api::SSL_CERT).to_s.should_not be_empty
11
- end
12
- end
13
-
14
- describe :parse_response do
15
- it "parses json when status is ok" do
16
- response = mock(:code=>'200', :body=>%Q({"stat":"ok","data":"xx"}))
17
- RPXNow::Api.send(:parse_response, response)['data'].should == "xx"
18
- end
19
-
20
- it "raises when there is a communication error" do
21
- response = stub(:code=>'200', :body=>%Q({"err":"wtf","stat":"ok"}))
22
- lambda{
23
- RPXNow::Api.send(:parse_response,response)
24
- }.should raise_error(RPXNow::ApiError)
25
- end
26
-
27
- it "raises when service has downtime" do
28
- response = stub(:code=>'200', :body=>%Q({"err":{"code":-1},"stat":"ok"}))
29
- lambda{
30
- RPXNow::Api.send(:parse_response,response)
31
- }.should raise_error(RPXNow::ServiceUnavailableError)
32
- end
33
-
34
- it "raises when service is down" do
35
- response = stub(:code=>'400',:body=>%Q({"stat":"err"}))
36
- lambda{
37
- RPXNow::Api.send(:parse_response,response)
38
- }.should raise_error(RPXNow::ServiceUnavailableError)
39
- end
40
- end
41
-
42
- describe :request_object do
43
- it "converts symbols to string keys" do
44
- mock = ''
45
- mock.should_receive(:form_data=).with([['symbol', 'value']])
46
- Net::HTTP::Post.should_receive(:new).and_return(mock)
47
- RPXNow::Api.send(:request_object, 'something', :symbol=>'value')
48
- end
49
- end
50
- end
@@ -1,32 +0,0 @@
1
- require 'spec/spec_helper'
2
-
3
- describe RPXNow::ContactsCollection do
4
- before do
5
- data = JSON.parse(File.read('spec/fixtures/get_contacts_response.json'))['response']
6
- @collection = RPXNow::ContactsCollection.new(data)
7
- end
8
-
9
- it "behaves like an array" do
10
- @collection.size.should == 5
11
- @collection[0] = "1"
12
- @collection[0].should == "1"
13
- end
14
-
15
- it "parses entry to items" do
16
- @collection[0]['displayName'].should == "Bob Johnson"
17
- end
18
-
19
- it "parses emails to list" do
20
- @collection[0]['emails'].should == ["bob@example.com"]
21
- end
22
-
23
- it "parses emails to list with multiple emails" do
24
- @collection[2]['emails'].should == ["fred.williams@example.com","fred@example.com"]
25
- end
26
-
27
- it "holds additional_info" do
28
- @collection.additional_info['startIndex'].should == 1
29
- @collection.additional_info['itemsPerPage'].should == 5
30
- @collection.additional_info['totalResults'].should == 5
31
- end
32
- end
@@ -1,33 +0,0 @@
1
- require 'spec/spec_helper'
2
- require 'rpx_now/user_integration'
3
-
4
- class User
5
- include RPXNow::UserIntegration
6
-
7
- def id
8
- 5
9
- end
10
- end
11
-
12
- describe RPXNow::UserProxy do
13
- before { @user = User.new }
14
-
15
- it "has a proxy" do
16
- @user.rpx.class.should == RPXNow::UserProxy
17
- end
18
-
19
- it "has identifiers" do
20
- RPXNow.should_receive(:mappings).with(@user.id).and_return(['identifiers'])
21
- @user.rpx.identifiers.should == ['identifiers']
22
- end
23
-
24
- it "can map" do
25
- RPXNow.should_receive(:map).with('identifier', @user.id)
26
- @user.rpx.map('identifier')
27
- end
28
-
29
- it "can unmap" do
30
- RPXNow.should_receive(:unmap).with('identifier', @user.id)
31
- @user.rpx.unmap('identifier')
32
- end
33
- end
@@ -1,414 +0,0 @@
1
- require 'spec/spec_helper'
2
-
3
- describe RPXNow do
4
- def fake_response(replace={})
5
- body = {'stat' => 'ok'}.merge(replace)
6
- mock({:code => "200", :body => body.to_json})
7
- end
8
-
9
- describe :domain do
10
- it 'defaults to rpxnow.com' do
11
- RPXNow.domain.should == 'rpxnow.com'
12
- end
13
- end
14
-
15
- describe :domain= do
16
- it "is stored" do
17
- RPXNow.domain = 'domain.com'
18
- RPXNow.domain.should == 'domain.com'
19
- end
20
- end
21
-
22
- describe :api_key= do
23
- before do
24
- RPXNow.api_key='XX'
25
- end
26
-
27
- it "is stored" do
28
- RPXNow.api_key.should == 'XX'
29
- end
30
-
31
- it "stores the api key, so i do not have to supply everytime" do
32
- RPXNow::Api.should_receive(:request).
33
- with(anything, hash_including(:apiKey => 'XX')).
34
- and_return fake_response
35
- RPXNow.mappings(1)
36
- end
37
-
38
- it "is not overwritten when overwriting for a single request" do
39
- RPXNow::Api.should_receive(:request).
40
- with(anything, hash_including(:apiKey => 'YY')).
41
- and_return fake_response
42
- RPXNow.mappings(1, :apiKey => 'YY')
43
- RPXNow.api_key.should == 'XX'
44
- end
45
- end
46
-
47
- describe :api_version= do
48
- it "is 2 by default" do
49
- RPXNow.api_version.should == 2
50
- end
51
-
52
- it "is stored" do
53
- RPXNow.api_version='XX'
54
- RPXNow.api_version.should == 'XX'
55
- end
56
-
57
- it "used for every request" do
58
- RPXNow.api_version='XX'
59
- RPXNow::Api.should_receive(:request).
60
- with('/api/vXX/mappings', anything).
61
- and_return fake_response
62
- RPXNow.mappings(1)
63
- end
64
-
65
- it "is not overwritten when overwriting for a single request" do
66
- RPXNow.api_version='XX'
67
- RPXNow::Api.should_receive(:request).
68
- with('/api/vYY/mappings', anything).
69
- and_return fake_response
70
- RPXNow.mappings(1, :api_version => 'YY')
71
- RPXNow.api_version.should == 'XX'
72
- end
73
-
74
- it "is not passed in data for request" do
75
- RPXNow.api_version='XX'
76
- RPXNow::Api.should_receive(:request).
77
- with(anything, hash_not_including(:api_version => 'YY')).
78
- and_return fake_response
79
- RPXNow.mappings(1, :api_version => 'YY')
80
- end
81
- end
82
-
83
- describe :embed_code do
84
- it "contains the subdomain" do
85
- RPXNow.embed_code('xxx','my_url').should =~ /xxx/
86
- end
87
-
88
- it "contains the url" do
89
- RPXNow.embed_code('xxx','my_url').should =~ /token_url=my_url/
90
- end
91
-
92
- it "defaults to no language" do
93
- RPXNow.embed_code('xxx', 'my_url').should_not =~ /language_preference/
94
- end
95
-
96
- it "has a changeable language" do
97
- RPXNow.embed_code('xxx', 'my_url', :language => 'es').should =~ /language_preference=es/
98
- end
99
-
100
- it "defaults to 400px width" do
101
- RPXNow.embed_code('xxx', 'my_url').should =~ /width:400px;/
102
- end
103
-
104
- it "has a changeable width" do
105
- RPXNow.embed_code('xxx', 'my_url', :width => '300').should =~ /width:300px;/
106
- end
107
-
108
- it "defaults to 240px height" do
109
- RPXNow.embed_code('xxx', 'my_url').should =~ /height:240px;/
110
- end
111
-
112
- it "has a changeable height" do
113
- RPXNow.embed_code('xxx', 'my_url', :height => '500').should =~ /height:500px;/
114
- end
115
-
116
- it "has id on iframe" do
117
- RPXNow.embed_code('xxx','my_url').should =~ /id=\"rpx_now_embed\"/
118
- end
119
- end
120
-
121
- describe :popup_code do
122
- it "defaults to obtrusive output" do
123
- RPXNow.popup_code('sign on', 'subdomain', 'http://fake.domain.com/').should =~ /script src=/
124
- end
125
-
126
- it "does not change supplied options" do
127
- options = {:xxx => 1}
128
- RPXNow.popup_code('a','b','c', options)
129
- options.should == {:xxx => 1}
130
- end
131
-
132
- it "adds html params to link" do
133
- options = {:html => {:id => "xxxx"}}
134
- RPXNow.popup_code('a','b','c', options).should =~ /id="xxxx"/
135
- end
136
-
137
- it "adds rpxnow to given html class" do
138
- options = {:html => {:class => "c1 c2"}}
139
- RPXNow.popup_code('a','b','c', options).should =~ /class="rpxnow c1 c2"/
140
- end
141
-
142
- describe 'obstrusive' do
143
- it "does not encode token_url for popup" do
144
- expected = %Q(RPXNOW.token_url = 'http://fake.domain.com/')
145
- RPXNow.popup_code('sign on', 'subdomain', 'http://fake.domain.com/').should include(expected)
146
- end
147
- it "encodes token_url for unobtrusive fallback link" do
148
- expected = %Q(<a class="rpxnow" href="https://subdomain.rpxnow.com/openid/v2/signin?token_url=http%3A%2F%2Ffake.domain.com%2F">sign on</a>)
149
- RPXNow.popup_code('sign on', 'subdomain', 'http://fake.domain.com/').should include(expected)
150
- end
151
- end
152
-
153
- describe 'unobstrusive' do
154
- it "can build an unobtrusive widget with encoded token_url" do
155
- expected = %Q(<a class="rpxnow" href="https://subdomain.rpxnow.com/openid/v2/signin?token_url=http%3A%2F%2Ffake.domain.com%2F">sign on</a>)
156
- actual = RPXNow.popup_code('sign on', 'subdomain', 'http://fake.domain.com/', :unobtrusive => true)
157
- actual.should == expected
158
- end
159
-
160
- it "can change api version" do
161
- RPXNow.popup_code('x', 'y', 'z', :unobtrusive => true, :api_version => 'XX').should include("openid/vXX/signin?")
162
- end
163
-
164
- it "can change language" do
165
- RPXNow.popup_code('x', 'y', 'z', :unobtrusive => true, :language => 'XX').should include("language_preference=XX")
166
- end
167
-
168
- it "can add flags" do
169
- RPXNow.popup_code('x', 'y', 'z', :unobtrusive => true, :flags => 'test').should include("flags=test")
170
- end
171
-
172
- it "can add default_provider" do
173
- RPXNow.popup_code('x', 'y', 'z', :unobtrusive => true, :default_provider => 'test').should include("default_provider=test")
174
- end
175
- end
176
-
177
- it "allows to specify the version of the widget" do
178
- RPXNow.popup_code('x','y','z', :api_version => 300).should =~ %r(/openid/v300/signin)
179
- end
180
-
181
- it "defaults to widget version 2" do
182
- RPXNow.popup_code('x','y','z').should =~ %r(/openid/v2/signin)
183
- end
184
-
185
- describe 'language' do
186
- it "defaults to no language" do
187
- RPXNow.popup_code('x','y','z').should_not =~ /RPXNOW.language_preference/
188
- end
189
-
190
- it "has a changeable language" do
191
- RPXNow.popup_code('x','y','z', :language=>'de').should =~ /RPXNOW.language_preference = 'de'/
192
- end
193
- end
194
-
195
- describe 'flags' do
196
- it "defaults to no language" do
197
- RPXNow.popup_code('x','y','z').should_not =~ /RPXNOW.flags/
198
- end
199
-
200
- it "can have flags" do
201
- RPXNow.popup_code('x','y','z', :flags=>'test').should =~ /RPXNOW.flags = 'test'/
202
- end
203
- end
204
-
205
- describe 'default_provider' do
206
- it "defaults to no provider" do
207
- RPXNow.popup_code('x','y','z').should_not =~ /RPXNOW.default_provider/
208
- end
209
-
210
- it "can have default_provider" do
211
- RPXNow.popup_code('x','y','z', :default_provider=>'test').should =~ /RPXNOW.default_provider = 'test'/
212
- end
213
- end
214
- end
215
-
216
- describe :user_data do
217
- before do
218
- @response_body = {
219
- "profile" => {
220
- "verifiedEmail" => "grosser.michael@googlemail.com",
221
- "displayName" => "Michael Grosser",
222
- "preferredUsername" => "grosser.michael",
223
- "identifier" => "https:\/\/www.google.com\/accounts\/o8\/id?id=AItOawmaOlyYezg_WfbgP_qjaUyHjmqZD9qNIVM",
224
- "email" => "grosser.michael@gmail.com"
225
- }
226
- }
227
- @response = fake_response(@response_body)
228
- @fake_user_data = {'profile'=>{}}
229
- end
230
-
231
- it "raises ApiError when used with an invalid token" do
232
- lambda{
233
- RPXNow.user_data('xxxx')
234
- }.should raise_error(RPXNow::ApiError)
235
- end
236
-
237
- it "is empty when used with an unknown token" do
238
- RPXNow.user_data('60d8c6374f4e9d290a7b55f39da7cc6435aef3d3').should == nil
239
- end
240
-
241
- it "parses JSON response to user data" do
242
- expected = {
243
- :name => 'Michael Grosser',
244
- :email => 'grosser.michael@googlemail.com',
245
- :identifier => 'https://www.google.com/accounts/o8/id?id=AItOawmaOlyYezg_WfbgP_qjaUyHjmqZD9qNIVM',
246
- :username => 'grosser.michael',
247
- }
248
- RPXNow::Api.should_receive(:request).and_return @response
249
- RPXNow.user_data('').should == expected
250
- end
251
-
252
- it "deprecated: adds raw profile data if i want it" do
253
- RPXNow::Api.should_receive(:request).and_return @response
254
- RPXNow.should_receive(:warn)
255
- RPXNow.user_data('',:additional => [:raw])[:raw]["verifiedEmail"].should == "grosser.michael@googlemail.com"
256
- end
257
-
258
- it "adds raw data if i want it" do
259
- RPXNow::Api.should_receive(:request).and_return @response
260
- RPXNow.user_data('',:additional => [:raw_response])[:raw_response]['profile']["verifiedEmail"].should == "grosser.michael@googlemail.com"
261
- end
262
-
263
- it "adds a :id when primaryKey was returned" do
264
- @response_body['profile']['primaryKey'] = "2"
265
- response = fake_response(@response_body)
266
- RPXNow::Api.should_receive(:request).and_return response
267
- RPXNow.user_data('')[:id].should == '2'
268
- end
269
-
270
- it "handles primaryKeys that are not numeric" do
271
- @response_body['profile']['primaryKey'] = "dbalatero"
272
- response = fake_response(@response_body)
273
- RPXNow::Api.should_receive(:request).and_return response
274
- RPXNow.user_data('')[:id].should == 'dbalatero'
275
- end
276
-
277
- it "can fetch additional fields" do
278
- @response_body['profile']['xxxy'] = "test"
279
- response = fake_response(@response_body)
280
- RPXNow::Api.should_receive(:request).and_return response
281
- RPXNow.user_data('', :additional => [:xxxy])[:xxxy].should == 'test'
282
- end
283
-
284
- it "hands JSON response to supplied block" do
285
- RPXNow::Api.should_receive(:request).and_return @response
286
- response = nil
287
- RPXNow.user_data(''){|data| response = data}
288
- response.delete('stat') # dunno why it happens, but is not important...
289
- response.should == @response_body
290
- end
291
-
292
- it "returns what the supplied block returned" do
293
- RPXNow::Api.should_receive(:request).and_return @response
294
- RPXNow.user_data(''){|data| "x"}.should == 'x'
295
- end
296
-
297
- it "can request extended data" do
298
- RPXNow::Api.should_receive(:request).
299
- with(anything, hash_including(:extended => true)).
300
- and_return @response
301
- RPXNow.user_data('', :extended=>true)
302
- end
303
-
304
- it "returns extended data as an additional field" do
305
- @response_body['friends'] = {'x' => 1}
306
- @response = fake_response(@response_body)
307
-
308
- RPXNow::Api.should_receive(:request).and_return @response
309
- RPXNow.user_data('', :extended=>true)[:extended].should == {'friends' => {'x' => 1}}
310
- end
311
-
312
- it "does not pass raw_response to RPX" do
313
- RPXNow::Api.should_receive(:request).
314
- with(anything, hash_not_including(:raw_response => true)).
315
- and_return @response
316
- RPXNow.user_data('', :raw_response=>true)
317
- end
318
-
319
- it "can return a raw_response" do
320
- RPXNow::Api.should_receive(:request).and_return @response
321
- RPXNow.user_data('', :raw_response=>true).should == @response_body.merge('stat' => 'ok')
322
- end
323
-
324
- # these 2 tests are kind of duplicates of the api_version/key tests,
325
- # but i want to be extra-sure user_data works
326
- it "works with api version as option" do
327
- RPXNow::Api.should_receive(:request).
328
- with('/api/v123/auth_info', anything).
329
- and_return @response
330
- RPXNow.user_data('id', :extended=>'abc', :api_version=>123)
331
- RPXNow.api_version.should == API_VERSION
332
- end
333
-
334
- it "works with apiKey as option" do
335
- RPXNow::Api.should_receive(:request).
336
- with('/api/v2/auth_info', hash_including(:apiKey=>'THE KEY')).
337
- and_return @response
338
- RPXNow.user_data('id', :extended=>'abc', :apiKey=>'THE KEY')
339
- RPXNow.api_key.should == API_KEY
340
- end
341
- end
342
-
343
- describe :set_status do
344
- it "sets the status" do
345
- RPXNow::Api.should_receive(:request).
346
- with("/api/v2/set_status", :identifier=>"identifier", :status=>"Chillen...", :apiKey=>API_KEY).
347
- and_return fake_response
348
- RPXNow.set_status('identifier', 'Chillen...')
349
- end
350
- end
351
-
352
- describe :activity do
353
- it "does a api call with the right arguments" do
354
- RPXNow::Api.should_receive(:request).with("/api/v2/activity", :identifier=>"identifier", :activity=>'{"test":"something"}', :apiKey=>API_KEY).and_return fake_response
355
- RPXNow.activity('identifier', :test => 'something')
356
- end
357
-
358
- it "can pass identifier/apiKey" do
359
- RPXNow::Api.should_receive(:request).with("/api/v66666/activity", hash_including(:apiKey=>'MYKEY')).and_return fake_response
360
- RPXNow.activity('identifier', {:test => 'something'}, :apiKey => 'MYKEY', :api_version => '66666')
361
- end
362
- end
363
-
364
- describe :parse_user_data do
365
- it "reads secondary names" do
366
- RPXNow.send(:parse_user_data,{'profile'=>{'preferredUsername'=>'1'}}, {})[:name].should == '1'
367
- end
368
-
369
- it "parses email when no name is found" do
370
- RPXNow.send(:parse_user_data,{'profile'=>{'email'=>'1@xxx.com'}}, {})[:name].should == '1'
371
- end
372
- end
373
-
374
- describe :contacts do
375
- it "finds all contacts" do
376
- response = fake_response(JSON.parse(File.read('spec/fixtures/get_contacts_response.json')))
377
- RPXNow::Api.should_receive(:request).
378
- with('/api/v2/get_contacts',:identifier=>'xx', :apiKey=>API_KEY).
379
- and_return response
380
- RPXNow.contacts('xx').size.should == 5
381
- end
382
- end
383
-
384
- describe :mappings do
385
- it "shows all mappings" do
386
- RPXNow::Api.should_receive(:request).
387
- with("/api/v2/mappings", :apiKey=>API_KEY, :primaryKey=>1).
388
- and_return fake_response("identifiers" => ["http://test.myopenid.com/"])
389
- RPXNow.mappings(1).should == ["http://test.myopenid.com/"]
390
- end
391
- end
392
-
393
- describe :map do
394
- it "maps a identifier" do
395
- RPXNow::Api.should_receive(:request).
396
- with("/api/v2/map", :apiKey=>API_KEY, :primaryKey=>1, :identifier=>"http://test.myopenid.com").
397
- and_return fake_response
398
- RPXNow.map('http://test.myopenid.com',1)
399
- end
400
- end
401
-
402
- describe :unmap do
403
- it "unmaps a indentifier" do
404
- RPXNow::Api.should_receive(:request).
405
- with("/api/v2/unmap", :apiKey=>API_KEY, :primaryKey=>1, :identifier=>"http://test.myopenid.com").
406
- and_return fake_response
407
- RPXNow.unmap('http://test.myopenid.com', 1)
408
- end
409
- end
410
-
411
- it "has a VERSION" do
412
- RPXNow::VERSION.should =~ /^\d+\.\d+\.\d+$/
413
- end
414
- end
@@ -1,16 +0,0 @@
1
- $LOAD_PATH << File.expand_path("../lib", File.dirname(__FILE__))
2
-
3
- # ---- setup environment/plugin
4
- require File.expand_path("../init", File.dirname(__FILE__))
5
- API_KEY = '4b339169026742245b754fa338b9b0aebbd0a733'
6
- API_VERSION = RPXNow.api_version
7
- DOMAIN = RPXNow.domain
8
-
9
- # ---- rspec
10
- RSpec.configure do |config|
11
- config.before do
12
- RPXNow.api_key = API_KEY
13
- RPXNow.api_version = API_VERSION
14
- RPXNow.domain = DOMAIN
15
- end
16
- end