pmp 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/example/permissions.rb +90 -0
- data/lib/pmp.rb +1 -0
- data/lib/pmp/client.rb +18 -2
- data/lib/pmp/collection_document.rb +17 -3
- data/lib/pmp/configuration.rb +2 -6
- data/lib/pmp/connection.rb +10 -1
- data/lib/pmp/credential.rb +55 -0
- data/lib/pmp/link.rb +3 -3
- data/lib/pmp/links.rb +20 -1
- data/lib/pmp/parser.rb +5 -5
- data/lib/pmp/version.rb +1 -1
- data/pmp.gemspec +0 -1
- data/spec/client_spec.rb +39 -1
- data/spec/collection_document_spec.rb +12 -4
- data/spec/configuration_spec.rb +19 -11
- data/spec/credential_spec.rb +70 -0
- data/spec/link_spec.rb +7 -7
- data/spec/links_spec.rb +4 -3
- data/spec/parser_spec.rb +1 -1
- metadata +6 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e96a6950ad0285f1269552f82ec2ceb83abc756
|
4
|
+
data.tar.gz: c0d564eb5a48aa79242bba4033acff0c38c207ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffef1af394ef66319065fa9d09c76211bc7a6f48bf897cc0b4b878057856b08f450bb7851786cda12709003c8ecf3faaff02543ae8fbc337acf8ac49763f582d
|
7
|
+
data.tar.gz: 07f5be73a5e7749597080b8c16af46e9cb6a1050e80a6b37961158dc46cd90f54adfd62392d7147166f389233a1b45f09450acc1a422b3e5235da1261ee32ddd
|
data/README.md
CHANGED
@@ -110,7 +110,7 @@ doc.title = "this is another awesome example, cool?"
|
|
110
110
|
doc.adding_an_attribute = "this will get saved as a new attribute adding-an-attribute"
|
111
111
|
|
112
112
|
# can add links (doesn't check schema yet)
|
113
|
-
doc.links['some-new-link'] = PMP::Link.new(
|
113
|
+
doc.links['some-new-link'] = PMP::Link.new({href:'http://somenewlink.io'})
|
114
114
|
new_link = doc.some_new_link
|
115
115
|
|
116
116
|
# save changes
|
@@ -0,0 +1,90 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'pmp'
|
6
|
+
|
7
|
+
# ------------------------------------------------------------------------------
|
8
|
+
# Setup: Make sure you can make a client with id and secret
|
9
|
+
# ------------------------------------------------------------------------------
|
10
|
+
client_id = ENV['PMP_CLIENT_ID']
|
11
|
+
client_secret = ENV['PMP_CLIENT_SECRET']
|
12
|
+
|
13
|
+
raise "PMP_CLIENT_ID PMP_CLIENT_SECRET not set" unless client_id && client_secret
|
14
|
+
|
15
|
+
# doing this against the sandbox for now
|
16
|
+
endpoint = 'https://api-sandbox.pmp.io/'
|
17
|
+
|
18
|
+
# make a new client, assume id and secret are in the env
|
19
|
+
pmp = PMP::Client.new(client_id: client_id, client_secret: client_secret, endpoint: endpoint)
|
20
|
+
|
21
|
+
|
22
|
+
# ------------------------------------------------------------------------------
|
23
|
+
# Step 1: Make 3 orgs that will end up with different permissions
|
24
|
+
# ------------------------------------------------------------------------------
|
25
|
+
organizations = (0..2).map do |index|
|
26
|
+
# make a new 'organization' of profile type user
|
27
|
+
org = pmp.doc_of_type('user')
|
28
|
+
|
29
|
+
org.title = "pmp ruby example, permissions: org #{index}"
|
30
|
+
org.tags = ['pmp_example_permissions']
|
31
|
+
org.auth = {
|
32
|
+
user: "pmp_ruby_org_#{index}",
|
33
|
+
password: SecureRandom.uuid,
|
34
|
+
scope: 'write'
|
35
|
+
}
|
36
|
+
org.save
|
37
|
+
org
|
38
|
+
end
|
39
|
+
puts "Step 1 complete: organizations: #{organzations.to_json}\n\n"
|
40
|
+
|
41
|
+
|
42
|
+
# ------------------------------------------------------------------------------
|
43
|
+
# Step 2: Make 4 permission groups, 0:[0,1], 1:[0], 2:[1], and an empty group 3:[]
|
44
|
+
# ------------------------------------------------------------------------------
|
45
|
+
group_orgs = [ [0,1], [0], [1], [] ]
|
46
|
+
permission_groups = group_orgs.collect do |orgs|
|
47
|
+
group = pmp.doc_of_type('group')
|
48
|
+
group.tags = ['pmp_example_permissions']
|
49
|
+
group.title = "pmp ruby example, permissions: permission group #{orgs.inspect}"
|
50
|
+
group.links['item'] = orgs.map{|o| PMP::Link(href: organization[o].href)} if (orgs.size > 0)
|
51
|
+
group.save
|
52
|
+
group
|
53
|
+
end
|
54
|
+
|
55
|
+
puts "Step 2 complete: permission_groups: #{permission_groups.to_json}\n\n"
|
56
|
+
|
57
|
+
# ------------------------------------------------------------------------------
|
58
|
+
# Step 3: Make docs to be protected
|
59
|
+
# ------------------------------------------------------------------------------
|
60
|
+
documents = (0..3).collect do |index|
|
61
|
+
doc = pmp.doc_of_type('story')
|
62
|
+
doc.tags = ['pmp_example_permissions']
|
63
|
+
doc.title = "pmp ruby example, permissions: story #{index}"
|
64
|
+
end
|
65
|
+
|
66
|
+
documents[0].links['permission'] = { href: permission_groups[0].href, operation: 'read' }
|
67
|
+
|
68
|
+
documents[1].links['permission'] = [
|
69
|
+
{
|
70
|
+
href: permission_groups[2].href,
|
71
|
+
operation: 'read',
|
72
|
+
blacklist: true
|
73
|
+
},
|
74
|
+
{
|
75
|
+
href: permission_groups[1].href,
|
76
|
+
operation: 'read'
|
77
|
+
},
|
78
|
+
]
|
79
|
+
|
80
|
+
documents[3].links['permission'] = { href: permission_groups[3].href, operation: 'read' }
|
81
|
+
|
82
|
+
documents.each{|d| d.save }
|
83
|
+
|
84
|
+
|
85
|
+
# ------------------------------------------------------------------------------
|
86
|
+
# Step 4: Make credentials for each org
|
87
|
+
# ------------------------------------------------------------------------------
|
88
|
+
credentials = organizations.map do |org|
|
89
|
+
pmp.credentials.create(user: org.auth['user'], password: org.auth['password'])
|
90
|
+
end
|
data/lib/pmp.rb
CHANGED
data/lib/pmp/client.rb
CHANGED
@@ -10,13 +10,29 @@ module PMP
|
|
10
10
|
yield(self) if block_given?
|
11
11
|
end
|
12
12
|
|
13
|
+
def credentials(opts={})
|
14
|
+
@credentials ||= PMP::Credential.new(options.merge(opts))
|
15
|
+
end
|
16
|
+
|
13
17
|
def token(opts={})
|
14
18
|
@token ||= PMP::Token.new(options.merge(opts)).get_token
|
15
19
|
end
|
16
20
|
|
17
|
-
def root(opts={}
|
21
|
+
def root(opts={})
|
18
22
|
opts = options.merge(href: endpoint).merge(opts)
|
19
|
-
@root ||= PMP::CollectionDocument.new(opts
|
23
|
+
@root ||= PMP::CollectionDocument.new(opts)
|
24
|
+
end
|
25
|
+
|
26
|
+
def doc_of_type(type, opts={})
|
27
|
+
doc = PMP::CollectionDocument.new(options.merge(opts))
|
28
|
+
doc.links['profile'] = Link.new(href: profile_href_for_type(type), type: "application/vnd.pmp.collection.doc+json")
|
29
|
+
doc
|
30
|
+
end
|
31
|
+
|
32
|
+
# private
|
33
|
+
|
34
|
+
def profile_href_for_type(type)
|
35
|
+
"#{endpoint}profiles/#{type}"
|
20
36
|
end
|
21
37
|
|
22
38
|
end
|
@@ -87,9 +87,9 @@ module PMP
|
|
87
87
|
|
88
88
|
def save
|
89
89
|
set_guid_if_blank
|
90
|
-
|
91
90
|
url = edit_link('PUT').where(guid: self.guid).url
|
92
|
-
request(:put, url, self)
|
91
|
+
response = request(:put, url, self)
|
92
|
+
self.href = response.body['url']
|
93
93
|
end
|
94
94
|
|
95
95
|
def delete
|
@@ -114,8 +114,18 @@ module PMP
|
|
114
114
|
!!self.loaded
|
115
115
|
end
|
116
116
|
|
117
|
+
def setup_oauth_token
|
118
|
+
if !oauth_token
|
119
|
+
token = PMP::Token.new(options).get_token
|
120
|
+
self.oauth_token = token.token
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
117
124
|
# url includes any params - full url
|
118
125
|
def request(method, url, body=nil) # :nodoc:
|
126
|
+
|
127
|
+
setup_oauth_token
|
128
|
+
|
119
129
|
raw = connection(options.merge({url: url})).send(method) do |request|
|
120
130
|
if [:post, :put].include?(method.to_sym) && !body.blank?
|
121
131
|
request.body = body.is_a?(String) ? body : body.to_json
|
@@ -131,7 +141,11 @@ module PMP
|
|
131
141
|
end
|
132
142
|
|
133
143
|
def method_missing(method, *args)
|
134
|
-
|
144
|
+
if (method.to_s.last != '=') && !loaded?
|
145
|
+
load
|
146
|
+
return self.send(method, *args) if self.respond_to?(method)
|
147
|
+
end
|
148
|
+
|
135
149
|
super
|
136
150
|
end
|
137
151
|
|
data/lib/pmp/configuration.rb
CHANGED
@@ -8,6 +8,8 @@ module PMP
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
VALID_OPTIONS_KEYS = [
|
11
|
+
:user,
|
12
|
+
:password,
|
11
13
|
:client_id,
|
12
14
|
:client_secret,
|
13
15
|
:oauth_token,
|
@@ -72,12 +74,6 @@ module PMP
|
|
72
74
|
self
|
73
75
|
end
|
74
76
|
|
75
|
-
def options
|
76
|
-
options = {}
|
77
|
-
VALID_OPTIONS_KEYS.each { |k| options[k] = send(k) }
|
78
|
-
options
|
79
|
-
end
|
80
|
-
|
81
77
|
module ClassMethods
|
82
78
|
|
83
79
|
def keys
|
data/lib/pmp/connection.rb
CHANGED
@@ -14,13 +14,22 @@ module PMP
|
|
14
14
|
:adapter,
|
15
15
|
:ssl,
|
16
16
|
:oauth_token,
|
17
|
+
:basic_auth,
|
18
|
+
:user,
|
19
|
+
:password,
|
17
20
|
:debug
|
18
21
|
].freeze
|
19
22
|
|
20
23
|
def connection(options={})
|
21
24
|
opts = process_options(options)
|
22
25
|
Faraday::Connection.new(opts) do |faraday|
|
23
|
-
|
26
|
+
|
27
|
+
if opts[:basic_auth] && opts[:user] && opts[:password]
|
28
|
+
faraday.request :basic_auth, opts[:user], opts[:password]
|
29
|
+
elsif opts[:oauth_token]
|
30
|
+
faraday.request :authorization, 'Bearer', opts[:oauth_token]
|
31
|
+
end
|
32
|
+
|
24
33
|
faraday.request :url_encoded
|
25
34
|
faraday.request :multipart
|
26
35
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'oauth2'
|
4
|
+
|
5
|
+
module PMP
|
6
|
+
class Credential
|
7
|
+
|
8
|
+
include Configuration
|
9
|
+
include Connection
|
10
|
+
|
11
|
+
CREDENTIAL_PARAMS = [:scope, :token_expires_in, :label]
|
12
|
+
|
13
|
+
def initialize(options={}, &block)
|
14
|
+
apply_configuration(options)
|
15
|
+
|
16
|
+
yield(self) if block_given?
|
17
|
+
end
|
18
|
+
|
19
|
+
def list
|
20
|
+
response = request(:get, credentials_url)
|
21
|
+
response.body
|
22
|
+
end
|
23
|
+
|
24
|
+
def create(params={})
|
25
|
+
response = request(:post, credentials_url, create_params(params))
|
26
|
+
response.body
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_params(params={})
|
30
|
+
HashWithIndifferentAccess.new({
|
31
|
+
scope: 'read',
|
32
|
+
token_expires_in: 60*60*24*30,
|
33
|
+
label: "#{user}: #{Time.now}"
|
34
|
+
}).merge(params.select{|k,v| CREDENTIAL_PARAMS.include?(k.to_sym)})
|
35
|
+
end
|
36
|
+
|
37
|
+
def request(method, url, body={}) # :nodoc:
|
38
|
+
|
39
|
+
headers = {
|
40
|
+
'Accept' => "*/*",
|
41
|
+
'Content-Type' => [:put, :post].include?(method) ? "application/x-www-form-urlencoded" : nil
|
42
|
+
}
|
43
|
+
|
44
|
+
conn_opts = options.merge({headers: headers, basic_auth: true})
|
45
|
+
|
46
|
+
raw = connection(conn_opts).send(method, url, body)
|
47
|
+
PMP::Response.new(raw, {method: method, url: url, body: body})
|
48
|
+
end
|
49
|
+
|
50
|
+
def credentials_url
|
51
|
+
"#{endpoint}auth/credentials"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
data/lib/pmp/link.rb
CHANGED
@@ -25,9 +25,9 @@ module PMP
|
|
25
25
|
|
26
26
|
attr_accessor :params
|
27
27
|
|
28
|
-
def initialize(
|
28
|
+
def initialize(link={}, parent=nil)
|
29
29
|
super()
|
30
|
-
self.parent = parent || PMP::CollectionDocument.new
|
30
|
+
self.parent = parent || link.delete('parent') || PMP::CollectionDocument.new
|
31
31
|
self.params = link.delete('params') || {}
|
32
32
|
# puts "params: #{params.inspect}"
|
33
33
|
parse_attributes(link)
|
@@ -41,7 +41,7 @@ module PMP
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def where(params={})
|
44
|
-
self.class.new(
|
44
|
+
self.class.new(attributes.merge({'params'=>params}), parent)
|
45
45
|
end
|
46
46
|
|
47
47
|
def as_json
|
data/lib/pmp/links.rb
CHANGED
@@ -14,7 +14,26 @@ module PMP
|
|
14
14
|
|
15
15
|
def []=(k, link)
|
16
16
|
super
|
17
|
-
|
17
|
+
set_parent(link)
|
18
|
+
add_link_name(k)
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_link_name(name)
|
22
|
+
name = name.to_sym
|
23
|
+
unless parent.respond_to?(name)
|
24
|
+
parent.define_singleton_method(name) { self.links[name] }
|
25
|
+
parent.define_singleton_method("#{name}=") { |x| puts "setter: #{self.inspect}"; self.links[name] = x }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def set_parent(link)
|
30
|
+
if link.respond_to?(:parent)
|
31
|
+
link.parent = self.parent
|
32
|
+
elsif link.is_a?(Hash)
|
33
|
+
link.values.each{|l| set_parent(l)}
|
34
|
+
elsif link.is_a?(Enumerable)
|
35
|
+
link.each{|l| set_parent(l)}
|
36
|
+
end
|
18
37
|
end
|
19
38
|
|
20
39
|
end
|
data/lib/pmp/parser.rb
CHANGED
@@ -63,7 +63,7 @@ module PMP
|
|
63
63
|
|
64
64
|
def parse_links(document)
|
65
65
|
Array(document).each do |k,v|
|
66
|
-
link = parse_link(k,v)
|
66
|
+
link = parse_link(k,v)
|
67
67
|
if link
|
68
68
|
self.links[k] = link
|
69
69
|
end
|
@@ -74,18 +74,18 @@ module PMP
|
|
74
74
|
if ['query', 'edit', 'navigation'].include?(name.to_s)
|
75
75
|
parse_links_list(info)
|
76
76
|
elsif !info.is_a?(Array)
|
77
|
-
Link.new(
|
77
|
+
Link.new(info)
|
78
78
|
elsif info.size == 1
|
79
|
-
Link.new(
|
79
|
+
Link.new(info.first)
|
80
80
|
elsif info.size > 0
|
81
|
-
info.map{|l| Link.new(
|
81
|
+
info.map{|l| Link.new(l)}
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
def parse_links_list(links)
|
86
86
|
links.inject({}) do |results, query|
|
87
87
|
rel = query['rels'].first
|
88
|
-
results[rel] = Link.new(
|
88
|
+
results[rel] = Link.new(query)
|
89
89
|
results
|
90
90
|
end
|
91
91
|
end
|
data/lib/pmp/version.rb
CHANGED
data/pmp.gemspec
CHANGED
@@ -27,7 +27,6 @@ Gem::Specification.new do |gem|
|
|
27
27
|
gem.add_development_dependency('guard-bundler')
|
28
28
|
gem.add_development_dependency('guard-minitest')
|
29
29
|
gem.add_development_dependency('simplecov')
|
30
|
-
gem.add_development_dependency('simplecov-gem-adapter')
|
31
30
|
|
32
31
|
gem.add_runtime_dependency('faraday')
|
33
32
|
gem.add_runtime_dependency('faraday_middleware')
|
data/spec/client_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
5
5
|
describe PMP::Client do
|
6
6
|
|
7
7
|
before(:each) {
|
8
|
-
@pmp = PMP::Client.new
|
8
|
+
@pmp = PMP::Client.new(oauth_token: 'thisisatestvalueonly')
|
9
9
|
}
|
10
10
|
|
11
11
|
it "make with options and pass along" do
|
@@ -32,4 +32,42 @@ describe PMP::Client do
|
|
32
32
|
@root.creator.must_be_instance_of PMP::Link
|
33
33
|
end
|
34
34
|
|
35
|
+
it "gets a credentials object" do
|
36
|
+
@pmp.credentials.wont_be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it "gets a token object" do
|
40
|
+
|
41
|
+
access_token = "thisisnotanaccesstokenno"
|
42
|
+
response_body = {
|
43
|
+
access_token: access_token,
|
44
|
+
token_type: "Bearer",
|
45
|
+
token_issue_date: DateTime.now,
|
46
|
+
token_expires_in: 24*60*60
|
47
|
+
}.to_json
|
48
|
+
|
49
|
+
stub_request(:post, "https://api.pmp.io/auth/access_token").
|
50
|
+
with(:body => {"grant_type"=>"client_credentials"},
|
51
|
+
:headers => {'Accept'=>'application/json', 'Authorization'=>'Basic dGhpc2lzbm90YS1yZWFsLWNsaWVudC1pZC1zb3Zlcnlzb3JyeTp0aGlzaXNub3RhcmVhbHNlY3JldGVpdGhlcg==', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'api.pmp.io:443'}).
|
52
|
+
to_return(:status => 200, :body => response_body, :headers => {'Content-Type' => 'application/json; charset=utf-8'})
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
client_id = "thisisnota-real-client-id-soverysorry"
|
57
|
+
client_secret = "thisisnotarealsecreteither"
|
58
|
+
|
59
|
+
pmp = PMP::Client.new(client_id: client_id, client_secret: client_secret)
|
60
|
+
|
61
|
+
pmp.token.wont_be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it "creates profile uri for type" do
|
65
|
+
@pmp.profile_href_for_type('foo').must_equal("https://api.pmp.io/profiles/foo")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "makes a doc of a profile type" do
|
69
|
+
user = @pmp.doc_of_type('user')
|
70
|
+
user.links['profile'].href.must_equal "https://api.pmp.io/profiles/user"
|
71
|
+
end
|
72
|
+
|
35
73
|
end
|
@@ -140,7 +140,7 @@ describe PMP::CollectionDocument do
|
|
140
140
|
|
141
141
|
it "should get the list of query links" do
|
142
142
|
queries = @doc.query
|
143
|
-
queries.must_be_instance_of
|
143
|
+
queries.must_be_instance_of HashWithIndifferentAccess
|
144
144
|
end
|
145
145
|
|
146
146
|
it "should get a query by rels" do
|
@@ -159,6 +159,13 @@ describe PMP::CollectionDocument do
|
|
159
159
|
doc.guid.wont_be_nil
|
160
160
|
end
|
161
161
|
|
162
|
+
it "can add a new link" do
|
163
|
+
doc = PMP::CollectionDocument.new
|
164
|
+
link = PMP::Link.new(href: 'http://pmp.io/test')
|
165
|
+
doc.links['test'] = link
|
166
|
+
doc.test.must_equal link
|
167
|
+
end
|
168
|
+
|
162
169
|
it "can save a new record" do
|
163
170
|
|
164
171
|
# stub getting the root doc
|
@@ -170,12 +177,13 @@ describe PMP::CollectionDocument do
|
|
170
177
|
# stub saving the new doc
|
171
178
|
stub_request(:put, "https://publish-sandbox.pmp.io/docs/c144e4df-021b-41e6-9cf3-42ac49bcbd42").
|
172
179
|
with(:headers => {'Accept'=>'application/vnd.pmp.collection.doc+json', 'Content-Type'=>'application/vnd.pmp.collection.doc+json', 'Host'=>'publish-sandbox.pmp.io:443'}).
|
173
|
-
to_return(:status => 200, :body => '{"url":"https://
|
180
|
+
to_return(:status => 200, :body => '{"url":"https://api-sandbox.pmp.io/docs/c144e4df-021b-41e6-9cf3-42ac49bcbd42"}')
|
174
181
|
|
175
|
-
doc = PMP::CollectionDocument.new
|
182
|
+
doc = PMP::CollectionDocument.new(oauth_token: 'thisisatestvalueonly')
|
176
183
|
doc.guid = "c144e4df-021b-41e6-9cf3-42ac49bcbd42"
|
177
184
|
doc.title = "testing"
|
178
185
|
doc.save
|
186
|
+
doc.href.must_equal "https://api-sandbox.pmp.io/docs/c144e4df-021b-41e6-9cf3-42ac49bcbd42"
|
179
187
|
end
|
180
188
|
|
181
189
|
it "can delete a record" do
|
@@ -190,7 +198,7 @@ describe PMP::CollectionDocument do
|
|
190
198
|
with(:headers => {'Accept'=>'application/vnd.pmp.collection.doc+json', 'Content-Type'=>'application/vnd.pmp.collection.doc+json', 'Host'=>'publish-sandbox.pmp.io:443'}).
|
191
199
|
to_return(:status => 204, :body => "", :headers => {})
|
192
200
|
|
193
|
-
doc = PMP::CollectionDocument.new
|
201
|
+
doc = PMP::CollectionDocument.new(oauth_token: 'thisisatestvalueonly')
|
194
202
|
doc.guid = "c144e4df-021b-41e6-9cf3-42ac49bcbd42"
|
195
203
|
doc.delete
|
196
204
|
end
|
data/spec/configuration_spec.rb
CHANGED
@@ -15,28 +15,36 @@ end
|
|
15
15
|
describe PMP::Configuration do
|
16
16
|
|
17
17
|
before {
|
18
|
+
@tc = TestConfiguration.new
|
18
19
|
@client_id = ENV['PMP_API_KEY'] || "pmp-test-key"
|
19
20
|
@client_secret = ENV['PMP_API_SECRET'] || "pmp-test-secret"
|
20
21
|
}
|
21
22
|
|
22
23
|
it "is initialized with defaults" do
|
23
|
-
tc
|
24
|
-
tc.options.
|
25
|
-
tc.options.
|
26
|
-
|
24
|
+
@tc.options.wont_be_nil
|
25
|
+
@tc.options.keys.sort.must_equal PMP::Configuration::VALID_OPTIONS_KEYS.sort
|
26
|
+
@tc.options[:endpoint].must_equal PMP::Configuration::DEFAULT_ENDPOINT
|
27
|
+
end
|
28
|
+
|
29
|
+
it "can use block to configure" do
|
30
|
+
@tc.endpoint.wont_equal 'foo'
|
31
|
+
@tc.configure {|c| c.endpoint = 'foo'}
|
32
|
+
@tc.endpoint.must_equal 'foo'
|
33
|
+
end
|
34
|
+
|
35
|
+
it "can provide a list of keys" do
|
36
|
+
TestConfiguration.keys.must_be_instance_of Array
|
27
37
|
end
|
28
38
|
|
29
39
|
it "can access configuration methods" do
|
30
|
-
tc
|
31
|
-
tc.endpoint.must_equal PMP::Configuration::DEFAULT_ENDPOINT
|
40
|
+
@tc.endpoint.must_equal PMP::Configuration::DEFAULT_ENDPOINT
|
32
41
|
end
|
33
42
|
|
34
43
|
it "can change config and see reflected in options" do
|
35
|
-
tc
|
36
|
-
tc.endpoint
|
37
|
-
tc.endpoint
|
38
|
-
tc.endpoint.must_equal 'test'
|
39
|
-
tc.options[:endpoint].must_equal 'test'
|
44
|
+
@tc.endpoint.must_equal PMP::Configuration::DEFAULT_ENDPOINT
|
45
|
+
@tc.endpoint = 'test'
|
46
|
+
@tc.endpoint.must_equal 'test'
|
47
|
+
@tc.options[:endpoint].must_equal 'test'
|
40
48
|
end
|
41
49
|
|
42
50
|
it "is initialized with specific values" do
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
4
|
+
|
5
|
+
require 'pmp/credential'
|
6
|
+
|
7
|
+
require 'webmock/minitest'
|
8
|
+
|
9
|
+
describe PMP::Credential do
|
10
|
+
|
11
|
+
before(:each) {
|
12
|
+
@credential = PMP::Credential.new(user: "test", password: "password", endpoint: "https://api-sandbox.pmp.io/")
|
13
|
+
}
|
14
|
+
|
15
|
+
it "has the user and password in the config" do
|
16
|
+
@credential.user.must_equal 'test'
|
17
|
+
@credential.password.must_equal 'password'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "gets the base path for this subclass of API" do
|
21
|
+
credential = PMP::Credential.new
|
22
|
+
credential.credentials_url.must_equal "https://api.pmp.io/auth/credentials"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "create a credential" do
|
26
|
+
response_body = {
|
27
|
+
client_id: "thisisnota-real-client-id-soverysorry",
|
28
|
+
client_secret: "thisisnotarealsecreteither",
|
29
|
+
token_expires_in: 1209600,
|
30
|
+
scope: "write"
|
31
|
+
}.to_json
|
32
|
+
|
33
|
+
stub_request(:post, "https://api-sandbox.pmp.io/auth/credentials").
|
34
|
+
with(:body => {"label"=>"what", "scope"=>"read", "token_expires_in"=>"2592000"},
|
35
|
+
:headers => {'Accept'=>'*/*', 'Authorization'=>'Basic dGVzdDpwYXNzd29yZA==', 'Content-Type'=>'application/x-www-form-urlencoded', 'Host'=>'api-sandbox.pmp.io:443'}).
|
36
|
+
to_return(:status => 200, :body => response_body, :headers => {})
|
37
|
+
|
38
|
+
new_creds = @credential.create(label: 'what')
|
39
|
+
new_creds.client_id.must_equal "thisisnota-real-client-id-soverysorry"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "list credentials" do
|
43
|
+
|
44
|
+
response_body = {
|
45
|
+
clients: [
|
46
|
+
{
|
47
|
+
client_id: "thisisnota-real-client-id-soverysorry1",
|
48
|
+
client_secret: "thisisnotarealsecreteither1",
|
49
|
+
label: "label 1",
|
50
|
+
token_expires_in: 1209600,
|
51
|
+
scope: "write"
|
52
|
+
},
|
53
|
+
{
|
54
|
+
client_id: "thisisnota-real-client-id-soverysorry2",
|
55
|
+
client_secret: "thisisnotarealsecreteither2",
|
56
|
+
label: "label 2",
|
57
|
+
token_expires_in: 1209600,
|
58
|
+
scope: "read"
|
59
|
+
}
|
60
|
+
]
|
61
|
+
}.to_json
|
62
|
+
|
63
|
+
stub_request(:get, "https://api-sandbox.pmp.io/auth/credentials").
|
64
|
+
with(:headers => {'Accept'=>'*/*', 'Authorization'=>'Basic dGVzdDpwYXNzd29yZA==', 'Content-Type'=>'', 'Host'=>'api-sandbox.pmp.io:443'}).
|
65
|
+
to_return(:status => 200, :body => response_body, :headers => {})
|
66
|
+
|
67
|
+
all_creds = @credential.list
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/spec/link_spec.rb
CHANGED
@@ -9,9 +9,9 @@ require 'webmock/minitest'
|
|
9
9
|
describe PMP::Link do
|
10
10
|
|
11
11
|
before(:each) {
|
12
|
-
@parent =
|
12
|
+
@parent = PMP::CollectionDocument.new(oauth_token:'thisisnotarealtoken')
|
13
13
|
@info = {'href' => 'http://api-sandbox.pmp.io/docs/'}
|
14
|
-
@link = PMP::Link.new(@
|
14
|
+
@link = PMP::Link.new(@info, @parent)
|
15
15
|
}
|
16
16
|
|
17
17
|
it "can create a new link" do
|
@@ -21,9 +21,9 @@ describe PMP::Link do
|
|
21
21
|
it "has a parent" do
|
22
22
|
@link = PMP::Link.new
|
23
23
|
@link.parent.wont_be_nil
|
24
|
-
|
25
|
-
@link = PMP::Link.new(
|
26
|
-
@link.parent.must_equal(
|
24
|
+
parent = PMP::CollectionDocument.new
|
25
|
+
@link = PMP::Link.new(@info, parent)
|
26
|
+
@link.parent.must_equal(parent)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "can save params to attributes" do
|
@@ -48,7 +48,7 @@ describe PMP::Link do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it "can get a link for templated href" do
|
51
|
-
@link = PMP::Link.new(@parent
|
51
|
+
@link = PMP::Link.new(query_document_info, @parent)
|
52
52
|
@link.hints.must_equal query_document_info['hints']
|
53
53
|
@link.url.must_equal "https://api-sandbox.pmp.io/docs"
|
54
54
|
@link.where('limit' => 10).url.must_equal "https://api-sandbox.pmp.io/docs?limit=10"
|
@@ -63,7 +63,7 @@ describe PMP::Link do
|
|
63
63
|
with(:headers => {'Accept'=>'application/vnd.pmp.collection.doc+json', 'Content-Type'=>'application/vnd.pmp.collection.doc+json', 'Host'=>'api-sandbox.pmp.io:443'}).
|
64
64
|
to_return(:status => 200, :body => link_doc, :headers => {})
|
65
65
|
|
66
|
-
@link = PMP::Link.new(
|
66
|
+
@link = PMP::Link.new(query_document_info, @parent)
|
67
67
|
docs = @link.where(limit: 10, tag: 'test')
|
68
68
|
docs.must_be_instance_of PMP::Link
|
69
69
|
guids = docs.items.collect(&:guid).sort
|
data/spec/links_spec.rb
CHANGED
@@ -8,8 +8,9 @@ require 'pmp/links'
|
|
8
8
|
describe PMP::Links do
|
9
9
|
|
10
10
|
before(:each) {
|
11
|
-
@parent =
|
11
|
+
@parent = PMP::CollectionDocument.new
|
12
12
|
@links = PMP::Links.new(@parent)
|
13
|
+
@parent.links = @links
|
13
14
|
}
|
14
15
|
|
15
16
|
it "can create a new links obj" do
|
@@ -23,9 +24,9 @@ describe PMP::Links do
|
|
23
24
|
|
24
25
|
it "can have a link assigned" do
|
25
26
|
link = {}
|
26
|
-
@parent.expect(:foo=, link, Array(Object))
|
27
27
|
@links['foo'] = link
|
28
28
|
@links['foo'].must_equal link
|
29
|
+
@parent.foo.must_equal link
|
29
30
|
end
|
30
31
|
|
31
|
-
end
|
32
|
+
end
|
data/spec/parser_spec.rb
CHANGED
@@ -41,7 +41,7 @@ describe PMP::Parser do
|
|
41
41
|
it "parses query links into a hash based on rels" do
|
42
42
|
tc = TestParser.new
|
43
43
|
tc.parse(json_fixture(:collection_root))
|
44
|
-
tc.query.must_be_instance_of
|
44
|
+
tc.query.must_be_instance_of HashWithIndifferentAccess
|
45
45
|
tc.query.keys.sort.must_equal ["urn:pmp:hreftpl:docs", "urn:pmp:hreftpl:profiles", "urn:pmp:hreftpl:schemas", "urn:pmp:query:docs", "urn:pmp:query:groups", "urn:pmp:query:guids", "urn:pmp:query:users"]
|
46
46
|
end
|
47
47
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pmp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kuklewicz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -136,20 +136,6 @@ dependencies:
|
|
136
136
|
- - '>='
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: simplecov-gem-adapter
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - '>='
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :development
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - '>='
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
140
|
name: faraday
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -277,11 +263,13 @@ files:
|
|
277
263
|
- LICENSE.txt
|
278
264
|
- README.md
|
279
265
|
- Rakefile
|
266
|
+
- example/permissions.rb
|
280
267
|
- lib/pmp.rb
|
281
268
|
- lib/pmp/client.rb
|
282
269
|
- lib/pmp/collection_document.rb
|
283
270
|
- lib/pmp/configuration.rb
|
284
271
|
- lib/pmp/connection.rb
|
272
|
+
- lib/pmp/credential.rb
|
285
273
|
- lib/pmp/link.rb
|
286
274
|
- lib/pmp/links.rb
|
287
275
|
- lib/pmp/parser.rb
|
@@ -294,6 +282,7 @@ files:
|
|
294
282
|
- spec/collection_document_spec.rb
|
295
283
|
- spec/configuration_spec.rb
|
296
284
|
- spec/connection_spec.rb
|
285
|
+
- spec/credential_spec.rb
|
297
286
|
- spec/fixtures/collection_basic.json
|
298
287
|
- spec/fixtures/collection_query.json
|
299
288
|
- spec/fixtures/collection_root.json
|
@@ -333,6 +322,7 @@ test_files:
|
|
333
322
|
- spec/collection_document_spec.rb
|
334
323
|
- spec/configuration_spec.rb
|
335
324
|
- spec/connection_spec.rb
|
325
|
+
- spec/credential_spec.rb
|
336
326
|
- spec/fixtures/collection_basic.json
|
337
327
|
- spec/fixtures/collection_query.json
|
338
328
|
- spec/fixtures/collection_root.json
|