rpx 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ spec/spec.yml
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rpx.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 gregory
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,54 @@
1
+ # Rpx
2
+
3
+ Ruby Client to talk with the RealPage Exchange SOAP API
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rpx'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rpx
18
+
19
+ ## Usage
20
+
21
+ Rpx.configure do |config|
22
+ config.api_url = API_URL
23
+ config.licensekey = KEY
24
+ config.username = USERNAME
25
+ config.password = PASSWORD
26
+ end
27
+
28
+ payload={
29
+ fromdate: '2014-05-10',
30
+ todate: '2014-06-10',
31
+ events: ['moveout']
32
+ }
33
+ residents = Rpx::Resident.with_events(payload) #You'll have residents with their leases
34
+ residents.count => 10
35
+ resident = residents.first
36
+
37
+ resident.firstname
38
+ resident.email
39
+ resident.leases.count => 3
40
+ lease = resident.leases.last
41
+
42
+ lease.unitid
43
+
44
+ resident = Rpx::Residend.find(resident_id: resident_id, siteid: sid, pmcid: pmcid) #=> Resident
45
+ residents = Resident.current_residents(siteid: sid, pmcid: pmcid)
46
+ etc (check the code, it's pretty straight forward!)
47
+
48
+ ## Contributing
49
+
50
+ 1. Fork it ( http://github.com/gregory/rpx/fork )
51
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
52
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
53
+ 4. Push to the branch (`git push origin my-new-feature`)
54
+ 5. Create new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,13 @@
1
+ require 'savon'
2
+ require 'hashie'
3
+ Dir[File.dirname(__FILE__) + '/rpx/**/*.rb'].each{ |file| require file }
4
+
5
+ module Rpx
6
+ extend self
7
+
8
+ attr_accessor :config
9
+
10
+ def configure
11
+ @config = Configuration.new.tap{ |configuration| yield(configuration) }
12
+ end
13
+ end
@@ -0,0 +1,59 @@
1
+ module Rpx
2
+ class Client
3
+ NAMESPACES = {
4
+ "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/",
5
+ "xmlns:tem"=>"http://tempuri.org/"
6
+ }
7
+
8
+ def initialize(options={})
9
+ @read_timeout = options.delete(:read_timeout){ Rpx.config.read_timeout || 120 }
10
+ @debug = options.delete(:debug){false}
11
+ end
12
+
13
+ def add_attributes_if_present(xml, options, attributes)
14
+ return add_attributes_if_present(xml, options, [attributes]) unless attributes.is_a? Array
15
+
16
+ attributes.each{ |attribute| xml.tem(attribute, options[attribute]) if options[attribute] }
17
+ end
18
+
19
+ def api_call(action_name, options)
20
+ raw_response = client.request action_name do
21
+ soap.xml do |xml|
22
+ xml.soapenv :Envelope, NAMESPACES do |xml|
23
+ xml.soapenv :Header
24
+ xml.soapenv :Body do |xml|
25
+ xml.tem action_name do |xml|
26
+ xml.tem :auth do |xml|
27
+ xml.tem :siteid, options.fetch(:siteid)
28
+ xml.tem :pmcid, options.fetch(:pmcid)
29
+ xml.tem :username, Rpx.config.username
30
+ xml.tem :password, Rpx.config.password
31
+ xml.tem :licensekey, Rpx.config.licensekey
32
+ end
33
+ yield(xml)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ resident_list_from_raw({ action_name: action_name, raw_response: raw_response })
41
+ end
42
+
43
+ private
44
+
45
+ def client
46
+ @client ||= Savon::Client.new(log: @debug, pretty_print_xml: true) do
47
+ wsdl.document = Rpx.config.api_url
48
+ http.read_timeout = @read_timeout
49
+ end
50
+ end
51
+
52
+ def resident_list_from_raw(params)
53
+ action_name = params.fetch(:action_name)
54
+ raw_response = params.fetch(:raw_response)
55
+
56
+ raw_response[:"#{action_name}_response"][:"#{action_name}_result"][:residentlist][:resident]
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,6 @@
1
+ require 'ostruct'
2
+ module Rpx
3
+ class Configuration < OpenStruct;
4
+ #TODO: be more restrictive with the options
5
+ end
6
+ end
@@ -0,0 +1,55 @@
1
+ module Rpx
2
+ class Lease < Hashie::Trash
3
+ include Hashie::Extensions::IgnoreUndeclared
4
+ include Hashie::Extensions::Coercion
5
+
6
+ property :leaseid
7
+
8
+ property :leasestatus
9
+ property :residentrelationship
10
+
11
+ property :datesigned
12
+ property :datebegin
13
+ property :dateend
14
+ property :moveindate
15
+ property :moveoutdate
16
+
17
+ property :noticegivendate
18
+ property :noticefordate
19
+
20
+ property :unitid
21
+ property :unitnumber
22
+ property :buildingid
23
+ property :buildingnumber
24
+
25
+ property :renewaloffersavailable
26
+ property :acceptpayments
27
+ property :acceptcheck
28
+
29
+ property :aspets
30
+ property :inevict
31
+ property :incollection
32
+ property :guarantorbit
33
+ property :signerbit
34
+ property :hohbit
35
+ property :activebit
36
+
37
+ class Boolean
38
+ def self.coerce(value)
39
+ value.is_a?(String) ? (value.downcase == 'true') : value
40
+ end
41
+ end
42
+
43
+ coerce_key :activebit, :hohbit, :signerbit, :guarantorbit, :inevict, :acceptpayments, :acceptcheck, Boolean
44
+
45
+ def self.coerce(list_of_hash)
46
+ return self.coerce([list_of_hash]) unless list_of_hash.is_a?(Array)
47
+
48
+ list_of_hash.map{ |h| self.new(h) }
49
+ end
50
+
51
+ def moved_out?
52
+ self.moveoutdate != nil
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,92 @@
1
+ module Rpx
2
+ class Resident < Hashie::Trash
3
+ include Hashie::Extensions::IgnoreUndeclared
4
+ include Hashie::Extensions::Coercion
5
+
6
+ property :resident_id, from: :residentmemberid
7
+ property :residenthouseholdid
8
+ property :leaseid
9
+
10
+ property :unitid
11
+ property :buildingnumber
12
+ property :unitnumber
13
+
14
+ property :firstname
15
+ property :lastname
16
+ property :billingname
17
+
18
+ property :homephone
19
+ property :workphone
20
+ property :email
21
+ property :faxnumber
22
+ property :cellphone
23
+
24
+ property :inevict
25
+ property :nochk
26
+ property :incollection
27
+ property :inpaymentplan
28
+ property :pendingbalance
29
+ property :balance
30
+ property :estfutchgs
31
+ property :curlateamt
32
+ property :leasestatus
33
+ property :leasetype
34
+ property :residenttype, with: ->(value){ value == 'H' ? 'Head of Household' : 'Other'}
35
+
36
+ property :siteid
37
+ property :pmcid
38
+
39
+ def residenttype
40
+ self[:residenttype] == 'H' ? 'Head of Household' : 'Other'
41
+ end
42
+
43
+ def self.where(options, client=Client.new(options))
44
+ resident_hashs = client.api_call :getresidentlist, options do |xml|
45
+ xml.tem :residentsearch do |xml|
46
+ xml.tem :extensionData
47
+ client.add_attributes_if_present(xml, options, Resident.properties.to_a)
48
+ end
49
+ end
50
+
51
+ site_properties = {siteid: options.fetch(:siteid), pmcid: options.fetch(:pmcid)}
52
+ [resident_hashs].flatten.map{ |resident_hash| Resident.new(resident_hash.merge(site_properties)) }
53
+ end
54
+
55
+ def leases
56
+ @leases ||= ResidentWithLease.find({resident_id: self.resident_id, siteid: siteid, pmcid: pmcid}).leases
57
+ end
58
+
59
+ def current_lease
60
+ @current_lease ||= leases.sort_by{ |lease| lease.dateend }.last
61
+ end
62
+
63
+ def status
64
+ current_lease.leasestatus
65
+ end
66
+
67
+ def moved_out?
68
+ return false if current_resident?
69
+
70
+ current_lease.moved_out?
71
+ end
72
+
73
+ def minor?
74
+ current_lease.residentrelationship.downcase[/minor/]
75
+ end
76
+ def self.current_residents(options, client=Client.new(options))
77
+ self.where(options, client).select{|resident| resident.current_resident? }
78
+ end
79
+
80
+ def current_resident?
81
+ self.leasestatus == "Current"
82
+ end
83
+
84
+ def fullname
85
+ "#{firstname} #{lastname}".strip #TODO: ask them to add middleman saluration and generation in the api
86
+ end
87
+
88
+ def status
89
+ leasestatus
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,81 @@
1
+ module Rpx
2
+ class ResidentWithLease < Resident
3
+ VALID_EVENTS = ['moveout', 'movein']
4
+
5
+ property :residentid
6
+ property :namesalutation
7
+ property :middlename
8
+ property :namegeneration
9
+
10
+ property :residentagestatus
11
+
12
+ property :email, from: :emailaddress
13
+ property :leases, from: :leaseslist, with: ->(v){ binding.pry if v.nil?; v[:leases]}
14
+ coerce_key :leases, Rpx::Lease
15
+
16
+ def self.where(options, client=Client.new(options))
17
+ resident_hashs = client.api_call :residentsearchbyinfo, options do |xml|
18
+ xml.tem :residentsearch do |xml|
19
+ xml.tem :extensionData
20
+ client.add_attributes_if_present(xml, options, ResidentWithLease.properties.to_a)
21
+
22
+ if options[:leaselist]
23
+ xml.tem :leaselist do |xml|
24
+ xml.tem :leases do |xml|
25
+ client.add_attributes_if_present(xml, options, options.fetch(:leaselist).keys)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ site_properties = {siteid: options.fetch(:siteid), pmcid: options.fetch(:pmcid)}
33
+ [resident_hashs].flatten.map{ |resident_hash| ResidentWithLease.new(resident_hash.merge(site_properties)) }
34
+ end
35
+
36
+
37
+ def current_resident?
38
+ current_lease.leasestatus == "Current Resident"
39
+ end
40
+
41
+ def moved_out?
42
+ current_lease.moved_out?
43
+ end
44
+
45
+ def self.find(options, client=Client.new(options))
46
+ resident_hash = client.api_call :getresidentbyresidentid, options do |xml|
47
+ xml.tem :residentid, options.fetch(:resident_id)
48
+ end
49
+
50
+ site_properties = {siteid: options.fetch(:siteid), pmcid: options.fetch(:pmcid)}
51
+ new(resident_hash.merge(site_properties))
52
+ end
53
+
54
+ def self.with_events(options, client=Client.new(options))
55
+ events = [*options.fetch(:events)]
56
+ raise InvalidArgument.new(":events must be included in #{VALID_EVENTS.join(', ')}") unless !events.blank? && events.all?{|event| VALID_EVENTS.include? event}
57
+
58
+ resident_hashs = client.api_call :residentsearchbydate, options do |xml|
59
+ xml.tem :residentsearch do |xml|
60
+ xml.tem :extensionData
61
+ xml.tem :startdate, options.fetch(:startdate) #start date to retrieve active residents
62
+ xml.tem :enddate, options.fetch(:enddate) #end date to retrieve active residents
63
+ xml.tem :events do |xml|
64
+ events.each{|event| xml.tem :string, event}
65
+ end
66
+ client.add_attributes_if_present(xml, options, :headofhousehold)
67
+ end
68
+ end
69
+ site_properties = {siteid: options.fetch(:siteid), pmcid: options.fetch(:pmcid)}
70
+ [resident_hashs].flatten.map{ |resident_hash| new(resident_hash.merge(site_properties)) }
71
+ end
72
+
73
+ def fullname
74
+ "#{namesalutation} #{firstname} #{middlename} #{lastname} #{namegeneration}".strip
75
+ end
76
+
77
+ def residenttype
78
+ residentagestatus
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,3 @@
1
+ module Rpx
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rpx/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rpx"
8
+ spec.version = Rpx::VERSION
9
+ spec.authors = ["gregory"]
10
+ spec.email = ["greg2502@gmail.com"]
11
+ spec.summary = %q{RealPage Exchange Ruby Wrapper}
12
+ spec.description = %q{ruby client for the RealPageExchange SOAP API}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "rake"
24
+
25
+ spec.add_development_dependency "pry"
26
+ spec.add_development_dependency "pry-stack_explorer"
27
+ spec.add_development_dependency "pry-rescue"
28
+
29
+ spec.add_dependency "savon", "~> 0.9.14"
30
+ spec.add_dependency "hashie", '~>2.1.1'
31
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rpx do
4
+ describe 'test' do
5
+ it 'test' do
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rpx do
4
+ subject{ described_class }
5
+
6
+ describe '.configure' do
7
+ let(:api_url){"foo_url"}
8
+ let(:license_key){"foo_license"}
9
+ let(:username){"foo_username"}
10
+ let(:password){"foo_password"}
11
+
12
+ before do
13
+ subject.configure do |config|
14
+ config.api_url = api_url
15
+ config.license_key = license_key
16
+ config.username = username
17
+ config.password = password
18
+ end
19
+ end
20
+
21
+ it "has the credential parameters" do
22
+ subject.config.api_url.should eq api_url
23
+ subject.config.api_url.should eq api_url
24
+ subject.config.license_key.should eq license_key
25
+ subject.config.username.should eq username
26
+ subject.config.password.should eq password
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ configure:
2
+ username: USERNAME
3
+ password: PASSWORD
4
+ licensekey: LICENSE
5
+ api_url: "https://qagateway.rpx.realpage.com/rpxgateway/partner/RentMineOnline/RentMineOnline.svc?wsdl"
@@ -0,0 +1,22 @@
1
+ require 'bundler/setup'
2
+ require 'yaml'
3
+ require 'pry'
4
+ Bundler.setup(:default, :development)
5
+
6
+ require_relative '../lib/rpx'
7
+ $LOAD_PATH << File.dirname(__FILE__)
8
+ RSpec.configure do |config|
9
+ config.before :suite do
10
+ Rpx.configure do |config|
11
+ configure = settings["configure"]
12
+ config.api_url = configure["api_url"]
13
+ config.licensekey = configure["licensekey"]
14
+ config.username = configure["username"]
15
+ config.password = configure["password"]
16
+ end
17
+ end
18
+
19
+ def settings
20
+ @settings ||= YAML::load_file(File.join(File.dirname(File.expand_path(__FILE__)), 'spec.yml'))
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,196 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rpx
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - gregory
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.5'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.5'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: pry-stack_explorer
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: pry-rescue
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: savon
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.9.14
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.9.14
126
+ - !ruby/object:Gem::Dependency
127
+ name: hashie
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: 2.1.1
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ~>
140
+ - !ruby/object:Gem::Version
141
+ version: 2.1.1
142
+ description: ruby client for the RealPageExchange SOAP API
143
+ email:
144
+ - greg2502@gmail.com
145
+ executables: []
146
+ extensions: []
147
+ extra_rdoc_files: []
148
+ files:
149
+ - .gitignore
150
+ - Gemfile
151
+ - LICENSE.txt
152
+ - README.md
153
+ - Rakefile
154
+ - lib/rpx.rb
155
+ - lib/rpx/client.rb
156
+ - lib/rpx/configuration.rb
157
+ - lib/rpx/lease.rb
158
+ - lib/rpx/resident.rb
159
+ - lib/rpx/resident_with_lease.rb
160
+ - lib/rpx/version.rb
161
+ - rpx.gemspec
162
+ - spec/lib/rpx/client_spec.rb
163
+ - spec/lib/rpx_spec.rb
164
+ - spec/spec.yml.sample
165
+ - spec/spec_helper.rb
166
+ homepage: ''
167
+ licenses:
168
+ - MIT
169
+ post_install_message:
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ none: false
175
+ requirements:
176
+ - - ! '>='
177
+ - !ruby/object:Gem::Version
178
+ version: '0'
179
+ required_rubygems_version: !ruby/object:Gem::Requirement
180
+ none: false
181
+ requirements:
182
+ - - ! '>='
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ requirements: []
186
+ rubyforge_project:
187
+ rubygems_version: 1.8.23
188
+ signing_key:
189
+ specification_version: 3
190
+ summary: RealPage Exchange Ruby Wrapper
191
+ test_files:
192
+ - spec/lib/rpx/client_spec.rb
193
+ - spec/lib/rpx_spec.rb
194
+ - spec/spec.yml.sample
195
+ - spec/spec_helper.rb
196
+ has_rdoc: