prismic.io 1.0.0.rc3 → 1.0.0.rc4
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/.travis.yml +2 -0
- data/Gemfile.lock +1 -1
- data/lib/prismic.rb +34 -1
- data/lib/prismic/api.rb +85 -19
- data/lib/prismic/version.rb +1 -1
- data/spec/oauth_spec.rb +121 -0
- data/spec/prismic_spec.rb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2e41d8f8a5ceae95d4e2c3ee77967e1357b2162f
|
4
|
+
data.tar.gz: 162469c32efb11a20f358f21baf3b2e5d8dc1fbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 491f3c1ef1646963a35e95e8a4a5f0aea0f5ec0ed78a92a0ecfc2e7666b40afbd39a459abf2701f61aed920d649704a3ecbde5415666a2534366aa313f53e5d0
|
7
|
+
data.tar.gz: a91edff448c3a0762e1cb4b76b5700ae4bde77a8f04902fa87eb39ab451e01a9a464bea8d09e84ce371b758c7aca3863264262c8d2128aa20cb5ecb331a4f01f
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
data/lib/prismic.rb
CHANGED
@@ -55,6 +55,18 @@ module Prismic
|
|
55
55
|
API.start(url, opts)
|
56
56
|
end
|
57
57
|
|
58
|
+
def self.oauth_initiate_url(url, oauth_opts, api_opts=nil)
|
59
|
+
api_opts ||= {}
|
60
|
+
api_opts = {access_token: opts} if api_opts.is_a?(String)
|
61
|
+
API.oauth_initiate_url(url, oauth_opts, api_opts)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.oauth_check_token(url, oauth_opts, api_opts=nil)
|
65
|
+
api_opts ||= {}
|
66
|
+
api_opts = {access_token: api_opts} if api_opts.is_a?(String)
|
67
|
+
API.oauth_check_token(url, oauth_opts, api_opts)
|
68
|
+
end
|
69
|
+
|
58
70
|
class ApiData
|
59
71
|
attr_accessor :refs, :bookmarks, :types, :tags, :forms
|
60
72
|
end
|
@@ -366,12 +378,25 @@ module Prismic
|
|
366
378
|
# - body: returns the response's body (as String)
|
367
379
|
def get(uri, data={}, headers={})
|
368
380
|
uri = URI(uri) if uri.is_a?(String)
|
369
|
-
uri
|
381
|
+
add_query(uri, data)
|
370
382
|
http = Net::HTTP.new(uri.host, uri.port)
|
371
383
|
http.use_ssl = uri.scheme =~ /https/i
|
372
384
|
http.get(uri.request_uri, headers)
|
373
385
|
end
|
374
386
|
|
387
|
+
# Performs a POST call and returns the result
|
388
|
+
#
|
389
|
+
# The result must respond to
|
390
|
+
# - code: returns the response's HTTP status code (as number or String)
|
391
|
+
# - body: returns the response's body (as String)
|
392
|
+
def post(uri, data={}, headers={})
|
393
|
+
uri = URI(uri) if uri.is_a?(String)
|
394
|
+
add_query(uri, data)
|
395
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
396
|
+
http.use_ssl = uri.scheme =~ /https/i
|
397
|
+
http.post(uri.path, uri.query, headers)
|
398
|
+
end
|
399
|
+
|
375
400
|
def url_encode(data)
|
376
401
|
# Can't use URI.encode_www_form (doesn't support multi-values in 1.9.2)
|
377
402
|
encode = ->(k, v){ "#{k}=#{CGI::escape(v)}" }
|
@@ -383,6 +408,14 @@ module Prismic
|
|
383
408
|
end
|
384
409
|
}.join("&")
|
385
410
|
end
|
411
|
+
|
412
|
+
private
|
413
|
+
|
414
|
+
def add_query(uri, query)
|
415
|
+
query = url_encode(query)
|
416
|
+
query = "#{uri.query}&#{query}"if uri.query && !uri.query.empty?
|
417
|
+
uri.query = query
|
418
|
+
end
|
386
419
|
end
|
387
420
|
end
|
388
421
|
|
data/lib/prismic/api.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
module Prismic
|
3
3
|
class API
|
4
4
|
@@warned_create_search_form = false
|
5
|
+
@@warned_oauth_initiate_url = false
|
6
|
+
@@warned_oauth_check_token = false
|
5
7
|
attr_reader :json, :access_token, :http_client
|
6
8
|
attr_accessor :refs, :bookmarks, :forms, :tags, :types, :oauth
|
7
9
|
|
@@ -68,8 +70,24 @@ module Prismic
|
|
68
70
|
data = {}
|
69
71
|
data["access_token"] = access_token if access_token
|
70
72
|
res = http_client.get(url, data, 'Accept' => 'application/json')
|
71
|
-
|
72
|
-
|
73
|
+
case res.code
|
74
|
+
when '200'
|
75
|
+
res
|
76
|
+
when '401', '403'
|
77
|
+
begin
|
78
|
+
json = JSON.load(res.body)
|
79
|
+
raise PrismicWSAuthError.new(
|
80
|
+
json['error'],
|
81
|
+
json['oauth_initiate'],
|
82
|
+
json['oauth_token'],
|
83
|
+
http_client
|
84
|
+
)
|
85
|
+
rescue => e
|
86
|
+
raise PrismicWSConnectionError.new(res, e)
|
87
|
+
end
|
88
|
+
else
|
89
|
+
raise PrismicWSConnectionError, res
|
90
|
+
end
|
73
91
|
end
|
74
92
|
|
75
93
|
def self.start(url, opts={})
|
@@ -104,30 +122,48 @@ module Prismic
|
|
104
122
|
}]
|
105
123
|
api.tags = data['tags']
|
106
124
|
api.types = data['types']
|
107
|
-
api.oauth = OAuth.new(data['oauth_initiate'], data['oauth_token'])
|
125
|
+
api.oauth = OAuth.new(data['oauth_initiate'], data['oauth_token'], http_client)
|
108
126
|
}
|
109
127
|
end
|
110
128
|
|
129
|
+
def self.oauth_initiate_url(url, oauth_opts, api_opts={})
|
130
|
+
oauth =
|
131
|
+
begin
|
132
|
+
api = self.start(url, api_opts)
|
133
|
+
api.oauth
|
134
|
+
rescue PrismicWSAuthError => e
|
135
|
+
e.oauth
|
136
|
+
end
|
137
|
+
oauth.initiate_url(oauth_opts)
|
138
|
+
end
|
139
|
+
|
111
140
|
def oauth_initiate_url(opts)
|
112
|
-
|
113
|
-
"
|
114
|
-
|
115
|
-
|
116
|
-
|
141
|
+
if !@@warned_oauth_initiate_url
|
142
|
+
warn "[DEPRECATION] Method `API#oauth_initiate_url` is deprecated. " +
|
143
|
+
"Please use `Prismic::API.oauth_initiate_url` instead."
|
144
|
+
@@warned_oauth_initiate_url = true
|
145
|
+
end
|
146
|
+
oauth.initiate_url(opts)
|
117
147
|
end
|
118
148
|
|
119
|
-
def oauth_check_token(
|
120
|
-
|
121
|
-
res = Net::HTTP.post_form(uri, params)
|
122
|
-
if res.code == '200'
|
149
|
+
def self.oauth_check_token(url, oauth_params, api_opts={})
|
150
|
+
oauth =
|
123
151
|
begin
|
124
|
-
|
125
|
-
|
126
|
-
|
152
|
+
api = self.start(url, api_opts)
|
153
|
+
api.oauth
|
154
|
+
rescue PrismicWSAuthError => e
|
155
|
+
e.oauth
|
127
156
|
end
|
128
|
-
|
129
|
-
|
157
|
+
oauth.check_token(oauth_params)
|
158
|
+
end
|
159
|
+
|
160
|
+
def oauth_check_token(params)
|
161
|
+
if !@@warned_oauth_check_token
|
162
|
+
warn "[DEPRECATION] Method `API#oauth_check_token` is deprecated. " +
|
163
|
+
"Please use `Prismic::API.oauth_check_token` instead."
|
164
|
+
@@warned_oauth_check_token = true
|
130
165
|
end
|
166
|
+
oauth.check_token(params)
|
131
167
|
end
|
132
168
|
|
133
169
|
private
|
@@ -140,12 +176,42 @@ module Prismic
|
|
140
176
|
end
|
141
177
|
end
|
142
178
|
|
179
|
+
class PrismicWSAuthError < Error
|
180
|
+
attr_reader :error, :oauth
|
181
|
+
def initialize(error, oauth_initialize, oauth_token, http_client)
|
182
|
+
super("Can't connect to Prismic's API: #{error}")
|
183
|
+
@error = error
|
184
|
+
@oauth = OAuth.new(oauth_initialize, oauth_token, http_client)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
143
188
|
class OAuth
|
144
|
-
attr_reader :initiate, :token
|
145
|
-
def initialize(initiate, token)
|
189
|
+
attr_reader :initiate, :token, :http_client
|
190
|
+
def initialize(initiate, token, http_client)
|
191
|
+
@http_client = http_client
|
146
192
|
@initiate = initiate
|
147
193
|
@token = token
|
148
194
|
end
|
195
|
+
def initiate_url(opts)
|
196
|
+
initiate + "?" + {
|
197
|
+
"client_id" => opts.fetch(:client_id),
|
198
|
+
"redirect_uri" => opts.fetch(:redirect_uri),
|
199
|
+
"scope" => opts.fetch(:scope),
|
200
|
+
}.map{|kv| kv.map{|e| CGI.escape(e) }.join("=") }.join("&")
|
201
|
+
end
|
202
|
+
def check_token(params)
|
203
|
+
res = http_client.post(token, params)
|
204
|
+
if res.code == '200'
|
205
|
+
begin
|
206
|
+
JSON.parse(res.body)['access_token']
|
207
|
+
rescue Exception => e
|
208
|
+
raise PrismicWSConnectionError.new(res, e)
|
209
|
+
end
|
210
|
+
else
|
211
|
+
raise PrismicWSConnectionError, res
|
212
|
+
end
|
213
|
+
end
|
149
214
|
end
|
215
|
+
|
150
216
|
end
|
151
217
|
end
|
data/lib/prismic/version.rb
CHANGED
data/spec/oauth_spec.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe 'OAuth' do
|
5
|
+
|
6
|
+
OAUTH_INITIATE_OPTS = {
|
7
|
+
client_id: "client_id",
|
8
|
+
redirect_uri: "http://myapp.com/callback",
|
9
|
+
scope: "master+releases",
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
OAUTH_CHECKTOKEN_OPTS = {
|
13
|
+
grant_type: "authorization_code",
|
14
|
+
code: "thecode",
|
15
|
+
redirect_uri: "http://myapp.com/callback",
|
16
|
+
client_id: "client_id",
|
17
|
+
client_secret: "client_secret",
|
18
|
+
}
|
19
|
+
|
20
|
+
describe "Public API" do
|
21
|
+
|
22
|
+
PUBLIC_URL = "https://lesbonneschoses.prismic.io/api"
|
23
|
+
|
24
|
+
it "should accept unauthenticated requests" do
|
25
|
+
expect {
|
26
|
+
Prismic.api(PUBLIC_URL, nil)
|
27
|
+
}.not_to raise_error()
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "oauth_initiate_url" do
|
31
|
+
|
32
|
+
it "should returns the URL" do
|
33
|
+
url = Prismic::API.oauth_initiate_url(PUBLIC_URL, OAUTH_INITIATE_OPTS)
|
34
|
+
expected_url = [
|
35
|
+
"https://lesbonneschoses.prismic.io/auth?client_id=client_id",
|
36
|
+
"redirect_uri=http%3A%2F%2Fmyapp.com%2Fcallback",
|
37
|
+
"scope=master%2Breleases",
|
38
|
+
].join("&")
|
39
|
+
url.should == expected_url
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "oauth_check_token" do
|
45
|
+
|
46
|
+
it "should returns the URL" do
|
47
|
+
expect {
|
48
|
+
Prismic.oauth_check_token(PUBLIC_URL, OAUTH_CHECKTOKEN_OPTS)
|
49
|
+
}.to raise_error(
|
50
|
+
# we don't want to get a PrismicWSAuthError error here
|
51
|
+
Prismic::API::PrismicWSConnectionError,
|
52
|
+
"Can't connect to Prismic's API: 400 Bad Request"
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "Private API" do
|
61
|
+
|
62
|
+
PRIVATE_URL = "https://privaterepository.prismic.io/api"
|
63
|
+
|
64
|
+
it "should deny unauthenticated requests" do
|
65
|
+
expect {
|
66
|
+
Prismic.api(PRIVATE_URL, nil)
|
67
|
+
}.to raise_error(Prismic::API::PrismicWSAuthError)
|
68
|
+
end
|
69
|
+
|
70
|
+
def catch_wserror(url)
|
71
|
+
Prismic.api(url, nil)
|
72
|
+
rescue Prismic::API::PrismicWSAuthError => e
|
73
|
+
e
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should provide the error" do
|
77
|
+
error = catch_wserror(PRIVATE_URL)
|
78
|
+
error.error.should == "Invalid access token"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should provide oauth entry points" do
|
82
|
+
error = catch_wserror(PRIVATE_URL)
|
83
|
+
error.oauth.initiate.should == "https://privaterepository.prismic.io/auth"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should provide oauth token" do
|
87
|
+
error = catch_wserror(PRIVATE_URL)
|
88
|
+
error.oauth.token.should == "https://privaterepository.prismic.io/auth/token"
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "oauth_initiate_url" do
|
92
|
+
|
93
|
+
it "should returns the URL" do
|
94
|
+
url = Prismic.oauth_initiate_url(PRIVATE_URL, OAUTH_INITIATE_OPTS)
|
95
|
+
expected_url = [
|
96
|
+
"https://privaterepository.prismic.io/auth?client_id=client_id",
|
97
|
+
"redirect_uri=http%3A%2F%2Fmyapp.com%2Fcallback",
|
98
|
+
"scope=master%2Breleases",
|
99
|
+
].join("&")
|
100
|
+
url.should == expected_url
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "oauth_check_token" do
|
106
|
+
|
107
|
+
it "should returns the URL" do
|
108
|
+
expect {
|
109
|
+
Prismic::API.oauth_check_token(PRIVATE_URL, OAUTH_CHECKTOKEN_OPTS)
|
110
|
+
}.to raise_error(
|
111
|
+
# we don't want to get a PrismicWSAuthError error here
|
112
|
+
Prismic::API::PrismicWSConnectionError,
|
113
|
+
"Can't connect to Prismic's API: 400 Bad Request"
|
114
|
+
)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
data/spec/prismic_spec.rb
CHANGED
@@ -24,7 +24,7 @@ describe 'Api' do
|
|
24
24
|
'form3' => Prismic::Form.new(@api, 'form3', {}, nil, nil, nil, nil),
|
25
25
|
'form4' => Prismic::Form.new(@api, 'form4', {}, nil, nil, nil, nil),
|
26
26
|
}
|
27
|
-
api.oauth = Prismic::API::OAuth.new(@oauth_initiate_url, "https://lesbonneschoses.prismic.io/auth/token")
|
27
|
+
api.oauth = Prismic::API::OAuth.new(@oauth_initiate_url, "https://lesbonneschoses.prismic.io/auth/token", Prismic::DefaultHTTPClient)
|
28
28
|
}
|
29
29
|
end
|
30
30
|
|
@@ -234,7 +234,7 @@ describe 'Api' do
|
|
234
234
|
@scope = "none"
|
235
235
|
end
|
236
236
|
def oauth_initiate_url
|
237
|
-
|
237
|
+
Prismic.oauth_initiate_url("https://lesbonneschoses.prismic.io/api", {
|
238
238
|
client_id: @client_id,
|
239
239
|
redirect_uri: @redirect_uri,
|
240
240
|
scope: @scope,
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prismic.io
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.rc4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Étienne Vallette d'Osia
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -102,6 +102,7 @@ files:
|
|
102
102
|
- spec/fragments_spec.rb
|
103
103
|
- spec/json_parsers_spec.rb
|
104
104
|
- spec/lesbonneschoses_spec.rb
|
105
|
+
- spec/oauth_spec.rb
|
105
106
|
- spec/prismic_spec.rb
|
106
107
|
- spec/responses_mocks/api.json
|
107
108
|
- spec/responses_mocks/document.json
|
@@ -140,6 +141,7 @@ test_files:
|
|
140
141
|
- spec/fragments_spec.rb
|
141
142
|
- spec/json_parsers_spec.rb
|
142
143
|
- spec/lesbonneschoses_spec.rb
|
144
|
+
- spec/oauth_spec.rb
|
143
145
|
- spec/prismic_spec.rb
|
144
146
|
- spec/responses_mocks/api.json
|
145
147
|
- spec/responses_mocks/document.json
|