rentlinx 0.6.0 → 0.6.1
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/lib/rentlinx.rb +4 -0
- data/lib/rentlinx/client.rb +9 -25
- data/lib/rentlinx/models/base.rb +0 -12
- data/lib/rentlinx/models/property.rb +13 -2
- data/lib/rentlinx/models/property_amenity.rb +13 -0
- data/lib/rentlinx/models/property_photo.rb +13 -0
- data/lib/rentlinx/models/unit.rb +11 -2
- data/lib/rentlinx/models/unit_amenity.rb +9 -0
- data/lib/rentlinx/models/unit_photo.rb +5 -0
- data/lib/rentlinx/modules/amenity_client_methods.rb +74 -0
- data/lib/rentlinx/modules/photo_client_methods.rb +67 -0
- data/lib/rentlinx/modules/photoable.rb +33 -0
- data/lib/rentlinx/modules/property_client_methods.rb +21 -0
- data/lib/rentlinx/modules/unit_client_methods.rb +14 -0
- data/lib/rentlinx/version.rb +1 -1
- metadata +10 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19357d100a6d1f9831a34874d338e756b6e85750
|
4
|
+
data.tar.gz: ae7d1c3cba03207c61fb12dc74497aeb227419c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db9dc683bd829ca60ffa8d73078824591503cc06ceba242c5b0c252fd5edb1f49bb170ea6febb4c706a0372453ee3418d599734465b4c62bce6a5c4f49001990
|
7
|
+
data.tar.gz: 8764af15461fd1d0311ddaa14e878cfc0c045222f6e82c0bfef42078d921d21dd3da0c937afff59eb2ccc09b78ebd68bdbb37e7876f406492ef53e5ca72292c2
|
data/lib/rentlinx.rb
CHANGED
@@ -4,6 +4,10 @@ require 'rentlinx/errors'
|
|
4
4
|
require 'rentlinx/models/base'
|
5
5
|
require 'rentlinx/models/property'
|
6
6
|
require 'rentlinx/models/unit'
|
7
|
+
require 'rentlinx/models/property_photo'
|
8
|
+
require 'rentlinx/models/unit_photo'
|
9
|
+
require 'rentlinx/models/property_amenity'
|
10
|
+
require 'rentlinx/models/unit_amenity'
|
7
11
|
|
8
12
|
module Rentlinx
|
9
13
|
@username = nil
|
data/lib/rentlinx/client.rb
CHANGED
@@ -2,9 +2,18 @@ require 'httpclient'
|
|
2
2
|
require 'json'
|
3
3
|
require 'uri'
|
4
4
|
require 'rentlinx/default'
|
5
|
+
require 'rentlinx/modules/property_client_methods'
|
6
|
+
require 'rentlinx/modules/unit_client_methods'
|
7
|
+
require 'rentlinx/modules/photo_client_methods'
|
8
|
+
require 'rentlinx/modules/amenity_client_methods'
|
5
9
|
|
6
10
|
module Rentlinx
|
7
11
|
class Client
|
12
|
+
include Rentlinx::PropertyClientMethods
|
13
|
+
include Rentlinx::UnitClientMethods
|
14
|
+
include Rentlinx::PhotoClientMethods
|
15
|
+
include Rentlinx::AmenityClientMethods
|
16
|
+
|
8
17
|
def initialize
|
9
18
|
raise Rentlinx::NotConfigured if Rentlinx.username.nil? ||
|
10
19
|
Rentlinx.password.nil? ||
|
@@ -49,13 +58,6 @@ module Rentlinx
|
|
49
58
|
end
|
50
59
|
end
|
51
60
|
|
52
|
-
def get_units_for_property_id(id)
|
53
|
-
data = request('GET', "properties/#{id}/units")['data']
|
54
|
-
data.map do |unit_data|
|
55
|
-
Unit.new(symbolize_data(unit_data))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
61
|
private
|
60
62
|
|
61
63
|
def process_get(route)
|
@@ -72,24 +74,6 @@ module Rentlinx
|
|
72
74
|
data
|
73
75
|
end
|
74
76
|
|
75
|
-
def post_property(prop)
|
76
|
-
return false unless prop.valid?
|
77
|
-
request('PUT', "properties/#{prop.propertyID}", prop.to_hash)
|
78
|
-
end
|
79
|
-
|
80
|
-
def post_unit(unit)
|
81
|
-
return false unless unit.valid?
|
82
|
-
request('PUT', "units/#{unit.unitID}", unit.to_hash)
|
83
|
-
end
|
84
|
-
|
85
|
-
def unpost_property(id)
|
86
|
-
request('DELETE', "properties/#{id}")
|
87
|
-
end
|
88
|
-
|
89
|
-
def unpost_unit(id)
|
90
|
-
request('DELETE', "units/#{id}")
|
91
|
-
end
|
92
|
-
|
93
77
|
def authenticate(username, password)
|
94
78
|
data = { username: username, password: password }
|
95
79
|
response = request('POST', 'authentication/login', data)
|
data/lib/rentlinx/models/base.rb
CHANGED
@@ -20,10 +20,6 @@ module Rentlinx
|
|
20
20
|
self.class::REQUIRED_ATTRIBUTES
|
21
21
|
end
|
22
22
|
|
23
|
-
def required_attributes_for_post
|
24
|
-
self.class::REQUIRED_ATTRIBUTES_FOR_POST
|
25
|
-
end
|
26
|
-
|
27
23
|
def post
|
28
24
|
Rentlinx.client.post(self)
|
29
25
|
end
|
@@ -40,10 +36,6 @@ module Rentlinx
|
|
40
36
|
Rentlinx.client.get(type.to_sym, id)
|
41
37
|
end
|
42
38
|
|
43
|
-
def get_units_for_property_id(id)
|
44
|
-
Rentlinx.client.get_units_for_property_id(id)
|
45
|
-
end
|
46
|
-
|
47
39
|
def to_hash
|
48
40
|
{}.tap do |hash|
|
49
41
|
attributes.each do |at|
|
@@ -56,10 +48,6 @@ module Rentlinx
|
|
56
48
|
error_messages.empty?
|
57
49
|
end
|
58
50
|
|
59
|
-
def valid_for_post?
|
60
|
-
required_attributes_for_post.none? { |at| blank?(send(at)) }
|
61
|
-
end
|
62
|
-
|
63
51
|
def error_messages
|
64
52
|
@processor = AttributeProcessor.new(to_hash)
|
65
53
|
@processor.process
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rentlinx/modules/photoable'
|
2
|
+
|
1
3
|
module Rentlinx
|
2
4
|
class Property < Base
|
3
5
|
ATTRIBUTES = [:companyID, :propertyID, :description, :address, :city, :state,
|
@@ -9,8 +11,6 @@ module Rentlinx
|
|
9
11
|
REQUIRED_ATTRIBUTES = [:propertyID, :address, :city, :state, :zip,
|
10
12
|
:phoneNumber, :emailAddress]
|
11
13
|
|
12
|
-
REQUIRED_ATTRIBUTES_FOR_POST = REQUIRED_ATTRIBUTES + [:companyID, :companyName]
|
13
|
-
|
14
14
|
attr_accessor(*ATTRIBUTES)
|
15
15
|
|
16
16
|
def post_with_units
|
@@ -32,5 +32,16 @@ module Rentlinx
|
|
32
32
|
def self.from_id(id)
|
33
33
|
get_from_id(:property, id)
|
34
34
|
end
|
35
|
+
|
36
|
+
include Rentlinx::Photoable
|
37
|
+
def photo_class
|
38
|
+
Rentlinx::PropertyPhoto
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def get_units_for_property_id(id)
|
44
|
+
Rentlinx.client.get_units_for_property_id(id)
|
45
|
+
end
|
35
46
|
end
|
36
47
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Rentlinx
|
2
|
+
class PropertyPhoto < Base
|
3
|
+
ATTRIBUTES = [:url, :caption, :position, :propertyID, :unitID]
|
4
|
+
|
5
|
+
REQUIRED_ATTRIBUTES = [:url, :propertyID]
|
6
|
+
|
7
|
+
attr_accessor(*ATTRIBUTES)
|
8
|
+
|
9
|
+
def to_hash
|
10
|
+
{ url: url, caption: caption }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/rentlinx/models/unit.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rentlinx/modules/photoable'
|
2
|
+
|
1
3
|
module Rentlinx
|
2
4
|
class Unit < Base
|
3
5
|
ATTRIBUTES = [:unitID, :propertyID, :name, :description, :rent, :maxRent,
|
@@ -9,10 +11,17 @@ module Rentlinx
|
|
9
11
|
|
10
12
|
REQUIRED_ATTRIBUTES = [:unitID]
|
11
13
|
|
12
|
-
REQUIRED_ATTRIBUTES_FOR_POST = REQUIRED_ATTRIBUTES + [:propertyID]
|
13
|
-
|
14
14
|
attr_accessor(*ATTRIBUTES)
|
15
15
|
|
16
|
+
include Rentlinx::Photoable
|
17
|
+
def photo_class
|
18
|
+
Rentlinx::UnitPhoto
|
19
|
+
end
|
20
|
+
|
21
|
+
def photos
|
22
|
+
super.select { |p| p.unitID == unitID }
|
23
|
+
end
|
24
|
+
|
16
25
|
def self.from_id(id)
|
17
26
|
get_from_id(:unit, id)
|
18
27
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Rentlinx
|
2
|
+
module AmenityClientMethods
|
3
|
+
def post_amenities(amenities)
|
4
|
+
raise Rentlinx::InvalidObject, amenities.find { |a| !a.valid? } unless amenities.all?(&:valid?)
|
5
|
+
raise Rentlinx::InvalidObject, amenities unless amenities.all? { |p| p.propertyID == amenities.first.propertyID }
|
6
|
+
property_amenities = amenities.select { |p| p.class == Rentlinx::PropertyAmenity }
|
7
|
+
unit_amenities = amenities - property_amenities
|
8
|
+
|
9
|
+
post_property_amenities(property_amenities) unless property_amenities.empty?
|
10
|
+
post_unit_amenities(unit_amenities) unless unit_amenities.empty?
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_amenities_for_property_id(id)
|
14
|
+
data = request('GET', "properties/#{id}/amenities")['data']
|
15
|
+
data.map do |amenity_data|
|
16
|
+
if amenity_data['unitID'].nil? || amenity_data['unitID'] == ''
|
17
|
+
amenity_data.delete('unitID')
|
18
|
+
PropertyAmenity.new(symbolize_data(amenity_data))
|
19
|
+
else
|
20
|
+
UnitAmenity.new(symbolize_data(amenity_data))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
rescue Rentlinx::NotFound
|
24
|
+
return []
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_amenities_for_unit(unit)
|
28
|
+
amenities = get_amenities_for_property_id(unit.propertyID)
|
29
|
+
amenities.select { |a| defined? a.unitID && a.unitID == unit.unitID }
|
30
|
+
end
|
31
|
+
|
32
|
+
def unpost_amenity(amenity)
|
33
|
+
case amenity
|
34
|
+
when Rentlinx::UnitAmenity
|
35
|
+
unpost_unit_amenity(amenity.unitID, amenity.name)
|
36
|
+
when Rentlinx::PropertyAmenity
|
37
|
+
unpost_property_amenity(amenity.propertyID, amenity.name)
|
38
|
+
else
|
39
|
+
raise TypeError, "Invalid type: #{type}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# post_amenities should only be called from property or unit, so we don't need
|
46
|
+
# to handle multiple properties
|
47
|
+
def post_property_amenities(amenities)
|
48
|
+
request('PUT', "properties/#{amenities.first.propertyID}/amenities", amenities.map(&:to_hash))
|
49
|
+
end
|
50
|
+
|
51
|
+
def post_unit_amenities(amenities)
|
52
|
+
hash = {}
|
53
|
+
amenities.each do |p|
|
54
|
+
if hash.keys.include?(p.unitID)
|
55
|
+
hash[p.unitID] << p
|
56
|
+
else
|
57
|
+
hash[p.unitID] = [p]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
hash.each do |unitID, unit_amenities|
|
62
|
+
request('PUT', "units/#{unitID}/amenities", unit_amenities.map(&:to_hash))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def unpost_property_amenity(id, name)
|
67
|
+
request('DELETE', URI.encode("properties/#{id}/amenities/#{name}"))
|
68
|
+
end
|
69
|
+
|
70
|
+
def unpost_unit_amenity(id, name)
|
71
|
+
request('DELETE', URI.encode("units/#{id}/amenities/#{name}"))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Rentlinx
|
2
|
+
module PhotoClientMethods
|
3
|
+
def post_photos(photos)
|
4
|
+
return false unless photos.all?(&:valid?)
|
5
|
+
return false unless photos.all? { |p| p.propertyID == photos.first.propertyID }
|
6
|
+
property_photos = photos.select { |p| p.is_a? Rentlinx::PropertyPhoto }
|
7
|
+
unit_photos = photos - property_photos
|
8
|
+
|
9
|
+
post_property_photos(property_photos) unless property_photos.empty?
|
10
|
+
post_unit_photos(unit_photos) unless unit_photos.empty?
|
11
|
+
end
|
12
|
+
|
13
|
+
def get_photos_for_property_id(id)
|
14
|
+
data = request('GET', "properties/#{id}/photos")['data']
|
15
|
+
data.map do |photo_data|
|
16
|
+
if photo_data['unitID'].nil? || photo_data['unitID'] == ''
|
17
|
+
photo_data.delete('unitID')
|
18
|
+
PropertyPhoto.new(symbolize_data(photo_data))
|
19
|
+
else
|
20
|
+
UnitPhoto.new(symbolize_data(photo_data))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def unpost_photo(photo)
|
26
|
+
case photo
|
27
|
+
when Rentlinx::PropertyPhoto
|
28
|
+
unpost_property_photo(photo.propertyID, photo.url)
|
29
|
+
when Rentlinx::UnitPhoto
|
30
|
+
unpost_unit_photo(photo.unitID, photo.url)
|
31
|
+
else
|
32
|
+
raise TypeError, "Invalid type: #{type}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# post_photos should only be called from property or unit, so we don't need
|
39
|
+
# to handle multiple properties
|
40
|
+
def post_property_photos(photos)
|
41
|
+
request('PUT', "properties/#{photos.first.propertyID}/photos", photos.map(&:to_hash))
|
42
|
+
end
|
43
|
+
|
44
|
+
def post_unit_photos(photos)
|
45
|
+
hash = {}
|
46
|
+
photos.each do |p|
|
47
|
+
if hash.keys.include?(p.unitID)
|
48
|
+
hash[p.unitID] << p
|
49
|
+
else
|
50
|
+
hash[p.unitID] = [p]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
hash.each do |unitID, unit_photos|
|
55
|
+
request('PUT', "units/#{unitID}/photos", unit_photos.map(&:to_hash))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def unpost_property_photo(id, url)
|
60
|
+
request('DELETE', "properties/#{id}/photos", url: url)
|
61
|
+
end
|
62
|
+
|
63
|
+
def unpost_unit_photo(id, url)
|
64
|
+
request('DELETE', "units/#{id}/photos", url: url)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Rentlinx
|
2
|
+
module Photoable
|
3
|
+
def post_with_photos
|
4
|
+
post
|
5
|
+
Rentlinx.client.post_photos(@photos)
|
6
|
+
end
|
7
|
+
|
8
|
+
def photos
|
9
|
+
@photos ||= get_photos_for_property_id(propertyID)
|
10
|
+
end
|
11
|
+
|
12
|
+
def photos=(photo_list)
|
13
|
+
@photos = photo_list.map do |photo|
|
14
|
+
photo.propertyID = propertyID
|
15
|
+
photo.unitID = unitID if defined? unitID
|
16
|
+
photo
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_photo(options)
|
21
|
+
options.merge!(propertyID: propertyID)
|
22
|
+
options.merge!(unitID: unitID) if defined? unitID
|
23
|
+
@photos ||= []
|
24
|
+
@photos << photo_class.new(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def get_photos_for_property_id(id)
|
30
|
+
Rentlinx.client.get_photos_for_property_id(id)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Rentlinx
|
2
|
+
module PropertyClientMethods
|
3
|
+
def get_units_for_property_id(id)
|
4
|
+
data = request('GET', "properties/#{id}/units")['data']
|
5
|
+
data.map do |unit_data|
|
6
|
+
Unit.new(symbolize_data(unit_data))
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def post_property(prop)
|
13
|
+
return false unless prop.valid?
|
14
|
+
request('PUT', "properties/#{prop.propertyID}", prop.to_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
def unpost_property(id)
|
18
|
+
request('DELETE', "properties/#{id}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Rentlinx
|
2
|
+
module UnitClientMethods
|
3
|
+
private
|
4
|
+
|
5
|
+
def post_unit(unit)
|
6
|
+
return false unless unit.valid?
|
7
|
+
request('PUT', "units/#{unit.unitID}", unit.to_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def unpost_unit(id)
|
11
|
+
request('DELETE', "units/#{id}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/rentlinx/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rentlinx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AppFolio, Inc.
|
@@ -66,7 +66,16 @@ files:
|
|
66
66
|
- lib/rentlinx/errors.rb
|
67
67
|
- lib/rentlinx/models/base.rb
|
68
68
|
- lib/rentlinx/models/property.rb
|
69
|
+
- lib/rentlinx/models/property_amenity.rb
|
70
|
+
- lib/rentlinx/models/property_photo.rb
|
69
71
|
- lib/rentlinx/models/unit.rb
|
72
|
+
- lib/rentlinx/models/unit_amenity.rb
|
73
|
+
- lib/rentlinx/models/unit_photo.rb
|
74
|
+
- lib/rentlinx/modules/amenity_client_methods.rb
|
75
|
+
- lib/rentlinx/modules/photo_client_methods.rb
|
76
|
+
- lib/rentlinx/modules/photoable.rb
|
77
|
+
- lib/rentlinx/modules/property_client_methods.rb
|
78
|
+
- lib/rentlinx/modules/unit_client_methods.rb
|
70
79
|
- lib/rentlinx/validators/attribute_processor_service.rb
|
71
80
|
- lib/rentlinx/validators/base_validator.rb
|
72
81
|
- lib/rentlinx/validators/phone_validator.rb
|