chord 0.0.5 → 0.0.7
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/CHANGELOG.md +11 -0
- data/README.md +57 -7
- data/lib/chord/version.rb +1 -1
- data/lib/chord.rb +52 -25
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4caa956b7d9f279a1973f2a5ad5e63f0078697ecb1fc129fcff09c10dfcdbbc3
|
4
|
+
data.tar.gz: c4a93aa0e26f11d6bb42b7345b1dead92f685eafb43d96fa34516d05eb3a09a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fa44ce53bc77f079140bab0838a66196314f103f3c515ea8dd90c9341af047fa5afb19925189a864652590d4fcf2f431095ceb4cbbde99725085dd72477206e
|
7
|
+
data.tar.gz: f30e7aa9d991c7822ab93777a8a6de9c9f6df943a83d8bf7c629a2b1f3ba18bc485d570a2aa152ca14f2e01d6b3e794925d1cf931199ad76f78a3ddb868b9feb
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,17 @@
|
|
2
2
|
|
3
3
|
Major changes for each release. Please see the Git log for complete list of changes.
|
4
4
|
|
5
|
+
## 0.0.7
|
6
|
+
|
7
|
+
* Remove ActiveRecord dependency.
|
8
|
+
* Make some methods private.
|
9
|
+
* Raise APIError when no data returned.
|
10
|
+
|
11
|
+
## 0.0.6
|
12
|
+
|
13
|
+
* Return User objects from Role#users.
|
14
|
+
* Add config methods.
|
15
|
+
|
5
16
|
## 0.0.5
|
6
17
|
|
7
18
|
* Add expand! method.
|
data/README.md
CHANGED
@@ -8,22 +8,72 @@ These classes provide simple read and write access to the Chord OMS API. Get sta
|
|
8
8
|
)
|
9
9
|
|
10
10
|
u = Chord::User.find(1) # fetch user
|
11
|
-
u.
|
12
|
-
u.
|
13
|
-
u.update(
|
14
|
-
# hash is merged into the existing value and
|
15
|
-
# keys and values are stringified (since
|
16
|
-
# metadata is stored in OMS as a JSON string)
|
11
|
+
u.email # view an attribute
|
12
|
+
u.attributes # see all attributes (returns hash)
|
13
|
+
u.update(name: 'Joe Smith', notes: 'Etc') # update attributes
|
17
14
|
u.add_role(3) # add role (by ID) to the user
|
18
15
|
u.remove_role(3) # remove role (by ID) from the user
|
19
16
|
u.subscriptions # fetch the user's subscriptions
|
20
17
|
|
18
|
+
o = Chord::Order.find(1) # fetch order
|
19
|
+
o.subscription_installment? # was the order a subscription installment?
|
20
|
+
o.subscription_start? # did the order start a subscription?
|
21
|
+
|
22
|
+
For complete/current list of supported objects and methods, please see the code.
|
23
|
+
|
24
|
+
|
25
|
+
## Querying
|
26
|
+
|
27
|
+
The most basic way to get a collection of objects:
|
28
|
+
|
29
|
+
Chord::Order.all
|
30
|
+
|
31
|
+
You can also filter and sort, though the parameters are not well documented:
|
32
|
+
|
33
|
+
Chord::Order.where(
|
34
|
+
'q[completed_at_gt]' => '2022-09-14',
|
35
|
+
'q[s]' => 'completed_at desc'
|
36
|
+
)
|
37
|
+
|
38
|
+
|
39
|
+
## Object attributes
|
40
|
+
|
21
41
|
Objects are constructed in a way that minimizes API calls but occasionally yields objects that seem incomplete. For example:
|
22
42
|
|
23
43
|
orders = Chord::Order.all
|
24
44
|
o = orders.first
|
25
45
|
|
26
|
-
will return a Chord::Order object with around 40 attributes, not the full set of 55 (it's missing line items, for example), because the `/orders` endpoint returns abbreviated objects. To load the full set of data for
|
46
|
+
will return a Chord::Order object with around 40 attributes, not the full set of 55 (it's missing line items, for example), because the `/orders` endpoint returns abbreviated objects. To load the full set of data for such an object, use the `expand!` method:
|
27
47
|
|
28
48
|
o.expand!
|
29
49
|
|
50
|
+
|
51
|
+
# Configuration options
|
52
|
+
|
53
|
+
To get your sensitive config data out of your code, you can put it in a YAML file, like so:
|
54
|
+
|
55
|
+
# chord_config.yml
|
56
|
+
base_url: https://...
|
57
|
+
api_key: ...
|
58
|
+
|
59
|
+
and load it by calling:
|
60
|
+
|
61
|
+
Chord.config_from_file('chord_config.yml')
|
62
|
+
|
63
|
+
Or you can put your configuration in environment variables:
|
64
|
+
|
65
|
+
CHORD_BASE_URL=https://...
|
66
|
+
CHORD_API_KEY=...
|
67
|
+
|
68
|
+
and load it by calling:
|
69
|
+
|
70
|
+
Chord.config_from_env
|
71
|
+
|
72
|
+
Both config-loading methods return a boolean indicating whether configuration data was found and loaded, so you can easily fall back from one method to the other, for example:
|
73
|
+
|
74
|
+
Chord.config_from_env or Chord.config_from_file('chord_config.yml')
|
75
|
+
|
76
|
+
|
77
|
+
# To Do
|
78
|
+
|
79
|
+
* tests should use mocks instead of real API requests
|
data/lib/chord/version.rb
CHANGED
data/lib/chord.rb
CHANGED
@@ -7,8 +7,8 @@ module Chord
|
|
7
7
|
attr_accessor :api_key
|
8
8
|
|
9
9
|
def config(options)
|
10
|
-
self.base_url = options[:base_url]
|
11
|
-
self.api_key = options[:api_key]
|
10
|
+
self.base_url = options[:base_url] if options[:base_url]
|
11
|
+
self.api_key = options[:api_key] if options[:api_key]
|
12
12
|
end
|
13
13
|
|
14
14
|
def config_from_file(filepath)
|
@@ -19,6 +19,20 @@ module Chord
|
|
19
19
|
base_url: config[:base_url],
|
20
20
|
api_key: config[:api_key]
|
21
21
|
)
|
22
|
+
else
|
23
|
+
false
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def config_from_env
|
28
|
+
if ENV['CHORD_BASE_URL'] or ENV['CHORD_API_KEY']
|
29
|
+
Chord.config(
|
30
|
+
base_url: ENV['CHORD_BASE_URL'],
|
31
|
+
api_key: ENV['CHORD_API_KEY']
|
32
|
+
)
|
33
|
+
true
|
34
|
+
else
|
35
|
+
false
|
22
36
|
end
|
23
37
|
end
|
24
38
|
end
|
@@ -31,33 +45,22 @@ module Chord
|
|
31
45
|
def per_page; 99999; end
|
32
46
|
|
33
47
|
def all
|
48
|
+
check_for_config!
|
34
49
|
@all ||= fetch_all_data[base_path].map{ |i| new(i[id_attribute], i) }
|
35
50
|
end
|
36
51
|
|
37
52
|
def where(query_options = {})
|
53
|
+
check_for_config!
|
38
54
|
fetch_all_data(query_options)[base_path].map{ |i| new(i[id_attribute], i) }
|
39
55
|
end
|
40
56
|
|
41
57
|
def find(id)
|
58
|
+
check_for_config!
|
42
59
|
return nil if id.nil? or id == ''
|
43
60
|
attrs = fetch_attributes(id)
|
44
61
|
attrs.include?('error') ? nil : new(attrs[id_attribute], attrs)
|
45
62
|
end
|
46
63
|
|
47
|
-
def fetch_attributes(id)
|
48
|
-
get(base_url + "#{base_path}/#{id}", http_options).parsed_response
|
49
|
-
end
|
50
|
-
|
51
|
-
def id_attribute
|
52
|
-
'id'
|
53
|
-
end
|
54
|
-
|
55
|
-
def fetch_all_data(query_options = {})
|
56
|
-
query_options = { per_page: per_page }.merge(query_options)
|
57
|
-
url = base_url + base_path + '?' + hash_to_query(query_options)
|
58
|
-
get(url, http_options).parsed_response
|
59
|
-
end
|
60
|
-
|
61
64
|
def base_url
|
62
65
|
Chord.base_url
|
63
66
|
end
|
@@ -71,6 +74,28 @@ module Chord
|
|
71
74
|
|
72
75
|
private # --------------------------------------------------------------
|
73
76
|
|
77
|
+
def id_attribute
|
78
|
+
'id'
|
79
|
+
end
|
80
|
+
|
81
|
+
def fetch_attributes(id)
|
82
|
+
check_for_config!
|
83
|
+
get(base_url + "#{base_path}/#{id}", http_options).parsed_response or raise APIError, 'No data returned by API'
|
84
|
+
end
|
85
|
+
|
86
|
+
def fetch_all_data(query_options = {})
|
87
|
+
check_for_config!
|
88
|
+
query_options = { per_page: per_page }.merge(query_options)
|
89
|
+
url = base_url + base_path + '?' + hash_to_query(query_options)
|
90
|
+
get(url, http_options).parsed_response or raise APIError, 'No data returned by API'
|
91
|
+
end
|
92
|
+
|
93
|
+
def check_for_config!
|
94
|
+
if Chord.base_url.nil? or Chord.api_key.nil?
|
95
|
+
raise ConfigurationError, 'Please configure Chord by calling Chord.config(base_url: ..., api_key: ...)'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
74
99
|
def hash_to_query(hash)
|
75
100
|
require 'cgi' unless defined?(CGI) && defined?(CGI.escape)
|
76
101
|
hash.collect{ |p|
|
@@ -100,14 +125,6 @@ module Chord
|
|
100
125
|
end
|
101
126
|
|
102
127
|
def update(new_attributes)
|
103
|
-
new_attributes.stringify_keys!
|
104
|
-
# merge values into existing metadata
|
105
|
-
if new_attributes.include?('metadata')
|
106
|
-
# Chord expects all metadata values to be strings
|
107
|
-
new_metadata = new_attributes['metadata'].map{ |k,v| [k.to_s, v.to_s] }.to_h
|
108
|
-
new_attributes['metadata'] = (attributes['metadata'] || {}).merge(new_metadata)
|
109
|
-
# TODO: delete entries with empty value?
|
110
|
-
end
|
111
128
|
self.attributes = self.class.patch(base_url + "#{base_path}/#{id}",
|
112
129
|
http_options.merge(body: new_attributes.to_json)
|
113
130
|
).parsed_response
|
@@ -120,7 +137,7 @@ module Chord
|
|
120
137
|
# fetch all attributes, but don't overwrite existing ones,
|
121
138
|
# in case changes have been made
|
122
139
|
def expand!
|
123
|
-
all_attributes = self.class.fetch_attributes
|
140
|
+
all_attributes = self.class.send(:fetch_attributes, id)
|
124
141
|
@attributes = all_attributes.merge(@attributes)
|
125
142
|
end
|
126
143
|
|
@@ -228,6 +245,10 @@ module Chord
|
|
228
245
|
def self.base_path
|
229
246
|
'roles'
|
230
247
|
end
|
248
|
+
|
249
|
+
def users
|
250
|
+
attributes['users'].map{ |u| Chord::User.new(u['id'], u) }
|
251
|
+
end
|
231
252
|
end
|
232
253
|
|
233
254
|
|
@@ -248,4 +269,10 @@ module Chord
|
|
248
269
|
'products'
|
249
270
|
end
|
250
271
|
end
|
272
|
+
|
273
|
+
class ConfigurationError < StandardError
|
274
|
+
end
|
275
|
+
|
276
|
+
class APIError < StandardError
|
277
|
+
end
|
251
278
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Reisner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -52,7 +52,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
52
52
|
requirements:
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: 2.
|
55
|
+
version: 2.5.0
|
56
56
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - ">="
|