rentlinx 0.9.3 → 0.9.4.pre

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0551c6f33a75e1776a0bb4d932c0a4b4e09f5591
4
- data.tar.gz: 9354d52fbf2bd6f1cc3757332ca92ca8e10893a2
3
+ metadata.gz: 8b77a1746107aeea8c8af74a2c59244c46d2cac1
4
+ data.tar.gz: 72a3b7cbcdf9868fee1186720a1accce03bde5c4
5
5
  SHA512:
6
- metadata.gz: becc388be2bcfe16eeff36740e784671a624d940e06badbe9f6a205e92132b249b3f0c74440538c2a40b6e474207bcb6a9751a47071a7a6f862dc41d310af4e0
7
- data.tar.gz: fd6a4aee865dd53a85dc43dd34e4c4dcef0359cd1aa34c4a02e8b927fb0e3c3d44150590021ae89aab06fc5b81f954493a1732db846bd6ce9827fc75ecc409c4
6
+ metadata.gz: cfc3bf598922af2b45d7d194349b9063be2d3fb3592aaf943946cc60c3f946e23125767907bf566aeda63d783733519377a9512c75886a693d2dd7e9a3bffabe
7
+ data.tar.gz: 2a7c3ef5972f5783b2440a31eb1d73f12ffe5e3cb1e6901d40878be9b0ea4a567fc4d7c16cd8ca0a800acb341f41fc8443f34cf50912cfe8f338e6d078561281
data/lib/rentlinx.rb CHANGED
@@ -2,6 +2,7 @@ require 'logging'
2
2
  require 'rentlinx/client'
3
3
  require 'rentlinx/errors'
4
4
  require 'rentlinx/models/base'
5
+ require 'rentlinx/models/company'
5
6
  require 'rentlinx/models/property'
6
7
  require 'rentlinx/models/unit'
7
8
  require 'rentlinx/models/property_photo'
@@ -2,6 +2,7 @@ require 'httpclient'
2
2
  require 'json'
3
3
  require 'uri'
4
4
  require 'rentlinx/default'
5
+ require 'rentlinx/modules/company_client_methods'
5
6
  require 'rentlinx/modules/property_client_methods'
6
7
  require 'rentlinx/modules/unit_client_methods'
7
8
  require 'rentlinx/modules/photo_client_methods'
@@ -15,6 +16,7 @@ module Rentlinx
15
16
  # It should not be interacted with, the objects provide
16
17
  # all the functionality necessary to work with Rentlinx.
17
18
  class Client
19
+ include Rentlinx::CompanyClientMethods
18
20
  include Rentlinx::PropertyClientMethods
19
21
  include Rentlinx::UnitClientMethods
20
22
  include Rentlinx::PhotoClientMethods
@@ -38,11 +40,27 @@ module Rentlinx
38
40
  @api_token ||= authenticate(Rentlinx.username, Rentlinx.password)
39
41
  end
40
42
 
43
+ # Pushes an object's attributes out to Rentlinx
44
+ #
45
+ # @param object [Rentlinx::Base] the object to be patched
46
+ def patch(object)
47
+ case object
48
+ when Rentlinx::Property
49
+ raise Rentlinx::InvalidObject, object unless object.patch_valid?
50
+ patch_property(object)
51
+ else
52
+ raise TypeError, "Type not permitted: #{object.class}"
53
+ end
54
+ end
55
+
41
56
  # Pushes an object's attributes out to Rentlinx
42
57
  #
43
58
  # @param object [Rentlinx::Base] the object to be posted
44
59
  def post(object)
45
60
  case object
61
+ when Rentlinx::Company
62
+ raise Rentlinx::InvalidObject, object unless object.valid?
63
+ post_company(object)
46
64
  when Rentlinx::Property
47
65
  raise Rentlinx::InvalidObject, object unless object.valid?
48
66
  post_property(object)
@@ -60,6 +78,8 @@ module Rentlinx
60
78
  # @param id [String] the rentlinx id of the object to be unposted
61
79
  def unpost(type, id)
62
80
  case type
81
+ when :company
82
+ unpost_company(id)
63
83
  when :property
64
84
  unpost_property(id)
65
85
  when :unit
@@ -75,6 +95,8 @@ module Rentlinx
75
95
  # @param id [String] the rentlinx id of the object to be fetched
76
96
  def get(type, id)
77
97
  case type
98
+ when :company
99
+ Company.new(process_get("companies/#{id}"))
78
100
  when :property
79
101
  Property.new(process_get("properties/#{id}"))
80
102
  when :unit
@@ -28,7 +28,7 @@ module Rentlinx
28
28
  # to post or update
29
29
  class InvalidObject < RentlinxError
30
30
  def initialize(object)
31
- super("#{object.class} is invalid: #{object.error_messages}")
31
+ super("#{object.class} is invalid: #{object.validate}")
32
32
  end
33
33
  end
34
34
 
@@ -16,6 +16,7 @@ module Rentlinx
16
16
  #
17
17
  # @param attrs [Hash] a hash of attributes to save.
18
18
  def initialize(attrs)
19
+ @original_attrs = attrs.dup
19
20
  @processor = AttributeProcessor.new(attrs.dup)
20
21
  attrs = @processor.process
21
22
  attributes.each do |at|
@@ -39,6 +40,15 @@ module Rentlinx
39
40
  self.class::REQUIRED_ATTRIBUTES
40
41
  end
41
42
 
43
+ # Sends the object to Rentlinx
44
+ #
45
+ # @example
46
+ # prop = Rentlinx::Property.new(attrs)
47
+ # prop.patch
48
+ def patch
49
+ Rentlinx.client.patch(self)
50
+ end
51
+
42
52
  # Sends the object to Rentlinx
43
53
  #
44
54
  # @example
@@ -54,7 +64,7 @@ module Rentlinx
54
64
  # prop = Rentlinx::Property.new(attrs)
55
65
  # prop.unpost
56
66
  def unpost
57
- Rentlinx.client.unpost(type, send(type.to_s + 'ID'))
67
+ Rentlinx.client.unpost(type, send(identity))
58
68
  end
59
69
 
60
70
  # Converts the object to a hash
@@ -62,30 +72,44 @@ module Rentlinx
62
72
  # @return a hash including the attributes and values
63
73
  def to_hash
64
74
  {}.tap do |hash|
65
- attributes.each do |at|
75
+ @original_attrs.keys.each do |at|
66
76
  hash[at] = send(at)
67
77
  end
68
78
  end
69
79
  end
70
80
 
71
- # Determines the validity of the object
81
+ # Determines the validity of the object for post
72
82
  #
73
83
  # @return true if valid, false if invalid
74
84
  def valid?
75
- error_messages.empty?
85
+ validate.empty?
86
+ end
87
+
88
+ # Determines the validity of the object for patch
89
+ #
90
+ # @return true if valid, false if invalid
91
+ def patch_valid?
92
+ validate(false).empty?
76
93
  end
77
94
 
78
95
  # Provides error messages on invalid objects
79
96
  #
97
+ # @param check_required_attributes whether to check for required attributes
80
98
  # @return a hash of error messages
81
- def error_messages
99
+ def validate(check_required_attributes = true)
82
100
  @processor = AttributeProcessor.new(to_hash)
83
101
  @processor.process
84
102
 
85
- missing_attrs = required_attributes.select { |at| blank?(send(at)) }
103
+ # object identity is always required, even for patches
104
+ missing_errors = {}
105
+ missing_errors[identity.to_sym] = 'is missing' if self.class.method_defined?(identity) && blank?(send(identity))
106
+
107
+ if check_required_attributes
108
+ missing_attrs = required_attributes.select { |at| blank?(send(at)) }
86
109
 
87
- missing_errors = missing_attrs.each_with_object({}) do |at, obj|
88
- obj[at] = 'is missing'
110
+ missing_attrs.each do |at|
111
+ missing_errors[at] = 'is missing'
112
+ end
89
113
  end
90
114
 
91
115
  @processor.errors.merge(missing_errors)
@@ -109,6 +133,10 @@ module Rentlinx
109
133
  name.split('::').last.downcase.to_sym
110
134
  end
111
135
 
136
+ def identity
137
+ type.to_s + 'ID'
138
+ end
139
+
112
140
  def blank?(str)
113
141
  str.nil? || str == ''
114
142
  end
@@ -0,0 +1,21 @@
1
+ module Rentlinx
2
+ # An object that represents a Rentlinx company.
3
+ class Company < Base
4
+ ATTRIBUTES = [:companyID, :companyCapAmount]
5
+
6
+ REQUIRED_ATTRIBUTES = [:companyID]
7
+
8
+ attr_accessor(*ATTRIBUTES)
9
+
10
+ # Queries Rentlinx and builds a company with the given ID
11
+ #
12
+ # The returned company will have all the attributes Rentlinx
13
+ # has for the company on their end.
14
+ #
15
+ # @param id [String] the Rentlinx id of the company
16
+ # @return a Rentlinx::Company that is up to date with the remote one
17
+ def self.from_id(id)
18
+ get_from_id(:company, id)
19
+ end
20
+ end
21
+ end
@@ -9,7 +9,8 @@ module Rentlinx
9
9
  :zip, :marketingName, :hideAddress, :latitude, :longitude,
10
10
  :website, :yearBuilt, :numUnits, :phoneNumber, :extension,
11
11
  :faxNumber, :emailAddress, :acceptsHcv, :propertyType,
12
- :activeURL, :companyName, :leadsURL]
12
+ :activeURL, :companyName, :leadsURL,
13
+ :premium, :capAmount]
13
14
 
14
15
  REQUIRED_ATTRIBUTES = [:propertyID, :address, :city, :state, :zip,
15
16
  :phoneNumber, :emailAddress]
@@ -0,0 +1,15 @@
1
+ module Rentlinx
2
+ # Client methods for companies. No public methods.
3
+ module CompanyClientMethods
4
+ private
5
+
6
+ def post_company(company)
7
+ return false unless company.valid?
8
+ request('PUT', "companies/#{company.companyID}", company.to_hash)
9
+ end
10
+
11
+ def unpost_company(id)
12
+ request('DELETE', "companies/#{id}")
13
+ end
14
+ end
15
+ end
@@ -14,6 +14,12 @@ module Rentlinx
14
14
 
15
15
  private
16
16
 
17
+ def patch_property(prop)
18
+ return false unless prop.patch_valid?
19
+ # TODO: change to 'PATCH' once Rentlinx supports it
20
+ request('PUT', "properties/#{prop.propertyID}", prop.to_hash)
21
+ end
22
+
17
23
  def post_property(prop)
18
24
  return false unless prop.valid?
19
25
  request('PUT', "properties/#{prop.propertyID}", prop.to_hash)
@@ -0,0 +1,14 @@
1
+ module Rentlinx
2
+ # Validator for money amounts.
3
+ # Must be positive amounts.
4
+ # Cannot be cleared once set.
5
+ class AmountValidator < BaseValidator
6
+ private
7
+
8
+ def validate
9
+ @value.sub!(/^0+/, '') unless @value.nil?
10
+ return if @value.to_s =~ /[1-9]\d*(\.\d{1,2})?/
11
+ @error = "'#{@value}' is not a valid amount."
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,6 @@
1
1
  require 'rentlinx/validators/base_validator'
2
2
  require 'rentlinx/validators/address_validator'
3
+ require 'rentlinx/validators/amount_validator'
3
4
  require 'rentlinx/validators/city_validator'
4
5
  require 'rentlinx/validators/phone_validator'
5
6
  require 'rentlinx/validators/state_validator'
@@ -37,7 +38,9 @@ module Rentlinx
37
38
  zip: ZipValidator,
38
39
  leadsURL: UrlValidator,
39
40
  city: CityValidator,
40
- address: AddressValidator }
41
+ address: AddressValidator,
42
+ capAmount: AmountValidator,
43
+ companyCapAmount: AmountValidator }
41
44
 
42
45
  @attrs.each do |field, val|
43
46
  next unless validators.keys.include?(field)
@@ -1,5 +1,5 @@
1
1
  # This is the main rentlinx module. All Rentlinx objects
2
2
  # and methods are namespaced under this module.
3
3
  module Rentlinx
4
- VERSION = '0.9.3'
4
+ VERSION = '0.9.4.pre'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rentlinx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - AppFolio, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-14 00:00:00.000000000 Z
11
+ date: 2015-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -65,6 +65,7 @@ files:
65
65
  - lib/rentlinx/default.rb
66
66
  - lib/rentlinx/errors.rb
67
67
  - lib/rentlinx/models/base.rb
68
+ - lib/rentlinx/models/company.rb
68
69
  - lib/rentlinx/models/property.rb
69
70
  - lib/rentlinx/models/property_amenity.rb
70
71
  - lib/rentlinx/models/property_link.rb
@@ -75,6 +76,7 @@ files:
75
76
  - lib/rentlinx/models/unit_photo.rb
76
77
  - lib/rentlinx/modules/amenity_client_methods.rb
77
78
  - lib/rentlinx/modules/amenityable.rb
79
+ - lib/rentlinx/modules/company_client_methods.rb
78
80
  - lib/rentlinx/modules/link_client_methods.rb
79
81
  - lib/rentlinx/modules/linkable.rb
80
82
  - lib/rentlinx/modules/photo_client_methods.rb
@@ -82,6 +84,7 @@ files:
82
84
  - lib/rentlinx/modules/property_client_methods.rb
83
85
  - lib/rentlinx/modules/unit_client_methods.rb
84
86
  - lib/rentlinx/validators/address_validator.rb
87
+ - lib/rentlinx/validators/amount_validator.rb
85
88
  - lib/rentlinx/validators/attribute_processor_service.rb
86
89
  - lib/rentlinx/validators/base_validator.rb
87
90
  - lib/rentlinx/validators/city_validator.rb
@@ -105,14 +108,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
108
  version: '0'
106
109
  required_rubygems_version: !ruby/object:Gem::Requirement
107
110
  requirements:
108
- - - ">="
111
+ - - ">"
109
112
  - !ruby/object:Gem::Version
110
- version: '0'
113
+ version: 1.3.1
111
114
  requirements: []
112
115
  rubyforge_project:
113
- rubygems_version: 2.4.3
116
+ rubygems_version: 2.4.5.1
114
117
  signing_key:
115
118
  specification_version: 4
116
119
  summary: API Wrapper for the Rentlinx API
117
120
  test_files: []
118
- has_rdoc: