pmp 0.1.3 → 0.2.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/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
|