simplyrets 0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +46 -13
- data/README.org +6 -6
- data/example.rb +9 -9
- data/lib/simplyrets.rb +33 -56
- data/lib/simplyrets/#listing.rb# +199 -0
- data/lib/simplyrets/api/default_api.rb +154 -0
- data/lib/simplyrets/listing.rb~ +199 -0
- data/lib/simplyrets/models/agent.rb +61 -0
- data/lib/simplyrets/models/base_object.rb +87 -0
- data/lib/simplyrets/models/broker.rb +37 -0
- data/lib/simplyrets/models/contact_information.rb +53 -0
- data/lib/simplyrets/models/error.rb +45 -0
- data/lib/simplyrets/models/geographic_data.rb +69 -0
- data/lib/simplyrets/models/listing.rb +199 -0
- data/lib/simplyrets/models/listing.rb~ +199 -0
- data/lib/simplyrets/models/mls_information.rb +69 -0
- data/lib/simplyrets/models/office.rb +61 -0
- data/lib/simplyrets/models/open_house.rb +37 -0
- data/lib/simplyrets/models/parking.rb +53 -0
- data/lib/simplyrets/models/property.rb +277 -0
- data/lib/simplyrets/models/sales.rb +69 -0
- data/lib/simplyrets/models/school.rb +61 -0
- data/lib/simplyrets/models/street_address.rb +85 -0
- data/lib/simplyrets/models/tax.rb +53 -0
- data/lib/simplyrets/simplyrets.rb +76 -0
- data/lib/simplyrets/simplyrets/api_error.rb +26 -0
- data/lib/simplyrets/simplyrets/configuration.rb +101 -0
- data/lib/simplyrets/simplyrets/request.rb +213 -0
- data/lib/simplyrets/simplyrets/response.rb +156 -0
- data/lib/simplyrets/simplyrets/version.rb +5 -0
- data/simplyrets.gemspec +16 -9
- metadata +153 -36
- data/#example.rb# +0 -29
- data/lib/monkey.rb +0 -90
- data/lib/properties_api.rb +0 -75
- data/lib/simplyrets.rb~ +0 -85
- data/lib/simplyrets/configuration.rb +0 -25
- data/lib/simplyrets/request.rb +0 -205
- data/lib/simplyrets/response.rb +0 -70
- data/lib/simplyrets/version.rb +0 -4
- data/models/agent.rb +0 -39
- data/models/contactinformation.rb +0 -36
- data/models/geographicdata.rb +0 -43
- data/models/listing.rb +0 -95
- data/models/mlsinformation.rb +0 -35
- data/models/office.rb +0 -39
- data/models/property.rb +0 -84
- data/models/school.rb +0 -27
- data/models/streetaddress.rb +0 -47
- data/models/tax.rb +0 -28
- data/pkg/simplyrets-0.1.gem +0 -0
@@ -0,0 +1,213 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'typhoeus'
|
3
|
+
|
4
|
+
module SimplyRetsClient
|
5
|
+
module SimplyRets
|
6
|
+
class Request
|
7
|
+
attr_accessor :host, :path, :format, :params, :body, :http_method, :headers, :form_params, :auth_names, :response
|
8
|
+
|
9
|
+
# All requests must have an HTTP method and a path
|
10
|
+
# Optionals parameters are :params, :headers, :body, :format, :host
|
11
|
+
def initialize(http_method, path, attributes = {})
|
12
|
+
@http_method = http_method.to_sym.downcase
|
13
|
+
@path = path
|
14
|
+
|
15
|
+
attributes.each { |name, value| send "#{name}=", value }
|
16
|
+
|
17
|
+
@format ||= SimplyRets.configuration.format
|
18
|
+
@params ||= {}
|
19
|
+
|
20
|
+
# Apply default headers
|
21
|
+
@headers = SimplyRets.configuration.default_headers.merge(@headers || {})
|
22
|
+
|
23
|
+
# Stick in the auth token if there is one
|
24
|
+
if SimplyRets.authenticated?
|
25
|
+
@headers.merge!({:auth_token => SimplyRets.configuration.auth_token})
|
26
|
+
end
|
27
|
+
|
28
|
+
update_params_for_auth!
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
# Update hearder and query params based on authentication settings.
|
34
|
+
def update_params_for_auth!
|
35
|
+
(@auth_names || []).each do |auth_name|
|
36
|
+
case auth_name
|
37
|
+
when 'basicAuth'
|
38
|
+
@headers ||= {}
|
39
|
+
http_auth_header = 'Basic ' + ["#{SimplyRets.configuration.username}:#{SimplyRets.configuration.password}"].pack('m').delete("\r\n")
|
40
|
+
@headers['Authorization'] = http_auth_header
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
# Get API key (with prefix if set).
|
48
|
+
# @param [String] param_name the parameter name of API key auth
|
49
|
+
def get_api_key_with_prefix(param_name)
|
50
|
+
if SimplyRets.configuration.api_key_prefix[param_name]
|
51
|
+
"#{SimplyRets.configuration.api_key_prefix[param_name]} #{SimplyRets.configuration.api_key[param_name]}"
|
52
|
+
else
|
53
|
+
SimplyRets.configuration.api_key[param_name]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Construct the request URL.
|
58
|
+
def url(options = {})
|
59
|
+
_path = self.interpreted_path
|
60
|
+
_path = "/#{_path}" unless _path.start_with?('/')
|
61
|
+
"#{SimplyRets.configuration.scheme}://#{SimplyRets.configuration.host}#{_path}"
|
62
|
+
end
|
63
|
+
|
64
|
+
# Iterate over the params hash, injecting any path values into the path string
|
65
|
+
# e.g. /word.{format}/{word}/entries => /word.json/cat/entries
|
66
|
+
def interpreted_path
|
67
|
+
p = self.path.dup
|
68
|
+
|
69
|
+
# Stick a .{format} placeholder into the path if there isn't
|
70
|
+
# one already or an actual format like json or xml
|
71
|
+
# e.g. /words/blah => /words.{format}/blah
|
72
|
+
if SimplyRets.configuration.inject_format
|
73
|
+
unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s }
|
74
|
+
p = p.sub(/^(\/?\w+)/, "\\1.#{format}")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Stick a .{format} placeholder on the end of the path if there isn't
|
79
|
+
# one already or an actual format like json or xml
|
80
|
+
# e.g. /words/blah => /words/blah.{format}
|
81
|
+
if SimplyRets.configuration.force_ending_format
|
82
|
+
unless ['.json', '.xml', '{format}'].any? {|s| p.downcase.include? s }
|
83
|
+
p = "#{p}.#{format}"
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
p = p.sub("{format}", self.format.to_s)
|
88
|
+
|
89
|
+
URI.encode [SimplyRets.configuration.base_path, p].join("/").gsub(/\/+/, '/')
|
90
|
+
end
|
91
|
+
|
92
|
+
# If body is an object, JSONify it before making the actual request.
|
93
|
+
# For form parameters, remove empty value
|
94
|
+
def outgoing_body
|
95
|
+
# http form
|
96
|
+
if headers['Content-Type'] == 'application/x-www-form-urlencoded'
|
97
|
+
data = form_params.dup
|
98
|
+
data.each do |key, value|
|
99
|
+
data[key] = value.to_s if value && !value.is_a?(File) # remove emtpy form parameter
|
100
|
+
end
|
101
|
+
elsif @body # http body is JSON
|
102
|
+
data = @body.is_a?(String) ? @body : @body.to_json
|
103
|
+
else
|
104
|
+
data = nil
|
105
|
+
end
|
106
|
+
|
107
|
+
if SimplyRets.configuration.debug
|
108
|
+
SimplyRets.logger.debug "HTTP request body param ~BEGIN~\n#{data}\n~END~\n"
|
109
|
+
end
|
110
|
+
|
111
|
+
data
|
112
|
+
end
|
113
|
+
|
114
|
+
def make
|
115
|
+
request_options = {
|
116
|
+
:method => self.http_method,
|
117
|
+
:headers => self.headers,
|
118
|
+
:params => self.params,
|
119
|
+
:ssl_verifypeer => SimplyRets.configuration.verify_ssl,
|
120
|
+
:cainfo => SimplyRets.configuration.ssl_ca_cert,
|
121
|
+
:verbose => SimplyRets.configuration.debug
|
122
|
+
}
|
123
|
+
|
124
|
+
if [:post, :patch, :put, :delete].include?(self.http_method)
|
125
|
+
request_options.update :body => self.outgoing_body
|
126
|
+
end
|
127
|
+
|
128
|
+
raw = Typhoeus::Request.new(self.url, request_options).run
|
129
|
+
|
130
|
+
@response = Response.new(raw)
|
131
|
+
|
132
|
+
if SimplyRets.configuration.debug
|
133
|
+
SimplyRets.logger.debug "HTTP response body ~BEGIN~\n#{@response.body}\n~END~\n"
|
134
|
+
end
|
135
|
+
|
136
|
+
# record as last response
|
137
|
+
SimplyRets.last_response = @response
|
138
|
+
|
139
|
+
unless @response.success?
|
140
|
+
fail ApiError.new(:code => @response.code,
|
141
|
+
:response_headers => @response.headers,
|
142
|
+
:response_body => @response.body),
|
143
|
+
@response.status_message
|
144
|
+
end
|
145
|
+
|
146
|
+
@response
|
147
|
+
end
|
148
|
+
|
149
|
+
def response_code_pretty
|
150
|
+
return unless @response
|
151
|
+
@response.code.to_s
|
152
|
+
end
|
153
|
+
|
154
|
+
def response_headers_pretty
|
155
|
+
return unless @response
|
156
|
+
# JSON.pretty_generate(@response.headers).gsub(/\n/, '<br/>') # <- This was for RestClient
|
157
|
+
@response.headers.gsub(/\n/, '<br/>') # <- This is for Typhoeus
|
158
|
+
end
|
159
|
+
|
160
|
+
# return 'Accept' based on an array of accept provided
|
161
|
+
# @param [Array] header_accept_array Array fo 'Accept'
|
162
|
+
# @return String Accept (e.g. application/json)
|
163
|
+
def self.select_header_accept header_accept_array
|
164
|
+
if header_accept_array.empty?
|
165
|
+
return
|
166
|
+
elsif header_accept_array.any?{ |s| s.casecmp('application/json')==0 }
|
167
|
+
'application/json' # look for json data by default
|
168
|
+
else
|
169
|
+
header_accept_array.join(',')
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
# return the content type based on an array of content-type provided
|
174
|
+
# @param [Array] content_type_array Array fo content-type
|
175
|
+
# @return String Content-Type (e.g. application/json)
|
176
|
+
def self.select_header_content_type content_type_array
|
177
|
+
if content_type_array.empty?
|
178
|
+
'application/json' # use application/json by default
|
179
|
+
elsif content_type_array.any?{ |s| s.casecmp('application/json')==0 }
|
180
|
+
'application/json' # use application/json if it's included
|
181
|
+
else
|
182
|
+
content_type_array[0]; # otherwise, use the first one
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
# static method to convert object (array, hash, object, etc) to JSON string
|
187
|
+
# @param model object to be converted into JSON string
|
188
|
+
# @return string JSON string representation of the object
|
189
|
+
def self.object_to_http_body model
|
190
|
+
return if model.nil?
|
191
|
+
_body = nil
|
192
|
+
if model.is_a?(Array)
|
193
|
+
_body = model.map{|m| object_to_hash(m) }
|
194
|
+
else
|
195
|
+
_body = object_to_hash(model)
|
196
|
+
end
|
197
|
+
_body.to_json
|
198
|
+
end
|
199
|
+
|
200
|
+
# static method to convert object(non-array) to hash
|
201
|
+
# @param obj object to be converted into JSON string
|
202
|
+
# @return string JSON string representation of the object
|
203
|
+
def self.object_to_hash obj
|
204
|
+
if obj.respond_to?(:to_hash)
|
205
|
+
obj.to_hash
|
206
|
+
else
|
207
|
+
obj
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
module SimplyRetsClient
|
2
|
+
module SimplyRets
|
3
|
+
class Response
|
4
|
+
require 'json'
|
5
|
+
require 'date'
|
6
|
+
require 'tempfile'
|
7
|
+
|
8
|
+
attr_accessor :raw
|
9
|
+
|
10
|
+
def initialize(raw)
|
11
|
+
self.raw = raw
|
12
|
+
end
|
13
|
+
|
14
|
+
def code
|
15
|
+
raw.code
|
16
|
+
end
|
17
|
+
|
18
|
+
def status_message
|
19
|
+
raw.status_message
|
20
|
+
end
|
21
|
+
|
22
|
+
def body
|
23
|
+
raw.body
|
24
|
+
end
|
25
|
+
|
26
|
+
def success?
|
27
|
+
raw.success?
|
28
|
+
end
|
29
|
+
|
30
|
+
# Deserialize the raw response body to the given return type.
|
31
|
+
#
|
32
|
+
# @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
|
33
|
+
def deserialize(return_type)
|
34
|
+
return nil if body.nil? || body.empty?
|
35
|
+
|
36
|
+
# handle file downloading - save response body into a tmp file and return the File instance
|
37
|
+
return download_file if return_type == 'File'
|
38
|
+
|
39
|
+
# ensuring a default content type
|
40
|
+
content_type = raw.headers['Content-Type'] || 'application/json'
|
41
|
+
|
42
|
+
unless content_type.start_with?('application/json')
|
43
|
+
fail "Content-Type is not supported: #{content_type}"
|
44
|
+
end
|
45
|
+
|
46
|
+
begin
|
47
|
+
data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
|
48
|
+
rescue JSON::ParserError => e
|
49
|
+
if %w(String Date DateTime).include?(return_type)
|
50
|
+
data = body
|
51
|
+
else
|
52
|
+
raise e
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
convert_to_type data, return_type
|
57
|
+
end
|
58
|
+
|
59
|
+
# Convert data to the given return type.
|
60
|
+
def convert_to_type(data, return_type)
|
61
|
+
return nil if data.nil?
|
62
|
+
case return_type
|
63
|
+
when 'String'
|
64
|
+
data.to_s
|
65
|
+
when 'Integer'
|
66
|
+
data.to_i
|
67
|
+
when 'Float'
|
68
|
+
data.to_f
|
69
|
+
when 'BOOLEAN'
|
70
|
+
data == true
|
71
|
+
when 'DateTime'
|
72
|
+
# parse date time (expecting ISO 8601 format)
|
73
|
+
DateTime.parse data
|
74
|
+
when 'Date'
|
75
|
+
# parse date time (expecting ISO 8601 format)
|
76
|
+
Date.parse data
|
77
|
+
when 'Object'
|
78
|
+
# generic object, return directly
|
79
|
+
data
|
80
|
+
when /\AArray<(.+)>\z/
|
81
|
+
# e.g. Array<Pet>
|
82
|
+
sub_type = $1
|
83
|
+
data.map {|item| convert_to_type(item, sub_type) }
|
84
|
+
when /\AHash\<String, (.+)\>\z/
|
85
|
+
# e.g. Hash<String, Integer>
|
86
|
+
sub_type = $1
|
87
|
+
{}.tap do |hash|
|
88
|
+
data.each {|k, v| hash[k] = convert_to_type(v, sub_type) }
|
89
|
+
end
|
90
|
+
else
|
91
|
+
# models, e.g. Pet
|
92
|
+
SimplyRetsClient.const_get(return_type).new.tap do |model|
|
93
|
+
model.build_from_hash data
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Save response body into a file in (the defined) temporary folder, using the filename
|
99
|
+
# from the "Content-Disposition" header if provided, otherwise a random filename.
|
100
|
+
#
|
101
|
+
# @see Configuration#temp_folder_path
|
102
|
+
# @return [File] the file downloaded
|
103
|
+
def download_file
|
104
|
+
tmp_file = Tempfile.new '', SimplyRets.configuration.temp_folder_path
|
105
|
+
content_disposition = raw.headers['Content-Disposition']
|
106
|
+
if content_disposition
|
107
|
+
filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
|
108
|
+
path = File.join File.dirname(tmp_file), filename
|
109
|
+
else
|
110
|
+
path = tmp_file.path
|
111
|
+
end
|
112
|
+
# close and delete temp file
|
113
|
+
tmp_file.close!
|
114
|
+
|
115
|
+
File.open(path, 'w') { |file| file.write(raw.body) }
|
116
|
+
SimplyRets.logger.info "File written to #{path}. Please move the file to a proper folder for further processing and delete the temp afterwards"
|
117
|
+
return File.new(path)
|
118
|
+
end
|
119
|
+
|
120
|
+
# `headers_hash` is a Typhoeus-specific extension of Hash,
|
121
|
+
# so simplify it back into a regular old Hash.
|
122
|
+
def headers
|
123
|
+
h = {}
|
124
|
+
raw.headers_hash.each {|k,v| h[k] = v }
|
125
|
+
h
|
126
|
+
end
|
127
|
+
|
128
|
+
# Extract the response format from the header hash
|
129
|
+
# e.g. {'Content-Type' => 'application/json'}
|
130
|
+
def format
|
131
|
+
headers['Content-Type'].split("/").last.downcase
|
132
|
+
end
|
133
|
+
|
134
|
+
def json?
|
135
|
+
format == 'json'
|
136
|
+
end
|
137
|
+
|
138
|
+
def xml?
|
139
|
+
format == 'xml'
|
140
|
+
end
|
141
|
+
|
142
|
+
def pretty_body
|
143
|
+
return unless body
|
144
|
+
if format == 'json'
|
145
|
+
JSON.pretty_generate(JSON.parse(body)).gsub(/\n/, '<br/>')
|
146
|
+
else
|
147
|
+
body
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def pretty_headers
|
152
|
+
JSON.pretty_generate(headers).gsub(/\n/, '<br/>')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
data/simplyrets.gemspec
CHANGED
@@ -1,25 +1,32 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
|
4
|
-
require "simplyrets/version"
|
3
|
+
require "simplyrets/simplyrets/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
6
|
+
|
7
7
|
s.name = "simplyrets"
|
8
|
-
s.version = SimplyRets::VERSION
|
8
|
+
s.version = SimplyRetsClient::SimplyRets::VERSION
|
9
9
|
s.platform = Gem::Platform::RUBY
|
10
10
|
s.authors = ["Christopher Reichert", "Cody Reichert"]
|
11
11
|
s.email = ["christopher@simplyrets.com", "cody@simplyrets.com"]
|
12
12
|
s.homepage = "https://simplyrets.com"
|
13
13
|
s.summary = %q{SimplyRETS Ruby SDK}
|
14
14
|
s.description = %q{This gem provides a SimplyRETS SDK for creating real estate software with RETS data}
|
15
|
+
s.license = "MIT"
|
15
16
|
|
16
|
-
s.
|
17
|
-
s.
|
18
|
-
s.add_dependency 'json', '>=1.8'
|
17
|
+
s.add_runtime_dependency 'typhoeus', '~> 0.2', '>= 0.2.1'
|
18
|
+
s.add_runtime_dependency 'json', '~> 1.4', '>= 1.4.6'
|
19
19
|
|
20
|
-
s.add_development_dependency '
|
21
|
-
s.add_development_dependency '
|
20
|
+
s.add_development_dependency 'rspec', '~> 3.2', '>= 3.2.0'
|
21
|
+
s.add_development_dependency 'vcr', '~> 2.9', '>= 2.9.3'
|
22
|
+
s.add_development_dependency 'webmock', '~> 1.6', '>= 1.6.2'
|
23
|
+
s.add_development_dependency 'autotest', '~> 4.4', '>= 4.4.6'
|
24
|
+
s.add_development_dependency 'autotest-rails-pure', '~> 4.1', '>= 4.1.2'
|
25
|
+
s.add_development_dependency 'autotest-growl', '~> 0.2', '>= 0.2.16'
|
26
|
+
s.add_development_dependency 'autotest-fsevent', '~> 0.2', '>= 0.2.10'
|
22
27
|
|
23
28
|
s.files = `find *`.split("\n").uniq.sort.select{|f| !f.empty? }
|
24
|
-
s.
|
29
|
+
#s.test_files = `find spec/*`.split("\n")
|
30
|
+
s.executables = []
|
31
|
+
s.require_paths = ["lib"]
|
25
32
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simplyrets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Reichert
|
@@ -9,12 +9,15 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-09-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: typhoeus
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0.2'
|
18
21
|
- - ">="
|
19
22
|
- !ruby/object:Gem::Version
|
20
23
|
version: 0.2.1
|
@@ -22,65 +25,172 @@ dependencies:
|
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
28
|
+
- - "~>"
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0.2'
|
25
31
|
- - ">="
|
26
32
|
- !ruby/object:Gem::Version
|
27
33
|
version: 0.2.1
|
28
34
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
35
|
+
name: json
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
31
37
|
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.4'
|
32
41
|
- - ">="
|
33
42
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
43
|
+
version: 1.4.6
|
35
44
|
type: :runtime
|
36
45
|
prerelease: false
|
37
46
|
version_requirements: !ruby/object:Gem::Requirement
|
38
47
|
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '1.4'
|
39
51
|
- - ">="
|
40
52
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
53
|
+
version: 1.4.6
|
42
54
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
55
|
+
name: rspec
|
44
56
|
requirement: !ruby/object:Gem::Requirement
|
45
57
|
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3.2'
|
46
61
|
- - ">="
|
47
62
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
49
|
-
type: :
|
63
|
+
version: 3.2.0
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '3.2'
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 3.2.0
|
74
|
+
- !ruby/object:Gem::Dependency
|
75
|
+
name: vcr
|
76
|
+
requirement: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - "~>"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '2.9'
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 2.9.3
|
84
|
+
type: :development
|
85
|
+
prerelease: false
|
86
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '2.9'
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.9.3
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: webmock
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - "~>"
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '1.6'
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 1.6.2
|
104
|
+
type: :development
|
50
105
|
prerelease: false
|
51
106
|
version_requirements: !ruby/object:Gem::Requirement
|
52
107
|
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.6'
|
53
111
|
- - ">="
|
54
112
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
113
|
+
version: 1.6.2
|
56
114
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
115
|
+
name: autotest
|
58
116
|
requirement: !ruby/object:Gem::Requirement
|
59
117
|
requirements:
|
118
|
+
- - "~>"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '4.4'
|
60
121
|
- - ">="
|
61
122
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
123
|
+
version: 4.4.6
|
63
124
|
type: :development
|
64
125
|
prerelease: false
|
65
126
|
version_requirements: !ruby/object:Gem::Requirement
|
66
127
|
requirements:
|
128
|
+
- - "~>"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '4.4'
|
67
131
|
- - ">="
|
68
132
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
133
|
+
version: 4.4.6
|
70
134
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
135
|
+
name: autotest-rails-pure
|
72
136
|
requirement: !ruby/object:Gem::Requirement
|
73
137
|
requirements:
|
138
|
+
- - "~>"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '4.1'
|
74
141
|
- - ">="
|
75
142
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
143
|
+
version: 4.1.2
|
77
144
|
type: :development
|
78
145
|
prerelease: false
|
79
146
|
version_requirements: !ruby/object:Gem::Requirement
|
80
147
|
requirements:
|
148
|
+
- - "~>"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '4.1'
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: 4.1.2
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: autotest-growl
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - "~>"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0.2'
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: 0.2.16
|
164
|
+
type: :development
|
165
|
+
prerelease: false
|
166
|
+
version_requirements: !ruby/object:Gem::Requirement
|
167
|
+
requirements:
|
168
|
+
- - "~>"
|
169
|
+
- !ruby/object:Gem::Version
|
170
|
+
version: '0.2'
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.2.16
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: autotest-fsevent
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0.2'
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: 0.2.10
|
184
|
+
type: :development
|
185
|
+
prerelease: false
|
186
|
+
version_requirements: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - "~>"
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0.2'
|
81
191
|
- - ">="
|
82
192
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
193
|
+
version: 0.2.10
|
84
194
|
description: This gem provides a SimplyRETS SDK for creating real estate software
|
85
195
|
with RETS data
|
86
196
|
email:
|
@@ -90,41 +200,48 @@ executables: []
|
|
90
200
|
extensions: []
|
91
201
|
extra_rdoc_files: []
|
92
202
|
files:
|
93
|
-
- "#example.rb#"
|
94
203
|
- Gemfile
|
95
204
|
- Gemfile.lock
|
96
205
|
- LICENSE
|
97
206
|
- README.org
|
98
207
|
- Rakefile
|
99
208
|
- example.rb
|
100
|
-
- lib/monkey.rb
|
101
|
-
- lib/properties_api.rb
|
102
209
|
- lib/simplyrets.rb
|
103
|
-
- lib/simplyrets.rb
|
104
|
-
- lib/simplyrets/
|
105
|
-
- lib/simplyrets/
|
106
|
-
- lib/simplyrets/
|
107
|
-
- lib/simplyrets/
|
108
|
-
- models/
|
109
|
-
- models/
|
110
|
-
- models/
|
111
|
-
- models/
|
112
|
-
- models/
|
113
|
-
- models/
|
114
|
-
- models/
|
115
|
-
- models/
|
116
|
-
- models/
|
117
|
-
- models/
|
118
|
-
-
|
210
|
+
- lib/simplyrets/#listing.rb#
|
211
|
+
- lib/simplyrets/api/default_api.rb
|
212
|
+
- lib/simplyrets/listing.rb~
|
213
|
+
- lib/simplyrets/models/agent.rb
|
214
|
+
- lib/simplyrets/models/base_object.rb
|
215
|
+
- lib/simplyrets/models/broker.rb
|
216
|
+
- lib/simplyrets/models/contact_information.rb
|
217
|
+
- lib/simplyrets/models/error.rb
|
218
|
+
- lib/simplyrets/models/geographic_data.rb
|
219
|
+
- lib/simplyrets/models/listing.rb
|
220
|
+
- lib/simplyrets/models/listing.rb~
|
221
|
+
- lib/simplyrets/models/mls_information.rb
|
222
|
+
- lib/simplyrets/models/office.rb
|
223
|
+
- lib/simplyrets/models/open_house.rb
|
224
|
+
- lib/simplyrets/models/parking.rb
|
225
|
+
- lib/simplyrets/models/property.rb
|
226
|
+
- lib/simplyrets/models/sales.rb
|
227
|
+
- lib/simplyrets/models/school.rb
|
228
|
+
- lib/simplyrets/models/street_address.rb
|
229
|
+
- lib/simplyrets/models/tax.rb
|
230
|
+
- lib/simplyrets/simplyrets.rb
|
231
|
+
- lib/simplyrets/simplyrets/api_error.rb
|
232
|
+
- lib/simplyrets/simplyrets/configuration.rb
|
233
|
+
- lib/simplyrets/simplyrets/request.rb
|
234
|
+
- lib/simplyrets/simplyrets/response.rb
|
235
|
+
- lib/simplyrets/simplyrets/version.rb
|
119
236
|
- simplyrets.gemspec
|
120
237
|
homepage: https://simplyrets.com
|
121
|
-
licenses:
|
238
|
+
licenses:
|
239
|
+
- MIT
|
122
240
|
metadata: {}
|
123
241
|
post_install_message:
|
124
242
|
rdoc_options: []
|
125
243
|
require_paths:
|
126
244
|
- lib
|
127
|
-
- models
|
128
245
|
required_ruby_version: !ruby/object:Gem::Requirement
|
129
246
|
requirements:
|
130
247
|
- - ">="
|