simplyrets 0.1 → 1.0.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.
- 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
|
- - ">="
|