mits 0.1.0 → 0.2.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.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/README.md +4 -4
  4. data/lib/mits.rb +4 -1
  5. data/lib/mits/base_mapper.rb +20 -0
  6. data/lib/mits/document.rb +16 -5
  7. data/lib/mits/saxerator_ext.rb +8 -1
  8. data/lib/mits/v3.0/address.rb +20 -0
  9. data/lib/mits/v3.0/amenity.rb +12 -0
  10. data/lib/mits/v3.0/company.rb +13 -0
  11. data/lib/mits/v3.0/deposit.rb +13 -0
  12. data/lib/mits/v3.0/fees.rb +17 -0
  13. data/lib/mits/v3.0/file.rb +18 -0
  14. data/lib/mits/v3.0/floorplan.rb +13 -0
  15. data/lib/mits/v3.0/mapper.rb +50 -0
  16. data/lib/mits/v3.0/mapper/address_mapper.rb +35 -0
  17. data/lib/mits/v3.0/mapper/amenities_mapper.rb +19 -0
  18. data/lib/mits/v3.0/mapper/company_mapper.rb +15 -0
  19. data/lib/mits/v3.0/mapper/deposit_mapper.rb +32 -0
  20. data/lib/mits/v3.0/mapper/fees_mapper.rb +19 -0
  21. data/lib/mits/v3.0/mapper/files_mapper.rb +25 -0
  22. data/lib/mits/v3.0/mapper/floorplan_mapper.rb +27 -0
  23. data/lib/mits/v3.0/mapper/pet_policy_mapper.rb +37 -0
  24. data/lib/mits/v3.0/mapper/policy_mapper.rb +12 -0
  25. data/lib/mits/v3.0/mapper/property_mapper.rb +57 -0
  26. data/lib/mits/v3.0/pet.rb +13 -0
  27. data/lib/mits/v3.0/pet_policy.rb +17 -0
  28. data/lib/mits/v3.0/policy.rb +10 -0
  29. data/lib/mits/v3.0/property.rb +23 -0
  30. data/lib/mits/v4.1/address.rb +21 -0
  31. data/lib/mits/v4.1/amenity.rb +21 -0
  32. data/lib/mits/v4.1/company.rb +8 -0
  33. data/lib/mits/v4.1/deposit.rb +8 -0
  34. data/lib/mits/v4.1/fees.rb +8 -0
  35. data/lib/mits/v4.1/file.rb +8 -0
  36. data/lib/mits/v4.1/mapper.rb +45 -0
  37. data/lib/mits/v4.1/mapper/address_mapper.rb +29 -0
  38. data/lib/mits/v4.1/mapper/company_mapper.rb +9 -0
  39. data/lib/mits/v4.1/mapper/property_mapper.rb +48 -0
  40. data/lib/mits/v4.1/mapper/units_mapper.rb +26 -0
  41. data/lib/mits/v4.1/pet.rb +8 -0
  42. data/lib/mits/v4.1/pet_policy.rb +8 -0
  43. data/lib/mits/v4.1/policy.rb +8 -0
  44. data/lib/mits/v4.1/property.rb +22 -0
  45. data/lib/mits/v4.1/unit.rb +13 -0
  46. data/lib/mits/version.rb +1 -1
  47. data/mits.gemspec +5 -4
  48. data/spec/fixtures/MITS_3.0_Property.yml +583 -0
  49. data/spec/fixtures/MITS_3.0_Sample.xml +589 -0
  50. data/spec/fixtures/{property.yml → MITS_4.1_Property.yml} +0 -0
  51. data/spec/fixtures/{mits.xml → MITS_4.1_Sample.xml} +0 -0
  52. data/spec/lib/mits/document_spec.rb +3 -3
  53. data/spec/lib/mits/v3.0/address_spec.rb +21 -0
  54. data/spec/lib/mits/v3.0/amenity_spec.rb +13 -0
  55. data/spec/lib/mits/{entities → v3.0}/company_spec.rb +0 -0
  56. data/spec/lib/mits/v3.0/deposit_spec.rb +14 -0
  57. data/spec/lib/mits/v3.0/fees_spec.rb +18 -0
  58. data/spec/lib/mits/v3.0/file_spec.rb +20 -0
  59. data/spec/lib/mits/v3.0/floorplan_spec.rb +14 -0
  60. data/spec/lib/mits/v3.0/mapper_spec.rb +198 -0
  61. data/spec/lib/mits/v3.0/pet_policy_spec.rb +17 -0
  62. data/spec/lib/mits/v3.0/pet_spec.rb +15 -0
  63. data/spec/lib/mits/v3.0/property_spec.rb +23 -0
  64. data/spec/lib/mits/v4.1/address_spec.rb +22 -0
  65. data/spec/lib/mits/v4.1/amenity_spec.rb +11 -0
  66. data/spec/lib/mits/v4.1/company_spec.rb +0 -0
  67. data/spec/lib/mits/v4.1/deposit_spec.rb +14 -0
  68. data/spec/lib/mits/v4.1/fees_spec.rb +18 -0
  69. data/spec/lib/mits/v4.1/file_spec.rb +20 -0
  70. data/spec/lib/mits/v4.1/mapper_spec.rb +194 -0
  71. data/spec/lib/mits/v4.1/pet_policy_spec.rb +16 -0
  72. data/spec/lib/mits/v4.1/pet_spec.rb +15 -0
  73. data/spec/lib/mits/v4.1/property_spec.rb +23 -0
  74. data/spec/lib/mits/v4.1/unit_spec.rb +14 -0
  75. metadata +112 -53
  76. data/lib/mits/entities/address.rb +0 -16
  77. data/lib/mits/entities/amenity.rb +0 -8
  78. data/lib/mits/entities/company.rb +0 -11
  79. data/lib/mits/entities/deposit.rb +0 -11
  80. data/lib/mits/entities/fees.rb +0 -15
  81. data/lib/mits/entities/file.rb +0 -16
  82. data/lib/mits/entities/pet.rb +0 -11
  83. data/lib/mits/entities/pet_policy.rb +0 -15
  84. data/lib/mits/entities/property.rb +0 -20
  85. data/lib/mits/entities/unit.rb +0 -11
  86. data/lib/mits/mapper.rb +0 -48
  87. data/lib/mits/mappers/address_mapper.rb +0 -29
  88. data/lib/mits/mappers/amenities_mapper.rb +0 -14
  89. data/lib/mits/mappers/company_mapper.rb +0 -11
  90. data/lib/mits/mappers/deposit_mapper.rb +0 -24
  91. data/lib/mits/mappers/fees_mapper.rb +0 -15
  92. data/lib/mits/mappers/files_mapper.rb +0 -19
  93. data/lib/mits/mappers/pet_policy_mapper.rb +0 -28
  94. data/lib/mits/mappers/property_mapper.rb +0 -41
  95. data/lib/mits/mappers/units_mapper.rb +0 -22
  96. data/spec/lib/mits/entities/address_spec.rb +0 -16
  97. data/spec/lib/mits/entities/amenity_spec.rb +0 -8
  98. data/spec/lib/mits/entities/deposit_spec.rb +0 -11
  99. data/spec/lib/mits/entities/fees_spec.rb +0 -15
  100. data/spec/lib/mits/entities/file_spec.rb +0 -17
  101. data/spec/lib/mits/entities/pet_policy_spec.rb +0 -14
  102. data/spec/lib/mits/entities/pet_spec.rb +0 -12
  103. data/spec/lib/mits/entities/property_spec.rb +0 -20
  104. data/spec/lib/mits/entities/unit_spec.rb +0 -11
  105. data/spec/lib/mits/mapper_spec.rb +0 -180
@@ -0,0 +1,19 @@
1
+ module MITS
2
+ module V3_0
3
+ module Mapper
4
+ module FeesMapper
5
+ def fees(tag, entity = Fees)
6
+ entity.new(admin_fee: try(tag[:AdminFee], :to_f),
7
+ application_fee: try(tag[:ApplicationFee], :to_f),
8
+ broker_fee: try(tag[:BrokerFee], :to_f),
9
+ late_fee_per_day: try(tag[:LateFeePerDay], :to_f),
10
+ late_min_fee: try(tag[:LateMinFee], :to_f),
11
+ late_percent: try(tag[:LatePercent], :to_f),
12
+ late_type: tag[:LateType],
13
+ non_refundable_hold_fee: try(tag[:NonRefundableHoldFee], :to_f),
14
+ prorate_type: tag[:ProrateType])
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ module MITS
2
+ module V3_0
3
+ module Mapper
4
+ module FilesMapper
5
+ def files(tags, entity = File)
6
+ tags = [tags] unless tags.is_a? Array
7
+ tags.map { |tag| file(tag, entity) }
8
+ end
9
+
10
+ def file(tag, entity = File)
11
+ entity.new(active: bool(tag[:Active]),
12
+ caption: tag[:Caption],
13
+ description: tag[:Description],
14
+ format: tag[:Format],
15
+ height: try(tag[:Height], :to_i),
16
+ id: tag[:FileID],
17
+ name: tag[:Name],
18
+ rank: tag[:Rank],
19
+ source: tag[:Src],
20
+ width: tag[:Width])
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ module MITS
2
+ module V3_0
3
+ module Mapper
4
+ module FloorplanMapper
5
+ def floorplans(tags)
6
+ tags = [tags] unless tags.is_a? Array
7
+ tags.map { |tag| floorplan(tag) }
8
+ end
9
+
10
+ def floorplan(tag)
11
+ Floorplan.new(bathrooms: try(rooms(tag[:Room], 'Bathroom'), :to_f),
12
+ bedrooms: try(rooms(tag[:Room], 'Bedroom'), :to_i),
13
+ name: tag[:Name],
14
+ rent: range_tag(tag[:MarketRent]),
15
+ sqft: range_tag(tag[:SquareFeet]))
16
+ end
17
+
18
+ private
19
+
20
+ def rooms(tag, type)
21
+ room = tag.find { |t| t[:RoomType] == type }
22
+ room[:Count] if room
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ module MITS
2
+ module V3_0
3
+ module Mapper
4
+ module PetPolicyMapper
5
+ def pet_policies(tags, entity = PetPolicy, secondary_entity = Pet)
6
+ tags = [tags] unless tags.is_a? Array
7
+ tags.map { |tag| pet_policy(tag, entity, secondary_entity) }
8
+ end
9
+
10
+ def pet_policy(tag, entity = PetPolicy, secondary_entity = Pet)
11
+ if bool(tag[:Allowed])
12
+ entity.new(allowed: true,
13
+ care: bool(tag[:PetCare]),
14
+ deposit: try(tag[:Deposit], :to_f),
15
+ fee: try(tag[:Fee], :to_f),
16
+ pets: pets(tag[:Pets], secondary_entity),
17
+ rent: try(tag[:Rent], :to_f),
18
+ restrictions: tag[:Restrictions])
19
+ else
20
+ entity.new(allowed: false)
21
+ end
22
+ end
23
+
24
+ def pets(tags, entity = Pet)
25
+ tags = [tags] unless tags.is_a? Array
26
+ tags.map do |tag|
27
+ entity.new(count: tag[:Count].to_i,
28
+ description: tag[:Description],
29
+ size: tag[:Size],
30
+ weight: tag[:Weight],
31
+ type: tag[:PetType])
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ module MITS
2
+ module V3_0
3
+ module Mapper
4
+ module PolicyMapper
5
+ def policy(tag, policy = Policy, pet_policy = PetPolicy, pet = Pet)
6
+ pet_policies = pet_policies(tag[:Pet], pet_policy, pet)
7
+ policy.new(general: tag[:General], pet: pet_policies)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,57 @@
1
+ module MITS
2
+ module V3_0
3
+ module Mapper
4
+ module PropertyMapper
5
+ def property(tag)
6
+ basics = property_basics(tag)
7
+ details = property_details(tag)
8
+ Property.new(basics.merge(details))
9
+ end
10
+
11
+ private
12
+
13
+ def property_basics(tag)
14
+ propId = tag[:PropertyID]
15
+ {
16
+ company_id: company_id(tag[:Identification], propId[:Identification]),
17
+ description: tag[:Information][:LongDescription],
18
+ id: primary_id(propId[:Identification]),
19
+ name: propId[:MarketingName],
20
+ summary: tag[:Information][:ShortDescription],
21
+ type: tag[:ILS_Identification][:ILS_IdentificationType],
22
+ website: propId[:WebSite]
23
+ }
24
+ end
25
+
26
+ def property_details(tag)
27
+ details = {}
28
+
29
+ # Optional fields
30
+ details[:address] = address(tag[:PropertyID][:Address], tag[:ILS_Identification]) if tag[:PropertyID][:Address]
31
+ details[:amenities] = try(tag[:Amenity], :amenities)
32
+ details[:deposit] = try(tag[:Deposit], :deposits)
33
+ details[:fees] = try(tag[:Fee], :fees)
34
+ details[:files] = try(tag[:File], :files)
35
+ details[:policy] = try(tag[:Policy], :policy)
36
+ details[:floorplans] = try(tag[:Floorplan], :floorplans)
37
+
38
+ details
39
+ end
40
+
41
+ def primary_id(tags)
42
+ find_in_tags(tags, 'primaryid')
43
+ end
44
+
45
+ def company_id(*tags)
46
+ find_in_tags(tags.flatten, 'managementid')
47
+ end
48
+
49
+ def find_in_tags(tags, type)
50
+ tags = [tags] unless tags.is_a? Array
51
+ tag = tags.find { |t| t[:IDType].downcase == type.downcase }
52
+ tag[:IDValue] if tag
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,13 @@
1
+ module MITS
2
+ module V3_0
3
+ class Pet
4
+ include SimpleObjects::Base
5
+
6
+ attribute :count
7
+ attribute :description
8
+ attribute :size
9
+ attribute :type
10
+ attribute :weight
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module MITS
2
+ module V3_0
3
+ class PetPolicy
4
+ include SimpleObjects::Base
5
+
6
+ attribute :allowed
7
+ attribute :care
8
+ attribute :deposit
9
+ attribute :fee
10
+ attribute :pets
11
+ attribute :rent
12
+ attribute :restrictions
13
+
14
+ alias_method :allowed?, :allowed
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ module MITS
2
+ module V3_0
3
+ class Policy
4
+ include SimpleObjects::Base
5
+
6
+ attribute :general
7
+ attribute :pet
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module MITS
2
+ module V3_0
3
+ class Property
4
+ include SimpleObjects::Base
5
+
6
+ attribute :address
7
+ attribute :amenities
8
+ attribute :company_id
9
+ attribute :deposit
10
+ attribute :description
11
+ attribute :fees
12
+ attribute :files
13
+ attribute :floorplans
14
+ attribute :id
15
+ attribute :name
16
+ attribute :policy
17
+ attribute :summary
18
+ attribute :type
19
+ attribute :units
20
+ attribute :website
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ module MITS
2
+ module V4_1
3
+ class Address
4
+ include SimpleObjects::Base
5
+
6
+ attribute :address1
7
+ attribute :address2
8
+ attribute :city
9
+ attribute :country
10
+ attribute :county_name
11
+ attribute :description
12
+ attribute :latitude
13
+ attribute :longitude
14
+ attribute :postal_code
15
+ attribute :province
16
+ attribute :state
17
+ attribute :type
18
+ attribute :unparsed_address
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ require 'mits/v3.0/amenity'
2
+ module SimpleObjects
3
+ module Attributes
4
+ module ClassMethods
5
+ def attributes
6
+ unless @attributes
7
+ @attributes = superclass.attributes if superclass.respond_to? :attributes
8
+ @attributes ||= {}
9
+ end
10
+ @attributes
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ module MITS
17
+ module V4_1
18
+ class Amenity < V3_0::Amenity
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ require 'mits/v3.0/company'
2
+
3
+ module MITS
4
+ module V4_1
5
+ class Company < V3_0::Company
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'mits/v3.0/deposit'
2
+
3
+ module MITS
4
+ module V4_1
5
+ class Deposit < V3_0::Deposit
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'mits/v3.0/fees'
2
+
3
+ module MITS
4
+ module V4_1
5
+ class Fees < V3_0::Fees
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ require 'mits/v3.0/file'
2
+
3
+ module MITS
4
+ module V4_1
5
+ class File < V3_0::File
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,45 @@
1
+ require_relative 'address'
2
+ require_relative 'amenity'
3
+ require_relative 'company'
4
+ require_relative 'deposit'
5
+ require_relative 'fees'
6
+ require_relative 'file'
7
+ require_relative 'pet'
8
+ require_relative 'pet_policy'
9
+ require_relative 'policy'
10
+ require_relative 'property'
11
+ require_relative 'unit'
12
+
13
+ require_relative 'mapper/address_mapper'
14
+ require_relative 'mapper/property_mapper'
15
+ require_relative 'mapper/units_mapper'
16
+
17
+ require_relative '../v3.0/mapper/amenities_mapper'
18
+ require_relative '../v3.0/mapper/company_mapper'
19
+ require_relative '../v3.0/mapper/deposit_mapper'
20
+ require_relative '../v3.0/mapper/fees_mapper'
21
+ require_relative '../v3.0/mapper/files_mapper'
22
+ require_relative '../v3.0/mapper/pet_policy_mapper'
23
+ require_relative '../v3.0/mapper/policy_mapper'
24
+
25
+
26
+ module MITS
27
+ module V4_1
28
+ module Mapper
29
+ extend BaseMapper
30
+
31
+ extend V3_0::Mapper::AmenitiesMapper
32
+ extend V3_0::Mapper::CompanyMapper
33
+ extend V3_0::Mapper::DepositMapper
34
+ extend V3_0::Mapper::FeesMapper
35
+ extend V3_0::Mapper::FilesMapper
36
+ extend V3_0::Mapper::PetPolicyMapper
37
+ extend V3_0::Mapper::PolicyMapper
38
+
39
+ extend AddressMapper
40
+ extend PropertyMapper
41
+ extend UnitsMapper
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,29 @@
1
+ require 'mits/v3.0/mapper/address_mapper'
2
+
3
+ module MITS
4
+ module V4_1
5
+ module Mapper
6
+ module AddressMapper
7
+ include V3_0::Mapper::AddressMapper
8
+
9
+ private
10
+
11
+ def address_attributes(tag)
12
+ {
13
+ address1: tag[:AddressLine1],
14
+ address2: tag[:AddressLine2],
15
+ city: tag[:City],
16
+ country: tag[:Country],
17
+ country_name: tag[:CountyName],
18
+ description: tag[:Description],
19
+ postal_code: tag[:PostalCode],
20
+ province: tag[:Province],
21
+ state: tag[:State],
22
+ type: tag[:AddressType],
23
+ unparsed_address: tag[:UnparsedAddress]
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ module MITS
2
+ module V4_1
3
+ module Mapper
4
+ module CompanyMapper
5
+ extend V3_0::CompanyMapper
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,48 @@
1
+ module MITS
2
+ module V4_1
3
+ module Mapper
4
+ module PropertyMapper
5
+ def property(tag)
6
+ basics = property_basics(tag)
7
+ details = property_details(tag)
8
+ Property.new(basics.merge(details))
9
+ end
10
+
11
+ private
12
+
13
+ def property_basics(tag)
14
+ propId = tag[:PropertyID]
15
+ {
16
+ company_id: company_id(propId[:Identification]),
17
+ description: tag[:Information][:LongDescription],
18
+ id: tag[:IDValue],
19
+ name: propId[:MarketingName],
20
+ summary: tag[:Information][:ShortDescription],
21
+ type: tag[:ILS_Identification][:ILS_IdentificationType],
22
+ website: propId[:WebSite]
23
+ }
24
+ end
25
+
26
+ def property_details(tag)
27
+ details = {}
28
+
29
+ # Optional fields
30
+ details[:address] = try(tag[:PropertyID][:Address], tag[:ILS_Identification], Address, :address)
31
+ details[:amenities] = try(tag[:ILS_Unit][:Amenity], Amenity, :amenities)
32
+ details[:deposit] = try(tag[:Deposit], Deposit, :deposit)
33
+ details[:fees] = try(tag[:Fee], Fees, :fees)
34
+ details[:files] = try(tag[:File], File, :files)
35
+ details[:policy] = try(tag[:Policy], Policy, PetPolicy, Pet, :policy)
36
+ details[:units] = try(tag[:ILS_Unit][:Units][:Unit], :units)
37
+
38
+ details
39
+ end
40
+
41
+ def company_id(tags)
42
+ tag = tags.find { |t| t[:IDType].downcase == 'company' }
43
+ tag[:IDValue] if tag
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end