tops_connect 0.4.3.2 → 0.5.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 +5 -5
- data/.rubocop.yml +1 -1
- data/LICENSE.txt +1 -1
- data/lib/tops_connect.rb +2 -0
- data/lib/tops_connect/base.rb +1 -0
- data/lib/tops_connect/client.rb +34 -3
- data/lib/tops_connect/communities.rb +1 -0
- data/lib/tops_connect/community.rb +3 -2
- data/lib/tops_connect/configuration.rb +5 -4
- data/lib/tops_connect/errors.rb +2 -1
- data/lib/tops_connect/owner.rb +30 -19
- data/lib/tops_connect/owners.rb +2 -1
- data/lib/tops_connect/properties.rb +1 -0
- data/lib/tops_connect/property.rb +16 -27
- data/lib/tops_connect/version.rb +2 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e693e4f20693b51e9ef1729c307abae6e8e49cd0d92a04fa8f79a9c83ab43c60
|
4
|
+
data.tar.gz: cc1f4bcc3c10588236114facebba06c693eafa5a20f930a109510ce6c2fd2828
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d27cd2cfbfc12ca9e3199fb2893ce1540e5f0c6de448306d346b93a053879e8b7621811fadf0de1ba6541f8d2c80cc507e9a642857251d66c099ef16476b1ea
|
7
|
+
data.tar.gz: 90b74c5944b310533fc7b521340712c550c3369c74f42fd3dc6afe6e181d6bae41df4288ee7f192165126c0adf32eb93035eb554bd1b2fb5f1bbb4db9513d726
|
data/.rubocop.yml
CHANGED
data/LICENSE.txt
CHANGED
data/lib/tops_connect.rb
CHANGED
data/lib/tops_connect/base.rb
CHANGED
data/lib/tops_connect/client.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
class Client
|
4
5
|
include HTTParty
|
@@ -9,9 +10,8 @@ module TopsConnect
|
|
9
10
|
attr_reader :community_id, :community_api_key
|
10
11
|
|
11
12
|
headers 'Content-Type' => 'application/json'
|
12
|
-
headers 'api-version' => '1'
|
13
13
|
|
14
|
-
base_uri 'https://topsconnectapi.azure-api.net'
|
14
|
+
base_uri 'https://topsconnectapi.azure-api.net/v2'
|
15
15
|
|
16
16
|
def initialize(community_id, community_api_key)
|
17
17
|
authorization = Base64.strict_encode64 [
|
@@ -22,6 +22,11 @@ module TopsConnect
|
|
22
22
|
self.class.headers('authorization' => "Basic #{authorization}")
|
23
23
|
|
24
24
|
@subscription_key = TopsConnect.configuration.subscription_key
|
25
|
+
|
26
|
+
switch_community(community_id, community_api_key)
|
27
|
+
end
|
28
|
+
|
29
|
+
def switch_community(community_id, community_api_key)
|
25
30
|
@community_id = community_id
|
26
31
|
@community_api_key = community_api_key
|
27
32
|
end
|
@@ -38,6 +43,32 @@ module TopsConnect
|
|
38
43
|
response.parsed_response
|
39
44
|
end
|
40
45
|
|
46
|
+
def put(endpoint, body: {}, headers: {}, query: {})
|
47
|
+
response = self.class.put(
|
48
|
+
"/#{TopsConnect.configuration.zone}/api#{endpoint}",
|
49
|
+
query: query.merge('subscription-key' => @subscription_key),
|
50
|
+
headers: headers.merge('community-api-key' => @community_api_key),
|
51
|
+
body: body
|
52
|
+
)
|
53
|
+
|
54
|
+
raise_exception(response) unless response.code == 204
|
55
|
+
|
56
|
+
response.parsed_response
|
57
|
+
end
|
58
|
+
|
59
|
+
def post(endpoint, body: {}, headers: {}, query: {})
|
60
|
+
response = self.class.post(
|
61
|
+
"/#{TopsConnect.configuration.zone}/api#{endpoint}",
|
62
|
+
query: query.merge('subscription-key' => @subscription_key),
|
63
|
+
headers: headers.merge('community-api-key' => @community_api_key),
|
64
|
+
body: body
|
65
|
+
)
|
66
|
+
|
67
|
+
raise_exception(response) unless response.code == 200
|
68
|
+
|
69
|
+
response.parsed_response
|
70
|
+
end
|
71
|
+
|
41
72
|
protected
|
42
73
|
|
43
74
|
def raise_exception(response)
|
@@ -54,7 +85,7 @@ module TopsConnect
|
|
54
85
|
|
55
86
|
raise TopsConnect::InternalError, response
|
56
87
|
else
|
57
|
-
# As far as I'm aware, Tops does not return 100 - 199 or
|
88
|
+
# As far as I'm aware, Tops does not return 100 - 199 or 205 - 399.
|
58
89
|
raise TopsConnect::ApiError, response
|
59
90
|
end
|
60
91
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
class Community < Base
|
4
5
|
def community_key
|
@@ -28,13 +29,13 @@ module TopsConnect
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def last_synced_at
|
31
|
-
|
32
|
+
Time.parse data['LastSyncTime'] if data['LastSyncTime']
|
32
33
|
end
|
33
34
|
|
34
35
|
def modified_date
|
35
36
|
return unless data['Metadata']['ModifiedDate']
|
36
37
|
|
37
|
-
|
38
|
+
Time.parse data['Metadata']['ModifiedDate']
|
38
39
|
end
|
39
40
|
alias updated_at modified_date
|
40
41
|
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
class Configuration
|
4
5
|
attr_reader :subscription_key, :client_id, :software_key, :zone
|
5
6
|
|
6
7
|
def subscription_key=(key)
|
7
|
-
unless key
|
8
|
+
unless key.match?(/\A\h{32}\z/i)
|
8
9
|
raise 'Invalid TOPS Subscription Key. Expected 32 hex characters.'
|
9
10
|
end
|
10
11
|
|
@@ -12,7 +13,7 @@ module TopsConnect
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def client_id=(key)
|
15
|
-
unless key
|
16
|
+
unless key.match?(/\A\h{8}-\h{4}-\h{4}-\h{4}-\h{12}\z/)
|
16
17
|
raise 'Invalid TOPS Client ID. Expected a GUID.'
|
17
18
|
end
|
18
19
|
|
@@ -20,7 +21,7 @@ module TopsConnect
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def software_key=(key)
|
23
|
-
unless key
|
24
|
+
unless key.match?(/\A\h{8}-\h{4}-\h{4}-\h{4}-\h{12}\z/)
|
24
25
|
raise 'Invalid TOPS Software Key. Expected a GUID.'
|
25
26
|
end
|
26
27
|
|
@@ -28,7 +29,7 @@ module TopsConnect
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def zone=(new_zone)
|
31
|
-
unless %i
|
32
|
+
unless %i[broad limited sandbox].include?(new_zone.to_sym)
|
32
33
|
raise 'Invalid TOPS Zone. Accepted values are broad, limited, sandbox.'
|
33
34
|
end
|
34
35
|
|
data/lib/tops_connect/errors.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
class ApiError < ::RuntimeError
|
4
5
|
def initialize(response)
|
@@ -7,7 +8,7 @@ module TopsConnect
|
|
7
8
|
|
8
9
|
def to_s
|
9
10
|
format(
|
10
|
-
'
|
11
|
+
'%<code>s: %<message>s (%<uri>s)',
|
11
12
|
code: @response.code,
|
12
13
|
message: @response.parsed_response&.dig('Message'),
|
13
14
|
uri: @response.request.last_uri.to_s
|
data/lib/tops_connect/owner.rb
CHANGED
@@ -1,32 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
class Owner < Base
|
4
5
|
def owner_key
|
5
|
-
data['
|
6
|
+
data['Key']
|
6
7
|
end
|
7
8
|
alias id owner_key
|
8
9
|
|
9
10
|
def alternate_mailing_addresses
|
10
|
-
[
|
11
|
+
data['Addresses'].map do |row|
|
12
|
+
next unless row['Type']['Name'] == 'Alternate'
|
13
|
+
|
11
14
|
lines = []
|
12
15
|
|
13
|
-
if
|
14
|
-
lines <<
|
16
|
+
if row['AddressLine1'].match?(/[[:graph:]]/)
|
17
|
+
lines << row['AddressLine1']
|
15
18
|
end
|
16
19
|
|
17
|
-
if
|
18
|
-
lines <<
|
20
|
+
if row['AddressLine2'].match?(/[[:graph:]]/)
|
21
|
+
lines << row['AddressLine2']
|
19
22
|
end
|
20
23
|
|
21
24
|
next if lines.empty?
|
22
25
|
|
23
|
-
|
24
|
-
state = data["AltMailing#{n}State"]
|
25
|
-
zip = data["AltMailing#{n}Zip"]
|
26
|
-
|
27
|
-
lines << "#{city}, #{state} #{zip}".strip
|
26
|
+
lines << "#{row['City']}, #{row['State']} #{row['Zip']}"
|
28
27
|
|
29
|
-
lines.join("\n")
|
28
|
+
lines.map(&:strip).join("\n")
|
30
29
|
end.compact
|
31
30
|
end
|
32
31
|
|
@@ -47,25 +46,33 @@ module TopsConnect
|
|
47
46
|
end
|
48
47
|
|
49
48
|
def home_phone
|
50
|
-
data['
|
49
|
+
phone = data['Phones'].find { |row| row['Type']['Name'] == 'Home' }
|
50
|
+
|
51
|
+
phone['PhoneNumber'] if phone
|
51
52
|
end
|
52
53
|
|
53
54
|
def alternate_phone
|
54
|
-
data['
|
55
|
+
phone = data['Phones'].find { |row| row['Type']['Name'] == 'Alternate' }
|
56
|
+
|
57
|
+
phone['PhoneNumber'] if phone
|
55
58
|
end
|
56
59
|
|
57
60
|
def fax
|
58
|
-
data['
|
61
|
+
phone = data['Phones'].find { |row| row['Type']['Name'] == 'Fax' }
|
62
|
+
|
63
|
+
phone['PhoneNumber'] if phone
|
59
64
|
end
|
60
65
|
|
61
66
|
def work_phone
|
62
|
-
data['
|
67
|
+
phone = data['Phones'].find { |row| row['Type']['Name'] == 'Work' }
|
68
|
+
|
69
|
+
phone['PhoneNumber'] if phone
|
63
70
|
end
|
64
71
|
|
65
72
|
def updated_at
|
66
73
|
return unless data['Metadata']['ModifiedDate']
|
67
74
|
|
68
|
-
|
75
|
+
Time.parse data['Metadata']['ModifiedDate']
|
69
76
|
end
|
70
77
|
|
71
78
|
def owner?
|
@@ -79,19 +86,23 @@ module TopsConnect
|
|
79
86
|
def move_out_date
|
80
87
|
return unless data['MoveOutDate']
|
81
88
|
|
82
|
-
|
89
|
+
Time.parse data['MoveOutDate']
|
83
90
|
end
|
84
91
|
|
85
92
|
def settlement_date
|
86
93
|
return unless data['SettlementDate']
|
87
94
|
|
88
|
-
|
95
|
+
Time.parse data['SettlementDate']
|
89
96
|
end
|
90
97
|
|
91
98
|
def hold_payment?
|
92
99
|
data['Metadata']['HoldPayment']
|
93
100
|
end
|
94
101
|
|
102
|
+
def hold_collection?
|
103
|
+
data['Metadata']['HoldCollection']
|
104
|
+
end
|
105
|
+
|
95
106
|
# The internal key used by Tops Pro - property number, homeowner type,
|
96
107
|
# owner number in the format PPPPPPTOOO.
|
97
108
|
def tops_id
|
data/lib/tops_connect/owners.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
module Owners
|
4
5
|
# Method: GET
|
@@ -24,7 +25,7 @@ module TopsConnect
|
|
24
25
|
# Endpoint: Balance_Get
|
25
26
|
# Returns: Hash
|
26
27
|
def balance(owner_key)
|
27
|
-
get "/
|
28
|
+
get "/owner/#{owner_key}/balance"
|
28
29
|
end
|
29
30
|
|
30
31
|
# Method: GET
|
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module TopsConnect
|
3
4
|
class Property < Base
|
4
5
|
def property_key
|
5
|
-
data['
|
6
|
+
data['Key']
|
6
7
|
end
|
7
8
|
alias id property_key
|
8
9
|
|
@@ -11,42 +12,30 @@ module TopsConnect
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def address
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def city
|
18
|
-
data['City']
|
19
|
-
end
|
20
|
-
|
21
|
-
def state
|
22
|
-
data['State']
|
23
|
-
end
|
15
|
+
property = data['Addresses']
|
16
|
+
.find { |row| row['Type']['Name'] == 'Property' }
|
24
17
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
data['AptNumber'] unless data['AptNumber'].blank?
|
31
|
-
end
|
32
|
-
|
33
|
-
def street
|
34
|
-
data['Street']
|
35
|
-
end
|
18
|
+
lines = [
|
19
|
+
property['AddressLine1'],
|
20
|
+
property['AddressLine2'],
|
21
|
+
"#{property['City']}, #{property['State']} #{property['Zip']}"
|
22
|
+
]
|
36
23
|
|
37
|
-
|
38
|
-
|
24
|
+
lines
|
25
|
+
.map(&:strip)
|
26
|
+
.select { |line| line.match?(/[[:graph:]]/) }
|
27
|
+
.join("\n")
|
39
28
|
end
|
40
29
|
|
41
30
|
def community_key
|
42
31
|
data['CommunityKey']
|
43
32
|
end
|
44
33
|
|
45
|
-
def
|
34
|
+
def modified_date
|
46
35
|
return unless data['Metadata']['ModifiedDate']
|
47
36
|
|
48
|
-
|
37
|
+
Time.parse data['Metadata']['ModifiedDate']
|
49
38
|
end
|
50
|
-
alias modified_date
|
39
|
+
alias updated_at modified_date
|
51
40
|
end
|
52
41
|
end
|
data/lib/tops_connect/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tops_connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Hoffman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -129,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
129
|
version: '0'
|
130
130
|
requirements: []
|
131
131
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.
|
132
|
+
rubygems_version: 2.7.3
|
133
133
|
signing_key:
|
134
134
|
specification_version: 4
|
135
135
|
summary: Make use of the Tops Connect API
|