doyoubuzz-showcase 0.2.0 → 0.3.0
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.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/.travis.yml +3 -3
- data/Gemfile +4 -4
- data/README.md +1 -0
- data/doyoubuzz-showcase.gemspec +12 -12
- data/lib/doyoubuzz/showcase.rb +29 -48
- data/lib/doyoubuzz/showcase/sso.rb +52 -0
- data/lib/doyoubuzz/showcase/version.rb +1 -1
- data/spec/showcase/sso_spec.rb +64 -0
- data/spec/showcase_spec.rb +60 -76
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dab8e4fc67a92861f80a0962dc11196af652b45f
|
4
|
+
data.tar.gz: 0da1bb56b4b0767aa2dab2fdfc4c4a9e90133408
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc792af5f1ad68ebef798ce0953cc9e4c67527d6554a9a05a914c993f6bf1e5c77982b12c8fdb0a1c00557461021fc543d7a8b7199ec12044194273e9ba76559
|
7
|
+
data.tar.gz: 8c46d78bb80288218b1a6fc12c2f3581d735a95a6973d8a530cb8aae156381c99fc3546f550425d99e7231fb27132f143429c521d086f515da60923332cb48bf
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
# Developpement dependencies
|
4
|
-
gem 'rspec',
|
5
|
-
gem 'webmock',
|
6
|
-
gem 'vcr',
|
4
|
+
gem 'rspec', '~> 3.1'
|
5
|
+
gem 'webmock', '~> 1.20'
|
6
|
+
gem 'vcr', '~> 2.9'
|
7
7
|
|
8
8
|
# CI
|
9
|
-
gem 'coveralls', :
|
9
|
+
gem 'coveralls', require: false
|
10
10
|
|
11
11
|
# Specify the gem's dependencies in doyoubuzz-showcase.gemspec
|
12
12
|
gemspec
|
data/README.md
CHANGED
data/doyoubuzz-showcase.gemspec
CHANGED
@@ -4,23 +4,23 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'doyoubuzz/showcase/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'doyoubuzz-showcase'
|
8
8
|
spec.version = Doyoubuzz::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
9
|
+
spec.authors = ['David RUYER']
|
10
|
+
spec.email = ['david.ruyer@gmail.com']
|
11
|
+
spec.description = 'Wrapper around the DoYouBuzz showcase API'
|
12
|
+
spec.summary = 'Wrapper around the DoYouBuzz showcase API'
|
13
|
+
spec.homepage = ''
|
14
|
+
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
19
|
+
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'rake'
|
23
23
|
|
24
|
-
spec.add_dependency
|
25
|
-
spec.add_dependency
|
24
|
+
spec.add_dependency 'httparty', '~> 0.13'
|
25
|
+
spec.add_dependency 'hashie', '>= 3.5.0'
|
26
26
|
end
|
data/lib/doyoubuzz/showcase.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'logger'
|
1
2
|
require 'httparty'
|
2
3
|
require 'hashie/mash'
|
3
4
|
|
@@ -9,6 +10,8 @@ module Doyoubuzz
|
|
9
10
|
include HTTParty
|
10
11
|
base_uri 'http://showcase.doyoubuzz.com/api/v1'
|
11
12
|
|
13
|
+
Hashie.logger = ::Logger.new(STDOUT)
|
14
|
+
|
12
15
|
# Construction with mandatory api key and api secret
|
13
16
|
def initialize(api_key, api_secret)
|
14
17
|
@api_key = api_key
|
@@ -16,68 +19,58 @@ module Doyoubuzz
|
|
16
19
|
end
|
17
20
|
|
18
21
|
# HTTP calls => forwarded to #call_api with the verb as the first argument
|
19
|
-
|
20
|
-
define_method(verb) do |method, params
|
22
|
+
%i(get post put delete).each do |verb|
|
23
|
+
define_method(verb) do |method, params={}|
|
21
24
|
call_api(verb, method, params)
|
22
25
|
end
|
23
26
|
end
|
24
27
|
|
25
|
-
# SSO redirection
|
26
|
-
def sso_redirect_url(application_name, timestamp, sso_key, user_attributes)
|
27
|
-
# Check mandatory attributes are given
|
28
|
-
missing_attributes = [:email, :external_id, :firstname, :lastname].reject{|key| user_attributes[key]}
|
29
|
-
|
30
|
-
if missing_attributes.length > 0
|
31
|
-
raise ArgumentError, "Missing mandatory attributes for SSO : #{missing_attributes.join(', ')}"
|
32
|
-
end
|
33
|
-
|
34
|
-
params = sign_sso_params(user_attributes.merge(timestamp: timestamp), sso_key)
|
35
|
-
|
36
|
-
"http://showcase.doyoubuzz.com/p/fr/#{application_name}/sso?#{URI.encode_www_form(params)}"
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
28
|
private
|
41
29
|
|
42
30
|
# The actual api call
|
43
31
|
def call_api(verb, method, params)
|
44
|
-
res = self.class.send(
|
45
|
-
|
32
|
+
res = self.class.send(
|
33
|
+
verb,
|
34
|
+
method,
|
35
|
+
build_request_parameters(params, verb)
|
36
|
+
)
|
37
|
+
|
38
|
+
process_response(res)
|
46
39
|
end
|
47
40
|
|
48
41
|
# Process the HTTParty response, checking for errors
|
49
42
|
def process_response(res)
|
50
|
-
|
51
|
-
|
52
|
-
|
43
|
+
raise Error.new(res.code, res.body) unless res.success?
|
44
|
+
|
45
|
+
object = res.parsed_response
|
53
46
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
else
|
59
|
-
return res
|
47
|
+
case object
|
48
|
+
when Hash then mash(object)
|
49
|
+
when Array then object.map(&method(:mash))
|
50
|
+
else object
|
60
51
|
end
|
61
52
|
end
|
62
53
|
|
54
|
+
def mash(object)
|
55
|
+
Hashie::Mash.new(object)
|
56
|
+
end
|
57
|
+
|
63
58
|
# Build the request parameters
|
64
59
|
def build_request_parameters(params, verb)
|
65
|
-
additional_parameters = {:
|
60
|
+
additional_parameters = { apikey: @api_key, timestamp: Time.now.to_i }
|
66
61
|
|
67
62
|
# GET, DELETE requests : the parameters are in the request query
|
68
|
-
if
|
69
|
-
return {:
|
63
|
+
if %i(get delete).include?(verb)
|
64
|
+
return { query: sign_api_params(params.merge(additional_parameters)) }
|
65
|
+
end
|
70
66
|
|
71
67
|
# Otherwise, they are in the body
|
72
|
-
|
73
|
-
return {:body => params, :query => sign_api_params(additional_parameters)}
|
74
|
-
end
|
68
|
+
{ body: params, query: sign_api_params(additional_parameters) }
|
75
69
|
end
|
76
70
|
|
77
|
-
|
78
71
|
# The arguments processing and signing
|
79
72
|
def sign_api_params(params)
|
80
|
-
ordered_params_values = params.sort.map{|
|
73
|
+
ordered_params_values = params.sort.map { |_, v| v }
|
81
74
|
concatenated_params_string = ordered_params_values.join
|
82
75
|
concatenated_params_string << @api_secret
|
83
76
|
|
@@ -85,17 +78,5 @@ module Doyoubuzz
|
|
85
78
|
params.merge(hash: hash)
|
86
79
|
end
|
87
80
|
|
88
|
-
# Different ordering
|
89
|
-
def sign_sso_params(params, sso_key)
|
90
|
-
# Custom ordering
|
91
|
-
tosign = params.values_at(:email, :firstname, :lastname, :external_id, :"group[]", :user_type, :timestamp).compact.join
|
92
|
-
tosign += sso_key
|
93
|
-
|
94
|
-
hash = Digest::MD5.hexdigest(tosign)
|
95
|
-
|
96
|
-
params.merge(hash: hash)
|
97
|
-
end
|
98
|
-
|
99
|
-
|
100
81
|
end
|
101
82
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Doyoubuzz
|
2
|
+
class Showcase
|
3
|
+
class SSO
|
4
|
+
|
5
|
+
BASE_URL = 'http://showcase.doyoubuzz.com'.freeze
|
6
|
+
|
7
|
+
def initialize(application, key)
|
8
|
+
@application = application
|
9
|
+
@key = key
|
10
|
+
end
|
11
|
+
|
12
|
+
def redirect_url(locale: 'fr', timestamp:, user_attributes:)
|
13
|
+
enforce_sso_attributes(user_attributes)
|
14
|
+
|
15
|
+
params = sign_params(user_attributes.merge(timestamp: timestamp))
|
16
|
+
encoded_params = URI.encode_www_form(params)
|
17
|
+
|
18
|
+
"#{BASE_URL}/p/#{locale}/#{application}/sso?#{encoded_params}"
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
attr_reader :application, :key
|
24
|
+
|
25
|
+
def enforce_sso_attributes(attributes)
|
26
|
+
required = %i(email external_id firstname lastname)
|
27
|
+
missing = required.reject { |key| attributes[key] }
|
28
|
+
|
29
|
+
raise(
|
30
|
+
ArgumentError,
|
31
|
+
"Missing mandatory attributes for SSO : #{missing.join(', ')}"
|
32
|
+
) if missing.any?
|
33
|
+
end
|
34
|
+
|
35
|
+
def sign_params(params)
|
36
|
+
# Custom ordering
|
37
|
+
tosign = params.values_at(
|
38
|
+
:email,
|
39
|
+
:firstname,
|
40
|
+
:lastname,
|
41
|
+
:external_id,
|
42
|
+
:"group[]",
|
43
|
+
:user_type,
|
44
|
+
:timestamp
|
45
|
+
).compact.join + key
|
46
|
+
|
47
|
+
params.merge(hash: Digest::MD5.hexdigest(tosign))
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'doyoubuzz/showcase/sso'
|
4
|
+
|
5
|
+
RSpec.describe Doyoubuzz::Showcase::SSO, type: :type do
|
6
|
+
let(:application) { 'example_application' }
|
7
|
+
let(:key) { 'vpsdihgfdso' }
|
8
|
+
|
9
|
+
subject { described_class.new(application, key) }
|
10
|
+
|
11
|
+
describe '#new' do
|
12
|
+
it 'requires an application name and an sso key' do
|
13
|
+
expect { described_class.new }.to raise_error(ArgumentError)
|
14
|
+
expect { described_class.new(application, key) }.not_to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#redirect_url' do
|
19
|
+
let(:timestamp) { 1370534334 }
|
20
|
+
let(:user_attributes) do
|
21
|
+
{
|
22
|
+
email: 'email@host.tld',
|
23
|
+
firstname: 'John',
|
24
|
+
lastname: 'Doe',
|
25
|
+
external_id: 12345
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'verifies all the mandatory user attributes are given' do
|
30
|
+
user_attributes.keys.each do |mandatory_key|
|
31
|
+
incomplete_attributes = user_attributes.reject { |k, _| k == mandatory_key }
|
32
|
+
|
33
|
+
expect do
|
34
|
+
subject.redirect_url(
|
35
|
+
timestamp: timestamp,
|
36
|
+
user_attributes: incomplete_attributes
|
37
|
+
)
|
38
|
+
end.to raise_error(
|
39
|
+
ArgumentError,
|
40
|
+
"Missing mandatory attributes for SSO : #{mandatory_key}"
|
41
|
+
)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'computes the right url' do
|
46
|
+
expect(
|
47
|
+
subject.redirect_url(
|
48
|
+
timestamp: timestamp,
|
49
|
+
user_attributes: user_attributes
|
50
|
+
)
|
51
|
+
).to eq('http://showcase.doyoubuzz.com/p/fr/example_application/sso?email=email%40host.tld&firstname=John&lastname=Doe&external_id=12345×tamp=1370534334&hash=94a0adad0a9bafdf511326cae3bf7626')
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'handles locales properly' do
|
55
|
+
expect(
|
56
|
+
subject.redirect_url(
|
57
|
+
locale: 'en',
|
58
|
+
timestamp: timestamp,
|
59
|
+
user_attributes: user_attributes
|
60
|
+
)
|
61
|
+
).to eq('http://showcase.doyoubuzz.com/p/en/example_application/sso?email=email%40host.tld&firstname=John&lastname=Doe&external_id=12345×tamp=1370534334&hash=94a0adad0a9bafdf511326cae3bf7626')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/spec/showcase_spec.rb
CHANGED
@@ -2,115 +2,99 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
require 'doyoubuzz/showcase'
|
4
4
|
|
5
|
-
describe Doyoubuzz::Showcase do
|
6
|
-
|
7
|
-
let(:
|
8
|
-
let(:
|
9
|
-
let(:showcase){ Doyoubuzz::Showcase.new(api_key, api_secret) }
|
5
|
+
RSpec.describe Doyoubuzz::Showcase do
|
6
|
+
let(:api_key) { 'an_api_key' }
|
7
|
+
let(:api_secret) { 'an_api_secret' }
|
8
|
+
let(:showcase) { Doyoubuzz::Showcase.new(api_key, api_secret) }
|
10
9
|
|
11
10
|
describe '#new' do
|
12
|
-
it '
|
13
|
-
expect{ Doyoubuzz::Showcase.new }.to raise_error ArgumentError
|
11
|
+
it 'requires an api key and secret key' do
|
12
|
+
expect { Doyoubuzz::Showcase.new }.to raise_error ArgumentError
|
14
13
|
|
15
|
-
expect{ Doyoubuzz::Showcase.new(api_key, api_secret) }.to_not raise_error
|
14
|
+
expect { Doyoubuzz::Showcase.new(api_key, api_secret) }.to_not raise_error
|
16
15
|
end
|
17
16
|
end
|
18
17
|
|
19
18
|
describe '#call' do
|
20
|
-
let(:arguments){ {:
|
21
|
-
let(:timestamp){ 1370534334 }
|
19
|
+
let(:arguments) { { foo: 'bar', zab: 'baz' } }
|
20
|
+
let(:timestamp) { 1370534334 }
|
22
21
|
|
23
|
-
# The timestamp is important in the request generation and the VCR
|
24
|
-
|
22
|
+
# The timestamp is important in the request generation and the VCR
|
23
|
+
# handling. Here it is set at a fixed date
|
24
|
+
before do
|
25
25
|
time = Time.at(timestamp)
|
26
26
|
allow(Time).to receive(:now).and_return time
|
27
27
|
end
|
28
28
|
|
29
|
-
it
|
30
|
-
|
31
|
-
showcase
|
29
|
+
it 'generates a valid signed api call' do
|
30
|
+
# We only want to check the sent parameters here
|
31
|
+
allow(showcase).to receive(:process_response)
|
32
|
+
expect(showcase.class).to receive(:get).with(
|
33
|
+
'/path',
|
34
|
+
query: {
|
35
|
+
foo: 'bar',
|
36
|
+
zab: 'baz',
|
37
|
+
apikey: 'an_api_key',
|
38
|
+
timestamp: timestamp,
|
39
|
+
hash: '757b04a866f1d02f077471589341ff7a'
|
40
|
+
}
|
41
|
+
)
|
32
42
|
|
33
43
|
showcase.get('/path', arguments)
|
34
44
|
end
|
35
45
|
|
36
|
-
it
|
37
|
-
|
38
|
-
showcase
|
46
|
+
it 'puts the parameters in the body for PUT requests' do
|
47
|
+
# We only want to check the sent parameters here
|
48
|
+
allow(showcase).to receive(:process_response)
|
49
|
+
expect(showcase.class).to receive(:put).with(
|
50
|
+
'/path',
|
51
|
+
query: {
|
52
|
+
apikey: 'an_api_key',
|
53
|
+
timestamp: timestamp,
|
54
|
+
hash: '11a68a1bb9e23c681438efb714c9ad4d'
|
55
|
+
},
|
56
|
+
body: { foo: 'bar', zab: 'baz' }
|
57
|
+
)
|
39
58
|
|
40
59
|
showcase.put('/path', arguments)
|
41
60
|
end
|
42
61
|
|
43
|
-
it
|
44
|
-
expect(showcase).to respond_to
|
45
|
-
expect(showcase).to respond_to
|
46
|
-
expect(showcase).to respond_to
|
47
|
-
expect(showcase).to respond_to
|
62
|
+
it 'handles HTTP verbs' do
|
63
|
+
expect(showcase).to respond_to(:get)
|
64
|
+
expect(showcase).to respond_to(:post)
|
65
|
+
expect(showcase).to respond_to(:put)
|
66
|
+
expect(showcase).to respond_to(:delete)
|
48
67
|
end
|
49
68
|
|
50
|
-
it
|
51
|
-
VCR.use_cassette(
|
69
|
+
it 'returns an explorable hash' do
|
70
|
+
VCR.use_cassette('good_call') do
|
52
71
|
res = showcase.get('/users')
|
53
72
|
|
54
|
-
res.keys.
|
55
|
-
res[
|
56
|
-
|
73
|
+
expect(res.keys).to eq(%w(users total next))
|
74
|
+
expect(res['users']['items'].first.keys).
|
75
|
+
to eq(%w(username email firstname lastname id))
|
76
|
+
expect(res.users.items.first.username).
|
77
|
+
to eq('lvrmterjwea')
|
57
78
|
end
|
58
79
|
end
|
59
80
|
|
60
|
-
|
61
|
-
|
62
|
-
VCR.use_cassette("good_call") do
|
81
|
+
it 'handles array responses' do
|
82
|
+
VCR.use_cassette('good_call') do
|
63
83
|
res = showcase.get('/tags')
|
64
84
|
|
65
|
-
res.
|
66
|
-
res.first.
|
85
|
+
expect(res).to be_an(Array)
|
86
|
+
expect(res.first).to be_a(Hashie::Mash)
|
67
87
|
end
|
68
88
|
end
|
69
89
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
error.
|
75
|
-
error.
|
76
|
-
error.message.should == "Forbidden"
|
77
|
-
error.inspect.should == "#<Doyoubuzz::Showcase::Error 403: Forbidden>"
|
90
|
+
it 'raises an exception on a failed call' do
|
91
|
+
VCR.use_cassette('failed_call') do
|
92
|
+
expect { showcase.get('/users') }.to raise_error do |error|
|
93
|
+
expect(error).to be_a(Doyoubuzz::Showcase::Error)
|
94
|
+
expect(error.status).to eq(403)
|
95
|
+
expect(error.message).to eq('Forbidden')
|
78
96
|
end
|
79
97
|
end
|
80
98
|
end
|
81
|
-
|
82
99
|
end
|
83
|
-
|
84
|
-
|
85
|
-
describe '#sso_redirect_url' do
|
86
|
-
|
87
|
-
let(:company_name){ 'my_company' }
|
88
|
-
let(:timestamp){ 1370534334 }
|
89
|
-
let(:user_attributes){
|
90
|
-
{
|
91
|
-
email: 'email@host.tld',
|
92
|
-
firstname: 'John',
|
93
|
-
lastname: 'Doe',
|
94
|
-
external_id: 12345
|
95
|
-
}
|
96
|
-
}
|
97
|
-
let(:sso_key){ 'vpsdihgfdso' }
|
98
|
-
|
99
|
-
it "should verify all the mandatory user attributes are given" do
|
100
|
-
|
101
|
-
user_attributes.keys.each do |mandatory_key|
|
102
|
-
|
103
|
-
incomplete_attributes = user_attributes.dup.tap{|attrs|attrs.delete mandatory_key}
|
104
|
-
expect { showcase.sso_redirect_url(company_name, timestamp, sso_key, incomplete_attributes) }.to raise_error ArgumentError, "Missing mandatory attributes for SSO : #{mandatory_key}"
|
105
|
-
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
it "should compute the right url" do
|
111
|
-
showcase.sso_redirect_url(company_name, timestamp, sso_key, user_attributes).should == 'http://showcase.doyoubuzz.com/p/fr/my_company/sso?email=email%40host.tld&firstname=John&lastname=Doe&external_id=12345×tamp=1370534334&hash=94a0adad0a9bafdf511326cae3bf7626'
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
100
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: doyoubuzz-showcase
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David RUYER
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 3.5.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 3.5.0
|
69
69
|
description: Wrapper around the DoYouBuzz showcase API
|
70
70
|
email:
|
71
71
|
- david.ruyer@gmail.com
|
@@ -85,9 +85,11 @@ files:
|
|
85
85
|
- doyoubuzz-showcase.gemspec
|
86
86
|
- lib/doyoubuzz/showcase.rb
|
87
87
|
- lib/doyoubuzz/showcase/error.rb
|
88
|
+
- lib/doyoubuzz/showcase/sso.rb
|
88
89
|
- lib/doyoubuzz/showcase/version.rb
|
89
90
|
- spec/fixtures/vcr_cassettes/failed_call.yml
|
90
91
|
- spec/fixtures/vcr_cassettes/good_call.yml
|
92
|
+
- spec/showcase/sso_spec.rb
|
91
93
|
- spec/showcase_spec.rb
|
92
94
|
- spec/spec_helper.rb
|
93
95
|
homepage: ''
|
@@ -110,13 +112,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
112
|
version: '0'
|
111
113
|
requirements: []
|
112
114
|
rubyforge_project:
|
113
|
-
rubygems_version: 2.
|
115
|
+
rubygems_version: 2.4.5.1
|
114
116
|
signing_key:
|
115
117
|
specification_version: 4
|
116
118
|
summary: Wrapper around the DoYouBuzz showcase API
|
117
119
|
test_files:
|
118
120
|
- spec/fixtures/vcr_cassettes/failed_call.yml
|
119
121
|
- spec/fixtures/vcr_cassettes/good_call.yml
|
122
|
+
- spec/showcase/sso_spec.rb
|
120
123
|
- spec/showcase_spec.rb
|
121
124
|
- spec/spec_helper.rb
|
122
|
-
has_rdoc:
|