payload-api 0.2.5 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-app.yml +25 -0
- data/lib/payload/arm/object.rb +96 -19
- data/lib/payload/arm/request.rb +69 -28
- data/lib/payload/arm/session.rb +53 -0
- data/lib/payload/objects.rb +5 -1
- data/lib/payload/version.rb +1 -1
- data/lib/payload.rb +34 -3
- data/spec/payload/arm/request_spec.rb +762 -0
- data/spec/payload/arm/session_spec.rb +144 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74d5e99e6b4b79f89e876de732d0b202c52652091467f975de5d91aedc7c1b2b
|
4
|
+
data.tar.gz: beed06286c333c72bb34841414e394e2dd15b971f3dbff5bb5e12141611eac91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '009d5bd388d06f3ddff528ac3a7ddb46ee211d1094733bbe096ec4044706f1e1757fb2b064532fe40517e53e5f6eef694b18862b154221869d9fff868386371c'
|
7
|
+
data.tar.gz: 646a54524964916d4f9f405e01db6496b33247d1f4af22f6604dc050d543bf1850c983cf01a8a88e43bf1ea250365495a1252e981ef58c3a4f3c8891a48ed085
|
@@ -0,0 +1,25 @@
|
|
1
|
+
name: RSpec Tests
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
rspec:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- name: Checkout code
|
15
|
+
uses: actions/checkout@v2
|
16
|
+
|
17
|
+
- name: Set up Ruby
|
18
|
+
uses: ruby/setup-ruby@v1
|
19
|
+
with:
|
20
|
+
ruby-version: 3.0.1
|
21
|
+
|
22
|
+
- name: Run RSpec tests
|
23
|
+
run: |
|
24
|
+
gem install rspec
|
25
|
+
rspec spec
|
data/lib/payload/arm/object.rb
CHANGED
@@ -1,39 +1,92 @@
|
|
1
1
|
require "payload/arm/request"
|
2
2
|
|
3
3
|
module Payload
|
4
|
+
class ARMObjectWrapper
|
5
|
+
@cls
|
6
|
+
@session
|
7
|
+
|
8
|
+
def initialize(cls, session)
|
9
|
+
@cls = cls
|
10
|
+
@session = session
|
11
|
+
end
|
12
|
+
|
13
|
+
def new(data)
|
14
|
+
return @cls.new(data)
|
15
|
+
end
|
16
|
+
|
17
|
+
def all()
|
18
|
+
return @cls.all(:session => @session)
|
19
|
+
end
|
20
|
+
|
21
|
+
def filter_by(*args, **data)
|
22
|
+
return @cls.filter_by(*args, **data, :session => @session)
|
23
|
+
end
|
24
|
+
|
25
|
+
def create(*args, **data)
|
26
|
+
return @cls.create(*args, **data, :session => @session)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get(id)
|
30
|
+
return @cls.get(id, :session => @session)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
4
35
|
class ARMObject
|
5
36
|
@poly = nil
|
6
37
|
@data = nil
|
7
38
|
@@cache = {}
|
39
|
+
@session = nil
|
8
40
|
|
9
41
|
class << self
|
10
|
-
attr_reader :spec, :poly, :data
|
42
|
+
attr_reader :spec, :poly, :data, :session
|
11
43
|
end
|
12
44
|
|
13
|
-
def initialize(data)
|
45
|
+
def initialize(data, session = nil)
|
14
46
|
self.set_data(data)
|
15
47
|
end
|
16
48
|
|
17
|
-
def self.new(data)
|
18
|
-
|
19
|
-
|
20
|
-
|
49
|
+
def self.new(data, session = nil)
|
50
|
+
|
51
|
+
session = session || Payload::Session.new(Payload::api_key, Payload::api_url)
|
52
|
+
session_key = session.object_id
|
53
|
+
|
54
|
+
if !@@cache.key?(session_key)
|
55
|
+
@@cache[session_key] = {}
|
56
|
+
end
|
57
|
+
|
58
|
+
session_cache = @@cache[session_key]
|
59
|
+
|
60
|
+
id = data.key?(:id) ? data[:id] : data.key?('id') ? data['id'] : nil
|
61
|
+
if id && session_cache.key?(id)
|
62
|
+
session_cache[id].set_data(data)
|
63
|
+
return session_cache[id]
|
21
64
|
else
|
22
65
|
inst = super
|
23
|
-
|
24
|
-
|
66
|
+
inst.set_session(session)
|
67
|
+
inst.set_data(data)
|
68
|
+
if id
|
69
|
+
session_cache[id] = inst
|
25
70
|
end
|
26
71
|
|
27
72
|
return inst
|
28
73
|
end
|
29
74
|
end
|
30
75
|
|
76
|
+
def session
|
77
|
+
@session
|
78
|
+
end
|
79
|
+
|
80
|
+
def set_session(session)
|
81
|
+
@session = session
|
82
|
+
end
|
83
|
+
|
31
84
|
def data
|
32
85
|
@data
|
33
86
|
end
|
34
87
|
|
35
88
|
def set_data(data)
|
36
|
-
@data = data
|
89
|
+
@data = data.transform_keys { |key| key.to_s }
|
37
90
|
end
|
38
91
|
|
39
92
|
def method_missing(name, *args)
|
@@ -49,37 +102,61 @@ module Payload
|
|
49
102
|
return @data[key]
|
50
103
|
end
|
51
104
|
|
105
|
+
def _get_request()
|
106
|
+
return Payload::ARMRequest.new(self.class, @session)
|
107
|
+
end
|
108
|
+
|
109
|
+
def self._get_request(session=nil)
|
110
|
+
return Payload::ARMRequest.new(self, session)
|
111
|
+
end
|
112
|
+
|
52
113
|
def self.select(*args, **data)
|
53
|
-
return
|
114
|
+
return self._get_request().select(*args, **data)
|
54
115
|
end
|
55
116
|
|
56
117
|
def self.filter_by(*args, **data)
|
57
|
-
|
118
|
+
session = data[:session]
|
119
|
+
data.delete(:session)
|
120
|
+
return self._get_request(session).filter_by(*args, **data)
|
58
121
|
end
|
59
122
|
|
60
123
|
def self.create(*args, **data)
|
124
|
+
session = data[:session]
|
125
|
+
data.delete(:session)
|
61
126
|
if args.length != 0
|
62
|
-
return
|
127
|
+
return self._get_request(session).create(args[0])
|
63
128
|
else
|
64
|
-
return
|
129
|
+
return self._get_request(session).create(data)
|
65
130
|
end
|
66
131
|
end
|
67
132
|
|
68
|
-
def self.get(id)
|
69
|
-
return
|
133
|
+
def self.get(id, session: nil)
|
134
|
+
return self._get_request(session).get(id)
|
70
135
|
end
|
71
136
|
|
72
137
|
def self.delete(objects)
|
73
|
-
return
|
138
|
+
return self._get_request().delete_all(objects)
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.all(session: nil)
|
142
|
+
return self._get_request(session).all()
|
74
143
|
end
|
75
144
|
|
76
145
|
def update(**update)
|
77
|
-
return
|
146
|
+
return _get_request()._request('Put', id: self.id, json: update)
|
78
147
|
end
|
79
148
|
|
80
149
|
def delete()
|
81
|
-
return
|
150
|
+
return _get_request()._request('Delete', id: self.id)
|
151
|
+
end
|
152
|
+
|
153
|
+
def to_json(*args)
|
154
|
+
serialized = {}
|
155
|
+
if self.class.poly
|
156
|
+
serialized.merge!(self.class.poly)
|
157
|
+
end
|
158
|
+
serialized.merge!(@data)
|
159
|
+
return serialized.to_json(*args)
|
82
160
|
end
|
83
161
|
end
|
84
162
|
end
|
85
|
-
|
data/lib/payload/arm/request.rb
CHANGED
@@ -8,24 +8,20 @@ module Payload
|
|
8
8
|
class ARMRequest
|
9
9
|
@cls = nil
|
10
10
|
|
11
|
-
def initialize(cls=nil)
|
11
|
+
def initialize(cls=nil, session=nil)
|
12
12
|
@cls = cls
|
13
|
-
@
|
13
|
+
@session = session || Payload::Session.new(Payload::api_key, Payload::api_url)
|
14
14
|
@filters = {}
|
15
15
|
end
|
16
16
|
|
17
17
|
def select(*args, **data)
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
@selected_fields = args.join(',')
|
23
|
-
|
18
|
+
@filters['fields'] = args.map {|a| a.strip }.join(',')
|
19
|
+
|
24
20
|
return self
|
25
21
|
end
|
26
22
|
|
27
23
|
def filter_by(*args, **data)
|
28
|
-
if @cls.poly
|
24
|
+
if !@cls.nil? && @cls.poly
|
29
25
|
data = data.merge(@cls.poly)
|
30
26
|
end
|
31
27
|
|
@@ -51,9 +47,49 @@ module Payload
|
|
51
47
|
._request('Put', json: updates)
|
52
48
|
end
|
53
49
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
50
|
+
def update_all(updates)
|
51
|
+
updates.map do |obj, update|
|
52
|
+
if obj.kind_of?(ARMObject)
|
53
|
+
if @cls and not obj.instance_of?(@cls)
|
54
|
+
throw "All objects must be of the same type"
|
55
|
+
end
|
56
|
+
|
57
|
+
@cls = obj.class
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
updates = {
|
62
|
+
object: 'list',
|
63
|
+
values: updates.map do |obj, update|
|
64
|
+
update['id'] = obj.id
|
65
|
+
update
|
66
|
+
end
|
67
|
+
}
|
68
|
+
|
69
|
+
return self._request('Put', json: updates)
|
70
|
+
end
|
71
|
+
|
72
|
+
def delete_all(objects)
|
73
|
+
deletes = objects.map do |obj|
|
74
|
+
if obj.kind_of?(ARMObject)
|
75
|
+
if @cls and not obj.instance_of?(@cls)
|
76
|
+
throw "All objects must be of the same type"
|
77
|
+
end
|
78
|
+
|
79
|
+
@cls = obj.class
|
80
|
+
obj = { id: obj.id }
|
81
|
+
end
|
82
|
+
|
83
|
+
obj
|
84
|
+
end
|
85
|
+
|
86
|
+
data = { object: 'list', values: deletes }
|
87
|
+
|
88
|
+
return self._request('Delete', json: data)
|
89
|
+
end
|
90
|
+
|
91
|
+
def delete()
|
92
|
+
return self.filter_by(mode: 'query')
|
57
93
|
._request('Delete')
|
58
94
|
end
|
59
95
|
|
@@ -86,26 +122,30 @@ module Payload
|
|
86
122
|
return self._request('Post', json: data)
|
87
123
|
end
|
88
124
|
|
89
|
-
def
|
90
|
-
|
91
|
-
|
92
|
-
fields_list = []
|
93
|
-
fields_list << @filters['fields'] if @filters['fields'] && !@filters['fields'].empty?
|
94
|
-
fields_list << @selected_fields if @selected_fields && !@selected_fields.empty?
|
95
|
-
@filters['fields'] = fields_list.join(',') if fields_list.any?
|
96
|
-
@filters['fields'] ||= '*'
|
125
|
+
def _execute_request(http, request)
|
126
|
+
http.request(request)
|
127
|
+
end
|
97
128
|
|
98
|
-
|
99
|
-
|
129
|
+
def _request(method, id: nil, json: nil)
|
130
|
+
if !@cls.nil?
|
131
|
+
if @cls.spec.key?("endpoint")
|
132
|
+
endpoint = @cls.spec["endpoint"]
|
133
|
+
else
|
134
|
+
endpoint = "/"+@cls.spec["object"]+"s"
|
135
|
+
end
|
100
136
|
else
|
101
|
-
|
137
|
+
if json.is_a? Array
|
138
|
+
if json.all? {|obj| obj.key?("object") }
|
139
|
+
endpoint = json[0]["object"]+"s"
|
140
|
+
end
|
141
|
+
end
|
102
142
|
end
|
103
143
|
|
104
144
|
if id
|
105
145
|
endpoint = File.join(endpoint, id)
|
106
146
|
end
|
107
147
|
|
108
|
-
url = URI.join(
|
148
|
+
url = URI.join(@session.api_url, endpoint)
|
109
149
|
url.query = URI.encode_www_form(@filters)
|
110
150
|
|
111
151
|
http = Net::HTTP.new(url.host, url.port)
|
@@ -115,14 +155,14 @@ module Payload
|
|
115
155
|
end
|
116
156
|
|
117
157
|
request = Net::HTTP.const_get(method).new(url.request_uri)
|
118
|
-
request.basic_auth(
|
158
|
+
request.basic_auth(@session.api_key, '')
|
119
159
|
|
120
160
|
if json
|
121
161
|
request.body = json.to_json
|
122
162
|
request.add_field('Content-Type', 'application/json')
|
123
163
|
end
|
124
164
|
|
125
|
-
response =
|
165
|
+
response = self._execute_request(http, request)
|
126
166
|
|
127
167
|
begin
|
128
168
|
data = JSON.parse(response.body)
|
@@ -141,11 +181,12 @@ module Payload
|
|
141
181
|
if cls.nil?
|
142
182
|
obj
|
143
183
|
else
|
144
|
-
cls.new(obj)
|
184
|
+
ret = cls.new(obj, @session)
|
185
|
+
ret
|
145
186
|
end
|
146
187
|
end
|
147
188
|
else
|
148
|
-
return Payload::get_cls(data).new(data)
|
189
|
+
return Payload::get_cls(data).new(data, @session)
|
149
190
|
end
|
150
191
|
else
|
151
192
|
for error in Payload::subclasses(Payload::PayloadError)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'payload/arm/request'
|
2
|
+
|
3
|
+
|
4
|
+
module Payload
|
5
|
+
|
6
|
+
class Session
|
7
|
+
attr_accessor :api_key, :api_url
|
8
|
+
|
9
|
+
def initialize(api_key, api_url=nil)
|
10
|
+
@api_key = api_key
|
11
|
+
@api_url = api_url || Payload.URL
|
12
|
+
|
13
|
+
Payload.constants.each do |c|
|
14
|
+
val = Payload.const_get(c)
|
15
|
+
if val.is_a?(Class) && val < Payload::ARMObject
|
16
|
+
define_singleton_method(c) { Payload::ARMObjectWrapper.new(val, self) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def _get_request(cls = nil)
|
22
|
+
return Payload::ARMRequest.new(cls, self)
|
23
|
+
end
|
24
|
+
|
25
|
+
def query(cls)
|
26
|
+
return self._get_request(cls)
|
27
|
+
end
|
28
|
+
|
29
|
+
def create(objects)
|
30
|
+
return self._get_request().create(objects)
|
31
|
+
end
|
32
|
+
|
33
|
+
def update(objects)
|
34
|
+
return self._get_request().update_all(objects)
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete(objects)
|
38
|
+
return self._get_request().delete_all(objects)
|
39
|
+
end
|
40
|
+
|
41
|
+
def ==(other)
|
42
|
+
return false unless other.is_a?(Session)
|
43
|
+
|
44
|
+
# Compare the attributes for equality
|
45
|
+
api_key == other.api_key &&
|
46
|
+
api_url == other.api_url
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"#{api_key} @ #{api_url}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/payload/objects.rb
CHANGED
@@ -67,7 +67,7 @@ module Payload
|
|
67
67
|
|
68
68
|
class ChargeItem < ARMObject
|
69
69
|
@spec = { 'object' => 'line_item' }
|
70
|
-
@poly = { '
|
70
|
+
@poly = { 'entry_type' => 'charge' }
|
71
71
|
end
|
72
72
|
|
73
73
|
class PaymentItem < ARMObject
|
@@ -82,4 +82,8 @@ module Payload
|
|
82
82
|
class Webhook < ARMObject
|
83
83
|
@spec = { 'object' => 'webhook' }
|
84
84
|
end
|
85
|
+
|
86
|
+
class PaymentLink < ARMObject
|
87
|
+
@spec = { 'object' => 'payment_link' }
|
88
|
+
end
|
85
89
|
end
|
data/lib/payload/version.rb
CHANGED
data/lib/payload.rb
CHANGED
@@ -1,16 +1,47 @@
|
|
1
1
|
require "payload/version"
|
2
2
|
require "payload/objects"
|
3
|
+
require "payload/arm/session"
|
3
4
|
|
4
5
|
module Payload
|
5
6
|
@URL = "https://api.payload.co"
|
6
|
-
@api_url = @URL
|
7
|
-
@api_key = nil
|
8
7
|
|
9
8
|
class << self
|
10
|
-
|
9
|
+
def api_key=(value)
|
10
|
+
session.api_key = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_key
|
14
|
+
session.api_key
|
15
|
+
end
|
16
|
+
|
17
|
+
def api_url=(value)
|
18
|
+
session.api_url = value
|
19
|
+
end
|
20
|
+
|
21
|
+
def api_url
|
22
|
+
session.api_url
|
23
|
+
end
|
24
|
+
|
25
|
+
def URL
|
26
|
+
@URL
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def session
|
32
|
+
@session ||= Payload::Session.new(nil, @URL)
|
33
|
+
end
|
11
34
|
end
|
12
35
|
|
13
36
|
def self.create(objects)
|
14
37
|
return Payload::ARMRequest.new().create(objects)
|
15
38
|
end
|
39
|
+
|
40
|
+
def self.update(objects)
|
41
|
+
return Payload::ARMRequest.new().update_all(objects)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.delete(objects)
|
45
|
+
return Payload::ARMRequest.new().delete_all(objects)
|
46
|
+
end
|
16
47
|
end
|