riq 0.9.1 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- metadata +4 -34
- data/.gitignore +0 -42
- data/.yardopts +0 -2
- data/Gemfile +0 -8
- data/LICENSE.txt +0 -21
- data/README.md +0 -15
- data/lib/riq.rb +0 -103
- data/lib/riq/account.rb +0 -82
- data/lib/riq/batch_manager.rb +0 -197
- data/lib/riq/client.rb +0 -148
- data/lib/riq/contact.rb +0 -158
- data/lib/riq/error.rb +0 -56
- data/lib/riq/event.rb +0 -165
- data/lib/riq/list.rb +0 -89
- data/lib/riq/list_item.rb +0 -119
- data/lib/riq/list_item_manager.rb +0 -13
- data/lib/riq/riq_obj.rb +0 -104
- data/lib/riq/user.rb +0 -47
- data/riq.gemspec +0 -29
- data/test/test.rb +0 -4
- data/test/test_account.rb +0 -44
- data/test/test_batch_manager.rb +0 -72
- data/test/test_contact.rb +0 -62
- data/test/test_event.rb +0 -56
- data/test/test_list_item.rb +0 -42
data/lib/riq/client.rb
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
require 'json'
|
3
|
-
require_relative 'error'
|
4
|
-
|
5
|
-
module RIQ
|
6
|
-
# HTTP client responsible for actually handling the HTTP requests.
|
7
|
-
# @note Utility class to perform http requests. This shouldn't be
|
8
|
-
# instantiated directy but used by children of RIQObject instead.
|
9
|
-
class Client
|
10
|
-
attr_accessor :cache
|
11
|
-
|
12
|
-
def initialize(key, secret)
|
13
|
-
raise 'Missing credentials' if key.nil? || secret.nil?
|
14
|
-
|
15
|
-
@root_url = 'https://api.relateiq.com/v2'
|
16
|
-
|
17
|
-
@auth = {username: key, password: secret}
|
18
|
-
@headers = {
|
19
|
-
'Content-type' => 'application/json',
|
20
|
-
'Accept' => 'application/json'
|
21
|
-
}
|
22
|
-
@cache = {}
|
23
|
-
end
|
24
|
-
|
25
|
-
# for caching, used with #next ?
|
26
|
-
# def store(endpoint, objects)
|
27
|
-
# @cache[endpoint] = objects unless objects.nil?
|
28
|
-
# end
|
29
|
-
|
30
|
-
# Makes a GET request, used for fetching existing objects.
|
31
|
-
# @return (see #request)
|
32
|
-
def get(endpoint, options: nil)
|
33
|
-
request(endpoint, :get, nil, options)
|
34
|
-
end
|
35
|
-
|
36
|
-
# Makes a POST request, used for creating new objects.
|
37
|
-
# @return (see #request)
|
38
|
-
def post(endpoint, body, options: nil)
|
39
|
-
request(endpoint, :post, body, options)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Makes a PUT request, used for updating existing objects.
|
43
|
-
# @return (see #request)
|
44
|
-
def put(endpoint, body, options: nil)
|
45
|
-
request(endpoint, :put, body, options)
|
46
|
-
end
|
47
|
-
|
48
|
-
# Makes a DELETE request, used for deleting existing objects.
|
49
|
-
# @return (see #request)
|
50
|
-
def delete(endpoint, options: nil)
|
51
|
-
request(endpoint, :delete, nil, options)
|
52
|
-
end
|
53
|
-
|
54
|
-
# I'm not sure why this would return an empty object instead of raising a notfound
|
55
|
-
# or really, why it exists at all
|
56
|
-
# def fetch(endpoint = nil, options: {})
|
57
|
-
# begin
|
58
|
-
# get(endpoint, options: options)
|
59
|
-
# rescue NotFoundError
|
60
|
-
# {}
|
61
|
-
# end
|
62
|
-
# end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
# actually does the requesting
|
67
|
-
# @return (see #process_response)
|
68
|
-
def request(endpoint, method = :get, body = nil, options = nil)
|
69
|
-
# there may be a better way to do this, but this is close
|
70
|
-
url = "#{@root_url}/#{endpoint}"
|
71
|
-
# pp "#{method} request to #{url} with body: #{body} and options: #{options}"
|
72
|
-
if [:get, :delete].include? method
|
73
|
-
resp = HTTParty.method(method).call(
|
74
|
-
url,
|
75
|
-
headers: @headers,
|
76
|
-
basic_auth: @auth,
|
77
|
-
query: options
|
78
|
-
)
|
79
|
-
elsif [:post, :put].include? method
|
80
|
-
resp = HTTParty.method(method).call(
|
81
|
-
url,
|
82
|
-
headers: @headers,
|
83
|
-
basic_auth: @auth,
|
84
|
-
query: options,
|
85
|
-
body: body
|
86
|
-
)
|
87
|
-
else
|
88
|
-
# this shouldn't ever get hit?
|
89
|
-
raise RIQError, 'Invalid method'
|
90
|
-
end
|
91
|
-
|
92
|
-
# HTTParty response object
|
93
|
-
process_response(resp)
|
94
|
-
# resp
|
95
|
-
end
|
96
|
-
|
97
|
-
# Checks for errors and returns the parsed object
|
98
|
-
# @return [RIQObject] The result of the request
|
99
|
-
def process_response(resp)
|
100
|
-
# pp "processing #{resp}, code: #{resp.code}"
|
101
|
-
if resp.code == 503
|
102
|
-
raise NotImplementedError, 'This function is not currently supported by RelateIQ'
|
103
|
-
elsif resp.code == 404
|
104
|
-
raise NotFoundError, 'Object Not Found'
|
105
|
-
elsif resp.code >= 400
|
106
|
-
# Record Response Data
|
107
|
-
raise HTTPError, resp
|
108
|
-
end
|
109
|
-
# 404 Object not found
|
110
|
-
# if List, have them check if it is shared
|
111
|
-
# 500
|
112
|
-
# 422
|
113
|
-
# 400 Bad Request - pass on internal message
|
114
|
-
# 502 Bad Gateway - Reattempt
|
115
|
-
|
116
|
-
# if resp.include? 'objects'
|
117
|
-
# resp['objects']
|
118
|
-
# else
|
119
|
-
resp.parsed_response
|
120
|
-
# end
|
121
|
-
end
|
122
|
-
|
123
|
-
# Configuration Methods
|
124
|
-
# def fetchConfig
|
125
|
-
# return get('configs')
|
126
|
-
# end
|
127
|
-
end
|
128
|
-
|
129
|
-
class << self
|
130
|
-
# @param key [String] RelateIQ API key
|
131
|
-
# @param secret [String] RelateIQ API secret
|
132
|
-
# @return [RIQ] The module, in case you want it.
|
133
|
-
def init(key = nil, secret = nil)
|
134
|
-
key ||= ENV['RIQ_TEST_API_KEY']
|
135
|
-
secret ||= ENV['RIQ_TEST_API_SECRET']
|
136
|
-
|
137
|
-
@@client = Client.new(key, secret)
|
138
|
-
self
|
139
|
-
end
|
140
|
-
|
141
|
-
# Always use RIQ.client to retrieve the client object.
|
142
|
-
# @return [Client] The client object
|
143
|
-
def client
|
144
|
-
raise RIQError, 'Client not initialized' unless @@client
|
145
|
-
@@client
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
data/lib/riq/contact.rb
DELETED
@@ -1,158 +0,0 @@
|
|
1
|
-
require_relative 'riq_obj'
|
2
|
-
using RIQExtensions
|
3
|
-
|
4
|
-
module RIQ
|
5
|
-
# Contacts represent people in an Organization’s address book.
|
6
|
-
class Contact < RIQObject
|
7
|
-
attr_accessor :properties
|
8
|
-
|
9
|
-
# (see RIQObject#node)
|
10
|
-
def node
|
11
|
-
self.class.node(@id)
|
12
|
-
end
|
13
|
-
|
14
|
-
# (see RIQObject.node)
|
15
|
-
def self.node(id = nil)
|
16
|
-
"contacts/#{id}"
|
17
|
-
end
|
18
|
-
|
19
|
-
# (see RIQObject#data)
|
20
|
-
def data
|
21
|
-
{
|
22
|
-
id: @id,
|
23
|
-
properties: @properties
|
24
|
-
# modified_date: @modified_date
|
25
|
-
}
|
26
|
-
end
|
27
|
-
|
28
|
-
# @!macro [new] prop
|
29
|
-
# @return [Array] all of the values for $0
|
30
|
-
def name
|
31
|
-
get_prop(:name)
|
32
|
-
end
|
33
|
-
|
34
|
-
# @macro prop
|
35
|
-
def phone
|
36
|
-
get_prop(:phone)
|
37
|
-
end
|
38
|
-
|
39
|
-
# @macro prop
|
40
|
-
def email
|
41
|
-
get_prop(:email)
|
42
|
-
end
|
43
|
-
|
44
|
-
# @macro prop
|
45
|
-
def address
|
46
|
-
get_prop(:address)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Adds property with correct scaffolding
|
50
|
-
# @param prop [Symbol] Type Property to add, such as :name or :email
|
51
|
-
# @param val [String, Array] Value(s) to add
|
52
|
-
# @return [Array] Values for that property after the add
|
53
|
-
def add(prop, val)
|
54
|
-
# validate(prop)
|
55
|
-
prop = prop.to_sym
|
56
|
-
@properties[prop] = [] unless @properties.include? prop
|
57
|
-
|
58
|
-
if val.is_a? Array
|
59
|
-
val.each do |i|
|
60
|
-
add(prop, i)
|
61
|
-
end
|
62
|
-
return
|
63
|
-
end
|
64
|
-
|
65
|
-
raise RIQError, 'Values must be strings' unless val.is_a? String
|
66
|
-
|
67
|
-
# don't add duplicate
|
68
|
-
if @properties[prop].select{|p| p[:value] == val}.empty?
|
69
|
-
@properties[prop] << {value: val, metadata: {}}
|
70
|
-
end
|
71
|
-
send(prop)
|
72
|
-
end
|
73
|
-
|
74
|
-
# Removes property from hash
|
75
|
-
# @param prop [Symbol] Type Property to remove, such as :name or :email
|
76
|
-
# @param val [String, Array] Value(s) to remove
|
77
|
-
# @return [Array] Values for that property after the remove
|
78
|
-
def remove(prop, val)
|
79
|
-
# validate(prop)
|
80
|
-
prop = prop.to_sym
|
81
|
-
|
82
|
-
if val.is_a? Array
|
83
|
-
val.each do |i|
|
84
|
-
remove(prop, i)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
if @properties.include? prop
|
89
|
-
@properties[prop] = @properties[prop].reject{|p| p[:value] == val}
|
90
|
-
end
|
91
|
-
send(prop)
|
92
|
-
end
|
93
|
-
|
94
|
-
# Edits an existing object based on matching email(s) or saves a new object
|
95
|
-
# @see RIQObject#save
|
96
|
-
def upsert
|
97
|
-
save({_upsert: 'email'})
|
98
|
-
end
|
99
|
-
|
100
|
-
# @param prop [Symbol] The property to fetch. One of [:name, :phone, :email, :address]
|
101
|
-
# @param val [String] The value to get info on, such as 'name@domain.com'
|
102
|
-
# @return [Hash] metadata and other info about a given property
|
103
|
-
def info(prop, val)
|
104
|
-
# validate(prop)
|
105
|
-
|
106
|
-
@properties[prop].select{|p| p[:value] == val}.first
|
107
|
-
end
|
108
|
-
|
109
|
-
private
|
110
|
-
|
111
|
-
def init(obj = nil)
|
112
|
-
unless obj.nil?
|
113
|
-
@id = obj[:id]
|
114
|
-
@modified_date = obj[:modified_date].cut_milis if obj[:modified_date]
|
115
|
-
@properties = {}
|
116
|
-
obj[:properties].each do |k,v|
|
117
|
-
raise RIQError, "Properties must be arrays, #{k} wasn't" if !v.is_a?(Array)
|
118
|
-
|
119
|
-
v.each do |i|
|
120
|
-
unless i.is_a?(Hash)
|
121
|
-
add(k, i)
|
122
|
-
else
|
123
|
-
@properties[k] = [] unless @properties.include?(k)
|
124
|
-
@properties[k] << i
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
else
|
129
|
-
@id = nil
|
130
|
-
@properties = {}
|
131
|
-
end
|
132
|
-
self
|
133
|
-
end
|
134
|
-
|
135
|
-
# unused because we actually put all sorts of stuff in there
|
136
|
-
def validate(prop)
|
137
|
-
raise RIQError, %q(Invalid property. Use [:name | :phone | :email | :address] instead) unless [:name, :phone, :email, :address].include? prop
|
138
|
-
end
|
139
|
-
|
140
|
-
def get_prop(prop)
|
141
|
-
if @properties.include? prop
|
142
|
-
@properties[prop].map{|p| p[:value]}
|
143
|
-
else
|
144
|
-
[]
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
class << self
|
150
|
-
# Convenince method to create new Contacts
|
151
|
-
# @param id [String, nil] create a blank Contact object or
|
152
|
-
# fetch an existing one by id.
|
153
|
-
# @return [Contact]
|
154
|
-
def contact(id = nil)
|
155
|
-
Contact.new(id)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
data/lib/riq/error.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module RIQ
|
2
|
-
# Base exception class for our errors.
|
3
|
-
class RIQError < StandardError
|
4
|
-
end
|
5
|
-
|
6
|
-
# Hasn't been implemented yet. Doesn't get used often.
|
7
|
-
class NotImplementedError < RIQError
|
8
|
-
end
|
9
|
-
|
10
|
-
# Raised when an objectid fetch doesn't return anything.
|
11
|
-
class NotFoundError < RIQError
|
12
|
-
end
|
13
|
-
|
14
|
-
# Main error that includes info about the request and what went wrong.
|
15
|
-
class HTTPError < RIQError
|
16
|
-
attr_accessor :code
|
17
|
-
attr_accessor :message
|
18
|
-
attr_accessor :response
|
19
|
-
|
20
|
-
def initialize(resp)
|
21
|
-
# build response message
|
22
|
-
message = "\n[#{resp.code}] #{resp.message} : "
|
23
|
-
unless resp.parsed_response.nil?
|
24
|
-
begin
|
25
|
-
m = resp.parsed_response.fetch('errorMessage', 'no message')
|
26
|
-
rescue
|
27
|
-
# parse returned html
|
28
|
-
reg = resp.parsed_response.match(/<pre>(.*)<\/pre>/)
|
29
|
-
unless reg.nil?
|
30
|
-
m = reg[1].strip
|
31
|
-
else
|
32
|
-
m = 'no message'
|
33
|
-
end
|
34
|
-
end
|
35
|
-
message += "<#{m}>"
|
36
|
-
end
|
37
|
-
|
38
|
-
# pull out request info
|
39
|
-
req = resp.request
|
40
|
-
unless req.nil?
|
41
|
-
message += "\n Request: #{req.http_method} #{req.last_uri.to_s}"
|
42
|
-
unless req.raw_body.nil?
|
43
|
-
message += "\n #{req.raw_body}"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
@message = message
|
48
|
-
@response = resp
|
49
|
-
end
|
50
|
-
|
51
|
-
# used to print the error nicely
|
52
|
-
def to_s
|
53
|
-
@message || super
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
data/lib/riq/event.rb
DELETED
@@ -1,165 +0,0 @@
|
|
1
|
-
require_relative 'riq_obj'
|
2
|
-
using RIQExtensions
|
3
|
-
|
4
|
-
module RIQ
|
5
|
-
# Events represent interactions involving a Contact associated with a List Item.
|
6
|
-
class Event < RIQObject
|
7
|
-
attr_accessor :subject
|
8
|
-
attr_accessor :body
|
9
|
-
# attr_reader :participant_ids
|
10
|
-
|
11
|
-
# (see RIQObject#node)
|
12
|
-
def node
|
13
|
-
self.class.node
|
14
|
-
end
|
15
|
-
|
16
|
-
# (see RIQObject#node)
|
17
|
-
def self.node
|
18
|
-
"events"
|
19
|
-
end
|
20
|
-
|
21
|
-
# (see RIQObject#data)
|
22
|
-
def data
|
23
|
-
{
|
24
|
-
subject: @subject,
|
25
|
-
body: @body,
|
26
|
-
participant_ids: @participant_ids
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
# @param type [Symbol] One of :email or :phone
|
31
|
-
# @param value [String] An email or phone number for the contact
|
32
|
-
def add_participant(type, value)
|
33
|
-
raise RIQError, 'Type must be :email or :phone' unless [:email, :phone].include?(type)
|
34
|
-
@participant_ids << {type: type, value: value}
|
35
|
-
end
|
36
|
-
|
37
|
-
# @return [Array] Immutable copy of participant_ids
|
38
|
-
def participant_ids
|
39
|
-
@participant_ids.dup
|
40
|
-
end
|
41
|
-
|
42
|
-
# @return [Hash] Success message, if successul.
|
43
|
-
def save
|
44
|
-
# there are no options to pass for event save
|
45
|
-
@client.put(node, payload, options: nil)
|
46
|
-
{status: 204, message: 'No Content'}
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
def init(obj = nil)
|
51
|
-
unless obj.nil?
|
52
|
-
@subject = obj[:subject]
|
53
|
-
@body = obj[:body]
|
54
|
-
@participant_ids = []
|
55
|
-
obj[:participant_ids].each{|o| add_participant(o[:type], o[:value])}
|
56
|
-
else
|
57
|
-
@subject = nil
|
58
|
-
@body = nil
|
59
|
-
@participant_ids = []
|
60
|
-
end
|
61
|
-
self
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
class << self
|
66
|
-
# Convenience method to create new Events
|
67
|
-
# @param obj [Hash] Info to parse into event
|
68
|
-
# @return [Event]
|
69
|
-
def event(obj = nil)
|
70
|
-
Event.new(obj)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
# @id = nil
|
76
|
-
# @modifiedDate = nil
|
77
|
-
# @participantIds = nil
|
78
|
-
# @subject = nil
|
79
|
-
# @body = nil
|
80
|
-
|
81
|
-
# def initialize(
|
82
|
-
# _id=nil,
|
83
|
-
# subject=nil,
|
84
|
-
# body=nil,
|
85
|
-
# participantIds=nil,
|
86
|
-
# data:nil,
|
87
|
-
# hash:nil
|
88
|
-
# )
|
89
|
-
# if !data.nil?
|
90
|
-
# parse(data)
|
91
|
-
# elsif !hash.nil?
|
92
|
-
# process_hash(hash)
|
93
|
-
# elsif !id(_id).nil?
|
94
|
-
# Event::get(self)
|
95
|
-
# end
|
96
|
-
# participantIds(participantIds)
|
97
|
-
# subject(subject)
|
98
|
-
# body(body)
|
99
|
-
# end
|
100
|
-
|
101
|
-
# class << self
|
102
|
-
# def node
|
103
|
-
# 'events'
|
104
|
-
# end
|
105
|
-
|
106
|
-
# def factory(data = nil, hash = nil)
|
107
|
-
# return Event.new(data, hash)
|
108
|
-
# end
|
109
|
-
|
110
|
-
# def update(instance, options = {})
|
111
|
-
# response = Client::put(self.endpoint(), instance.payload(), options)
|
112
|
-
# return instance
|
113
|
-
# end
|
114
|
-
# end
|
115
|
-
|
116
|
-
# def parse(data)
|
117
|
-
# obj = JSON.parse(data.body)
|
118
|
-
# id(obj['id'])
|
119
|
-
# modifiedDate(obj['modifiedDate'])
|
120
|
-
# end
|
121
|
-
|
122
|
-
# def process_hash(hash)
|
123
|
-
# id(hash['id'])
|
124
|
-
# modifiedDate(hash['modifiedDate'])
|
125
|
-
# end
|
126
|
-
|
127
|
-
# # Data Payload
|
128
|
-
# def payload()
|
129
|
-
# payload = {:participantIds => @participantIds,
|
130
|
-
# :subject => subject(),
|
131
|
-
# :body => body()
|
132
|
-
# }
|
133
|
-
# if modifiedDate() then
|
134
|
-
# payload['modifiedDate'] = modifiedDate()
|
135
|
-
# end
|
136
|
-
# payload['id'] = id() if id()
|
137
|
-
# return payload
|
138
|
-
# end
|
139
|
-
|
140
|
-
# # Hybrid
|
141
|
-
# def id(value = nil)
|
142
|
-
# @id = value unless value.nil?
|
143
|
-
# end
|
144
|
-
|
145
|
-
# def modifiedDate(value = nil)
|
146
|
-
# @modifiedDate = value unless value.nil?
|
147
|
-
# end
|
148
|
-
|
149
|
-
# def subject(value = nil)
|
150
|
-
# @subject = value unless value.nil?
|
151
|
-
# end
|
152
|
-
|
153
|
-
# # value should either be a string or a list of strings
|
154
|
-
# # returns: if multiple values exist for key, a list of strings of values
|
155
|
-
# # if a single value exists, return the single string value (not in a list)
|
156
|
-
# # if no values exist, return nil
|
157
|
-
# def participantIds(value = nil)
|
158
|
-
# # set value if passed in
|
159
|
-
# @participantIds = value unless value.nil?
|
160
|
-
# end
|
161
|
-
|
162
|
-
# def body(value=nil)
|
163
|
-
# @body = value unless value.nil?
|
164
|
-
# end
|
165
|
-
# end
|